diff options
author | mdodd <mdodd@FreeBSD.org> | 2003-03-29 01:40:42 +0000 |
---|---|---|
committer | mdodd <mdodd@FreeBSD.org> | 2003-03-29 01:40:42 +0000 |
commit | 4228bcdeb3ffeb15479ab00fe0cd6554e1251ced (patch) | |
tree | c63189a45d217f58c5171c299600eeacc740cfae /sys/dev/ex | |
parent | 1f636f052e47ffb86f1fcf8cb434233e86f36b9f (diff) | |
download | FreeBSD-src-4228bcdeb3ffeb15479ab00fe0cd6554e1251ced.zip FreeBSD-src-4228bcdeb3ffeb15479ab00fe0cd6554e1251ced.tar.gz |
Don't panic if we aren't plugged into a hub.
Diffstat (limited to 'sys/dev/ex')
-rw-r--r-- | sys/dev/ex/if_ex.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/sys/dev/ex/if_ex.c b/sys/dev/ex/if_ex.c index 7321663..69f0c16 100644 --- a/sys/dev/ex/if_ex.c +++ b/sys/dev/ex/if_ex.c @@ -256,6 +256,8 @@ ex_attach(device_t dev) if (temp & EE_W5_PORT_AUI) ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_5, 0, NULL); + ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL); + ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_NONE, 0, NULL); ifmedia_set(&sc->ifmedia, ex_get_media(sc->iobase)); ifm = &sc->ifmedia; @@ -970,24 +972,34 @@ ex_watchdog(struct ifnet *ifp) static int ex_get_media (u_int32_t iobase) { - int tmp; + int current; + int media; + + media = eeprom_read(iobase, EE_W5); outb(iobase + CMD_REG, Bank2_Sel); - tmp = inb(iobase + REG3); + current = inb(iobase + REG3); outb(iobase + CMD_REG, Bank0_Sel); - if (tmp & TPE_bit) + if ((current & TPE_bit) && (media & EE_W5_PORT_TPE)) return(IFM_ETHER|IFM_10_T); - if (tmp & BNC_bit) + if ((current & BNC_bit) && (media & EE_W5_PORT_BNC)) return(IFM_ETHER|IFM_10_2); - return (IFM_ETHER|IFM_10_5); + if (media & EE_W5_PORT_AUI) + return (IFM_ETHER|IFM_10_5); + + return (IFM_ETHER|IFM_AUTO); } static int ex_ifmedia_upd (ifp) struct ifnet * ifp; { + struct ex_softc * sc = ifp->if_softc; + + if (IFM_TYPE(sc->ifmedia.ifm_media) != IFM_ETHER) + return EINVAL; return (0); } @@ -1000,6 +1012,7 @@ ex_ifmedia_sts(ifp, ifmr) struct ex_softc * sc = ifp->if_softc; ifmr->ifm_active = ex_get_media(sc->iobase); + ifmr->ifm_status = IFM_AVALID | IFM_ACTIVE; return; } |