diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ic/aic6915.c | 41 | ||||
-rw-r--r-- | sys/dev/ic/aic6915.h | 3 |
2 files changed, 23 insertions, 21 deletions
diff --git a/sys/dev/ic/aic6915.c b/sys/dev/ic/aic6915.c index 9ed8b7a2e0a..5c3e81716d1 100644 --- a/sys/dev/ic/aic6915.c +++ b/sys/dev/ic/aic6915.c @@ -1,4 +1,4 @@ -/* $OpenBSD: aic6915.c,v 1.1 2006/12/06 20:07:52 martin Exp $ */ +/* $OpenBSD: aic6915.c,v 1.2 2006/12/07 13:30:24 martin Exp $ */ /* $NetBSD: aic6915.c,v 1.15 2005/12/24 20:27:29 perry Exp $ */ /*- @@ -304,10 +304,7 @@ sf_attach(struct sf_softc *sc) ifp->if_ioctl = sf_ioctl; ifp->if_start = sf_start; ifp->if_watchdog = sf_watchdog; - ifp->if_init = sf_init; -#ifdef NetBSD - ifp->if_stop = sf_stop; -#endif + IFQ_SET_MAXLEN(&ifp->if_snd, SF_NTXDESC_MASK); IFQ_SET_READY(&ifp->if_snd); /* @@ -315,6 +312,7 @@ sf_attach(struct sf_softc *sc) */ if_attach(ifp); ether_ifattach(ifp); + /* * Make sure the interface is shutdown during reboot. */ @@ -322,7 +320,7 @@ sf_attach(struct sf_softc *sc) if (sc->sc_sdhook == NULL) printf("%s: WARNING: unable to establish shutdown hook\n", sc->sc_dev.dv_xname); - return; + return; /* * Free any resources we've allocated during the failed attach @@ -545,11 +543,12 @@ int sf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { struct sf_softc *sc = (struct sf_softc *)ifp->if_softc; - struct ifaddr *ifa; + struct ifaddr *ifa = (struct ifaddr *)data; struct ifreq *ifr = (struct ifreq *) data; - int s, error = 1; + int s, error = 0; s = splnet(); + if ((error = ether_ioctl(ifp, &sc->sc_arpcom, cmd, data)) > 0) { splx(s); return (error); @@ -557,23 +556,30 @@ sf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) switch (cmd) { case SIOCSIFADDR: - ifa = (struct ifaddr *)data; ifp->if_flags |= IFF_UP; + if (!(ifp->if_flags & IFF_RUNNING)) + sf_init(ifp); #ifdef INET if (ifa->ifa_addr->sa_family == AF_INET) arp_ifinit(&sc->sc_arpcom, ifa); #endif - /* FALLTHROUGH */ + break; + case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { - if (ifp->if_flags & IFF_RUNNING) + if (ifp->if_flags & IFF_RUNNING && + ((ifp->if_flags ^ sc->sc_flags) & + IFF_PROMISC)) { sf_set_filter(sc); - else - sf_init(ifp); + } else { + if (!(ifp->if_flags & IFF_RUNNING)) + sf_init(ifp); + } } else { if (ifp->if_flags & IFF_RUNNING) sf_stop(ifp, 1); } + sc->sc_flags = ifp->if_flags; break; case SIOCSIFMTU: @@ -606,13 +612,8 @@ sf_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) error = ENOTTY; } - if (error == ENETRESET) { - if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == - (IFF_UP | IFF_RUNNING)) - /* Try to get more packets going. */ - sf_start(ifp); - error = 0; - } + /* Try to get more packets going. */ + sf_start(ifp); splx(s); return (error); diff --git a/sys/dev/ic/aic6915.h b/sys/dev/ic/aic6915.h index fd5f07be5a8..89c0351a789 100644 --- a/sys/dev/ic/aic6915.h +++ b/sys/dev/ic/aic6915.h @@ -1,4 +1,4 @@ -/* $OpenBSD: aic6915.h,v 1.1 2006/12/06 20:07:52 martin Exp $ */ +/* $OpenBSD: aic6915.h,v 1.2 2006/12/07 13:30:24 martin Exp $ */ /* $NetBSD: aic6915reg.h,v 1.4 2005/12/11 12:21:25 christos Exp $ */ /*- @@ -772,6 +772,7 @@ struct sf_softc { struct arpcom sc_arpcom; /* ethernet common data */ void *sc_sdhook; /* shutdown hook */ int sc_iomapped; /* are we I/O mapped? */ + int sc_flags; /* misc. flags */ struct mii_data sc_mii; /* MII/media information */ struct timeout sc_mii_timeout; /* MII callout */ |