git: 97ecdc00ac5a - main - neta: Fix MTU change sequence
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 18 Aug 2022 16:57:06 UTC
The branch main has been updated by kd:
URL: https://cgit.FreeBSD.org/src/commit/?id=97ecdc00ac5ac506f4119be9570d13de2d3a003a
commit 97ecdc00ac5ac506f4119be9570d13de2d3a003a
Author: Kornel Dulęba <kd@FreeBSD.org>
AuthorDate: 2022-08-18 16:53:14 +0000
Commit: Kornel Dulęba <kd@FreeBSD.org>
CommitDate: 2022-08-18 16:53:14 +0000
neta: Fix MTU change sequence
The IFF_DRV_RUNNING flag is used to see if the interface needs
to be temporarily brought down during MTU change sequence.
The problem here is that this flag is cleared in mvneta_stop_locked,
resulting in the reinitialization logic never being executed after
MTU has been changed.
Fix that by saving the flag value before the interface is brought down.
Reported by: Jérôme Tomczyk <jerome.tomczyk@stormshield.eu>
Approved by: mw(mentor)
Obtained from: Semihalf
Sponsored by: Stormshield
MFC after: 2 weeks
---
sys/dev/neta/if_mvneta.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/sys/dev/neta/if_mvneta.c b/sys/dev/neta/if_mvneta.c
index c2eb32947716..eb6c9eec74ce 100644
--- a/sys/dev/neta/if_mvneta.c
+++ b/sys/dev/neta/if_mvneta.c
@@ -2054,9 +2054,11 @@ mvneta_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
struct ifreq *ifr;
int error, mask;
uint32_t flags;
+ bool reinit;
int q;
error = 0;
+ reinit = false;
sc = ifp->if_softc;
ifr = (struct ifreq *)data;
switch (cmd) {
@@ -2157,8 +2159,10 @@ mvneta_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
* Reinitialize RX queues.
* We need to update RX descriptor size.
*/
- if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ reinit = true;
mvneta_stop_locked(sc);
+ }
for (q = 0; q < MVNETA_RX_QNUM_MAX; q++) {
mvneta_rx_lockq(sc, q);
@@ -2172,7 +2176,7 @@ mvneta_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
}
mvneta_rx_unlockq(sc, q);
}
- if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+ if (reinit)
mvneta_init_locked(sc);
mvneta_sc_unlock(sc);