summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/re/if_re.c16
-rw-r--r--sys/pci/if_rlreg.h1
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;
OpenPOWER on IntegriCloud