Re: brgphy: reset autonegotiation timer when we get the link
Date: Wed, 22 May 2013 18:32:57 +0200 From: Mike Belopuhov m...@belopuhov.com On Wed, May 22, 2013 at 18:08 +0200, Mark Kettenis wrote: Date: Wed, 22 May 2013 17:59:19 +0200 From: Mike Belopuhov m...@belopuhov.com On Tue, May 21, 2013 at 17:16 +0200, Mike Belopuhov wrote: from freebsd. ok? ping! There are more drivers in the tree that do the same thing. And then there lots that have the same bug. Would be nice if we could fix those as well. Anyway, ok kettenis@ fair enough. it looks like rgephy needs to proceed to mii_phy_status and mii_phy_update, but returns instead. i'd like it to get tested. Looks ok to me. Don't have the hardware to test right now. diff --git sys/dev/mii/brgphy.c sys/dev/mii/brgphy.c index 7f0bae2..461c798 100644 --- sys/dev/mii/brgphy.c +++ sys/dev/mii/brgphy.c @@ -412,8 +412,10 @@ setit: * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); - if (reg BMSR_LINK) + if (reg BMSR_LINK) { + sc-mii_ticks = 0; /* Reset autoneg timer. */ break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/mii/dcphy.c sys/dev/mii/dcphy.c index d1ad0b4..841fe3f 100644 --- sys/dev/mii/dcphy.c +++ sys/dev/mii/dcphy.c @@ -272,8 +272,10 @@ dcphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) break; reg = CSR_READ_4(dc_sc, DC_10BTSTAT); - if (!(reg DC_TSTAT_LS10) || !(reg DC_TSTAT_LS100)) + if (!(reg DC_TSTAT_LS10) || !(reg DC_TSTAT_LS100)) { + sc-mii_ticks = 0; break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/mii/mlphy.c sys/dev/mii/mlphy.c index 56858b5..fb5784b 100644 --- sys/dev/mii/mlphy.c +++ sys/dev/mii/mlphy.c @@ -306,6 +306,7 @@ mlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) msc-ml_linked = 1; mlphy_status(sc); } + sc-mii_ticks = 0; break; } /* diff --git sys/dev/mii/rgephy.c sys/dev/mii/rgephy.c index 2c1ddbb..5fe9dc6 100644 --- sys/dev/mii/rgephy.c +++ sys/dev/mii/rgephy.c @@ -251,12 +251,16 @@ setit: */ if (sc-mii_rev 2) { reg = PHY_READ(sc, RL_GMEDIASTAT); - if (reg RL_GMEDIASTAT_LINK) + if (reg RL_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; + } } /* @@ -267,7 +271,7 @@ setit: sc-mii_ticks = 0; rgephy_mii_phy_auto(sc); - return (0); + break; } /* Update the media status. */ diff --git sys/dev/mii/urlphy.c sys/dev/mii/urlphy.c index 09df2bd..2e3b475 100644 --- sys/dev/mii/urlphy.c +++ sys/dev/mii/urlphy.c @@ -186,8 +186,10 @@ urlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) /* Read the status register twice; MSR_LINK is latch-low. */ reg = PHY_READ(sc, URLPHY_MSR) | PHY_READ(sc, URLPHY_MSR); - if (reg URLPHY_MSR_LINK) - return (0); + if (reg URLPHY_MSR_LINK) { + sc-mii_ticks = 0; + break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/mii/xmphy.c sys/dev/mii/xmphy.c index 1d3e2ea..e7687e6 100644 --- sys/dev/mii/xmphy.c +++ sys/dev/mii/xmphy.c @@ -212,8 +212,10 @@ xmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); - if (reg BMSR_LINK) + if (reg BMSR_LINK) { + sc-mii_ticks = 0; break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/sbus/be.c sys/dev/sbus/be.c index 1527ff0..7dc459d 100644 --- sys/dev/sbus/be.c +++ sys/dev/sbus/be.c @@ -1531,6 +1531,7 @@ be_intphy_service(struct be_softc *sc, struct mii_data *mii, int cmd)
Re: brgphy: reset autonegotiation timer when we get the link
On Tue, May 21, 2013 at 17:16 +0200, Mike Belopuhov wrote: from freebsd. ok? ping! diff --git sys/dev/mii/brgphy.c sys/dev/mii/brgphy.c index 7f0bae2..461c798 100644 --- sys/dev/mii/brgphy.c +++ sys/dev/mii/brgphy.c @@ -412,8 +412,10 @@ setit: * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); - if (reg BMSR_LINK) + if (reg BMSR_LINK) { + sc-mii_ticks = 0; /* Reset autoneg timer. */ break; + } /* * Only retry autonegotiation every mii_anegticks seconds.
Re: brgphy: reset autonegotiation timer when we get the link
Date: Wed, 22 May 2013 17:59:19 +0200 From: Mike Belopuhov m...@belopuhov.com On Tue, May 21, 2013 at 17:16 +0200, Mike Belopuhov wrote: from freebsd. ok? ping! There are more drivers in the tree that do the same thing. And then there lots that have the same bug. Would be nice if we could fix those as well. Anyway, ok kettenis@ diff --git sys/dev/mii/brgphy.c sys/dev/mii/brgphy.c index 7f0bae2..461c798 100644 --- sys/dev/mii/brgphy.c +++ sys/dev/mii/brgphy.c @@ -412,8 +412,10 @@ setit: * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); - if (reg BMSR_LINK) + if (reg BMSR_LINK) { + sc-mii_ticks = 0; /* Reset autoneg timer. */ break; + } /* * Only retry autonegotiation every mii_anegticks seconds.
Re: brgphy: reset autonegotiation timer when we get the link
On Wed, May 22, 2013 at 18:08 +0200, Mark Kettenis wrote: Date: Wed, 22 May 2013 17:59:19 +0200 From: Mike Belopuhov m...@belopuhov.com On Tue, May 21, 2013 at 17:16 +0200, Mike Belopuhov wrote: from freebsd. ok? ping! There are more drivers in the tree that do the same thing. And then there lots that have the same bug. Would be nice if we could fix those as well. Anyway, ok kettenis@ fair enough. it looks like rgephy needs to proceed to mii_phy_status and mii_phy_update, but returns instead. i'd like it to get tested. diff --git sys/dev/mii/brgphy.c sys/dev/mii/brgphy.c index 7f0bae2..461c798 100644 --- sys/dev/mii/brgphy.c +++ sys/dev/mii/brgphy.c @@ -412,8 +412,10 @@ setit: * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); - if (reg BMSR_LINK) + if (reg BMSR_LINK) { + sc-mii_ticks = 0; /* Reset autoneg timer. */ break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/mii/dcphy.c sys/dev/mii/dcphy.c index d1ad0b4..841fe3f 100644 --- sys/dev/mii/dcphy.c +++ sys/dev/mii/dcphy.c @@ -272,8 +272,10 @@ dcphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) break; reg = CSR_READ_4(dc_sc, DC_10BTSTAT); - if (!(reg DC_TSTAT_LS10) || !(reg DC_TSTAT_LS100)) + if (!(reg DC_TSTAT_LS10) || !(reg DC_TSTAT_LS100)) { + sc-mii_ticks = 0; break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/mii/mlphy.c sys/dev/mii/mlphy.c index 56858b5..fb5784b 100644 --- sys/dev/mii/mlphy.c +++ sys/dev/mii/mlphy.c @@ -306,6 +306,7 @@ mlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) msc-ml_linked = 1; mlphy_status(sc); } + sc-mii_ticks = 0; break; } /* diff --git sys/dev/mii/rgephy.c sys/dev/mii/rgephy.c index 2c1ddbb..5fe9dc6 100644 --- sys/dev/mii/rgephy.c +++ sys/dev/mii/rgephy.c @@ -251,12 +251,16 @@ setit: */ if (sc-mii_rev 2) { reg = PHY_READ(sc, RL_GMEDIASTAT); - if (reg RL_GMEDIASTAT_LINK) + if (reg RL_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; + } } /* @@ -267,7 +271,7 @@ setit: sc-mii_ticks = 0; rgephy_mii_phy_auto(sc); - return (0); + break; } /* Update the media status. */ diff --git sys/dev/mii/urlphy.c sys/dev/mii/urlphy.c index 09df2bd..2e3b475 100644 --- sys/dev/mii/urlphy.c +++ sys/dev/mii/urlphy.c @@ -186,8 +186,10 @@ urlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) /* Read the status register twice; MSR_LINK is latch-low. */ reg = PHY_READ(sc, URLPHY_MSR) | PHY_READ(sc, URLPHY_MSR); - if (reg URLPHY_MSR_LINK) - return (0); + if (reg URLPHY_MSR_LINK) { + sc-mii_ticks = 0; + break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/mii/xmphy.c sys/dev/mii/xmphy.c index 1d3e2ea..e7687e6 100644 --- sys/dev/mii/xmphy.c +++ sys/dev/mii/xmphy.c @@ -212,8 +212,10 @@ xmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR); - if (reg BMSR_LINK) + if (reg BMSR_LINK) { + sc-mii_ticks = 0; break; + } /* * Only retry autonegotiation every mii_anegticks seconds. diff --git sys/dev/sbus/be.c sys/dev/sbus/be.c index 1527ff0..7dc459d 100644 --- sys/dev/sbus/be.c +++ sys/dev/sbus/be.c @@ -1531,6 +1531,7 @@ be_intphy_service(struct be_softc *sc, struct mii_data *mii, int cmd) sc-sc_dev.dv_xname, (bmcr BMCR_S100) ? 100 : 10); } +