Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2026 01:29:55 +0000
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        Brad Smith <brad@comstyle.com>
Subject:   git: f7fd4e79fa09 - main - rge: handle interface flags changes
Message-ID:  <69c33a93.1895d.63e7c35d@gitrepo.freebsd.org>

index | next in thread | raw e-mail

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;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69c33a93.1895d.63e7c35d>