tech-net archive

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

please test: ethernet media-handling patch



I have attached a patch that makes many ethernet drivers share the common
code for MII media handling, ether_mediastatus() and ether_mediachange(),
and which checks for a non-ENXIO error return from mii_mediachg().
I want everyone to have the opportunity to test this patch before I
commit it in about a week, because it affects more architectures than
I can feasibly compile and run.
The patch contains a few miscellaneous changes, too:
gem(4): use LIST_EMPTY(), LIST_FOREACH().
mtd(4): handle media ioctls, for a change!
axe(4): do not track link status in sc->axe_link any longer
nfe(4), aue(4), axe(4), udav(4), url(4): do not reset all PHYs
 on a change of media
I have compiled macppc, sparc64, and i386. I am compiling for evbmips
(MERAKI), now. I have run the patches on i386 boxen with bnx(4)
and sip(4).
Dave
-- 
David Young OJC Technologies
dyoung%ojctech.com@localhost Urbana, IL * (217) 278-3933 ext 24
Index: sys/arch/arm/ep93xx/epe.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/ep93xx/epe.c,v
retrieving revision 1.13
diff -p -u -u -p -r1.13 epe.c
--- sys/arch/arm/ep93xx/epe.c 17 Oct 2007 19:53:40 -0000 1.13
+++ sys/arch/arm/ep93xx/epe.c 2 Jan 2008 02:17:58 -0000
@@ -118,7 +118,6 @@ static void epe_init(struct epe_softc *)
 static int epe_intr(void* arg);
 static int epe_gctx(struct epe_softc *);
 static int epe_mediachange(struct ifnet *);
-static void epe_mediastatus(struct ifnet *, struct ifmediareq *);
 int epe_mii_readreg (struct device *, int, int);
 void epe_mii_writereg (struct device *, int, int, int);
 void epe_statchg (struct device *);
@@ -428,8 +427,9 @@ epe_init(struct epe_softc *sc)
 sc->sc_mii.mii_readreg = epe_mii_readreg;
 sc->sc_mii.mii_writereg = epe_mii_writereg;
 sc->sc_mii.mii_statchg = epe_statchg;
+ sc->sc_ec.ec_mii = &sc->sc_mii;
 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, epe_mediachange,
- epe_mediastatus);
+ ether_mediastatus);
 mii_attach((struct device *)sc, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
@@ -474,19 +474,6 @@ epe_mediachange(ifp)
 return (0);
 }
 
-static void
-epe_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct epe_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
-}
-
-
 int
 epe_mii_readreg(self, phy, reg)
 struct device *self;
@@ -728,15 +715,21 @@ epe_ifinit(ifp)
 struct ifnet *ifp;
 {
 struct epe_softc *sc = ifp->if_softc;
- int s = splnet();
+ int rc, s = splnet();
 
 callout_stop(&sc->epe_tick_ch);
 EPE_WRITE(RXCtl, RXCtl_IA0|RXCtl_BA|RXCtl_RCRCA|RXCtl_SRxON);
 EPE_WRITE(TXCtl, TXCtl_STxON);
 EPE_WRITE(GIIntMsk, GIIntMsk_INT); /* start interrupting */
- mii_mediachg(&sc->sc_mii);
+
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ rc = 0;
+ else if (rc != 0)
+ goto out;
+
 callout_reset(&sc->epe_tick_ch, hz, epe_tick, sc);
 ifp->if_flags |= IFF_RUNNING;
+out:
 splx(s);
 return 0;
 }
