1
2
3
4
5
6
7
8#include <linux/bitops.h>
9#include <linux/clk.h>
10#include <linux/etherdevice.h>
11#include <linux/interrupt.h>
12#include <linux/io.h>
13#include <linux/iopoll.h>
14#include <linux/mfd/syscon.h>
15#include <linux/mii.h>
16#include <linux/module.h>
17#include <linux/netdevice.h>
18#include <linux/of_net.h>
19#include <linux/of_mdio.h>
20#include <linux/of_platform.h>
21#include <linux/phy.h>
22#include <linux/regmap.h>
23#include <linux/reset.h>
24#include <linux/types.h>
25#include <linux/u64_stats_sync.h>
26
27
28#define AVE_IDR 0x000
29#define AVE_VR 0x004
30#define AVE_GRR 0x008
31#define AVE_CFGR 0x00c
32
33
34#define AVE_GIMR 0x100
35#define AVE_GISR 0x104
36
37
38#define AVE_TXCR 0x200
39#define AVE_RXCR 0x204
40#define AVE_RXMAC1R 0x208
41#define AVE_RXMAC2R 0x20c
42#define AVE_MDIOCTR 0x214
43#define AVE_MDIOAR 0x218
44#define AVE_MDIOWDR 0x21c
45#define AVE_MDIOSR 0x220
46#define AVE_MDIORDR 0x224
47
48
49#define AVE_DESCC 0x300
50#define AVE_TXDC 0x304
51#define AVE_RXDC0 0x308
52#define AVE_IIRQC 0x34c
53
54
55#define AVE_PKTF_BASE 0x800
56#define AVE_PFMBYTE_BASE 0xd00
57#define AVE_PFMBIT_BASE 0xe00
58#define AVE_PFSEL_BASE 0xf00
59#define AVE_PFEN 0xffc
60#define AVE_PKTF(ent) (AVE_PKTF_BASE + (ent) * 0x40)
61#define AVE_PFMBYTE(ent) (AVE_PFMBYTE_BASE + (ent) * 8)
62#define AVE_PFMBIT(ent) (AVE_PFMBIT_BASE + (ent) * 4)
63#define AVE_PFSEL(ent) (AVE_PFSEL_BASE + (ent) * 4)
64
65
66#define AVE_DESC_SIZE_64 12
67
68#define AVE_TXDM_64 0x1000
69#define AVE_RXDM_64 0x1c00
70
71#define AVE_TXDM_SIZE_64 0x0ba0
72#define AVE_RXDM_SIZE_64 0x6000
73
74
75#define AVE_DESC_SIZE_32 8
76
77#define AVE_TXDM_32 0x1000
78#define AVE_RXDM_32 0x1800
79
80#define AVE_TXDM_SIZE_32 0x07c0
81#define AVE_RXDM_SIZE_32 0x4000
82
83
84#define AVE_RSTCTRL 0x8028
85#define AVE_RSTCTRL_RMIIRST BIT(16)
86#define AVE_LINKSEL 0x8034
87#define AVE_LINKSEL_100M BIT(0)
88
89
90#define AVE_GRR_RXFFR BIT(5)
91#define AVE_GRR_PHYRST BIT(4)
92#define AVE_GRR_GRST BIT(0)
93
94
95#define AVE_CFGR_FLE BIT(31)
96#define AVE_CFGR_CHE BIT(30)
97#define AVE_CFGR_MII BIT(27)
98#define AVE_CFGR_IPFCEN BIT(24)
99
100
101#define AVE_GI_PHY BIT(24)
102#define AVE_GI_TX BIT(16)
103#define AVE_GI_RXERR BIT(8)
104#define AVE_GI_RXOVF BIT(7)
105#define AVE_GI_RXDROP BIT(6)
106#define AVE_GI_RXIINT BIT(5)
107
108
109#define AVE_TXCR_FLOCTR BIT(18)
110#define AVE_TXCR_TXSPD_1G BIT(17)
111#define AVE_TXCR_TXSPD_100 BIT(16)
112
113
114#define AVE_RXCR_RXEN BIT(30)
115#define AVE_RXCR_FDUPEN BIT(22)
116#define AVE_RXCR_FLOCTR BIT(21)
117#define AVE_RXCR_AFEN BIT(19)
118#define AVE_RXCR_DRPEN BIT(18)
119#define AVE_RXCR_MPSIZ_MASK GENMASK(10, 0)
120
121
122#define AVE_MDIOCTR_RREQ BIT(3)
123#define AVE_MDIOCTR_WREQ BIT(2)
124
125
126#define AVE_MDIOSR_STS BIT(0)
127
128
129#define AVE_DESCC_STATUS_MASK GENMASK(31, 16)
130#define AVE_DESCC_RD0 BIT(8)
131#define AVE_DESCC_RDSTP BIT(4)
132#define AVE_DESCC_TD BIT(0)
133
134
135#define AVE_TXDC_SIZE GENMASK(27, 16)
136#define AVE_TXDC_ADDR GENMASK(11, 0)
137#define AVE_TXDC_ADDR_START 0
138
139
140#define AVE_RXDC0_SIZE GENMASK(30, 16)
141#define AVE_RXDC0_ADDR GENMASK(14, 0)
142#define AVE_RXDC0_ADDR_START 0
143
144
145#define AVE_IIRQC_EN0 BIT(27)
146#define AVE_IIRQC_BSCK GENMASK(15, 0)
147
148
149#define AVE_STS_OWN BIT(31)
150#define AVE_STS_INTR BIT(29)
151#define AVE_STS_OK BIT(27)
152
153#define AVE_STS_NOCSUM BIT(28)
154#define AVE_STS_1ST BIT(26)
155#define AVE_STS_LAST BIT(25)
156#define AVE_STS_OWC BIT(21)
157#define AVE_STS_EC BIT(20)
158#define AVE_STS_PKTLEN_TX_MASK GENMASK(15, 0)
159
160#define AVE_STS_CSSV BIT(21)
161#define AVE_STS_CSER BIT(20)
162#define AVE_STS_PKTLEN_RX_MASK GENMASK(10, 0)
163
164
165#define AVE_PFMBYTE_MASK0 (GENMASK(31, 8) | GENMASK(5, 0))
166#define AVE_PFMBYTE_MASK1 GENMASK(25, 0)
167#define AVE_PFMBIT_MASK GENMASK(15, 0)
168
169#define AVE_PF_SIZE 17
170#define AVE_PF_MULTICAST_SIZE 7
171
172#define AVE_PFNUM_FILTER 0
173#define AVE_PFNUM_UNICAST 1
174#define AVE_PFNUM_BROADCAST 2
175#define AVE_PFNUM_MULTICAST 11
176
177
178#define AVE_DEFAULT_MSG_ENABLE (NETIF_MSG_DRV | \
179 NETIF_MSG_PROBE | \
180 NETIF_MSG_LINK | \
181 NETIF_MSG_TIMER | \
182 NETIF_MSG_IFDOWN | \
183 NETIF_MSG_IFUP | \
184 NETIF_MSG_RX_ERR | \
185 NETIF_MSG_TX_ERR)
186
187
188#define AVE_NR_TXDESC 64
189#define AVE_NR_RXDESC 256
190
191#define AVE_DESC_OFS_CMDSTS 0
192#define AVE_DESC_OFS_ADDRL 4
193#define AVE_DESC_OFS_ADDRU 8
194
195
196#define AVE_MAX_ETHFRAME 1518
197#define AVE_FRAME_HEADROOM 2
198
199
200#define AVE_INTM_COUNT 20
201#define AVE_FORCE_TXINTCNT 1
202
203
204#define SG_ETPINMODE 0x540
205#define SG_ETPINMODE_EXTPHY BIT(1)
206#define SG_ETPINMODE_RMII(ins) BIT(ins)
207
208#define IS_DESC_64BIT(p) ((p)->data->is_desc_64bit)
209
210#define AVE_MAX_CLKS 4
211#define AVE_MAX_RSTS 2
212
213enum desc_id {
214 AVE_DESCID_RX,
215 AVE_DESCID_TX,
216};
217
218enum desc_state {
219 AVE_DESC_RX_PERMIT,
220 AVE_DESC_RX_SUSPEND,
221 AVE_DESC_START,
222 AVE_DESC_STOP,
223};
224
225struct ave_desc {
226 struct sk_buff *skbs;
227 dma_addr_t skbs_dma;
228 size_t skbs_dmalen;
229};
230
231struct ave_desc_info {
232 u32 ndesc;
233 u32 daddr;
234 u32 proc_idx;
235 u32 done_idx;
236 struct ave_desc *desc;
237};
238
239struct ave_stats {
240 struct u64_stats_sync syncp;
241 u64 packets;
242 u64 bytes;
243 u64 errors;
244 u64 dropped;
245 u64 collisions;
246 u64 fifo_errors;
247};
248
249struct ave_private {
250 void __iomem *base;
251 int irq;
252 int phy_id;
253 unsigned int desc_size;
254 u32 msg_enable;
255 int nclks;
256 struct clk *clk[AVE_MAX_CLKS];
257 int nrsts;
258 struct reset_control *rst[AVE_MAX_RSTS];
259 phy_interface_t phy_mode;
260 struct phy_device *phydev;
261 struct mii_bus *mdio;
262 struct regmap *regmap;
263 unsigned int pinmode_mask;
264 unsigned int pinmode_val;
265 u32 wolopts;
266
267
268 struct ave_stats stats_rx;
269 struct ave_stats stats_tx;
270
271
272 struct net_device *ndev;
273 struct napi_struct napi_rx;
274 struct napi_struct napi_tx;
275
276
277 struct ave_desc_info rx;
278 struct ave_desc_info tx;
279
280
281 int pause_auto;
282 int pause_rx;
283 int pause_tx;
284
285 const struct ave_soc_data *data;
286};
287
288struct ave_soc_data {
289 bool is_desc_64bit;
290 const char *clock_names[AVE_MAX_CLKS];
291 const char *reset_names[AVE_MAX_RSTS];
292 int (*get_pinmode)(struct ave_private *priv,
293 phy_interface_t phy_mode, u32 arg);
294};
295
296static u32 ave_desc_read(struct net_device *ndev, enum desc_id id, int entry,
297 int offset)
298{
299 struct ave_private *priv = netdev_priv(ndev);
300 u32 addr;
301
302 addr = ((id == AVE_DESCID_TX) ? priv->tx.daddr : priv->rx.daddr)
303 + entry * priv->desc_size + offset;
304
305 return readl(priv->base + addr);
306}
307
308static u32 ave_desc_read_cmdsts(struct net_device *ndev, enum desc_id id,
309 int entry)
310{
311 return ave_desc_read(ndev, id, entry, AVE_DESC_OFS_CMDSTS);
312}
313
314static void ave_desc_write(struct net_device *ndev, enum desc_id id,
315 int entry, int offset, u32 val)
316{
317 struct ave_private *priv = netdev_priv(ndev);
318 u32 addr;
319
320 addr = ((id == AVE_DESCID_TX) ? priv->tx.daddr : priv->rx.daddr)
321 + entry * priv->desc_size + offset;
322
323 writel(val, priv->base + addr);
324}
325
326static void ave_desc_write_cmdsts(struct net_device *ndev, enum desc_id id,
327 int entry, u32 val)
328{
329 ave_desc_write(ndev, id, entry, AVE_DESC_OFS_CMDSTS, val);
330}
331
332static void ave_desc_write_addr(struct net_device *ndev, enum desc_id id,
333 int entry, dma_addr_t paddr)
334{
335 struct ave_private *priv = netdev_priv(ndev);
336
337 ave_desc_write(ndev, id, entry, AVE_DESC_OFS_ADDRL,
338 lower_32_bits(paddr));
339 if (IS_DESC_64BIT(priv))
340 ave_desc_write(ndev, id,
341 entry, AVE_DESC_OFS_ADDRU,
342 upper_32_bits(paddr));
343}
344
345static u32 ave_irq_disable_all(struct net_device *ndev)
346{
347 struct ave_private *priv = netdev_priv(ndev);
348 u32 ret;
349
350 ret = readl(priv->base + AVE_GIMR);
351 writel(0, priv->base + AVE_GIMR);
352
353 return ret;
354}
355
356static void ave_irq_restore(struct net_device *ndev, u32 val)
357{
358 struct ave_private *priv = netdev_priv(ndev);
359
360 writel(val, priv->base + AVE_GIMR);
361}
362
363static void ave_irq_enable(struct net_device *ndev, u32 bitflag)
364{
365 struct ave_private *priv = netdev_priv(ndev);
366
367 writel(readl(priv->base + AVE_GIMR) | bitflag, priv->base + AVE_GIMR);
368 writel(bitflag, priv->base + AVE_GISR);
369}
370
371static void ave_hw_write_macaddr(struct net_device *ndev,
372 const unsigned char *mac_addr,
373 int reg1, int reg2)
374{
375 struct ave_private *priv = netdev_priv(ndev);
376
377 writel(mac_addr[0] | mac_addr[1] << 8 |
378 mac_addr[2] << 16 | mac_addr[3] << 24, priv->base + reg1);
379 writel(mac_addr[4] | mac_addr[5] << 8, priv->base + reg2);
380}
381
382static void ave_hw_read_version(struct net_device *ndev, char *buf, int len)
383{
384 struct ave_private *priv = netdev_priv(ndev);
385 u32 major, minor, vr;
386
387 vr = readl(priv->base + AVE_VR);
388 major = (vr & GENMASK(15, 8)) >> 8;
389 minor = (vr & GENMASK(7, 0));
390 snprintf(buf, len, "v%u.%u", major, minor);
391}
392
393static void ave_ethtool_get_drvinfo(struct net_device *ndev,
394 struct ethtool_drvinfo *info)
395{
396 struct device *dev = ndev->dev.parent;
397
398 strlcpy(info->driver, dev->driver->name, sizeof(info->driver));
399 strlcpy(info->bus_info, dev_name(dev), sizeof(info->bus_info));
400 ave_hw_read_version(ndev, info->fw_version, sizeof(info->fw_version));
401}
402
403static u32 ave_ethtool_get_msglevel(struct net_device *ndev)
404{
405 struct ave_private *priv = netdev_priv(ndev);
406
407 return priv->msg_enable;
408}
409
410static void ave_ethtool_set_msglevel(struct net_device *ndev, u32 val)
411{
412 struct ave_private *priv = netdev_priv(ndev);
413
414 priv->msg_enable = val;
415}
416
417static void ave_ethtool_get_wol(struct net_device *ndev,
418 struct ethtool_wolinfo *wol)
419{
420 wol->supported = 0;
421 wol->wolopts = 0;
422
423 if (ndev->phydev)
424 phy_ethtool_get_wol(ndev->phydev, wol);
425}
426
427static int ave_ethtool_set_wol(struct net_device *ndev,
428 struct ethtool_wolinfo *wol)
429{
430 int ret;
431
432 if (!ndev->phydev ||
433 (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE)))
434 return -EOPNOTSUPP;
435
436 ret = phy_ethtool_set_wol(ndev->phydev, wol);
437 if (!ret)
438 device_set_wakeup_enable(&ndev->dev, !!wol->wolopts);
439
440 return ret;
441}
442
443static void ave_ethtool_get_pauseparam(struct net_device *ndev,
444 struct ethtool_pauseparam *pause)
445{
446 struct ave_private *priv = netdev_priv(ndev);
447
448 pause->autoneg = priv->pause_auto;
449 pause->rx_pause = priv->pause_rx;
450 pause->tx_pause = priv->pause_tx;
451}
452
453static int ave_ethtool_set_pauseparam(struct net_device *ndev,
454 struct ethtool_pauseparam *pause)
455{
456 struct ave_private *priv = netdev_priv(ndev);
457 struct phy_device *phydev = ndev->phydev;
458
459 if (!phydev)
460 return -EINVAL;
461
462 priv->pause_auto = pause->autoneg;
463 priv->pause_rx = pause->rx_pause;
464 priv->pause_tx = pause->tx_pause;
465
466 phy_set_asym_pause(phydev, pause->rx_pause, pause->tx_pause);
467
468 return 0;
469}
470
471static const struct ethtool_ops ave_ethtool_ops = {
472 .get_link_ksettings = phy_ethtool_get_link_ksettings,
473 .set_link_ksettings = phy_ethtool_set_link_ksettings,
474 .get_drvinfo = ave_ethtool_get_drvinfo,
475 .nway_reset = phy_ethtool_nway_reset,
476 .get_link = ethtool_op_get_link,
477 .get_msglevel = ave_ethtool_get_msglevel,
478 .set_msglevel = ave_ethtool_set_msglevel,
479 .get_wol = ave_ethtool_get_wol,
480 .set_wol = ave_ethtool_set_wol,
481 .get_pauseparam = ave_ethtool_get_pauseparam,
482 .set_pauseparam = ave_ethtool_set_pauseparam,
483};
484
485static int ave_mdiobus_read(struct mii_bus *bus, int phyid, int regnum)
486{
487 struct net_device *ndev = bus->priv;
488 struct ave_private *priv;
489 u32 mdioctl, mdiosr;
490 int ret;
491
492 priv = netdev_priv(ndev);
493
494
495 writel((phyid << 8) | regnum, priv->base + AVE_MDIOAR);
496
497
498 mdioctl = readl(priv->base + AVE_MDIOCTR);
499 writel((mdioctl | AVE_MDIOCTR_RREQ) & ~AVE_MDIOCTR_WREQ,
500 priv->base + AVE_MDIOCTR);
501
502 ret = readl_poll_timeout(priv->base + AVE_MDIOSR, mdiosr,
503 !(mdiosr & AVE_MDIOSR_STS), 20, 2000);
504 if (ret) {
505 netdev_err(ndev, "failed to read (phy:%d reg:%x)\n",
506 phyid, regnum);
507 return ret;
508 }
509
510 return readl(priv->base + AVE_MDIORDR) & GENMASK(15, 0);
511}
512
513static int ave_mdiobus_write(struct mii_bus *bus, int phyid, int regnum,
514 u16 val)
515{
516 struct net_device *ndev = bus->priv;
517 struct ave_private *priv;
518 u32 mdioctl, mdiosr;
519 int ret;
520
521 priv = netdev_priv(ndev);
522
523
524 writel((phyid << 8) | regnum, priv->base + AVE_MDIOAR);
525
526
527 writel(val, priv->base + AVE_MDIOWDR);
528
529
530 mdioctl = readl(priv->base + AVE_MDIOCTR);
531 writel((mdioctl | AVE_MDIOCTR_WREQ) & ~AVE_MDIOCTR_RREQ,
532 priv->base + AVE_MDIOCTR);
533
534 ret = readl_poll_timeout(priv->base + AVE_MDIOSR, mdiosr,
535 !(mdiosr & AVE_MDIOSR_STS), 20, 2000);
536 if (ret)
537 netdev_err(ndev, "failed to write (phy:%d reg:%x)\n",
538 phyid, regnum);
539
540 return ret;
541}
542
543static int ave_dma_map(struct net_device *ndev, struct ave_desc *desc,
544 void *ptr, size_t len, enum dma_data_direction dir,
545 dma_addr_t *paddr)
546{
547 dma_addr_t map_addr;
548
549 map_addr = dma_map_single(ndev->dev.parent, ptr, len, dir);
550 if (unlikely(dma_mapping_error(ndev->dev.parent, map_addr)))
551 return -ENOMEM;
552
553 desc->skbs_dma = map_addr;
554 desc->skbs_dmalen = len;
555 *paddr = map_addr;
556
557 return 0;
558}
559
560static void ave_dma_unmap(struct net_device *ndev, struct ave_desc *desc,
561 enum dma_data_direction dir)
562{
563 if (!desc->skbs_dma)
564 return;
565
566 dma_unmap_single(ndev->dev.parent,
567 desc->skbs_dma, desc->skbs_dmalen, dir);
568 desc->skbs_dma = 0;
569}
570
571
572static int ave_rxdesc_prepare(struct net_device *ndev, int entry)
573{
574 struct ave_private *priv = netdev_priv(ndev);
575 struct sk_buff *skb;
576 dma_addr_t paddr;
577 int ret;
578
579 skb = priv->rx.desc[entry].skbs;
580 if (!skb) {
581 skb = netdev_alloc_skb(ndev, AVE_MAX_ETHFRAME);
582 if (!skb) {
583 netdev_err(ndev, "can't allocate skb for Rx\n");
584 return -ENOMEM;
585 }
586 skb->data += AVE_FRAME_HEADROOM;
587 skb->tail += AVE_FRAME_HEADROOM;
588 }
589
590
591 ave_desc_write_cmdsts(ndev, AVE_DESCID_RX, entry,
592 AVE_STS_INTR | AVE_STS_OWN);
593
594
595
596
597
598
599
600
601
602
603 ret = ave_dma_map(ndev, &priv->rx.desc[entry],
604 skb->data - AVE_FRAME_HEADROOM,
605 AVE_MAX_ETHFRAME + AVE_FRAME_HEADROOM,
606 DMA_FROM_DEVICE, &paddr);
607 if (ret) {
608 netdev_err(ndev, "can't map skb for Rx\n");
609 dev_kfree_skb_any(skb);
610 return ret;
611 }
612 priv->rx.desc[entry].skbs = skb;
613
614
615 ave_desc_write_addr(ndev, AVE_DESCID_RX, entry, paddr);
616
617
618 ave_desc_write_cmdsts(ndev, AVE_DESCID_RX, entry,
619 AVE_STS_INTR | AVE_MAX_ETHFRAME);
620
621 return ret;
622}
623
624
625static int ave_desc_switch(struct net_device *ndev, enum desc_state state)
626{
627 struct ave_private *priv = netdev_priv(ndev);
628 int ret = 0;
629 u32 val;
630
631 switch (state) {
632 case AVE_DESC_START:
633 writel(AVE_DESCC_TD | AVE_DESCC_RD0, priv->base + AVE_DESCC);
634 break;
635
636 case AVE_DESC_STOP:
637 writel(0, priv->base + AVE_DESCC);
638 if (readl_poll_timeout(priv->base + AVE_DESCC, val, !val,
639 150, 15000)) {
640 netdev_err(ndev, "can't stop descriptor\n");
641 ret = -EBUSY;
642 }
643 break;
644
645 case AVE_DESC_RX_SUSPEND:
646 val = readl(priv->base + AVE_DESCC);
647 val |= AVE_DESCC_RDSTP;
648 val &= ~AVE_DESCC_STATUS_MASK;
649 writel(val, priv->base + AVE_DESCC);
650 if (readl_poll_timeout(priv->base + AVE_DESCC, val,
651 val & (AVE_DESCC_RDSTP << 16),
652 150, 150000)) {
653 netdev_err(ndev, "can't suspend descriptor\n");
654 ret = -EBUSY;
655 }
656 break;
657
658 case AVE_DESC_RX_PERMIT:
659 val = readl(priv->base + AVE_DESCC);
660 val &= ~AVE_DESCC_RDSTP;
661 val &= ~AVE_DESCC_STATUS_MASK;
662 writel(val, priv->base + AVE_DESCC);
663 break;
664
665 default:
666 ret = -EINVAL;
667 break;
668 }
669
670 return ret;
671}
672
673static int ave_tx_complete(struct net_device *ndev)
674{
675 struct ave_private *priv = netdev_priv(ndev);
676 u32 proc_idx, done_idx, ndesc, cmdsts;
677 unsigned int nr_freebuf = 0;
678 unsigned int tx_packets = 0;
679 unsigned int tx_bytes = 0;
680
681 proc_idx = priv->tx.proc_idx;
682 done_idx = priv->tx.done_idx;
683 ndesc = priv->tx.ndesc;
684
685
686 while (proc_idx != done_idx) {
687 cmdsts = ave_desc_read_cmdsts(ndev, AVE_DESCID_TX, done_idx);
688
689
690 if (cmdsts & AVE_STS_OWN)
691 break;
692
693
694 if (cmdsts & AVE_STS_OK) {
695 tx_bytes += cmdsts & AVE_STS_PKTLEN_TX_MASK;
696
697 if (cmdsts & AVE_STS_LAST)
698 tx_packets++;
699 } else {
700
701 if (cmdsts & AVE_STS_LAST) {
702 priv->stats_tx.errors++;
703 if (cmdsts & (AVE_STS_OWC | AVE_STS_EC))
704 priv->stats_tx.collisions++;
705 }
706 }
707
708
709 if (priv->tx.desc[done_idx].skbs) {
710 ave_dma_unmap(ndev, &priv->tx.desc[done_idx],
711 DMA_TO_DEVICE);
712 dev_consume_skb_any(priv->tx.desc[done_idx].skbs);
713 priv->tx.desc[done_idx].skbs = NULL;
714 nr_freebuf++;
715 }
716 done_idx = (done_idx + 1) % ndesc;
717 }
718
719 priv->tx.done_idx = done_idx;
720
721
722 u64_stats_update_begin(&priv->stats_tx.syncp);
723 priv->stats_tx.packets += tx_packets;
724 priv->stats_tx.bytes += tx_bytes;
725 u64_stats_update_end(&priv->stats_tx.syncp);
726
727
728 if (unlikely(netif_queue_stopped(ndev)) && nr_freebuf)
729 netif_wake_queue(ndev);
730
731 return nr_freebuf;
732}
733
734static int ave_rx_receive(struct net_device *ndev, int num)
735{
736 struct ave_private *priv = netdev_priv(ndev);
737 unsigned int rx_packets = 0;
738 unsigned int rx_bytes = 0;
739 u32 proc_idx, done_idx;
740 struct sk_buff *skb;
741 unsigned int pktlen;
742 int restpkt, npkts;
743 u32 ndesc, cmdsts;
744
745 proc_idx = priv->rx.proc_idx;
746 done_idx = priv->rx.done_idx;
747 ndesc = priv->rx.ndesc;
748 restpkt = ((proc_idx + ndesc - 1) - done_idx) % ndesc;
749
750 for (npkts = 0; npkts < num; npkts++) {
751
752 if (--restpkt < 0)
753 break;
754
755 cmdsts = ave_desc_read_cmdsts(ndev, AVE_DESCID_RX, proc_idx);
756
757
758 if (!(cmdsts & AVE_STS_OWN))
759 break;
760
761 if (!(cmdsts & AVE_STS_OK)) {
762 priv->stats_rx.errors++;
763 proc_idx = (proc_idx + 1) % ndesc;
764 continue;
765 }
766
767 pktlen = cmdsts & AVE_STS_PKTLEN_RX_MASK;
768
769
770 skb = priv->rx.desc[proc_idx].skbs;
771 priv->rx.desc[proc_idx].skbs = NULL;
772
773 ave_dma_unmap(ndev, &priv->rx.desc[proc_idx], DMA_FROM_DEVICE);
774
775 skb->dev = ndev;
776 skb_put(skb, pktlen);
777 skb->protocol = eth_type_trans(skb, ndev);
778
779 if ((cmdsts & AVE_STS_CSSV) && (!(cmdsts & AVE_STS_CSER)))
780 skb->ip_summed = CHECKSUM_UNNECESSARY;
781
782 rx_packets++;
783 rx_bytes += pktlen;
784
785 netif_receive_skb(skb);
786
787 proc_idx = (proc_idx + 1) % ndesc;
788 }
789
790 priv->rx.proc_idx = proc_idx;
791
792
793 u64_stats_update_begin(&priv->stats_rx.syncp);
794 priv->stats_rx.packets += rx_packets;
795 priv->stats_rx.bytes += rx_bytes;
796 u64_stats_update_end(&priv->stats_rx.syncp);
797
798
799 while (proc_idx != done_idx) {
800 if (ave_rxdesc_prepare(ndev, done_idx))
801 break;
802 done_idx = (done_idx + 1) % ndesc;
803 }
804
805 priv->rx.done_idx = done_idx;
806
807 return npkts;
808}
809
810static int ave_napi_poll_rx(struct napi_struct *napi, int budget)
811{
812 struct ave_private *priv;
813 struct net_device *ndev;
814 int num;
815
816 priv = container_of(napi, struct ave_private, napi_rx);
817 ndev = priv->ndev;
818
819 num = ave_rx_receive(ndev, budget);
820 if (num < budget) {
821 napi_complete_done(napi, num);
822
823
824 ave_irq_enable(ndev, AVE_GI_RXIINT);
825 }
826
827 return num;
828}
829
830static int ave_napi_poll_tx(struct napi_struct *napi, int budget)
831{
832 struct ave_private *priv;
833 struct net_device *ndev;
834 int num;
835
836 priv = container_of(napi, struct ave_private, napi_tx);
837 ndev = priv->ndev;
838
839 num = ave_tx_complete(ndev);
840 napi_complete(napi);
841
842
843 ave_irq_enable(ndev, AVE_GI_TX);
844
845 return num;
846}
847
848static void ave_global_reset(struct net_device *ndev)
849{
850 struct ave_private *priv = netdev_priv(ndev);
851 u32 val;
852
853
854 val = AVE_CFGR_FLE | AVE_CFGR_IPFCEN | AVE_CFGR_CHE;
855 if (!phy_interface_mode_is_rgmii(priv->phy_mode))
856 val |= AVE_CFGR_MII;
857 writel(val, priv->base + AVE_CFGR);
858
859
860 val = readl(priv->base + AVE_RSTCTRL);
861 val &= ~AVE_RSTCTRL_RMIIRST;
862 writel(val, priv->base + AVE_RSTCTRL);
863
864
865 writel(AVE_GRR_GRST | AVE_GRR_PHYRST, priv->base + AVE_GRR);
866 msleep(20);
867
868
869 writel(AVE_GRR_GRST, priv->base + AVE_GRR);
870 msleep(40);
871
872
873 writel(0, priv->base + AVE_GRR);
874 msleep(40);
875
876
877 val = readl(priv->base + AVE_RSTCTRL);
878 val |= AVE_RSTCTRL_RMIIRST;
879 writel(val, priv->base + AVE_RSTCTRL);
880
881 ave_irq_disable_all(ndev);
882}
883
884static void ave_rxfifo_reset(struct net_device *ndev)
885{
886 struct ave_private *priv = netdev_priv(ndev);
887 u32 rxcr_org;
888
889
890 rxcr_org = readl(priv->base + AVE_RXCR);
891 writel(rxcr_org & (~AVE_RXCR_RXEN), priv->base + AVE_RXCR);
892
893
894 ave_desc_switch(ndev, AVE_DESC_RX_SUSPEND);
895
896
897 ave_rx_receive(ndev, priv->rx.ndesc);
898
899
900 writel(AVE_GRR_RXFFR, priv->base + AVE_GRR);
901 udelay(50);
902
903
904 writel(0, priv->base + AVE_GRR);
905 udelay(20);
906
907
908 writel(AVE_GI_RXOVF, priv->base + AVE_GISR);
909
910
911 ave_desc_switch(ndev, AVE_DESC_RX_PERMIT);
912
913
914 writel(rxcr_org, priv->base + AVE_RXCR);
915}
916
917static irqreturn_t ave_irq_handler(int irq, void *netdev)
918{
919 struct net_device *ndev = (struct net_device *)netdev;
920 struct ave_private *priv = netdev_priv(ndev);
921 u32 gimr_val, gisr_val;
922
923 gimr_val = ave_irq_disable_all(ndev);
924
925
926 gisr_val = readl(priv->base + AVE_GISR);
927
928
929 if (gisr_val & AVE_GI_PHY)
930 writel(AVE_GI_PHY, priv->base + AVE_GISR);
931
932
933 if (gisr_val & AVE_GI_RXERR) {
934 writel(AVE_GI_RXERR, priv->base + AVE_GISR);
935 netdev_err(ndev, "receive a packet exceeding frame buffer\n");
936 }
937
938 gisr_val &= gimr_val;
939 if (!gisr_val)
940 goto exit_isr;
941
942
943 if (gisr_val & AVE_GI_RXOVF) {
944 priv->stats_rx.fifo_errors++;
945 ave_rxfifo_reset(ndev);
946 goto exit_isr;
947 }
948
949
950 if (gisr_val & AVE_GI_RXDROP) {
951 priv->stats_rx.dropped++;
952 writel(AVE_GI_RXDROP, priv->base + AVE_GISR);
953 }
954
955
956 if (gisr_val & AVE_GI_RXIINT) {
957 napi_schedule(&priv->napi_rx);
958
959 gimr_val &= ~AVE_GI_RXIINT;
960 }
961
962
963 if (gisr_val & AVE_GI_TX) {
964 napi_schedule(&priv->napi_tx);
965
966 gimr_val &= ~AVE_GI_TX;
967 }
968
969exit_isr:
970 ave_irq_restore(ndev, gimr_val);
971
972 return IRQ_HANDLED;
973}
974
975static int ave_pfsel_start(struct net_device *ndev, unsigned int entry)
976{
977 struct ave_private *priv = netdev_priv(ndev);
978 u32 val;
979
980 if (WARN_ON(entry > AVE_PF_SIZE))
981 return -EINVAL;
982
983 val = readl(priv->base + AVE_PFEN);
984 writel(val | BIT(entry), priv->base + AVE_PFEN);
985
986 return 0;
987}
988
989static int ave_pfsel_stop(struct net_device *ndev, unsigned int entry)
990{
991 struct ave_private *priv = netdev_priv(ndev);
992 u32 val;
993
994 if (WARN_ON(entry > AVE_PF_SIZE))
995 return -EINVAL;
996
997 val = readl(priv->base + AVE_PFEN);
998 writel(val & ~BIT(entry), priv->base + AVE_PFEN);
999
1000 return 0;
1001}
1002
1003static int ave_pfsel_set_macaddr(struct net_device *ndev,
1004 unsigned int entry,
1005 const unsigned char *mac_addr,
1006 unsigned int set_size)
1007{
1008 struct ave_private *priv = netdev_priv(ndev);
1009
1010 if (WARN_ON(entry > AVE_PF_SIZE))
1011 return -EINVAL;
1012 if (WARN_ON(set_size > 6))
1013 return -EINVAL;
1014
1015 ave_pfsel_stop(ndev, entry);
1016
1017
1018 ave_hw_write_macaddr(ndev, mac_addr,
1019 AVE_PKTF(entry), AVE_PKTF(entry) + 4);
1020
1021
1022 writel(GENMASK(31, set_size) & AVE_PFMBYTE_MASK0,
1023 priv->base + AVE_PFMBYTE(entry));
1024 writel(AVE_PFMBYTE_MASK1, priv->base + AVE_PFMBYTE(entry) + 4);
1025
1026
1027 writel(AVE_PFMBIT_MASK, priv->base + AVE_PFMBIT(entry));
1028
1029
1030 writel(0, priv->base + AVE_PFSEL(entry));
1031
1032
1033 ave_pfsel_start(ndev, entry);
1034
1035 return 0;
1036}
1037
1038static void ave_pfsel_set_promisc(struct net_device *ndev,
1039 unsigned int entry, u32 rxring)
1040{
1041 struct ave_private *priv = netdev_priv(ndev);
1042
1043 if (WARN_ON(entry > AVE_PF_SIZE))
1044 return;
1045
1046 ave_pfsel_stop(ndev, entry);
1047
1048
1049 writel(AVE_PFMBYTE_MASK0, priv->base + AVE_PFMBYTE(entry));
1050 writel(AVE_PFMBYTE_MASK1, priv->base + AVE_PFMBYTE(entry) + 4);
1051
1052
1053 writel(AVE_PFMBIT_MASK, priv->base + AVE_PFMBIT(entry));
1054
1055
1056 writel(rxring, priv->base + AVE_PFSEL(entry));
1057
1058 ave_pfsel_start(ndev, entry);
1059}
1060
1061static void ave_pfsel_init(struct net_device *ndev)
1062{
1063 unsigned char bcast_mac[ETH_ALEN];
1064 int i;
1065
1066 eth_broadcast_addr(bcast_mac);
1067
1068 for (i = 0; i < AVE_PF_SIZE; i++)
1069 ave_pfsel_stop(ndev, i);
1070
1071
1072 ave_pfsel_set_promisc(ndev, AVE_PFNUM_FILTER, 0);
1073
1074
1075 ave_pfsel_set_macaddr(ndev, AVE_PFNUM_UNICAST, ndev->dev_addr, 6);
1076
1077
1078 ave_pfsel_set_macaddr(ndev, AVE_PFNUM_BROADCAST, bcast_mac, 6);
1079}
1080
1081static void ave_phy_adjust_link(struct net_device *ndev)
1082{
1083 struct ave_private *priv = netdev_priv(ndev);
1084 struct phy_device *phydev = ndev->phydev;
1085 u32 val, txcr, rxcr, rxcr_org;
1086 u16 rmt_adv = 0, lcl_adv = 0;
1087 u8 cap;
1088
1089
1090 val = readl(priv->base + AVE_TXCR);
1091 val &= ~(AVE_TXCR_TXSPD_100 | AVE_TXCR_TXSPD_1G);
1092
1093 if (phy_interface_is_rgmii(phydev) && phydev->speed == SPEED_1000)
1094 val |= AVE_TXCR_TXSPD_1G;
1095 else if (phydev->speed == SPEED_100)
1096 val |= AVE_TXCR_TXSPD_100;
1097
1098 writel(val, priv->base + AVE_TXCR);
1099
1100
1101 if (!phy_interface_is_rgmii(phydev)) {
1102 val = readl(priv->base + AVE_LINKSEL);
1103 if (phydev->speed == SPEED_10)
1104 val &= ~AVE_LINKSEL_100M;
1105 else
1106 val |= AVE_LINKSEL_100M;
1107 writel(val, priv->base + AVE_LINKSEL);
1108 }
1109
1110
1111 rxcr = readl(priv->base + AVE_RXCR);
1112 txcr = readl(priv->base + AVE_TXCR);
1113 rxcr_org = rxcr;
1114
1115 if (phydev->duplex) {
1116 rxcr |= AVE_RXCR_FDUPEN;
1117
1118 if (phydev->pause)
1119 rmt_adv |= LPA_PAUSE_CAP;
1120 if (phydev->asym_pause)
1121 rmt_adv |= LPA_PAUSE_ASYM;
1122
1123 lcl_adv = linkmode_adv_to_lcl_adv_t(phydev->advertising);
1124 cap = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
1125 if (cap & FLOW_CTRL_TX)
1126 txcr |= AVE_TXCR_FLOCTR;
1127 else
1128 txcr &= ~AVE_TXCR_FLOCTR;
1129 if (cap & FLOW_CTRL_RX)
1130 rxcr |= AVE_RXCR_FLOCTR;
1131 else
1132 rxcr &= ~AVE_RXCR_FLOCTR;
1133 } else {
1134 rxcr &= ~AVE_RXCR_FDUPEN;
1135 rxcr &= ~AVE_RXCR_FLOCTR;
1136 txcr &= ~AVE_TXCR_FLOCTR;
1137 }
1138
1139 if (rxcr_org != rxcr) {
1140
1141 writel(rxcr & ~AVE_RXCR_RXEN, priv->base + AVE_RXCR);
1142
1143 writel(txcr, priv->base + AVE_TXCR);
1144 writel(rxcr, priv->base + AVE_RXCR);
1145 }
1146
1147 phy_print_status(phydev);
1148}
1149
1150static void ave_macaddr_init(struct net_device *ndev)
1151{
1152 ave_hw_write_macaddr(ndev, ndev->dev_addr, AVE_RXMAC1R, AVE_RXMAC2R);
1153
1154
1155 ave_pfsel_set_macaddr(ndev, AVE_PFNUM_UNICAST, ndev->dev_addr, 6);
1156}
1157
1158static int ave_init(struct net_device *ndev)
1159{
1160 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
1161 struct ave_private *priv = netdev_priv(ndev);
1162 struct device *dev = ndev->dev.parent;
1163 struct device_node *np = dev->of_node;
1164 struct device_node *mdio_np;
1165 struct phy_device *phydev;
1166 int nc, nr, ret;
1167
1168
1169 for (nc = 0; nc < priv->nclks; nc++) {
1170 ret = clk_prepare_enable(priv->clk[nc]);
1171 if (ret) {
1172 dev_err(dev, "can't enable clock\n");
1173 goto out_clk_disable;
1174 }
1175 }
1176
1177 for (nr = 0; nr < priv->nrsts; nr++) {
1178 ret = reset_control_deassert(priv->rst[nr]);
1179 if (ret) {
1180 dev_err(dev, "can't deassert reset\n");
1181 goto out_reset_assert;
1182 }
1183 }
1184
1185 ret = regmap_update_bits(priv->regmap, SG_ETPINMODE,
1186 priv->pinmode_mask, priv->pinmode_val);
1187 if (ret)
1188 return ret;
1189
1190 ave_global_reset(ndev);
1191
1192 mdio_np = of_get_child_by_name(np, "mdio");
1193 if (!mdio_np) {
1194 dev_err(dev, "mdio node not found\n");
1195 ret = -EINVAL;
1196 goto out_reset_assert;
1197 }
1198 ret = of_mdiobus_register(priv->mdio, mdio_np);
1199 of_node_put(mdio_np);
1200 if (ret) {
1201 dev_err(dev, "failed to register mdiobus\n");
1202 goto out_reset_assert;
1203 }
1204
1205 phydev = of_phy_get_and_connect(ndev, np, ave_phy_adjust_link);
1206 if (!phydev) {
1207 dev_err(dev, "could not attach to PHY\n");
1208 ret = -ENODEV;
1209 goto out_mdio_unregister;
1210 }
1211
1212 priv->phydev = phydev;
1213
1214 ave_ethtool_get_wol(ndev, &wol);
1215 device_set_wakeup_capable(&ndev->dev, !!wol.supported);
1216
1217
1218 wol.wolopts = 0;
1219 ave_ethtool_set_wol(ndev, &wol);
1220
1221 if (!phy_interface_is_rgmii(phydev))
1222 phy_set_max_speed(phydev, SPEED_100);
1223
1224 phy_support_asym_pause(phydev);
1225
1226 phy_attached_info(phydev);
1227
1228 return 0;
1229
1230out_mdio_unregister:
1231 mdiobus_unregister(priv->mdio);
1232out_reset_assert:
1233 while (--nr >= 0)
1234 reset_control_assert(priv->rst[nr]);
1235out_clk_disable:
1236 while (--nc >= 0)
1237 clk_disable_unprepare(priv->clk[nc]);
1238
1239 return ret;
1240}
1241
1242static void ave_uninit(struct net_device *ndev)
1243{
1244 struct ave_private *priv = netdev_priv(ndev);
1245 int i;
1246
1247 phy_disconnect(priv->phydev);
1248 mdiobus_unregister(priv->mdio);
1249
1250
1251 for (i = 0; i < priv->nrsts; i++)
1252 reset_control_assert(priv->rst[i]);
1253 for (i = 0; i < priv->nclks; i++)
1254 clk_disable_unprepare(priv->clk[i]);
1255}
1256
1257static int ave_open(struct net_device *ndev)
1258{
1259 struct ave_private *priv = netdev_priv(ndev);
1260 int entry;
1261 int ret;
1262 u32 val;
1263
1264 ret = request_irq(priv->irq, ave_irq_handler, IRQF_SHARED, ndev->name,
1265 ndev);
1266 if (ret)
1267 return ret;
1268
1269 priv->tx.desc = kcalloc(priv->tx.ndesc, sizeof(*priv->tx.desc),
1270 GFP_KERNEL);
1271 if (!priv->tx.desc) {
1272 ret = -ENOMEM;
1273 goto out_free_irq;
1274 }
1275
1276 priv->rx.desc = kcalloc(priv->rx.ndesc, sizeof(*priv->rx.desc),
1277 GFP_KERNEL);
1278 if (!priv->rx.desc) {
1279 kfree(priv->tx.desc);
1280 ret = -ENOMEM;
1281 goto out_free_irq;
1282 }
1283
1284
1285 priv->tx.proc_idx = 0;
1286 priv->tx.done_idx = 0;
1287 for (entry = 0; entry < priv->tx.ndesc; entry++) {
1288 ave_desc_write_cmdsts(ndev, AVE_DESCID_TX, entry, 0);
1289 ave_desc_write_addr(ndev, AVE_DESCID_TX, entry, 0);
1290 }
1291 writel(AVE_TXDC_ADDR_START |
1292 (((priv->tx.ndesc * priv->desc_size) << 16) & AVE_TXDC_SIZE),
1293 priv->base + AVE_TXDC);
1294
1295
1296 priv->rx.proc_idx = 0;
1297 priv->rx.done_idx = 0;
1298 for (entry = 0; entry < priv->rx.ndesc; entry++) {
1299 if (ave_rxdesc_prepare(ndev, entry))
1300 break;
1301 }
1302 writel(AVE_RXDC0_ADDR_START |
1303 (((priv->rx.ndesc * priv->desc_size) << 16) & AVE_RXDC0_SIZE),
1304 priv->base + AVE_RXDC0);
1305
1306 ave_desc_switch(ndev, AVE_DESC_START);
1307
1308 ave_pfsel_init(ndev);
1309 ave_macaddr_init(ndev);
1310
1311
1312
1313 val = AVE_RXCR_RXEN | AVE_RXCR_FDUPEN | AVE_RXCR_DRPEN |
1314 AVE_RXCR_FLOCTR | (AVE_MAX_ETHFRAME & AVE_RXCR_MPSIZ_MASK);
1315 writel(val, priv->base + AVE_RXCR);
1316
1317
1318
1319 writel(AVE_TXCR_FLOCTR, priv->base + AVE_TXCR);
1320
1321
1322 val = readl(priv->base + AVE_IIRQC) & AVE_IIRQC_BSCK;
1323 val |= AVE_IIRQC_EN0 | (AVE_INTM_COUNT << 16);
1324 writel(val, priv->base + AVE_IIRQC);
1325
1326 val = AVE_GI_RXIINT | AVE_GI_RXOVF | AVE_GI_TX | AVE_GI_RXDROP;
1327 ave_irq_restore(ndev, val);
1328
1329 napi_enable(&priv->napi_rx);
1330 napi_enable(&priv->napi_tx);
1331
1332 phy_start(ndev->phydev);
1333 phy_start_aneg(ndev->phydev);
1334 netif_start_queue(ndev);
1335
1336 return 0;
1337
1338out_free_irq:
1339 disable_irq(priv->irq);
1340 free_irq(priv->irq, ndev);
1341
1342 return ret;
1343}
1344
1345static int ave_stop(struct net_device *ndev)
1346{
1347 struct ave_private *priv = netdev_priv(ndev);
1348 int entry;
1349
1350 ave_irq_disable_all(ndev);
1351 disable_irq(priv->irq);
1352 free_irq(priv->irq, ndev);
1353
1354 netif_tx_disable(ndev);
1355 phy_stop(ndev->phydev);
1356 napi_disable(&priv->napi_tx);
1357 napi_disable(&priv->napi_rx);
1358
1359 ave_desc_switch(ndev, AVE_DESC_STOP);
1360
1361
1362 for (entry = 0; entry < priv->tx.ndesc; entry++) {
1363 if (!priv->tx.desc[entry].skbs)
1364 continue;
1365
1366 ave_dma_unmap(ndev, &priv->tx.desc[entry], DMA_TO_DEVICE);
1367 dev_kfree_skb_any(priv->tx.desc[entry].skbs);
1368 priv->tx.desc[entry].skbs = NULL;
1369 }
1370 priv->tx.proc_idx = 0;
1371 priv->tx.done_idx = 0;
1372
1373
1374 for (entry = 0; entry < priv->rx.ndesc; entry++) {
1375 if (!priv->rx.desc[entry].skbs)
1376 continue;
1377
1378 ave_dma_unmap(ndev, &priv->rx.desc[entry], DMA_FROM_DEVICE);
1379 dev_kfree_skb_any(priv->rx.desc[entry].skbs);
1380 priv->rx.desc[entry].skbs = NULL;
1381 }
1382 priv->rx.proc_idx = 0;
1383 priv->rx.done_idx = 0;
1384
1385 kfree(priv->tx.desc);
1386 kfree(priv->rx.desc);
1387
1388 return 0;
1389}
1390
1391static int ave_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1392{
1393 struct ave_private *priv = netdev_priv(ndev);
1394 u32 proc_idx, done_idx, ndesc, cmdsts;
1395 int ret, freepkt;
1396 dma_addr_t paddr;
1397
1398 proc_idx = priv->tx.proc_idx;
1399 done_idx = priv->tx.done_idx;
1400 ndesc = priv->tx.ndesc;
1401 freepkt = ((done_idx + ndesc - 1) - proc_idx) % ndesc;
1402
1403
1404 if (unlikely(freepkt < 1)) {
1405 netif_stop_queue(ndev);
1406 return NETDEV_TX_BUSY;
1407 }
1408
1409
1410 if (skb_put_padto(skb, ETH_ZLEN)) {
1411 priv->stats_tx.dropped++;
1412 return NETDEV_TX_OK;
1413 }
1414
1415
1416
1417
1418 ret = ave_dma_map(ndev, &priv->tx.desc[proc_idx],
1419 skb->data, skb->len, DMA_TO_DEVICE, &paddr);
1420 if (ret) {
1421 dev_kfree_skb_any(skb);
1422 priv->stats_tx.dropped++;
1423 return NETDEV_TX_OK;
1424 }
1425
1426 priv->tx.desc[proc_idx].skbs = skb;
1427
1428 ave_desc_write_addr(ndev, AVE_DESCID_TX, proc_idx, paddr);
1429
1430 cmdsts = AVE_STS_OWN | AVE_STS_1ST | AVE_STS_LAST |
1431 (skb->len & AVE_STS_PKTLEN_TX_MASK);
1432
1433
1434 if (!(proc_idx % AVE_FORCE_TXINTCNT) || netif_queue_stopped(ndev))
1435 cmdsts |= AVE_STS_INTR;
1436
1437
1438 if (skb->ip_summed == CHECKSUM_NONE ||
1439 skb->ip_summed == CHECKSUM_UNNECESSARY)
1440 cmdsts |= AVE_STS_NOCSUM;
1441
1442 ave_desc_write_cmdsts(ndev, AVE_DESCID_TX, proc_idx, cmdsts);
1443
1444 priv->tx.proc_idx = (proc_idx + 1) % ndesc;
1445
1446 return NETDEV_TX_OK;
1447}
1448
1449static int ave_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
1450{
1451 return phy_mii_ioctl(ndev->phydev, ifr, cmd);
1452}
1453
1454static const u8 v4multi_macadr[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 };
1455static const u8 v6multi_macadr[] = { 0x33, 0x00, 0x00, 0x00, 0x00, 0x00 };
1456
1457static void ave_set_rx_mode(struct net_device *ndev)
1458{
1459 struct ave_private *priv = netdev_priv(ndev);
1460 struct netdev_hw_addr *hw_adr;
1461 int count, mc_cnt;
1462 u32 val;
1463
1464
1465 mc_cnt = netdev_mc_count(ndev);
1466 val = readl(priv->base + AVE_RXCR);
1467 if (ndev->flags & IFF_PROMISC || !mc_cnt)
1468 val &= ~AVE_RXCR_AFEN;
1469 else
1470 val |= AVE_RXCR_AFEN;
1471 writel(val, priv->base + AVE_RXCR);
1472
1473
1474 if ((ndev->flags & IFF_ALLMULTI) || mc_cnt > AVE_PF_MULTICAST_SIZE) {
1475 ave_pfsel_set_macaddr(ndev, AVE_PFNUM_MULTICAST,
1476 v4multi_macadr, 1);
1477 ave_pfsel_set_macaddr(ndev, AVE_PFNUM_MULTICAST + 1,
1478 v6multi_macadr, 1);
1479 } else {
1480
1481 for (count = 0; count < AVE_PF_MULTICAST_SIZE; count++)
1482 ave_pfsel_stop(ndev, AVE_PFNUM_MULTICAST + count);
1483
1484
1485 count = 0;
1486 netdev_for_each_mc_addr(hw_adr, ndev) {
1487 if (count == mc_cnt)
1488 break;
1489 ave_pfsel_set_macaddr(ndev, AVE_PFNUM_MULTICAST + count,
1490 hw_adr->addr, 6);
1491 count++;
1492 }
1493 }
1494}
1495
1496static void ave_get_stats64(struct net_device *ndev,
1497 struct rtnl_link_stats64 *stats)
1498{
1499 struct ave_private *priv = netdev_priv(ndev);
1500 unsigned int start;
1501
1502 do {
1503 start = u64_stats_fetch_begin_irq(&priv->stats_rx.syncp);
1504 stats->rx_packets = priv->stats_rx.packets;
1505 stats->rx_bytes = priv->stats_rx.bytes;
1506 } while (u64_stats_fetch_retry_irq(&priv->stats_rx.syncp, start));
1507
1508 do {
1509 start = u64_stats_fetch_begin_irq(&priv->stats_tx.syncp);
1510 stats->tx_packets = priv->stats_tx.packets;
1511 stats->tx_bytes = priv->stats_tx.bytes;
1512 } while (u64_stats_fetch_retry_irq(&priv->stats_tx.syncp, start));
1513
1514 stats->rx_errors = priv->stats_rx.errors;
1515 stats->tx_errors = priv->stats_tx.errors;
1516 stats->rx_dropped = priv->stats_rx.dropped;
1517 stats->tx_dropped = priv->stats_tx.dropped;
1518 stats->rx_fifo_errors = priv->stats_rx.fifo_errors;
1519 stats->collisions = priv->stats_tx.collisions;
1520}
1521
1522static int ave_set_mac_address(struct net_device *ndev, void *p)
1523{
1524 int ret = eth_mac_addr(ndev, p);
1525
1526 if (ret)
1527 return ret;
1528
1529 ave_macaddr_init(ndev);
1530
1531 return 0;
1532}
1533
1534static const struct net_device_ops ave_netdev_ops = {
1535 .ndo_init = ave_init,
1536 .ndo_uninit = ave_uninit,
1537 .ndo_open = ave_open,
1538 .ndo_stop = ave_stop,
1539 .ndo_start_xmit = ave_start_xmit,
1540 .ndo_do_ioctl = ave_ioctl,
1541 .ndo_set_rx_mode = ave_set_rx_mode,
1542 .ndo_get_stats64 = ave_get_stats64,
1543 .ndo_set_mac_address = ave_set_mac_address,
1544};
1545
1546static int ave_probe(struct platform_device *pdev)
1547{
1548 const struct ave_soc_data *data;
1549 struct device *dev = &pdev->dev;
1550 char buf[ETHTOOL_FWVERS_LEN];
1551 struct of_phandle_args args;
1552 phy_interface_t phy_mode;
1553 struct ave_private *priv;
1554 struct net_device *ndev;
1555 struct device_node *np;
1556 const void *mac_addr;
1557 void __iomem *base;
1558 const char *name;
1559 int i, irq, ret;
1560 u64 dma_mask;
1561 u32 ave_id;
1562
1563 data = of_device_get_match_data(dev);
1564 if (WARN_ON(!data))
1565 return -EINVAL;
1566
1567 np = dev->of_node;
1568 phy_mode = of_get_phy_mode(np);
1569 if ((int)phy_mode < 0) {
1570 dev_err(dev, "phy-mode not found\n");
1571 return -EINVAL;
1572 }
1573
1574 irq = platform_get_irq(pdev, 0);
1575 if (irq < 0)
1576 return irq;
1577
1578 base = devm_platform_ioremap_resource(pdev, 0);
1579 if (IS_ERR(base))
1580 return PTR_ERR(base);
1581
1582 ndev = alloc_etherdev(sizeof(struct ave_private));
1583 if (!ndev) {
1584 dev_err(dev, "can't allocate ethernet device\n");
1585 return -ENOMEM;
1586 }
1587
1588 ndev->netdev_ops = &ave_netdev_ops;
1589 ndev->ethtool_ops = &ave_ethtool_ops;
1590 SET_NETDEV_DEV(ndev, dev);
1591
1592 ndev->features |= (NETIF_F_IP_CSUM | NETIF_F_RXCSUM);
1593 ndev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_RXCSUM);
1594
1595 ndev->max_mtu = AVE_MAX_ETHFRAME - (ETH_HLEN + ETH_FCS_LEN);
1596
1597 mac_addr = of_get_mac_address(np);
1598 if (!IS_ERR(mac_addr))
1599 ether_addr_copy(ndev->dev_addr, mac_addr);
1600
1601
1602 if (!is_valid_ether_addr(ndev->dev_addr)) {
1603 eth_hw_addr_random(ndev);
1604 dev_warn(dev, "Using random MAC address: %pM\n",
1605 ndev->dev_addr);
1606 }
1607
1608 priv = netdev_priv(ndev);
1609 priv->base = base;
1610 priv->irq = irq;
1611 priv->ndev = ndev;
1612 priv->msg_enable = netif_msg_init(-1, AVE_DEFAULT_MSG_ENABLE);
1613 priv->phy_mode = phy_mode;
1614 priv->data = data;
1615
1616 if (IS_DESC_64BIT(priv)) {
1617 priv->desc_size = AVE_DESC_SIZE_64;
1618 priv->tx.daddr = AVE_TXDM_64;
1619 priv->rx.daddr = AVE_RXDM_64;
1620 dma_mask = DMA_BIT_MASK(64);
1621 } else {
1622 priv->desc_size = AVE_DESC_SIZE_32;
1623 priv->tx.daddr = AVE_TXDM_32;
1624 priv->rx.daddr = AVE_RXDM_32;
1625 dma_mask = DMA_BIT_MASK(32);
1626 }
1627 ret = dma_set_mask(dev, dma_mask);
1628 if (ret)
1629 goto out_free_netdev;
1630
1631 priv->tx.ndesc = AVE_NR_TXDESC;
1632 priv->rx.ndesc = AVE_NR_RXDESC;
1633
1634 u64_stats_init(&priv->stats_tx.syncp);
1635 u64_stats_init(&priv->stats_rx.syncp);
1636
1637 for (i = 0; i < AVE_MAX_CLKS; i++) {
1638 name = priv->data->clock_names[i];
1639 if (!name)
1640 break;
1641 priv->clk[i] = devm_clk_get(dev, name);
1642 if (IS_ERR(priv->clk[i])) {
1643 ret = PTR_ERR(priv->clk[i]);
1644 goto out_free_netdev;
1645 }
1646 priv->nclks++;
1647 }
1648
1649 for (i = 0; i < AVE_MAX_RSTS; i++) {
1650 name = priv->data->reset_names[i];
1651 if (!name)
1652 break;
1653 priv->rst[i] = devm_reset_control_get_shared(dev, name);
1654 if (IS_ERR(priv->rst[i])) {
1655 ret = PTR_ERR(priv->rst[i]);
1656 goto out_free_netdev;
1657 }
1658 priv->nrsts++;
1659 }
1660
1661 ret = of_parse_phandle_with_fixed_args(np,
1662 "socionext,syscon-phy-mode",
1663 1, 0, &args);
1664 if (ret) {
1665 dev_err(dev, "can't get syscon-phy-mode property\n");
1666 goto out_free_netdev;
1667 }
1668 priv->regmap = syscon_node_to_regmap(args.np);
1669 of_node_put(args.np);
1670 if (IS_ERR(priv->regmap)) {
1671 dev_err(dev, "can't map syscon-phy-mode\n");
1672 ret = PTR_ERR(priv->regmap);
1673 goto out_free_netdev;
1674 }
1675 ret = priv->data->get_pinmode(priv, phy_mode, args.args[0]);
1676 if (ret) {
1677 dev_err(dev, "invalid phy-mode setting\n");
1678 goto out_free_netdev;
1679 }
1680
1681 priv->mdio = devm_mdiobus_alloc(dev);
1682 if (!priv->mdio) {
1683 ret = -ENOMEM;
1684 goto out_free_netdev;
1685 }
1686 priv->mdio->priv = ndev;
1687 priv->mdio->parent = dev;
1688 priv->mdio->read = ave_mdiobus_read;
1689 priv->mdio->write = ave_mdiobus_write;
1690 priv->mdio->name = "uniphier-mdio";
1691 snprintf(priv->mdio->id, MII_BUS_ID_SIZE, "%s-%x",
1692 pdev->name, pdev->id);
1693
1694
1695 netif_napi_add(ndev, &priv->napi_rx, ave_napi_poll_rx,
1696 NAPI_POLL_WEIGHT);
1697 netif_tx_napi_add(ndev, &priv->napi_tx, ave_napi_poll_tx,
1698 NAPI_POLL_WEIGHT);
1699
1700 platform_set_drvdata(pdev, ndev);
1701
1702 ret = register_netdev(ndev);
1703 if (ret) {
1704 dev_err(dev, "failed to register netdevice\n");
1705 goto out_del_napi;
1706 }
1707
1708
1709 ave_id = readl(priv->base + AVE_IDR);
1710 ave_hw_read_version(ndev, buf, sizeof(buf));
1711
1712 dev_info(dev, "Socionext %c%c%c%c Ethernet IP %s (irq=%d, phy=%s)\n",
1713 (ave_id >> 24) & 0xff, (ave_id >> 16) & 0xff,
1714 (ave_id >> 8) & 0xff, (ave_id >> 0) & 0xff,
1715 buf, priv->irq, phy_modes(phy_mode));
1716
1717 return 0;
1718
1719out_del_napi:
1720 netif_napi_del(&priv->napi_rx);
1721 netif_napi_del(&priv->napi_tx);
1722out_free_netdev:
1723 free_netdev(ndev);
1724
1725 return ret;
1726}
1727
1728static int ave_remove(struct platform_device *pdev)
1729{
1730 struct net_device *ndev = platform_get_drvdata(pdev);
1731 struct ave_private *priv = netdev_priv(ndev);
1732
1733 unregister_netdev(ndev);
1734 netif_napi_del(&priv->napi_rx);
1735 netif_napi_del(&priv->napi_tx);
1736 free_netdev(ndev);
1737
1738 return 0;
1739}
1740
1741#ifdef CONFIG_PM_SLEEP
1742static int ave_suspend(struct device *dev)
1743{
1744 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
1745 struct net_device *ndev = dev_get_drvdata(dev);
1746 struct ave_private *priv = netdev_priv(ndev);
1747 int ret = 0;
1748
1749 if (netif_running(ndev)) {
1750 ret = ave_stop(ndev);
1751 netif_device_detach(ndev);
1752 }
1753
1754 ave_ethtool_get_wol(ndev, &wol);
1755 priv->wolopts = wol.wolopts;
1756
1757 return ret;
1758}
1759
1760static int ave_resume(struct device *dev)
1761{
1762 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
1763 struct net_device *ndev = dev_get_drvdata(dev);
1764 struct ave_private *priv = netdev_priv(ndev);
1765 int ret = 0;
1766
1767 ave_global_reset(ndev);
1768
1769 ave_ethtool_get_wol(ndev, &wol);
1770 wol.wolopts = priv->wolopts;
1771 ave_ethtool_set_wol(ndev, &wol);
1772
1773 if (ndev->phydev) {
1774 ret = phy_resume(ndev->phydev);
1775 if (ret)
1776 return ret;
1777 }
1778
1779 if (netif_running(ndev)) {
1780 ret = ave_open(ndev);
1781 netif_device_attach(ndev);
1782 }
1783
1784 return ret;
1785}
1786
1787static SIMPLE_DEV_PM_OPS(ave_pm_ops, ave_suspend, ave_resume);
1788#define AVE_PM_OPS (&ave_pm_ops)
1789#else
1790#define AVE_PM_OPS NULL
1791#endif
1792
1793static int ave_pro4_get_pinmode(struct ave_private *priv,
1794 phy_interface_t phy_mode, u32 arg)
1795{
1796 if (arg > 0)
1797 return -EINVAL;
1798
1799 priv->pinmode_mask = SG_ETPINMODE_RMII(0);
1800
1801 switch (phy_mode) {
1802 case PHY_INTERFACE_MODE_RMII:
1803 priv->pinmode_val = SG_ETPINMODE_RMII(0);
1804 break;
1805 case PHY_INTERFACE_MODE_MII:
1806 case PHY_INTERFACE_MODE_RGMII:
1807 priv->pinmode_val = 0;
1808 break;
1809 default:
1810 return -EINVAL;
1811 }
1812
1813 return 0;
1814}
1815
1816static int ave_ld11_get_pinmode(struct ave_private *priv,
1817 phy_interface_t phy_mode, u32 arg)
1818{
1819 if (arg > 0)
1820 return -EINVAL;
1821
1822 priv->pinmode_mask = SG_ETPINMODE_EXTPHY | SG_ETPINMODE_RMII(0);
1823
1824 switch (phy_mode) {
1825 case PHY_INTERFACE_MODE_INTERNAL:
1826 priv->pinmode_val = 0;
1827 break;
1828 case PHY_INTERFACE_MODE_RMII:
1829 priv->pinmode_val = SG_ETPINMODE_EXTPHY | SG_ETPINMODE_RMII(0);
1830 break;
1831 default:
1832 return -EINVAL;
1833 }
1834
1835 return 0;
1836}
1837
1838static int ave_ld20_get_pinmode(struct ave_private *priv,
1839 phy_interface_t phy_mode, u32 arg)
1840{
1841 if (arg > 0)
1842 return -EINVAL;
1843
1844 priv->pinmode_mask = SG_ETPINMODE_RMII(0);
1845
1846 switch (phy_mode) {
1847 case PHY_INTERFACE_MODE_RMII:
1848 priv->pinmode_val = SG_ETPINMODE_RMII(0);
1849 break;
1850 case PHY_INTERFACE_MODE_RGMII:
1851 priv->pinmode_val = 0;
1852 break;
1853 default:
1854 return -EINVAL;
1855 }
1856
1857 return 0;
1858}
1859
1860static int ave_pxs3_get_pinmode(struct ave_private *priv,
1861 phy_interface_t phy_mode, u32 arg)
1862{
1863 if (arg > 1)
1864 return -EINVAL;
1865
1866 priv->pinmode_mask = SG_ETPINMODE_RMII(arg);
1867
1868 switch (phy_mode) {
1869 case PHY_INTERFACE_MODE_RMII:
1870 priv->pinmode_val = SG_ETPINMODE_RMII(arg);
1871 break;
1872 case PHY_INTERFACE_MODE_RGMII:
1873 priv->pinmode_val = 0;
1874 break;
1875 default:
1876 return -EINVAL;
1877 }
1878
1879 return 0;
1880}
1881
1882static const struct ave_soc_data ave_pro4_data = {
1883 .is_desc_64bit = false,
1884 .clock_names = {
1885 "gio", "ether", "ether-gb", "ether-phy",
1886 },
1887 .reset_names = {
1888 "gio", "ether",
1889 },
1890 .get_pinmode = ave_pro4_get_pinmode,
1891};
1892
1893static const struct ave_soc_data ave_pxs2_data = {
1894 .is_desc_64bit = false,
1895 .clock_names = {
1896 "ether",
1897 },
1898 .reset_names = {
1899 "ether",
1900 },
1901 .get_pinmode = ave_pro4_get_pinmode,
1902};
1903
1904static const struct ave_soc_data ave_ld11_data = {
1905 .is_desc_64bit = false,
1906 .clock_names = {
1907 "ether",
1908 },
1909 .reset_names = {
1910 "ether",
1911 },
1912 .get_pinmode = ave_ld11_get_pinmode,
1913};
1914
1915static const struct ave_soc_data ave_ld20_data = {
1916 .is_desc_64bit = true,
1917 .clock_names = {
1918 "ether",
1919 },
1920 .reset_names = {
1921 "ether",
1922 },
1923 .get_pinmode = ave_ld20_get_pinmode,
1924};
1925
1926static const struct ave_soc_data ave_pxs3_data = {
1927 .is_desc_64bit = false,
1928 .clock_names = {
1929 "ether",
1930 },
1931 .reset_names = {
1932 "ether",
1933 },
1934 .get_pinmode = ave_pxs3_get_pinmode,
1935};
1936
1937static const struct of_device_id of_ave_match[] = {
1938 {
1939 .compatible = "socionext,uniphier-pro4-ave4",
1940 .data = &ave_pro4_data,
1941 },
1942 {
1943 .compatible = "socionext,uniphier-pxs2-ave4",
1944 .data = &ave_pxs2_data,
1945 },
1946 {
1947 .compatible = "socionext,uniphier-ld11-ave4",
1948 .data = &ave_ld11_data,
1949 },
1950 {
1951 .compatible = "socionext,uniphier-ld20-ave4",
1952 .data = &ave_ld20_data,
1953 },
1954 {
1955 .compatible = "socionext,uniphier-pxs3-ave4",
1956 .data = &ave_pxs3_data,
1957 },
1958 { }
1959};
1960MODULE_DEVICE_TABLE(of, of_ave_match);
1961
1962static struct platform_driver ave_driver = {
1963 .probe = ave_probe,
1964 .remove = ave_remove,
1965 .driver = {
1966 .name = "ave",
1967 .pm = AVE_PM_OPS,
1968 .of_match_table = of_ave_match,
1969 },
1970};
1971module_platform_driver(ave_driver);
1972
1973MODULE_AUTHOR("Kunihiko Hayashi <hayashi.kunihiko@socionext.com>");
1974MODULE_DESCRIPTION("Socionext UniPhier AVE ethernet driver");
1975MODULE_LICENSE("GPL v2");
1976