diff options
| author | dyoung <dyoung@NetBSD.org> | 2008-02-07 01:21:52 +0000 |
|---|---|---|
| committer | dyoung <dyoung@NetBSD.org> | 2008-02-07 01:21:52 +0000 |
| commit | 2ccede0a9c78ce5a2ea80ccfebc140e543a8679c (patch) | |
| tree | e75d5563bc5787696ff61b7cfdaf95c6ba77e6be /sys/dev | |
| parent | 809c851d23f2ba54b7b479f2d05f03ee6c7994b7 (diff) | |
Start patching up the kernel so that a network driver always has
the opportunity to handle an ioctl before generic ifioctl handling
occurs. This will ease extending the kernel and sharing of code
between drivers.
First steps: Make the signature of ifioctl_common() match struct
ifinet->if_ioctl. Convert SIOCSIFCAP and SIOCSIFMTU to the new
ifioctl() regime, throughout the kernel.
Diffstat (limited to 'sys/dev')
35 files changed, 328 insertions, 265 deletions
diff --git a/sys/dev/ic/elinkxl.c b/sys/dev/ic/elinkxl.c index de331185181..5a267bde3ca 100644 --- a/sys/dev/ic/elinkxl.c +++ b/sys/dev/ic/elinkxl.c @@ -1,4 +1,4 @@ -/* $NetBSD: elinkxl.c,v 1.99 2007/10/19 11:59:51 ad Exp $ */ +/* $NetBSD: elinkxl.c,v 1.100 2008/02/07 01:21:52 dyoung Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.99 2007/10/19 11:59:51 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: elinkxl.c,v 1.100 2008/02/07 01:21:52 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -1509,15 +1509,19 @@ ex_ioctl(ifp, cmd, data) } /* FALLTHROUGH */ default: - error = ether_ioctl(ifp, cmd, data); - if (error == ENETRESET) { + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - ex_set_mc(sc); - error = 0; + ex_set_mc(sc); } break; } diff --git a/sys/dev/ic/gem.c b/sys/dev/ic/gem.c index 09b6d137d11..3679845f236 100644 --- a/sys/dev/ic/gem.c +++ b/sys/dev/ic/gem.c @@ -1,4 +1,4 @@ -/* $NetBSD: gem.c,v 1.73 2008/02/01 11:03:19 jdc Exp $ */ +/* $NetBSD: gem.c,v 1.74 2008/02/07 01:21:53 dyoung Exp $ */ /* * @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.73 2008/02/01 11:03:19 jdc Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gem.c,v 1.74 2008/02/07 01:21:53 dyoung Exp $"); #include "opt_inet.h" #include "bpfilter.h" @@ -2515,15 +2515,19 @@ gem_ioctl(ifp, cmd, data) #undef RESETIGN /*FALLTHROUGH*/ default: - error = ether_ioctl(ifp, cmd, data); - if (error == ENETRESET) { + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - gem_setladrf(sc); - error = 0; + gem_setladrf(sc); } break; } diff --git a/sys/dev/ic/hme.c b/sys/dev/ic/hme.c index 7c346576f3a..a4ff9dced79 100644 --- a/sys/dev/ic/hme.c +++ b/sys/dev/ic/hme.c @@ -1,4 +1,4 @@ -/* $NetBSD: hme.c,v 1.62 2008/01/21 11:32:12 dyoung Exp $ */ +/* $NetBSD: hme.c,v 1.63 2008/02/07 01:21:53 dyoung Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.62 2008/01/21 11:32:12 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.63 2008/02/07 01:21:53 dyoung Exp $"); /* #define HMEDEBUG */ @@ -1483,23 +1483,22 @@ hme_ioctl(ifp, cmd, data) break; - case SIOCADDMULTI: - case SIOCDELMULTI: - case SIOCGIFMEDIA: - case SIOCSIFMEDIA: - if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { + default: + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - hme_setladrf(sc); - error = 0; + hme_setladrf(sc); } break; - default: - error = EINVAL; - break; } sc->sc_if_flags = ifp->if_flags; diff --git a/sys/dev/ic/i82557.c b/sys/dev/ic/i82557.c index 4e7c37d7a5d..7731078bf25 100644 --- a/sys/dev/ic/i82557.c +++ b/sys/dev/ic/i82557.c @@ -1,4 +1,4 @@ -/* $NetBSD: i82557.c,v 1.110 2008/01/19 22:10:17 dyoung Exp $ */ +/* $NetBSD: i82557.c,v 1.111 2008/02/07 01:21:53 dyoung Exp $ */ /*- * Copyright (c) 1997, 1998, 1999, 2001, 2002 The NetBSD Foundation, Inc. @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i82557.c,v 1.110 2008/01/19 22:10:17 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i82557.c,v 1.111 2008/02/07 01:21:53 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -2089,20 +2089,22 @@ fxp_ioctl(struct ifnet *ifp, u_long cmd, void *data) break; default: - error = ether_ioctl(ifp, cmd, data); - if (error == ENETRESET) { - if (ifp->if_flags & IFF_RUNNING) { - /* - * Multicast list has changed; set the - * hardware filter accordingly. - */ - if (sc->sc_txpending) { - sc->sc_flags |= FXPF_WANTINIT; - error = 0; - } else - error = fxp_init(ifp); + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { + /* + * Multicast list has changed; set the + * hardware filter accordingly. + */ + if (sc->sc_txpending) { + sc->sc_flags |= FXPF_WANTINIT; } else - error = 0; + error = fxp_init(ifp); } break; } diff --git a/sys/dev/ic/midway.c b/sys/dev/ic/midway.c index 9ab95bd7411..67c4a01d82e 100644 --- a/sys/dev/ic/midway.c +++ b/sys/dev/ic/midway.c @@ -1,4 +1,4 @@ -/* $NetBSD: midway.c,v 1.77 2007/10/19 11:59:56 ad Exp $ */ +/* $NetBSD: midway.c,v 1.78 2008/02/07 01:21:53 dyoung Exp $ */ /* (sync'd to midway.c 1.68) */ /* @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: midway.c,v 1.77 2007/10/19 11:59:56 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: midway.c,v 1.78 2008/02/07 01:21:53 dyoung Exp $"); #include "opt_natm.h" @@ -1261,10 +1261,12 @@ void *data; break; } #endif - ifp->if_mtu = ifr->ifr_mtu; + if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) { + error = 0; /* XXXCDC: do we really need to reset on MTU size change? */ - en_reset(sc); - en_init(sc); + en_reset(sc); + en_init(sc); + } break; #endif /* SIOCSIFMTU */ diff --git a/sys/dev/ic/pdq_ifsubr.c b/sys/dev/ic/pdq_ifsubr.c index 1e4944c7566..95b19908d0f 100644 --- a/sys/dev/ic/pdq_ifsubr.c +++ b/sys/dev/ic/pdq_ifsubr.c @@ -1,4 +1,4 @@ -/* $NetBSD: pdq_ifsubr.c,v 1.50 2007/12/20 21:08:17 dyoung Exp $ */ +/* $NetBSD: pdq_ifsubr.c,v 1.51 2008/02/07 01:21:54 dyoung Exp $ */ /*- * Copyright (c) 1995, 1996 Matt Thomas <matt@3am-software.com> @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.50 2007/12/20 21:08:17 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pdq_ifsubr.c,v 1.51 2008/02/07 01:21:54 dyoung Exp $"); #ifdef __NetBSD__ #include "opt_inet.h" @@ -448,8 +448,8 @@ pdq_ifioctl( } case SIOCGIFADDR: { struct ifreq *ifr = (struct ifreq *)data; - memcpy((void *) ((struct sockaddr *)&ifr->ifr_data)->sa_data, - (const void *) PDQ_LANADDR(sc), 6); + error = ifreq_setaddr(cmd, ifr, + (const struct sockaddr *)sc->sc_if.if_sadl); break; } @@ -484,7 +484,8 @@ pdq_ifioctl( error = EINVAL; break; } - ifp->if_mtu = ifr->ifr_mtu; + if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) + error = 0; break; } #endif /* SIOCSIFMTU */ diff --git a/sys/dev/ic/rtl8169.c b/sys/dev/ic/rtl8169.c index f297d6c63e6..4923e52fa32 100644 --- a/sys/dev/ic/rtl8169.c +++ b/sys/dev/ic/rtl8169.c @@ -1,4 +1,4 @@ -/* $NetBSD: rtl8169.c,v 1.95 2008/02/04 15:16:49 tsutsui Exp $ */ +/* $NetBSD: rtl8169.c,v 1.96 2008/02/07 01:21:54 dyoung Exp $ */ /* * Copyright (c) 1997, 1998-2003 @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtl8169.c,v 1.95 2008/02/04 15:16:49 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtl8169.c,v 1.96 2008/02/07 01:21:54 dyoung Exp $"); /* $FreeBSD: /repoman/r/ncvs/src/sys/dev/re/if_re.c,v 1.20 2004/04/11 20:34:08 ru Exp $ */ /* @@ -1900,17 +1900,23 @@ re_ioctl(struct ifnet *ifp, u_long command, void *data) switch (command) { case SIOCSIFMTU: - if (ifr->ifr_mtu > RE_JUMBO_MTU) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU_JUMBO) error = EINVAL; - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; default: - error = ether_ioctl(ifp, command, data); - if (error == ENETRESET) { - if (ifp->if_flags & IFF_RUNNING) - rtk_setmulti(sc); - error = 0; - } + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; + + error = 0; + + if (command == SIOCSIFCAP) + error = (*ifp->if_init)(ifp); + else if (command != SIOCADDMULTI && command != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) + rtk_setmulti(sc); break; } diff --git a/sys/dev/ic/tropic.c b/sys/dev/ic/tropic.c index f1e9ea6a1d1..88cd34924c8 100644 --- a/sys/dev/ic/tropic.c +++ b/sys/dev/ic/tropic.c @@ -1,4 +1,4 @@ -/* $NetBSD: tropic.c,v 1.32 2007/10/19 12:00:03 ad Exp $ */ +/* $NetBSD: tropic.c,v 1.33 2008/02/07 01:21:54 dyoung Exp $ */ /* * Ported to NetBSD by Onno van der Linden @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tropic.c,v 1.32 2007/10/19 12:00:03 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tropic.c,v 1.33 2008/02/07 01:21:54 dyoung Exp $"); #include "opt_inet.h" #include "bpfilter.h" @@ -1608,8 +1608,8 @@ void *data; case SIOCSIFMTU: if (ifr->ifr_mtu > sc->sc_maxmtu) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) + error = 0; break; #endif default: diff --git a/sys/dev/ieee1394/if_fwip.c b/sys/dev/ieee1394/if_fwip.c index 377a6f30a34..36cc3033a75 100644 --- a/sys/dev/ieee1394/if_fwip.c +++ b/sys/dev/ieee1394/if_fwip.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_fwip.c,v 1.12 2007/12/11 11:34:09 lukem Exp $ */ +/* $NetBSD: if_fwip.c,v 1.13 2008/02/07 01:21:54 dyoung Exp $ */ /*- * Copyright (c) 2004 * Doug Rabson @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_fwip.c,v 1.12 2007/12/11 11:34:09 lukem Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_fwip.c,v 1.13 2008/02/07 01:21:54 dyoung Exp $"); #ifdef HAVE_KERNEL_OPTION_HEADERS #include "opt_device_polling.h" @@ -539,7 +539,7 @@ static int fwip_ioctl(struct ifnet *ifp, u_long cmd, void *data) { IF_IOCTL_START(fwip, fwip); - int s, error; + int s, error = 0; switch (cmd) { case SIOCSIFFLAGS: @@ -565,6 +565,9 @@ fwip_ioctl(struct ifnet *ifp, u_long cmd, void *data) case SIOCDELMULTI: break; case SIOCSIFCAP: + if ((error = FIREWIRE_IOCTL(ifp, cmd, data)) != ENETRESET) + break; + error = 0; #ifdef DEVICE_POLLING { struct ifreq *ifr = (struct ifreq *) data; @@ -611,7 +614,7 @@ fwip_ioctl(struct ifnet *ifp, u_long cmd, void *data) #endif } - return (0); + return error; } static void diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index 8d50ac93f76..c0e8e91cd45 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -35,7 +35,7 @@ __FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.69.2.6 2005/03/31 04:24:36 wpaul Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: if_ndis.c,v 1.16 2007/12/20 21:08:18 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ndis.c,v 1.17 2008/02/07 01:21:54 dyoung Exp $"); #endif #ifdef __FreeBSD__ @@ -2607,11 +2607,7 @@ ndis_ioctl(ifp, command, data) case SIOCGIFMEDIA: case SIOCSIFMEDIA: if (sc->ndis_80211) { -#ifdef __FreeBSD__ - error = ieee80211_ioctl(ifp, command, data); -#else /* __NetBSD__ */ error = ieee80211_ioctl(&sc->ic, command, data); -#endif if (error == ENETRESET) { ndis_setstate_80211(sc); /*ndis_init(sc);*/ @@ -2621,19 +2617,10 @@ ndis_ioctl(ifp, command, data) error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command); break; case SIOCSIFCAP: -/* TODO: Probrably more needs to be done for SIOCSIFCAP */ -#ifdef __FreeBSD__ - ifp->if_capenable = ifr->ifr_reqcap; -/* - * TODO: I couldn't find any equivilent to ifreq.ifr_reqcap for NetBSD, I'm - * not sure if TODO we need it or not - */ - if (ifp->if_capenable & IFCAP_TXCSUM) - ifp->if_hwassist = sc->ndis_hwassist; - else - ifp->if_hwassist = 0; -#endif - ndis_set_offload(sc); + if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { + ndis_set_offload(sc); + error = 0; + } break; case SIOCGIFGENERIC: case SIOCSIFGENERIC: diff --git a/sys/dev/marvell/if_gfe.c b/sys/dev/marvell/if_gfe.c index a5a0ea9e6aa..d726c8981d2 100644 --- a/sys/dev/marvell/if_gfe.c +++ b/sys/dev/marvell/if_gfe.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_gfe.c,v 1.27 2008/01/19 22:10:18 dyoung Exp $ */ +/* $NetBSD: if_gfe.c,v 1.28 2008/02/07 01:21:54 dyoung Exp $ */ /* * Copyright (c) 2002 Allegro Networks, Inc., Wasabi Systems, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gfe.c,v 1.27 2008/01/19 22:10:18 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gfe.c,v 1.28 2008/02/07 01:21:54 dyoung Exp $"); #include "opt_inet.h" #include "bpfilter.h" @@ -485,7 +485,8 @@ gfe_ifioctl(struct ifnet *ifp, u_long cmd, void *data) error = EINVAL; break; } - ifp->if_mtu = ifr->ifr_mtu; + if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) + error = 0; break; default: diff --git a/sys/dev/pci/cxgb_main.c b/sys/dev/pci/cxgb_main.c index 68d58afe53d..f9f1dc3df78 100644 --- a/sys/dev/pci/cxgb_main.c +++ b/sys/dev/pci/cxgb_main.c @@ -29,7 +29,7 @@ POSSIBILITY OF SUCH DAMAGE. #include <sys/cdefs.h> #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: cxgb_main.c,v 1.10 2008/01/17 06:03:22 jklos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cxgb_main.c,v 1.11 2008/02/07 01:21:55 dyoung Exp $"); #endif #ifdef __FreeBSD__ __FBSDID("$FreeBSD: src/sys/dev/cxgb/cxgb_main.c,v 1.36 2007/09/11 23:49:27 kmacy Exp $"); @@ -2313,13 +2313,16 @@ static int cxgb_set_mtu(struct port_info *p, int mtu) { struct ifnet *ifp = p->ifp; + struct ifreq ifr; int error = 0; + ifr.ifr_mtu = mtu; + if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO)) error = EINVAL; - else if (ifp->if_mtu != mtu) { + else if ((error = ifioctl_common(ifp, SIOCSIFMTU, &ifr)) == ENETRESET) { + error = 0; PORT_LOCK(p); - ifp->if_mtu = mtu; if (ifp->if_drv_flags & IFF_DRV_RUNNING) { callout_stop(&p->adapter->cxgb_tick_ch); cxgb_stop_locked(p); @@ -2397,27 +2400,19 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, void *data) error = ifmedia_ioctl(ifp, ifr, &p->media, command); printf("SIOCGIFMEDIA: error=%d\n", error); break; +#ifdef __FreeBSD__ case SIOCSIFCAP: printf("SIOCSIFCAP:\n"); PORT_LOCK(p); -#ifdef __FreeBSD__ mask = ifr->ifr_reqcap ^ ifp->if_capenable; -#endif -#ifdef __NetBSD__ - mask = ifp->if_capenable; -#endif if (mask & IFCAP_TXCSUM) { if (IFCAP_TXCSUM & ifp->if_capenable) { ifp->if_capenable &= ~(IFCAP_TXCSUM|IFCAP_TSO4); -#ifdef __FreeBSD__ ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP | CSUM_TSO); -#endif } else { ifp->if_capenable |= IFCAP_TXCSUM; -#ifdef __FreeBSD__ ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP); -#endif } } else if (mask & IFCAP_RXCSUM) { if (IFCAP_RXCSUM & ifp->if_capenable) { @@ -2429,14 +2424,10 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, void *data) if (mask & IFCAP_TSO4) { if (IFCAP_TSO4 & ifp->if_capenable) { ifp->if_capenable &= ~IFCAP_TSO4; -#ifdef __FreeBSD__ ifp->if_hwassist &= ~CSUM_TSO; -#endif } else if (IFCAP_TXCSUM & ifp->if_capenable) { ifp->if_capenable |= IFCAP_TSO4; -#ifdef __FreeBSD__ ifp->if_hwassist |= CSUM_TSO; -#endif } else { if (cxgb_debug) printf("cxgb requires tx checksum offload" @@ -2446,11 +2437,14 @@ cxgb_ioctl(struct ifnet *ifp, unsigned long command, void *data) } PORT_UNLOCK(p); break; +#endif /* __FreeBSD__ */ default: printf("Dir = %x Len = %x Group = '%c' Num = %x\n", (unsigned int)(command&0xe0000000)>>28, (unsigned int)(command&0x1fff0000)>>16, (unsigned int)(command&0xff00)>>8, (unsigned int)command&0xff); - error = ether_ioctl(ifp, command, data); + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; + error = 0; break; } return (error); diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c index 49003581fb8..8f6be9f6477 100644 --- a/sys/dev/pci/if_bge.c +++ b/sys/dev/pci/if_bge.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_bge.c,v 1.144 2008/02/04 21:44:35 mlelstv Exp $ */ +/* $NetBSD: if_bge.c,v 1.145 2008/02/07 01:21:55 dyoung Exp $ */ /* * Copyright (c) 2001 Wind River Systems @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.144 2008/02/04 21:44:35 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bge.c,v 1.145 2008/02/07 01:21:55 dyoung Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -4171,12 +4171,15 @@ bge_ioctl(struct ifnet *ifp, u_long command, void *data) } break; default: - error = ether_ioctl(ifp, command, data); - if (error == ENETRESET) { - if (ifp->if_flags & IFF_RUNNING) - bge_setmulti(sc); - error = 0; - } + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; + + error = 0; + + if (command != SIOCADDMULTI && command != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) + bge_setmulti(sc); break; } diff --git a/sys/dev/pci/if_bnx.c b/sys/dev/pci/if_bnx.c index ed8971a301b..88020a1f6bf 100644 --- a/sys/dev/pci/if_bnx.c +++ b/sys/dev/pci/if_bnx.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_bnx.c,v 1.17 2008/02/06 16:50:38 joerg Exp $ */ +/* $NetBSD: if_bnx.c,v 1.18 2008/02/07 01:21:55 dyoung Exp $ */ /* $OpenBSD: if_bnx.c,v 1.43 2007/01/30 03:21:10 krw Exp $ */ /*- @@ -35,7 +35,7 @@ #if 0 __FBSDID("$FreeBSD: src/sys/dev/bce/if_bce.c,v 1.3 2006/04/13 14:12:26 ru Exp $"); #endif -__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.17 2008/02/06 16:50:38 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_bnx.c,v 1.18 2008/02/07 01:21:55 dyoung Exp $"); /* * The following controllers are supported by this driver: @@ -687,7 +687,7 @@ bnx_attach(device_t parent, device_t self, void *aux) ifmedia_init(&sc->bnx_mii.mii_media, 0, ether_mediachange, ether_mediastatus); mii_attach(self, &sc->bnx_mii, 0xffffffff, - MII_PHY_ANY, MII_OFFSET_ANY, 0); + MII_PHY_ANY, MII_OFFSET_ANY, MIIF_FORCEANEG); if (LIST_EMPTY(&sc->bnx_mii.mii_phys)) { aprint_error_dev(self, "no PHY found!\n"); @@ -4342,14 +4342,16 @@ bnx_ioctl(struct ifnet *ifp, u_long command, void *data) break; default: - error = ether_ioctl(ifp, command, data); - if (error != ENETRESET) + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) break; + error = 0; - if (command == SIOCADDMULTI || command == SIOCDELMULTI) { + + if (command != SIOCADDMULTI && command && SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* reload packet filter if running */ - if (ifp->if_flags & IFF_RUNNING) - bnx_set_rx_mode(sc); + bnx_set_rx_mode(sc); } break; } diff --git a/sys/dev/pci/if_de.c b/sys/dev/pci/if_de.c index d8044c5ffcd..74106998918 100644 --- a/sys/dev/pci/if_de.c +++ b/sys/dev/pci/if_de.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_de.c,v 1.126 2007/10/19 12:00:44 ad Exp $ */ +/* $NetBSD: if_de.c,v 1.127 2008/02/07 01:21:55 dyoung Exp $ */ /*- * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com) @@ -37,7 +37,7 @@ * board which support 21040, 21041, or 21140 (mostly). */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.126 2007/10/19 12:00:44 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_de.c,v 1.127 2008/02/07 01:21:55 dyoung Exp $"); #define TULIP_HDR_DATA @@ -4859,11 +4859,13 @@ tulip_ifioctl( error = EINVAL; break; } - ifp->if_mtu = ifr->ifr_mtu; + if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) { #ifdef BIG_PACKET - tulip_reset(sc); - tulip_init(sc); + tulip_reset(sc); + tulip_init(sc); #endif + error = 0; + } break; #endif /* SIOCSIFMTU */ diff --git a/sys/dev/pci/if_dge.c b/sys/dev/pci/if_dge.c index c7a37987e7b..5d584bc678f 100644 --- a/sys/dev/pci/if_dge.c +++ b/sys/dev/pci/if_dge.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_dge.c,v 1.18 2007/11/07 00:23:18 ad Exp $ */ +/* $NetBSD: if_dge.c,v 1.19 2008/02/07 01:21:56 dyoung Exp $ */ /* * Copyright (c) 2004, SUNET, Swedish University Computer Network. @@ -80,7 +80,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.18 2007/11/07 00:23:18 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.19 2008/02/07 01:21:56 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -1422,14 +1422,14 @@ dge_ioctl(struct ifnet *ifp, u_long cmd, void *data) break; case SIOCSIFMTU: - if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > DGE_MAX_MTU) { + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > DGE_MAX_MTU) error = EINVAL; - } else { + else if ((error = ifioctl_common(ifp, cmd, data)) != ENETRESET) + break; + else if (ifp->if_flags & IFF_UP) + error = (*ifp->if_init)(ifp); + else error = 0; - ifp->if_mtu = ifr->ifr_mtu; - if (ifp->if_flags & IFF_UP) - error = (*ifp->if_init)(ifp); - } break; case SIOCSIFFLAGS: @@ -1454,15 +1454,21 @@ dge_ioctl(struct ifnet *ifp, u_long cmd, void *data) } /* FALLTHROUGH */ default: - error = ether_ioctl(ifp, cmd, data); - if (error == ENETRESET) { + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd == SIOCSIFCAP) + error = (*ifp->if_init)(ifp); + else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - dge_set_filter(sc); - error = 0; + dge_set_filter(sc); } break; } diff --git a/sys/dev/pci/if_kse.c b/sys/dev/pci/if_kse.c index 7e1eff8c6b5..d2fb87d045f 100644 --- a/sys/dev/pci/if_kse.c +++ b/sys/dev/pci/if_kse.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_kse.c,v 1.11 2007/11/16 10:31:57 nisimura Exp $ */ +/* $NetBSD: if_kse.c,v 1.12 2008/02/07 01:21:56 dyoung Exp $ */ /* * Copyright (c) 2006 Tohru Nishimura @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.11 2007/11/16 10:31:57 nisimura Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kse.c,v 1.12 2008/02/07 01:21:56 dyoung Exp $"); #include "bpfilter.h" @@ -648,15 +648,21 @@ kse_ioctl(struct ifnet *ifp, u_long cmd, void *data) break; default: - error = ether_ioctl(ifp, cmd, data); - if (cmd == ENETRESET) { + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd == SIOCSIFCAP) + error = (*ifp->if_init)(ifp); + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - kse_set_filter(sc); - error = 0; + kse_set_filter(sc); } break; } diff --git a/sys/dev/pci/if_lmc.c b/sys/dev/pci/if_lmc.c index e51bab9ace7..19e19b1a38c 100644 --- a/sys/dev/pci/if_lmc.c +++ b/sys/dev/pci/if_lmc.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_lmc.c,v 1.39 2008/01/10 08:50:52 dyoung Exp $ */ +/* $NetBSD: if_lmc.c,v 1.40 2008/02/07 01:21:56 dyoung Exp $ */ /*- * Copyright (c) 2002-2006 David Boggs. <boggs@boggs.palo-alto.ca.us> @@ -142,7 +142,7 @@ #if defined(__NetBSD__) # include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_lmc.c,v 1.39 2008/01/10 08:50:52 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_lmc.c,v 1.40 2008/02/07 01:21:56 dyoung Exp $"); # include <sys/param.h> /* OS version */ /* -DLKM is passed on the compiler command line */ # include "opt_inet.h" /* INET6, INET */ @@ -3559,8 +3559,8 @@ rawip_ioctl(softc_t *sc, u_long cmd, void *data) case SIOCSIFMTU: if ((ifr->ifr_mtu < 72) || (ifr->ifr_mtu > 65535)) error = EINVAL; - else - sc->ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(sc->ifp, cmd, data)) == ENETRESET) + error = 0; break; default: error = EINVAL; diff --git a/sys/dev/pci/if_msk.c b/sys/dev/pci/if_msk.c index 71480575e0a..efe24476615 100644 --- a/sys/dev/pci/if_msk.c +++ b/sys/dev/pci/if_msk.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_msk.c,v 1.15 2008/01/19 22:10:18 dyoung Exp $ */ +/* $NetBSD: if_msk.c,v 1.16 2008/02/07 01:21:56 dyoung Exp $ */ /* $OpenBSD: if_msk.c,v 1.42 2007/01/17 02:43:02 krw Exp $ */ /* @@ -52,7 +52,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.15 2008/01/19 22:10:18 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_msk.c,v 1.16 2008/02/07 01:21:56 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -706,7 +706,8 @@ msk_ioctl(struct ifnet *ifp, u_long command, void *data) error = EINVAL; } else if (ifr->ifr_mtu > ETHERMTU) error = EINVAL; - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; default: DPRINTFN(2, ("msk_ioctl ETHER\n")); diff --git a/sys/dev/pci/if_nfe.c b/sys/dev/pci/if_nfe.c index c321a421e1a..21d21212003 100644 --- a/sys/dev/pci/if_nfe.c +++ b/sys/dev/pci/if_nfe.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_nfe.c,v 1.27 2008/01/26 14:13:06 tsutsui Exp $ */ +/* $NetBSD: if_nfe.c,v 1.28 2008/02/07 01:21:56 dyoung Exp $ */ /* $OpenBSD: if_nfe.c,v 1.52 2006/03/02 09:04:00 jsg Exp $ */ /*- @@ -21,7 +21,7 @@ /* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.27 2008/01/26 14:13:06 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_nfe.c,v 1.28 2008/02/07 01:21:56 dyoung Exp $"); #include "opt_inet.h" #include "bpfilter.h" @@ -584,8 +584,8 @@ nfe_ioctl(struct ifnet *ifp, u_long cmd, void *data) (!(sc->sc_flags & NFE_USE_JUMBO) && ifr->ifr_mtu > ETHERMTU)) error = EINVAL; - else if (ifp->if_mtu != ifr->ifr_mtu) - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { @@ -607,11 +607,15 @@ nfe_ioctl(struct ifnet *ifp, u_long cmd, void *data) sc->sc_if_flags = ifp->if_flags; break; default: - if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { - if (ifp->if_flags & IFF_RUNNING) - nfe_setmulti(sc); - error = 0; - } + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) + nfe_setmulti(sc); break; } diff --git a/sys/dev/pci/if_sip.c b/sys/dev/pci/if_sip.c index 716971847f3..499a0f68282 100644 --- a/sys/dev/pci/if_sip.c +++ b/sys/dev/pci/if_sip.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_sip.c,v 1.126 2008/01/19 22:23:35 dyoung Exp $ */ +/* $NetBSD: if_sip.c,v 1.127 2008/02/07 01:21:57 dyoung Exp $ */ /*- * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. @@ -80,7 +80,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.126 2008/01/19 22:23:35 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_sip.c,v 1.127 2008/02/07 01:21:57 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -1790,15 +1790,21 @@ sipcom_ioctl(struct ifnet *ifp, u_long cmd, void *data) /* FALLTHROUGH */ ethioctl: default: - error = ether_ioctl(ifp, cmd, data); - if (error == ENETRESET) { + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd == SIOCSIFCAP) + error = (*ifp->if_init)(ifp); + else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - (*sc->sc_model->sip_variant->sipv_set_filter)(sc); - error = 0; + (*sc->sc_model->sip_variant->sipv_set_filter)(sc); } break; } diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c index 75ba44f88bd..28b87a375dc 100644 --- a/sys/dev/pci/if_sk.c +++ b/sys/dev/pci/if_sk.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_sk.c,v 1.46 2008/01/19 22:10:18 dyoung Exp $ */ +/* $NetBSD: if_sk.c,v 1.47 2008/02/07 01:21:57 dyoung Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -122,7 +122,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.46 2008/01/19 22:10:18 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_sk.c,v 1.47 2008/02/07 01:21:57 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -1047,14 +1047,16 @@ sk_ioctl(struct ifnet *ifp, u_long command, void *data) default: DPRINTFN(2, ("sk_ioctl ETHER\n")); - error = ether_ioctl(ifp, command, data); + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; - if ( error == ENETRESET) { - if (ifp->if_flags & IFF_RUNNING) { - sk_setmulti(sc_if); - DPRINTFN(2, ("sk_ioctl setmulti called\n")); - } - error = 0; + error = 0; + + if (command != SIOCADDMULTI && command != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { + sk_setmulti(sc_if); + DPRINTFN(2, ("sk_ioctl setmulti called\n")); } break; } diff --git a/sys/dev/pci/if_stge.c b/sys/dev/pci/if_stge.c index 0f1084dd732..ff2646e43b7 100644 --- a/sys/dev/pci/if_stge.c +++ b/sys/dev/pci/if_stge.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_stge.c,v 1.40 2008/01/19 22:10:19 dyoung Exp $ */ +/* $NetBSD: if_stge.c,v 1.41 2008/02/07 01:21:57 dyoung Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -42,7 +42,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_stge.c,v 1.40 2008/01/19 22:10:19 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_stge.c,v 1.41 2008/02/07 01:21:57 dyoung Exp $"); #include "bpfilter.h" @@ -1023,13 +1023,17 @@ stge_ioctl(struct ifnet *ifp, u_long cmd, void *data) error = ether_ioctl(ifp, cmd, data); if (error == ENETRESET) { - /* - * Multicast list has changed; set the hardware filter - * accordingly. - */ - if (ifp->if_flags & IFF_RUNNING) - stge_set_filter(sc); error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { + /* + * Multicast list has changed; set the hardware filter + * accordingly. + */ + stge_set_filter(sc); + } } /* Try to get more packets going. */ diff --git a/sys/dev/pci/if_ti.c b/sys/dev/pci/if_ti.c index 6be0c228258..2aac05ce292 100644 --- a/sys/dev/pci/if_ti.c +++ b/sys/dev/pci/if_ti.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_ti.c,v 1.79 2007/11/07 00:23:19 ad Exp $ */ +/* $NetBSD: if_ti.c,v 1.80 2008/02/07 01:21:57 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.79 2007/11/07 00:23:19 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ti.c,v 1.80 2008/02/07 01:21:57 dyoung Exp $"); #include "bpfilter.h" #include "opt_inet.h" @@ -2745,11 +2745,11 @@ ti_ioctl(struct ifnet *ifp, u_long command, void *data) error = ti_ether_ioctl(ifp, command, data); break; case SIOCSIFMTU: - if (ifr->ifr_mtu > ETHERMTU_JUMBO) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU_JUMBO) error = EINVAL; - else { - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET){ ti_init(sc); + error = 0; } break; case SIOCSIFFLAGS: @@ -2782,20 +2782,22 @@ ti_ioctl(struct ifnet *ifp, u_long command, void *data) sc->ti_if_flags = ifp->if_flags; error = 0; break; - case SIOCADDMULTI: - case SIOCDELMULTI: - if ((error = ether_ioctl(ifp, command, data)) == ENETRESET) { - if (ifp->if_flags & IFF_RUNNING) - ti_setmulti(sc); - error = 0; - } - break; case SIOCSIFMEDIA: case SIOCGIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command); break; default: - error = EINVAL; + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; + + error = 0; + + if (command == SIOCSIFCAP) + ti_init(sc); + else if (command != SIOCADDMULTI && command != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) + ti_setmulti(sc); break; } diff --git a/sys/dev/pci/if_txp.c b/sys/dev/pci/if_txp.c index af993b30271..ffa4d30477c 100644 --- a/sys/dev/pci/if_txp.c +++ b/sys/dev/pci/if_txp.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_txp.c,v 1.22 2007/10/19 12:00:49 ad Exp $ */ +/* $NetBSD: if_txp.c,v 1.23 2008/02/07 01:21:57 dyoung Exp $ */ /* * Copyright (c) 2001 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.22 2007/10/19 12:00:49 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_txp.c,v 1.23 2008/02/07 01:21:57 dyoung Exp $"); #include "bpfilter.h" #include "opt_inet.h" @@ -1300,14 +1300,19 @@ txp_ioctl(ifp, command, data) break; case SIOCADDMULTI: case SIOCDELMULTI: - if ((error = ether_ioctl(ifp, command, data)) == ENETRESET) { + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; + + error = 0; + + if (command != SIOCADDMULTI && command != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware * filter accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - txp_set_filter(sc); - error = 0; + txp_set_filter(sc); } break; case SIOCGIFMEDIA: diff --git a/sys/dev/pci/if_vge.c b/sys/dev/pci/if_vge.c index 24c9a7e6e5f..a3d6028c27a 100644 --- a/sys/dev/pci/if_vge.c +++ b/sys/dev/pci/if_vge.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_vge.c,v 1.39 2008/01/19 22:10:19 dyoung Exp $ */ +/* $NetBSD: if_vge.c,v 1.40 2008/02/07 01:21:58 dyoung Exp $ */ /*- * Copyright (c) 2004 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.39 2008/01/19 22:10:19 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_vge.c,v 1.40 2008/02/07 01:21:58 dyoung Exp $"); /* * VIA Networking Technologies VT612x PCI gigabit ethernet NIC driver. @@ -2029,7 +2029,8 @@ vge_ioctl(struct ifnet *ifp, u_long command, void *data) case SIOCSIFMTU: if (ifr->ifr_mtu > VGE_JUMBO_MTU) error = EINVAL; - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { @@ -2054,14 +2055,19 @@ vge_ioctl(struct ifnet *ifp, u_long command, void *data) sc->sc_if_flags = ifp->if_flags; break; default: - if ((error = ether_ioctl(ifp, command, data)) == ENETRESET) { + if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) + break; + + error = 0; + + if (command != SIOCADDMULTI && command != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - vge_setmulti(sc); - error = 0; + vge_setmulti(sc); } break; } diff --git a/sys/dev/pci/if_wm.c b/sys/dev/pci/if_wm.c index cc818672bb0..626f0804f08 100644 --- a/sys/dev/pci/if_wm.c +++ b/sys/dev/pci/if_wm.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_wm.c,v 1.153 2008/01/29 20:24:41 tls Exp $ */ +/* $NetBSD: if_wm.c,v 1.154 2008/02/07 01:21:58 dyoung Exp $ */ /* * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc. @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.153 2008/01/29 20:24:41 tls Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.154 2008/02/07 01:21:58 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -2327,15 +2327,21 @@ wm_ioctl(struct ifnet *ifp, u_long cmd, void *data) error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd); break; default: - error = ether_ioctl(ifp, cmd, data); - if (error == ENETRESET) { + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd == SIOCSIFCAP) + error = (*ifp->if_init)(ifp); + else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* * Multicast list has changed; set the hardware filter * accordingly. */ - if (ifp->if_flags & IFF_RUNNING) - wm_set_filter(sc); - error = 0; + wm_set_filter(sc); } break; } diff --git a/sys/dev/pci/if_xge.c b/sys/dev/pci/if_xge.c index 4885af9b28d..d39279b6ca8 100644 --- a/sys/dev/pci/if_xge.c +++ b/sys/dev/pci/if_xge.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_xge.c,v 1.7 2008/01/04 21:18:03 ad Exp $ */ +/* $NetBSD: if_xge.c,v 1.8 2008/02/07 01:21:58 dyoung Exp $ */ /* * Copyright (c) 2004, SUNET, Swedish University Computer Network. @@ -43,7 +43,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xge.c,v 1.7 2008/01/04 21:18:03 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xge.c,v 1.8 2008/02/07 01:21:58 dyoung Exp $"); #include "bpfilter.h" #include "rnd.h" @@ -840,12 +840,12 @@ xge_ioctl(struct ifnet *ifp, u_long cmd, void *data) switch (cmd) { case SIOCSIFMTU: - if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > XGE_MAX_MTU) { + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > XGE_MAX_MTU) error = EINVAL; - } else { + else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET){ PIF_WCSR(RMAC_MAX_PYLD_LEN, RMAC_PYLD_LEN(ifr->ifr_mtu)); - ifp->if_mtu = ifr->ifr_mtu; + error = 0; } break; @@ -855,10 +855,16 @@ xge_ioctl(struct ifnet *ifp, u_long cmd, void *data) break; default: - if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET){ + if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) + break; + + error = 0; + + if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI) + ; + else if (ifp->if_flags & IFF_RUNNING) { /* Change multicast list */ xge_mcast_filter(sc); - error = 0; } break; } diff --git a/sys/dev/ppbus/if_plip.c b/sys/dev/ppbus/if_plip.c index c089ef5a4d1..7c97ce6f541 100644 --- a/sys/dev/ppbus/if_plip.c +++ b/sys/dev/ppbus/if_plip.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_plip.c,v 1.15 2007/10/19 12:01:07 ad Exp $ */ +/* $NetBSD: if_plip.c,v 1.16 2008/02/07 01:21:58 dyoung Exp $ */ /*- * Copyright (c) 1997 Poul-Henning Kamp @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_plip.c,v 1.15 2007/10/19 12:01:07 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_plip.c,v 1.16 2008/02/07 01:21:58 dyoung Exp $"); /* * Parallel port TCP/IP interfaces added. I looked at the driver from @@ -432,11 +432,10 @@ lpioctl (struct ifnet *ifp, u_long cmd, void *data) } if(ptr) free(ptr,M_DEVBUF); - sc->sc_if.if_mtu = ifr->ifr_mtu; - break; - + /*FALLTHROUGH*/ case SIOCGIFMTU: - ifr->ifr_mtu = sc->sc_if.if_mtu; + if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCADDMULTI: diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c index a3155b641ea..fbfff47f432 100644 --- a/sys/dev/usb/if_aue.c +++ b/sys/dev/usb/if_aue.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_aue.c,v 1.109 2008/01/19 22:10:20 dyoung Exp $ */ +/* $NetBSD: if_aue.c,v 1.110 2008/02/07 01:21:58 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 * Bill Paul <wpaul@ee.columbia.edu>. All rights reserved. @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.109 2008/01/19 22:10:20 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.110 2008/02/07 01:21:58 dyoung Exp $"); #if defined(__NetBSD__) #include "opt_inet.h" @@ -1607,10 +1607,10 @@ aue_ioctl(struct ifnet *ifp, u_long command, void *data) break; case SIOCSIFMTU: - if (ifr->ifr_mtu > ETHERMTU) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: diff --git a/sys/dev/usb/if_axe.c b/sys/dev/usb/if_axe.c index fe53e31252f..4ecdac05e91 100644 --- a/sys/dev/usb/if_axe.c +++ b/sys/dev/usb/if_axe.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.22 2008/01/19 22:10:20 dyoung Exp $ */ +/* $NetBSD: if_axe.c,v 1.23 2008/02/07 01:21:58 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000-2003 @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.22 2008/01/19 22:10:20 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.23 2008/02/07 01:21:58 dyoung Exp $"); #if defined(__NetBSD__) #include "opt_inet.h" @@ -1155,10 +1155,10 @@ axe_ioctl(struct ifnet *ifp, u_long cmd, void *data) break; case SIOCSIFMTU: - if (ifr->ifr_mtu > ETHERMTU) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, cmd, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: diff --git a/sys/dev/usb/if_cdce.c b/sys/dev/usb/if_cdce.c index 92e2ef94bfb..beb11f01e79 100644 --- a/sys/dev/usb/if_cdce.c +++ b/sys/dev/usb/if_cdce.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_cdce.c,v 1.14 2007/03/13 13:51:54 drochner Exp $ */ +/* $NetBSD: if_cdce.c,v 1.15 2008/02/07 01:21:59 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <wpaul@windriver.com> @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.14 2007/03/13 13:51:54 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.15 2008/02/07 01:21:59 dyoung Exp $"); #include "bpfilter.h" #include <sys/param.h> @@ -466,10 +466,10 @@ cdce_ioctl(struct ifnet *ifp, u_long command, void *data) break; case SIOCSIFMTU: - if (ifr->ifr_mtu > ETHERMTU) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: diff --git a/sys/dev/usb/if_cue.c b/sys/dev/usb/if_cue.c index f1290c87966..efca313cc00 100644 --- a/sys/dev/usb/if_cue.c +++ b/sys/dev/usb/if_cue.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_cue.c,v 1.51 2007/08/29 22:33:43 dyoung Exp $ */ +/* $NetBSD: if_cue.c,v 1.52 2008/02/07 01:21:59 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 * Bill Paul <wpaul@ee.columbia.edu>. All rights reserved. @@ -56,7 +56,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.51 2007/08/29 22:33:43 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.52 2008/02/07 01:21:59 dyoung Exp $"); #if defined(__NetBSD__) #include "opt_inet.h" @@ -1183,10 +1183,10 @@ cue_ioctl(struct ifnet *ifp, u_long command, void *data) break; case SIOCSIFMTU: - if (ifr->ifr_mtu > ETHERMTU) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c index a0434c07253..5ae9bf8c6b5 100644 --- a/sys/dev/usb/if_kue.c +++ b/sys/dev/usb/if_kue.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_kue.c,v 1.61 2007/12/20 21:08:19 dyoung Exp $ */ +/* $NetBSD: if_kue.c,v 1.62 2008/02/07 01:21:59 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999, 2000 * Bill Paul <wpaul@ee.columbia.edu>. All rights reserved. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.61 2007/12/20 21:08:19 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.62 2008/02/07 01:21:59 dyoung Exp $"); #if defined(__NetBSD__) #include "opt_inet.h" @@ -1091,10 +1091,10 @@ kue_ioctl(struct ifnet *ifp, u_long command, void *data) break; case SIOCSIFMTU: - if (ifr->ifr_mtu > ETHERMTU) + if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: diff --git a/sys/dev/usb/if_upl.c b/sys/dev/usb/if_upl.c index bcac8679321..6426c188ea1 100644 --- a/sys/dev/usb/if_upl.c +++ b/sys/dev/usb/if_upl.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_upl.c,v 1.29 2007/03/13 13:51:54 drochner Exp $ */ +/* $NetBSD: if_upl.c,v 1.30 2008/02/07 01:21:59 dyoung Exp $ */ /* * Copyright (c) 2000 The NetBSD Foundation, Inc. * All rights reserved. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.29 2007/03/13 13:51:54 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.30 2008/02/07 01:21:59 dyoung Exp $"); #include "opt_inet.h" #include "bpfilter.h" @@ -880,8 +880,8 @@ upl_ioctl(struct ifnet *ifp, u_long command, void *data) case SIOCSIFMTU: if (ifr->ifr_mtu > UPL_BUFSZ) error = EINVAL; - else - ifp->if_mtu = ifr->ifr_mtu; + else if ((error = ifioctl_common(ifp, command, data)) == ENETRESET) + error = 0; break; case SIOCSIFFLAGS: |
