diff options
author | yongari <yongari@FreeBSD.org> | 2008-08-22 01:06:25 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2008-08-22 01:06:25 +0000 |
commit | 644dc2336bbfd0fc3d5f6bb60dd498f226824fee (patch) | |
tree | 882dd3a439df4e76f460c7dd3ada43c443ac21c5 /sys/dev/bfe | |
parent | 87939ee394fce7fe4371e679ccb79dcce43d68a6 (diff) | |
download | FreeBSD-src-644dc2336bbfd0fc3d5f6bb60dd498f226824fee.zip FreeBSD-src-644dc2336bbfd0fc3d5f6bb60dd498f226824fee.tar.gz |
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
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 2647f29..3b54ea8 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 7ece5dc..672d2572 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; |