diff options
author | Pyun YongHyeon <yongari@FreeBSD.org> | 2008-08-22 01:06:25 +0000 |
---|---|---|
committer | Pyun YongHyeon <yongari@FreeBSD.org> | 2008-08-22 01:06:25 +0000 |
commit | 49bbfbc52538f23d592717e14057258e37136c1b (patch) | |
tree | 882dd3a439df4e76f460c7dd3ada43c443ac21c5 /sys/dev/bfe | |
parent | 858030c4a9296b4855e4aa6fdb4ca038fa0d2122 (diff) | |
download | src-49bbfbc52538f23d592717e14057258e37136c1b.tar.gz src-49bbfbc52538f23d592717e14057258e37136c1b.zip |
Remove bfe_link in softc and introduce two new flags to mark
link state and detach request.
While I'm here make sure established link is IFM_10_T or
IFM_100_TX as bfe(4) just supports 10/100Mbps media.
Tested by: kib, Gleb Kurtsou gleb.kurtsou at gmail dot com
Ulrich Spoerlein uspoerlein at gmail dot com
Notes
Notes:
svn path=/head/; revision=181976
Diffstat (limited to 'sys/dev/bfe')
-rw-r--r-- | sys/dev/bfe/if_bfe.c | 30 | ||||
-rw-r--r-- | sys/dev/bfe/if_bfereg.h | 3 |
2 files changed, 21 insertions, 12 deletions
diff --git a/sys/dev/bfe/if_bfe.c b/sys/dev/bfe/if_bfe.c index 2647f294c2ba..3b54ea865cc1 100644 --- a/sys/dev/bfe/if_bfe.c +++ b/sys/dev/bfe/if_bfe.c @@ -542,6 +542,7 @@ bfe_detach(device_t dev) if (device_is_attached(dev)) { BFE_LOCK(sc); + sc->bfe_flags |= BFE_FLAG_DETACH; bfe_stop(sc); BFE_UNLOCK(sc); callout_drain(&sc->bfe_stat_co); @@ -653,11 +654,18 @@ bfe_miibus_statchg(device_t dev) sc = device_get_softc(dev); mii = device_get_softc(sc->bfe_miibus); - if ((mii->mii_media_status & IFM_ACTIVE) != 0) { - if (IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) - sc->bfe_link = 1; - } else - sc->bfe_link = 0; + sc->bfe_flags &= ~BFE_FLAG_LINK; + if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == + (IFM_ACTIVE | IFM_AVALID)) { + switch (IFM_SUBTYPE(mii->mii_media_active)) { + case IFM_10_T: + case IFM_100_TX: + sc->bfe_flags |= BFE_FLAG_LINK; + break; + default: + break; + } + } /* XXX Should stop Rx/Tx engine prior to touching MAC. */ val = CSR_READ_4(sc, BFE_TX_CTRL); @@ -1551,7 +1559,7 @@ bfe_start_locked(struct ifnet *ifp) * or we have nothing to send. */ if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != - IFF_DRV_RUNNING || sc->bfe_link == 0) + IFF_DRV_RUNNING || (sc->bfe_flags & BFE_FLAG_LINK) == 0) return; for (queued = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd) && @@ -1649,7 +1657,7 @@ bfe_init_locked(void *xsc) CSR_WRITE_4(sc, BFE_IMASK, BFE_IMASK_DEF); /* Clear link state and change media. */ - sc->bfe_link = 0; + sc->bfe_flags &= ~BFE_FLAG_LINK; mii_mediachg(mii); ifp->if_drv_flags |= IFF_DRV_RUNNING; @@ -1712,12 +1720,12 @@ bfe_ioctl(struct ifnet *ifp, u_long command, caddr_t data) switch (command) { case SIOCSIFFLAGS: BFE_LOCK(sc); - if (ifp->if_flags & IFF_UP) + if (ifp->if_flags & IFF_UP) { if (ifp->if_drv_flags & IFF_DRV_RUNNING) bfe_set_rx_mode(sc); - else + else if ((sc->bfe_flags & BFE_FLAG_DETACH) == 0) bfe_init_locked(sc); - else if (ifp->if_drv_flags & IFF_DRV_RUNNING) + } else if (ifp->if_drv_flags & IFF_DRV_RUNNING) bfe_stop(sc); BFE_UNLOCK(sc); break; @@ -1791,7 +1799,7 @@ bfe_stop(struct bfe_softc *sc) ifp = sc->bfe_ifp; ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - sc->bfe_link = 0; + sc->bfe_flags &= ~BFE_FLAG_LINK; callout_stop(&sc->bfe_stat_co); sc->bfe_watchdog_timer = 0; diff --git a/sys/dev/bfe/if_bfereg.h b/sys/dev/bfe/if_bfereg.h index 7ece5dc1070c..672d2572770a 100644 --- a/sys/dev/bfe/if_bfereg.h +++ b/sys/dev/bfe/if_bfereg.h @@ -521,12 +521,13 @@ struct bfe_softc struct bfe_rx_data bfe_rx_ring[BFE_RX_LIST_CNT]; /* XXX */ struct mtx bfe_mtx; u_int32_t bfe_flags; +#define BFE_FLAG_DETACH 0x4000 +#define BFE_FLAG_LINK 0x8000 u_int32_t bfe_imask; u_int32_t bfe_dma_offset; u_int32_t bfe_tx_cnt, bfe_tx_cons, bfe_tx_prod; u_int32_t bfe_rx_prod, bfe_rx_cons; u_int32_t bfe_tx_dma, bfe_rx_dma; - u_int32_t bfe_link; int bfe_watchdog_timer; u_int8_t bfe_phyaddr; /* Address of the card's PHY */ u_int8_t bfe_mdc_port; |