xref: /rk3399_rockchip-uboot/drivers/net/tsec.c (revision 876d4515e38dfcec4346968caf6a0c9c8176ea0b)
1 /*
2  * Freescale Three Speed Ethernet Controller driver
3  *
4  * This software may be used and distributed according to the
5  * terms of the GNU Public License, Version 2, incorporated
6  * herein by reference.
7  *
8  * Copyright 2004-2011 Freescale Semiconductor, Inc.
9  * (C) Copyright 2003, Motorola, Inc.
10  * author Andy Fleming
11  *
12  */
13 
14 #include <config.h>
15 #include <common.h>
16 #include <malloc.h>
17 #include <net.h>
18 #include <command.h>
19 #include <tsec.h>
20 #include <fsl_mdio.h>
21 #include <asm/errno.h>
22 #include <asm/processor.h>
23 
24 DECLARE_GLOBAL_DATA_PTR;
25 
26 #define TX_BUF_CNT		2
27 
28 static uint rxIdx;		/* index of the current RX buffer */
29 static uint txIdx;		/* index of the current TX buffer */
30 
31 typedef volatile struct rtxbd {
32 	txbd8_t txbd[TX_BUF_CNT];
33 	rxbd8_t rxbd[PKTBUFSRX];
34 } RTXBD;
35 
36 #define MAXCONTROLLERS	(8)
37 
38 static struct tsec_private *privlist[MAXCONTROLLERS];
39 static int num_tsecs = 0;
40 
41 #ifdef __GNUC__
42 static RTXBD rtx __attribute__ ((aligned(8)));
43 #else
44 #error "rtx must be 64-bit aligned"
45 #endif
46 
47 static int tsec_send(struct eth_device *dev, void *packet, int length);
48 
49 /* Default initializations for TSEC controllers. */
50 
51 static struct tsec_info_struct tsec_info[] = {
52 #ifdef CONFIG_TSEC1
53 	STD_TSEC_INFO(1),	/* TSEC1 */
54 #endif
55 #ifdef CONFIG_TSEC2
56 	STD_TSEC_INFO(2),	/* TSEC2 */
57 #endif
58 #ifdef CONFIG_MPC85XX_FEC
59 	{
60 		.regs = (tsec_t *)(TSEC_BASE_ADDR + 0x2000),
61 		.devname = CONFIG_MPC85XX_FEC_NAME,
62 		.phyaddr = FEC_PHY_ADDR,
63 		.flags = FEC_FLAGS,
64 		.mii_devname = DEFAULT_MII_NAME
65 	},			/* FEC */
66 #endif
67 #ifdef CONFIG_TSEC3
68 	STD_TSEC_INFO(3),	/* TSEC3 */
69 #endif
70 #ifdef CONFIG_TSEC4
71 	STD_TSEC_INFO(4),	/* TSEC4 */
72 #endif
73 };
74 
75 #define TBIANA_SETTINGS ( \
76 		TBIANA_ASYMMETRIC_PAUSE \
77 		| TBIANA_SYMMETRIC_PAUSE \
78 		| TBIANA_FULL_DUPLEX \
79 		)
80 
81 /* By default force the TBI PHY into 1000Mbps full duplex when in SGMII mode */
82 #ifndef CONFIG_TSEC_TBICR_SETTINGS
83 #define CONFIG_TSEC_TBICR_SETTINGS ( \
84 		TBICR_PHY_RESET \
85 		| TBICR_ANEG_ENABLE \
86 		| TBICR_FULL_DUPLEX \
87 		| TBICR_SPEED1_SET \
88 		)
89 #endif /* CONFIG_TSEC_TBICR_SETTINGS */
90 
91 /* Configure the TBI for SGMII operation */
92 static void tsec_configure_serdes(struct tsec_private *priv)
93 {
94 	/* Access TBI PHY registers at given TSEC register offset as opposed
95 	 * to the register offset used for external PHY accesses */
96 	tsec_local_mdio_write(priv->phyregs_sgmii, in_be32(&priv->regs->tbipa),
97 			0, TBI_ANA, TBIANA_SETTINGS);
98 	tsec_local_mdio_write(priv->phyregs_sgmii, in_be32(&priv->regs->tbipa),
99 			0, TBI_TBICON, TBICON_CLK_SELECT);
100 	tsec_local_mdio_write(priv->phyregs_sgmii, in_be32(&priv->regs->tbipa),
101 			0, TBI_CR, CONFIG_TSEC_TBICR_SETTINGS);
102 }
103 
104 #ifdef CONFIG_MCAST_TFTP
105 
106 /* CREDITS: linux gianfar driver, slightly adjusted... thanx. */
107 
108 /* Set the appropriate hash bit for the given addr */
109 
110 /* The algorithm works like so:
111  * 1) Take the Destination Address (ie the multicast address), and
112  * do a CRC on it (little endian), and reverse the bits of the
113  * result.
114  * 2) Use the 8 most significant bits as a hash into a 256-entry
115  * table.  The table is controlled through 8 32-bit registers:
116  * gaddr0-7.  gaddr0's MSB is entry 0, and gaddr7's LSB is entry
117  * 255.  This means that the 3 most significant bits in the
118  * hash index which gaddr register to use, and the 5 other bits
119  * indicate which bit (assuming an IBM numbering scheme, which
120  * for PowerPC (tm) is usually the case) in the register holds
121  * the entry. */
122 static int
123 tsec_mcast_addr(struct eth_device *dev, const u8 *mcast_mac, u8 set)
124 {
125 	struct tsec_private *priv = privlist[1];
126 	struct tsec __iomem *regs = priv->regs;
127 	u32 result, value;
128 	u8 whichbit, whichreg;
129 
130 	result = ether_crc(MAC_ADDR_LEN, mcast_mac);
131 	whichbit = (result >> 24) & 0x1f; /* the 5 LSB = which bit to set */
132 	whichreg = result >> 29; /* the 3 MSB = which reg to set it in */
133 
134 	value = 1 << (31-whichbit);
135 
136 	if (set)
137 		setbits_be32(&regs->hash.gaddr0 + whichreg, value);
138 	else
139 		clrbits_be32(&regs->hash.gaddr0 + whichreg, value);
140 
141 	return 0;
142 }
143 #endif /* Multicast TFTP ? */
144 
145 /* Initialized required registers to appropriate values, zeroing
146  * those we don't care about (unless zero is bad, in which case,
147  * choose a more appropriate value)
148  */
149 static void init_registers(tsec_t *regs)
150 {
151 	/* Clear IEVENT */
152 	out_be32(&regs->ievent, IEVENT_INIT_CLEAR);
153 
154 	out_be32(&regs->imask, IMASK_INIT_CLEAR);
155 
156 	out_be32(&regs->hash.iaddr0, 0);
157 	out_be32(&regs->hash.iaddr1, 0);
158 	out_be32(&regs->hash.iaddr2, 0);
159 	out_be32(&regs->hash.iaddr3, 0);
160 	out_be32(&regs->hash.iaddr4, 0);
161 	out_be32(&regs->hash.iaddr5, 0);
162 	out_be32(&regs->hash.iaddr6, 0);
163 	out_be32(&regs->hash.iaddr7, 0);
164 
165 	out_be32(&regs->hash.gaddr0, 0);
166 	out_be32(&regs->hash.gaddr1, 0);
167 	out_be32(&regs->hash.gaddr2, 0);
168 	out_be32(&regs->hash.gaddr3, 0);
169 	out_be32(&regs->hash.gaddr4, 0);
170 	out_be32(&regs->hash.gaddr5, 0);
171 	out_be32(&regs->hash.gaddr6, 0);
172 	out_be32(&regs->hash.gaddr7, 0);
173 
174 	out_be32(&regs->rctrl, 0x00000000);
175 
176 	/* Init RMON mib registers */
177 	memset((void *)&(regs->rmon), 0, sizeof(rmon_mib_t));
178 
179 	out_be32(&regs->rmon.cam1, 0xffffffff);
180 	out_be32(&regs->rmon.cam2, 0xffffffff);
181 
182 	out_be32(&regs->mrblr, MRBLR_INIT_SETTINGS);
183 
184 	out_be32(&regs->minflr, MINFLR_INIT_SETTINGS);
185 
186 	out_be32(&regs->attr, ATTR_INIT_SETTINGS);
187 	out_be32(&regs->attreli, ATTRELI_INIT_SETTINGS);
188 
189 }
190 
191 /* Configure maccfg2 based on negotiated speed and duplex
192  * reported by PHY handling code
193  */
194 static void adjust_link(struct tsec_private *priv, struct phy_device *phydev)
195 {
196 	tsec_t *regs = priv->regs;
197 	u32 ecntrl, maccfg2;
198 
199 	if (!phydev->link) {
200 		printf("%s: No link.\n", phydev->dev->name);
201 		return;
202 	}
203 
204 	/* clear all bits relative with interface mode */
205 	ecntrl = in_be32(&regs->ecntrl);
206 	ecntrl &= ~ECNTRL_R100;
207 
208 	maccfg2 = in_be32(&regs->maccfg2);
209 	maccfg2 &= ~(MACCFG2_IF | MACCFG2_FULL_DUPLEX);
210 
211 	if (phydev->duplex)
212 		maccfg2 |= MACCFG2_FULL_DUPLEX;
213 
214 	switch (phydev->speed) {
215 	case 1000:
216 		maccfg2 |= MACCFG2_GMII;
217 		break;
218 	case 100:
219 	case 10:
220 		maccfg2 |= MACCFG2_MII;
221 
222 		/* Set R100 bit in all modes although
223 		 * it is only used in RGMII mode
224 		 */
225 		if (phydev->speed == 100)
226 			ecntrl |= ECNTRL_R100;
227 		break;
228 	default:
229 		printf("%s: Speed was bad\n", phydev->dev->name);
230 		break;
231 	}
232 
233 	out_be32(&regs->ecntrl, ecntrl);
234 	out_be32(&regs->maccfg2, maccfg2);
235 
236 	printf("Speed: %d, %s duplex%s\n", phydev->speed,
237 			(phydev->duplex) ? "full" : "half",
238 			(phydev->port == PORT_FIBRE) ? ", fiber mode" : "");
239 }
240 
241 #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129
242 /*
243  * When MACCFG1[Rx_EN] is enabled during system boot as part
244  * of the eTSEC port initialization sequence,
245  * the eTSEC Rx logic may not be properly initialized.
246  */
247 void redundant_init(struct eth_device *dev)
248 {
249 	struct tsec_private *priv = dev->priv;
250 	tsec_t *regs = priv->regs;
251 	uint t, count = 0;
252 	int fail = 1;
253 	static const u8 pkt[] = {
254 		0x00, 0x1e, 0x4f, 0x12, 0xcb, 0x2c, 0x00, 0x25,
255 		0x64, 0xbb, 0xd1, 0xab, 0x08, 0x00, 0x45, 0x00,
256 		0x00, 0x5c, 0xdd, 0x22, 0x00, 0x00, 0x80, 0x01,
257 		0x1f, 0x71, 0x0a, 0xc1, 0x14, 0x22, 0x0a, 0xc1,
258 		0x14, 0x6a, 0x08, 0x00, 0xef, 0x7e, 0x02, 0x00,
259 		0x94, 0x05, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
260 		0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
261 		0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,
262 		0x77, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
263 		0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
264 		0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
265 		0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
266 		0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
267 		0x71, 0x72};
268 
269 	/* Enable promiscuous mode */
270 	setbits_be32(&regs->rctrl, 0x8);
271 	/* Enable loopback mode */
272 	setbits_be32(&regs->maccfg1, MACCFG1_LOOPBACK);
273 	/* Enable transmit and receive */
274 	setbits_be32(&regs->maccfg1, MACCFG1_RX_EN | MACCFG1_TX_EN);
275 
276 	/* Tell the DMA it is clear to go */
277 	setbits_be32(&regs->dmactrl, DMACTRL_INIT_SETTINGS);
278 	out_be32(&regs->tstat, TSTAT_CLEAR_THALT);
279 	out_be32(&regs->rstat, RSTAT_CLEAR_RHALT);
280 	clrbits_be32(&regs->dmactrl, DMACTRL_GRS | DMACTRL_GTS);
281 
282 	do {
283 		tsec_send(dev, (void *)pkt, sizeof(pkt));
284 
285 		/* Wait for buffer to be received */
286 		for (t = 0; rtx.rxbd[rxIdx].status & RXBD_EMPTY; t++) {
287 			if (t >= 10 * TOUT_LOOP) {
288 				printf("%s: tsec: rx error\n", dev->name);
289 				break;
290 			}
291 		}
292 
293 		if (!memcmp(pkt, (void *)NetRxPackets[rxIdx], sizeof(pkt)))
294 			fail = 0;
295 
296 		rtx.rxbd[rxIdx].length = 0;
297 		rtx.rxbd[rxIdx].status =
298 		    RXBD_EMPTY | (((rxIdx + 1) == PKTBUFSRX) ? RXBD_WRAP : 0);
299 		rxIdx = (rxIdx + 1) % PKTBUFSRX;
300 
301 		if (in_be32(&regs->ievent) & IEVENT_BSY) {
302 			out_be32(&regs->ievent, IEVENT_BSY);
303 			out_be32(&regs->rstat, RSTAT_CLEAR_RHALT);
304 		}
305 		if (fail) {
306 			printf("loopback recv packet error!\n");
307 			clrbits_be32(&regs->maccfg1, MACCFG1_RX_EN);
308 			udelay(1000);
309 			setbits_be32(&regs->maccfg1, MACCFG1_RX_EN);
310 		}
311 	} while ((count++ < 4) && (fail == 1));
312 
313 	if (fail)
314 		panic("eTSEC init fail!\n");
315 	/* Disable promiscuous mode */
316 	clrbits_be32(&regs->rctrl, 0x8);
317 	/* Disable loopback mode */
318 	clrbits_be32(&regs->maccfg1, MACCFG1_LOOPBACK);
319 }
320 #endif
321 
322 /* Set up the buffers and their descriptors, and bring up the
323  * interface
324  */
325 static void startup_tsec(struct eth_device *dev)
326 {
327 	int i;
328 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
329 	tsec_t *regs = priv->regs;
330 
331 	/* reset the indices to zero */
332 	rxIdx = 0;
333 	txIdx = 0;
334 #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129
335 	uint svr;
336 #endif
337 
338 	/* Point to the buffer descriptors */
339 	out_be32(&regs->tbase, (unsigned int)(&rtx.txbd[txIdx]));
340 	out_be32(&regs->rbase, (unsigned int)(&rtx.rxbd[rxIdx]));
341 
342 	/* Initialize the Rx Buffer descriptors */
343 	for (i = 0; i < PKTBUFSRX; i++) {
344 		rtx.rxbd[i].status = RXBD_EMPTY;
345 		rtx.rxbd[i].length = 0;
346 		rtx.rxbd[i].bufPtr = (uint) NetRxPackets[i];
347 	}
348 	rtx.rxbd[PKTBUFSRX - 1].status |= RXBD_WRAP;
349 
350 	/* Initialize the TX Buffer Descriptors */
351 	for (i = 0; i < TX_BUF_CNT; i++) {
352 		rtx.txbd[i].status = 0;
353 		rtx.txbd[i].length = 0;
354 		rtx.txbd[i].bufPtr = 0;
355 	}
356 	rtx.txbd[TX_BUF_CNT - 1].status |= TXBD_WRAP;
357 
358 #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129
359 	svr = get_svr();
360 	if ((SVR_MAJ(svr) == 1) || IS_SVR_REV(svr, 2, 0))
361 		redundant_init(dev);
362 #endif
363 	/* Enable Transmit and Receive */
364 	setbits_be32(&regs->maccfg1, MACCFG1_RX_EN | MACCFG1_TX_EN);
365 
366 	/* Tell the DMA it is clear to go */
367 	setbits_be32(&regs->dmactrl, DMACTRL_INIT_SETTINGS);
368 	out_be32(&regs->tstat, TSTAT_CLEAR_THALT);
369 	out_be32(&regs->rstat, RSTAT_CLEAR_RHALT);
370 	clrbits_be32(&regs->dmactrl, DMACTRL_GRS | DMACTRL_GTS);
371 }
372 
373 /* This returns the status bits of the device.	The return value
374  * is never checked, and this is what the 8260 driver did, so we
375  * do the same.	 Presumably, this would be zero if there were no
376  * errors
377  */
378 static int tsec_send(struct eth_device *dev, void *packet, int length)
379 {
380 	int i;
381 	int result = 0;
382 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
383 	tsec_t *regs = priv->regs;
384 
385 	/* Find an empty buffer descriptor */
386 	for (i = 0; rtx.txbd[txIdx].status & TXBD_READY; i++) {
387 		if (i >= TOUT_LOOP) {
388 			debug("%s: tsec: tx buffers full\n", dev->name);
389 			return result;
390 		}
391 	}
392 
393 	rtx.txbd[txIdx].bufPtr = (uint) packet;
394 	rtx.txbd[txIdx].length = length;
395 	rtx.txbd[txIdx].status |=
396 	    (TXBD_READY | TXBD_LAST | TXBD_CRC | TXBD_INTERRUPT);
397 
398 	/* Tell the DMA to go */
399 	out_be32(&regs->tstat, TSTAT_CLEAR_THALT);
400 
401 	/* Wait for buffer to be transmitted */
402 	for (i = 0; rtx.txbd[txIdx].status & TXBD_READY; i++) {
403 		if (i >= TOUT_LOOP) {
404 			debug("%s: tsec: tx error\n", dev->name);
405 			return result;
406 		}
407 	}
408 
409 	txIdx = (txIdx + 1) % TX_BUF_CNT;
410 	result = rtx.txbd[txIdx].status & TXBD_STATS;
411 
412 	return result;
413 }
414 
415 static int tsec_recv(struct eth_device *dev)
416 {
417 	int length;
418 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
419 	tsec_t *regs = priv->regs;
420 
421 	while (!(rtx.rxbd[rxIdx].status & RXBD_EMPTY)) {
422 
423 		length = rtx.rxbd[rxIdx].length;
424 
425 		/* Send the packet up if there were no errors */
426 		if (!(rtx.rxbd[rxIdx].status & RXBD_STATS)) {
427 			NetReceive(NetRxPackets[rxIdx], length - 4);
428 		} else {
429 			printf("Got error %x\n",
430 			       (rtx.rxbd[rxIdx].status & RXBD_STATS));
431 		}
432 
433 		rtx.rxbd[rxIdx].length = 0;
434 
435 		/* Set the wrap bit if this is the last element in the list */
436 		rtx.rxbd[rxIdx].status =
437 		    RXBD_EMPTY | (((rxIdx + 1) == PKTBUFSRX) ? RXBD_WRAP : 0);
438 
439 		rxIdx = (rxIdx + 1) % PKTBUFSRX;
440 	}
441 
442 	if (in_be32(&regs->ievent) & IEVENT_BSY) {
443 		out_be32(&regs->ievent, IEVENT_BSY);
444 		out_be32(&regs->rstat, RSTAT_CLEAR_RHALT);
445 	}
446 
447 	return -1;
448 
449 }
450 
451 /* Stop the interface */
452 static void tsec_halt(struct eth_device *dev)
453 {
454 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
455 	tsec_t *regs = priv->regs;
456 
457 	clrbits_be32(&regs->dmactrl, DMACTRL_GRS | DMACTRL_GTS);
458 	setbits_be32(&regs->dmactrl, DMACTRL_GRS | DMACTRL_GTS);
459 
460 	while ((in_be32(&regs->ievent) & (IEVENT_GRSC | IEVENT_GTSC))
461 			!= (IEVENT_GRSC | IEVENT_GTSC))
462 		;
463 
464 	clrbits_be32(&regs->maccfg1, MACCFG1_TX_EN | MACCFG1_RX_EN);
465 
466 	/* Shut down the PHY, as needed */
467 	phy_shutdown(priv->phydev);
468 }
469 
470 /* Initializes data structures and registers for the controller,
471  * and brings the interface up.	 Returns the link status, meaning
472  * that it returns success if the link is up, failure otherwise.
473  * This allows u-boot to find the first active controller.
474  */
475 static int tsec_init(struct eth_device *dev, bd_t * bd)
476 {
477 	uint tempval;
478 	char tmpbuf[MAC_ADDR_LEN];
479 	int i;
480 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
481 	tsec_t *regs = priv->regs;
482 	int ret;
483 
484 	/* Make sure the controller is stopped */
485 	tsec_halt(dev);
486 
487 	/* Init MACCFG2.  Defaults to GMII */
488 	out_be32(&regs->maccfg2, MACCFG2_INIT_SETTINGS);
489 
490 	/* Init ECNTRL */
491 	out_be32(&regs->ecntrl, ECNTRL_INIT_SETTINGS);
492 
493 	/* Copy the station address into the address registers.
494 	 * Backwards, because little endian MACS are dumb */
495 	for (i = 0; i < MAC_ADDR_LEN; i++)
496 		tmpbuf[MAC_ADDR_LEN - 1 - i] = dev->enetaddr[i];
497 
498 	tempval = (tmpbuf[0] << 24) | (tmpbuf[1] << 16) | (tmpbuf[2] << 8) |
499 		  tmpbuf[3];
500 
501 	out_be32(&regs->macstnaddr1, tempval);
502 
503 	tempval = *((uint *) (tmpbuf + 4));
504 
505 	out_be32(&regs->macstnaddr2, tempval);
506 
507 	/* Clear out (for the most part) the other registers */
508 	init_registers(regs);
509 
510 	/* Ready the device for tx/rx */
511 	startup_tsec(dev);
512 
513 	/* Start up the PHY */
514 	ret = phy_startup(priv->phydev);
515 	if (ret) {
516 		printf("Could not initialize PHY %s\n",
517 		       priv->phydev->dev->name);
518 		return ret;
519 	}
520 
521 	adjust_link(priv, priv->phydev);
522 
523 	/* If there's no link, fail */
524 	return priv->phydev->link ? 0 : -1;
525 }
526 
527 static phy_interface_t tsec_get_interface(struct tsec_private *priv)
528 {
529 	tsec_t *regs = priv->regs;
530 	u32 ecntrl;
531 
532 	ecntrl = in_be32(&regs->ecntrl);
533 
534 	if (ecntrl & ECNTRL_SGMII_MODE)
535 		return PHY_INTERFACE_MODE_SGMII;
536 
537 	if (ecntrl & ECNTRL_TBI_MODE) {
538 		if (ecntrl & ECNTRL_REDUCED_MODE)
539 			return PHY_INTERFACE_MODE_RTBI;
540 		else
541 			return PHY_INTERFACE_MODE_TBI;
542 	}
543 
544 	if (ecntrl & ECNTRL_REDUCED_MODE) {
545 		if (ecntrl & ECNTRL_REDUCED_MII_MODE)
546 			return PHY_INTERFACE_MODE_RMII;
547 		else {
548 			phy_interface_t interface = priv->interface;
549 
550 			/*
551 			 * This isn't autodetected, so it must
552 			 * be set by the platform code.
553 			 */
554 			if ((interface == PHY_INTERFACE_MODE_RGMII_ID) ||
555 				 (interface == PHY_INTERFACE_MODE_RGMII_TXID) ||
556 				 (interface == PHY_INTERFACE_MODE_RGMII_RXID))
557 				return interface;
558 
559 			return PHY_INTERFACE_MODE_RGMII;
560 		}
561 	}
562 
563 	if (priv->flags & TSEC_GIGABIT)
564 		return PHY_INTERFACE_MODE_GMII;
565 
566 	return PHY_INTERFACE_MODE_MII;
567 }
568 
569 
570 /* Discover which PHY is attached to the device, and configure it
571  * properly.  If the PHY is not recognized, then return 0
572  * (failure).  Otherwise, return 1
573  */
574 static int init_phy(struct eth_device *dev)
575 {
576 	struct tsec_private *priv = (struct tsec_private *)dev->priv;
577 	struct phy_device *phydev;
578 	tsec_t *regs = priv->regs;
579 	u32 supported = (SUPPORTED_10baseT_Half |
580 			SUPPORTED_10baseT_Full |
581 			SUPPORTED_100baseT_Half |
582 			SUPPORTED_100baseT_Full);
583 
584 	if (priv->flags & TSEC_GIGABIT)
585 		supported |= SUPPORTED_1000baseT_Full;
586 
587 	/* Assign a Physical address to the TBI */
588 	out_be32(&regs->tbipa, CONFIG_SYS_TBIPA_VALUE);
589 
590 	priv->interface = tsec_get_interface(priv);
591 
592 	if (priv->interface == PHY_INTERFACE_MODE_SGMII)
593 		tsec_configure_serdes(priv);
594 
595 	phydev = phy_connect(priv->bus, priv->phyaddr, dev, priv->interface);
596 
597 	phydev->supported &= supported;
598 	phydev->advertising = phydev->supported;
599 
600 	priv->phydev = phydev;
601 
602 	phy_config(phydev);
603 
604 	return 1;
605 }
606 
607 /* Initialize device structure. Returns success if PHY
608  * initialization succeeded (i.e. if it recognizes the PHY)
609  */
610 static int tsec_initialize(bd_t *bis, struct tsec_info_struct *tsec_info)
611 {
612 	struct eth_device *dev;
613 	int i;
614 	struct tsec_private *priv;
615 
616 	dev = (struct eth_device *)malloc(sizeof *dev);
617 
618 	if (NULL == dev)
619 		return 0;
620 
621 	memset(dev, 0, sizeof *dev);
622 
623 	priv = (struct tsec_private *)malloc(sizeof(*priv));
624 
625 	if (NULL == priv)
626 		return 0;
627 
628 	privlist[num_tsecs++] = priv;
629 	priv->regs = tsec_info->regs;
630 	priv->phyregs_sgmii = tsec_info->miiregs_sgmii;
631 
632 	priv->phyaddr = tsec_info->phyaddr;
633 	priv->flags = tsec_info->flags;
634 
635 	sprintf(dev->name, tsec_info->devname);
636 	priv->interface = tsec_info->interface;
637 	priv->bus = miiphy_get_dev_by_name(tsec_info->mii_devname);
638 	dev->iobase = 0;
639 	dev->priv = priv;
640 	dev->init = tsec_init;
641 	dev->halt = tsec_halt;
642 	dev->send = tsec_send;
643 	dev->recv = tsec_recv;
644 #ifdef CONFIG_MCAST_TFTP
645 	dev->mcast = tsec_mcast_addr;
646 #endif
647 
648 	/* Tell u-boot to get the addr from the env */
649 	for (i = 0; i < 6; i++)
650 		dev->enetaddr[i] = 0;
651 
652 	eth_register(dev);
653 
654 	/* Reset the MAC */
655 	setbits_be32(&priv->regs->maccfg1, MACCFG1_SOFT_RESET);
656 	udelay(2);  /* Soft Reset must be asserted for 3 TX clocks */
657 	clrbits_be32(&priv->regs->maccfg1, MACCFG1_SOFT_RESET);
658 
659 	/* Try to initialize PHY here, and return */
660 	return init_phy(dev);
661 }
662 
663 /*
664  * Initialize all the TSEC devices
665  *
666  * Returns the number of TSEC devices that were initialized
667  */
668 int tsec_eth_init(bd_t *bis, struct tsec_info_struct *tsecs, int num)
669 {
670 	int i;
671 	int ret, count = 0;
672 
673 	for (i = 0; i < num; i++) {
674 		ret = tsec_initialize(bis, &tsecs[i]);
675 		if (ret > 0)
676 			count += ret;
677 	}
678 
679 	return count;
680 }
681 
682 int tsec_standard_init(bd_t *bis)
683 {
684 	struct fsl_pq_mdio_info info;
685 
686 	info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
687 	info.name = DEFAULT_MII_NAME;
688 
689 	fsl_pq_mdio_init(bis, &info);
690 
691 	return tsec_eth_init(bis, tsec_info, ARRAY_SIZE(tsec_info));
692 }
693