diff options
author | yongari <yongari@FreeBSD.org> | 2010-02-26 20:26:17 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2010-02-26 20:26:17 +0000 |
commit | c08d71acc77a9b5828d94d12fcd7145a33c2f2ac (patch) | |
tree | 0b3661096c8cfd095ff016289a9f61ef5d0b4ea4 | |
parent | ce9f29768bfd25b826f77bb33e2c43dee3b7ede4 (diff) | |
download | FreeBSD-src-c08d71acc77a9b5828d94d12fcd7145a33c2f2ac.zip FreeBSD-src-c08d71acc77a9b5828d94d12fcd7145a33c2f2ac.tar.gz |
Make sure to stop controller first before changing MTU. And if
interface is not running don't initialize controller.
While here remove unnecessary update of error variable.
Reviewed by: davidch
-rw-r--r-- | sys/dev/bce/if_bce.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c index 268c632..d5013d1 100644 --- a/sys/dev/bce/if_bce.c +++ b/sys/dev/bce/if_bce.c @@ -6989,7 +6989,7 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) struct bce_softc *sc = ifp->if_softc; struct ifreq *ifr = (struct ifreq *) data; struct mii_data *mii; - int mask, error = 0; + int mask, error = 0, reinit; DBENTER(BCE_VERBOSE_MISC); @@ -7010,7 +7010,16 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) BCE_LOCK(sc); ifp->if_mtu = ifr->ifr_mtu; - ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + reinit = 0; + if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + /* + * Because allocation size is used in RX + * buffer allocation, stop controller if + * it is already running. + */ + bce_stop(sc); + reinit = 1; + } #ifdef BCE_JUMBO_HDRSPLIT /* No buffer allocation size changes are necessary. */ #else @@ -7028,7 +7037,8 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) } #endif - bce_init_locked(sc); + if (reinit != 0) + bce_init_locked(sc); BCE_UNLOCK(sc); break; @@ -7062,7 +7072,6 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) } BCE_UNLOCK(sc); - error = 0; break; @@ -7072,10 +7081,8 @@ bce_ioctl(struct ifnet *ifp, u_long command, caddr_t data) DBPRINT(sc, BCE_VERBOSE_MISC, "Received SIOCADDMULTI/SIOCDELMULTI\n"); BCE_LOCK(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) { + if (ifp->if_drv_flags & IFF_DRV_RUNNING) bce_set_rx_mode(sc); - error = 0; - } BCE_UNLOCK(sc); break; |