git: f7fd4e79fa09 - main - rge: handle interface flags changes
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 25 Mar 2026 01:29:55 UTC
The branch main has been updated by adrian:
URL: https://cgit.FreeBSD.org/src/commit/?id=f7fd4e79fa0943446aa5900147f737a70c73d9e3
commit f7fd4e79fa0943446aa5900147f737a70c73d9e3
Author: Brad Smith <brad@comstyle.com>
AuthorDate: 2026-03-25 01:22:52 +0000
Commit: Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-03-25 01:22:52 +0000
rge: handle interface flags changes
Handle interface flags like other drivers do.
Reviewed by: zlei, adrian
Differential Revision: https://reviews.freebsd.org/D55728
---
sys/dev/rge/if_rge.c | 21 ++++++++-------------
sys/dev/rge/if_rgevar.h | 2 ++
2 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/sys/dev/rge/if_rge.c b/sys/dev/rge/if_rge.c
index e5297edfefbe..5ae0b98f95a1 100644
--- a/sys/dev/rge/if_rge.c
+++ b/sys/dev/rge/if_rge.c
@@ -959,29 +959,24 @@ rge_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case SIOCSIFFLAGS:
RGE_LOCK(sc);
if ((if_getflags(ifp) & IFF_UP) != 0) {
- if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0) {
- /*
- * TODO: handle promisc/iffmulti changing
- * without reprogramming everything.
- */
+ if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
+ if (((if_getflags(ifp) ^ sc->rge_if_flags)
+ & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
+ rge_iff_locked(sc);
+ } else
rge_init_locked(sc);
- } else {
- /* Reinit promisc/multi just in case */
- rge_iff_locked(sc);
- }
} else {
- if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) {
+ if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
rge_stop_locked(sc);
- }
}
+ sc->rge_if_flags = if_getflags(ifp);
RGE_UNLOCK(sc);
break;
case SIOCADDMULTI:
case SIOCDELMULTI:
RGE_LOCK(sc);
- if ((if_getflags(ifp) & IFF_DRV_RUNNING) != 0) {
+ if ((if_getflags(ifp) & IFF_DRV_RUNNING) != 0)
rge_iff_locked(sc);
- }
RGE_UNLOCK(sc);
break;
case SIOCGIFMEDIA:
diff --git a/sys/dev/rge/if_rgevar.h b/sys/dev/rge/if_rgevar.h
index 6228f9ff229e..d516537e6524 100644
--- a/sys/dev/rge/if_rgevar.h
+++ b/sys/dev/rge/if_rgevar.h
@@ -200,6 +200,8 @@ struct rge_softc {
#define RGE_IMTYPE_SIM 1
int sc_watchdog;
+ int rge_if_flags;
+
uint32_t sc_debug;
struct rge_drv_stats sc_drv_stats;