diff options
-rw-r--r-- | sys/dev/re/if_re.c | 16 | ||||
-rw-r--r-- | sys/pci/if_rlreg.h | 1 |
2 files changed, 13 insertions, 4 deletions
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c index ceae240..83e743a 100644 --- a/sys/dev/re/if_re.c +++ b/sys/dev/re/if_re.c @@ -2509,10 +2509,18 @@ re_ioctl(ifp, command, data) break; case SIOCSIFFLAGS: RL_LOCK(sc); - if (ifp->if_flags & IFF_UP) - re_init_locked(sc); - else if (ifp->if_drv_flags & IFF_DRV_RUNNING) - re_stop(sc); + if ((ifp->if_flags & IFF_UP) != 0) { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { + if (((ifp->if_flags ^ sc->rl_if_flags) + & IFF_PROMISC) != 0) + re_setmulti(sc); + } else + re_init_locked(sc); + } else { + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) + re_stop(sc); + } + sc->rl_if_flags = ifp->if_flags; RL_UNLOCK(sc); break; case SIOCADDMULTI: diff --git a/sys/pci/if_rlreg.h b/sys/pci/if_rlreg.h index da0fbca..8377f35 100644 --- a/sys/pci/if_rlreg.h +++ b/sys/pci/if_rlreg.h @@ -728,6 +728,7 @@ struct rl_softc { uint32_t rl_hwrev; uint32_t rl_rxlenmask; int rl_testmode; + int rl_if_flags; int suspended; /* 0 = normal 1 = suspended */ #ifdef DEVICE_POLLING int rxcycles; |