1
2
3
4
5
6
7
8
9
10
11#include <linux/module.h>
12#include <linux/uaccess.h>
13#include <linux/netdevice.h>
14#include <linux/etherdevice.h>
15#include <linux/skbuff.h>
16#include <linux/ethtool.h>
17#include <linux/io.h>
18#include <linux/slab.h>
19#include <linux/of_address.h>
20#include <linux/of_device.h>
21#include <linux/of_platform.h>
22#include <linux/of_mdio.h>
23#include <linux/of_net.h>
24#include <linux/phy.h>
25#include <linux/interrupt.h>
26#include <linux/iopoll.h>
27
28#define DRIVER_NAME "xilinx_emaclite"
29
30
31#define XEL_TXBUFF_OFFSET 0x0
32#define XEL_MDIOADDR_OFFSET 0x07E4
33#define XEL_MDIOWR_OFFSET 0x07E8
34#define XEL_MDIORD_OFFSET 0x07EC
35#define XEL_MDIOCTRL_OFFSET 0x07F0
36#define XEL_GIER_OFFSET 0x07F8
37#define XEL_TSR_OFFSET 0x07FC
38#define XEL_TPLR_OFFSET 0x07F4
39
40#define XEL_RXBUFF_OFFSET 0x1000
41#define XEL_RPLR_OFFSET 0x100C
42#define XEL_RSR_OFFSET 0x17FC
43
44#define XEL_BUFFER_OFFSET 0x0800
45
46
47#define XEL_MDIOADDR_REGADR_MASK 0x0000001F
48#define XEL_MDIOADDR_PHYADR_MASK 0x000003E0
49#define XEL_MDIOADDR_PHYADR_SHIFT 5
50#define XEL_MDIOADDR_OP_MASK 0x00000400
51
52
53#define XEL_MDIOWR_WRDATA_MASK 0x0000FFFF
54
55
56#define XEL_MDIORD_RDDATA_MASK 0x0000FFFF
57
58
59#define XEL_MDIOCTRL_MDIOSTS_MASK 0x00000001
60#define XEL_MDIOCTRL_MDIOEN_MASK 0x00000008
61
62
63#define XEL_GIER_GIE_MASK 0x80000000
64
65
66#define XEL_TSR_XMIT_BUSY_MASK 0x00000001
67#define XEL_TSR_PROGRAM_MASK 0x00000002
68#define XEL_TSR_XMIT_IE_MASK 0x00000008
69#define XEL_TSR_XMIT_ACTIVE_MASK 0x80000000
70
71
72
73
74
75#define XEL_TSR_PROG_MAC_ADDR (XEL_TSR_XMIT_BUSY_MASK | XEL_TSR_PROGRAM_MASK)
76
77
78#define XEL_RSR_RECV_DONE_MASK 0x00000001
79#define XEL_RSR_RECV_IE_MASK 0x00000008
80
81
82#define XEL_TPLR_LENGTH_MASK 0x0000FFFF
83
84
85#define XEL_RPLR_LENGTH_MASK 0x0000FFFF
86
87#define XEL_HEADER_OFFSET 12
88#define XEL_HEADER_SHIFT 16
89
90
91#define XEL_ARP_PACKET_SIZE 28
92#define XEL_HEADER_IP_LENGTH_OFFSET 16
93
94
95
96#define TX_TIMEOUT (60 * HZ)
97#define ALIGNMENT 4
98
99
100#define BUFFER_ALIGN(adr) ((ALIGNMENT - ((uintptr_t)adr)) % ALIGNMENT)
101
102#ifdef __BIG_ENDIAN
103#define xemaclite_readl ioread32be
104#define xemaclite_writel iowrite32be
105#else
106#define xemaclite_readl ioread32
107#define xemaclite_writel iowrite32
108#endif
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126struct net_local {
127
128 struct net_device *ndev;
129
130 bool tx_ping_pong;
131 bool rx_ping_pong;
132 u32 next_tx_buf_to_use;
133 u32 next_rx_buf_to_use;
134 void __iomem *base_addr;
135
136 spinlock_t reset_lock;
137 struct sk_buff *deferred_skb;
138
139 struct phy_device *phy_dev;
140 struct device_node *phy_node;
141
142 struct mii_bus *mii_bus;
143
144 int last_link;
145};
146
147
148
149
150
151
152
153
154
155
156
157
158
159static void xemaclite_enable_interrupts(struct net_local *drvdata)
160{
161 u32 reg_data;
162
163
164 reg_data = xemaclite_readl(drvdata->base_addr + XEL_TSR_OFFSET);
165 xemaclite_writel(reg_data | XEL_TSR_XMIT_IE_MASK,
166 drvdata->base_addr + XEL_TSR_OFFSET);
167
168
169 xemaclite_writel(XEL_RSR_RECV_IE_MASK, drvdata->base_addr + XEL_RSR_OFFSET);
170
171
172 xemaclite_writel(XEL_GIER_GIE_MASK, drvdata->base_addr + XEL_GIER_OFFSET);
173}
174
175
176
177
178
179
180
181
182static void xemaclite_disable_interrupts(struct net_local *drvdata)
183{
184 u32 reg_data;
185
186
187 xemaclite_writel(XEL_GIER_GIE_MASK, drvdata->base_addr + XEL_GIER_OFFSET);
188
189
190 reg_data = xemaclite_readl(drvdata->base_addr + XEL_TSR_OFFSET);
191 xemaclite_writel(reg_data & (~XEL_TSR_XMIT_IE_MASK),
192 drvdata->base_addr + XEL_TSR_OFFSET);
193
194
195 reg_data = xemaclite_readl(drvdata->base_addr + XEL_RSR_OFFSET);
196 xemaclite_writel(reg_data & (~XEL_RSR_RECV_IE_MASK),
197 drvdata->base_addr + XEL_RSR_OFFSET);
198}
199
200
201
202
203
204
205
206
207
208
209static void xemaclite_aligned_write(void *src_ptr, u32 *dest_ptr,
210 unsigned length)
211{
212 u32 align_buffer;
213 u32 *to_u32_ptr;
214 u16 *from_u16_ptr, *to_u16_ptr;
215
216 to_u32_ptr = dest_ptr;
217 from_u16_ptr = src_ptr;
218 align_buffer = 0;
219
220 for (; length > 3; length -= 4) {
221 to_u16_ptr = (u16 *)&align_buffer;
222 *to_u16_ptr++ = *from_u16_ptr++;
223 *to_u16_ptr++ = *from_u16_ptr++;
224
225
226
227
228
229
230 wmb();
231
232
233 *to_u32_ptr++ = align_buffer;
234 }
235 if (length) {
236 u8 *from_u8_ptr, *to_u8_ptr;
237
238
239 align_buffer = 0;
240 to_u8_ptr = (u8 *)&align_buffer;
241 from_u8_ptr = (u8 *)from_u16_ptr;
242
243
244 for (; length > 0; length--)
245 *to_u8_ptr++ = *from_u8_ptr++;
246
247
248
249
250
251
252 wmb();
253 *to_u32_ptr = align_buffer;
254 }
255}
256
257
258
259
260
261
262
263
264
265
266static void xemaclite_aligned_read(u32 *src_ptr, u8 *dest_ptr,
267 unsigned length)
268{
269 u16 *to_u16_ptr, *from_u16_ptr;
270 u32 *from_u32_ptr;
271 u32 align_buffer;
272
273 from_u32_ptr = src_ptr;
274 to_u16_ptr = (u16 *)dest_ptr;
275
276 for (; length > 3; length -= 4) {
277
278 align_buffer = *from_u32_ptr++;
279 from_u16_ptr = (u16 *)&align_buffer;
280
281
282 *to_u16_ptr++ = *from_u16_ptr++;
283 *to_u16_ptr++ = *from_u16_ptr++;
284 }
285
286 if (length) {
287 u8 *to_u8_ptr, *from_u8_ptr;
288
289
290 to_u8_ptr = (u8 *)to_u16_ptr;
291 align_buffer = *from_u32_ptr++;
292 from_u8_ptr = (u8 *)&align_buffer;
293
294
295 for (; length > 0; length--)
296 *to_u8_ptr = *from_u8_ptr;
297 }
298}
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315static int xemaclite_send_data(struct net_local *drvdata, u8 *data,
316 unsigned int byte_count)
317{
318 u32 reg_data;
319 void __iomem *addr;
320
321
322 addr = drvdata->base_addr + drvdata->next_tx_buf_to_use;
323
324
325 if (byte_count > ETH_FRAME_LEN)
326 byte_count = ETH_FRAME_LEN;
327
328
329 reg_data = xemaclite_readl(addr + XEL_TSR_OFFSET);
330 if ((reg_data & (XEL_TSR_XMIT_BUSY_MASK |
331 XEL_TSR_XMIT_ACTIVE_MASK)) == 0) {
332
333
334 if (drvdata->tx_ping_pong != 0)
335 drvdata->next_tx_buf_to_use ^= XEL_BUFFER_OFFSET;
336 } else if (drvdata->tx_ping_pong != 0) {
337
338
339
340
341 addr = (void __iomem __force *)((uintptr_t __force)addr ^
342 XEL_BUFFER_OFFSET);
343 reg_data = xemaclite_readl(addr + XEL_TSR_OFFSET);
344
345 if ((reg_data & (XEL_TSR_XMIT_BUSY_MASK |
346 XEL_TSR_XMIT_ACTIVE_MASK)) != 0)
347 return -1;
348 } else
349 return -1;
350
351
352 xemaclite_aligned_write(data, (u32 __force *)addr, byte_count);
353
354 xemaclite_writel((byte_count & XEL_TPLR_LENGTH_MASK),
355 addr + XEL_TPLR_OFFSET);
356
357
358
359
360
361
362 reg_data = xemaclite_readl(addr + XEL_TSR_OFFSET);
363 reg_data |= (XEL_TSR_XMIT_BUSY_MASK | XEL_TSR_XMIT_ACTIVE_MASK);
364 xemaclite_writel(reg_data, addr + XEL_TSR_OFFSET);
365
366 return 0;
367}
368
369
370
371
372
373
374
375
376
377
378
379
380static u16 xemaclite_recv_data(struct net_local *drvdata, u8 *data, int maxlen)
381{
382 void __iomem *addr;
383 u16 length, proto_type;
384 u32 reg_data;
385
386
387 addr = (drvdata->base_addr + drvdata->next_rx_buf_to_use);
388
389
390 reg_data = xemaclite_readl(addr + XEL_RSR_OFFSET);
391
392 if ((reg_data & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) {
393 if (drvdata->rx_ping_pong != 0)
394 drvdata->next_rx_buf_to_use ^= XEL_BUFFER_OFFSET;
395 } else {
396
397
398
399
400
401 if (drvdata->rx_ping_pong != 0)
402 addr = (void __iomem __force *)
403 ((uintptr_t __force)addr ^
404 XEL_BUFFER_OFFSET);
405 else
406 return 0;
407
408
409 reg_data = xemaclite_readl(addr + XEL_RSR_OFFSET);
410 if ((reg_data & XEL_RSR_RECV_DONE_MASK) !=
411 XEL_RSR_RECV_DONE_MASK)
412 return 0;
413 }
414
415
416
417 proto_type = ((ntohl(xemaclite_readl(addr + XEL_HEADER_OFFSET +
418 XEL_RXBUFF_OFFSET)) >> XEL_HEADER_SHIFT) &
419 XEL_RPLR_LENGTH_MASK);
420
421
422
423
424 if (proto_type > ETH_DATA_LEN) {
425
426 if (proto_type == ETH_P_IP) {
427 length = ((ntohl(xemaclite_readl(addr +
428 XEL_HEADER_IP_LENGTH_OFFSET +
429 XEL_RXBUFF_OFFSET)) >>
430 XEL_HEADER_SHIFT) &
431 XEL_RPLR_LENGTH_MASK);
432 length = min_t(u16, length, ETH_DATA_LEN);
433 length += ETH_HLEN + ETH_FCS_LEN;
434
435 } else if (proto_type == ETH_P_ARP)
436 length = XEL_ARP_PACKET_SIZE + ETH_HLEN + ETH_FCS_LEN;
437 else
438
439
440
441 length = ETH_FRAME_LEN + ETH_FCS_LEN;
442 } else
443
444 length = proto_type + ETH_HLEN + ETH_FCS_LEN;
445
446 if (WARN_ON(length > maxlen))
447 length = maxlen;
448
449
450 xemaclite_aligned_read((u32 __force *)(addr + XEL_RXBUFF_OFFSET),
451 data, length);
452
453
454 reg_data = xemaclite_readl(addr + XEL_RSR_OFFSET);
455 reg_data &= ~XEL_RSR_RECV_DONE_MASK;
456 xemaclite_writel(reg_data, addr + XEL_RSR_OFFSET);
457
458 return length;
459}
460
461
462
463
464
465
466
467
468
469
470
471
472static void xemaclite_update_address(struct net_local *drvdata,
473 u8 *address_ptr)
474{
475 void __iomem *addr;
476 u32 reg_data;
477
478
479 addr = drvdata->base_addr + drvdata->next_tx_buf_to_use;
480
481 xemaclite_aligned_write(address_ptr, (u32 __force *)addr, ETH_ALEN);
482
483 xemaclite_writel(ETH_ALEN, addr + XEL_TPLR_OFFSET);
484
485
486 reg_data = xemaclite_readl(addr + XEL_TSR_OFFSET);
487 xemaclite_writel(reg_data | XEL_TSR_PROG_MAC_ADDR, addr + XEL_TSR_OFFSET);
488
489
490 while ((xemaclite_readl(addr + XEL_TSR_OFFSET) &
491 XEL_TSR_PROG_MAC_ADDR) != 0)
492 ;
493}
494
495
496
497
498
499
500
501
502
503
504
505
506static int xemaclite_set_mac_address(struct net_device *dev, void *address)
507{
508 struct net_local *lp = netdev_priv(dev);
509 struct sockaddr *addr = address;
510
511 if (netif_running(dev))
512 return -EBUSY;
513
514 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
515 xemaclite_update_address(lp, dev->dev_addr);
516 return 0;
517}
518
519
520
521
522
523
524
525
526static void xemaclite_tx_timeout(struct net_device *dev, unsigned int txqueue)
527{
528 struct net_local *lp = netdev_priv(dev);
529 unsigned long flags;
530
531 dev_err(&lp->ndev->dev, "Exceeded transmit timeout of %lu ms\n",
532 TX_TIMEOUT * 1000UL / HZ);
533
534 dev->stats.tx_errors++;
535
536
537 spin_lock_irqsave(&lp->reset_lock, flags);
538
539
540 netif_stop_queue(dev);
541
542 xemaclite_disable_interrupts(lp);
543 xemaclite_enable_interrupts(lp);
544
545 if (lp->deferred_skb) {
546 dev_kfree_skb(lp->deferred_skb);
547 lp->deferred_skb = NULL;
548 dev->stats.tx_errors++;
549 }
550
551
552 netif_trans_update(dev);
553
554
555 netif_wake_queue(dev);
556 spin_unlock_irqrestore(&lp->reset_lock, flags);
557}
558
559
560
561
562
563
564
565
566
567
568
569
570static void xemaclite_tx_handler(struct net_device *dev)
571{
572 struct net_local *lp = netdev_priv(dev);
573
574 dev->stats.tx_packets++;
575
576 if (!lp->deferred_skb)
577 return;
578
579 if (xemaclite_send_data(lp, (u8 *)lp->deferred_skb->data,
580 lp->deferred_skb->len))
581 return;
582
583 dev->stats.tx_bytes += lp->deferred_skb->len;
584 dev_consume_skb_irq(lp->deferred_skb);
585 lp->deferred_skb = NULL;
586 netif_trans_update(dev);
587 netif_wake_queue(dev);
588}
589
590
591
592
593
594
595
596
597static void xemaclite_rx_handler(struct net_device *dev)
598{
599 struct net_local *lp = netdev_priv(dev);
600 struct sk_buff *skb;
601 unsigned int align;
602 u32 len;
603
604 len = ETH_FRAME_LEN + ETH_FCS_LEN;
605 skb = netdev_alloc_skb(dev, len + ALIGNMENT);
606 if (!skb) {
607
608 dev->stats.rx_dropped++;
609 dev_err(&lp->ndev->dev, "Could not allocate receive buffer\n");
610 return;
611 }
612
613
614
615
616
617
618 align = BUFFER_ALIGN(skb->data);
619 if (align)
620 skb_reserve(skb, align);
621
622 skb_reserve(skb, 2);
623
624 len = xemaclite_recv_data(lp, (u8 *)skb->data, len);
625
626 if (!len) {
627 dev->stats.rx_errors++;
628 dev_kfree_skb_irq(skb);
629 return;
630 }
631
632 skb_put(skb, len);
633
634 skb->protocol = eth_type_trans(skb, dev);
635 skb_checksum_none_assert(skb);
636
637 dev->stats.rx_packets++;
638 dev->stats.rx_bytes += len;
639
640 if (!skb_defer_rx_timestamp(skb))
641 netif_rx(skb);
642}
643
644
645
646
647
648
649
650
651
652
653
654static irqreturn_t xemaclite_interrupt(int irq, void *dev_id)
655{
656 bool tx_complete = false;
657 struct net_device *dev = dev_id;
658 struct net_local *lp = netdev_priv(dev);
659 void __iomem *base_addr = lp->base_addr;
660 u32 tx_status;
661
662
663 if ((xemaclite_readl(base_addr + XEL_RSR_OFFSET) &
664 XEL_RSR_RECV_DONE_MASK) ||
665 (xemaclite_readl(base_addr + XEL_BUFFER_OFFSET + XEL_RSR_OFFSET)
666 & XEL_RSR_RECV_DONE_MASK))
667
668 xemaclite_rx_handler(dev);
669
670
671 tx_status = xemaclite_readl(base_addr + XEL_TSR_OFFSET);
672 if (((tx_status & XEL_TSR_XMIT_BUSY_MASK) == 0) &&
673 (tx_status & XEL_TSR_XMIT_ACTIVE_MASK) != 0) {
674
675 tx_status &= ~XEL_TSR_XMIT_ACTIVE_MASK;
676 xemaclite_writel(tx_status, base_addr + XEL_TSR_OFFSET);
677
678 tx_complete = true;
679 }
680
681
682 tx_status = xemaclite_readl(base_addr + XEL_BUFFER_OFFSET + XEL_TSR_OFFSET);
683 if (((tx_status & XEL_TSR_XMIT_BUSY_MASK) == 0) &&
684 (tx_status & XEL_TSR_XMIT_ACTIVE_MASK) != 0) {
685
686 tx_status &= ~XEL_TSR_XMIT_ACTIVE_MASK;
687 xemaclite_writel(tx_status, base_addr + XEL_BUFFER_OFFSET +
688 XEL_TSR_OFFSET);
689
690 tx_complete = true;
691 }
692
693
694 if (tx_complete != 0)
695 xemaclite_tx_handler(dev);
696
697 return IRQ_HANDLED;
698}
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714static int xemaclite_mdio_wait(struct net_local *lp)
715{
716 u32 val;
717
718
719
720
721 return readx_poll_timeout(xemaclite_readl,
722 lp->base_addr + XEL_MDIOCTRL_OFFSET,
723 val, !(val & XEL_MDIOCTRL_MDIOSTS_MASK),
724 1000, 20000);
725}
726
727
728
729
730
731
732
733
734
735
736
737
738
739static int xemaclite_mdio_read(struct mii_bus *bus, int phy_id, int reg)
740{
741 struct net_local *lp = bus->priv;
742 u32 ctrl_reg;
743 u32 rc;
744
745 if (xemaclite_mdio_wait(lp))
746 return -ETIMEDOUT;
747
748
749
750
751
752 ctrl_reg = xemaclite_readl(lp->base_addr + XEL_MDIOCTRL_OFFSET);
753 xemaclite_writel(XEL_MDIOADDR_OP_MASK |
754 ((phy_id << XEL_MDIOADDR_PHYADR_SHIFT) | reg),
755 lp->base_addr + XEL_MDIOADDR_OFFSET);
756 xemaclite_writel(ctrl_reg | XEL_MDIOCTRL_MDIOSTS_MASK,
757 lp->base_addr + XEL_MDIOCTRL_OFFSET);
758
759 if (xemaclite_mdio_wait(lp))
760 return -ETIMEDOUT;
761
762 rc = xemaclite_readl(lp->base_addr + XEL_MDIORD_OFFSET);
763
764 dev_dbg(&lp->ndev->dev,
765 "%s(phy_id=%i, reg=%x) == %x\n", __func__,
766 phy_id, reg, rc);
767
768 return rc;
769}
770
771
772
773
774
775
776
777
778
779
780
781
782
783static int xemaclite_mdio_write(struct mii_bus *bus, int phy_id, int reg,
784 u16 val)
785{
786 struct net_local *lp = bus->priv;
787 u32 ctrl_reg;
788
789 dev_dbg(&lp->ndev->dev,
790 "%s(phy_id=%i, reg=%x, val=%x)\n", __func__,
791 phy_id, reg, val);
792
793 if (xemaclite_mdio_wait(lp))
794 return -ETIMEDOUT;
795
796
797
798
799
800
801 ctrl_reg = xemaclite_readl(lp->base_addr + XEL_MDIOCTRL_OFFSET);
802 xemaclite_writel(~XEL_MDIOADDR_OP_MASK &
803 ((phy_id << XEL_MDIOADDR_PHYADR_SHIFT) | reg),
804 lp->base_addr + XEL_MDIOADDR_OFFSET);
805 xemaclite_writel(val, lp->base_addr + XEL_MDIOWR_OFFSET);
806 xemaclite_writel(ctrl_reg | XEL_MDIOCTRL_MDIOSTS_MASK,
807 lp->base_addr + XEL_MDIOCTRL_OFFSET);
808
809 return 0;
810}
811
812
813
814
815
816
817
818
819
820
821
822static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
823{
824 struct mii_bus *bus;
825 int rc;
826 struct resource res;
827 struct device_node *np = of_get_parent(lp->phy_node);
828 struct device_node *npp;
829
830
831
832
833 if (!np) {
834 dev_err(dev, "Failed to register mdio bus.\n");
835 return -ENODEV;
836 }
837 npp = of_get_parent(np);
838
839 of_address_to_resource(npp, 0, &res);
840 if (lp->ndev->mem_start != res.start) {
841 struct phy_device *phydev;
842 phydev = of_phy_find_device(lp->phy_node);
843 if (!phydev)
844 dev_info(dev,
845 "MDIO of the phy is not registered yet\n");
846 else
847 put_device(&phydev->mdio.dev);
848 return 0;
849 }
850
851
852
853
854 xemaclite_writel(XEL_MDIOCTRL_MDIOEN_MASK,
855 lp->base_addr + XEL_MDIOCTRL_OFFSET);
856
857 bus = mdiobus_alloc();
858 if (!bus) {
859 dev_err(dev, "Failed to allocate mdiobus\n");
860 return -ENOMEM;
861 }
862
863 snprintf(bus->id, MII_BUS_ID_SIZE, "%.8llx",
864 (unsigned long long)res.start);
865 bus->priv = lp;
866 bus->name = "Xilinx Emaclite MDIO";
867 bus->read = xemaclite_mdio_read;
868 bus->write = xemaclite_mdio_write;
869 bus->parent = dev;
870
871 rc = of_mdiobus_register(bus, np);
872 if (rc) {
873 dev_err(dev, "Failed to register mdio bus.\n");
874 goto err_register;
875 }
876
877 lp->mii_bus = bus;
878
879 return 0;
880
881err_register:
882 mdiobus_free(bus);
883 return rc;
884}
885
886
887
888
889
890
891
892
893static void xemaclite_adjust_link(struct net_device *ndev)
894{
895 struct net_local *lp = netdev_priv(ndev);
896 struct phy_device *phy = lp->phy_dev;
897 int link_state;
898
899
900 link_state = phy->speed | (phy->duplex << 1) | phy->link;
901
902 if (lp->last_link != link_state) {
903 lp->last_link = link_state;
904 phy_print_status(phy);
905 }
906}
907
908
909
910
911
912
913
914
915
916
917
918
919static int xemaclite_open(struct net_device *dev)
920{
921 struct net_local *lp = netdev_priv(dev);
922 int retval;
923
924
925 xemaclite_disable_interrupts(lp);
926
927 if (lp->phy_node) {
928 u32 bmcr;
929
930 lp->phy_dev = of_phy_connect(lp->ndev, lp->phy_node,
931 xemaclite_adjust_link, 0,
932 PHY_INTERFACE_MODE_MII);
933 if (!lp->phy_dev) {
934 dev_err(&lp->ndev->dev, "of_phy_connect() failed\n");
935 return -ENODEV;
936 }
937
938
939 phy_set_max_speed(lp->phy_dev, SPEED_100);
940
941
942 phy_write(lp->phy_dev, MII_CTRL1000, 0);
943
944
945 phy_write(lp->phy_dev, MII_ADVERTISE, ADVERTISE_ALL |
946 ADVERTISE_CSMA);
947
948
949 bmcr = phy_read(lp->phy_dev, MII_BMCR);
950 bmcr |= (BMCR_ANENABLE | BMCR_ANRESTART);
951 phy_write(lp->phy_dev, MII_BMCR, bmcr);
952
953 phy_start(lp->phy_dev);
954 }
955
956
957 xemaclite_update_address(lp, dev->dev_addr);
958
959
960 retval = request_irq(dev->irq, xemaclite_interrupt, 0, dev->name, dev);
961 if (retval) {
962 dev_err(&lp->ndev->dev, "Could not allocate interrupt %d\n",
963 dev->irq);
964 if (lp->phy_dev)
965 phy_disconnect(lp->phy_dev);
966 lp->phy_dev = NULL;
967
968 return retval;
969 }
970
971
972 xemaclite_enable_interrupts(lp);
973
974
975 netif_start_queue(dev);
976
977 return 0;
978}
979
980
981
982
983
984
985
986
987
988
989
990static int xemaclite_close(struct net_device *dev)
991{
992 struct net_local *lp = netdev_priv(dev);
993
994 netif_stop_queue(dev);
995 xemaclite_disable_interrupts(lp);
996 free_irq(dev->irq, dev);
997
998 if (lp->phy_dev)
999 phy_disconnect(lp->phy_dev);
1000 lp->phy_dev = NULL;
1001
1002 return 0;
1003}
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019static netdev_tx_t
1020xemaclite_send(struct sk_buff *orig_skb, struct net_device *dev)
1021{
1022 struct net_local *lp = netdev_priv(dev);
1023 struct sk_buff *new_skb;
1024 unsigned int len;
1025 unsigned long flags;
1026
1027 len = orig_skb->len;
1028
1029 new_skb = orig_skb;
1030
1031 spin_lock_irqsave(&lp->reset_lock, flags);
1032 if (xemaclite_send_data(lp, (u8 *)new_skb->data, len) != 0) {
1033
1034
1035
1036
1037 netif_stop_queue(dev);
1038 lp->deferred_skb = new_skb;
1039
1040 skb_tx_timestamp(new_skb);
1041 spin_unlock_irqrestore(&lp->reset_lock, flags);
1042 return NETDEV_TX_OK;
1043 }
1044 spin_unlock_irqrestore(&lp->reset_lock, flags);
1045
1046 skb_tx_timestamp(new_skb);
1047
1048 dev->stats.tx_bytes += len;
1049 dev_consume_skb_any(new_skb);
1050
1051 return NETDEV_TX_OK;
1052}
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064static bool get_bool(struct platform_device *ofdev, const char *s)
1065{
1066 u32 *p = (u32 *)of_get_property(ofdev->dev.of_node, s, NULL);
1067
1068 if (!p) {
1069 dev_warn(&ofdev->dev, "Parameter %s not found, defaulting to false\n", s);
1070 return false;
1071 }
1072
1073 return (bool)*p;
1074}
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084static void xemaclite_ethtools_get_drvinfo(struct net_device *ndev,
1085 struct ethtool_drvinfo *ed)
1086{
1087 strlcpy(ed->driver, DRIVER_NAME, sizeof(ed->driver));
1088}
1089
1090static const struct ethtool_ops xemaclite_ethtool_ops = {
1091 .get_drvinfo = xemaclite_ethtools_get_drvinfo,
1092 .get_link = ethtool_op_get_link,
1093 .get_link_ksettings = phy_ethtool_get_link_ksettings,
1094 .set_link_ksettings = phy_ethtool_set_link_ksettings,
1095};
1096
1097static const struct net_device_ops xemaclite_netdev_ops;
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112static int xemaclite_of_probe(struct platform_device *ofdev)
1113{
1114 struct resource *res;
1115 struct net_device *ndev = NULL;
1116 struct net_local *lp = NULL;
1117 struct device *dev = &ofdev->dev;
1118
1119 int rc = 0;
1120
1121 dev_info(dev, "Device Tree Probing\n");
1122
1123
1124 ndev = alloc_etherdev(sizeof(struct net_local));
1125 if (!ndev)
1126 return -ENOMEM;
1127
1128 dev_set_drvdata(dev, ndev);
1129 SET_NETDEV_DEV(ndev, &ofdev->dev);
1130
1131 lp = netdev_priv(ndev);
1132 lp->ndev = ndev;
1133
1134
1135 res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0);
1136 if (!res) {
1137 dev_err(dev, "no IRQ found\n");
1138 rc = -ENXIO;
1139 goto error;
1140 }
1141
1142 ndev->irq = res->start;
1143
1144 res = platform_get_resource(ofdev, IORESOURCE_MEM, 0);
1145 lp->base_addr = devm_ioremap_resource(&ofdev->dev, res);
1146 if (IS_ERR(lp->base_addr)) {
1147 rc = PTR_ERR(lp->base_addr);
1148 goto error;
1149 }
1150
1151 ndev->mem_start = res->start;
1152 ndev->mem_end = res->end;
1153
1154 spin_lock_init(&lp->reset_lock);
1155 lp->next_tx_buf_to_use = 0x0;
1156 lp->next_rx_buf_to_use = 0x0;
1157 lp->tx_ping_pong = get_bool(ofdev, "xlnx,tx-ping-pong");
1158 lp->rx_ping_pong = get_bool(ofdev, "xlnx,rx-ping-pong");
1159
1160 rc = of_get_mac_address(ofdev->dev.of_node, ndev->dev_addr);
1161 if (rc) {
1162 dev_warn(dev, "No MAC address found, using random\n");
1163 eth_hw_addr_random(ndev);
1164 }
1165
1166
1167 xemaclite_writel(0, lp->base_addr + XEL_TSR_OFFSET);
1168 xemaclite_writel(0, lp->base_addr + XEL_BUFFER_OFFSET + XEL_TSR_OFFSET);
1169
1170
1171 xemaclite_update_address(lp, ndev->dev_addr);
1172
1173 lp->phy_node = of_parse_phandle(ofdev->dev.of_node, "phy-handle", 0);
1174 xemaclite_mdio_setup(lp, &ofdev->dev);
1175
1176 dev_info(dev, "MAC address is now %pM\n", ndev->dev_addr);
1177
1178 ndev->netdev_ops = &xemaclite_netdev_ops;
1179 ndev->ethtool_ops = &xemaclite_ethtool_ops;
1180 ndev->flags &= ~IFF_MULTICAST;
1181 ndev->watchdog_timeo = TX_TIMEOUT;
1182
1183
1184 rc = register_netdev(ndev);
1185 if (rc) {
1186 dev_err(dev,
1187 "Cannot register network device, aborting\n");
1188 goto error;
1189 }
1190
1191 dev_info(dev,
1192 "Xilinx EmacLite at 0x%08lX mapped to 0x%p, irq=%d\n",
1193 (unsigned long __force)ndev->mem_start, lp->base_addr, ndev->irq);
1194 return 0;
1195
1196error:
1197 free_netdev(ndev);
1198 return rc;
1199}
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211static int xemaclite_of_remove(struct platform_device *of_dev)
1212{
1213 struct net_device *ndev = platform_get_drvdata(of_dev);
1214
1215 struct net_local *lp = netdev_priv(ndev);
1216
1217
1218 if (lp->mii_bus) {
1219 mdiobus_unregister(lp->mii_bus);
1220 mdiobus_free(lp->mii_bus);
1221 lp->mii_bus = NULL;
1222 }
1223
1224 unregister_netdev(ndev);
1225
1226 of_node_put(lp->phy_node);
1227 lp->phy_node = NULL;
1228
1229 free_netdev(ndev);
1230
1231 return 0;
1232}
1233
1234#ifdef CONFIG_NET_POLL_CONTROLLER
1235static void
1236xemaclite_poll_controller(struct net_device *ndev)
1237{
1238 disable_irq(ndev->irq);
1239 xemaclite_interrupt(ndev->irq, ndev);
1240 enable_irq(ndev->irq);
1241}
1242#endif
1243
1244
1245static int xemaclite_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1246{
1247 if (!dev->phydev || !netif_running(dev))
1248 return -EINVAL;
1249
1250 switch (cmd) {
1251 case SIOCGMIIPHY:
1252 case SIOCGMIIREG:
1253 case SIOCSMIIREG:
1254 return phy_mii_ioctl(dev->phydev, rq, cmd);
1255 default:
1256 return -EOPNOTSUPP;
1257 }
1258}
1259
1260static const struct net_device_ops xemaclite_netdev_ops = {
1261 .ndo_open = xemaclite_open,
1262 .ndo_stop = xemaclite_close,
1263 .ndo_start_xmit = xemaclite_send,
1264 .ndo_set_mac_address = xemaclite_set_mac_address,
1265 .ndo_tx_timeout = xemaclite_tx_timeout,
1266 .ndo_do_ioctl = xemaclite_ioctl,
1267#ifdef CONFIG_NET_POLL_CONTROLLER
1268 .ndo_poll_controller = xemaclite_poll_controller,
1269#endif
1270};
1271
1272
1273static const struct of_device_id xemaclite_of_match[] = {
1274 { .compatible = "xlnx,opb-ethernetlite-1.01.a", },
1275 { .compatible = "xlnx,opb-ethernetlite-1.01.b", },
1276 { .compatible = "xlnx,xps-ethernetlite-1.00.a", },
1277 { .compatible = "xlnx,xps-ethernetlite-2.00.a", },
1278 { .compatible = "xlnx,xps-ethernetlite-2.01.a", },
1279 { .compatible = "xlnx,xps-ethernetlite-3.00.a", },
1280 { },
1281};
1282MODULE_DEVICE_TABLE(of, xemaclite_of_match);
1283
1284static struct platform_driver xemaclite_of_driver = {
1285 .driver = {
1286 .name = DRIVER_NAME,
1287 .of_match_table = xemaclite_of_match,
1288 },
1289 .probe = xemaclite_of_probe,
1290 .remove = xemaclite_of_remove,
1291};
1292
1293module_platform_driver(xemaclite_of_driver);
1294
1295MODULE_AUTHOR("Xilinx, Inc.");
1296MODULE_DESCRIPTION("Xilinx Ethernet MAC Lite driver");
1297MODULE_LICENSE("GPL");
1298