Index: sys/arch/arm/xscale/ixp425_if_npe.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/xscale/ixp425_if_npe.c,v
retrieving revision 1.5
diff -p -u -u -p -r1.5 ixp425_if_npe.c
--- sys/arch/arm/xscale/ixp425_if_npe.c 17 Oct 2007 19:53:43 -0000 1.5
+++ sys/arch/arm/xscale/ixp425_if_npe.c 2 Jan 2008 02:17:58 -0000
@@ -296,6 +296,7 @@ npe_attach(struct device *parent, struct
 sc->sc_mii.mii_readreg = npe_miibus_readreg;
 sc->sc_mii.mii_writereg = npe_miibus_writereg;
 sc->sc_mii.mii_statchg = npe_miibus_statchg;
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
 
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff,
 (sc->sc_phy > IXPNPECF_PHY_DEFAULT) ?
@@ -660,9 +661,9 @@ npe_ifmedia_change(struct ifnet *ifp)
 {
 struct npe_softc *sc = ifp->if_softc;
 
- if (sc->sc_phy > IXPNPECF_PHY_DEFAULT && ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
+ if (sc->sc_phy > IXPNPECF_PHY_DEFAULT)
+ return ether_mediachange(ifp);
+ return 0;
 }
 
 /*
Index: sys/arch/evbppc/virtex/dev/if_temac.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbppc/virtex/dev/if_temac.c,v
retrieving revision 1.2
diff -p -u -u -p -r1.2 if_temac.c
--- sys/arch/evbppc/virtex/dev/if_temac.c 4 Mar 2007 05:59:46 -0000 
1.2
+++ sys/arch/evbppc/virtex/dev/if_temac.c 2 Jan 2008 02:17:58 -0000
@@ -205,8 +205,6 @@ static void temac_start(struct ifnet *)
 static void temac_stop(struct ifnet *, int);
 
 /* Media management. */
-static int temac_mediachange(struct ifnet *);
-static void temac_mediastatus(struct ifnet *, struct ifmediareq *);
 static int temac_mii_readreg(struct device *, int, int);
 static void temac_mii_statchg(struct device *);
 static void temac_mii_tick(void *);
@@ -500,8 +498,8 @@ temac_attach(struct device *parent, stru
 mii->mii_readreg = temac_mii_readreg;
 mii->mii_writereg = temac_mii_writereg;
 mii->mii_statchg = temac_mii_statchg;
- ifmedia_init(&mii->mii_media, 0, temac_mediachange,
- temac_mediastatus);
+ sc->sc_ec.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus);
 
 mii_attach(&sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
@@ -593,7 +591,9 @@ temac_init(struct ifnet *ifp)
 cdmac_rx_reset(sc);
 
 /* Set current media. */
- mii_mediachg(&sc->sc_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ return error;
+
 callout_schedule(&sc->sc_mii_tick, hz);
 
 /* Enable EMAC engine. */
@@ -839,30 +839,6 @@ temac_stop(struct ifnet *ifp, int disabl
 ifp->if_flags &= ~(IFF_RUNNING|IFF_OACTIVE);
 }
 
-/*
- * Media management.
- */
-static int
-temac_mediachange(struct ifnet *ifp)
-{
- struct temac_softc *sc = (struct temac_softc *)ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
-
-static void
-temac_mediastatus(struct ifnet *ifp, struct ifmediareq *imr)
-{
- struct temac_softc *sc = (struct temac_softc *)ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
-
- imr->ifm_status = sc->sc_mii.mii_media_status;
- imr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
 static int
 temac_mii_readreg(struct device *self, int phy, int reg)
 {
Index: sys/arch/macppc/dev/if_bm.c
===================================================================
RCS file: /cvsroot/src/sys/arch/macppc/dev/if_bm.c,v
retrieving revision 1.35
diff -p -u -u -p -r1.35 if_bm.c
--- sys/arch/macppc/dev/if_bm.c 29 Dec 2007 23:12:38 -0000 1.35
+++ sys/arch/macppc/dev/if_bm.c 2 Jan 2008 02:17:59 -0000
@@ -115,8 +115,6 @@ int bmac_put(struct bmac_softc *, void *
 struct mbuf *bmac_get(struct bmac_softc *, void *, int);
 void bmac_watchdog(struct ifnet *);
 int bmac_ioctl(struct ifnet *, u_long, void *);
-int bmac_mediachange(struct ifnet *);
-void bmac_mediastatus(struct ifnet *, struct ifmediareq *);
 void bmac_setladrf(struct bmac_softc *);
 
 int bmac_mii_readreg(struct device *, int, int);
@@ -248,7 +246,8 @@ bmac_attach(struct device *parent, struc
 mii->mii_writereg = bmac_mii_writereg;
 mii->mii_statchg = bmac_mii_statchg;
 
- ifmedia_init(&mii->mii_media, 0, bmac_mediachange, bmac_mediastatus);
+ sc->sc_ethercom.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus);
 mii_attach(&sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 
@@ -524,7 +523,7 @@ next:
 cmd->d_resid = 0;
 sc->sc_rxlast = i + 1;
 }
- bmac_mediachange(ifp);
+ ether_mediachange(ifp);
 
 dbdma_continue(sc->sc_rxdma);
 
@@ -809,28 +808,6 @@ bmac_ioctl(ifp, cmd, data)
 return error;
 }
 
-int
-bmac_mediachange(ifp)
- struct ifnet *ifp;
-{
- struct bmac_softc *sc = ifp->if_softc;
-
- return mii_mediachg(&sc->sc_mii);
-}
-
-void
-bmac_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct bmac_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
-
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
 /*
 * Set up the logical address filter.
 */
Index: sys/arch/macppc/dev/if_gm.c
===================================================================
RCS file: /cvsroot/src/sys/arch/macppc/dev/if_gm.c,v
retrieving revision 1.32
diff -p -u -u -p -r1.32 if_gm.c
--- sys/arch/macppc/dev/if_gm.c 29 Dec 2007 23:14:06 -0000 1.32
+++ sys/arch/macppc/dev/if_gm.c 2 Jan 2008 02:17:59 -0000
@@ -123,8 +123,6 @@ void gmac_setladrf(struct gmac_softc *);
 int gmac_ioctl(struct ifnet *, u_long, void *);
 void gmac_watchdog(struct ifnet *);
 
-int gmac_mediachange(struct ifnet *);
-void gmac_mediastatus(struct ifnet *, struct ifmediareq *);
 int gmac_mii_readreg(struct device *, int, int);
 void gmac_mii_writereg(struct device *, int, int, int);
 void gmac_mii_statchg(struct device *);
@@ -246,7 +244,8 @@ gmac_attach(parent, self, aux)
 mii->mii_writereg = gmac_mii_writereg;
 mii->mii_statchg = gmac_mii_statchg;
 
- ifmedia_init(&mii->mii_media, 0, gmac_mediachange, gmac_mediastatus);
+ sc->sc_ethercom.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus);
 mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
 
 /* Choose a default media. */
@@ -894,28 +893,6 @@ gmac_watchdog(ifp)
 }
 
 int
-gmac_mediachange(ifp)
- struct ifnet *ifp;
-{
- struct gmac_softc *sc = ifp->if_softc;
-
- return mii_mediachg(&sc->sc_mii);
-}
-
-void
-gmac_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct gmac_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
-
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-int
 gmac_mii_readreg(dev, phy, reg)
 struct device *dev;
 int phy, reg;
Index: sys/arch/mips/alchemy/dev/if_aumac.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/alchemy/dev/if_aumac.c,v
retrieving revision 1.23
diff -p -u -u -p -r1.23 if_aumac.c
--- sys/arch/mips/alchemy/dev/if_aumac.c 17 Oct 2007 19:55:35 -0000 
1.23
+++ sys/arch/mips/alchemy/dev/if_aumac.c 2 Jan 2008 02:17:59 -0000
@@ -202,9 +202,6 @@ static void aumac_mii_writereg(struct de
 static void aumac_mii_statchg(struct device *);
 static int aumac_mii_wait(struct aumac_softc *, const char *);
 
-static int aumac_mediachange(struct ifnet *);
-static void aumac_mediastatus(struct ifnet *, struct ifmediareq *);
-
 static int aumac_match(struct device *, struct cfdata *, void *);
 static void aumac_attach(struct device *, struct device *, void *);
 
@@ -326,8 +323,9 @@ aumac_attach(struct device *parent, stru
 sc->sc_mii.mii_readreg = aumac_mii_readreg;
 sc->sc_mii.mii_writereg = aumac_mii_writereg;
 sc->sc_mii.mii_statchg = aumac_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, 0, aumac_mediachange,
- aumac_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
@@ -828,7 +826,8 @@ aumac_init(struct ifnet *ifp)
 #endif
 
 /* Set the media. */
- aumac_mediachange(ifp);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Set the receive filter. This will actually start the transmit
@@ -843,6 +842,7 @@ aumac_init(struct ifnet *ifp)
 ifp->if_flags |= IFF_RUNNING; 
 ifp->if_flags &= ~IFF_OACTIVE;
 
+out:
 if (error)
 printf("%s: interface not running\n", sc->sc_dev.dv_xname);
 return (error);
@@ -996,36 +996,6 @@ aumac_set_filter(struct aumac_softc *sc)
 }
 
 /*
- * aumac_mediastatus: [ifmedia interface function]
- *
- * Get the current interface media status.
- */
-static void
-aumac_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct aumac_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
- * aumac_mediachange: [ifmedia interface function]
- *
- * Set hardware to newly selected media.
- */
-static int
-aumac_mediachange(struct ifnet *ifp)
-{
- struct aumac_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
-
-/*
 * aumac_mii_wait:
 *
 * Wait for the MII interface to not be busy.
Index: sys/arch/mips/atheros/dev/if_ae.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/atheros/dev/if_ae.c,v
retrieving revision 1.9
diff -p -u -u -p -r1.9 if_ae.c
--- sys/arch/mips/atheros/dev/if_ae.c 17 Oct 2007 19:55:35 -0000 1.9
+++ sys/arch/mips/atheros/dev/if_ae.c 2 Jan 2008 02:17:59 -0000
@@ -164,9 +164,6 @@ static int ae_activate(struct device *, 
 static void ae_reset(struct ae_softc *);
 static void ae_idle(struct ae_softc *, u_int32_t);
 
-static int ae_mediachange(struct ifnet *);
-static void ae_mediastatus(struct ifnet *, struct ifmediareq *);
-
 static void ae_start(struct ifnet *);
 static void ae_watchdog(struct ifnet *);
 static int ae_ioctl(struct ifnet *, u_long, void *);
@@ -362,8 +359,9 @@ ae_attach(struct device *parent, struct 
 sc->sc_mii.mii_readreg = ae_mii_readreg;
 sc->sc_mii.mii_writereg = ae_mii_writereg;
 sc->sc_mii.mii_statchg = ae_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, 0, ae_mediachange,
- ae_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 
@@ -1465,7 +1463,8 @@ ae_init(struct ifnet *ifp)
 /*
 * Set the current media.
 */
- ae_mediachange(ifp);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Start the mac.
@@ -1848,48 +1847,6 @@ ae_idle(struct ae_softc *sc, u_int32_t b
 }
 
 /*****************************************************************************
- * Generic media support functions.
- *****************************************************************************/
-
-/*
- * ae_mediastatus: [ifmedia interface function]
- *
- * Query the current media.
- */
-void
-ae_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct ae_softc *sc = ifp->if_softc;
-
- if (AE_IS_ENABLED(sc) == 0) {
- ifmr->ifm_active = IFM_ETHER | IFM_NONE;
- ifmr->ifm_status = 0;
- return;
- }
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
- * ae_mediachange: [ifmedia interface function]
- *
- * Update the current media.
- */
-int
-ae_mediachange(struct ifnet *ifp)
-{
- struct ae_softc *sc = ifp->if_softc;
-
- if ((ifp->if_flags & IFF_UP) == 0)
- return (0);
-
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
-
-/*****************************************************************************
 * Support functions for MII-attached media.
 *****************************************************************************/
 
Index: sys/arch/mips/sibyte/dev/sbmac.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/sibyte/dev/sbmac.c,v
retrieving revision 1.26
diff -p -u -u -p -r1.26 sbmac.c
--- sys/arch/mips/sibyte/dev/sbmac.c 17 Oct 2007 19:55:40 -0000 1.26
+++ sys/arch/mips/sibyte/dev/sbmac.c 2 Jan 2008 02:17:59 -0000
@@ -257,8 +257,6 @@ static void sbmac_start(struct ifnet *if
 static void sbmac_setmulti(struct sbmac_softc *sc);
 static int sbmac_ether_ioctl(struct ifnet *ifp, u_long cmd, void *data);
 static int sbmac_ioctl(struct ifnet *ifp, u_long command, void *data);
-static int sbmac_mediachange(struct ifnet *ifp);
-static void sbmac_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr);
 static void sbmac_watchdog(struct ifnet *ifp);
 static int sbmac_match(struct device *parent, struct cfdata *match, void *aux);
 static void sbmac_attach(struct device *parent, struct device *self, void 
*aux);
@@ -2096,16 +2094,6 @@ sbmac_ioctl(struct ifnet *ifp, u_long co
 * else error code
 */
 
-static int
-sbmac_mediachange(struct ifnet *ifp)
-{
- struct sbmac_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return(0);
-}
-
 /*
 * SBMAC_IFMEDIA_STS(ifp, ifmr)
 *
@@ -2119,16 +2107,6 @@ sbmac_mediachange(struct ifnet *ifp)
 * nothing
 */
 
-static void
-sbmac_mediastatus(struct ifnet *ifp, struct ifmediareq *req)
-{
- struct sbmac_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- req->ifm_status = sc->sc_mii.mii_media_status;
- req->ifm_active = sc->sc_mii.mii_media_active;
-}
-
 /*
 * SBMAC_WATCHDOG(ifp)
 *
@@ -2387,8 +2365,9 @@ sbmac_attach(struct device *parent, stru
 sc->sc_mii.mii_readreg = sbmac_mii_readreg;
 sc->sc_mii.mii_writereg = sbmac_mii_writereg;
 sc->sc_mii.mii_statchg = sbmac_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, 0, sbmac_mediachange,
- sbmac_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 
Index: sys/arch/playstation2/dev/emac3.c
===================================================================
RCS file: /cvsroot/src/sys/arch/playstation2/dev/emac3.c,v
retrieving revision 1.5
diff -p -u -u -p -r1.5 emac3.c
--- sys/arch/playstation2/dev/emac3.c 15 Dec 2007 00:39:21 -0000 1.5
+++ sys/arch/playstation2/dev/emac3.c 2 Jan 2008 02:17:59 -0000
@@ -313,28 +313,6 @@ emac3_config(const u_int8_t *eaddr)
 /*
 * PHY/MII
 */
-int
-emac3_ifmedia_upd(struct ifnet *ifp)
-{
- struct emac3_softc *sc;
-
- sc = ifp->if_softc;
-
- return (mii_mediachg(&sc->mii));
-}
-
-void
-emac3_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct emac3_softc *sc;
-
- sc = ifp->if_softc;
-
- mii_pollstat(&sc->mii);
- ifmr->ifm_status = sc->mii.mii_media_status;
- ifmr->ifm_active = sc->mii.mii_media_active;
-}
-
 void
 emac3_phy_writereg(struct device *self, int phy, int reg, int data)
 {
Index: sys/arch/playstation2/dev/emac3var.h
===================================================================
RCS file: /cvsroot/src/sys/arch/playstation2/dev/emac3var.h,v
retrieving revision 1.1
diff -p -u -u -p -r1.1 emac3var.h
--- sys/arch/playstation2/dev/emac3var.h 16 Oct 2001 15:38:33 -0000 
1.1
+++ sys/arch/playstation2/dev/emac3var.h 2 Jan 2008 02:17:59 -0000
@@ -60,8 +60,6 @@ int emac3_tx_done(void);
 
 void emac3_setmulti(struct emac3_softc *, struct ethercom *);
 
-int emac3_ifmedia_upd(struct ifnet *);
-void emac3_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 int emac3_phy_readreg(struct device *, int, int);
 void emac3_phy_writereg(struct device *, int, int, int);
 void emac3_phy_statchg(struct device *);
Index: sys/arch/playstation2/dev/if_smap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/playstation2/dev/if_smap.c,v
retrieving revision 1.10
diff -p -u -u -p -r1.10 if_smap.c
--- sys/arch/playstation2/dev/if_smap.c 15 Dec 2007 00:39:21 -0000 1.10
+++ sys/arch/playstation2/dev/if_smap.c 2 Jan 2008 02:17:59 -0000
@@ -250,7 +250,8 @@ smap_attach(struct device *parent, struc
 mii->mii_readreg = emac3_phy_readreg;
 mii->mii_writereg = emac3_phy_writereg;
 mii->mii_statchg = emac3_phy_statchg;
- ifmedia_init(&mii->mii_media, 0, emac3_ifmedia_upd, emac3_ifmedia_sts);
+ sc->ethercom.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus);
 mii_attach(&emac3->dev, mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 
@@ -615,6 +616,7 @@ smap_init(struct ifnet *ifp)
 {
 struct smap_softc *sc = ifp->if_softc;
 u_int16_t r16;
+ int rc;
 
 smap_fifo_init(sc);
 emac3_reset(&sc->emac3);
@@ -636,7 +638,10 @@ smap_init(struct ifnet *ifp)
 emac3_setmulti(&sc->emac3, &sc->ethercom);
 
 /* Set current media. */
- mii_mediachg(&sc->emac3.mii);
+ if ((rc = mii_mediachg(&sc->emac3.mii)) == ENXIO)
+ rc = 0;
+ else if (rc != 0)
+ return rc;
 
 ifp->if_flags |= IFF_RUNNING;
 
Index: sys/arch/powerpc/ibm4xx/dev/if_emac.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/ibm4xx/dev/if_emac.c,v
retrieving revision 1.30
diff -p -u -u -p -r1.30 if_emac.c
--- sys/arch/powerpc/ibm4xx/dev/if_emac.c 17 Oct 2007 19:56:39 -0000 
1.30
+++ sys/arch/powerpc/ibm4xx/dev/if_emac.c 2 Jan 2008 02:17:59 -0000
@@ -270,8 +270,6 @@ static int emac_txde_intr(void *);
 static int emac_rxde_intr(void *);
 static int emac_intr(void *);
 
-static int emac_mediachange(struct ifnet *);
-static void emac_mediastatus(struct ifnet *, struct ifmediareq *);
 static int emac_mii_readreg(struct device *, int, int);
 static void emac_mii_statchg(struct device *);
 static void emac_mii_tick(void *);
@@ -419,8 +417,8 @@ emac_attach(struct device *parent, struc
 mii->mii_writereg = emac_mii_writereg;
 mii->mii_statchg = emac_mii_statchg;
 
- ifmedia_init(&mii->mii_media, 0, emac_mediachange,
- emac_mediastatus);
+ sc->sc_ethercom.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus);
 mii_attach(&sc->sc_dev, mii, 0xffffffff,
 MII_PHY_ANY, MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&mii->mii_phys) == NULL) {
@@ -778,7 +776,8 @@ emac_init(struct ifnet *ifp)
 /*
 * Set the current media.
 */
- mii_mediachg(&sc->sc_mii);
+ if ((error = emac_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Give the transmit and receive rings to the MAL.
@@ -1564,26 +1563,3 @@ emac_mii_tick(void *arg)
 
 callout_reset(&sc->sc_callout, hz, emac_mii_tick, sc);
 }
-
-/* ifmedia interface function */
-static void
-emac_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct emac_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
-
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/* ifmedia interface function */
-static int
-emac_mediachange(struct ifnet *ifp)
-{
- struct emac_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
Index: sys/arch/sgimips/mace/if_mec.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sgimips/mace/if_mec.c,v
retrieving revision 1.13
diff -p -u -u -p -r1.13 if_mec.c
--- sys/arch/sgimips/mace/if_mec.c 17 Oct 2007 19:57:05 -0000 1.13
+++ sys/arch/sgimips/mace/if_mec.c 2 Jan 2008 02:17:59 -0000
@@ -338,8 +338,6 @@ STATIC int mec_mii_readreg(struct device
 STATIC void mec_mii_writereg(struct device *, int, int, int);
 STATIC int mec_mii_wait(struct mec_softc *);
 STATIC void mec_statchg(struct device *);
-STATIC void mec_mediastatus(struct ifnet *, struct ifmediareq *);
-STATIC int mec_mediachange(struct ifnet *);
 
 static void enaddr_aton(const char *, uint8_t *);
 
@@ -475,8 +473,9 @@ mec_attach(struct device *parent, struct
 sc->sc_mii.mii_statchg = mec_statchg;
 
 /* Set up PHY properties */
- ifmedia_init(&sc->sc_mii.mii_media, 0, mec_mediachange,
- mec_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 
@@ -642,30 +641,6 @@ mec_statchg(struct device *self)
 bus_space_write_8(st, sh, MEC_MAC_CONTROL, control);
 }
 
-STATIC void
-mec_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct mec_softc *sc = ifp->if_softc;
-
- if ((ifp->if_flags & IFF_UP) == 0)
- return;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-STATIC int
-mec_mediachange(struct ifnet *ifp)
-{
- struct mec_softc *sc = ifp->if_softc;
-
- if ((ifp->if_flags & IFF_UP) == 0)
- return 0;
-
- return mii_mediachg(&sc->sc_mii);
-}
-
 /*
 * XXX
 * maybe this function should be moved to common part
@@ -703,7 +678,7 @@ mec_init(struct ifnet *ifp)
 bus_space_tag_t st = sc->sc_st;
 bus_space_handle_t sh = sc->sc_sh;
 struct mec_rxdesc *rxd;
- int i;
+ int i, rc;
 
 /* cancel any pending I/O */
 mec_stop(ifp, 0);
@@ -747,12 +722,13 @@ mec_init(struct ifnet *ifp)
 
 callout_reset(&sc->sc_tick_ch, hz, mec_tick, sc);
 
+ if ((rc = ether_mediachange(ifp)) != 0)
+ return rc;
+
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 mec_start(ifp);
 
- mii_mediachg(&sc->sc_mii);
-
 return 0;
 }
 
Index: sys/dev/ic/aic6915.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/aic6915.c,v
retrieving revision 1.19
diff -p -u -u -p -r1.19 aic6915.c
--- sys/dev/ic/aic6915.c 19 Oct 2007 11:59:46 -0000 1.19
+++ sys/dev/ic/aic6915.c 2 Jan 2008 02:17:59 -0000
@@ -101,9 +101,6 @@ static void sf_mii_statchg(struct device
 
 static void sf_tick(void *);
 
-static int sf_mediachange(struct ifnet *);
-static void sf_mediastatus(struct ifnet *, struct ifmediareq *);
-
 #define sf_funcreg_read(sc, reg) 
\
 bus_space_read_4((sc)->sc_st, (sc)->sc_sh_func, (reg))
 #define sf_funcreg_write(sc, reg, val) 
\
@@ -271,8 +268,9 @@ sf_attach(struct sf_softc *sc)
 sc->sc_mii.mii_readreg = sf_mii_read;
 sc->sc_mii.mii_writereg = sf_mii_write;
 sc->sc_mii.mii_statchg = sf_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, sf_mediachange,
- sf_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
@@ -1088,7 +1086,8 @@ sf_init(struct ifnet *ifp)
 /*
 * Set the media.
 */
- mii_mediachg(&sc->sc_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Initialize the interrupt register.
@@ -1443,33 +1442,3 @@ sf_mii_statchg(struct device *self)
 
 sf_genreg_write(sc, SF_BkToBkIPG, ipg);
 }
-
-/*
- * sf_mediastatus: [ifmedia interface function]
- *
- * Callback from ifmedia to request current media status.
- */
-static void
-sf_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct sf_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
- * sf_mediachange: [ifmedia interface function]
- *
- * Callback from ifmedia to request new media setting.
- */
-static int
-sf_mediachange(struct ifnet *ifp)
-{
- struct sf_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
Index: sys/dev/ic/ax88190.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/ax88190.c,v
retrieving revision 1.8
diff -p -u -u -p -r1.8 ax88190.c
--- sys/dev/ic/ax88190.c 19 Oct 2007 11:59:48 -0000 1.8
+++ sys/dev/ic/ax88190.c 2 Jan 2008 02:17:59 -0000
@@ -120,9 +120,11 @@ ax88190_media_fini(struct dp8390_softc *
 int
 ax88190_mediachange(struct dp8390_softc *sc)
 {
+ int rc;
 
- mii_mediachg(&sc->sc_mii);
- return (0);
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 void
Index: sys/dev/ic/dl10019.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/dl10019.c,v
retrieving revision 1.8
diff -p -u -u -p -r1.8 dl10019.c
--- sys/dev/ic/dl10019.c 19 Oct 2007 11:59:50 -0000 1.8
+++ sys/dev/ic/dl10019.c 2 Jan 2008 02:17:59 -0000
@@ -154,9 +154,11 @@ dl10019_media_fini(struct dp8390_softc *
 int
 dl10019_mediachange(struct dp8390_softc *sc)
 {
+ int rc;
 
- mii_mediachg(&sc->sc_mii);
- return (0);
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 void
Index: sys/dev/ic/gem.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/gem.c,v
retrieving revision 1.67
diff -p -u -u -p -r1.67 gem.c
--- sys/dev/ic/gem.c 31 Dec 2007 21:43:57 -0000 1.67
+++ sys/dev/ic/gem.c 2 Jan 2008 02:17:59 -0000
@@ -113,7 +113,6 @@ static void gem_mii_writereg(struct devi
 static void gem_mii_statchg(struct device *);
 
 int gem_mediachange(struct ifnet *);
-void gem_mediastatus(struct ifnet *, struct ifmediareq *);
 
 struct mbuf *gem_get(struct gem_softc *, int, int);
 int gem_put(struct gem_softc *, int, struct mbuf *);
@@ -146,7 +145,6 @@ gem_attach(sc, enaddr)
 {
 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
 struct mii_data *mii = &sc->sc_mii;
- struct mii_softc *child;
 struct ifmedia_entry *ifm;
 int i, error;
 u_int32_t v;
@@ -297,7 +295,9 @@ gem_attach(sc, enaddr)
 mii->mii_writereg = gem_mii_writereg;
 mii->mii_statchg = gem_mii_statchg;
 
- ifmedia_init(&mii->mii_media, IFM_IMASK, gem_mediachange, 
gem_mediastatus);
+ sc->sc_ethercom.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, IFM_IMASK, gem_mediachange,
+ ether_mediastatus);
 
 gem_mifinit(sc);
 
@@ -309,12 +309,13 @@ gem_attach(sc, enaddr)
 MII_PHY_ANY, MII_OFFSET_ANY, MIIF_FORCEANEG);
 #endif
 
- child = LIST_FIRST(&mii->mii_phys);
- if (child == NULL) {
+ if (LIST_EMPTY(&mii->mii_phys)) {
 /* No PHY attached */
 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
 } else {
+ struct mii_softc *child;
+
 /*
 * Walk along the list of attached MII devices and
 * establish an `MII instance' to `phy number'
@@ -322,7 +323,7 @@ gem_attach(sc, enaddr)
 * requests to determine which phy to use to program
 * the MIF configuration register.
 */
- for (; child != NULL; child = LIST_NEXT(child, mii_list)) {
+ LIST_FOREACH(child, &mii->mii_phys, mii_list) {
 /*
 * Note: we support just two PHYs: the built-in
 * internal device and an external on the MII
@@ -794,7 +795,7 @@ gem_init(struct ifnet *ifp)
 struct gem_softc *sc = (struct gem_softc *)ifp->if_softc;
 bus_space_tag_t t = sc->sc_bustag;
 bus_space_handle_t h = sc->sc_h1;
- int s;
+ int rc = 0, s;
 u_int max_frame_size;
 u_int32_t v;
 
@@ -892,7 +893,8 @@ gem_init(struct ifnet *ifp)
 bus_space_write_4(t, h, GEM_RX_BLANKING, (6<<12)|6);
 
 /* step 11. Configure Media */
- mii_mediachg(&sc->sc_mii);
+ if ((rc = gem_mediachange(ifp)) != 0)
+ goto out;
 
 /* XXXX Serial link needs a whole different setup. */
 
@@ -919,6 +921,7 @@ gem_init(struct ifnet *ifp)
 ifp->if_flags &= ~IFF_OACTIVE;
 ifp->if_timer = 0;
 sc->sc_if_flags = ifp->if_flags;
+out:
 splx(s);
 
 return (0);
@@ -2014,26 +2017,14 @@ gem_mediachange(ifp)
 struct ifnet *ifp;
 {
 struct gem_softc *sc = ifp->if_softc;
+ int rc;
 
 if (IFM_TYPE(sc->sc_media.ifm_media) != IFM_ETHER)
 return (EINVAL);
 
- return (mii_mediachg(&sc->sc_mii));
-}
-
-void
-gem_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct gem_softc *sc = ifp->if_softc;
-
- if ((ifp->if_flags & IFF_UP) == 0)
- return;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 /*
Index: sys/dev/ic/hme.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/hme.c,v
retrieving revision 1.60
diff -p -u -u -p -r1.60 hme.c
--- sys/dev/ic/hme.c 19 Oct 2007 11:59:52 -0000 1.60
+++ sys/dev/ic/hme.c 2 Jan 2008 02:18:00 -0000
@@ -98,7 +98,7 @@ int hme_ioctl(struct ifnet *, u_long, v
 void hme_tick(void *);
 void hme_watchdog(struct ifnet *);
 void hme_shutdown(void *);
-void hme_init(struct hme_softc *);
+int hme_init(struct hme_softc *);
 void hme_meminit(struct hme_softc *);
 void hme_mifinit(struct hme_softc *);
 void hme_reset(struct hme_softc *);
@@ -110,7 +110,6 @@ static void hme_mii_writereg(struct devi
 static void hme_mii_statchg(struct device *);
 
 int hme_mediachange(struct ifnet *);
-void hme_mediastatus(struct ifnet *, struct ifmediareq *);
 
 struct mbuf *hme_get(struct hme_softc *, int, uint32_t);
 int hme_put(struct hme_softc *, int, struct mbuf *);
@@ -263,7 +262,8 @@ hme_config(sc)
 mii->mii_writereg = hme_mii_writereg;
 mii->mii_statchg = hme_mii_statchg;
 
- ifmedia_init(&mii->mii_media, 0, hme_mediachange, hme_mediastatus);
+ sc->sc_ethercom.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, hme_mediachange, ether_mediastatus);
 
 hme_mifinit(sc);
 
@@ -348,7 +348,7 @@ hme_reset(sc)
 int s;
 
 s = splnet();
- hme_init(sc);
+ (void)hme_init(sc);
 splx(s);
 }
 
@@ -462,7 +462,7 @@ hme_meminit(sc)
 * Initialization of interface; set up initialization block
 * and transmit/receive descriptor rings.
 */
-void
+int
 hme_init(sc)
 struct hme_softc *sc;
 {
@@ -474,6 +474,7 @@ hme_init(sc)
 bus_space_handle_t mac = sc->sc_mac;
 u_int8_t *ea;
 u_int32_t v;
+ int rc;
 
 /*
 * Initialization sequence. The numbered steps below correspond
@@ -634,7 +635,8 @@ hme_init(sc)
 (*sc->sc_hwinit)(sc);
 
 /* Set the current media. */
- mii_mediachg(&sc->sc_mii);
+ if ((rc = hme_mediachange(ifp)) != 0)
+ return rc;
 
 /* Start the one second timer. */
 callout_reset(&sc->sc_tick_ch, hz, hme_tick, sc);
@@ -644,6 +646,7 @@ hme_init(sc)
 sc->sc_if_flags = ifp->if_flags;
 ifp->if_timer = 0;
 hme_start(ifp);
+ return 0;
 }
 
 /*
@@ -1374,6 +1377,7 @@ hme_mediachange(ifp)
 bus_space_handle_t mac = sc->sc_mac;
 int instance = IFM_INST(sc->sc_mii.mii_media.ifm_cur->ifm_media);
 int phy = sc->sc_phys[instance];
+ int rc;
 u_int32_t v;
 
 #ifdef HMEDEBUG
@@ -1397,22 +1401,9 @@ hme_mediachange(ifp)
 v |= HME_MAC_XIF_MIIENABLE;
 bus_space_write_4(t, mac, HME_MACI_XIF, v);
 
- return (mii_mediachg(&sc->sc_mii));
-}
-
-void
-hme_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct hme_softc *sc = ifp->if_softc;
-
- if ((ifp->if_flags & IFF_UP) == 0)
- return;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 /*
@@ -1441,14 +1432,14 @@ hme_ioctl(ifp, cmd, data)
 hme_setladrf(sc);
 else {
 ifp->if_flags |= IFF_UP;
- hme_init(sc);
+ error = hme_init(sc);
 }
 arp_ifinit(ifp, ifa);
 break;
 #endif
 default:
 ifp->if_flags |= IFF_UP;
- hme_init(sc);
+ error = hme_init(sc);
 break;
 }
 break;
@@ -1472,7 +1463,7 @@ hme_ioctl(ifp, cmd, data)
 * If interface is marked up and it is stopped, then
 * start it.
 */
- hme_init(sc);
+ error = hme_init(sc);
 } else if ((ifp->if_flags & IFF_UP) != 0) {
 /*
 * If setting debug or promiscuous mode, do not reset
@@ -1485,13 +1476,13 @@ hme_ioctl(ifp, cmd, data)
 == (sc->sc_if_flags & (~RESETIGN)))
 hme_setladrf(sc);
 else
- hme_init(sc);
+ error = hme_init(sc);
 }
 #undef RESETIGN
 }
 
 if (sc->sc_ec_capenable != sc->sc_ethercom.ec_capenable)
- hme_init(sc);
+ error = hme_init(sc);
 
 break;
 
Index: sys/dev/ic/i82557.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/i82557.c,v
retrieving revision 1.108
diff -p -u -u -p -r1.108 i82557.c
--- sys/dev/ic/i82557.c 17 Dec 2007 12:18:31 -0000 1.108
+++ sys/dev/ic/i82557.c 2 Jan 2008 02:18:00 -0000
@@ -175,7 +175,6 @@ const u_int8_t fxp_cb_config_template[] 
 };
 
 void fxp_mii_initmedia(struct fxp_softc *);
-int fxp_mii_mediachange(struct ifnet *);
 void fxp_mii_mediastatus(struct ifnet *, struct ifmediareq *);
 
 void fxp_80c24_initmedia(struct fxp_softc *);
@@ -478,7 +477,9 @@ fxp_mii_initmedia(struct fxp_softc *sc)
 sc->sc_mii.mii_readreg = fxp_mdi_read;
 sc->sc_mii.mii_writereg = fxp_mdi_write;
 sc->sc_mii.mii_statchg = fxp_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, fxp_mii_mediachange,
+
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, ether_mediachange,
 fxp_mii_mediastatus);
 
 flags = MIIF_NOISOLATE;
@@ -1895,7 +1896,8 @@ fxp_init(struct ifnet *ifp)
 /*
 * Set current media.
 */
- mii_mediachg(&sc->sc_mii);
+ if ((error = (*sc->sc_mii.mii_media.ifm_change)(ifp)) != 0)
+ goto out;
 }
 
 /*
@@ -1935,19 +1937,6 @@ fxp_init(struct ifnet *ifp)
 }
 
 /*
- * Change media according to request.
- */
-int
-fxp_mii_mediachange(struct ifnet *ifp)
-{
- struct fxp_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
-
-/*
 * Notify the world which media we're using.
 */
 void
@@ -1961,9 +1950,7 @@ fxp_mii_mediastatus(struct ifnet *ifp, s
 return;
 }
 
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
+ ether_mediastatus(ifp, ifmr);
 
 /*
 * XXX Flow control is always turned on if the chip supports
Index: sys/dev/ic/mtd803.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/mtd803.c,v
retrieving revision 1.16
diff -p -u -u -p -r1.16 mtd803.c
--- sys/dev/ic/mtd803.c 5 Dec 2007 07:58:30 -0000 1.16
+++ sys/dev/ic/mtd803.c 2 Jan 2008 02:18:00 -0000
@@ -125,8 +125,6 @@ void mtd_stop(struct ifnet *, int);
 int mtd_ioctl(struct ifnet *, u_long, void *);
 void mtd_setmulti(struct mtd_softc *);
 void mtd_watchdog(struct ifnet *);
-int mtd_mediachange(struct ifnet *);
-void mtd_mediastatus(struct ifnet *, struct ifmediareq *);
 
 int mtd_init(struct ifnet *);
 void mtd_reset(struct mtd_softc *);
@@ -168,7 +166,9 @@ mtd_config(sc)
 sc->mii.mii_writereg = mtd_mii_writereg;
 sc->mii.mii_statchg = mtd_mii_statchg;
 
- ifmedia_init(&sc->mii.mii_media, 0, mtd_mediachange, mtd_mediastatus);
+ sc->ethercom.ec_mii = &sc->mii;
+ ifmedia_init(&sc->mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 
 mii_attach(&sc->dev, &sc->mii, 0xffffffff, MII_PHY_ANY, 0, 0);
 
@@ -601,7 +601,11 @@ mtd_ioctl(ifp, cmd, data)
 error = 0;
 }
 break;
-
+ case SIOCSIFMEDIA:
+ case SIOCGIFMEDIA:
+ error = ifmedia_ioctl(ifp, (struct ifreq *)data,
+ &sc->mii.mii_media, cmd);
+ break;
 default:
 error = ether_ioctl(ifp, cmd, data);
 break;
@@ -946,35 +950,6 @@ mtd_reset(sc)
 }
 
 
-int
-mtd_mediachange(ifp)
- struct ifnet *ifp;
-{
- struct mtd_softc *sc = ifp->if_softc;
-
- if (IFM_TYPE(sc->mii.mii_media.ifm_media) != IFM_ETHER)
- return EINVAL;
-
- return mii_mediachg(&sc->mii);
-}
-
-
-void
-mtd_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct mtd_softc *sc = ifp->if_softc;
-
- if ((ifp->if_flags & IFF_UP) == 0)
- return;
-
- mii_pollstat(&sc->mii);
- ifmr->ifm_active = sc->mii.mii_media_active;
- ifmr->ifm_status = sc->mii.mii_media_status;
-}
-
-
 void
 mtd_shutdown (arg)
 void *arg;
Index: sys/dev/ic/rtl8169.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/rtl8169.c,v
retrieving revision 1.91
diff -p -u -u -p -r1.91 rtl8169.c
--- sys/dev/ic/rtl8169.c 11 Dec 2007 11:52:26 -0000 1.91
+++ sys/dev/ic/rtl8169.c 2 Jan 2008 02:18:00 -0000
@@ -166,9 +166,6 @@ static void re_watchdog(struct ifnet *);
 static int re_enable(struct rtk_softc *);
 static void re_disable(struct rtk_softc *);
 
-static int re_ifmedia_upd(struct ifnet *);
-static void re_ifmedia_sts(struct ifnet *, struct ifmediareq *);
-
 static int re_gmii_readreg(struct device *, int, int);
 static void re_gmii_writereg(struct device *, int, int, int);
 
@@ -781,8 +778,9 @@ re_attach(struct rtk_softc *sc)
 sc->mii.mii_readreg = re_miibus_readreg;
 sc->mii.mii_writereg = re_miibus_writereg;
 sc->mii.mii_statchg = re_miibus_statchg;
- ifmedia_init(&sc->mii.mii_media, IFM_IMASK, re_ifmedia_upd,
- re_ifmedia_sts);
+ sc->ethercom.ec_mii = &sc->mii;
+ ifmedia_init(&sc->mii.mii_media, IFM_IMASK, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 ifmedia_set(&sc->mii.mii_media, IFM_ETHER | IFM_AUTO);
@@ -1888,34 +1886,6 @@ re_init(struct ifnet *ifp)
 return error;
 }
 
-/*
- * Set media options.
- */
-static int
-re_ifmedia_upd(struct ifnet *ifp)
-{
- struct rtk_softc *sc;
-
- sc = ifp->if_softc;
-
- return mii_mediachg(&sc->mii);
-}
-
-/*
- * Report current media status.
- */
-static void
-re_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct rtk_softc *sc;
-
- sc = ifp->if_softc;
-
- mii_pollstat(&sc->mii);
- ifmr->ifm_active = sc->mii.mii_media_active;
- ifmr->ifm_status = sc->mii.mii_media_status;
-}
-
 static int
 re_ioctl(struct ifnet *ifp, u_long command, void *data)
 {
Index: sys/dev/ic/rtl81x9.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/rtl81x9.c,v
retrieving revision 1.79
diff -p -u -u -p -r1.79 rtl81x9.c
--- sys/dev/ic/rtl81x9.c 9 Dec 2007 20:27:59 -0000 1.79
+++ sys/dev/ic/rtl81x9.c 2 Jan 2008 02:18:00 -0000
@@ -140,8 +140,6 @@ STATIC int rtk_init(struct ifnet *);
 STATIC void rtk_stop(struct ifnet *, int);
 
 STATIC void rtk_watchdog(struct ifnet *);
-STATIC int rtk_ifmedia_upd(struct ifnet *);
-STATIC void rtk_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 
 STATIC void rtk_eeprom_putbyte(struct rtk_softc *, int, int);
 STATIC void rtk_mii_sync(struct rtk_softc *);
@@ -734,8 +732,9 @@ rtk_attach(struct rtk_softc *sc)
 sc->mii.mii_readreg = rtk_phy_readreg;
 sc->mii.mii_writereg = rtk_phy_writereg;
 sc->mii.mii_statchg = rtk_phy_statchg;
- ifmedia_init(&sc->mii.mii_media, IFM_IMASK, rtk_ifmedia_upd,
- rtk_ifmedia_sts);
+ sc->ethercom.ec_mii = &sc->mii;
+ ifmedia_init(&sc->mii.mii_media, IFM_IMASK, ether_mediachange,
+ ether_mediastatus);
 mii_attach(self, &sc->mii, 0xffffffff,
 MII_PHY_ANY, MII_OFFSET_ANY, 0);
 
@@ -1434,7 +1433,8 @@ rtk_init(struct ifnet *ifp)
 /*
 * Set current media.
 */
- mii_mediachg(&sc->mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
@@ -1450,34 +1450,6 @@ rtk_init(struct ifnet *ifp)
 return error;
 }
 
-/*
- * Set media options.
- */
-STATIC int
-rtk_ifmedia_upd(struct ifnet *ifp)
-{
- struct rtk_softc *sc;
-
- sc = ifp->if_softc;
-
- return mii_mediachg(&sc->mii);
-}
-
-/*
- * Report current media status.
- */
-STATIC void
-rtk_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct rtk_softc *sc;
-
- sc = ifp->if_softc;
-
- mii_pollstat(&sc->mii);
- ifmr->ifm_status = sc->mii.mii_media_status;
- ifmr->ifm_active = sc->mii.mii_media_active;
-}
-
 STATIC int
 rtk_ioctl(struct ifnet *ifp, u_long command, void *data)
 {
Index: sys/dev/ic/smc83c170.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/smc83c170.c,v
retrieving revision 1.70
diff -p -u -u -p -r1.70 smc83c170.c
--- sys/dev/ic/smc83c170.c 30 Dec 2007 00:04:47 -0000 1.70
+++ sys/dev/ic/smc83c170.c 2 Jan 2008 02:18:00 -0000
@@ -99,7 +99,6 @@ void epic_tick(void *);
 
 void epic_statchg(struct device *);
 int epic_mediachange(struct ifnet *);
-void epic_mediastatus(struct ifnet *, struct ifmediareq *);
 
 #define INTMASK (INTSTAT_FATAL_INT | INTSTAT_TXU | \
 INTSTAT_TXC | INTSTAT_RXE | INTSTAT_RQE | INTSTAT_RCC)
@@ -262,8 +261,10 @@ epic_attach(sc)
 sc->sc_mii.mii_readreg = epic_mii_read;
 sc->sc_mii.mii_writereg = epic_mii_write;
 sc->sc_mii.mii_statchg = epic_statchg;
+
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, epic_mediachange,
- epic_mediastatus);
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, miiflags);
 if (LIST_EMPTY(&sc->sc_mii.mii_phys)) {
@@ -996,7 +997,8 @@ epic_init(ifp)
 bus_space_write_4(st, sh, EPIC_RXCON, reg0);
 
 /* Set the current media. */
- epic_mediachange(ifp);
+ if ((error = epic_mediachange(ifp)) != 0)
+ goto out;
 
 /* Set up the multicast hash table. */
 epic_set_mchash(sc);
@@ -1460,21 +1462,6 @@ epic_statchg(self)
 }
 
 /*
- * Callback from ifmedia to request current media status.
- */
-void
-epic_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- struct epic_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
 * Callback from ifmedia to request new media setting.
 *
 * XXX Looks to me like some of this complexity should move into
@@ -1490,7 +1477,7 @@ epic_mediachange(ifp)
 int media = ifm->ifm_cur->ifm_media;
 uint32_t miicfg;
 struct mii_softc *miisc;
- int cfg;
+ int cfg, rc;
 
 if ((ifp->if_flags & IFF_UP) == 0)
 return (0);
@@ -1505,7 +1492,8 @@ epic_mediachange(ifp)
 bus_space_write_4(sc->sc_st, sc->sc_sh, EPIC_MIICFG, miicfg);
 }
 
- mii_mediachg(mii);
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ rc = 0;
 
 if (IFM_INST(media) == sc->sc_serinst) {
 /* select serial interface */
@@ -1557,5 +1545,5 @@ epic_mediachange(ifp)
 PHY_WRITE(miisc, MII_LXTPHY_CONFIG, cfg);
 }
 
- return (0);
+ return rc;
 }
Index: sys/dev/ic/smc91cxx.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/smc91cxx.c,v
retrieving revision 1.63
diff -p -u -u -p -r1.63 smc91cxx.c
--- sys/dev/ic/smc91cxx.c 19 Oct 2007 12:00:01 -0000 1.63
+++ sys/dev/ic/smc91cxx.c 2 Jan 2008 02:18:00 -0000
@@ -396,6 +396,7 @@ smc91cxx_set_media(sc, media)
 bus_space_tag_t bst = sc->sc_bst;
 bus_space_handle_t bsh = sc->sc_bsh;
 u_int16_t tmp;
+ int rc;
 
 /*
 * If the interface is not currently powered on, just return.
@@ -408,8 +409,9 @@ smc91cxx_set_media(sc, media)
 if (IFM_TYPE(media) != IFM_ETHER)
 return (EINVAL);
 
- if (sc->sc_flags & SMC_FLAGS_HAS_MII)
- return (mii_mediachg(&sc->sc_mii));
+ if ((sc->sc_flags & SMC_FLAGS_HAS_MII) == 0 ||
+ (rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ rc = 0;
 
 switch (IFM_SUBTYPE(media)) {
 case IFM_10_T:
@@ -428,7 +430,7 @@ smc91cxx_set_media(sc, media)
 return (EINVAL);
 }
 
- return (0);
+ return rc;
 }
 
 /*
Index: sys/dev/ic/tulip.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/tulip.c,v
retrieving revision 1.154
diff -p -u -u -p -r1.154 tulip.c
--- sys/dev/ic/tulip.c 19 Oct 2007 12:00:03 -0000 1.154
+++ sys/dev/ic/tulip.c 2 Jan 2008 02:18:01 -0000
@@ -3394,22 +3394,24 @@ static int
 tlp_mii_setmedia(struct tulip_softc *sc)
 {
 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
+ int rc;
 
- if (ifp->if_flags & IFF_UP) {
- switch (sc->sc_chip) {
- case TULIP_CHIP_21142:
- case TULIP_CHIP_21143:
- /* Disable the internal Nway engine. */
- TULIP_WRITE(sc, CSR_SIATXRX, 0);
- break;
+ if ((ifp->if_flags & IFF_UP) == 0)
+ return 0;
+ switch (sc->sc_chip) {
+ case TULIP_CHIP_21142:
+ case TULIP_CHIP_21143:
+ /* Disable the internal Nway engine. */
+ TULIP_WRITE(sc, CSR_SIATXRX, 0);
+ break;
 
- default:
- /* Nothing. */
- break;
- }
- mii_mediachg(&sc->sc_mii);
+ default:
+ /* Nothing. */
+ break;
 }
- return (0);
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 /*
Index: sys/dev/marvell/if_gfe.c
===================================================================
RCS file: /cvsroot/src/sys/dev/marvell/if_gfe.c,v
retrieving revision 1.26
diff -p -u -u -p -r1.26 if_gfe.c
--- sys/dev/marvell/if_gfe.c 19 Oct 2007 12:00:33 -0000 1.26
+++ sys/dev/marvell/if_gfe.c 2 Jan 2008 02:18:01 -0000
@@ -155,8 +155,6 @@ STATIC int gfe_ifioctl (struct ifnet *, 
 STATIC void gfe_ifstart (struct ifnet *);
 STATIC void gfe_ifwatchdog (struct ifnet *);
 
-STATIC int gfe_mii_mediachange (struct ifnet *);
-STATIC void gfe_mii_mediastatus (struct ifnet *, struct ifmediareq *);
 STATIC int gfe_mii_read (struct device *, int, int);
 STATIC void gfe_mii_write (struct device *, int, int, int);
 STATIC void gfe_mii_statchg (struct device *);
@@ -309,8 +307,9 @@ gfe_attach(struct device *parent, struct
 sc->sc_mii.mii_writereg = gfe_mii_write;
 sc->sc_mii.mii_statchg = gfe_mii_statchg;
 
- ifmedia_init(&sc->sc_mii.mii_media, 0, gfe_mii_mediachange,
- gfe_mii_mediastatus);
+ sc->sc_ec.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, phyaddr,
 MII_OFFSET_ANY, MIIF_NOISOLATE);
@@ -1481,29 +1480,6 @@ gfe_intr(void *arg)
 }
 
 int
-gfe_mii_mediachange (struct ifnet *ifp)
-{
- struct gfe_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
-
- return (0);
-}
-void
-gfe_mii_mediastatus (struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct gfe_softc *sc = ifp->if_softc;
-
- if (sc->sc_flags & GE_PHYSTSCHG) {
- sc->sc_flags &= ~GE_PHYSTSCHG;
- mii_pollstat(&sc->sc_mii);
- }
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-int
 gfe_mii_read (struct device *self, int phy, int reg)
 {
 return gt_mii_read(self, device_parent(self), phy, reg);
Index: sys/dev/pci/if_bce.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_bce.c,v
retrieving revision 1.18
diff -p -u -u -p -r1.18 if_bce.c
--- sys/dev/pci/if_bce.c 11 Dec 2007 11:25:50 -0000 1.18
+++ sys/dev/pci/if_bce.c 2 Jan 2008 02:18:02 -0000
@@ -186,8 +186,6 @@ static void bce_set_filter(struct ifnet 
 static int bce_mii_read(struct device *, int, int);
 static void bce_mii_write(struct device *, int, int, int);
 static void bce_statchg(struct device *);
-static int bce_mediachange(struct ifnet *);
-static void bce_mediastatus(struct ifnet *, struct ifmediareq *);
 static void bce_tick(void *);
 
 #define BCE_DEBUG
@@ -470,8 +468,10 @@ bce_attach(struct device *parent, struct
 sc->bce_mii.mii_readreg = bce_mii_read;
 sc->bce_mii.mii_writereg = bce_mii_write;
 sc->bce_mii.mii_statchg = bce_statchg;
- ifmedia_init(&sc->bce_mii.mii_media, 0, bce_mediachange,
- bce_mediastatus);
+
+ sc->ethercom.ec_mii = &sc->bce_mii;
+ ifmedia_init(&sc->bce_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->bce_dev, &sc->bce_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&sc->bce_mii.mii_phys) == NULL) {
@@ -1033,7 +1033,8 @@ bce_init(struct ifnet *ifp)
 BCE_NRXDESC * sizeof(struct bce_dma_slot));
 
 /* set media */
- mii_mediachg(&sc->bce_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ return error;
 
 /* turn on the ethernet mac */
 bus_space_write_4(sc->bce_btag, sc->bce_bhandle, BCE_ENET_CTL,
@@ -1494,28 +1495,6 @@ bce_statchg(struct device *self)
 bce_mii_read((struct device *) sc, 1, 27) | (1 << 6)); /* 
MAGIC */
 }
 
-/* Set hardware to newly-selected media */
-int
-bce_mediachange(struct ifnet *ifp)
-{
- struct bce_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->bce_mii);
- return (0);
-}
-
-/* Get the current interface media status */
-static void
-bce_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct bce_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->bce_mii);
- ifmr->ifm_active = sc->bce_mii.mii_media_active;
- ifmr->ifm_status = sc->bce_mii.mii_media_status;
-}
-
 /* One second timer, checks link status */
 static void
 bce_tick(void *v)
Index: sys/dev/pci/if_bge.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_bge.c,v
retrieving revision 1.141
diff -p -u -u -p -r1.141 if_bge.c
--- sys/dev/pci/if_bge.c 9 Dec 2007 20:28:08 -0000 1.141
+++ sys/dev/pci/if_bge.c 2 Jan 2008 02:18:03 -0000
@@ -3269,7 +3269,6 @@ bge_tick(void *xsc)
 {
 struct bge_softc *sc = xsc;
 struct mii_data *mii = &sc->bge_mii;
- struct ifmedia *ifm = NULL;
 struct ifnet *ifp = &sc->ethercom.ec_if;
 int s;
 
@@ -3283,7 +3282,6 @@ bge_tick(void *xsc)
 }
 
 if (sc->bge_tbi) {
- ifm = &sc->bge_ifmedia;
 if (CSR_READ_4(sc, BGE_MAC_STS) &
 BGE_MACSTAT_TBI_PCS_SYNCHED) {
 sc->bge_link++;
@@ -3924,7 +3922,7 @@ bge_init(struct ifnet *ifp)
 {
 struct bge_softc *sc = ifp->if_softc;
 const u_int16_t *m;
- int s, error;
+ int s, error = 0;
 
 s = splnet();
 
@@ -3997,16 +3995,18 @@ bge_init(struct ifnet *ifp)
 BGE_CLRBIT(sc, BGE_PCI_MISC_CTL, BGE_PCIMISCCTL_MASK_PCI_INTR);
 CSR_WRITE_4(sc, BGE_MBX_IRQ0_LO, 0);
 
- bge_ifmedia_upd(ifp);
+ if ((error = bge_ifmedia_upd(ifp)) != 0)
+ goto out;
 
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 
- splx(s);
-
 callout_reset(&sc->bge_timeout, hz, bge_tick, sc);
 
- return 0;
+out:
+ splx(s);
+
+ return error;
 }
 
 /*
@@ -4018,6 +4018,7 @@ bge_ifmedia_upd(struct ifnet *ifp)
 struct bge_softc *sc = ifp->if_softc;
 struct mii_data *mii = &sc->bge_mii;
 struct ifmedia *ifm = &sc->bge_ifmedia;
+ int rc;
 
 /* If this is a 1000baseX NIC, enable the TBI port. */
 if (sc->bge_tbi) {
@@ -4043,9 +4044,9 @@ bge_ifmedia_upd(struct ifnet *ifp)
 }
 
 sc->bge_link = 0;
- mii_mediachg(mii);
-
- return(0);
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 /*
Index: sys/dev/pci/if_msk.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_msk.c,v
retrieving revision 1.14
diff -p -u -u -p -r1.14 if_msk.c
--- sys/dev/pci/if_msk.c 11 Dec 2007 11:25:51 -0000 1.14
+++ sys/dev/pci/if_msk.c 2 Jan 2008 02:18:03 -0000
@@ -116,8 +116,6 @@ int msk_init(struct ifnet *);
 void msk_init_yukon(struct sk_if_softc *);
 void msk_stop(struct ifnet *, int);
 void msk_watchdog(struct ifnet *);
-int msk_ifmedia_upd(struct ifnet *);
-void msk_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 void msk_reset(struct sk_softc *);
 int msk_newbuf(struct sk_if_softc *, int, struct mbuf *, bus_dmamap_t);
 int msk_alloc_jumbo_mem(struct sk_if_softc *);
@@ -690,31 +688,6 @@ msk_jfree(struct mbuf *m, void *buf, siz
 splx(s);
 }
 
-/*
- * Set media options.
- */
-int
-msk_ifmedia_upd(struct ifnet *ifp)
-{
- struct sk_if_softc *sc_if = ifp->if_softc;
-
- mii_mediachg(&sc_if->sk_mii);
- return (0);
-}
-
-/*
- * Report current media status.
- */
-void
-msk_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct sk_if_softc *sc_if = ifp->if_softc;
-
- mii_pollstat(&sc_if->sk_mii);
- ifmr->ifm_active = sc_if->sk_mii.mii_media_active;
- ifmr->ifm_status = sc_if->sk_mii.mii_media_status;
-}
-
 int
 msk_ioctl(struct ifnet *ifp, u_long command, void *data)
 {
@@ -1106,8 +1079,9 @@ msk_attach(struct device *parent, struct
 sc_if->sk_mii.mii_writereg = msk_miibus_writereg;
 sc_if->sk_mii.mii_statchg = msk_miibus_statchg;
 
+ sc_if->sk_ethercom.ec_mii = &sc_if->sk_mii;
 ifmedia_init(&sc_if->sk_mii.mii_media, 0,
- msk_ifmedia_upd, msk_ifmedia_sts);
+ ether_mediachange, ether_mediastatus);
 mii_attach(self, &sc_if->sk_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, MIIF_DOPAUSE|MIIF_FORCEANEG);
 if (LIST_FIRST(&sc_if->sk_mii.mii_phys) == NULL) {
@@ -2073,8 +2047,7 @@ msk_init(struct ifnet *ifp)
 {
 struct sk_if_softc *sc_if = ifp->if_softc;
 struct sk_softc *sc = sc_if->sk_softc;
- struct mii_data *mii = &sc_if->sk_mii;
- int s;
+ int rc = 0, s;
 uint32_t imr, imtimer_ticks;
 
 
@@ -2089,7 +2062,8 @@ msk_init(struct ifnet *ifp)
 
 /* Configure XMAC(s) */
 msk_init_yukon(sc_if);
- mii_mediachg(mii);
+ if ((rc = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /* Configure transmit arbiter(s) */
 SK_IF_WRITE_1(sc_if, 0, SK_TXAR1_COUNTERCTL, SK_TXARCTL_ON);
@@ -2204,8 +2178,9 @@ msk_init(struct ifnet *ifp)
 
 callout_schedule(&sc_if->sk_tick_ch, hz);
 
+out:
 splx(s);
- return 0;
+ return rc;
 }
 
 void
Index: sys/dev/pci/if_nfe.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_nfe.c,v
retrieving revision 1.25
diff -p -u -u -p -r1.25 if_nfe.c
--- sys/dev/pci/if_nfe.c 17 Dec 2007 12:41:06 -0000 1.25
+++ sys/dev/pci/if_nfe.c 2 Jan 2008 02:18:03 -0000
@@ -104,8 +104,6 @@ void nfe_free_rx_ring(struct nfe_softc *
 int nfe_alloc_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
 void nfe_reset_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
 void nfe_free_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
-int nfe_ifmedia_upd(struct ifnet *);
-void nfe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 void nfe_setmulti(struct nfe_softc *);
 void nfe_get_macaddr(struct nfe_softc *, uint8_t *);
 void nfe_set_macaddr(struct nfe_softc *, const uint8_t *);
@@ -352,8 +350,9 @@ nfe_attach(struct device *parent, struct
 sc->sc_mii.mii_writereg = nfe_miibus_writereg;
 sc->sc_mii.mii_statchg = nfe_miibus_statchg;
 
- ifmedia_init(&sc->sc_mii.mii_media, 0, nfe_ifmedia_upd,
- nfe_ifmedia_sts);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 mii_attach(self, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
@@ -1173,7 +1172,7 @@ nfe_init(struct ifnet *ifp)
 {
 struct nfe_softc *sc = ifp->if_softc;
 uint32_t tmp;
- int s;
+ int rc = 0, s;
 
 if (ifp->if_flags & IFF_RUNNING)
 return 0;
@@ -1266,7 +1265,8 @@ nfe_init(struct ifnet *ifp)
 /* set Rx filter */
 nfe_setmulti(sc);
 
- nfe_ifmedia_upd(ifp);
+ if ((rc = ether_mediachange(ifp)) != 0)
+ goto out;
 
 nfe_tick(sc);
 
@@ -1286,7 +1286,8 @@ nfe_init(struct ifnet *ifp)
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 
- return 0;
+out:
+ return rc;
 }
 
 void
@@ -1787,31 +1788,6 @@ nfe_free_tx_ring(struct nfe_softc *sc, s
 }
 }
 
-int
-nfe_ifmedia_upd(struct ifnet *ifp)
-{
- struct nfe_softc *sc = ifp->if_softc;
- struct mii_data *mii = &sc->sc_mii;
- struct mii_softc *miisc;
-
- if (mii->mii_instance != 0) {
- LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
- mii_phy_reset(miisc);
- }
- return mii_mediachg(mii);
-}
-
-void
-nfe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct nfe_softc *sc = ifp->if_softc;
- struct mii_data *mii = &sc->sc_mii;
-
- mii_pollstat(mii);
- ifmr->ifm_status = mii->mii_media_status;
- ifmr->ifm_active = mii->mii_media_active;
-}
-
 void
 nfe_setmulti(struct nfe_softc *sc)
 {
Index: sys/dev/pci/if_pcn.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_pcn.c,v
retrieving revision 1.41
diff -p -u -u -p -r1.41 if_pcn.c
--- sys/dev/pci/if_pcn.c 19 Oct 2007 12:00:47 -0000 1.41
+++ sys/dev/pci/if_pcn.c 2 Jan 2008 02:18:03 -0000
@@ -422,8 +422,6 @@ static int pcn_79c970_mediachange(struct
 static void pcn_79c970_mediastatus(struct ifnet *, struct ifmediareq *);
 
 static void pcn_79c971_mediainit(struct pcn_softc *);
-static int pcn_79c971_mediachange(struct ifnet *);
-static void pcn_79c971_mediastatus(struct ifnet *, struct ifmediareq *);
 
 /*
 * Description of a PCnet-PCI variant. Used to select media access
@@ -1824,7 +1822,8 @@ pcn_init(struct ifnet *ifp)
 }
 
 /* Set the media. */
- (void) (*sc->sc_mii.mii_media.ifm_change)(ifp);
+ if ((error = (*sc->sc_mii.mii_media.ifm_change)(ifp)) != 0)
+ goto out;
 
 /* Enable interrupts and external activity (and ACK IDON). */
 pcn_csr_write(sc, LE_CSR0, LE_C0_INEA|LE_C0_STRT|LE_C0_IDON);
@@ -2142,8 +2141,10 @@ pcn_79c971_mediainit(struct pcn_softc *s
 sc->sc_mii.mii_readreg = pcn_mii_readreg;
 sc->sc_mii.mii_writereg = pcn_mii_writereg;
 sc->sc_mii.mii_statchg = pcn_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, 0, pcn_79c971_mediachange,
- pcn_79c971_mediastatus);
+
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
@@ -2155,36 +2156,6 @@ pcn_79c971_mediainit(struct pcn_softc *s
 }
 
 /*
- * pcn_79c971_mediastatus: [ifmedia interface function]
- *
- * Get the current interface media status (Am79c971 version).
- */
-static void
-pcn_79c971_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct pcn_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
- * pcn_79c971_mediachange: [ifmedia interface function]
- *
- * Set hardware to newly-selected media (Am79c971 version).
- */
-static int
-pcn_79c971_mediachange(struct ifnet *ifp)
-{
- struct pcn_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
-
-/*
 * pcn_mii_readreg: [mii interface function]
 *
 * Read a PHY register on the MII.
Index: sys/dev/pci/if_sip.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_sip.c,v
retrieving revision 1.124
diff -p -u -u -p -r1.124 if_sip.c
--- sys/dev/pci/if_sip.c 16 Dec 2007 21:17:00 -0000 1.124
+++ sys/dev/pci/if_sip.c 2 Jan 2008 02:18:03 -0000
@@ -610,7 +610,6 @@ static int sipcom_dp83815_mii_readreg(st
 static void sipcom_dp83815_mii_writereg(struct device *, int, int, int);
 static void sipcom_dp83815_mii_statchg(struct device *);
 
-static int sipcom_mediachange(struct ifnet *);
 static void sipcom_mediastatus(struct ifnet *, struct ifmediareq *);
 
 static int sipcom_match(struct device *, struct cfdata *, void *);
@@ -1230,7 +1229,8 @@ sipcom_attach(device_t parent, device_t 
 sc->sc_mii.mii_readreg = sip->sip_variant->sipv_mii_readreg;
 sc->sc_mii.mii_writereg = sip->sip_variant->sipv_mii_writereg;
 sc->sc_mii.mii_statchg = sip->sip_variant->sipv_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, sipcom_mediachange,
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, ether_mediachange,
 sipcom_mediastatus);
 
 /*
@@ -2781,7 +2781,8 @@ sipcom_init(struct ifnet *ifp)
 * IMR, since sip_mii_statchg() modifies the IMR for 802.3x flow
 * control.
 */
- mii_mediachg(&sc->sc_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Set the interrupt hold-off timer to 100us.
@@ -3954,23 +3955,7 @@ sipcom_mediastatus(struct ifnet *ifp, st
 {
 struct sip_softc *sc = ifp->if_softc;
 
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = (sc->sc_mii.mii_media_active & ~IFM_ETH_FMASK) |
+ ether_mediastatus(ifp, ifmr);
+ ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) |
 sc->sc_flowflags;
 }
-
-/*
- * sip_mediachange: [ifmedia interface function]
- *
- * Set hardware to newly-selected media.
- */
-static int
-sipcom_mediachange(struct ifnet *ifp)
-{
- struct sip_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
Index: sys/dev/pci/if_sk.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_sk.c,v
retrieving revision 1.45
diff -p -u -u -p -r1.45 if_sk.c
--- sys/dev/pci/if_sk.c 11 Dec 2007 11:25:52 -0000 1.45
+++ sys/dev/pci/if_sk.c 2 Jan 2008 02:18:03 -0000
@@ -187,7 +187,6 @@ void sk_stop(struct ifnet *, int);
 void sk_watchdog(struct ifnet *);
 void sk_shutdown(void *);
 int sk_ifmedia_upd(struct ifnet *);
-void sk_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 void sk_reset(struct sk_softc *);
 int sk_newbuf(struct sk_if_softc *, int, struct mbuf *, bus_dmamap_t);
 int sk_alloc_jumbo_mem(struct sk_if_softc *);
@@ -979,23 +978,12 @@ int
 sk_ifmedia_upd(struct ifnet *ifp)
 {
 struct sk_if_softc *sc_if = ifp->if_softc;
+ int rc;
 
 (void) sk_init(ifp);
- mii_mediachg(&sc_if->sk_mii);
- return 0;
-}
-
-/*
- * Report current media status.
- */
-void
-sk_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct sk_if_softc *sc_if = ifp->if_softc;
-
- mii_pollstat(&sc_if->sk_mii);
- ifmr->ifm_active = sc_if->sk_mii.mii_media_active;
- ifmr->ifm_status = sc_if->sk_mii.mii_media_status;
+ if ((rc = mii_mediachg(&sc_if->sk_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 int
@@ -1447,11 +1435,12 @@ sk_attach(struct device *parent, struct 
 break;
 }
 
+ sc_if->sk_ethercom.ec_mii = &sc_if->sk_mii;
 ifmedia_init(&sc_if->sk_mii.mii_media, 0,
- sk_ifmedia_upd, sk_ifmedia_sts);
+ sk_ifmedia_upd, ether_mediastatus);
 mii_attach(self, &sc_if->sk_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
- if (LIST_FIRST(&sc_if->sk_mii.mii_phys) == NULL) {
+ if (LIST_EMPTY(&sc_if->sk_mii.mii_phys)) {
 aprint_error("%s: no PHY found!\n", sc_if->sk_dev.dv_xname);
 ifmedia_add(&sc_if->sk_mii.mii_media, IFM_ETHER|IFM_MANUAL,
 0, NULL);
@@ -2255,7 +2244,7 @@ sk_intr_bcom(struct sk_if_softc *sc_if)
 SK_PHYADDR_BCOM, BRGPHY_MII_AUXSTS);
 
 if (!(lstat & BRGPHY_AUXSTS_LINK) && sc_if->sk_link) {
- mii_mediachg(mii);
+ (void)mii_mediachg(mii);
 /* Turn off the link LED. */
 SK_IF_WRITE_1(sc_if, 0,
 SK_LINKLED1_CTL, SK_LINKLED_OFF);
@@ -2714,7 +2703,7 @@ sk_init(struct ifnet *ifp)
 struct sk_if_softc *sc_if = ifp->if_softc;
 struct sk_softc *sc = sc_if->sk_softc;
 struct mii_data *mii = &sc_if->sk_mii;
- int s;
+ int rc = 0, s;
 u_int32_t imr, imtimer_ticks;
 
 DPRINTFN(1, ("sk_init\n"));
@@ -2757,7 +2746,10 @@ sk_init(struct ifnet *ifp)
 sk_init_yukon(sc_if);
 break;
 }
- mii_mediachg(mii);
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ rc = 0;
+ else if (rc != 0)
+ goto out;
 
 if (sc->sk_type == SK_GENESIS) {
 /* Configure MAC FIFOs */
@@ -2872,8 +2864,9 @@ sk_init(struct ifnet *ifp)
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 
+out:
 splx(s);
- return 0;
+ return rc;
 }
 
 void
Index: sys/dev/pci/if_ste.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_ste.c,v
retrieving revision 1.31
diff -p -u -u -p -r1.31 if_ste.c
--- sys/dev/pci/if_ste.c 19 Oct 2007 12:00:48 -0000 1.31
+++ sys/dev/pci/if_ste.c 2 Jan 2008 02:18:04 -0000
@@ -232,9 +232,6 @@ static int ste_mii_readreg(struct device
 static void ste_mii_writereg(struct device *, int, int, int);
 static void ste_mii_statchg(struct device *);
 
-static int ste_mediachange(struct ifnet *);
-static void ste_mediastatus(struct ifnet *, struct ifmediareq *);
-
 static int ste_match(struct device *, struct cfdata *, void *);
 static void ste_attach(struct device *, struct device *, void *);
 
@@ -474,8 +471,9 @@ ste_attach(struct device *parent, struct
 sc->sc_mii.mii_readreg = ste_mii_readreg;
 sc->sc_mii.mii_writereg = ste_mii_writereg;
 sc->sc_mii.mii_statchg = ste_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, ste_mediachange,
- ste_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
@@ -1339,7 +1337,8 @@ ste_init(struct ifnet *ifp)
 /*
 * Set the current media.
 */
- mii_mediachg(&sc->sc_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Start the MAC.
@@ -1683,33 +1682,3 @@ ste_mii_bitbang_write(struct device *sel
 
 bus_space_write_1(sc->sc_st, sc->sc_sh, STE_PhyCtrl, val);
 }
-
-/*
- * ste_mediastatus: [ifmedia interface function]
- *
- * Get the current interface media status.
- */
-static void
-ste_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct ste_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
- * ste_mediachange: [ifmedia interface function]
- *
- * Set hardware to newly-selected media.
- */
-static int
-ste_mediachange(struct ifnet *ifp)
-{
- struct ste_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
Index: sys/dev/pci/if_stge.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_stge.c,v
retrieving revision 1.39
diff -p -u -u -p -r1.39 if_stge.c
--- sys/dev/pci/if_stge.c 19 Oct 2007 12:00:48 -0000 1.39
+++ sys/dev/pci/if_stge.c 2 Jan 2008 02:18:04 -0000
@@ -293,9 +293,6 @@ static int stge_mii_readreg(struct devic
 static void stge_mii_writereg(struct device *, int, int, int);
 static void stge_mii_statchg(struct device *);
 
-static int stge_mediachange(struct ifnet *);
-static void stge_mediastatus(struct ifnet *, struct ifmediareq *);
-
 static int stge_match(struct device *, struct cfdata *, void *);
 static void stge_attach(struct device *, struct device *, void *);
 
@@ -596,8 +593,9 @@ stge_attach(struct device *parent, struc
 sc->sc_mii.mii_readreg = stge_mii_readreg;
 sc->sc_mii.mii_writereg = stge_mii_writereg;
 sc->sc_mii.mii_statchg = stge_mii_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, stge_mediachange,
- stge_mediastatus);
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, MIIF_DOPAUSE);
 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
@@ -1658,7 +1656,8 @@ stge_init(struct ifnet *ifp)
 /*
 * Set the current media.
 */
- mii_mediachg(&sc->sc_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /*
 * Start the one second MII clock.
@@ -2002,33 +2001,3 @@ stge_mii_bitbang_write(struct device *se
 bus_space_write_1(sc->sc_st, sc->sc_sh, STGE_PhyCtrl,
 val | sc->sc_PhyCtrl);
 }
-
-/*
- * stge_mediastatus: [ifmedia interface function]
- *
- * Get the current interface media status.
- */
-static void
-stge_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct stge_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = sc->sc_mii.mii_media_active;
-}
-
-/*
- * stge_mediachange: [ifmedia interface function]
- *
- * Set hardware to newly-selected media.
- */
-static int
-stge_mediachange(struct ifnet *ifp)
-{
- struct stge_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->sc_mii);
- return (0);
-}
Index: sys/dev/pci/if_tl.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_tl.c,v
retrieving revision 1.84
diff -p -u -u -p -r1.84 if_tl.c
--- sys/dev/pci/if_tl.c 19 Oct 2007 12:00:48 -0000 1.84
+++ sys/dev/pci/if_tl.c 2 Jan 2008 02:18:04 -0000
@@ -124,7 +124,6 @@ static int tl_intr(void *);
 
 static int tl_ifioctl(struct ifnet *, ioctl_cmd_t, void *);
 static int tl_mediachange(struct ifnet *);
-static void tl_mediastatus(struct ifnet *, struct ifmediareq *);
 static void tl_ifwatchdog(struct ifnet *);
 static void tl_shutdown(void*);
 
@@ -453,8 +452,9 @@ tl_pci_attach(struct device *parent, str
 sc->tl_mii.mii_readreg = tl_mii_read;
 sc->tl_mii.mii_writereg = tl_mii_write;
 sc->tl_mii.mii_statchg = tl_statchg;
+ sc->tl_ec.ec_mii = &sc->tl_mii;
 ifmedia_init(&sc->tl_mii.mii_media, IFM_IMASK, tl_mediachange,
- tl_mediastatus);
+ ether_mediastatus);
 mii_attach(self, &sc->tl_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&sc->tl_mii.mii_phys) == NULL) {
@@ -751,7 +751,12 @@ static int tl_init(ifp)
 BUS_DMASYNC_PREWRITE);
 
 /* set media */
- mii_mediachg(&sc->tl_mii);
+ if ((error = mii_mediachg(&sc->tl_mii)) == ENXIO)
+ error = 0;
+ else if (error != 0) {
+ errstring = "could not set media";
+ goto bad; 
+ }
 
 /* start ticks calls */
 callout_reset(&sc->tl_tick_ch, hz, tl_ticks, sc);
@@ -1478,18 +1483,6 @@ tl_mediachange(ifp)
 return (0);
 }
 
-static void
-tl_mediastatus(ifp, ifmr)
- struct ifnet *ifp;
- struct ifmediareq *ifmr;
-{
- tl_softc_t *sc = ifp->if_softc;
-
- mii_pollstat(&sc->tl_mii);
- ifmr->ifm_active = sc->tl_mii.mii_media_active;
- ifmr->ifm_status = sc->tl_mii.mii_media_status;
-}
-
 static int tl_add_RxBuff(sc, Rx, oldm)
 tl_softc_t *sc;
 struct Rx_list *Rx;
Index: sys/dev/pci/if_vge.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_vge.c,v
retrieving revision 1.38
diff -p -u -u -p -r1.38 if_vge.c
--- sys/dev/pci/if_vge.c 19 Oct 2007 12:00:49 -0000 1.38
+++ sys/dev/pci/if_vge.c 2 Jan 2008 02:18:04 -0000
@@ -319,8 +319,6 @@ static int vge_suspend(struct device *);
 static int vge_resume(struct device *);
 #endif
 static void vge_shutdown(void *);
-static int vge_ifmedia_upd(struct ifnet *);
-static void vge_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 
 static uint16_t vge_read_eeprom(struct vge_softc *, int);
 
@@ -1053,8 +1051,10 @@ vge_attach(struct device *parent, struct
 sc->sc_mii.mii_readreg = vge_miibus_readreg;
 sc->sc_mii.mii_writereg = vge_miibus_writereg;
 sc->sc_mii.mii_statchg = vge_miibus_statchg;
- ifmedia_init(&sc->sc_mii.mii_media, 0, vge_ifmedia_upd,
- vge_ifmedia_sts);
+
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
+ ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, MIIF_DOPAUSE);
 if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
@@ -1781,7 +1781,7 @@ static int
 vge_init(struct ifnet *ifp)
 {
 struct vge_softc *sc;
- int i;
+ int i, rc = 0;
 
 sc = ifp->if_softc;
 
@@ -1950,7 +1950,8 @@ vge_init(struct ifnet *ifp)
 CSR_WRITE_1(sc, VGE_CRS3, VGE_CR3_INT_GMSK);
 }
 
- mii_mediachg(&sc->sc_mii);
+ if ((rc = ether_mediachange(ifp)) != 0)
+ goto out;
 
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
@@ -1960,38 +1961,8 @@ vge_init(struct ifnet *ifp)
 
 callout_schedule(&sc->sc_timeout, hz);
 
- return 0;
-}
-
-/*
- * Set media options.
- */
-static int
-vge_ifmedia_upd(struct ifnet *ifp)
-{
- struct vge_softc *sc;
-
- sc = ifp->if_softc;
- mii_mediachg(&sc->sc_mii);
-
- return 0;
-}
-
-/*
- * Report current media status.
- */
-static void
-vge_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct vge_softc *sc;
- struct mii_data *mii;
-
- sc = ifp->if_softc;
- mii = &sc->sc_mii;
-
- mii_pollstat(mii);
- ifmr->ifm_active = mii->mii_media_active;
- ifmr->ifm_status = mii->mii_media_status;
+out:
+ return rc;
 }
 
 static void
Index: sys/dev/pci/if_vr.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_vr.c,v
retrieving revision 1.88
diff -p -u -u -p -r1.88 if_vr.c
--- sys/dev/pci/if_vr.c 19 Oct 2007 12:00:49 -0000 1.88
+++ sys/dev/pci/if_vr.c 2 Jan 2008 02:18:04 -0000
@@ -324,9 +324,6 @@ static void vr_rxdrain(struct vr_softc *
 static void vr_watchdog(struct ifnet *);
 static void vr_tick(void *);
 
-static int vr_ifmedia_upd(struct ifnet *);
-static void vr_ifmedia_sts(struct ifnet *, struct ifmediareq *);
-
 static int vr_mii_readreg(struct device *, int, int);
 static void vr_mii_writereg(struct device *, int, int, int);
 static void vr_mii_statchg(struct device *);
@@ -1261,7 +1258,8 @@ vr_init(struct ifnet *ifp)
 CSR_WRITE_4(sc, VR_TXADDR, VR_CDTXADDR(sc, VR_NEXTTX(sc->vr_txlast)));
 
 /* Set current media. */
- mii_mediachg(&sc->vr_mii);
+ if ((error = ether_mediachange(ifp)) != 0)
+ goto out;
 
 /* Enable receiver and transmitter. */
 CSR_WRITE_2(sc, VR_COMMAND, VR_CMD_TX_NOPOLL|VR_CMD_START|
@@ -1287,32 +1285,6 @@ vr_init(struct ifnet *ifp)
 return (error);
 }
 
-/*
- * Set media options.
- */
-static int
-vr_ifmedia_upd(struct ifnet *ifp)
-{
- struct vr_softc *sc = ifp->if_softc;
-
- if (ifp->if_flags & IFF_UP)
- mii_mediachg(&sc->vr_mii);
- return (0);
-}
-
-/*
- * Report current media status.
- */
-static void
-vr_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct vr_softc *sc = ifp->if_softc;
-
- mii_pollstat(&sc->vr_mii);
- ifmr->ifm_status = sc->vr_mii.mii_media_status;
- ifmr->ifm_active = sc->vr_mii.mii_media_active;
-}
-
 static int
 vr_ioctl(struct ifnet *ifp, u_long command, void *data)
 {
@@ -1738,8 +1710,10 @@ vr_attach(struct device *parent, struct 
 sc->vr_mii.mii_readreg = vr_mii_readreg;
 sc->vr_mii.mii_writereg = vr_mii_writereg;
 sc->vr_mii.mii_statchg = vr_mii_statchg;
- ifmedia_init(&sc->vr_mii.mii_media, IFM_IMASK, vr_ifmedia_upd,
- vr_ifmedia_sts);
+
+ sc->vr_ec.ec_mii = &sc->vr_mii;
+ ifmedia_init(&sc->vr_mii.mii_media, IFM_IMASK, ether_mediachange,
+ ether_mediastatus);
 mii_attach(&sc->vr_dev, &sc->vr_mii, 0xffffffff, MII_PHY_ANY,
 MII_OFFSET_ANY, MIIF_FORCEANEG);
 if (LIST_FIRST(&sc->vr_mii.mii_phys) == NULL) {
Index: sys/dev/pci/if_wm.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_wm.c,v
retrieving revision 1.150
diff -p -u -u -p -r1.150 if_wm.c
--- sys/dev/pci/if_wm.c 14 Dec 2007 00:23:49 -0000 1.150
+++ sys/dev/pci/if_wm.c 2 Jan 2008 02:18:05 -0000
@@ -3225,7 +3225,8 @@ wm_init(struct ifnet *ifp)
 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
 
 /* Set the media. */
- (void) (*sc->sc_mii.mii_media.ifm_change)(ifp);
+ if ((error = (*sc->sc_mii.mii_media.ifm_change)(ifp)) != 0)
+ goto out;
 
 /*
 * Set up the receive control register; we actually program
@@ -4306,6 +4307,7 @@ wm_gmii_mediainit(struct wm_softc *sc)
 
 wm_gmii_reset(sc);
 
+ sc->sc_ethercom.ec_mii = &sc->sc_mii;
 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK, wm_gmii_mediachange,
 wm_gmii_mediastatus);
 
@@ -4328,9 +4330,8 @@ wm_gmii_mediastatus(struct ifnet *ifp, s
 {
 struct wm_softc *sc = ifp->if_softc;
 
- mii_pollstat(&sc->sc_mii);
- ifmr->ifm_status = sc->sc_mii.mii_media_status;
- ifmr->ifm_active = (sc->sc_mii.mii_media_active & ~IFM_ETH_FMASK) |
+ ether_mediastatus(ifp, ifmr);
+ ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK) |
 sc->sc_flowflags;
 }
 
@@ -4344,39 +4345,43 @@ wm_gmii_mediachange(struct ifnet *ifp)
 {
 struct wm_softc *sc = ifp->if_softc;
 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
+ int rc;
 
- if (ifp->if_flags & IFF_UP) {
- sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
- sc->sc_ctrl |= CTRL_SLU;
- if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
- || (sc->sc_type > WM_T_82543)) {
- sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
- } else {
- sc->sc_ctrl &= ~CTRL_ASDE;
- sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
- if (ife->ifm_media & IFM_FDX)
- sc->sc_ctrl |= CTRL_FD;
- switch(IFM_SUBTYPE(ife->ifm_media)) {
- case IFM_10_T:
- sc->sc_ctrl |= CTRL_SPEED_10;
- break;
- case IFM_100_TX:
- sc->sc_ctrl |= CTRL_SPEED_100;
- break;
- case IFM_1000_T:
- sc->sc_ctrl |= CTRL_SPEED_1000;
- break;
- default:
- panic("wm_gmii_mediachange: bad media 0x%x",
- ife->ifm_media);
- }
+ if ((ifp->if_flags & IFF_UP) == 0)
+ return 0;
+
+ sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
+ sc->sc_ctrl |= CTRL_SLU;
+ if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
+ || (sc->sc_type > WM_T_82543)) {
+ sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
+ } else {
+ sc->sc_ctrl &= ~CTRL_ASDE;
+ sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
+ if (ife->ifm_media & IFM_FDX)
+ sc->sc_ctrl |= CTRL_FD;
+ switch(IFM_SUBTYPE(ife->ifm_media)) {
+ case IFM_10_T:
+ sc->sc_ctrl |= CTRL_SPEED_10;
+ break;
+ case IFM_100_TX:
+ sc->sc_ctrl |= CTRL_SPEED_100;
+ break;
+ case IFM_1000_T:
+ sc->sc_ctrl |= CTRL_SPEED_1000;
+ break;
+ default:
+ panic("wm_gmii_mediachange: bad media 0x%x",
+ ife->ifm_media);
 }
- CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
- if (sc->sc_type <= WM_T_82543)
- wm_gmii_reset(sc);
- mii_mediachg(&sc->sc_mii);
 }
- return (0);
+ CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
+ if (sc->sc_type <= WM_T_82543)
+ wm_gmii_reset(sc);
+
+ if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 #define MDI_IO CTRL_SWDPIN(2)
Index: sys/dev/sbus/be.c
===================================================================
RCS file: /cvsroot/src/sys/dev/sbus/be.c,v
retrieving revision 1.55
diff -p -u -u -p -r1.55 be.c
--- sys/dev/sbus/be.c 19 Oct 2007 12:01:10 -0000 1.55
+++ sys/dev/sbus/be.c 2 Jan 2008 02:18:05 -0000
@@ -1077,7 +1077,7 @@ beinit(sc)
 u_int32_t v;
 u_int32_t qecaddr;
 u_int8_t *ea;
- int s;
+ int rc, s;
 
 s = splnet();
 
@@ -1159,11 +1159,14 @@ beinit(sc)
 v |= BE_BR_RXCFG_FIFO | BE_BR_RXCFG_ENABLE;
 bus_space_write_4(t, br, BE_BRI_RXCFG, v);
 
+ if ((rc = be_ifmedia_upd(ifp)) != 0)
+ goto out;
+
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 
- be_ifmedia_upd(ifp);
 callout_reset(&sc->sc_tick_ch, hz, be_tick, sc);
+out:
 splx(s);
 }
 
@@ -1509,8 +1512,10 @@ be_ifmedia_upd(ifp)
 struct be_softc *sc = ifp->if_softc;
 int error;
 
- if ((error = mii_mediachg(&sc->sc_mii)) != 0)
- return (error);
+ if ((error = mii_mediachg(&sc->sc_mii)) == ENXIO)
+ error = 0;
+ else if (error != 0)
+ return error;
 
 return (be_intphy_service(sc, &sc->sc_mii, MII_MEDIACHG));
 }
Index: sys/dev/usb/if_aue.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_aue.c,v
retrieving revision 1.106
diff -p -u -u -p -r1.106 if_aue.c
--- sys/dev/usb/if_aue.c 5 Dec 2007 07:15:54 -0000 1.106
+++ sys/dev/usb/if_aue.c 2 Jan 2008 02:18:05 -0000
@@ -254,7 +254,6 @@ Static void aue_stop(struct aue_softc *)
 Static void aue_watchdog(struct ifnet *);
 Static int aue_openpipes(struct aue_softc *);
 Static int aue_ifmedia_upd(struct ifnet *);
-Static void aue_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 
 Static int aue_eeprom_getword(struct aue_softc *, int);
 Static void aue_read_mac(struct aue_softc *, u_char *);
@@ -863,7 +862,8 @@ USB_ATTACH(aue)
 mii->mii_writereg = aue_miibus_writereg;
 mii->mii_statchg = aue_miibus_statchg;
 mii->mii_flags = MIIF_AUTOTSLEEP;
- ifmedia_init(&mii->mii_media, 0, aue_ifmedia_upd, aue_ifmedia_sts);
+ sc->aue_ec.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, aue_ifmedia_upd, ether_mediastatus);
 mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
 if (LIST_FIRST(&mii->mii_phys) == NULL) {
 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
@@ -1540,6 +1540,7 @@ aue_ifmedia_upd(struct ifnet *ifp)
 {
 struct aue_softc *sc = ifp->if_softc;
 struct mii_data *mii = GET_MII(sc);
+ int rc;
 
 DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->aue_dev), __func__));
 
@@ -1547,31 +1548,10 @@ aue_ifmedia_upd(struct ifnet *ifp)
 return (0);
 
 sc->aue_link = 0;
- if (mii->mii_instance) {
- struct mii_softc *miisc;
- for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
- miisc = LIST_NEXT(miisc, mii_list))
- mii_phy_reset(miisc);
- }
- mii_mediachg(mii);
-
- return (0);
-}
 
-/*
- * Report current media status.
- */
-Static void
-aue_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct aue_softc *sc = ifp->if_softc;
- struct mii_data *mii = GET_MII(sc);
-
- DPRINTFN(5,("%s: %s: enter\n", USBDEVNAME(sc->aue_dev), __func__));
-
- mii_pollstat(mii);
- ifmr->ifm_active = mii->mii_media_active;
- ifmr->ifm_status = mii->mii_media_status;
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 Static int
Index: sys/dev/usb/if_axe.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_axe.c,v
retrieving revision 1.21
diff -p -u -u -p -r1.21 if_axe.c
--- sys/dev/usb/if_axe.c 5 Dec 2007 07:58:32 -0000 1.21
+++ sys/dev/usb/if_axe.c 2 Jan 2008 02:18:05 -0000
@@ -186,8 +186,6 @@ Static int axe_miibus_readreg(device_ptr
 Static void axe_miibus_writereg(device_ptr_t, int, int, int);
 Static void axe_miibus_statchg(device_ptr_t);
 Static int axe_cmd(struct axe_softc *, int, int, int, void *);
-Static int axe_ifmedia_upd(struct ifnet *);
-Static void axe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 Static void axe_reset(struct axe_softc *sc);
 
 Static void axe_setmulti(struct axe_softc *);
@@ -328,40 +326,6 @@ axe_miibus_statchg(device_ptr_t dev)
 }
 }
 
-/*
- * Set media options.
- */
-Static int
-axe_ifmedia_upd(struct ifnet *ifp)
-{
- struct axe_softc *sc = ifp->if_softc;
- struct mii_data *mii = GET_MII(sc);
-
- sc->axe_link = 0;
- if (mii->mii_instance) {
- struct mii_softc *miisc;
- LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
- mii_phy_reset(miisc);
- }
- mii_mediachg(mii);
-
- return (0);
-}
-
-/*
- * Report current media status.
- */
-Static void
-axe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
-{
- struct axe_softc *sc = ifp->if_softc;
- struct mii_data *mii = GET_MII(sc);
-
- mii_pollstat(mii);
- ifmr->ifm_active = mii->mii_media_active;
- ifmr->ifm_status = mii->mii_media_status;
-}
-
 Static void
 axe_setmulti(struct axe_softc *sc)
 {
@@ -555,10 +519,11 @@ USB_ATTACH(axe)
 mii->mii_statchg = axe_miibus_statchg;
 mii->mii_flags = MIIF_AUTOTSLEEP;
 
- ifmedia_init(&mii->mii_media, 0, axe_ifmedia_upd, axe_ifmedia_sts);
+ sc->axe_ec.ec_mii = mii;
+ ifmedia_init(&mii->mii_media, 0, ether_mediachange, ether_mediastatus);
 mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
 
- if (LIST_FIRST(&mii->mii_phys) == NULL) {
+ if (LIST_EMPTY(&mii->mii_phys)) {
 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
 } else
@@ -988,17 +953,6 @@ axe_tick_task(void *xsc)
 s = splnet();
 
 mii_tick(mii);
- if (!sc->axe_link) {
- mii_pollstat(mii);
- if (mii->mii_media_status & IFM_ACTIVE &&
- IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
- DPRINTF(("%s: %s: got link\n",
- USBDEVNAME(sc->axe_dev), __func__));
- sc->axe_link++;
- if (IFQ_IS_EMPTY(&ifp->if_snd) == 0)
- axe_start(ifp);
- }
- }
 
 usb_callout(sc->axe_stat_ch, hz, axe_tick, sc);
 
@@ -1044,13 +998,8 @@ axe_start(struct ifnet *ifp)
 
 sc = ifp->if_softc;
 
- if (!sc->axe_link) {
+ if ((ifp->if_flags & (IFF_OACTIVE|IFF_RUNNING)) != IFF_RUNNING)
 return;
- }
-
- if (ifp->if_flags & IFF_OACTIVE) {
- return;
- }
 
 IF_DEQUEUE(&ifp->if_snd, m_head);
 if (m_head == NULL) {
@@ -1394,7 +1343,6 @@ axe_stop(struct axe_softc *sc)
 }
 }
 
- sc->axe_link = 0;
 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }
 
Index: sys/dev/usb/if_axereg.h
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_axereg.h,v
retrieving revision 1.4
diff -p -u -u -p -r1.4 if_axereg.h
--- sys/dev/usb/if_axereg.h 5 Dec 2007 07:58:32 -0000 1.4
+++ sys/dev/usb/if_axereg.h 2 Jan 2008 02:18:05 -0000
@@ -195,7 +195,6 @@ struct axe_softc {
 
 kmutex_t axe_mii_lock;
 
- int axe_link;
 unsigned char axe_ipgs[3];
 unsigned char axe_phyaddrs[2];
 struct timeval axe_rx_notice;
Index: sys/dev/usb/if_udav.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_udav.c,v
retrieving revision 1.20
diff -p -u -u -p -r1.20 if_udav.c
--- sys/dev/usb/if_udav.c 20 Dec 2007 21:08:20 -0000 1.20
+++ sys/dev/usb/if_udav.c 2 Jan 2008 02:18:07 -0000
@@ -281,6 +281,7 @@ USB_ATTACH(udav)
 mii->mii_writereg = udav_miibus_writereg;
 mii->mii_statchg = udav_miibus_statchg;
 mii->mii_flags = MIIF_AUTOTSLEEP;
+ sc->sc_ec.ec_mii = mii;
 ifmedia_init(&mii->mii_media, 0,
 udav_ifmedia_change, udav_ifmedia_status);
 mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
@@ -615,7 +616,7 @@ udav_init(struct ifnet *ifp)
 struct udav_softc *sc = ifp->if_softc;
 struct mii_data *mii = GET_MII(sc);
 uint8_t eaddr[ETHER_ADDR_LEN];
- int s;
+ int rc, s;
 
 DPRINTF(("%s: %s: enter\n", USBDEVNAME(sc->sc_dev), __func__));
 
@@ -667,7 +668,10 @@ udav_init(struct ifnet *ifp)
 UDAV_SETBIT(sc, UDAV_GPCR, UDAV_GPCR_GEP_CNTL0);
 UDAV_CLRBIT(sc, UDAV_GPR, UDAV_GPR_GEPIO0);
 
- mii_mediachg(mii);
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ rc = 0;
+ else if (rc != 0)
+ goto out;
 
 if (sc->sc_pipe_tx == NULL || sc->sc_pipe_rx == NULL) {
 if (udav_openpipes(sc)) {
@@ -679,11 +683,11 @@ udav_init(struct ifnet *ifp)
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 
- splx(s);
-
 usb_callout(sc->sc_stat_ch, hz, udav_tick, sc);
 
- return (0);
+out:
+ splx(s);
+ return rc;
 }
 
 Static void
@@ -1367,6 +1371,7 @@ udav_ifmedia_change(struct ifnet *ifp)
 {
 struct udav_softc *sc = ifp->if_softc;
 struct mii_data *mii = GET_MII(sc);
+ int rc;
 
 DPRINTF(("%s: %s: enter\n", USBDEVNAME(sc->sc_dev), __func__));
 
@@ -1374,14 +1379,9 @@ udav_ifmedia_change(struct ifnet *ifp)
 return (0);
 
 sc->sc_link = 0;
- if (mii->mii_instance) {
- struct mii_softc *miisc;
- for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
- miisc = LIST_NEXT(miisc, mii_list))
- mii_phy_reset(miisc);
- }
-
- return (mii_mediachg(mii));
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 /* Report current media status. */
@@ -1389,22 +1389,13 @@ Static void
 udav_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
 {
 struct udav_softc *sc = ifp->if_softc;
- struct mii_data *mii = GET_MII(sc);
 
 DPRINTF(("%s: %s: enter\n", USBDEVNAME(sc->sc_dev), __func__));
 
 if (sc->sc_dying)
 return;
 
- if ((ifp->if_flags & IFF_RUNNING) == 0) {
- ifmr->ifm_active = IFM_ETHER | IFM_NONE;
- ifmr->ifm_status = 0;
- return;
- }
-
- mii_pollstat(mii);
- ifmr->ifm_active = mii->mii_media_active;
- ifmr->ifm_status = mii->mii_media_status;
+ ether_mediastatus(ifp, ifmr);
 }
 
 Static void
Index: sys/dev/usb/if_url.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_url.c,v
retrieving revision 1.29
diff -p -u -u -p -r1.29 if_url.c
--- sys/dev/usb/if_url.c 29 Aug 2007 22:33:44 -0000 1.29
+++ sys/dev/usb/if_url.c 2 Jan 2008 02:18:07 -0000
@@ -291,6 +291,7 @@ USB_ATTACH(url)
 #endif
 mii->mii_statchg = url_miibus_statchg;
 mii->mii_flags = MIIF_AUTOTSLEEP;
+ sc->sc_ec.ec_mii = mii;
 ifmedia_init(&mii->mii_media, 0,
 url_ifmedia_change, url_ifmedia_status);
 mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
@@ -506,7 +507,7 @@ url_init(struct ifnet *ifp)
 struct url_softc *sc = ifp->if_softc;
 struct mii_data *mii = GET_MII(sc);
 const u_char *eaddr;
- int i, s;
+ int i, rc, s;
 
 DPRINTF(("%s: %s: enter\n", USBDEVNAME(sc->sc_dev), __func__));
 
@@ -562,7 +563,10 @@ url_init(struct ifnet *ifp)
 /* Enable RX and TX */
 URL_SETBIT(sc, URL_CR, URL_CR_TE | URL_CR_RE);
 
- mii_mediachg(mii);
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ rc = 0;
+ else if (rc != 0)
+ goto out;
 
 if (sc->sc_pipe_tx == NULL || sc->sc_pipe_rx == NULL) {
 if (url_openpipes(sc)) {
@@ -574,11 +578,11 @@ url_init(struct ifnet *ifp)
 ifp->if_flags |= IFF_RUNNING;
 ifp->if_flags &= ~IFF_OACTIVE;
 
- splx(s);
-
 usb_callout(sc->sc_stat_ch, hz, url_tick, sc);
 
- return (0);
+out:
+ splx(s);
+ return rc;
 }
 
 Static void
@@ -1250,6 +1254,7 @@ url_ifmedia_change(struct ifnet *ifp)
 {
 struct url_softc *sc = ifp->if_softc;
 struct mii_data *mii = GET_MII(sc);
+ int rc;
 
 DPRINTF(("%s: %s: enter\n", USBDEVNAME(sc->sc_dev), __func__));
 
@@ -1257,14 +1262,9 @@ url_ifmedia_change(struct ifnet *ifp)
 return (0);
 
 sc->sc_link = 0;
- if (mii->mii_instance) {
- struct mii_softc *miisc;
- for (miisc = LIST_FIRST(&mii->mii_phys); miisc != NULL;
- miisc = LIST_NEXT(miisc, mii_list))
- mii_phy_reset(miisc);
- }
-
- return (mii_mediachg(mii));
+ if ((rc = mii_mediachg(mii)) == ENXIO)
+ return 0;
+ return rc;
 }
 
 /* Report current media status. */
@@ -1272,22 +1272,13 @@ Static void
 url_ifmedia_status(struct ifnet *ifp, struct ifmediareq *ifmr)
 {
 struct url_softc *sc = ifp->if_softc;
- struct mii_data *mii = GET_MII(sc);
 
 DPRINTF(("%s: %s: enter\n", USBDEVNAME(sc->sc_dev), __func__));
 
 if (sc->sc_dying)
 return;
 
- if ((ifp->if_flags & IFF_RUNNING) == 0) {
- ifmr->ifm_active = IFM_ETHER | IFM_NONE;
- ifmr->ifm_status = 0;
- return;
- }
-
- mii_pollstat(mii);
- ifmr->ifm_active = mii->mii_media_active;
- ifmr->ifm_status = mii->mii_media_status;
+ ether_mediastatus(ifp, ifmr);
 }
 
 Static void


Home | Main Index | Thread Index | Old Index

AltStyle によって変換されたページ (->オリジナル) /