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