xref: /openbmc/u-boot/drivers/net/macb.c (revision c2147e26)
1 /*
2  * Copyright (C) 2005-2006 Atmel Corporation
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 #include <common.h>
7 #include <dm.h>
8 
9 /*
10  * The u-boot networking stack is a little weird.  It seems like the
11  * networking core allocates receive buffers up front without any
12  * regard to the hardware that's supposed to actually receive those
13  * packets.
14  *
15  * The MACB receives packets into 128-byte receive buffers, so the
16  * buffers allocated by the core isn't very practical to use.  We'll
17  * allocate our own, but we need one such buffer in case a packet
18  * wraps around the DMA ring so that we have to copy it.
19  *
20  * Therefore, define CONFIG_SYS_RX_ETH_BUFFER to 1 in the board-specific
21  * configuration header.  This way, the core allocates one RX buffer
22  * and one TX buffer, each of which can hold a ethernet packet of
23  * maximum size.
24  *
25  * For some reason, the networking core unconditionally specifies a
26  * 32-byte packet "alignment" (which really should be called
27  * "padding").  MACB shouldn't need that, but we'll refrain from any
28  * core modifications here...
29  */
30 
31 #include <net.h>
32 #ifndef CONFIG_DM_ETH
33 #include <netdev.h>
34 #endif
35 #include <malloc.h>
36 #include <miiphy.h>
37 
38 #include <linux/mii.h>
39 #include <asm/io.h>
40 #include <asm/dma-mapping.h>
41 #include <asm/arch/clk.h>
42 #include <asm-generic/errno.h>
43 
44 #include "macb.h"
45 
46 DECLARE_GLOBAL_DATA_PTR;
47 
48 #define MACB_RX_BUFFER_SIZE		4096
49 #define MACB_RX_RING_SIZE		(MACB_RX_BUFFER_SIZE / 128)
50 #define MACB_TX_RING_SIZE		16
51 #define MACB_TX_TIMEOUT		1000
52 #define MACB_AUTONEG_TIMEOUT	5000000
53 
54 struct macb_dma_desc {
55 	u32	addr;
56 	u32	ctrl;
57 };
58 
59 #define DMA_DESC_BYTES(n)	(n * sizeof(struct macb_dma_desc))
60 #define MACB_TX_DMA_DESC_SIZE	(DMA_DESC_BYTES(MACB_TX_RING_SIZE))
61 #define MACB_RX_DMA_DESC_SIZE	(DMA_DESC_BYTES(MACB_RX_RING_SIZE))
62 #define MACB_TX_DUMMY_DMA_DESC_SIZE	(DMA_DESC_BYTES(1))
63 
64 #define RXADDR_USED		0x00000001
65 #define RXADDR_WRAP		0x00000002
66 
67 #define RXBUF_FRMLEN_MASK	0x00000fff
68 #define RXBUF_FRAME_START	0x00004000
69 #define RXBUF_FRAME_END		0x00008000
70 #define RXBUF_TYPEID_MATCH	0x00400000
71 #define RXBUF_ADDR4_MATCH	0x00800000
72 #define RXBUF_ADDR3_MATCH	0x01000000
73 #define RXBUF_ADDR2_MATCH	0x02000000
74 #define RXBUF_ADDR1_MATCH	0x04000000
75 #define RXBUF_BROADCAST		0x80000000
76 
77 #define TXBUF_FRMLEN_MASK	0x000007ff
78 #define TXBUF_FRAME_END		0x00008000
79 #define TXBUF_NOCRC		0x00010000
80 #define TXBUF_EXHAUSTED		0x08000000
81 #define TXBUF_UNDERRUN		0x10000000
82 #define TXBUF_MAXRETRY		0x20000000
83 #define TXBUF_WRAP		0x40000000
84 #define TXBUF_USED		0x80000000
85 
86 struct macb_device {
87 	void			*regs;
88 
89 	unsigned int		rx_tail;
90 	unsigned int		tx_head;
91 	unsigned int		tx_tail;
92 	unsigned int		next_rx_tail;
93 	bool			wrapped;
94 
95 	void			*rx_buffer;
96 	void			*tx_buffer;
97 	struct macb_dma_desc	*rx_ring;
98 	struct macb_dma_desc	*tx_ring;
99 
100 	unsigned long		rx_buffer_dma;
101 	unsigned long		rx_ring_dma;
102 	unsigned long		tx_ring_dma;
103 
104 	struct macb_dma_desc	*dummy_desc;
105 	unsigned long		dummy_desc_dma;
106 
107 	const struct device	*dev;
108 #ifndef CONFIG_DM_ETH
109 	struct eth_device	netdev;
110 #endif
111 	unsigned short		phy_addr;
112 	struct mii_dev		*bus;
113 
114 #ifdef CONFIG_DM_ETH
115 	phy_interface_t		phy_interface;
116 #endif
117 };
118 #ifndef CONFIG_DM_ETH
119 #define to_macb(_nd) container_of(_nd, struct macb_device, netdev)
120 #endif
121 
122 static int macb_is_gem(struct macb_device *macb)
123 {
124 	return MACB_BFEXT(IDNUM, macb_readl(macb, MID)) == 0x2;
125 }
126 
127 #ifndef cpu_is_sama5d2
128 #define cpu_is_sama5d2() 0
129 #endif
130 
131 #ifndef cpu_is_sama5d4
132 #define cpu_is_sama5d4() 0
133 #endif
134 
135 static int gem_is_gigabit_capable(struct macb_device *macb)
136 {
137 	/*
138 	 * The GEM controllers embedded in SAMA5D2 and SAMA5D4 are
139 	 * configured to support only 10/100.
140 	 */
141 	return macb_is_gem(macb) && !cpu_is_sama5d2() && !cpu_is_sama5d4();
142 }
143 
144 static void macb_mdio_write(struct macb_device *macb, u8 reg, u16 value)
145 {
146 	unsigned long netctl;
147 	unsigned long netstat;
148 	unsigned long frame;
149 
150 	netctl = macb_readl(macb, NCR);
151 	netctl |= MACB_BIT(MPE);
152 	macb_writel(macb, NCR, netctl);
153 
154 	frame = (MACB_BF(SOF, 1)
155 		 | MACB_BF(RW, 1)
156 		 | MACB_BF(PHYA, macb->phy_addr)
157 		 | MACB_BF(REGA, reg)
158 		 | MACB_BF(CODE, 2)
159 		 | MACB_BF(DATA, value));
160 	macb_writel(macb, MAN, frame);
161 
162 	do {
163 		netstat = macb_readl(macb, NSR);
164 	} while (!(netstat & MACB_BIT(IDLE)));
165 
166 	netctl = macb_readl(macb, NCR);
167 	netctl &= ~MACB_BIT(MPE);
168 	macb_writel(macb, NCR, netctl);
169 }
170 
171 static u16 macb_mdio_read(struct macb_device *macb, u8 reg)
172 {
173 	unsigned long netctl;
174 	unsigned long netstat;
175 	unsigned long frame;
176 
177 	netctl = macb_readl(macb, NCR);
178 	netctl |= MACB_BIT(MPE);
179 	macb_writel(macb, NCR, netctl);
180 
181 	frame = (MACB_BF(SOF, 1)
182 		 | MACB_BF(RW, 2)
183 		 | MACB_BF(PHYA, macb->phy_addr)
184 		 | MACB_BF(REGA, reg)
185 		 | MACB_BF(CODE, 2));
186 	macb_writel(macb, MAN, frame);
187 
188 	do {
189 		netstat = macb_readl(macb, NSR);
190 	} while (!(netstat & MACB_BIT(IDLE)));
191 
192 	frame = macb_readl(macb, MAN);
193 
194 	netctl = macb_readl(macb, NCR);
195 	netctl &= ~MACB_BIT(MPE);
196 	macb_writel(macb, NCR, netctl);
197 
198 	return MACB_BFEXT(DATA, frame);
199 }
200 
201 void __weak arch_get_mdio_control(const char *name)
202 {
203 	return;
204 }
205 
206 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
207 
208 int macb_miiphy_read(struct mii_dev *bus, int phy_adr, int devad, int reg)
209 {
210 	u16 value = 0;
211 #ifdef CONFIG_DM_ETH
212 	struct udevice *dev = eth_get_dev_by_name(bus->name);
213 	struct macb_device *macb = dev_get_priv(dev);
214 #else
215 	struct eth_device *dev = eth_get_dev_by_name(bus->name);
216 	struct macb_device *macb = to_macb(dev);
217 #endif
218 
219 	if (macb->phy_addr != phy_adr)
220 		return -1;
221 
222 	arch_get_mdio_control(bus->name);
223 	value = macb_mdio_read(macb, reg);
224 
225 	return value;
226 }
227 
228 int macb_miiphy_write(struct mii_dev *bus, int phy_adr, int devad, int reg,
229 		      u16 value)
230 {
231 #ifdef CONFIG_DM_ETH
232 	struct udevice *dev = eth_get_dev_by_name(bus->name);
233 	struct macb_device *macb = dev_get_priv(dev);
234 #else
235 	struct eth_device *dev = eth_get_dev_by_name(bus->name);
236 	struct macb_device *macb = to_macb(dev);
237 #endif
238 
239 	if (macb->phy_addr != phy_adr)
240 		return -1;
241 
242 	arch_get_mdio_control(bus->name);
243 	macb_mdio_write(macb, reg, value);
244 
245 	return 0;
246 }
247 #endif
248 
249 #define RX	1
250 #define TX	0
251 static inline void macb_invalidate_ring_desc(struct macb_device *macb, bool rx)
252 {
253 	if (rx)
254 		invalidate_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
255 			MACB_RX_DMA_DESC_SIZE);
256 	else
257 		invalidate_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
258 			MACB_TX_DMA_DESC_SIZE);
259 }
260 
261 static inline void macb_flush_ring_desc(struct macb_device *macb, bool rx)
262 {
263 	if (rx)
264 		flush_dcache_range(macb->rx_ring_dma, macb->rx_ring_dma +
265 			MACB_RX_DMA_DESC_SIZE);
266 	else
267 		flush_dcache_range(macb->tx_ring_dma, macb->tx_ring_dma +
268 			MACB_TX_DMA_DESC_SIZE);
269 }
270 
271 static inline void macb_flush_rx_buffer(struct macb_device *macb)
272 {
273 	flush_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma +
274 				MACB_RX_BUFFER_SIZE);
275 }
276 
277 static inline void macb_invalidate_rx_buffer(struct macb_device *macb)
278 {
279 	invalidate_dcache_range(macb->rx_buffer_dma, macb->rx_buffer_dma +
280 				MACB_RX_BUFFER_SIZE);
281 }
282 
283 #if defined(CONFIG_CMD_NET)
284 
285 static int _macb_send(struct macb_device *macb, const char *name, void *packet,
286 		      int length)
287 {
288 	unsigned long paddr, ctrl;
289 	unsigned int tx_head = macb->tx_head;
290 	int i;
291 
292 	paddr = dma_map_single(packet, length, DMA_TO_DEVICE);
293 
294 	ctrl = length & TXBUF_FRMLEN_MASK;
295 	ctrl |= TXBUF_FRAME_END;
296 	if (tx_head == (MACB_TX_RING_SIZE - 1)) {
297 		ctrl |= TXBUF_WRAP;
298 		macb->tx_head = 0;
299 	} else {
300 		macb->tx_head++;
301 	}
302 
303 	macb->tx_ring[tx_head].ctrl = ctrl;
304 	macb->tx_ring[tx_head].addr = paddr;
305 	barrier();
306 	macb_flush_ring_desc(macb, TX);
307 	/* Do we need check paddr and length is dcache line aligned? */
308 	flush_dcache_range(paddr, paddr + ALIGN(length, ARCH_DMA_MINALIGN));
309 	macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(TSTART));
310 
311 	/*
312 	 * I guess this is necessary because the networking core may
313 	 * re-use the transmit buffer as soon as we return...
314 	 */
315 	for (i = 0; i <= MACB_TX_TIMEOUT; i++) {
316 		barrier();
317 		macb_invalidate_ring_desc(macb, TX);
318 		ctrl = macb->tx_ring[tx_head].ctrl;
319 		if (ctrl & TXBUF_USED)
320 			break;
321 		udelay(1);
322 	}
323 
324 	dma_unmap_single(packet, length, paddr);
325 
326 	if (i <= MACB_TX_TIMEOUT) {
327 		if (ctrl & TXBUF_UNDERRUN)
328 			printf("%s: TX underrun\n", name);
329 		if (ctrl & TXBUF_EXHAUSTED)
330 			printf("%s: TX buffers exhausted in mid frame\n", name);
331 	} else {
332 		printf("%s: TX timeout\n", name);
333 	}
334 
335 	/* No one cares anyway */
336 	return 0;
337 }
338 
339 static void reclaim_rx_buffers(struct macb_device *macb,
340 			       unsigned int new_tail)
341 {
342 	unsigned int i;
343 
344 	i = macb->rx_tail;
345 
346 	macb_invalidate_ring_desc(macb, RX);
347 	while (i > new_tail) {
348 		macb->rx_ring[i].addr &= ~RXADDR_USED;
349 		i++;
350 		if (i > MACB_RX_RING_SIZE)
351 			i = 0;
352 	}
353 
354 	while (i < new_tail) {
355 		macb->rx_ring[i].addr &= ~RXADDR_USED;
356 		i++;
357 	}
358 
359 	barrier();
360 	macb_flush_ring_desc(macb, RX);
361 	macb->rx_tail = new_tail;
362 }
363 
364 static int _macb_recv(struct macb_device *macb, uchar **packetp)
365 {
366 	unsigned int next_rx_tail = macb->next_rx_tail;
367 	void *buffer;
368 	int length;
369 	u32 status;
370 
371 	macb->wrapped = false;
372 	for (;;) {
373 		macb_invalidate_ring_desc(macb, RX);
374 
375 		if (!(macb->rx_ring[next_rx_tail].addr & RXADDR_USED))
376 			return -EAGAIN;
377 
378 		status = macb->rx_ring[next_rx_tail].ctrl;
379 		if (status & RXBUF_FRAME_START) {
380 			if (next_rx_tail != macb->rx_tail)
381 				reclaim_rx_buffers(macb, next_rx_tail);
382 			macb->wrapped = false;
383 		}
384 
385 		if (status & RXBUF_FRAME_END) {
386 			buffer = macb->rx_buffer + 128 * macb->rx_tail;
387 			length = status & RXBUF_FRMLEN_MASK;
388 
389 			macb_invalidate_rx_buffer(macb);
390 			if (macb->wrapped) {
391 				unsigned int headlen, taillen;
392 
393 				headlen = 128 * (MACB_RX_RING_SIZE
394 						 - macb->rx_tail);
395 				taillen = length - headlen;
396 				memcpy((void *)net_rx_packets[0],
397 				       buffer, headlen);
398 				memcpy((void *)net_rx_packets[0] + headlen,
399 				       macb->rx_buffer, taillen);
400 				*packetp = (void *)net_rx_packets[0];
401 			} else {
402 				*packetp = buffer;
403 			}
404 
405 			if (++next_rx_tail >= MACB_RX_RING_SIZE)
406 				next_rx_tail = 0;
407 			macb->next_rx_tail = next_rx_tail;
408 			return length;
409 		} else {
410 			if (++next_rx_tail >= MACB_RX_RING_SIZE) {
411 				macb->wrapped = true;
412 				next_rx_tail = 0;
413 			}
414 		}
415 		barrier();
416 	}
417 }
418 
419 static void macb_phy_reset(struct macb_device *macb, const char *name)
420 {
421 	int i;
422 	u16 status, adv;
423 
424 	adv = ADVERTISE_CSMA | ADVERTISE_ALL;
425 	macb_mdio_write(macb, MII_ADVERTISE, adv);
426 	printf("%s: Starting autonegotiation...\n", name);
427 	macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE
428 					 | BMCR_ANRESTART));
429 
430 	for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
431 		status = macb_mdio_read(macb, MII_BMSR);
432 		if (status & BMSR_ANEGCOMPLETE)
433 			break;
434 		udelay(100);
435 	}
436 
437 	if (status & BMSR_ANEGCOMPLETE)
438 		printf("%s: Autonegotiation complete\n", name);
439 	else
440 		printf("%s: Autonegotiation timed out (status=0x%04x)\n",
441 		       name, status);
442 }
443 
444 #ifdef CONFIG_MACB_SEARCH_PHY
445 static int macb_phy_find(struct macb_device *macb, const char *name)
446 {
447 	int i;
448 	u16 phy_id;
449 
450 	/* Search for PHY... */
451 	for (i = 0; i < 32; i++) {
452 		macb->phy_addr = i;
453 		phy_id = macb_mdio_read(macb, MII_PHYSID1);
454 		if (phy_id != 0xffff) {
455 			printf("%s: PHY present at %d\n", name, i);
456 			return 1;
457 		}
458 	}
459 
460 	/* PHY isn't up to snuff */
461 	printf("%s: PHY not found\n", name);
462 
463 	return 0;
464 }
465 #endif /* CONFIG_MACB_SEARCH_PHY */
466 
467 #ifdef CONFIG_DM_ETH
468 static int macb_phy_init(struct udevice *dev, const char *name)
469 #else
470 static int macb_phy_init(struct macb_device *macb, const char *name)
471 #endif
472 {
473 #ifdef CONFIG_DM_ETH
474 	struct macb_device *macb = dev_get_priv(dev);
475 #endif
476 #ifdef CONFIG_PHYLIB
477 	struct phy_device *phydev;
478 #endif
479 	u32 ncfgr;
480 	u16 phy_id, status, adv, lpa;
481 	int media, speed, duplex;
482 	int i;
483 
484 	arch_get_mdio_control(name);
485 #ifdef CONFIG_MACB_SEARCH_PHY
486 	/* Auto-detect phy_addr */
487 	if (!macb_phy_find(macb, name))
488 		return 0;
489 #endif /* CONFIG_MACB_SEARCH_PHY */
490 
491 	/* Check if the PHY is up to snuff... */
492 	phy_id = macb_mdio_read(macb, MII_PHYSID1);
493 	if (phy_id == 0xffff) {
494 		printf("%s: No PHY present\n", name);
495 		return 0;
496 	}
497 
498 #ifdef CONFIG_PHYLIB
499 #ifdef CONFIG_DM_ETH
500 	phydev = phy_connect(macb->bus, macb->phy_addr, dev,
501 			     macb->phy_interface);
502 #else
503 	/* need to consider other phy interface mode */
504 	phydev = phy_connect(macb->bus, macb->phy_addr, &macb->netdev,
505 			     PHY_INTERFACE_MODE_RGMII);
506 #endif
507 	if (!phydev) {
508 		printf("phy_connect failed\n");
509 		return -ENODEV;
510 	}
511 
512 	phy_config(phydev);
513 #endif
514 
515 	status = macb_mdio_read(macb, MII_BMSR);
516 	if (!(status & BMSR_LSTATUS)) {
517 		/* Try to re-negotiate if we don't have link already. */
518 		macb_phy_reset(macb, name);
519 
520 		for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) {
521 			status = macb_mdio_read(macb, MII_BMSR);
522 			if (status & BMSR_LSTATUS)
523 				break;
524 			udelay(100);
525 		}
526 	}
527 
528 	if (!(status & BMSR_LSTATUS)) {
529 		printf("%s: link down (status: 0x%04x)\n",
530 		       name, status);
531 		return 0;
532 	}
533 
534 	/* First check for GMAC and that it is GiB capable */
535 	if (gem_is_gigabit_capable(macb)) {
536 		lpa = macb_mdio_read(macb, MII_STAT1000);
537 
538 		if (lpa & (LPA_1000FULL | LPA_1000HALF)) {
539 			duplex = ((lpa & LPA_1000FULL) ? 1 : 0);
540 
541 			printf("%s: link up, 1000Mbps %s-duplex (lpa: 0x%04x)\n",
542 			       name,
543 			       duplex ? "full" : "half",
544 			       lpa);
545 
546 			ncfgr = macb_readl(macb, NCFGR);
547 			ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
548 			ncfgr |= GEM_BIT(GBE);
549 
550 			if (duplex)
551 				ncfgr |= MACB_BIT(FD);
552 
553 			macb_writel(macb, NCFGR, ncfgr);
554 
555 			return 1;
556 		}
557 	}
558 
559 	/* fall back for EMAC checking */
560 	adv = macb_mdio_read(macb, MII_ADVERTISE);
561 	lpa = macb_mdio_read(macb, MII_LPA);
562 	media = mii_nway_result(lpa & adv);
563 	speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF)
564 		 ? 1 : 0);
565 	duplex = (media & ADVERTISE_FULL) ? 1 : 0;
566 	printf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n",
567 	       name,
568 	       speed ? "100" : "10",
569 	       duplex ? "full" : "half",
570 	       lpa);
571 
572 	ncfgr = macb_readl(macb, NCFGR);
573 	ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD) | GEM_BIT(GBE));
574 	if (speed)
575 		ncfgr |= MACB_BIT(SPD);
576 	if (duplex)
577 		ncfgr |= MACB_BIT(FD);
578 	macb_writel(macb, NCFGR, ncfgr);
579 
580 	return 1;
581 }
582 
583 static int gmac_init_multi_queues(struct macb_device *macb)
584 {
585 	int i, num_queues = 1;
586 	u32 queue_mask;
587 
588 	/* bit 0 is never set but queue 0 always exists */
589 	queue_mask = gem_readl(macb, DCFG6) & 0xff;
590 	queue_mask |= 0x1;
591 
592 	for (i = 1; i < MACB_MAX_QUEUES; i++)
593 		if (queue_mask & (1 << i))
594 			num_queues++;
595 
596 	macb->dummy_desc->ctrl = TXBUF_USED;
597 	macb->dummy_desc->addr = 0;
598 	flush_dcache_range(macb->dummy_desc_dma, macb->dummy_desc_dma +
599 			MACB_TX_DUMMY_DMA_DESC_SIZE);
600 
601 	for (i = 1; i < num_queues; i++)
602 		gem_writel_queue_TBQP(macb, macb->dummy_desc_dma, i - 1);
603 
604 	return 0;
605 }
606 
607 #ifdef CONFIG_DM_ETH
608 static int _macb_init(struct udevice *dev, const char *name)
609 #else
610 static int _macb_init(struct macb_device *macb, const char *name)
611 #endif
612 {
613 #ifdef CONFIG_DM_ETH
614 	struct macb_device *macb = dev_get_priv(dev);
615 #endif
616 	unsigned long paddr;
617 	int i;
618 
619 	/*
620 	 * macb_halt should have been called at some point before now,
621 	 * so we'll assume the controller is idle.
622 	 */
623 
624 	/* initialize DMA descriptors */
625 	paddr = macb->rx_buffer_dma;
626 	for (i = 0; i < MACB_RX_RING_SIZE; i++) {
627 		if (i == (MACB_RX_RING_SIZE - 1))
628 			paddr |= RXADDR_WRAP;
629 		macb->rx_ring[i].addr = paddr;
630 		macb->rx_ring[i].ctrl = 0;
631 		paddr += 128;
632 	}
633 	macb_flush_ring_desc(macb, RX);
634 	macb_flush_rx_buffer(macb);
635 
636 	for (i = 0; i < MACB_TX_RING_SIZE; i++) {
637 		macb->tx_ring[i].addr = 0;
638 		if (i == (MACB_TX_RING_SIZE - 1))
639 			macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP;
640 		else
641 			macb->tx_ring[i].ctrl = TXBUF_USED;
642 	}
643 	macb_flush_ring_desc(macb, TX);
644 
645 	macb->rx_tail = 0;
646 	macb->tx_head = 0;
647 	macb->tx_tail = 0;
648 	macb->next_rx_tail = 0;
649 
650 	macb_writel(macb, RBQP, macb->rx_ring_dma);
651 	macb_writel(macb, TBQP, macb->tx_ring_dma);
652 
653 	if (macb_is_gem(macb)) {
654 		/* Check the multi queue and initialize the queue for tx */
655 		gmac_init_multi_queues(macb);
656 
657 		/*
658 		 * When the GMAC IP with GE feature, this bit is used to
659 		 * select interface between RGMII and GMII.
660 		 * When the GMAC IP without GE feature, this bit is used
661 		 * to select interface between RMII and MII.
662 		 */
663 #ifdef CONFIG_DM_ETH
664 		if (macb->phy_interface == PHY_INTERFACE_MODE_RMII)
665 			gem_writel(macb, UR, GEM_BIT(RGMII));
666 		else
667 			gem_writel(macb, UR, 0);
668 #else
669 #if defined(CONFIG_RGMII) || defined(CONFIG_RMII)
670 		gem_writel(macb, UR, GEM_BIT(RGMII));
671 #else
672 		gem_writel(macb, UR, 0);
673 #endif
674 #endif
675 	} else {
676 	/* choose RMII or MII mode. This depends on the board */
677 #ifdef CONFIG_DM_ETH
678 #ifdef CONFIG_AT91FAMILY
679 		if (macb->phy_interface == PHY_INTERFACE_MODE_RMII) {
680 			macb_writel(macb, USRIO,
681 				    MACB_BIT(RMII) | MACB_BIT(CLKEN));
682 		} else {
683 			macb_writel(macb, USRIO, MACB_BIT(CLKEN));
684 		}
685 #else
686 		if (macb->phy_interface == PHY_INTERFACE_MODE_RMII)
687 			macb_writel(macb, USRIO, 0);
688 		else
689 			macb_writel(macb, USRIO, MACB_BIT(MII));
690 #endif
691 #else
692 #ifdef CONFIG_RMII
693 #ifdef CONFIG_AT91FAMILY
694 	macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
695 #else
696 	macb_writel(macb, USRIO, 0);
697 #endif
698 #else
699 #ifdef CONFIG_AT91FAMILY
700 	macb_writel(macb, USRIO, MACB_BIT(CLKEN));
701 #else
702 	macb_writel(macb, USRIO, MACB_BIT(MII));
703 #endif
704 #endif /* CONFIG_RMII */
705 #endif
706 	}
707 
708 #ifdef CONFIG_DM_ETH
709 	if (!macb_phy_init(dev, name))
710 #else
711 	if (!macb_phy_init(macb, name))
712 #endif
713 		return -1;
714 
715 	/* Enable TX and RX */
716 	macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE));
717 
718 	return 0;
719 }
720 
721 static void _macb_halt(struct macb_device *macb)
722 {
723 	u32 ncr, tsr;
724 
725 	/* Halt the controller and wait for any ongoing transmission to end. */
726 	ncr = macb_readl(macb, NCR);
727 	ncr |= MACB_BIT(THALT);
728 	macb_writel(macb, NCR, ncr);
729 
730 	do {
731 		tsr = macb_readl(macb, TSR);
732 	} while (tsr & MACB_BIT(TGO));
733 
734 	/* Disable TX and RX, and clear statistics */
735 	macb_writel(macb, NCR, MACB_BIT(CLRSTAT));
736 }
737 
738 static int _macb_write_hwaddr(struct macb_device *macb, unsigned char *enetaddr)
739 {
740 	u32 hwaddr_bottom;
741 	u16 hwaddr_top;
742 
743 	/* set hardware address */
744 	hwaddr_bottom = enetaddr[0] | enetaddr[1] << 8 |
745 			enetaddr[2] << 16 | enetaddr[3] << 24;
746 	macb_writel(macb, SA1B, hwaddr_bottom);
747 	hwaddr_top = enetaddr[4] | enetaddr[5] << 8;
748 	macb_writel(macb, SA1T, hwaddr_top);
749 	return 0;
750 }
751 
752 static u32 macb_mdc_clk_div(int id, struct macb_device *macb)
753 {
754 	u32 config;
755 	unsigned long macb_hz = get_macb_pclk_rate(id);
756 
757 	if (macb_hz < 20000000)
758 		config = MACB_BF(CLK, MACB_CLK_DIV8);
759 	else if (macb_hz < 40000000)
760 		config = MACB_BF(CLK, MACB_CLK_DIV16);
761 	else if (macb_hz < 80000000)
762 		config = MACB_BF(CLK, MACB_CLK_DIV32);
763 	else
764 		config = MACB_BF(CLK, MACB_CLK_DIV64);
765 
766 	return config;
767 }
768 
769 static u32 gem_mdc_clk_div(int id, struct macb_device *macb)
770 {
771 	u32 config;
772 	unsigned long macb_hz = get_macb_pclk_rate(id);
773 
774 	if (macb_hz < 20000000)
775 		config = GEM_BF(CLK, GEM_CLK_DIV8);
776 	else if (macb_hz < 40000000)
777 		config = GEM_BF(CLK, GEM_CLK_DIV16);
778 	else if (macb_hz < 80000000)
779 		config = GEM_BF(CLK, GEM_CLK_DIV32);
780 	else if (macb_hz < 120000000)
781 		config = GEM_BF(CLK, GEM_CLK_DIV48);
782 	else if (macb_hz < 160000000)
783 		config = GEM_BF(CLK, GEM_CLK_DIV64);
784 	else
785 		config = GEM_BF(CLK, GEM_CLK_DIV96);
786 
787 	return config;
788 }
789 
790 /*
791  * Get the DMA bus width field of the network configuration register that we
792  * should program. We find the width from decoding the design configuration
793  * register to find the maximum supported data bus width.
794  */
795 static u32 macb_dbw(struct macb_device *macb)
796 {
797 	switch (GEM_BFEXT(DBWDEF, gem_readl(macb, DCFG1))) {
798 	case 4:
799 		return GEM_BF(DBW, GEM_DBW128);
800 	case 2:
801 		return GEM_BF(DBW, GEM_DBW64);
802 	case 1:
803 	default:
804 		return GEM_BF(DBW, GEM_DBW32);
805 	}
806 }
807 
808 static void _macb_eth_initialize(struct macb_device *macb)
809 {
810 	int id = 0;	/* This is not used by functions we call */
811 	u32 ncfgr;
812 
813 	/* TODO: we need check the rx/tx_ring_dma is dcache line aligned */
814 	macb->rx_buffer = dma_alloc_coherent(MACB_RX_BUFFER_SIZE,
815 					     &macb->rx_buffer_dma);
816 	macb->rx_ring = dma_alloc_coherent(MACB_RX_DMA_DESC_SIZE,
817 					   &macb->rx_ring_dma);
818 	macb->tx_ring = dma_alloc_coherent(MACB_TX_DMA_DESC_SIZE,
819 					   &macb->tx_ring_dma);
820 	macb->dummy_desc = dma_alloc_coherent(MACB_TX_DUMMY_DMA_DESC_SIZE,
821 					   &macb->dummy_desc_dma);
822 
823 	/*
824 	 * Do some basic initialization so that we at least can talk
825 	 * to the PHY
826 	 */
827 	if (macb_is_gem(macb)) {
828 		ncfgr = gem_mdc_clk_div(id, macb);
829 		ncfgr |= macb_dbw(macb);
830 	} else {
831 		ncfgr = macb_mdc_clk_div(id, macb);
832 	}
833 
834 	macb_writel(macb, NCFGR, ncfgr);
835 }
836 
837 #ifndef CONFIG_DM_ETH
838 static int macb_send(struct eth_device *netdev, void *packet, int length)
839 {
840 	struct macb_device *macb = to_macb(netdev);
841 
842 	return _macb_send(macb, netdev->name, packet, length);
843 }
844 
845 static int macb_recv(struct eth_device *netdev)
846 {
847 	struct macb_device *macb = to_macb(netdev);
848 	uchar *packet;
849 	int length;
850 
851 	macb->wrapped = false;
852 	for (;;) {
853 		macb->next_rx_tail = macb->rx_tail;
854 		length = _macb_recv(macb, &packet);
855 		if (length >= 0) {
856 			net_process_received_packet(packet, length);
857 			reclaim_rx_buffers(macb, macb->next_rx_tail);
858 		} else if (length < 0) {
859 			return length;
860 		}
861 	}
862 }
863 
864 static int macb_init(struct eth_device *netdev, bd_t *bd)
865 {
866 	struct macb_device *macb = to_macb(netdev);
867 
868 	return _macb_init(macb, netdev->name);
869 }
870 
871 static void macb_halt(struct eth_device *netdev)
872 {
873 	struct macb_device *macb = to_macb(netdev);
874 
875 	return _macb_halt(macb);
876 }
877 
878 static int macb_write_hwaddr(struct eth_device *netdev)
879 {
880 	struct macb_device *macb = to_macb(netdev);
881 
882 	return _macb_write_hwaddr(macb, netdev->enetaddr);
883 }
884 
885 int macb_eth_initialize(int id, void *regs, unsigned int phy_addr)
886 {
887 	struct macb_device *macb;
888 	struct eth_device *netdev;
889 
890 	macb = malloc(sizeof(struct macb_device));
891 	if (!macb) {
892 		printf("Error: Failed to allocate memory for MACB%d\n", id);
893 		return -1;
894 	}
895 	memset(macb, 0, sizeof(struct macb_device));
896 
897 	netdev = &macb->netdev;
898 
899 	macb->regs = regs;
900 	macb->phy_addr = phy_addr;
901 
902 	if (macb_is_gem(macb))
903 		sprintf(netdev->name, "gmac%d", id);
904 	else
905 		sprintf(netdev->name, "macb%d", id);
906 
907 	netdev->init = macb_init;
908 	netdev->halt = macb_halt;
909 	netdev->send = macb_send;
910 	netdev->recv = macb_recv;
911 	netdev->write_hwaddr = macb_write_hwaddr;
912 
913 	_macb_eth_initialize(macb);
914 
915 	eth_register(netdev);
916 
917 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
918 	int retval;
919 	struct mii_dev *mdiodev = mdio_alloc();
920 	if (!mdiodev)
921 		return -ENOMEM;
922 	strncpy(mdiodev->name, netdev->name, MDIO_NAME_LEN);
923 	mdiodev->read = macb_miiphy_read;
924 	mdiodev->write = macb_miiphy_write;
925 
926 	retval = mdio_register(mdiodev);
927 	if (retval < 0)
928 		return retval;
929 	macb->bus = miiphy_get_dev_by_name(netdev->name);
930 #endif
931 	return 0;
932 }
933 #endif /* !CONFIG_DM_ETH */
934 
935 #ifdef CONFIG_DM_ETH
936 
937 static int macb_start(struct udevice *dev)
938 {
939 	return _macb_init(dev, dev->name);
940 }
941 
942 static int macb_send(struct udevice *dev, void *packet, int length)
943 {
944 	struct macb_device *macb = dev_get_priv(dev);
945 
946 	return _macb_send(macb, dev->name, packet, length);
947 }
948 
949 static int macb_recv(struct udevice *dev, int flags, uchar **packetp)
950 {
951 	struct macb_device *macb = dev_get_priv(dev);
952 
953 	macb->next_rx_tail = macb->rx_tail;
954 	macb->wrapped = false;
955 
956 	return _macb_recv(macb, packetp);
957 }
958 
959 static int macb_free_pkt(struct udevice *dev, uchar *packet, int length)
960 {
961 	struct macb_device *macb = dev_get_priv(dev);
962 
963 	reclaim_rx_buffers(macb, macb->next_rx_tail);
964 
965 	return 0;
966 }
967 
968 static void macb_stop(struct udevice *dev)
969 {
970 	struct macb_device *macb = dev_get_priv(dev);
971 
972 	_macb_halt(macb);
973 }
974 
975 static int macb_write_hwaddr(struct udevice *dev)
976 {
977 	struct eth_pdata *plat = dev_get_platdata(dev);
978 	struct macb_device *macb = dev_get_priv(dev);
979 
980 	return _macb_write_hwaddr(macb, plat->enetaddr);
981 }
982 
983 static const struct eth_ops macb_eth_ops = {
984 	.start	= macb_start,
985 	.send	= macb_send,
986 	.recv	= macb_recv,
987 	.stop	= macb_stop,
988 	.free_pkt	= macb_free_pkt,
989 	.write_hwaddr	= macb_write_hwaddr,
990 };
991 
992 static int macb_eth_probe(struct udevice *dev)
993 {
994 	struct eth_pdata *pdata = dev_get_platdata(dev);
995 	struct macb_device *macb = dev_get_priv(dev);
996 
997 #ifdef CONFIG_DM_ETH
998 	const char *phy_mode;
999 
1000 	phy_mode = fdt_getprop(gd->fdt_blob, dev->of_offset, "phy-mode", NULL);
1001 	if (phy_mode)
1002 		macb->phy_interface = phy_get_interface_by_name(phy_mode);
1003 	if (macb->phy_interface == -1) {
1004 		debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
1005 		return -EINVAL;
1006 	}
1007 #endif
1008 
1009 	macb->regs = (void *)pdata->iobase;
1010 
1011 	_macb_eth_initialize(macb);
1012 #if defined(CONFIG_CMD_MII) || defined(CONFIG_PHYLIB)
1013 	int retval;
1014 	struct mii_dev *mdiodev = mdio_alloc();
1015 	if (!mdiodev)
1016 		return -ENOMEM;
1017 	strncpy(mdiodev->name, dev->name, MDIO_NAME_LEN);
1018 	mdiodev->read = macb_miiphy_read;
1019 	mdiodev->write = macb_miiphy_write;
1020 
1021 	retval = mdio_register(mdiodev);
1022 	if (retval < 0)
1023 		return retval;
1024 	macb->bus = miiphy_get_dev_by_name(dev->name);
1025 #endif
1026 
1027 	return 0;
1028 }
1029 
1030 static int macb_eth_ofdata_to_platdata(struct udevice *dev)
1031 {
1032 	struct eth_pdata *pdata = dev_get_platdata(dev);
1033 
1034 	pdata->iobase = dev_get_addr(dev);
1035 	return 0;
1036 }
1037 
1038 static const struct udevice_id macb_eth_ids[] = {
1039 	{ .compatible = "cdns,macb" },
1040 	{ }
1041 };
1042 
1043 U_BOOT_DRIVER(eth_macb) = {
1044 	.name	= "eth_macb",
1045 	.id	= UCLASS_ETH,
1046 	.of_match = macb_eth_ids,
1047 	.ofdata_to_platdata = macb_eth_ofdata_to_platdata,
1048 	.probe	= macb_eth_probe,
1049 	.ops	= &macb_eth_ops,
1050 	.priv_auto_alloc_size = sizeof(struct macb_device),
1051 	.platdata_auto_alloc_size = sizeof(struct eth_pdata),
1052 };
1053 #endif
1054 
1055 #endif
1056