tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Another MII PHY fix.



 Hi, all.

 Without following patch. Some drivers which don't use link
interrput check the link status only every sc->mii_anegticks.
It's late. The patch is a part of FreeBSD's mii_physubr.c r158649:

 
http://svnweb.freebsd.org/base/head/sys/dev/mii/mii_physubr.c?r1=150756&r2=158649

 Any objection to commit?

Index: mii_physubr.c
===================================================================
RCS file: /cvsroot/src/sys/dev/mii/mii_physubr.c,v
retrieving revision 1.76
diff -u -r1.76 mii_physubr.c
--- mii_physubr.c       6 Jun 2013 03:10:48 -0000       1.76
+++ mii_physubr.c       6 Jun 2013 06:07:47 -0000
@@ -324,23 +324,43 @@
        /*
         * If we're not doing autonegotiation, we don't need to do
         * any extra work here.  However, we need to check the link
-        * status so we can generate an announcement if the status
-        * changes.
+        * status so we can generate an announcement by returning
+        * with 0 if the status changes.
         */
        if ((IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) &&
-       (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T))
+           (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T)) {
+               /*
+                * Reset autonegotiation timer to 0 to make sure
+                * the future autonegotiation start with 0.
+                */
+               sc->mii_tick = 0;
                return (0);
+       }
 
        /* Read the status register twice; BMSR_LINK is latch-low. */
        reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR);
        if (reg & BMSR_LINK) {
                /*
-                * See above.
+                * Reset autonegotiation timer to 0 in case the link is down
+                * in the next tick.
                 */
+               sc->mii_tick = 0;
+               /* See above. */
                return (0);
        }
 
        /*
+        * mii_tick == 0 means it's the first tick after changing the media or
+        * the link became down since the last tick (see above), so return with
+        * 0 to update the status.
+        */
+       if (sc->mii_ticks == 0)
+               return (0);
+
+       /* Now increment the tick */
+       sc->mii_ticks++;
+
+       /*
         * Only retry autonegotiation every N seconds.
         */
        KASSERT(sc->mii_anegticks != 0);


-- 
-----------------------------------------------
                SAITOH Masanobu (msaitoh%execsw.org@localhost
                                 msaitoh%netbsd.org@localhost)


Home | Main Index | Thread Index | Old Index