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