]> git.sur5r.net Git - u-boot/blob - drivers/net/ag7xxx.c
net: ag7xxx: Comment register names
[u-boot] / drivers / net / ag7xxx.c
1 /*
2  * Atheros AR71xx / AR9xxx GMAC driver
3  *
4  * Copyright (C) 2016 Marek Vasut <marex@denx.de>
5  *
6  * SPDX-License-Identifier:     GPL-2.0+
7  */
8
9 #include <common.h>
10 #include <dm.h>
11 #include <errno.h>
12 #include <miiphy.h>
13 #include <malloc.h>
14 #include <linux/compiler.h>
15 #include <linux/err.h>
16 #include <linux/mii.h>
17 #include <wait_bit.h>
18 #include <asm/io.h>
19
20 #include <mach/ath79.h>
21
22 DECLARE_GLOBAL_DATA_PTR;
23
24 enum ag7xxx_model {
25         AG7XXX_MODEL_AG933X,
26         AG7XXX_MODEL_AG934X,
27 };
28
29 /* MAC Configuration 1 */
30 #define AG7XXX_ETH_CFG1                         0x00
31 #define AG7XXX_ETH_CFG1_SOFT_RST                BIT(31)
32 #define AG7XXX_ETH_CFG1_RX_RST                  BIT(19)
33 #define AG7XXX_ETH_CFG1_TX_RST                  BIT(18)
34 #define AG7XXX_ETH_CFG1_LOOPBACK                BIT(8)
35 #define AG7XXX_ETH_CFG1_RX_EN                   BIT(2)
36 #define AG7XXX_ETH_CFG1_TX_EN                   BIT(0)
37
38 /* MAC Configuration 2 */
39 #define AG7XXX_ETH_CFG2                         0x04
40 #define AG7XXX_ETH_CFG2_IF_1000                 BIT(9)
41 #define AG7XXX_ETH_CFG2_IF_10_100               BIT(8)
42 #define AG7XXX_ETH_CFG2_IF_SPEED_MASK           (3 << 8)
43 #define AG7XXX_ETH_CFG2_HUGE_FRAME_EN           BIT(5)
44 #define AG7XXX_ETH_CFG2_LEN_CHECK               BIT(4)
45 #define AG7XXX_ETH_CFG2_PAD_CRC_EN              BIT(2)
46 #define AG7XXX_ETH_CFG2_FDX                     BIT(0)
47
48 /* MII Configuration */
49 #define AG7XXX_ETH_MII_MGMT_CFG                 0x20
50 #define AG7XXX_ETH_MII_MGMT_CFG_RESET           BIT(31)
51
52 /* MII Command */
53 #define AG7XXX_ETH_MII_MGMT_CMD                 0x24
54 #define AG7XXX_ETH_MII_MGMT_CMD_READ            0x1
55
56 /* MII Address */
57 #define AG7XXX_ETH_MII_MGMT_ADDRESS             0x28
58 #define AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT       8
59
60 /* MII Control */
61 #define AG7XXX_ETH_MII_MGMT_CTRL                0x2c
62
63 /* MII Status */
64 #define AG7XXX_ETH_MII_MGMT_STATUS              0x30
65
66 /* MII Indicators */
67 #define AG7XXX_ETH_MII_MGMT_IND                 0x34
68 #define AG7XXX_ETH_MII_MGMT_IND_INVALID         BIT(2)
69 #define AG7XXX_ETH_MII_MGMT_IND_BUSY            BIT(0)
70
71 /* STA Address 1 & 2 */
72 #define AG7XXX_ETH_ADDR1                        0x40
73 #define AG7XXX_ETH_ADDR2                        0x44
74
75 /* ETH Configuration 0 - 5 */
76 #define AG7XXX_ETH_FIFO_CFG_0                   0x48
77 #define AG7XXX_ETH_FIFO_CFG_1                   0x4c
78 #define AG7XXX_ETH_FIFO_CFG_2                   0x50
79 #define AG7XXX_ETH_FIFO_CFG_3                   0x54
80 #define AG7XXX_ETH_FIFO_CFG_4                   0x58
81 #define AG7XXX_ETH_FIFO_CFG_5                   0x5c
82
83 /* DMA Transfer Control for Queue 0 */
84 #define AG7XXX_ETH_DMA_TX_CTRL                  0x180
85 #define AG7XXX_ETH_DMA_TX_CTRL_TXE              BIT(0)
86
87 /* Descriptor Address for Queue 0 Tx */
88 #define AG7XXX_ETH_DMA_TX_DESC                  0x184
89
90 /* DMA Tx Status */
91 #define AG7XXX_ETH_DMA_TX_STATUS                0x188
92
93 /* Rx Control */
94 #define AG7XXX_ETH_DMA_RX_CTRL                  0x18c
95 #define AG7XXX_ETH_DMA_RX_CTRL_RXE              BIT(0)
96
97 /* Pointer to Rx Descriptor */
98 #define AG7XXX_ETH_DMA_RX_DESC                  0x190
99
100 /* Rx Status */
101 #define AG7XXX_ETH_DMA_RX_STATUS                0x194
102
103 /* Custom register at 0x18070000 */
104 #define AG7XXX_GMAC_ETH_CFG                     0x00
105 #define AG7XXX_ETH_CFG_SW_PHY_ADDR_SWAP         BIT(8)
106 #define AG7XXX_ETH_CFG_SW_PHY_SWAP              BIT(7)
107 #define AG7XXX_ETH_CFG_SW_ONLY_MODE             BIT(6)
108 #define AG7XXX_ETH_CFG_GE0_ERR_EN               BIT(5)
109 #define AG7XXX_ETH_CFG_MII_GE0_SLAVE            BIT(4)
110 #define AG7XXX_ETH_CFG_MII_GE0_MASTER           BIT(3)
111 #define AG7XXX_ETH_CFG_GMII_GE0                 BIT(2)
112 #define AG7XXX_ETH_CFG_MII_GE0                  BIT(1)
113 #define AG7XXX_ETH_CFG_RGMII_GE0                BIT(0)
114
115 #define CONFIG_TX_DESCR_NUM     8
116 #define CONFIG_RX_DESCR_NUM     8
117 #define CONFIG_ETH_BUFSIZE      2048
118 #define TX_TOTAL_BUFSIZE        (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
119 #define RX_TOTAL_BUFSIZE        (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)
120
121 /* DMA descriptor. */
122 struct ag7xxx_dma_desc {
123         u32     data_addr;
124 #define AG7XXX_DMADESC_IS_EMPTY                 BIT(31)
125 #define AG7XXX_DMADESC_FTPP_OVERRIDE_OFFSET     16
126 #define AG7XXX_DMADESC_PKT_SIZE_OFFSET          0
127 #define AG7XXX_DMADESC_PKT_SIZE_MASK            0xfff
128         u32     config;
129         u32     next_desc;
130         u32     _pad[5];
131 };
132
133 struct ar7xxx_eth_priv {
134         struct ag7xxx_dma_desc  tx_mac_descrtable[CONFIG_TX_DESCR_NUM];
135         struct ag7xxx_dma_desc  rx_mac_descrtable[CONFIG_RX_DESCR_NUM];
136         char            txbuffs[TX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
137         char            rxbuffs[RX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
138
139         void __iomem            *regs;
140         void __iomem            *phyregs;
141
142         struct eth_device       *dev;
143         struct phy_device       *phydev;
144         struct mii_dev          *bus;
145
146         u32                     interface;
147         u32                     tx_currdescnum;
148         u32                     rx_currdescnum;
149         enum ag7xxx_model       model;
150 };
151
152 /*
153  * Switch and MDIO access
154  */
155 static int ag7xxx_switch_read(struct mii_dev *bus, int addr, int reg, u16 *val)
156 {
157         struct ar7xxx_eth_priv *priv = bus->priv;
158         void __iomem *regs = priv->phyregs;
159         int ret;
160
161         writel(0x0, regs + AG7XXX_ETH_MII_MGMT_CMD);
162         writel((addr << AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT) | reg,
163                regs + AG7XXX_ETH_MII_MGMT_ADDRESS);
164         writel(AG7XXX_ETH_MII_MGMT_CMD_READ,
165                regs + AG7XXX_ETH_MII_MGMT_CMD);
166
167         ret = wait_for_bit("ag7xxx", regs + AG7XXX_ETH_MII_MGMT_IND,
168                            AG7XXX_ETH_MII_MGMT_IND_BUSY, 0, 1000, 0);
169         if (ret)
170                 return ret;
171
172         *val = readl(regs + AG7XXX_ETH_MII_MGMT_STATUS) & 0xffff;
173         writel(0x0, regs + AG7XXX_ETH_MII_MGMT_CMD);
174
175         return 0;
176 }
177
178 static int ag7xxx_switch_write(struct mii_dev *bus, int addr, int reg, u16 val)
179 {
180         struct ar7xxx_eth_priv *priv = bus->priv;
181         void __iomem *regs = priv->phyregs;
182         int ret;
183
184         writel((addr << AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT) | reg,
185                regs + AG7XXX_ETH_MII_MGMT_ADDRESS);
186         writel(val, regs + AG7XXX_ETH_MII_MGMT_CTRL);
187
188         ret = wait_for_bit("ag7xxx", regs + AG7XXX_ETH_MII_MGMT_IND,
189                            AG7XXX_ETH_MII_MGMT_IND_BUSY, 0, 1000, 0);
190
191         return ret;
192 }
193
194 static int ag7xxx_switch_reg_read(struct mii_dev *bus, int reg, u32 *val)
195 {
196         struct ar7xxx_eth_priv *priv = bus->priv;
197         u32 phy_addr;
198         u32 reg_addr;
199         u32 phy_temp;
200         u32 reg_temp;
201         u16 rv = 0;
202         int ret;
203
204         if (priv->model == AG7XXX_MODEL_AG933X) {
205                 phy_addr = 0x1f;
206                 reg_addr = 0x10;
207         } else if (priv->model == AG7XXX_MODEL_AG934X) {
208                 phy_addr = 0x18;
209                 reg_addr = 0x00;
210         } else
211                 return -EINVAL;
212
213         ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
214         if (ret)
215                 return ret;
216
217         phy_temp = ((reg >> 6) & 0x7) | 0x10;
218         reg_temp = (reg >> 1) & 0x1e;
219         *val = 0;
220
221         ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 0, &rv);
222         if (ret < 0)
223                 return ret;
224         *val |= rv;
225
226         ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 1, &rv);
227         if (ret < 0)
228                 return ret;
229         *val |= (rv << 16);
230
231         return 0;
232 }
233
234 static int ag7xxx_switch_reg_write(struct mii_dev *bus, int reg, u32 val)
235 {
236         struct ar7xxx_eth_priv *priv = bus->priv;
237         u32 phy_addr;
238         u32 reg_addr;
239         u32 phy_temp;
240         u32 reg_temp;
241         int ret;
242
243         if (priv->model == AG7XXX_MODEL_AG933X) {
244                 phy_addr = 0x1f;
245                 reg_addr = 0x10;
246         } else if (priv->model == AG7XXX_MODEL_AG934X) {
247                 phy_addr = 0x18;
248                 reg_addr = 0x00;
249         } else
250                 return -EINVAL;
251
252         ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
253         if (ret)
254                 return ret;
255
256         phy_temp = ((reg >> 6) & 0x7) | 0x10;
257         reg_temp = (reg >> 1) & 0x1e;
258
259         /*
260          * The switch on AR933x has some special register behavior, which
261          * expects particular write order of their nibbles:
262          *   0x40 ..... MSB first, LSB second
263          *   0x50 ..... MSB first, LSB second
264          *   0x98 ..... LSB first, MSB second
265          *   others ... don't care
266          */
267         if ((priv->model == AG7XXX_MODEL_AG933X) && (reg == 0x98)) {
268                 ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 0, val & 0xffff);
269                 if (ret < 0)
270                         return ret;
271
272                 ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 1, val >> 16);
273                 if (ret < 0)
274                         return ret;
275         } else {
276                 ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 1, val >> 16);
277                 if (ret < 0)
278                         return ret;
279
280                 ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 0, val & 0xffff);
281                 if (ret < 0)
282                         return ret;
283         }
284
285         return 0;
286 }
287
288 static u16 ag7xxx_mdio_rw(struct mii_dev *bus, int addr, int reg, u32 val)
289 {
290         u32 data;
291
292         /* Dummy read followed by PHY read/write command. */
293         ag7xxx_switch_reg_read(bus, 0x98, &data);
294         data = val | (reg << 16) | (addr << 21) | BIT(30) | BIT(31);
295         ag7xxx_switch_reg_write(bus, 0x98, data);
296
297         /* Wait for operation to finish */
298         do {
299                 ag7xxx_switch_reg_read(bus, 0x98, &data);
300         } while (data & BIT(31));
301
302         return data & 0xffff;
303 }
304
305 static int ag7xxx_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
306 {
307         return ag7xxx_mdio_rw(bus, addr, reg, BIT(27));
308 }
309
310 static int ag7xxx_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
311                              u16 val)
312 {
313         ag7xxx_mdio_rw(bus, addr, reg, val);
314         return 0;
315 }
316
317 /*
318  * DMA ring handlers
319  */
320 static void ag7xxx_dma_clean_tx(struct udevice *dev)
321 {
322         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
323         struct ag7xxx_dma_desc *curr, *next;
324         u32 start, end;
325         int i;
326
327         for (i = 0; i < CONFIG_TX_DESCR_NUM; i++) {
328                 curr = &priv->tx_mac_descrtable[i];
329                 next = &priv->tx_mac_descrtable[(i + 1) % CONFIG_TX_DESCR_NUM];
330
331                 curr->data_addr = virt_to_phys(&priv->txbuffs[i * CONFIG_ETH_BUFSIZE]);
332                 curr->config = AG7XXX_DMADESC_IS_EMPTY;
333                 curr->next_desc = virt_to_phys(next);
334         }
335
336         priv->tx_currdescnum = 0;
337
338         /* Cache: Flush descriptors, don't care about buffers. */
339         start = (u32)(&priv->tx_mac_descrtable[0]);
340         end = start + sizeof(priv->tx_mac_descrtable);
341         flush_dcache_range(start, end);
342 }
343
344 static void ag7xxx_dma_clean_rx(struct udevice *dev)
345 {
346         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
347         struct ag7xxx_dma_desc *curr, *next;
348         u32 start, end;
349         int i;
350
351         for (i = 0; i < CONFIG_RX_DESCR_NUM; i++) {
352                 curr = &priv->rx_mac_descrtable[i];
353                 next = &priv->rx_mac_descrtable[(i + 1) % CONFIG_RX_DESCR_NUM];
354
355                 curr->data_addr = virt_to_phys(&priv->rxbuffs[i * CONFIG_ETH_BUFSIZE]);
356                 curr->config = AG7XXX_DMADESC_IS_EMPTY;
357                 curr->next_desc = virt_to_phys(next);
358         }
359
360         priv->rx_currdescnum = 0;
361
362         /* Cache: Flush+Invalidate descriptors, Invalidate buffers. */
363         start = (u32)(&priv->rx_mac_descrtable[0]);
364         end = start + sizeof(priv->rx_mac_descrtable);
365         flush_dcache_range(start, end);
366         invalidate_dcache_range(start, end);
367
368         start = (u32)&priv->rxbuffs;
369         end = start + sizeof(priv->rxbuffs);
370         invalidate_dcache_range(start, end);
371 }
372
373 /*
374  * Ethernet I/O
375  */
376 static int ag7xxx_eth_send(struct udevice *dev, void *packet, int length)
377 {
378         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
379         struct ag7xxx_dma_desc *curr;
380         u32 start, end;
381
382         curr = &priv->tx_mac_descrtable[priv->tx_currdescnum];
383
384         /* Cache: Invalidate descriptor. */
385         start = (u32)curr;
386         end = start + sizeof(*curr);
387         invalidate_dcache_range(start, end);
388
389         if (!(curr->config & AG7XXX_DMADESC_IS_EMPTY)) {
390                 printf("ag7xxx: Out of TX DMA descriptors!\n");
391                 return -EPERM;
392         }
393
394         /* Copy the packet into the data buffer. */
395         memcpy(phys_to_virt(curr->data_addr), packet, length);
396         curr->config = length & AG7XXX_DMADESC_PKT_SIZE_MASK;
397
398         /* Cache: Flush descriptor, Flush buffer. */
399         start = (u32)curr;
400         end = start + sizeof(*curr);
401         flush_dcache_range(start, end);
402         start = (u32)phys_to_virt(curr->data_addr);
403         end = start + length;
404         flush_dcache_range(start, end);
405
406         /* Load the DMA descriptor and start TX DMA. */
407         writel(AG7XXX_ETH_DMA_TX_CTRL_TXE,
408                priv->regs + AG7XXX_ETH_DMA_TX_CTRL);
409
410         /* Switch to next TX descriptor. */
411         priv->tx_currdescnum = (priv->tx_currdescnum + 1) % CONFIG_TX_DESCR_NUM;
412
413         return 0;
414 }
415
416 static int ag7xxx_eth_recv(struct udevice *dev, int flags, uchar **packetp)
417 {
418         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
419         struct ag7xxx_dma_desc *curr;
420         u32 start, end, length;
421
422         curr = &priv->rx_mac_descrtable[priv->rx_currdescnum];
423
424         /* Cache: Invalidate descriptor. */
425         start = (u32)curr;
426         end = start + sizeof(*curr);
427         invalidate_dcache_range(start, end);
428
429         /* No packets received. */
430         if (curr->config & AG7XXX_DMADESC_IS_EMPTY)
431                 return -EAGAIN;
432
433         length = curr->config & AG7XXX_DMADESC_PKT_SIZE_MASK;
434
435         /* Cache: Invalidate buffer. */
436         start = (u32)phys_to_virt(curr->data_addr);
437         end = start + length;
438         invalidate_dcache_range(start, end);
439
440         /* Receive one packet and return length. */
441         *packetp = phys_to_virt(curr->data_addr);
442         return length;
443 }
444
445 static int ag7xxx_eth_free_pkt(struct udevice *dev, uchar *packet,
446                                    int length)
447 {
448         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
449         struct ag7xxx_dma_desc *curr;
450         u32 start, end;
451
452         curr = &priv->rx_mac_descrtable[priv->rx_currdescnum];
453
454         curr->config = AG7XXX_DMADESC_IS_EMPTY;
455
456         /* Cache: Flush descriptor. */
457         start = (u32)curr;
458         end = start + sizeof(*curr);
459         flush_dcache_range(start, end);
460
461         /* Switch to next RX descriptor. */
462         priv->rx_currdescnum = (priv->rx_currdescnum + 1) % CONFIG_RX_DESCR_NUM;
463
464         return 0;
465 }
466
467 static int ag7xxx_eth_start(struct udevice *dev)
468 {
469         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
470
471         /* FIXME: Check if link up */
472
473         /* Clear the DMA rings. */
474         ag7xxx_dma_clean_tx(dev);
475         ag7xxx_dma_clean_rx(dev);
476
477         /* Load DMA descriptors and start the RX DMA. */
478         writel(virt_to_phys(&priv->tx_mac_descrtable[priv->tx_currdescnum]),
479                priv->regs + AG7XXX_ETH_DMA_TX_DESC);
480         writel(virt_to_phys(&priv->rx_mac_descrtable[priv->rx_currdescnum]),
481                priv->regs + AG7XXX_ETH_DMA_RX_DESC);
482         writel(AG7XXX_ETH_DMA_RX_CTRL_RXE,
483                priv->regs + AG7XXX_ETH_DMA_RX_CTRL);
484
485         return 0;
486 }
487
488 static void ag7xxx_eth_stop(struct udevice *dev)
489 {
490         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
491
492         /* Stop the TX DMA. */
493         writel(0, priv->regs + AG7XXX_ETH_DMA_TX_CTRL);
494         wait_for_bit("ag7xxx", priv->regs + AG7XXX_ETH_DMA_TX_CTRL, ~0, 0,
495                      1000, 0);
496
497         /* Stop the RX DMA. */
498         writel(0, priv->regs + AG7XXX_ETH_DMA_RX_CTRL);
499         wait_for_bit("ag7xxx", priv->regs + AG7XXX_ETH_DMA_RX_CTRL, ~0, 0,
500                      1000, 0);
501 }
502
503 /*
504  * Hardware setup
505  */
506 static int ag7xxx_eth_write_hwaddr(struct udevice *dev)
507 {
508         struct eth_pdata *pdata = dev_get_platdata(dev);
509         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
510         unsigned char *mac = pdata->enetaddr;
511         u32 macid_lo, macid_hi;
512
513         macid_hi = mac[3] | (mac[2] << 8) | (mac[1] << 16) | (mac[0] << 24);
514         macid_lo = (mac[5] << 16) | (mac[4] << 24);
515
516         writel(macid_lo, priv->regs + AG7XXX_ETH_ADDR1);
517         writel(macid_hi, priv->regs + AG7XXX_ETH_ADDR2);
518
519         return 0;
520 }
521
522 static void ag7xxx_hw_setup(struct udevice *dev)
523 {
524         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
525         u32 speed;
526
527         setbits_be32(priv->regs + AG7XXX_ETH_CFG1,
528                      AG7XXX_ETH_CFG1_RX_RST | AG7XXX_ETH_CFG1_TX_RST |
529                      AG7XXX_ETH_CFG1_SOFT_RST);
530
531         mdelay(10);
532
533         writel(AG7XXX_ETH_CFG1_RX_EN | AG7XXX_ETH_CFG1_TX_EN,
534                priv->regs + AG7XXX_ETH_CFG1);
535
536         if (priv->interface == PHY_INTERFACE_MODE_RMII)
537                 speed = AG7XXX_ETH_CFG2_IF_10_100;
538         else
539                 speed = AG7XXX_ETH_CFG2_IF_1000;
540
541         clrsetbits_be32(priv->regs + AG7XXX_ETH_CFG2,
542                         AG7XXX_ETH_CFG2_IF_SPEED_MASK,
543                         speed | AG7XXX_ETH_CFG2_PAD_CRC_EN |
544                         AG7XXX_ETH_CFG2_LEN_CHECK);
545
546         writel(0xfff0000, priv->regs + AG7XXX_ETH_FIFO_CFG_1);
547         writel(0x1fff, priv->regs + AG7XXX_ETH_FIFO_CFG_2);
548
549         writel(0x1f00, priv->regs + AG7XXX_ETH_FIFO_CFG_0);
550         setbits_be32(priv->regs + AG7XXX_ETH_FIFO_CFG_4, 0x3ffff);
551         writel(0x10ffff, priv->regs + AG7XXX_ETH_FIFO_CFG_1);
552         writel(0xaaa0555, priv->regs + AG7XXX_ETH_FIFO_CFG_2);
553         writel(0x7eccf, priv->regs + AG7XXX_ETH_FIFO_CFG_5);
554         writel(0x1f00140, priv->regs + AG7XXX_ETH_FIFO_CFG_3);
555 }
556
557 static int ag7xxx_mii_get_div(void)
558 {
559         ulong freq = get_bus_freq(0);
560
561         switch (freq / 1000000) {
562         case 150:       return 0x7;
563         case 175:       return 0x5;
564         case 200:       return 0x4;
565         case 210:       return 0x9;
566         case 220:       return 0x9;
567         default:        return 0x7;
568         }
569 }
570
571 static int ag7xxx_mii_setup(struct udevice *dev)
572 {
573         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
574         int i, ret, div = ag7xxx_mii_get_div();
575         u32 reg;
576
577         if (priv->model == AG7XXX_MODEL_AG933X) {
578                 /* Unit 0 is PHY-less on AR9331, see datasheet Figure 2-3 */
579                 if (priv->interface == PHY_INTERFACE_MODE_RMII)
580                         return 0;
581         }
582
583         if (priv->model == AG7XXX_MODEL_AG934X) {
584                 writel(AG7XXX_ETH_MII_MGMT_CFG_RESET | 0x4,
585                        priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
586                 writel(0x4, priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
587                 return 0;
588         }
589
590         for (i = 0; i < 10; i++) {
591                 writel(AG7XXX_ETH_MII_MGMT_CFG_RESET | div,
592                        priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
593                 writel(div, priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
594
595                 /* Check the switch */
596                 ret = ag7xxx_switch_reg_read(priv->bus, 0x10c, &reg);
597                 if (ret)
598                         continue;
599
600                 if (reg != 0x18007fff)
601                         continue;
602
603                 return 0;
604         }
605
606         return -EINVAL;
607 }
608
609 static int ag933x_phy_setup_wan(struct udevice *dev)
610 {
611         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
612
613         /* Configure switch port 4 (GMAC0) */
614         return ag7xxx_mdio_write(priv->bus, 4, 0, MII_BMCR, 0x9000);
615 }
616
617 static int ag933x_phy_setup_lan(struct udevice *dev)
618 {
619         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
620         int i, ret;
621         u32 reg;
622
623         /* Reset the switch */
624         ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
625         if (ret)
626                 return ret;
627         reg |= BIT(31);
628         ret = ag7xxx_switch_reg_write(priv->bus, 0, reg);
629         if (ret)
630                 return ret;
631
632         do {
633                 ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
634                 if (ret)
635                         return ret;
636         } while (reg & BIT(31));
637
638         /* Configure switch ports 0...3 (GMAC1) */
639         for (i = 0; i < 4; i++) {
640                 ret = ag7xxx_mdio_write(priv->bus, 0x4, 0, MII_BMCR, 0x9000);
641                 if (ret)
642                         return ret;
643         }
644
645         /* Enable CPU port */
646         ret = ag7xxx_switch_reg_write(priv->bus, 0x78, BIT(8));
647         if (ret)
648                 return ret;
649
650         for (i = 0; i < 4; i++) {
651                 ret = ag7xxx_switch_reg_write(priv->bus, i * 0x100, BIT(9));
652                 if (ret)
653                         return ret;
654         }
655
656         /* QM Control */
657         ret = ag7xxx_switch_reg_write(priv->bus, 0x38, 0xc000050e);
658         if (ret)
659                 return ret;
660
661         /* Disable Atheros header */
662         ret = ag7xxx_switch_reg_write(priv->bus, 0x104, 0x4004);
663         if (ret)
664                 return ret;
665
666         /* Tag priority mapping */
667         ret = ag7xxx_switch_reg_write(priv->bus, 0x70, 0xfa50);
668         if (ret)
669                 return ret;
670
671         /* Enable ARP packets to the CPU */
672         ret = ag7xxx_switch_reg_read(priv->bus, 0x5c, &reg);
673         if (ret)
674                 return ret;
675         reg |= 0x100000;
676         ret = ag7xxx_switch_reg_write(priv->bus, 0x5c, reg);
677         if (ret)
678                 return ret;
679
680         return 0;
681 }
682
683 static int ag933x_phy_setup_reset_set(struct udevice *dev, int port)
684 {
685         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
686         int ret;
687
688         ret = ag7xxx_mdio_write(priv->bus, port, 0, MII_ADVERTISE,
689                                 ADVERTISE_ALL | ADVERTISE_PAUSE_CAP |
690                                 ADVERTISE_PAUSE_ASYM);
691         if (ret)
692                 return ret;
693
694         if (priv->model == AG7XXX_MODEL_AG934X) {
695                 ret = ag7xxx_mdio_write(priv->bus, port, 0, MII_CTRL1000,
696                                         ADVERTISE_1000FULL);
697                 if (ret)
698                         return ret;
699         }
700
701         return ag7xxx_mdio_write(priv->bus, port, 0, MII_BMCR,
702                                  BMCR_ANENABLE | BMCR_RESET);
703 }
704
705 static int ag933x_phy_setup_reset_fin(struct udevice *dev, int port)
706 {
707         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
708         int ret;
709
710         do {
711                 ret = ag7xxx_mdio_read(priv->bus, port, 0, MII_BMCR);
712                 if (ret < 0)
713                         return ret;
714                 mdelay(10);
715         } while (ret & BMCR_RESET);
716
717         return 0;
718 }
719
720 static int ag933x_phy_setup_common(struct udevice *dev)
721 {
722         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
723         int i, ret, phymax;
724
725         if (priv->model == AG7XXX_MODEL_AG933X)
726                 phymax = 4;
727         else if (priv->model == AG7XXX_MODEL_AG934X)
728                 phymax = 5;
729         else
730                 return -EINVAL;
731
732         if (priv->interface == PHY_INTERFACE_MODE_RMII) {
733                 ret = ag933x_phy_setup_reset_set(dev, phymax);
734                 if (ret)
735                         return ret;
736
737                 ret = ag933x_phy_setup_reset_fin(dev, phymax);
738                 if (ret)
739                         return ret;
740
741                 /* Read out link status */
742                 ret = ag7xxx_mdio_read(priv->bus, phymax, 0, MII_MIPSCR);
743                 if (ret < 0)
744                         return ret;
745
746                 return 0;
747         }
748
749         /* Switch ports */
750         for (i = 0; i < phymax; i++) {
751                 ret = ag933x_phy_setup_reset_set(dev, i);
752                 if (ret)
753                         return ret;
754         }
755
756         for (i = 0; i < phymax; i++) {
757                 ret = ag933x_phy_setup_reset_fin(dev, i);
758                 if (ret)
759                         return ret;
760         }
761
762         for (i = 0; i < phymax; i++) {
763                 /* Read out link status */
764                 ret = ag7xxx_mdio_read(priv->bus, i, 0, MII_MIPSCR);
765                 if (ret < 0)
766                         return ret;
767         }
768
769         return 0;
770 }
771
772 static int ag934x_phy_setup(struct udevice *dev)
773 {
774         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
775         int i, ret;
776         u32 reg;
777
778         ret = ag7xxx_switch_reg_write(priv->bus, 0x624, 0x7f7f7f7f);
779         if (ret)
780                 return ret;
781         ret = ag7xxx_switch_reg_write(priv->bus, 0x10, 0x40000000);
782         if (ret)
783                 return ret;
784         ret = ag7xxx_switch_reg_write(priv->bus, 0x4, 0x07600000);
785         if (ret)
786                 return ret;
787         ret = ag7xxx_switch_reg_write(priv->bus, 0xc, 0x01000000);
788         if (ret)
789                 return ret;
790         ret = ag7xxx_switch_reg_write(priv->bus, 0x7c, 0x0000007e);
791         if (ret)
792                 return ret;
793
794         /* AR8327/AR8328 v1.0 fixup */
795         ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
796         if (ret)
797                 return ret;
798         if ((reg & 0xffff) == 0x1201) {
799                 for (i = 0; i < 5; i++) {
800                         ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1d, 0x0);
801                         if (ret)
802                                 return ret;
803                         ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1e, 0x02ea);
804                         if (ret)
805                                 return ret;
806                         ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1d, 0x3d);
807                         if (ret)
808                                 return ret;
809                         ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1e, 0x68a0);
810                         if (ret)
811                                 return ret;
812                 }
813         }
814
815         ret = ag7xxx_switch_reg_read(priv->bus, 0x66c, &reg);
816         if (ret)
817                 return ret;
818         reg &= ~0x70000;
819         ret = ag7xxx_switch_reg_write(priv->bus, 0x66c, reg);
820         if (ret)
821                 return ret;
822
823         return 0;
824 }
825
826 static int ag7xxx_mac_probe(struct udevice *dev)
827 {
828         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
829         int ret;
830
831         ag7xxx_hw_setup(dev);
832         ret = ag7xxx_mii_setup(dev);
833         if (ret)
834                 return ret;
835
836         ag7xxx_eth_write_hwaddr(dev);
837
838         if (priv->model == AG7XXX_MODEL_AG933X) {
839                 if (priv->interface == PHY_INTERFACE_MODE_RMII)
840                         ret = ag933x_phy_setup_wan(dev);
841                 else
842                         ret = ag933x_phy_setup_lan(dev);
843         } else if (priv->model == AG7XXX_MODEL_AG934X) {
844                 ret = ag934x_phy_setup(dev);
845         } else {
846                 return -EINVAL;
847         }
848
849         if (ret)
850                 return ret;
851
852         return ag933x_phy_setup_common(dev);
853 }
854
855 static int ag7xxx_mdio_probe(struct udevice *dev)
856 {
857         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
858         struct mii_dev *bus = mdio_alloc();
859
860         if (!bus)
861                 return -ENOMEM;
862
863         bus->read = ag7xxx_mdio_read;
864         bus->write = ag7xxx_mdio_write;
865         snprintf(bus->name, sizeof(bus->name), dev->name);
866
867         bus->priv = (void *)priv;
868
869         return mdio_register(bus);
870 }
871
872 static int ag7xxx_get_phy_iface_offset(struct udevice *dev)
873 {
874         int offset;
875
876         offset = fdtdec_lookup_phandle(gd->fdt_blob, dev_of_offset(dev), "phy");
877         if (offset <= 0) {
878                 debug("%s: PHY OF node not found (ret=%i)\n", __func__, offset);
879                 return -EINVAL;
880         }
881
882         offset = fdt_parent_offset(gd->fdt_blob, offset);
883         if (offset <= 0) {
884                 debug("%s: PHY OF node parent MDIO bus not found (ret=%i)\n",
885                       __func__, offset);
886                 return -EINVAL;
887         }
888
889         offset = fdt_parent_offset(gd->fdt_blob, offset);
890         if (offset <= 0) {
891                 debug("%s: PHY MDIO OF node parent MAC not found (ret=%i)\n",
892                       __func__, offset);
893                 return -EINVAL;
894         }
895
896         return offset;
897 }
898
899 static int ag7xxx_eth_probe(struct udevice *dev)
900 {
901         struct eth_pdata *pdata = dev_get_platdata(dev);
902         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
903         void __iomem *iobase, *phyiobase;
904         int ret, phyreg;
905
906         /* Decoding of convoluted PHY wiring on Atheros MIPS. */
907         ret = ag7xxx_get_phy_iface_offset(dev);
908         if (ret <= 0)
909                 return ret;
910         phyreg = fdtdec_get_int(gd->fdt_blob, ret, "reg", -1);
911
912         iobase = map_physmem(pdata->iobase, 0x200, MAP_NOCACHE);
913         phyiobase = map_physmem(phyreg, 0x200, MAP_NOCACHE);
914
915         debug("%s, iobase=%p, phyiobase=%p, priv=%p\n",
916               __func__, iobase, phyiobase, priv);
917         priv->regs = iobase;
918         priv->phyregs = phyiobase;
919         priv->interface = pdata->phy_interface;
920         priv->model = dev_get_driver_data(dev);
921
922         ret = ag7xxx_mdio_probe(dev);
923         if (ret)
924                 return ret;
925
926         priv->bus = miiphy_get_dev_by_name(dev->name);
927
928         ret = ag7xxx_mac_probe(dev);
929         debug("%s, ret=%d\n", __func__, ret);
930
931         return ret;
932 }
933
934 static int ag7xxx_eth_remove(struct udevice *dev)
935 {
936         struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
937
938         free(priv->phydev);
939         mdio_unregister(priv->bus);
940         mdio_free(priv->bus);
941
942         return 0;
943 }
944
945 static const struct eth_ops ag7xxx_eth_ops = {
946         .start                  = ag7xxx_eth_start,
947         .send                   = ag7xxx_eth_send,
948         .recv                   = ag7xxx_eth_recv,
949         .free_pkt               = ag7xxx_eth_free_pkt,
950         .stop                   = ag7xxx_eth_stop,
951         .write_hwaddr           = ag7xxx_eth_write_hwaddr,
952 };
953
954 static int ag7xxx_eth_ofdata_to_platdata(struct udevice *dev)
955 {
956         struct eth_pdata *pdata = dev_get_platdata(dev);
957         const char *phy_mode;
958         int ret;
959
960         pdata->iobase = devfdt_get_addr(dev);
961         pdata->phy_interface = -1;
962
963         /* Decoding of convoluted PHY wiring on Atheros MIPS. */
964         ret = ag7xxx_get_phy_iface_offset(dev);
965         if (ret <= 0)
966                 return ret;
967
968         phy_mode = fdt_getprop(gd->fdt_blob, ret, "phy-mode", NULL);
969         if (phy_mode)
970                 pdata->phy_interface = phy_get_interface_by_name(phy_mode);
971         if (pdata->phy_interface == -1) {
972                 debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
973                 return -EINVAL;
974         }
975
976         return 0;
977 }
978
979 static const struct udevice_id ag7xxx_eth_ids[] = {
980         { .compatible = "qca,ag933x-mac", .data = AG7XXX_MODEL_AG933X },
981         { .compatible = "qca,ag934x-mac", .data = AG7XXX_MODEL_AG934X },
982         { }
983 };
984
985 U_BOOT_DRIVER(eth_ag7xxx) = {
986         .name           = "eth_ag7xxx",
987         .id             = UCLASS_ETH,
988         .of_match       = ag7xxx_eth_ids,
989         .ofdata_to_platdata = ag7xxx_eth_ofdata_to_platdata,
990         .probe          = ag7xxx_eth_probe,
991         .remove         = ag7xxx_eth_remove,
992         .ops            = &ag7xxx_eth_ops,
993         .priv_auto_alloc_size = sizeof(struct ar7xxx_eth_priv),
994         .platdata_auto_alloc_size = sizeof(struct eth_pdata),
995         .flags          = DM_FLAG_ALLOC_PRIV_DMA,
996 };