git: 877f0ee40c2a - main - ixgbe: Preserve VF jumbo frame size across PF resets
Kevin Bowling <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.cvs.src,gmane.os.freebsd.current.scm |
|---|---|
| Message-ID | <[email protected]> |
The branch main has been updated by kbowling: URL: https://cgit.FreeBSD.org/src/commit/?id=877f0ee40c2af801c5ca758a37b3ebddc560dad2 commit 877f0ee40c2af801c5ca758a37b3ebddc560dad2 Author: Kevin Bowling <[email protected]> AuthorDate: 2026-08-10 15:08:49 +0000 Commit: Kevin Bowling <[email protected]> CommitDate: 2026-08-10 16:33:12 +0000 ixgbe: Preserve VF jumbo frame size across PF resets sc->max_frame_size represents the largest frame requested by the PF or an active VF. The MTU callback replaces it with the PF frame size, so a subsequent reinitialization can program MHADD below an active VF's jumbo-frame request. Recompute the aggregate before hardware initialization and use it when programming MHADD. Recompute after each VF LPE request as well, so a reduced request can lower the hardware limit when no other function needs the previous value. MFC after: 2 weeks --- sys/dev/ixgbe/if_ix.c | 6 +++++- sys/dev/ixgbe/if_sriov.c | 7 ++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sys/dev/ixgbe/if_ix.c b/sys/dev/ixgbe/if_ix.c index cd8acf6685a8..252ae352829e 100644 --- a/sys/dev/ixgbe/if_ix.c +++ b/sys/dev/ixgbe/if_ix.c @@ -3973,6 +3973,10 @@ ixgbe_if_init(if_ctx_t ctx) INIT_DEBUGOUT("ixgbe_if_init: begin"); + /* Preserve the largest frame requested by the PF or an active VF. */ + sc->max_frame_size = if_getmtu(ifp) + IXGBE_MTU_HDR; + ixgbe_recalculate_max_frame(sc); + /* Queue indices may change with IOV mode */ ixgbe_align_all_queue_indices(sc); @@ -4010,7 +4014,7 @@ ixgbe_if_init(if_ctx_t ctx) ixgbe_config_gpie(sc); /* Set MTU size */ - if (if_getmtu(ifp) > ETHERMTU) { + if (sc->max_frame_size > ETHER_MAX_LEN) { /* aka IXGBE_MAXFRS on 82599 and newer */ mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD); mhadd &= ~IXGBE_MHADD_MFS_MASK; diff --git a/sys/dev/ixgbe/if_sriov.c b/sys/dev/ixgbe/if_sriov.c index 93555d11e72e..4ca61d078c8e 100644 --- a/sys/dev/ixgbe/if_sriov.c +++ b/sys/dev/ixgbe/if_sriov.c @@ -1150,7 +1150,7 @@ ixgbe_vf_set_lpe(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg) } vf->maximum_frame_size = vf_max_size; - ixgbe_update_max_frame(sc, vf->maximum_frame_size); + ixgbe_recalculate_max_frame(sc); /* * We might have to disable reception to this VF if the frame size is @@ -1161,7 +1161,7 @@ ixgbe_vf_set_lpe(struct ixgbe_softc *sc, struct ixgbe_vf *vf, uint32_t *msg) mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD); pf_max_size = (mhadd & IXGBE_MHADD_MFS_MASK) >> IXGBE_MHADD_MFS_SHIFT; - if (pf_max_size < sc->max_frame_size) { + if (pf_max_size != sc->max_frame_size) { mhadd &= ~IXGBE_MHADD_MFS_MASK; mhadd |= sc->max_frame_size << IXGBE_MHADD_MFS_SHIFT; IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd); @@ -2107,12 +2107,13 @@ ixgbe_activate_vfs(struct ixgbe_softc *sc) } /* ixgbe_activate_vfs */ -/* Check the max frame setting of all active VF's */ +/* Recompute the maximum frame setting of the PF and all active VFs. */ void ixgbe_recalculate_max_frame(struct ixgbe_softc *sc) { struct ixgbe_vf *vf; + sc->max_frame_size = if_getmtu(iflib_get_ifp(sc->ctx)) + IXGBE_MTU_HDR; for (int i = 0; i < sc->num_vfs; i++) { vf = &sc->vfs[i]; if (vf->flags & IXGBE_VF_ACTIVE)