- Remove the callout and related bits in mii_layer; all of the ethernet
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 22 Jul 2008 10:59:16 +0000 (10:59 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Tue, 22 Jul 2008 10:59:16 +0000 (10:59 +0000)
  device drivers actually do mii_tick() in their own callout and
  mii_softc.mii_ticks serves the us quit well.  This makes all mii aware
  NIC drivers' miibus interface MP safe.
- Clear mii_softc.mii_ticks when change ifmedia.
- Clear mii_softc.mii_ticks if we have link.

15 files changed:
sys/dev/netif/mii_layer/brgphy.c
sys/dev/netif/mii_layer/dcphy.c
sys/dev/netif/mii_layer/e1000phy.c
sys/dev/netif/mii_layer/ip1000phy.c
sys/dev/netif/mii_layer/mii.c
sys/dev/netif/mii_layer/mii_physubr.c
sys/dev/netif/mii_layer/miivar.h
sys/dev/netif/mii_layer/mlphy.c
sys/dev/netif/mii_layer/nsgphy.c
sys/dev/netif/mii_layer/pnphy.c
sys/dev/netif/mii_layer/rgephy.c
sys/dev/netif/mii_layer/ruephy.c
sys/dev/netif/mii_layer/tlphy.c
sys/dev/netif/mii_layer/ukphy.c
sys/dev/netif/mii_layer/xmphy.c

index f23de00..2049a4f 100644 (file)
@@ -32,7 +32,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/brgphy.c,v 1.1.2.7 2003/05/11 18:00:55 ps Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/brgphy.c,v 1.20 2008/03/16 15:50:22 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/brgphy.c,v 1.21 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -317,12 +317,13 @@ setit:
 
                /*
                 * Check to see if we have link.  If we do, we don't
-                * need to restart the autonegotiation process.  Read
-                * the BMSR twice in case it's latched.
+                * need to restart the autonegotiation process.
                 */
                reg = PHY_READ(sc, BRGPHY_MII_AUXSTS);
-               if (reg & BRGPHY_AUXSTS_LINK)
+               if (reg & BRGPHY_AUXSTS_LINK) {
+                       sc->mii_ticks = 0;
                        break;
+               }
 
                /*
                 * Only retry autonegotiation every 5 seconds.
index 7daa764..4cf7065 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/dcphy.c,v 1.2.2.2 2000/10/14 00:44:40 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/dcphy.c,v 1.11 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/dcphy.c,v 1.12 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -430,8 +430,6 @@ dcphy_auto(struct mii_softc *sc)
        DC_SETBIT(dc_sc, DC_SIARESET, DC_SIA_RESET);
        DC_SETBIT(dc_sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL);
        DC_SETBIT(dc_sc, DC_10BTSTAT, DC_ASTAT_TXDISABLE);
-
-       sc->mii_flags |= MIIF_DOINGAUTO;
 }
 
 static void
index 142de2b..54c0ab8 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/dev/mii/e1000phy.c,v 1.18 2006/12/11 11:09:48 yongari Exp $ */
-/* $DragonFly: src/sys/dev/netif/mii_layer/e1000phy.c,v 1.11 2008/03/16 15:50:22 hasso Exp $ */
+/* $DragonFly: src/sys/dev/netif/mii_layer/e1000phy.c,v 1.12 2008/07/22 10:59:16 sephe Exp $ */
 /*     $OpenBSD: eephy.c,v 1.26 2006/06/08 00:27:12 brad Exp $ */
 /*
  * Principal Author: Parag Patel
@@ -408,7 +408,7 @@ done:
                /*
                 * Only retry autonegotiation every mii_anegticks seconds.
                 */
-               if (++sc->mii_ticks != sc->mii_anegticks)
+               if (++sc->mii_ticks <= sc->mii_anegticks)
                        return (0);
                sc->mii_ticks = 0;
 
index fb6b295..07dffb2 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/ip1000phy.c,v 1.1 2006/07/25 00:16:09 yongari Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/ip1000phy.c,v 1.3 2008/03/16 15:50:22 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/ip1000phy.c,v 1.4 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -271,10 +271,8 @@ done:
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
-                       sc->mii_ticks = 0;
+               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
                        break;
-               }
 
                /*
                 * check for link.
index bb5bf61..6bef282 100644 (file)
@@ -37,7 +37,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/mii.c,v 1.6.2.2 2002/08/19 16:56:33 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/mii.c,v 1.11 2006/09/05 00:55:40 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/mii.c,v 1.12 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -287,8 +287,12 @@ mii_mediachg(struct mii_data *mii)
        for (child = LIST_FIRST(&mii->mii_phys); child != NULL;
             child = LIST_NEXT(child, mii_list)) {
                rv = (*child->mii_service)(child, mii, MII_MEDIACHG);
-               if (rv)
+               if (rv) {
                        return (rv);
+               } else {
+                       /* Reset autonegotiation timer. */
+                       child->mii_ticks = 0;
+               }
        }
        return (0);
 }
