arm: mach-k3: Enable dcache in SPL
[oweals/u-boot.git] / drivers / net / fec_mxc.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2009 Ilya Yanok, Emcraft Systems Ltd <yanok@emcraft.com>
4  * (C) Copyright 2008,2009 Eric Jarrige <eric.jarrige@armadeus.org>
5  * (C) Copyright 2008 Armadeus Systems nc
6  * (C) Copyright 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
7  * (C) Copyright 2007 Pengutronix, Juergen Beisert <j.beisert@pengutronix.de>
8  */
9
10 #include <common.h>
11 #include <cpu_func.h>
12 #include <dm.h>
13 #include <env.h>
14 #include <malloc.h>
15 #include <memalign.h>
16 #include <miiphy.h>
17 #include <net.h>
18 #include <netdev.h>
19 #include <power/regulator.h>
20
21 #include <asm/io.h>
22 #include <linux/errno.h>
23 #include <linux/compiler.h>
24
25 #include <asm/arch/clock.h>
26 #include <asm/arch/imx-regs.h>
27 #include <asm/mach-imx/sys_proto.h>
28 #include <asm-generic/gpio.h>
29
30 #include "fec_mxc.h"
31 #include <eth_phy.h>
32
33 DECLARE_GLOBAL_DATA_PTR;
34
35 /*
36  * Timeout the transfer after 5 mS. This is usually a bit more, since
37  * the code in the tightloops this timeout is used in adds some overhead.
38  */
39 #define FEC_XFER_TIMEOUT        5000
40
41 /*
42  * The standard 32-byte DMA alignment does not work on mx6solox, which requires
43  * 64-byte alignment in the DMA RX FEC buffer.
44  * Introduce the FEC_DMA_RX_MINALIGN which can cover mx6solox needs and also
45  * satisfies the alignment on other SoCs (32-bytes)
46  */
47 #define FEC_DMA_RX_MINALIGN     64
48
49 #ifndef CONFIG_MII
50 #error "CONFIG_MII has to be defined!"
51 #endif
52
53 #ifndef CONFIG_FEC_XCV_TYPE
54 #define CONFIG_FEC_XCV_TYPE MII100
55 #endif
56
57 /*
58  * The i.MX28 operates with packets in big endian. We need to swap them before
59  * sending and after receiving.
60  */
61 #ifdef CONFIG_MX28
62 #define CONFIG_FEC_MXC_SWAP_PACKET
63 #endif
64
65 #define RXDESC_PER_CACHELINE (ARCH_DMA_MINALIGN/sizeof(struct fec_bd))
66
67 /* Check various alignment issues at compile time */
68 #if ((ARCH_DMA_MINALIGN < 16) || (ARCH_DMA_MINALIGN % 16 != 0))
69 #error "ARCH_DMA_MINALIGN must be multiple of 16!"
70 #endif
71
72 #if ((PKTALIGN < ARCH_DMA_MINALIGN) || \
73         (PKTALIGN % ARCH_DMA_MINALIGN != 0))
74 #error "PKTALIGN must be multiple of ARCH_DMA_MINALIGN!"
75 #endif
76
77 #undef DEBUG
78
79 #ifdef CONFIG_FEC_MXC_SWAP_PACKET
80 static void swap_packet(uint32_t *packet, int length)
81 {
82         int i;
83
84         for (i = 0; i < DIV_ROUND_UP(length, 4); i++)
85                 packet[i] = __swab32(packet[i]);
86 }
87 #endif
88
89 /* MII-interface related functions */
90 static int fec_mdio_read(struct ethernet_regs *eth, uint8_t phyaddr,
91                 uint8_t regaddr)
92 {
93         uint32_t reg;           /* convenient holder for the PHY register */
94         uint32_t phy;           /* convenient holder for the PHY */
95         uint32_t start;
96         int val;
97
98         /*
99          * reading from any PHY's register is done by properly
100          * programming the FEC's MII data register.
101          */
102         writel(FEC_IEVENT_MII, &eth->ievent);
103         reg = regaddr << FEC_MII_DATA_RA_SHIFT;
104         phy = phyaddr << FEC_MII_DATA_PA_SHIFT;
105
106         writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD | FEC_MII_DATA_TA |
107                         phy | reg, &eth->mii_data);
108
109         /* wait for the related interrupt */
110         start = get_timer(0);
111         while (!(readl(&eth->ievent) & FEC_IEVENT_MII)) {
112                 if (get_timer(start) > (CONFIG_SYS_HZ / 1000)) {
113                         printf("Read MDIO failed...\n");
114                         return -1;
115                 }
116         }
117
118         /* clear mii interrupt bit */
119         writel(FEC_IEVENT_MII, &eth->ievent);
120
121         /* it's now safe to read the PHY's register */
122         val = (unsigned short)readl(&eth->mii_data);
123         debug("%s: phy: %02x reg:%02x val:%#x\n", __func__, phyaddr,
124               regaddr, val);
125         return val;
126 }
127
128 #ifndef imx_get_fecclk
129 u32 __weak imx_get_fecclk(void)
130 {
131         return 0;
132 }
133 #endif
134
135 static int fec_get_clk_rate(void *udev, int idx)
136 {
137         struct fec_priv *fec;
138         struct udevice *dev;
139         int ret;
140
141         if (IS_ENABLED(CONFIG_IMX8) ||
142             CONFIG_IS_ENABLED(CLK_CCF)) {
143                 dev = udev;
144                 if (!dev) {
145                         ret = uclass_get_device(UCLASS_ETH, idx, &dev);
146                         if (ret < 0) {
147                                 debug("Can't get FEC udev: %d\n", ret);
148                                 return ret;
149                         }
150                 }
151
152                 fec = dev_get_priv(dev);
153                 if (fec)
154                         return fec->clk_rate;
155
156                 return -EINVAL;
157         } else {
158                 return imx_get_fecclk();
159         }
160 }
161
162 static void fec_mii_setspeed(struct ethernet_regs *eth)
163 {
164         /*
165          * Set MII_SPEED = (1/(mii_speed * 2)) * System Clock
166          * and do not drop the Preamble.
167          *
168          * The i.MX28 and i.MX6 types have another field in the MSCR (aka
169          * MII_SPEED) register that defines the MDIO output hold time. Earlier
170          * versions are RAZ there, so just ignore the difference and write the
171          * register always.
172          * The minimal hold time according to IEE802.3 (clause 22) is 10 ns.
173          * HOLDTIME + 1 is the number of clk cycles the fec is holding the
174          * output.
175          * The HOLDTIME bitfield takes values between 0 and 7 (inclusive).
176          * Given that ceil(clkrate / 5000000) <= 64, the calculation for
177          * holdtime cannot result in a value greater than 3.
178          */
179         u32 pclk;
180         u32 speed;
181         u32 hold;
182         int ret;
183
184         ret = fec_get_clk_rate(NULL, 0);
185         if (ret < 0) {
186                 printf("Can't find FEC0 clk rate: %d\n", ret);
187                 return;
188         }
189         pclk = ret;
190         speed = DIV_ROUND_UP(pclk, 5000000);
191         hold = DIV_ROUND_UP(pclk, 100000000) - 1;
192
193 #ifdef FEC_QUIRK_ENET_MAC
194         speed--;
195 #endif
196         writel(speed << 1 | hold << 8, &eth->mii_speed);
197         debug("%s: mii_speed %08x\n", __func__, readl(&eth->mii_speed));
198 }
199
200 static int fec_mdio_write(struct ethernet_regs *eth, uint8_t phyaddr,
201                 uint8_t regaddr, uint16_t data)
202 {
203         uint32_t reg;           /* convenient holder for the PHY register */
204         uint32_t phy;           /* convenient holder for the PHY */
205         uint32_t start;
206
207         reg = regaddr << FEC_MII_DATA_RA_SHIFT;
208         phy = phyaddr << FEC_MII_DATA_PA_SHIFT;
209
210         writel(FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
211                 FEC_MII_DATA_TA | phy | reg | data, &eth->mii_data);
212
213         /* wait for the MII interrupt */
214         start = get_timer(0);
215         while (!(readl(&eth->ievent) & FEC_IEVENT_MII)) {
216                 if (get_timer(start) > (CONFIG_SYS_HZ / 1000)) {
217                         printf("Write MDIO failed...\n");
218                         return -1;
219                 }
220         }
221
222         /* clear MII interrupt bit */
223         writel(FEC_IEVENT_MII, &eth->ievent);
224         debug("%s: phy: %02x reg:%02x val:%#x\n", __func__, phyaddr,
225               regaddr, data);
226
227         return 0;
228 }
229
230 static int fec_phy_read(struct mii_dev *bus, int phyaddr, int dev_addr,
231                         int regaddr)
232 {
233         return fec_mdio_read(bus->priv, phyaddr, regaddr);
234 }
235
236 static int fec_phy_write(struct mii_dev *bus, int phyaddr, int dev_addr,
237                          int regaddr, u16 data)
238 {
239         return fec_mdio_write(bus->priv, phyaddr, regaddr, data);
240 }
241
242 #ifndef CONFIG_PHYLIB
243 static int miiphy_restart_aneg(struct eth_device *dev)
244 {
245         int ret = 0;
246 #if !defined(CONFIG_FEC_MXC_NO_ANEG)
247         struct fec_priv *fec = (struct fec_priv *)dev->priv;
248         struct ethernet_regs *eth = fec->bus->priv;
249
250         /*
251          * Wake up from sleep if necessary
252          * Reset PHY, then delay 300ns
253          */
254 #ifdef CONFIG_MX27
255         fec_mdio_write(eth, fec->phy_id, MII_DCOUNTER, 0x00FF);
256 #endif
257         fec_mdio_write(eth, fec->phy_id, MII_BMCR, BMCR_RESET);
258         udelay(1000);
259
260         /* Set the auto-negotiation advertisement register bits */
261         fec_mdio_write(eth, fec->phy_id, MII_ADVERTISE,
262                        LPA_100FULL | LPA_100HALF | LPA_10FULL |
263                        LPA_10HALF | PHY_ANLPAR_PSB_802_3);
264         fec_mdio_write(eth, fec->phy_id, MII_BMCR,
265                        BMCR_ANENABLE | BMCR_ANRESTART);
266
267         if (fec->mii_postcall)
268                 ret = fec->mii_postcall(fec->phy_id);
269
270 #endif
271         return ret;
272 }
273
274 #ifndef CONFIG_FEC_FIXED_SPEED
275 static int miiphy_wait_aneg(struct eth_device *dev)
276 {
277         uint32_t start;
278         int status;
279         struct fec_priv *fec = (struct fec_priv *)dev->priv;
280         struct ethernet_regs *eth = fec->bus->priv;
281
282         /* Wait for AN completion */
283         start = get_timer(0);
284         do {
285                 if (get_timer(start) > (CONFIG_SYS_HZ * 5)) {
286                         printf("%s: Autonegotiation timeout\n", dev->name);
287                         return -1;
288                 }
289
290                 status = fec_mdio_read(eth, fec->phy_id, MII_BMSR);
291                 if (status < 0) {
292                         printf("%s: Autonegotiation failed. status: %d\n",
293                                dev->name, status);
294                         return -1;
295                 }
296         } while (!(status & BMSR_LSTATUS));
297
298         return 0;
299 }
300 #endif /* CONFIG_FEC_FIXED_SPEED */
301 #endif
302
303 static int fec_rx_task_enable(struct fec_priv *fec)
304 {
305         writel(FEC_R_DES_ACTIVE_RDAR, &fec->eth->r_des_active);
306         return 0;
307 }
308
309 static int fec_rx_task_disable(struct fec_priv *fec)
310 {
311         return 0;
312 }
313
314 static int fec_tx_task_enable(struct fec_priv *fec)
315 {
316         writel(FEC_X_DES_ACTIVE_TDAR, &fec->eth->x_des_active);
317         return 0;
318 }
319
320 static int fec_tx_task_disable(struct fec_priv *fec)
321 {
322         return 0;
323 }
324
325 /**
326  * Initialize receive task's buffer descriptors
327  * @param[in] fec all we know about the device yet
328  * @param[in] count receive buffer count to be allocated
329  * @param[in] dsize desired size of each receive buffer
330  * @return 0 on success
331  *
332  * Init all RX descriptors to default values.
333  */
334 static void fec_rbd_init(struct fec_priv *fec, int count, int dsize)
335 {
336         uint32_t size;
337         ulong data;
338         int i;
339
340         /*
341          * Reload the RX descriptors with default values and wipe
342          * the RX buffers.
343          */
344         size = roundup(dsize, ARCH_DMA_MINALIGN);
345         for (i = 0; i < count; i++) {
346                 data = fec->rbd_base[i].data_pointer;
347                 memset((void *)data, 0, dsize);
348                 flush_dcache_range(data, data + size);
349
350                 fec->rbd_base[i].status = FEC_RBD_EMPTY;
351                 fec->rbd_base[i].data_length = 0;
352         }
353
354         /* Mark the last RBD to close the ring. */
355         fec->rbd_base[i - 1].status = FEC_RBD_WRAP | FEC_RBD_EMPTY;
356         fec->rbd_index = 0;
357
358         flush_dcache_range((ulong)fec->rbd_base,
359                            (ulong)fec->rbd_base + size);
360 }
361
362 /**
363  * Initialize transmit task's buffer descriptors
364  * @param[in] fec all we know about the device yet
365  *
366  * Transmit buffers are created externally. We only have to init the BDs here.\n
367  * Note: There is a race condition in the hardware. When only one BD is in
368  * use it must be marked with the WRAP bit to use it for every transmitt.
369  * This bit in combination with the READY bit results into double transmit
370  * of each data buffer. It seems the state machine checks READY earlier then
371  * resetting it after the first transfer.
372  * Using two BDs solves this issue.
373  */
374 static void fec_tbd_init(struct fec_priv *fec)
375 {
376         ulong addr = (ulong)fec->tbd_base;
377         unsigned size = roundup(2 * sizeof(struct fec_bd),
378                                 ARCH_DMA_MINALIGN);
379
380         memset(fec->tbd_base, 0, size);
381         fec->tbd_base[0].status = 0;
382         fec->tbd_base[1].status = FEC_TBD_WRAP;
383         fec->tbd_index = 0;
384         flush_dcache_range(addr, addr + size);
385 }
386
387 /**
388  * Mark the given read buffer descriptor as free
389  * @param[in] last 1 if this is the last buffer descriptor in the chain, else 0
390  * @param[in] prbd buffer descriptor to mark free again
391  */
392 static void fec_rbd_clean(int last, struct fec_bd *prbd)
393 {
394         unsigned short flags = FEC_RBD_EMPTY;
395         if (last)
396                 flags |= FEC_RBD_WRAP;
397         writew(flags, &prbd->status);
398         writew(0, &prbd->data_length);
399 }
400
401 static int fec_get_hwaddr(int dev_id, unsigned char *mac)
402 {
403         imx_get_mac_from_fuse(dev_id, mac);
404         return !is_valid_ethaddr(mac);
405 }
406
407 #ifdef CONFIG_DM_ETH
408 static int fecmxc_set_hwaddr(struct udevice *dev)
409 #else
410 static int fec_set_hwaddr(struct eth_device *dev)
411 #endif
412 {
413 #ifdef CONFIG_DM_ETH
414         struct fec_priv *fec = dev_get_priv(dev);
415         struct eth_pdata *pdata = dev_get_platdata(dev);
416         uchar *mac = pdata->enetaddr;
417 #else
418         uchar *mac = dev->enetaddr;
419         struct fec_priv *fec = (struct fec_priv *)dev->priv;
420 #endif
421
422         writel(0, &fec->eth->iaddr1);
423         writel(0, &fec->eth->iaddr2);
424         writel(0, &fec->eth->gaddr1);
425         writel(0, &fec->eth->gaddr2);
426
427         /* Set physical address */
428         writel((mac[0] << 24) + (mac[1] << 16) + (mac[2] << 8) + mac[3],
429                &fec->eth->paddr1);
430         writel((mac[4] << 24) + (mac[5] << 16) + 0x8808, &fec->eth->paddr2);
431
432         return 0;
433 }
434
435 /* Do initial configuration of the FEC registers */
436 static void fec_reg_setup(struct fec_priv *fec)
437 {
438         uint32_t rcntrl;
439
440         /* Set interrupt mask register */
441         writel(0x00000000, &fec->eth->imask);
442
443         /* Clear FEC-Lite interrupt event register(IEVENT) */
444         writel(0xffffffff, &fec->eth->ievent);
445
446         /* Set FEC-Lite receive control register(R_CNTRL): */
447
448         /* Start with frame length = 1518, common for all modes. */
449         rcntrl = PKTSIZE << FEC_RCNTRL_MAX_FL_SHIFT;
450         if (fec->xcv_type != SEVENWIRE)         /* xMII modes */
451                 rcntrl |= FEC_RCNTRL_FCE | FEC_RCNTRL_MII_MODE;
452         if (fec->xcv_type == RGMII)
453                 rcntrl |= FEC_RCNTRL_RGMII;
454         else if (fec->xcv_type == RMII)
455                 rcntrl |= FEC_RCNTRL_RMII;
456
457         writel(rcntrl, &fec->eth->r_cntrl);
458 }
459
460 /**
461  * Start the FEC engine
462  * @param[in] dev Our device to handle
463  */
464 #ifdef CONFIG_DM_ETH
465 static int fec_open(struct udevice *dev)
466 #else
467 static int fec_open(struct eth_device *edev)
468 #endif
469 {
470 #ifdef CONFIG_DM_ETH
471         struct fec_priv *fec = dev_get_priv(dev);
472 #else
473         struct fec_priv *fec = (struct fec_priv *)edev->priv;
474 #endif
475         int speed;
476         ulong addr, size;
477         int i;
478
479         debug("fec_open: fec_open(dev)\n");
480         /* full-duplex, heartbeat disabled */
481         writel(1 << 2, &fec->eth->x_cntrl);
482         fec->rbd_index = 0;
483
484         /* Invalidate all descriptors */
485         for (i = 0; i < FEC_RBD_NUM - 1; i++)
486                 fec_rbd_clean(0, &fec->rbd_base[i]);
487         fec_rbd_clean(1, &fec->rbd_base[i]);
488
489         /* Flush the descriptors into RAM */
490         size = roundup(FEC_RBD_NUM * sizeof(struct fec_bd),
491                         ARCH_DMA_MINALIGN);
492         addr = (ulong)fec->rbd_base;
493         flush_dcache_range(addr, addr + size);
494
495 #ifdef FEC_QUIRK_ENET_MAC
496         /* Enable ENET HW endian SWAP */
497         writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_DBSWAP,
498                &fec->eth->ecntrl);
499         /* Enable ENET store and forward mode */
500         writel(readl(&fec->eth->x_wmrk) | FEC_X_WMRK_STRFWD,
501                &fec->eth->x_wmrk);
502 #endif
503         /* Enable FEC-Lite controller */
504         writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_ETHER_EN,
505                &fec->eth->ecntrl);
506
507 #ifdef FEC_ENET_ENABLE_TXC_DELAY
508         writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_TXC_DLY,
509                &fec->eth->ecntrl);
510 #endif
511
512 #ifdef FEC_ENET_ENABLE_RXC_DELAY
513         writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_RXC_DLY,
514                &fec->eth->ecntrl);
515 #endif
516
517 #if defined(CONFIG_MX25) || defined(CONFIG_MX53) || defined(CONFIG_MX6SL)
518         udelay(100);
519
520         /* setup the MII gasket for RMII mode */
521         /* disable the gasket */
522         writew(0, &fec->eth->miigsk_enr);
523
524         /* wait for the gasket to be disabled */
525         while (readw(&fec->eth->miigsk_enr) & MIIGSK_ENR_READY)
526                 udelay(2);
527
528         /* configure gasket for RMII, 50 MHz, no loopback, and no echo */
529         writew(MIIGSK_CFGR_IF_MODE_RMII, &fec->eth->miigsk_cfgr);
530
531         /* re-enable the gasket */
532         writew(MIIGSK_ENR_EN, &fec->eth->miigsk_enr);
533
534         /* wait until MII gasket is ready */
535         int max_loops = 10;
536         while ((readw(&fec->eth->miigsk_enr) & MIIGSK_ENR_READY) == 0) {
537                 if (--max_loops <= 0) {
538                         printf("WAIT for MII Gasket ready timed out\n");
539                         break;
540                 }
541         }
542 #endif
543
544 #ifdef CONFIG_PHYLIB
545         {
546                 /* Start up the PHY */
547                 int ret = phy_startup(fec->phydev);
548
549                 if (ret) {
550                         printf("Could not initialize PHY %s\n",
551                                fec->phydev->dev->name);
552                         return ret;
553                 }
554                 speed = fec->phydev->speed;
555         }
556 #elif CONFIG_FEC_FIXED_SPEED
557         speed = CONFIG_FEC_FIXED_SPEED;
558 #else
559         miiphy_wait_aneg(edev);
560         speed = miiphy_speed(edev->name, fec->phy_id);
561         miiphy_duplex(edev->name, fec->phy_id);
562 #endif
563
564 #ifdef FEC_QUIRK_ENET_MAC
565         {
566                 u32 ecr = readl(&fec->eth->ecntrl) & ~FEC_ECNTRL_SPEED;
567                 u32 rcr = readl(&fec->eth->r_cntrl) & ~FEC_RCNTRL_RMII_10T;
568                 if (speed == _1000BASET)
569                         ecr |= FEC_ECNTRL_SPEED;
570                 else if (speed != _100BASET)
571                         rcr |= FEC_RCNTRL_RMII_10T;
572                 writel(ecr, &fec->eth->ecntrl);
573                 writel(rcr, &fec->eth->r_cntrl);
574         }
575 #endif
576         debug("%s:Speed=%i\n", __func__, speed);
577
578         /* Enable SmartDMA receive task */
579         fec_rx_task_enable(fec);
580
581         udelay(100000);
582         return 0;
583 }
584
585 #ifdef CONFIG_DM_ETH
586 static int fecmxc_init(struct udevice *dev)
587 #else
588 static int fec_init(struct eth_device *dev, bd_t *bd)
589 #endif
590 {
591 #ifdef CONFIG_DM_ETH
592         struct fec_priv *fec = dev_get_priv(dev);
593 #else
594         struct fec_priv *fec = (struct fec_priv *)dev->priv;
595 #endif
596         u8 *mib_ptr = (uint8_t *)&fec->eth->rmon_t_drop;
597         u8 *i;
598         ulong addr;
599
600         /* Initialize MAC address */
601 #ifdef CONFIG_DM_ETH
602         fecmxc_set_hwaddr(dev);
603 #else
604         fec_set_hwaddr(dev);
605 #endif
606
607         /* Setup transmit descriptors, there are two in total. */
608         fec_tbd_init(fec);
609
610         /* Setup receive descriptors. */
611         fec_rbd_init(fec, FEC_RBD_NUM, FEC_MAX_PKT_SIZE);
612
613         fec_reg_setup(fec);
614
615         if (fec->xcv_type != SEVENWIRE)
616                 fec_mii_setspeed(fec->bus->priv);
617
618         /* Set Opcode/Pause Duration Register */
619         writel(0x00010020, &fec->eth->op_pause);        /* FIXME 0xffff0020; */
620         writel(0x2, &fec->eth->x_wmrk);
621
622         /* Set multicast address filter */
623         writel(0x00000000, &fec->eth->gaddr1);
624         writel(0x00000000, &fec->eth->gaddr2);
625
626         /* Do not access reserved register */
627         if (!is_mx6ul() && !is_mx6ull() && !is_imx8() && !is_imx8m()) {
628                 /* clear MIB RAM */
629                 for (i = mib_ptr; i <= mib_ptr + 0xfc; i += 4)
630                         writel(0, i);
631
632                 /* FIFO receive start register */
633                 writel(0x520, &fec->eth->r_fstart);
634         }
635
636         /* size and address of each buffer */
637         writel(FEC_MAX_PKT_SIZE, &fec->eth->emrbr);
638
639         addr = (ulong)fec->tbd_base;
640         writel((uint32_t)addr, &fec->eth->etdsr);
641
642         addr = (ulong)fec->rbd_base;
643         writel((uint32_t)addr, &fec->eth->erdsr);
644
645 #ifndef CONFIG_PHYLIB
646         if (fec->xcv_type != SEVENWIRE)
647                 miiphy_restart_aneg(dev);
648 #endif
649         fec_open(dev);
650         return 0;
651 }
652
653 /**
654  * Halt the FEC engine
655  * @param[in] dev Our device to handle
656  */
657 #ifdef CONFIG_DM_ETH
658 static void fecmxc_halt(struct udevice *dev)
659 #else
660 static void fec_halt(struct eth_device *dev)
661 #endif
662 {
663 #ifdef CONFIG_DM_ETH
664         struct fec_priv *fec = dev_get_priv(dev);
665 #else
666         struct fec_priv *fec = (struct fec_priv *)dev->priv;
667 #endif
668         int counter = 0xffff;
669
670         /* issue graceful stop command to the FEC transmitter if necessary */
671         writel(FEC_TCNTRL_GTS | readl(&fec->eth->x_cntrl),
672                &fec->eth->x_cntrl);
673
674         debug("eth_halt: wait for stop regs\n");
675         /* wait for graceful stop to register */
676         while ((counter--) && (!(readl(&fec->eth->ievent) & FEC_IEVENT_GRA)))
677                 udelay(1);
678
679         /* Disable SmartDMA tasks */
680         fec_tx_task_disable(fec);
681         fec_rx_task_disable(fec);
682
683         /*
684          * Disable the Ethernet Controller
685          * Note: this will also reset the BD index counter!
686          */
687         writel(readl(&fec->eth->ecntrl) & ~FEC_ECNTRL_ETHER_EN,
688                &fec->eth->ecntrl);
689         fec->rbd_index = 0;
690         fec->tbd_index = 0;
691         debug("eth_halt: done\n");
692 }
693
694 /**
695  * Transmit one frame
696  * @param[in] dev Our ethernet device to handle
697  * @param[in] packet Pointer to the data to be transmitted
698  * @param[in] length Data count in bytes
699  * @return 0 on success
700  */
701 #ifdef CONFIG_DM_ETH
702 static int fecmxc_send(struct udevice *dev, void *packet, int length)
703 #else
704 static int fec_send(struct eth_device *dev, void *packet, int length)
705 #endif
706 {
707         unsigned int status;
708         u32 size;
709         ulong addr, end;
710         int timeout = FEC_XFER_TIMEOUT;
711         int ret = 0;
712
713         /*
714          * This routine transmits one frame.  This routine only accepts
715          * 6-byte Ethernet addresses.
716          */
717 #ifdef CONFIG_DM_ETH
718         struct fec_priv *fec = dev_get_priv(dev);
719 #else
720         struct fec_priv *fec = (struct fec_priv *)dev->priv;
721 #endif
722
723         /*
724          * Check for valid length of data.
725          */
726         if ((length > 1500) || (length <= 0)) {
727                 printf("Payload (%d) too large\n", length);
728                 return -1;
729         }
730
731         /*
732          * Setup the transmit buffer. We are always using the first buffer for
733          * transmission, the second will be empty and only used to stop the DMA
734          * engine. We also flush the packet to RAM here to avoid cache trouble.
735          */
736 #ifdef CONFIG_FEC_MXC_SWAP_PACKET
737         swap_packet((uint32_t *)packet, length);
738 #endif
739
740         addr = (ulong)packet;
741         end = roundup(addr + length, ARCH_DMA_MINALIGN);
742         addr &= ~(ARCH_DMA_MINALIGN - 1);
743         flush_dcache_range(addr, end);
744
745         writew(length, &fec->tbd_base[fec->tbd_index].data_length);
746         writel((uint32_t)addr, &fec->tbd_base[fec->tbd_index].data_pointer);
747
748         /*
749          * update BD's status now
750          * This block:
751          * - is always the last in a chain (means no chain)
752          * - should transmitt the CRC
753          * - might be the last BD in the list, so the address counter should
754          *   wrap (-> keep the WRAP flag)
755          */
756         status = readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_WRAP;
757         status |= FEC_TBD_LAST | FEC_TBD_TC | FEC_TBD_READY;
758         writew(status, &fec->tbd_base[fec->tbd_index].status);
759
760         /*
761          * Flush data cache. This code flushes both TX descriptors to RAM.
762          * After this code, the descriptors will be safely in RAM and we
763          * can start DMA.
764          */
765         size = roundup(2 * sizeof(struct fec_bd), ARCH_DMA_MINALIGN);
766         addr = (ulong)fec->tbd_base;
767         flush_dcache_range(addr, addr + size);
768
769         /*
770          * Below we read the DMA descriptor's last four bytes back from the
771          * DRAM. This is important in order to make sure that all WRITE
772          * operations on the bus that were triggered by previous cache FLUSH
773          * have completed.
774          *
775          * Otherwise, on MX28, it is possible to observe a corruption of the
776          * DMA descriptors. Please refer to schematic "Figure 1-2" in MX28RM
777          * for the bus structure of MX28. The scenario is as follows:
778          *
779          * 1) ARM core triggers a series of WRITEs on the AHB_ARB2 bus going
780          *    to DRAM due to flush_dcache_range()
781          * 2) ARM core writes the FEC registers via AHB_ARB2
782          * 3) FEC DMA starts reading/writing from/to DRAM via AHB_ARB3
783          *
784          * Note that 2) does sometimes finish before 1) due to reordering of
785          * WRITE accesses on the AHB bus, therefore triggering 3) before the
786          * DMA descriptor is fully written into DRAM. This results in occasional
787          * corruption of the DMA descriptor.
788          */
789         readl(addr + size - 4);
790
791         /* Enable SmartDMA transmit task */
792         fec_tx_task_enable(fec);
793
794         /*
795          * Wait until frame is sent. On each turn of the wait cycle, we must
796          * invalidate data cache to see what's really in RAM. Also, we need
797          * barrier here.
798          */
799         while (--timeout) {
800                 if (!(readl(&fec->eth->x_des_active) & FEC_X_DES_ACTIVE_TDAR))
801                         break;
802         }
803
804         if (!timeout) {
805                 ret = -EINVAL;
806                 goto out;
807         }
808
809         /*
810          * The TDAR bit is cleared when the descriptors are all out from TX
811          * but on mx6solox we noticed that the READY bit is still not cleared
812          * right after TDAR.
813          * These are two distinct signals, and in IC simulation, we found that
814          * TDAR always gets cleared prior than the READY bit of last BD becomes
815          * cleared.
816          * In mx6solox, we use a later version of FEC IP. It looks like that
817          * this intrinsic behaviour of TDAR bit has changed in this newer FEC
818          * version.
819          *
820          * Fix this by polling the READY bit of BD after the TDAR polling,
821          * which covers the mx6solox case and does not harm the other SoCs.
822          */
823         timeout = FEC_XFER_TIMEOUT;
824         while (--timeout) {
825                 invalidate_dcache_range(addr, addr + size);
826                 if (!(readw(&fec->tbd_base[fec->tbd_index].status) &
827                     FEC_TBD_READY))
828                         break;
829         }
830
831         if (!timeout)
832                 ret = -EINVAL;
833
834 out:
835         debug("fec_send: status 0x%x index %d ret %i\n",
836               readw(&fec->tbd_base[fec->tbd_index].status),
837               fec->tbd_index, ret);
838         /* for next transmission use the other buffer */
839         if (fec->tbd_index)
840                 fec->tbd_index = 0;
841         else
842                 fec->tbd_index = 1;
843
844         return ret;
845 }
846
847 /**
848  * Pull one frame from the card
849  * @param[in] dev Our ethernet device to handle
850  * @return Length of packet read
851  */
852 #ifdef CONFIG_DM_ETH
853 static int fecmxc_recv(struct udevice *dev, int flags, uchar **packetp)
854 #else
855 static int fec_recv(struct eth_device *dev)
856 #endif
857 {
858 #ifdef CONFIG_DM_ETH
859         struct fec_priv *fec = dev_get_priv(dev);
860 #else
861         struct fec_priv *fec = (struct fec_priv *)dev->priv;
862 #endif
863         struct fec_bd *rbd = &fec->rbd_base[fec->rbd_index];
864         unsigned long ievent;
865         int frame_length, len = 0;
866         uint16_t bd_status;
867         ulong addr, size, end;
868         int i;
869
870 #ifdef CONFIG_DM_ETH
871         *packetp = memalign(ARCH_DMA_MINALIGN, FEC_MAX_PKT_SIZE);
872         if (*packetp == 0) {
873                 printf("%s: error allocating packetp\n", __func__);
874                 return -ENOMEM;
875         }
876 #else
877         ALLOC_CACHE_ALIGN_BUFFER(uchar, buff, FEC_MAX_PKT_SIZE);
878 #endif
879
880         /* Check if any critical events have happened */
881         ievent = readl(&fec->eth->ievent);
882         writel(ievent, &fec->eth->ievent);
883         debug("fec_recv: ievent 0x%lx\n", ievent);
884         if (ievent & FEC_IEVENT_BABR) {
885 #ifdef CONFIG_DM_ETH
886                 fecmxc_halt(dev);
887                 fecmxc_init(dev);
888 #else
889                 fec_halt(dev);
890                 fec_init(dev, fec->bd);
891 #endif
892                 printf("some error: 0x%08lx\n", ievent);
893                 return 0;
894         }
895         if (ievent & FEC_IEVENT_HBERR) {
896                 /* Heartbeat error */
897                 writel(0x00000001 | readl(&fec->eth->x_cntrl),
898                        &fec->eth->x_cntrl);
899         }
900         if (ievent & FEC_IEVENT_GRA) {
901                 /* Graceful stop complete */
902                 if (readl(&fec->eth->x_cntrl) & 0x00000001) {
903 #ifdef CONFIG_DM_ETH
904                         fecmxc_halt(dev);
905 #else
906                         fec_halt(dev);
907 #endif
908                         writel(~0x00000001 & readl(&fec->eth->x_cntrl),
909                                &fec->eth->x_cntrl);
910 #ifdef CONFIG_DM_ETH
911                         fecmxc_init(dev);
912 #else
913                         fec_init(dev, fec->bd);
914 #endif
915                 }
916         }
917
918         /*
919          * Read the buffer status. Before the status can be read, the data cache
920          * must be invalidated, because the data in RAM might have been changed
921          * by DMA. The descriptors are properly aligned to cachelines so there's
922          * no need to worry they'd overlap.
923          *
924          * WARNING: By invalidating the descriptor here, we also invalidate
925          * the descriptors surrounding this one. Therefore we can NOT change the
926          * contents of this descriptor nor the surrounding ones. The problem is
927          * that in order to mark the descriptor as processed, we need to change
928          * the descriptor. The solution is to mark the whole cache line when all
929          * descriptors in the cache line are processed.
930          */
931         addr = (ulong)rbd;
932         addr &= ~(ARCH_DMA_MINALIGN - 1);
933         size = roundup(sizeof(struct fec_bd), ARCH_DMA_MINALIGN);
934         invalidate_dcache_range(addr, addr + size);
935
936         bd_status = readw(&rbd->status);
937         debug("fec_recv: status 0x%x\n", bd_status);
938
939         if (!(bd_status & FEC_RBD_EMPTY)) {
940                 if ((bd_status & FEC_RBD_LAST) && !(bd_status & FEC_RBD_ERR) &&
941                     ((readw(&rbd->data_length) - 4) > 14)) {
942                         /* Get buffer address and size */
943                         addr = readl(&rbd->data_pointer);
944                         frame_length = readw(&rbd->data_length) - 4;
945                         /* Invalidate data cache over the buffer */
946                         end = roundup(addr + frame_length, ARCH_DMA_MINALIGN);
947                         addr &= ~(ARCH_DMA_MINALIGN - 1);
948                         invalidate_dcache_range(addr, end);
949
950                         /* Fill the buffer and pass it to upper layers */
951 #ifdef CONFIG_FEC_MXC_SWAP_PACKET
952                         swap_packet((uint32_t *)addr, frame_length);
953 #endif
954
955 #ifdef CONFIG_DM_ETH
956                         memcpy(*packetp, (char *)addr, frame_length);
957 #else
958                         memcpy(buff, (char *)addr, frame_length);
959                         net_process_received_packet(buff, frame_length);
960 #endif
961                         len = frame_length;
962                 } else {
963                         if (bd_status & FEC_RBD_ERR)
964                                 debug("error frame: 0x%08lx 0x%08x\n",
965                                       addr, bd_status);
966                 }
967
968                 /*
969                  * Free the current buffer, restart the engine and move forward
970                  * to the next buffer. Here we check if the whole cacheline of
971                  * descriptors was already processed and if so, we mark it free
972                  * as whole.
973                  */
974                 size = RXDESC_PER_CACHELINE - 1;
975                 if ((fec->rbd_index & size) == size) {
976                         i = fec->rbd_index - size;
977                         addr = (ulong)&fec->rbd_base[i];
978                         for (; i <= fec->rbd_index ; i++) {
979                                 fec_rbd_clean(i == (FEC_RBD_NUM - 1),
980                                               &fec->rbd_base[i]);
981                         }
982                         flush_dcache_range(addr,
983                                            addr + ARCH_DMA_MINALIGN);
984                 }
985
986                 fec_rx_task_enable(fec);
987                 fec->rbd_index = (fec->rbd_index + 1) % FEC_RBD_NUM;
988         }
989         debug("fec_recv: stop\n");
990
991         return len;
992 }
993
994 static void fec_set_dev_name(char *dest, int dev_id)
995 {
996         sprintf(dest, (dev_id == -1) ? "FEC" : "FEC%i", dev_id);
997 }
998
999 static int fec_alloc_descs(struct fec_priv *fec)
1000 {
1001         unsigned int size;
1002         int i;
1003         uint8_t *data;
1004         ulong addr;
1005
1006         /* Allocate TX descriptors. */
1007         size = roundup(2 * sizeof(struct fec_bd), ARCH_DMA_MINALIGN);
1008         fec->tbd_base = memalign(ARCH_DMA_MINALIGN, size);
1009         if (!fec->tbd_base)
1010                 goto err_tx;
1011
1012         /* Allocate RX descriptors. */
1013         size = roundup(FEC_RBD_NUM * sizeof(struct fec_bd), ARCH_DMA_MINALIGN);
1014         fec->rbd_base = memalign(ARCH_DMA_MINALIGN, size);
1015         if (!fec->rbd_base)
1016                 goto err_rx;
1017
1018         memset(fec->rbd_base, 0, size);
1019
1020         /* Allocate RX buffers. */
1021
1022         /* Maximum RX buffer size. */
1023         size = roundup(FEC_MAX_PKT_SIZE, FEC_DMA_RX_MINALIGN);
1024         for (i = 0; i < FEC_RBD_NUM; i++) {
1025                 data = memalign(FEC_DMA_RX_MINALIGN, size);
1026                 if (!data) {
1027                         printf("%s: error allocating rxbuf %d\n", __func__, i);
1028                         goto err_ring;
1029                 }
1030
1031                 memset(data, 0, size);
1032
1033                 addr = (ulong)data;
1034                 fec->rbd_base[i].data_pointer = (uint32_t)addr;
1035                 fec->rbd_base[i].status = FEC_RBD_EMPTY;
1036                 fec->rbd_base[i].data_length = 0;
1037                 /* Flush the buffer to memory. */
1038                 flush_dcache_range(addr, addr + size);
1039         }
1040
1041         /* Mark the last RBD to close the ring. */
1042         fec->rbd_base[i - 1].status = FEC_RBD_WRAP | FEC_RBD_EMPTY;
1043
1044         fec->rbd_index = 0;
1045         fec->tbd_index = 0;
1046
1047         return 0;
1048
1049 err_ring:
1050         for (; i >= 0; i--) {
1051                 addr = fec->rbd_base[i].data_pointer;
1052                 free((void *)addr);
1053         }
1054         free(fec->rbd_base);
1055 err_rx:
1056         free(fec->tbd_base);
1057 err_tx:
1058         return -ENOMEM;
1059 }
1060
1061 static void fec_free_descs(struct fec_priv *fec)
1062 {
1063         int i;
1064         ulong addr;
1065
1066         for (i = 0; i < FEC_RBD_NUM; i++) {
1067                 addr = fec->rbd_base[i].data_pointer;
1068                 free((void *)addr);
1069         }
1070         free(fec->rbd_base);
1071         free(fec->tbd_base);
1072 }
1073
1074 struct mii_dev *fec_get_miibus(ulong base_addr, int dev_id)
1075 {
1076         struct ethernet_regs *eth = (struct ethernet_regs *)base_addr;
1077         struct mii_dev *bus;
1078         int ret;
1079
1080         bus = mdio_alloc();
1081         if (!bus) {
1082                 printf("mdio_alloc failed\n");
1083                 return NULL;
1084         }
1085         bus->read = fec_phy_read;
1086         bus->write = fec_phy_write;
1087         bus->priv = eth;
1088         fec_set_dev_name(bus->name, dev_id);
1089
1090         ret = mdio_register(bus);
1091         if (ret) {
1092                 printf("mdio_register failed\n");
1093                 free(bus);
1094                 return NULL;
1095         }
1096         fec_mii_setspeed(eth);
1097         return bus;
1098 }
1099
1100 #ifndef CONFIG_DM_ETH
1101 #ifdef CONFIG_PHYLIB
1102 int fec_probe(bd_t *bd, int dev_id, uint32_t base_addr,
1103                 struct mii_dev *bus, struct phy_device *phydev)
1104 #else
1105 static int fec_probe(bd_t *bd, int dev_id, uint32_t base_addr,
1106                 struct mii_dev *bus, int phy_id)
1107 #endif
1108 {
1109         struct eth_device *edev;
1110         struct fec_priv *fec;
1111         unsigned char ethaddr[6];
1112         char mac[16];
1113         uint32_t start;
1114         int ret = 0;
1115
1116         /* create and fill edev struct */
1117         edev = (struct eth_device *)malloc(sizeof(struct eth_device));
1118         if (!edev) {
1119                 puts("fec_mxc: not enough malloc memory for eth_device\n");
1120                 ret = -ENOMEM;
1121                 goto err1;
1122         }
1123
1124         fec = (struct fec_priv *)malloc(sizeof(struct fec_priv));
1125         if (!fec) {
1126                 puts("fec_mxc: not enough malloc memory for fec_priv\n");
1127                 ret = -ENOMEM;
1128                 goto err2;
1129         }
1130
1131         memset(edev, 0, sizeof(*edev));
1132         memset(fec, 0, sizeof(*fec));
1133
1134         ret = fec_alloc_descs(fec);
1135         if (ret)
1136                 goto err3;
1137
1138         edev->priv = fec;
1139         edev->init = fec_init;
1140         edev->send = fec_send;
1141         edev->recv = fec_recv;
1142         edev->halt = fec_halt;
1143         edev->write_hwaddr = fec_set_hwaddr;
1144
1145         fec->eth = (struct ethernet_regs *)(ulong)base_addr;
1146         fec->bd = bd;
1147
1148         fec->xcv_type = CONFIG_FEC_XCV_TYPE;
1149
1150         /* Reset chip. */
1151         writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_RESET, &fec->eth->ecntrl);
1152         start = get_timer(0);
1153         while (readl(&fec->eth->ecntrl) & FEC_ECNTRL_RESET) {
1154                 if (get_timer(start) > (CONFIG_SYS_HZ * 5)) {
1155                         printf("FEC MXC: Timeout resetting chip\n");
1156                         goto err4;
1157                 }
1158                 udelay(10);
1159         }
1160
1161         fec_reg_setup(fec);
1162         fec_set_dev_name(edev->name, dev_id);
1163         fec->dev_id = (dev_id == -1) ? 0 : dev_id;
1164         fec->bus = bus;
1165         fec_mii_setspeed(bus->priv);
1166 #ifdef CONFIG_PHYLIB
1167         fec->phydev = phydev;
1168         phy_connect_dev(phydev, edev);
1169         /* Configure phy */
1170         phy_config(phydev);
1171 #else
1172         fec->phy_id = phy_id;
1173 #endif
1174         eth_register(edev);
1175         /* only support one eth device, the index number pointed by dev_id */
1176         edev->index = fec->dev_id;
1177
1178         if (fec_get_hwaddr(fec->dev_id, ethaddr) == 0) {
1179                 debug("got MAC%d address from fuse: %pM\n", fec->dev_id, ethaddr);
1180                 memcpy(edev->enetaddr, ethaddr, 6);
1181                 if (fec->dev_id)
1182                         sprintf(mac, "eth%daddr", fec->dev_id);
1183                 else
1184                         strcpy(mac, "ethaddr");
1185                 if (!env_get(mac))
1186                         eth_env_set_enetaddr(mac, ethaddr);
1187         }
1188         return ret;
1189 err4:
1190         fec_free_descs(fec);
1191 err3:
1192         free(fec);
1193 err2:
1194         free(edev);
1195 err1:
1196         return ret;
1197 }
1198
1199 int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
1200 {
1201         uint32_t base_mii;
1202         struct mii_dev *bus = NULL;
1203 #ifdef CONFIG_PHYLIB
1204         struct phy_device *phydev = NULL;
1205 #endif
1206         int ret;
1207
1208         if (CONFIG_IS_ENABLED(IMX_MODULE_FUSE)) {
1209                 if (enet_fused((ulong)addr)) {
1210                         printf("SoC fuse indicates Ethernet@0x%x is unavailable.\n", addr);
1211                         return -ENODEV;
1212                 }
1213         }
1214
1215 #ifdef CONFIG_FEC_MXC_MDIO_BASE
1216         /*
1217          * The i.MX28 has two ethernet interfaces, but they are not equal.
1218          * Only the first one can access the MDIO bus.
1219          */
1220         base_mii = CONFIG_FEC_MXC_MDIO_BASE;
1221 #else
1222         base_mii = addr;
1223 #endif
1224         debug("eth_init: fec_probe(bd, %i, %i) @ %08x\n", dev_id, phy_id, addr);
1225         bus = fec_get_miibus(base_mii, dev_id);
1226         if (!bus)
1227                 return -ENOMEM;
1228 #ifdef CONFIG_PHYLIB
1229         phydev = phy_find_by_mask(bus, 1 << phy_id, PHY_INTERFACE_MODE_RGMII);
1230         if (!phydev) {
1231                 mdio_unregister(bus);
1232                 free(bus);
1233                 return -ENOMEM;
1234         }
1235         ret = fec_probe(bd, dev_id, addr, bus, phydev);
1236 #else
1237         ret = fec_probe(bd, dev_id, addr, bus, phy_id);
1238 #endif
1239         if (ret) {
1240 #ifdef CONFIG_PHYLIB
1241                 free(phydev);
1242 #endif
1243                 mdio_unregister(bus);
1244                 free(bus);
1245         }
1246         return ret;
1247 }
1248
1249 #ifdef CONFIG_FEC_MXC_PHYADDR
1250 int fecmxc_initialize(bd_t *bd)
1251 {
1252         return fecmxc_initialize_multi(bd, -1, CONFIG_FEC_MXC_PHYADDR,
1253                         IMX_FEC_BASE);
1254 }
1255 #endif
1256
1257 #ifndef CONFIG_PHYLIB
1258 int fecmxc_register_mii_postcall(struct eth_device *dev, int (*cb)(int))
1259 {
1260         struct fec_priv *fec = (struct fec_priv *)dev->priv;
1261         fec->mii_postcall = cb;
1262         return 0;
1263 }
1264 #endif
1265
1266 #else
1267
1268 static int fecmxc_read_rom_hwaddr(struct udevice *dev)
1269 {
1270         struct fec_priv *priv = dev_get_priv(dev);
1271         struct eth_pdata *pdata = dev_get_platdata(dev);
1272
1273         return fec_get_hwaddr(priv->dev_id, pdata->enetaddr);
1274 }
1275
1276 static int fecmxc_free_pkt(struct udevice *dev, uchar *packet, int length)
1277 {
1278         if (packet)
1279                 free(packet);
1280
1281         return 0;
1282 }
1283
1284 static const struct eth_ops fecmxc_ops = {
1285         .start                  = fecmxc_init,
1286         .send                   = fecmxc_send,
1287         .recv                   = fecmxc_recv,
1288         .free_pkt               = fecmxc_free_pkt,
1289         .stop                   = fecmxc_halt,
1290         .write_hwaddr           = fecmxc_set_hwaddr,
1291         .read_rom_hwaddr        = fecmxc_read_rom_hwaddr,
1292 };
1293
1294 static int device_get_phy_addr(struct udevice *dev)
1295 {
1296         struct ofnode_phandle_args phandle_args;
1297         int reg;
1298
1299         if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0,
1300                                        &phandle_args)) {
1301                 debug("Failed to find phy-handle");
1302                 return -ENODEV;
1303         }
1304
1305         reg = ofnode_read_u32_default(phandle_args.node, "reg", 0);
1306
1307         return reg;
1308 }
1309
1310 static int fec_phy_init(struct fec_priv *priv, struct udevice *dev)
1311 {
1312         struct phy_device *phydev;
1313         int addr;
1314
1315         addr = device_get_phy_addr(dev);
1316 #ifdef CONFIG_FEC_MXC_PHYADDR
1317         addr = CONFIG_FEC_MXC_PHYADDR;
1318 #endif
1319
1320         phydev = phy_connect(priv->bus, addr, dev, priv->interface);
1321         if (!phydev)
1322                 return -ENODEV;
1323
1324         priv->phydev = phydev;
1325         phy_config(phydev);
1326
1327         return 0;
1328 }
1329
1330 #if CONFIG_IS_ENABLED(DM_GPIO)
1331 /* FEC GPIO reset */
1332 static void fec_gpio_reset(struct fec_priv *priv)
1333 {
1334         debug("fec_gpio_reset: fec_gpio_reset(dev)\n");
1335         if (dm_gpio_is_valid(&priv->phy_reset_gpio)) {
1336                 dm_gpio_set_value(&priv->phy_reset_gpio, 1);
1337                 mdelay(priv->reset_delay);
1338                 dm_gpio_set_value(&priv->phy_reset_gpio, 0);
1339                 if (priv->reset_post_delay)
1340                         mdelay(priv->reset_post_delay);
1341         }
1342 }
1343 #endif
1344
1345 static int fecmxc_probe(struct udevice *dev)
1346 {
1347         struct eth_pdata *pdata = dev_get_platdata(dev);
1348         struct fec_priv *priv = dev_get_priv(dev);
1349         struct mii_dev *bus = NULL;
1350         uint32_t start;
1351         int ret;
1352
1353         if (CONFIG_IS_ENABLED(IMX_MODULE_FUSE)) {
1354                 if (enet_fused((ulong)priv->eth)) {
1355                         printf("SoC fuse indicates Ethernet@0x%lx is unavailable.\n", (ulong)priv->eth);
1356                         return -ENODEV;
1357                 }
1358         }
1359
1360         if (IS_ENABLED(CONFIG_IMX8)) {
1361                 ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk);
1362                 if (ret < 0) {
1363                         debug("Can't get FEC ipg clk: %d\n", ret);
1364                         return ret;
1365                 }
1366                 ret = clk_enable(&priv->ipg_clk);
1367                 if (ret < 0) {
1368                         debug("Can't enable FEC ipg clk: %d\n", ret);
1369                         return ret;
1370                 }
1371
1372                 priv->clk_rate = clk_get_rate(&priv->ipg_clk);
1373         } else if (CONFIG_IS_ENABLED(CLK_CCF)) {
1374                 ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk);
1375                 if (ret < 0) {
1376                         debug("Can't get FEC ipg clk: %d\n", ret);
1377                         return ret;
1378                 }
1379                 ret = clk_enable(&priv->ipg_clk);
1380                 if(ret)
1381                         return ret;
1382
1383                 ret = clk_get_by_name(dev, "ahb", &priv->ahb_clk);
1384                 if (ret < 0) {
1385                         debug("Can't get FEC ahb clk: %d\n", ret);
1386                         return ret;
1387                 }
1388                 ret = clk_enable(&priv->ahb_clk);
1389                 if (ret)
1390                         return ret;
1391
1392                 ret = clk_get_by_name(dev, "enet_out", &priv->clk_enet_out);
1393                 if (!ret) {
1394                         ret = clk_enable(&priv->clk_enet_out);
1395                         if (ret)
1396                                 return ret;
1397                 }
1398
1399                 ret = clk_get_by_name(dev, "enet_clk_ref", &priv->clk_ref);
1400                 if (!ret) {
1401                         ret = clk_enable(&priv->clk_ref);
1402                         if (ret)
1403                                 return ret;
1404                 }
1405
1406                 ret = clk_get_by_name(dev, "ptp", &priv->clk_ptp);
1407                 if (!ret) {
1408                         ret = clk_enable(&priv->clk_ptp);
1409                         if (ret)
1410                                 return ret;
1411                 }
1412
1413                 priv->clk_rate = clk_get_rate(&priv->ipg_clk);
1414         }
1415
1416         ret = fec_alloc_descs(priv);
1417         if (ret)
1418                 return ret;
1419
1420 #ifdef CONFIG_DM_REGULATOR
1421         if (priv->phy_supply) {
1422                 ret = regulator_set_enable(priv->phy_supply, true);
1423                 if (ret) {
1424                         printf("%s: Error enabling phy supply\n", dev->name);
1425                         return ret;
1426                 }
1427         }
1428 #endif
1429
1430 #if CONFIG_IS_ENABLED(DM_GPIO)
1431         fec_gpio_reset(priv);
1432 #endif
1433         /* Reset chip. */
1434         writel(readl(&priv->eth->ecntrl) | FEC_ECNTRL_RESET,
1435                &priv->eth->ecntrl);
1436         start = get_timer(0);
1437         while (readl(&priv->eth->ecntrl) & FEC_ECNTRL_RESET) {
1438                 if (get_timer(start) > (CONFIG_SYS_HZ * 5)) {
1439                         printf("FEC MXC: Timeout reseting chip\n");
1440                         goto err_timeout;
1441                 }
1442                 udelay(10);
1443         }
1444
1445         fec_reg_setup(priv);
1446
1447         priv->dev_id = dev->seq;
1448
1449 #ifdef CONFIG_DM_ETH_PHY
1450         bus = eth_phy_get_mdio_bus(dev);
1451 #endif
1452
1453         if (!bus) {
1454 #ifdef CONFIG_FEC_MXC_MDIO_BASE
1455                 bus = fec_get_miibus((ulong)CONFIG_FEC_MXC_MDIO_BASE, dev->seq);
1456 #else
1457                 bus = fec_get_miibus((ulong)priv->eth, dev->seq);
1458 #endif
1459         }
1460         if (!bus) {
1461                 ret = -ENOMEM;
1462                 goto err_mii;
1463         }
1464
1465 #ifdef CONFIG_DM_ETH_PHY
1466         eth_phy_set_mdio_bus(dev, bus);
1467 #endif
1468
1469         priv->bus = bus;
1470         priv->interface = pdata->phy_interface;
1471         switch (priv->interface) {
1472         case PHY_INTERFACE_MODE_MII:
1473                 priv->xcv_type = MII100;
1474                 break;
1475         case PHY_INTERFACE_MODE_RMII:
1476                 priv->xcv_type = RMII;
1477                 break;
1478         case PHY_INTERFACE_MODE_RGMII:
1479         case PHY_INTERFACE_MODE_RGMII_ID:
1480         case PHY_INTERFACE_MODE_RGMII_RXID:
1481         case PHY_INTERFACE_MODE_RGMII_TXID:
1482                 priv->xcv_type = RGMII;
1483                 break;
1484         default:
1485                 priv->xcv_type = CONFIG_FEC_XCV_TYPE;
1486                 printf("Unsupported interface type %d defaulting to %d\n",
1487                        priv->interface, priv->xcv_type);
1488                 break;
1489         }
1490
1491         ret = fec_phy_init(priv, dev);
1492         if (ret)
1493                 goto err_phy;
1494
1495         return 0;
1496
1497 err_phy:
1498         mdio_unregister(bus);
1499         free(bus);
1500 err_mii:
1501 err_timeout:
1502         fec_free_descs(priv);
1503         return ret;
1504 }
1505
1506 static int fecmxc_remove(struct udevice *dev)
1507 {
1508         struct fec_priv *priv = dev_get_priv(dev);
1509
1510         free(priv->phydev);
1511         fec_free_descs(priv);
1512         mdio_unregister(priv->bus);
1513         mdio_free(priv->bus);
1514
1515 #ifdef CONFIG_DM_REGULATOR
1516         if (priv->phy_supply)
1517                 regulator_set_enable(priv->phy_supply, false);
1518 #endif
1519
1520         return 0;
1521 }
1522
1523 static int fecmxc_ofdata_to_platdata(struct udevice *dev)
1524 {
1525         int ret = 0;
1526         struct eth_pdata *pdata = dev_get_platdata(dev);
1527         struct fec_priv *priv = dev_get_priv(dev);
1528         const char *phy_mode;
1529
1530         pdata->iobase = (phys_addr_t)devfdt_get_addr(dev);
1531         priv->eth = (struct ethernet_regs *)pdata->iobase;
1532
1533         pdata->phy_interface = -1;
1534         phy_mode = fdt_getprop(gd->fdt_blob, dev_of_offset(dev), "phy-mode",
1535                                NULL);
1536         if (phy_mode)
1537                 pdata->phy_interface = phy_get_interface_by_name(phy_mode);
1538         if (pdata->phy_interface == -1) {
1539                 debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
1540                 return -EINVAL;
1541         }
1542
1543 #ifdef CONFIG_DM_REGULATOR
1544         device_get_supply_regulator(dev, "phy-supply", &priv->phy_supply);
1545 #endif
1546
1547 #if CONFIG_IS_ENABLED(DM_GPIO)
1548         ret = gpio_request_by_name(dev, "phy-reset-gpios", 0,
1549                                    &priv->phy_reset_gpio, GPIOD_IS_OUT);
1550         if (ret < 0)
1551                 return 0; /* property is optional, don't return error! */
1552
1553         priv->reset_delay = dev_read_u32_default(dev, "phy-reset-duration", 1);
1554         if (priv->reset_delay > 1000) {
1555                 printf("FEC MXC: phy reset duration should be <= 1000ms\n");
1556                 /* property value wrong, use default value */
1557                 priv->reset_delay = 1;
1558         }
1559
1560         priv->reset_post_delay = dev_read_u32_default(dev,
1561                                                       "phy-reset-post-delay",
1562                                                       0);
1563         if (priv->reset_post_delay > 1000) {
1564                 printf("FEC MXC: phy reset post delay should be <= 1000ms\n");
1565                 /* property value wrong, use default value */
1566                 priv->reset_post_delay = 0;
1567         }
1568 #endif
1569
1570         return 0;
1571 }
1572
1573 static const struct udevice_id fecmxc_ids[] = {
1574         { .compatible = "fsl,imx28-fec" },
1575         { .compatible = "fsl,imx6q-fec" },
1576         { .compatible = "fsl,imx6sl-fec" },
1577         { .compatible = "fsl,imx6sx-fec" },
1578         { .compatible = "fsl,imx6ul-fec" },
1579         { .compatible = "fsl,imx53-fec" },
1580         { .compatible = "fsl,imx7d-fec" },
1581         { .compatible = "fsl,mvf600-fec" },
1582         { }
1583 };
1584
1585 U_BOOT_DRIVER(fecmxc_gem) = {
1586         .name   = "fecmxc",
1587         .id     = UCLASS_ETH,
1588         .of_match = fecmxc_ids,
1589         .ofdata_to_platdata = fecmxc_ofdata_to_platdata,
1590         .probe  = fecmxc_probe,
1591         .remove = fecmxc_remove,
1592         .ops    = &fecmxc_ops,
1593         .priv_auto_alloc_size = sizeof(struct fec_priv),
1594         .platdata_auto_alloc_size = sizeof(struct eth_pdata),
1595 };
1596 #endif