]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - drivers/net/phy/phy.c
net: phy: make autonegotiation configurable via environment
[karo-tx-uboot.git] / drivers / net / phy / phy.c
1 /*
2  * Generic PHY Management code
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of
7  * the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
17  * MA 02111-1307 USA
18  *
19  *
20  * Copyright 2011 Freescale Semiconductor, Inc.
21  * author Andy Fleming
22  *
23  * Based loosely off of Linux's PHY Lib
24  */
25
26 #include <config.h>
27 #include <common.h>
28 #include <malloc.h>
29 #include <net.h>
30 #include <command.h>
31 #include <miiphy.h>
32 #include <phy.h>
33 #include <errno.h>
34
35 /* Generic PHY support and helper functions */
36
37 /**
38  * genphy_config_advert - sanitize and advertise auto-negotation parameters
39  * @phydev: target phy_device struct
40  *
41  * Description: Writes MII_ADVERTISE with the appropriate values,
42  *   after sanitizing the values to make sure we only advertise
43  *   what is supported.  Returns < 0 on error, 0 if the PHY's advertisement
44  *   hasn't changed, and > 0 if it has changed.
45  */
46 static int genphy_config_advert(struct phy_device *phydev)
47 {
48         u32 advertise;
49         int oldadv, adv;
50         int err, changed = 0;
51
52         /* Only allow advertising what
53          * this PHY supports */
54         phydev->advertising &= phydev->supported;
55         advertise = phydev->advertising;
56
57         /* Setup standard advertisement */
58         oldadv = adv = phy_read(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE);
59
60         if (adv < 0)
61                 return adv;
62
63         adv &= ~(ADVERTISE_ALL | ADVERTISE_100BASE4 | ADVERTISE_PAUSE_CAP |
64                  ADVERTISE_PAUSE_ASYM);
65         if (advertise & ADVERTISED_10baseT_Half)
66                 adv |= ADVERTISE_10HALF;
67         if (advertise & ADVERTISED_10baseT_Full)
68                 adv |= ADVERTISE_10FULL;
69         if (advertise & ADVERTISED_100baseT_Half)
70                 adv |= ADVERTISE_100HALF;
71         if (advertise & ADVERTISED_100baseT_Full)
72                 adv |= ADVERTISE_100FULL;
73         if (advertise & ADVERTISED_Pause)
74                 adv |= ADVERTISE_PAUSE_CAP;
75         if (advertise & ADVERTISED_Asym_Pause)
76                 adv |= ADVERTISE_PAUSE_ASYM;
77
78         if (adv != oldadv) {
79                 err = phy_write(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE, adv);
80
81                 if (err < 0)
82                         return err;
83                 changed = 1;
84         }
85
86         /* Configure gigabit if it's supported */
87         if (phydev->supported & (SUPPORTED_1000baseT_Half |
88                                 SUPPORTED_1000baseT_Full)) {
89                 oldadv = adv = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
90
91                 if (adv < 0)
92                         return adv;
93
94                 adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
95                 if (advertise & SUPPORTED_1000baseT_Half)
96                         adv |= ADVERTISE_1000HALF;
97                 if (advertise & SUPPORTED_1000baseT_Full)
98                         adv |= ADVERTISE_1000FULL;
99
100                 if (adv != oldadv) {
101                         err = phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000,
102                                         adv);
103
104                         if (err < 0)
105                                 return err;
106                         changed = 1;
107                 }
108         }
109
110         return changed;
111 }
112
113
114 /**
115  * genphy_setup_forced - configures/forces speed/duplex from @phydev
116  * @phydev: target phy_device struct
117  *
118  * Description: Configures MII_BMCR to force speed/duplex
119  *   to the values in phydev. Assumes that the values are valid.
120  */
121 static int genphy_setup_forced(struct phy_device *phydev)
122 {
123         int ctl = 0;
124
125         phydev->pause = phydev->asym_pause = 0;
126
127         if (SPEED_1000 == phydev->speed)
128                 ctl |= BMCR_SPEED1000;
129         else if (SPEED_100 == phydev->speed)
130                 ctl |= BMCR_SPEED100;
131
132         if (DUPLEX_FULL == phydev->duplex)
133                 ctl |= BMCR_FULLDPLX;
134
135         return phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, ctl);
136 }
137
138
139 /**
140  * genphy_restart_aneg - Enable and Restart Autonegotiation
141  * @phydev: target phy_device struct
142  */
143 int genphy_restart_aneg(struct phy_device *phydev)
144 {
145         int ctl;
146
147         ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
148
149         if (ctl < 0)
150                 return ctl;
151
152         ctl |= (BMCR_ANENABLE | BMCR_ANRESTART);
153
154         /* Don't isolate the PHY if we're negotiating */
155         ctl &= ~(BMCR_ISOLATE);
156
157         return phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, ctl);
158 }
159
160
161 /**
162  * genphy_config_aneg - restart auto-negotiation or write BMCR
163  * @phydev: target phy_device struct
164  *
165  * Description: If auto-negotiation is enabled, we configure the
166  *   advertising, and then restart auto-negotiation.  If it is not
167  *   enabled, then we write the BMCR.
168  */
169 int genphy_config_aneg(struct phy_device *phydev)
170 {
171         int result;
172
173         if (AUTONEG_ENABLE != phydev->autoneg)
174                 return genphy_setup_forced(phydev);
175
176         result = genphy_config_advert(phydev);
177
178         if (result < 0) /* error */
179                 return result;
180
181         if (result == 0) {
182                 /* Advertisment hasn't changed, but maybe aneg was never on to
183                  * begin with?  Or maybe phy was isolated? */
184                 int ctl = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
185
186                 if (ctl < 0)
187                         return ctl;
188
189                 if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
190                         result = 1; /* do restart aneg */
191         }
192
193         /* Only restart aneg if we are advertising something different
194          * than we were before.  */
195         if (result > 0)
196                 result = genphy_restart_aneg(phydev);
197
198         return result;
199 }
200
201 /**
202  * genphy_update_link - update link status in @phydev
203  * @phydev: target phy_device struct
204  *
205  * Description: Update the value in phydev->link to reflect the
206  *   current link value.  In order to do this, we need to read
207  *   the status register twice, keeping the second value.
208  */
209 int genphy_update_link(struct phy_device *phydev)
210 {
211         int mii_reg;
212         int bmcr;
213
214         /*
215          * Wait if the link is up, and autonegotiation is in progress
216          * (ie - we're capable and it's not done)
217          */
218         mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
219         if (mii_reg < 0)
220                 return mii_reg;
221
222         /*
223          * If we already saw the link up, and it hasn't gone down, then
224          * we don't need to wait for autoneg again
225          */
226         if (phydev->link && mii_reg & BMSR_LSTATUS)
227                 return 0;
228
229         bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
230         if (bmcr < 0)
231                 return bmcr;
232
233         if (!(bmcr & BMCR_ANENABLE))
234                 return 0;
235
236         if ((mii_reg & BMSR_ANEGCAPABLE) && !(mii_reg & BMSR_ANEGCOMPLETE)) {
237                 int i = 0;
238
239                 printf("%s Waiting for PHY auto negotiation to complete",
240                         phydev->dev->name);
241                 while (!(mii_reg & BMSR_ANEGCOMPLETE)) {
242                         /*
243                          * Timeout reached ?
244                          */
245                         if (i > PHY_ANEG_TIMEOUT) {
246                                 printf(" TIMEOUT !\n");
247                                 phydev->link = 0;
248                                 return 0;
249                         }
250
251                         if (ctrlc()) {
252                                 puts("user interrupt!\n");
253                                 phydev->link = 0;
254                                 return -EINTR;
255                         }
256
257                         if ((i++ % 500) == 0)
258                                 printf(".");
259
260                         udelay(1000);   /* 1 ms */
261                         mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
262                         if (mii_reg < 0)
263                                 return mii_reg;
264                 }
265                 printf(" done\n");
266                 phydev->link = 1;
267         } else {
268                 /* Read the link a second time to clear the latched state */
269                 mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
270                 if (mii_reg < 0)
271                         return mii_reg;
272
273                 if (mii_reg & BMSR_LSTATUS)
274                         phydev->link = 1;
275                 else
276                         phydev->link = 0;
277         }
278
279         return 0;
280 }
281
282 /*
283  * Generic function which updates the speed and duplex.  If
284  * autonegotiation is enabled, it uses the AND of the link
285  * partner's advertised capabilities and our advertised
286  * capabilities.  If autonegotiation is disabled, we use the
287  * appropriate bits in the control register.
288  *
289  * Stolen from Linux's mii.c and phy_device.c
290  */
291 static int genphy_parse_link(struct phy_device *phydev)
292 {
293         int mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
294
295         if (mii_reg < 0)
296                 return mii_reg;
297
298         /* We're using autonegotiation */
299         if (mii_reg & BMSR_ANEGCAPABLE) {
300                 int ret;
301                 u16 lpa;
302                 u16 gblpa = 0;
303
304                 /* Check for gigabit capability */
305                 if (mii_reg & BMSR_ERCAP) {
306                         /* We want a list of states supported by
307                          * both PHYs in the link
308                          */
309                         ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_STAT1000);
310                         if (ret < 0)
311                                 return ret;
312                         gblpa = ret;
313
314                         ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
315                         if (ret < 0)
316                                 return ret;
317                         gblpa &= ret << 2;
318                 }
319
320                 /* Set the baseline so we only have to set them
321                  * if they're different
322                  */
323                 phydev->speed = SPEED_10;
324                 phydev->duplex = DUPLEX_HALF;
325
326                 /* Check the gigabit fields */
327                 if (gblpa & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) {
328                         phydev->speed = SPEED_1000;
329
330                         if (gblpa & PHY_1000BTSR_1000FD)
331                                 phydev->duplex = DUPLEX_FULL;
332
333                         /* We're done! */
334                         return 0;
335                 }
336
337                 ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE);
338                 if (ret < 0)
339                         return ret;
340                 lpa = ret;
341
342                 ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA);
343                 if (ret < 0)
344                         return ret;
345                 lpa &= ret;
346
347                 if (lpa & (LPA_100FULL | LPA_100HALF)) {
348                         phydev->speed = SPEED_100;
349
350                         if (lpa & LPA_100FULL)
351                                 phydev->duplex = DUPLEX_FULL;
352
353                 } else if (lpa & LPA_10FULL)
354                         phydev->duplex = DUPLEX_FULL;
355         } else {
356                 int bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
357
358                 if (bmcr < 0)
359                         return bmcr;
360
361                 phydev->speed = SPEED_10;
362                 phydev->duplex = DUPLEX_HALF;
363
364                 if (bmcr & BMCR_FULLDPLX)
365                         phydev->duplex = DUPLEX_FULL;
366
367                 if (bmcr & BMCR_SPEED1000)
368                         phydev->speed = SPEED_1000;
369                 else if (bmcr & BMCR_SPEED100)
370                         phydev->speed = SPEED_100;
371         }
372
373         return 0;
374 }
375
376 int genphy_config(struct phy_device *phydev)
377 {
378         int val;
379         u32 features;
380
381         /* For now, I'll claim that the generic driver supports
382          * all possible port types */
383         features = (SUPPORTED_TP | SUPPORTED_MII
384                         | SUPPORTED_AUI | SUPPORTED_FIBRE |
385                         SUPPORTED_BNC);
386
387         /* Do we support autonegotiation? */
388         val = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
389
390         if (val < 0)
391                 return val;
392
393         if (val & BMSR_ANEGCAPABLE)
394                 features |= SUPPORTED_Autoneg;
395
396         if (val & BMSR_100FULL)
397                 features |= SUPPORTED_100baseT_Full;
398         if (val & BMSR_100HALF)
399                 features |= SUPPORTED_100baseT_Half;
400         if (val & BMSR_10FULL)
401                 features |= SUPPORTED_10baseT_Full;
402         if (val & BMSR_10HALF)
403                 features |= SUPPORTED_10baseT_Half;
404
405         if (val & BMSR_ESTATEN) {
406                 val = phy_read(phydev, MDIO_DEVAD_NONE, MII_ESTATUS);
407
408                 if (val < 0)
409                         return val;
410
411                 if (val & ESTATUS_1000_TFULL)
412                         features |= SUPPORTED_1000baseT_Full;
413                 if (val & ESTATUS_1000_THALF)
414                         features |= SUPPORTED_1000baseT_Half;
415         }
416
417         phydev->supported = features;
418         phydev->advertising = features;
419
420         genphy_config_aneg(phydev);
421
422         return 0;
423 }
424
425 int genphy_startup(struct phy_device *phydev)
426 {
427         genphy_update_link(phydev);
428         genphy_parse_link(phydev);
429
430         return 0;
431 }
432
433 int genphy_shutdown(struct phy_device *phydev)
434 {
435         return 0;
436 }
437
438 static struct phy_driver genphy_driver = {
439         .uid            = 0xffffffff,
440         .mask           = 0xffffffff,
441         .name           = "Generic PHY",
442         .features       = 0,
443         .config         = genphy_config,
444         .startup        = genphy_startup,
445         .shutdown       = genphy_shutdown,
446 };
447
448 static LIST_HEAD(phy_drivers);
449
450 int phy_init(void)
451 {
452 #ifdef CONFIG_PHY_ATHEROS
453         phy_atheros_init();
454 #endif
455 #ifdef CONFIG_PHY_BROADCOM
456         phy_broadcom_init();
457 #endif
458 #ifdef CONFIG_PHY_DAVICOM
459         phy_davicom_init();
460 #endif
461 #ifdef CONFIG_PHY_LXT
462         phy_lxt_init();
463 #endif
464 #ifdef CONFIG_PHY_MARVELL
465         phy_marvell_init();
466 #endif
467 #ifdef CONFIG_PHY_MICREL
468         phy_micrel_init();
469 #endif
470 #ifdef CONFIG_PHY_NATSEMI
471         phy_natsemi_init();
472 #endif
473 #ifdef CONFIG_PHY_REALTEK
474         phy_realtek_init();
475 #endif
476 #ifdef CONFIG_PHY_SMSC
477         phy_smsc_init();
478 #endif
479 #ifdef CONFIG_PHY_TERANETICS
480         phy_teranetics_init();
481 #endif
482 #ifdef CONFIG_PHY_VITESSE
483         phy_vitesse_init();
484 #endif
485
486         return 0;
487 }
488
489 int phy_register(struct phy_driver *drv)
490 {
491         INIT_LIST_HEAD(&drv->list);
492         list_add_tail(&drv->list, &phy_drivers);
493
494         return 0;
495 }
496
497 static int phy_probe(struct phy_device *phydev)
498 {
499         int err = 0;
500
501         phydev->advertising = phydev->supported = phydev->drv->features;
502         phydev->mmds = phydev->drv->mmds;
503
504         if (phydev->drv->probe)
505                 err = phydev->drv->probe(phydev);
506
507         return err;
508 }
509
510 static struct phy_driver *generic_for_interface(phy_interface_t interface)
511 {
512 #ifdef CONFIG_PHYLIB_10G
513         if (is_10g_interface(interface))
514                 return &gen10g_driver;
515 #endif
516
517         return &genphy_driver;
518 }
519
520 static struct phy_driver *get_phy_driver(struct phy_device *phydev,
521                                 phy_interface_t interface)
522 {
523         struct list_head *entry;
524         int phy_id = phydev->phy_id;
525         struct phy_driver *drv = NULL;
526
527         list_for_each(entry, &phy_drivers) {
528                 drv = list_entry(entry, struct phy_driver, list);
529                 if ((drv->uid & drv->mask) == (phy_id & drv->mask))
530                         return drv;
531         }
532
533         /* If we made it here, there's no driver for this PHY */
534         return generic_for_interface(interface);
535 }
536
537 static int aneg_enabled(struct phy_device *phydev)
538 {
539         static const char *aneg = "_aneg";
540         char varname[strlen(phydev->bus->name) + strlen(aneg) + 1];
541
542         snprintf(varname, sizeof(varname), "%s%s", phydev->bus->name, aneg);
543         return getenv_yesno(varname);
544 }
545
546 static int phy_get_speed(struct phy_device *phydev)
547 {
548         int ret;
549         static const char *aneg = "_speed";
550         char varname[strlen(phydev->bus->name) + strlen(aneg) + 1];
551         ulong val;
552
553         snprintf(varname, sizeof(varname), "%s%s", phydev->bus->name, aneg);
554
555         val = getenv_ulong(varname, 10, 100);
556         switch (val) {
557         case 1000:
558                 ret = SPEED_1000;
559                 break;
560         case 100:
561                 ret = SPEED_100;
562                 break;
563         case 10:
564                 ret = SPEED_10;
565                 break;
566         default:
567                 printf("Improper setting '%s' for %s; assuming 100\n",
568                         getenv(varname), varname);
569                 ret = SPEED_100;
570         }
571         return ret;
572 }
573
574 static int phy_get_duplex(struct phy_device *phydev)
575 {
576         int ret = DUPLEX_FULL;
577         static const char *aneg = "_duplex";
578         char varname[strlen(phydev->bus->name) + strlen(aneg) + 4];
579         const char *val;
580
581         snprintf(varname, sizeof(varname), "%s%d%s",
582                 phydev->bus->name, phydev->addr, aneg);
583
584         val = getenv(varname);
585         if (val != NULL) {
586                 if (strcasecmp(val, "full") != 0) {
587                         if (strcasecmp(val, "half") == 0) {
588                                 ret = DUPLEX_HALF;
589                         } else {
590                                 printf("Improper setting '%s' for %s; assuming 'full'\n",
591                                         val, varname);
592                                 printf("Expected one of: 'full', 'half'\n");
593                         }
594                 }
595         }
596
597         return ret;
598 }
599
600 static struct phy_device *phy_device_create(struct mii_dev *bus, int addr,
601                                             int phy_id,
602                                             phy_interface_t interface)
603 {
604         struct phy_device *dev;
605
606         /* We allocate the device, and initialize the
607          * default values */
608         dev = malloc(sizeof(*dev));
609         if (!dev) {
610                 printf("Failed to allocate PHY device for %s:%d\n",
611                         bus->name, addr);
612                 return NULL;
613         }
614
615         memset(dev, 0, sizeof(*dev));
616
617         dev->duplex = -1;
618         dev->link = 1;
619         dev->interface = interface;
620
621         dev->addr = addr;
622         dev->phy_id = phy_id;
623         dev->bus = bus;
624
625         dev->drv = get_phy_driver(dev, interface);
626
627         if (aneg_enabled(dev)) {
628                 dev->autoneg = AUTONEG_ENABLE;
629         } else {
630                 dev->autoneg = AUTONEG_DISABLE;
631                 dev->speed = phy_get_speed(dev);
632                 dev->duplex = phy_get_duplex(dev);
633
634                 switch (dev->speed) {
635                 case SPEED_1000:
636                         if (dev->duplex == DUPLEX_FULL)
637                                 dev->supported &= SUPPORTED_1000baseT_Full;
638                         else
639                                 dev->supported &= SUPPORTED_1000baseT_Half;
640                         break;
641                 case SPEED_100:
642                         if (dev->duplex == DUPLEX_FULL)
643                                 dev->supported &= SUPPORTED_100baseT_Full;
644                         else
645                                 dev->supported &= SUPPORTED_100baseT_Half;
646                         break;
647                 case SPEED_10:
648                         if (dev->duplex == DUPLEX_FULL)
649                                 dev->supported &= SUPPORTED_10baseT_Full;
650                         else
651                                 dev->supported &= SUPPORTED_10baseT_Half;
652                         break;
653                 default:
654                         printf("Unsupported speed: %d\n", dev->speed);
655                 }
656         }
657
658         phy_probe(dev);
659
660         bus->phymap[addr] = dev;
661
662         return dev;
663 }
664
665 /**
666  * get_phy_id - reads the specified addr for its ID.
667  * @bus: the target MII bus
668  * @addr: PHY address on the MII bus
669  * @phy_id: where to store the ID retrieved.
670  *
671  * Description: Reads the ID registers of the PHY at @addr on the
672  *   @bus, stores it in @phy_id and returns zero on success.
673  */
674 static int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id)
675 {
676         int phy_reg;
677
678         /* Grab the bits from PHYIR1, and put them
679          * in the upper half */
680         phy_reg = bus->read(bus, addr, devad, MII_PHYSID1);
681
682         if (phy_reg < 0)
683                 return -EIO;
684
685         *phy_id = (phy_reg & 0xffff) << 16;
686
687         /* Grab the bits from PHYIR2, and put them in the lower half */
688         phy_reg = bus->read(bus, addr, devad, MII_PHYSID2);
689
690         if (phy_reg < 0)
691                 return -EIO;
692
693         *phy_id |= (phy_reg & 0xffff);
694
695         return 0;
696 }
697
698 /**
699  * get_phy_device - reads the specified PHY device and returns its @phy_device struct
700  * @bus: the target MII bus
701  * @addr: PHY address on the MII bus
702  *
703  * Description: Reads the ID registers of the PHY at @addr on the
704  *   @bus, then allocates and returns the phy_device to represent it.
705  */
706 static struct phy_device *get_phy_device(struct mii_dev *bus, int addr,
707                                          phy_interface_t interface)
708 {
709         u32 phy_id = 0x1fffffff;
710         int i;
711         int r;
712
713         /* If we have one, return the existing device, with new interface */
714         if (bus->phymap[addr]) {
715                 bus->phymap[addr]->interface = interface;
716
717                 return bus->phymap[addr];
718         }
719
720         /* Try Standard (ie Clause 22) access */
721         r = get_phy_id(bus, addr, MDIO_DEVAD_NONE, &phy_id);
722         if (r)
723                 return NULL;
724
725         /* If the PHY ID is mostly f's, we didn't find anything */
726         if ((phy_id & 0x1fffffff) != 0x1fffffff)
727                 return phy_device_create(bus, addr, phy_id, interface);
728
729         /* Otherwise we have to try Clause 45 */
730         for (i = 1; i < 5; i++) {
731                 r = get_phy_id(bus, addr, i, &phy_id);
732                 if (r)
733                         return NULL;
734
735                 /* If the phy_id is mostly Fs, there is no device there */
736                 if ((phy_id & 0x1fffffff) != 0x1fffffff)
737                         return phy_device_create(bus, addr, phy_id, interface);
738         }
739         return NULL;
740 }
741
742 int phy_reset(struct phy_device *phydev)
743 {
744         int err;
745         int reg;
746         int timeout = 500;
747         int devad = MDIO_DEVAD_NONE;
748
749 #ifdef CONFIG_PHYLIB_10G
750         /* If it's 10G, we need to issue reset through one of the MMDs */
751         if (is_10g_interface(phydev->interface)) {
752                 if (!phydev->mmds)
753                         gen10g_discover_mmds(phydev);
754
755                 devad = ffs(phydev->mmds) - 1;
756         }
757 #endif
758
759         reg = phy_read(phydev, devad, MII_BMCR);
760         if (reg < 0) {
761                 debug("PHY status read failed\n");
762                 return -1;
763         }
764
765         reg |= BMCR_RESET;
766
767         err = phy_write(phydev, devad, MII_BMCR, reg);
768         if (err < 0) {
769                 debug("PHY reset failed\n");
770                 return err;
771         }
772
773 #ifdef CONFIG_PHY_RESET_DELAY
774         udelay(CONFIG_PHY_RESET_DELAY); /* Intel LXT971A needs this */
775 #endif
776         /*
777          * Poll the control register for the reset bit to go to 0 (it is
778          * auto-clearing).  This should happen within 0.5 seconds per the
779          * IEEE spec.
780          */
781         while ((reg & BMCR_RESET) && timeout-- >= 0) {
782                 reg = phy_read(phydev, devad, MII_BMCR);
783
784                 if (reg < 0) {
785                         debug("PHY status read failed\n");
786                         return reg;
787                 }
788                 udelay(1000);
789         }
790
791         if (reg & BMCR_RESET) {
792                 puts("PHY reset timed out\n");
793                 return -ETIMEDOUT;
794         }
795
796         return 0;
797 }
798
799 int miiphy_reset(const char *devname, unsigned char addr)
800 {
801         struct mii_dev *bus = miiphy_get_dev_by_name(devname);
802         struct phy_device *phydev;
803
804         /*
805          * miiphy_reset was only used on standard PHYs, so we'll fake it here.
806          * If later code tries to connect with the right interface, this will
807          * be corrected by get_phy_device in phy_connect()
808          */
809         phydev = get_phy_device(bus, addr, PHY_INTERFACE_MODE_MII);
810
811         return phy_reset(phydev);
812 }
813
814 struct phy_device *phy_connect(struct mii_dev *bus, int addr,
815                                 struct eth_device *dev,
816                                 phy_interface_t interface)
817 {
818         struct phy_device *phydev;
819
820         /* Reset the bus */
821         if (bus->reset)
822                 bus->reset(bus);
823
824         /* Wait 15ms to make sure the PHY has come out of hard reset */
825         udelay(15000);
826
827         phydev = get_phy_device(bus, addr, interface);
828
829         if (!phydev) {
830                 printf("Could not get PHY for %s:%d\n", bus->name, addr);
831
832                 return NULL;
833         }
834
835         /* Soft Reset the PHY */
836         phy_reset(phydev);
837
838         if (phydev->dev)
839                 printf("%s:%d is connected to %s.  Reconnecting to %s\n",
840                         bus->name, addr, phydev->dev->name, dev->name);
841
842         phydev->dev = dev;
843
844         debug("%s connected to %s\n", dev->name, phydev->drv->name);
845
846         return phydev;
847 }
848
849 /*
850  * Start the PHY.  Returns 0 on success, or a negative error code.
851  */
852 int phy_startup(struct phy_device *phydev)
853 {
854         if (phydev->drv->startup)
855                 return phydev->drv->startup(phydev);
856
857         return 0;
858 }
859
860 static int __board_phy_config(struct phy_device *phydev)
861 {
862         if (phydev->drv->config)
863                 return phydev->drv->config(phydev);
864         return 0;
865 }
866
867 int board_phy_config(struct phy_device *phydev)
868         __attribute__((weak, alias("__board_phy_config")));
869
870 int phy_config(struct phy_device *phydev)
871 {
872         /* Invoke an optional board-specific helper */
873         board_phy_config(phydev);
874
875         return 0;
876 }
877
878 int phy_shutdown(struct phy_device *phydev)
879 {
880         if (phydev->drv->shutdown)
881                 phydev->drv->shutdown(phydev);
882
883         return 0;
884 }