index b6d5d2e..0c605e6 100644 (file)
@@ -37,7 +37,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/mii_physubr.c,v 1.2.2.1 2000/12/12 19:29:14 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/mii_physubr.c,v 1.14 2007/03/24 05:57:49 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/mii_physubr.c,v 1.15 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -106,7 +106,6 @@ const struct mii_media      mii_media_table[MII_NMEDIA] = {
 void
 mii_softc_init(struct mii_softc *mii, struct mii_attach_args *ma)
 {
-       callout_init(&mii->mii_auto_ch);
        mii->mii_phy = ma->mii_phyno;
        mii->mii_flags |= ma->mii_flags;
        mii->mii_model = MII_MODEL(ma->mii_id2);
@@ -121,113 +120,63 @@ mii_softc_init(struct mii_softc *mii, struct mii_attach_args *ma)
 int
 mii_phy_auto(struct mii_softc *sc, int waitfor)
 {
-       int i;
+       uint16_t anar;
 
-       if ((sc->mii_flags & MIIF_DOINGAUTO) == 0) {
-               /*
-                * Check for 1000BASE-X.  Autonegotiation is a bit
-                * different on such devices.
-                */
-               if (sc->mii_flags & MIIF_IS_1000X) {
-                       uint16_t anar = 0;
-
-                       if (sc->mii_extcapabilities & EXTSR_1000XFDX)
-                               anar |= ANAR_X_FD;
-                       if (sc->mii_extcapabilities & EXTSR_1000XHDX)
-                               anar |= ANAR_X_HD;
+       /*
+        * Check for 1000BASE-X.  Autonegotiation is a bit
+        * different on such devices.
+        */
+       if (sc->mii_flags & MIIF_IS_1000X) {
+               anar = 0;
+               if (sc->mii_extcapabilities & EXTSR_1000XFDX)
+                       anar |= ANAR_X_FD;
+               if (sc->mii_extcapabilities & EXTSR_1000XHDX)
+                       anar |= ANAR_X_HD;
+
+               if (sc->mii_flags & MIIF_DOPAUSE) {
+                       /* XXX Asymmetric vs. symmetric? */
+                       anar |= ANLPAR_X_PAUSE_TOWARDS;
+               }
+               PHY_WRITE(sc, MII_ANAR, anar);
+       } else {
+               anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) |
+                   ANAR_CSMA;
+               if (sc->mii_flags & MIIF_DOPAUSE) {
+                       anar |= ANAR_FC;
+                       /* XXX Only 1000BASE-T has PAUSE_ASYM? */
+                       if ((sc->mii_flags & MIIF_HAVE_GTCR) &&
+                           (sc->mii_extcapabilities &
+                            (EXTSR_1000THDX|EXTSR_1000TFDX)))
+                               anar |= ANAR_X_PAUSE_ASYM;
+               }
+               PHY_WRITE(sc, MII_ANAR, anar);
+               if (sc->mii_flags & MIIF_HAVE_GTCR) {
+                       uint16_t gtcr = 0;
 
-                       if (sc->mii_flags & MIIF_DOPAUSE) {
-                               /* XXX Asymmetric vs. symmetric? */
-                               anar |= ANLPAR_X_PAUSE_TOWARDS;
-                       }
+                       if (sc->mii_extcapabilities & EXTSR_1000TFDX)
+                               gtcr |= GTCR_ADV_1000TFDX;
+                       if (sc->mii_extcapabilities & EXTSR_1000THDX)
+                               gtcr |= GTCR_ADV_1000THDX;
 
-                       PHY_WRITE(sc, MII_ANAR, anar);
-               } else {
-                       uint16_t anar;
-
-                       anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) |
-                           ANAR_CSMA;
-                       if (sc->mii_flags & MIIF_DOPAUSE) {
-                               anar |= ANAR_FC;
-                               /* XXX Only 1000BASE-T has PAUSE_ASYM? */
-                               if ((sc->mii_flags & MIIF_HAVE_GTCR) &&
-                                   (sc->mii_extcapabilities &
-                                    (EXTSR_1000THDX|EXTSR_1000TFDX)))
-                                       anar |= ANAR_X_PAUSE_ASYM;
-                       }
-                       PHY_WRITE(sc, MII_ANAR, anar);
-                       if (sc->mii_flags & MIIF_HAVE_GTCR) {
-                               uint16_t gtcr = 0;
-
-                               if (sc->mii_extcapabilities & EXTSR_1000TFDX)
-                                       gtcr |= GTCR_ADV_1000TFDX;
-                               if (sc->mii_extcapabilities & EXTSR_1000THDX)
-                                       gtcr |= GTCR_ADV_1000THDX;
-
-                               PHY_WRITE(sc, MII_100T2CR, gtcr);
-                       }
+                       PHY_WRITE(sc, MII_100T2CR, gtcr);
                }
-               PHY_WRITE(sc, MII_BMCR, BMCR_AUTOEN | BMCR_STARTNEG);
        }
+       PHY_WRITE(sc, MII_BMCR, BMCR_AUTOEN | BMCR_STARTNEG);
 
        if (waitfor) {
+               int i;
+
                /* Wait 500ms for it to complete. */
                for (i = 0; i < 500; i++) {
                        if (PHY_READ(sc, MII_BMSR) & BMSR_ACOMP)
                                return (0);
                        DELAY(1000);
                }
-
-               /*
-                * Don't need to worry about clearing MIIF_DOINGAUTO.
-                * If that's set, a timeout is pending, and it will
-                * clear the flag.
-                */
                return (EIO);
        }
-
-       /*
-        * Just let it finish asynchronously.  This is for the benefit of
-        * the tick handler driving autonegotiation.  Don't want 500ms
-        * delays all the time while the system is running!
-        */
-       if (sc->mii_flags & MIIF_AUTOTSLEEP) {
-               sc->mii_flags |= MIIF_DOINGAUTO;
-               tsleep(&sc->mii_flags, 0, "miiaut", hz >> 1);
-               mii_phy_auto_timeout(sc);
-       } else if ((sc->mii_flags & MIIF_DOINGAUTO) == 0) {
-               sc->mii_flags |= MIIF_DOINGAUTO;
-               callout_reset(&sc->mii_auto_ch, hz >> 1,
-                             mii_phy_auto_timeout, sc);
-       }
        return (EJUSTRETURN);
 }
 
-void
-mii_phy_auto_stop(struct mii_softc *sc)
-{
-       if (sc->mii_flags & MIIF_DOINGAUTO) {
-               sc->mii_flags &= ~MIIF_DOINGAUTO;
-               callout_stop(&sc->mii_auto_ch);
-       }
-}
-
-/* XXX should use serializer */
-void
-mii_phy_auto_timeout(void *arg)
-{
-       struct mii_softc *sc = arg;
-
-       crit_enter();
-
-       sc->mii_flags &= ~MIIF_DOINGAUTO;
-
-       /* Update the media status. */
-       sc->mii_service(sc, sc->mii_pdata, MII_POLLSTAT);
-
-       crit_exit();
-}
-
 void
 mii_phy_reset(struct mii_softc *sc)
 {
@@ -477,6 +426,9 @@ mii_phy_tick(struct mii_softc *sc)
                /*
                 * See above.
                 */
+
+               /* Reset autonegotiation timer. */
+               sc->mii_ticks = 0;
                return (0);
        }
 
@@ -484,19 +436,12 @@ mii_phy_tick(struct mii_softc *sc)
         * Only retry autonegotiation every N seconds.
         */
        KKASSERT(sc->mii_anegticks > 0);
-       if (++sc->mii_ticks != sc->mii_anegticks)
+       if (++sc->mii_ticks <= sc->mii_anegticks)
                return (EJUSTRETURN);
 
        sc->mii_ticks = 0;
        sc->mii_reset(sc);      /* Reset PHY */
-
-       if (mii_phy_auto(sc, 0) == EJUSTRETURN)
-               return (EJUSTRETURN);
-
-       /*
-        * Might need to generate a status message if autonegotiation
-        * failed.
-        */
+       mii_phy_auto(sc, 0);    /* Ignore EJUSTRETURN */
        return (0);
 }
 
index a26dd93..f171078 100644 (file)
@@ -37,7 +37,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/miivar.h,v 1.3.2.1 2000/12/12 19:29:14 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/miivar.h,v 1.12 2006/08/06 10:32:23 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/miivar.h,v 1.13 2008/07/22 10:59:16 sephe Exp $
  */
 
 #ifndef _DEV_MII_MIIVAR_H_
@@ -119,7 +119,6 @@ struct mii_softc {
        void (*mii_status)(struct mii_softc *);
 
        struct mii_data *mii_pdata;     /* pointer to parent's mii_data */
-       struct callout  mii_auto_ch;    /* callout handle for phy autoneg */
 
        int mii_flags;                  /* misc. flags; see below */
        int mii_capabilities;           /* capabilities from BMSR */
@@ -136,8 +135,6 @@ typedef struct mii_softc mii_softc_t;
 #define        MIIF_INITDONE   0x0001          /* has been initialized (mii_data) */
 #define        MIIF_NOISOLATE  0x0002          /* do not isolate the PHY */
 #define        MIIF_NOLOOP     0x0004          /* no loopback capability */
-#define        MIIF_DOINGAUTO  0x0008          /* doing autonegotiation (mii_softc) */
-#define        MIIF_AUTOTSLEEP 0x0010          /* use tsleep(), not callout() */
 #define        MIIF_HAVEFIBER  0x0020          /* from parent: has fiber interface */
 #define        MIIF_HAVE_GTCR  0x0040          /* has 100base-T2/1000base-T CR */
 #define        MIIF_IS_1000X   0x0080          /* is a 1000BASE-X device */
@@ -145,7 +142,7 @@ typedef struct mii_softc mii_softc_t;
 #define        MIIF_IS_HPNA    0x0200          /* is a HomePNA device */
 #define        MIIF_FORCEANEG  0x0400          /* is a HomePNA device */
 
-#define        MIIF_INHERIT_MASK       (MIIF_NOISOLATE|MIIF_NOLOOP|MIIF_AUTOTSLEEP)
+#define        MIIF_INHERIT_MASK       (MIIF_NOISOLATE|MIIF_NOLOOP)
 
 /*
  * Used to attach a PHY to a parent.
@@ -249,8 +246,6 @@ const struct mii_phydesc *mii_phy_match(const struct mii_attach_args *,
 void   mii_softc_init(struct mii_softc *, struct mii_attach_args *);
 
 int    mii_phy_auto(struct mii_softc *, int);
-void   mii_phy_auto_stop(struct mii_softc *);
-void   mii_phy_auto_timeout(void *arg);
 void   mii_phy_reset(struct mii_softc *);
 
 void   ukphy_status(struct mii_softc *);
index 2b4a4d0..d5fd160 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/mlphy.c,v 1.2.2.3 2001/02/09 09:50:15 asmodai Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/mlphy.c,v 1.11 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/mlphy.c,v 1.12 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -186,7 +186,6 @@ mlphy_detach(device_t dev)
        struct mlphy_softc *sc;
 
        sc = device_get_softc(dev);
-       mii_phy_auto_stop(&sc->ml_mii);
        sc->ml_mii.mii_dev = NULL;
        LIST_REMOVE(&sc->ml_mii, mii_list);
 
@@ -324,14 +323,6 @@ mlphy_service(struct mii_softc *xsc, struct mii_data *mii, int cmd)
                if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
                        break;
 
-               /*
-                * Only retry autonegotiation every 5 seconds.
-                */
-               if (++sc->mii_ticks <= sc->mii_anegticks)
-                       return (0);
-               
-               sc->mii_ticks = 0;
-
                /*
                 * Check to see if we have link.  If we do, we don't
                 * need to restart the autonegotiation process.  Read
@@ -348,16 +339,22 @@ mlphy_service(struct mii_softc *xsc, struct mii_data *mii, int cmd)
                        reg = PHY_READ(sc, MII_BMSR) |
                            PHY_READ(sc, MII_BMSR);
                }
-
                if (reg & BMSR_LINK) {
                        if (!msc->ml_linked) {
                                msc->ml_linked = 1;
                                mlphy_status(sc);
-                               break;
                        }
-                       return(0);
+                       sc->mii_ticks = 0;
+                       break;
                }
 
+               /*
+                * Only retry autonegotiation every 5 seconds.
+                */
+               if (++sc->mii_ticks <= sc->mii_anegticks)
+                       return (0);
+               
+               sc->mii_ticks = 0;
                msc->ml_linked = 0;
                mii->mii_media_active = IFM_NONE;
                mii_phy_reset(sc);
index 0d0f935..84f1785 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/nsgphy.c,v 1.1.2.3 2002/11/08 21:53:49 semenu Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/nsgphy.c,v 1.14 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/nsgphy.c,v 1.15 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -200,7 +200,6 @@ nsgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-
                mii_phy_set_media(sc);
                break;
 
index 6e01738..916f469 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/pnphy.c,v 1.1.2.1 2002/11/08 21:53:49 semenu Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/pnphy.c,v 1.12 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/pnphy.c,v 1.13 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -238,6 +238,9 @@ pnphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
                if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
                        break;
 
+               /*
+                * This PHY's autonegotiation doesn't need to be kicked.
+                */
                return(0);
        }
 
index 6cc94ed..c888ce0 100644 (file)
@@ -32,7 +32,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/rgephy.c,v 1.7 2005/09/30 19:39:27 imp Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/rgephy.c,v 1.6 2007/09/17 11:29:36 hasso Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/rgephy.c,v 1.7 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -283,12 +283,16 @@ setit:
 
                if (MII_REV(id2) < 2) {
                        reg = PHY_READ(sc, RE_GMEDIASTAT);
-                       if (reg & RE_GMEDIASTAT_LINK)
+                       if (reg & RE_GMEDIASTAT_LINK) {
+                               sc->mii_ticks = 0;
                                break;
+                       }
                } else {
                        reg = PHY_READ(sc, RGEPHY_SR);
-                       if (reg & RGEPHY_SR_LINK)
+                       if (reg & RGEPHY_SR_LINK) {
+                               sc->mii_ticks = 0;
                                break;
+                       }
                }
 
                /*
index 4f26fed..287b7b6 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/ruephy.c,v 1.1.4.1 2003/07/30 13:57:35 akiyama Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/ruephy.c,v 1.6 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/ruephy.c,v 1.7 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -202,8 +202,10 @@ ruephy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
                 */
                reg = PHY_READ(sc, RUEPHY_MII_MSR) |
                      PHY_READ(sc, RUEPHY_MII_MSR);
-               if (reg & RUEPHY_MSR_LINK)
+               if (reg & RUEPHY_MSR_LINK) {
+                       sc->mii_ticks = 0;
                        break;
+               }
 
                /*
                 * Only retry autonegotiation every 5 seconds.
index 0797801..adf6ebb 100644 (file)
@@ -37,7 +37,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/tlphy.c,v 1.2.2.2 2001/07/29 22:48:37 kris Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/tlphy.c,v 1.12 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/tlphy.c,v 1.13 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -234,7 +234,7 @@ tlphy_service(struct mii_softc *self, struct mii_data *mii, int cmd)
        struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int reg;
 
-       if ((sc->sc_mii.mii_flags & MIIF_DOINGAUTO) == 0 && sc->sc_need_acomp)
+       if (sc->sc_need_acomp)
                tlphy_acomp(sc);
 
        switch (cmd) {
@@ -314,8 +314,10 @@ tlphy_service(struct mii_softc *self, struct mii_data *mii, int cmd)
                 */
                reg = PHY_READ(&sc->sc_mii, MII_BMSR) |
                    PHY_READ(&sc->sc_mii, MII_BMSR);
-               if (reg & BMSR_LINK)
-                       return (0);
+               if (reg & BMSR_LINK) {
+                       sc->sc_mii.mii_ticks = 0;
+                       break;
+               }
 
                /*
                 * Only retry autonegotiation every mii_anegticks seconds.
index 3655133..1818744 100644 (file)
@@ -37,7 +37,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/ukphy.c,v 1.2.2.2 2002/11/08 21:53:49 semenu Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/ukphy.c,v 1.11 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/ukphy.c,v 1.12 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -180,7 +180,6 @@ ukphy_detach(device_t dev)
        struct mii_softc *sc;
 
        sc = device_get_softc(dev);
-       mii_phy_auto_stop(sc);
        sc->mii_dev = NULL;
        LIST_REMOVE(sc, mii_list);
 
index 7bf4512..a5b4f58 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/mii/xmphy.c,v 1.1.2.5 2002/11/08 21:53:49 semenu Exp $
- * $DragonFly: src/sys/dev/netif/mii_layer/xmphy.c,v 1.10 2006/12/22 23:26:20 swildner Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/xmphy.c,v 1.11 2008/07/22 10:59:16 sephe Exp $
  */
 
 /*
@@ -244,8 +244,10 @@ xmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
                 */
                reg = PHY_READ(sc, XMPHY_MII_BMSR) |
                    PHY_READ(sc, XMPHY_MII_BMSR);
-               if (reg & XMPHY_BMSR_LINK)
+               if (reg & XMPHY_BMSR_LINK) {
+                       sc->mii_ticks = 0;
                        break;
+               }
 
                /*
                 * Only retry autonegotiation every mii_anegticks seconds.
@@ -324,14 +326,12 @@ xmphy_mii_phy_auto(struct mii_softc *sc, int waitfor)
 {
        int bmsr, anar = 0, i;
 
-       if ((sc->mii_flags & MIIF_DOINGAUTO) == 0) {
-               anar = PHY_READ(sc, XMPHY_MII_ANAR);
-               anar |= XMPHY_ANAR_FDX | XMPHY_ANAR_HDX;
-               PHY_WRITE(sc, XMPHY_MII_ANAR, anar);
-               DELAY(1000);
-               PHY_WRITE(sc, XMPHY_MII_BMCR,
-                   XMPHY_BMCR_AUTOEN | XMPHY_BMCR_STARTNEG);
-       }
+       anar = PHY_READ(sc, XMPHY_MII_ANAR);
+       anar |= XMPHY_ANAR_FDX | XMPHY_ANAR_HDX;
+       PHY_WRITE(sc, XMPHY_MII_ANAR, anar);
+       DELAY(1000);
+       PHY_WRITE(sc, XMPHY_MII_BMCR,
+           XMPHY_BMCR_AUTOEN | XMPHY_BMCR_STARTNEG);
 
        if (waitfor) {
                /* Wait 500ms for it to complete. */
@@ -341,24 +341,7 @@ xmphy_mii_phy_auto(struct mii_softc *sc, int waitfor)
                                return (0);
                        DELAY(1000);
                }
-
-               /*
-                * Don't need to worry about clearing MIIF_DOINGAUTO.
-                * If that's set, a timeout is pending, and it will
-                * clear the flag.
-                */
                return (EIO);
        }
-
-       /*
-        * Just let it finish asynchronously.  This is for the benefit of
-        * the tick handler driving autonegotiation.  Don't want 500ms
-        * delays all the time while the system is running!
-        */
-       if ((sc->mii_flags & MIIF_DOINGAUTO) == 0) {
-               sc->mii_flags |= MIIF_DOINGAUTO;
-               callout_reset(&sc->mii_auto_ch, hz >> 1, 
-                             mii_phy_auto_timeout, sc);
-       }
        return (EJUSTRETURN);
 }