diff --git a/sys/dev/e1000/em_txrx.c b/sys/dev/e1000/em_txrx.c --- a/sys/dev/e1000/em_txrx.c +++ b/sys/dev/e1000/em_txrx.c @@ -671,9 +671,9 @@ u32 pkt_info; u32 staterr = 0; bool eop; - int i, cidx, vtag; + int i, cidx; - i = vtag = 0; + i = 0; cidx = ri->iri_cidx; do { @@ -706,16 +706,13 @@ i++; } while (!eop); - if (if_getcapenable(ri->iri_ifp) & IFCAP_RXCSUM) + if (scctx->isc_capenable & IFCAP_RXCSUM) em_receive_checksum(staterr, staterr >> 24, ri); if (staterr & E1000_RXD_STAT_VP) { - vtag = le16toh(rxd->wb.upper.vlan); - } - - ri->iri_vtag = vtag; - if (vtag) + ri->iri_vtag = le16toh(rxd->wb.upper.vlan); ri->iri_flags |= M_VLANTAG; + } ri->iri_flowid = le32toh(rxd->wb.lower.hi_dword.rss); ri->iri_rsstype = em_determine_rsstype(pkt_info); diff --git a/sys/dev/e1000/igb_txrx.c b/sys/dev/e1000/igb_txrx.c --- a/sys/dev/e1000/igb_txrx.c +++ b/sys/dev/e1000/igb_txrx.c @@ -436,12 +436,12 @@ struct rx_ring *rxr = &que->rxr; union e1000_adv_rx_desc *rxd; - uint16_t pkt_info, len, vtag; + uint16_t pkt_info, len; uint32_t ptype, staterr; int i, cidx; bool eop; - staterr = i = vtag = 0; + staterr = i = 0; cidx = ri->iri_cidx; do { @@ -460,13 +460,6 @@ rxd->wb.upper.status_error = 0; eop = ((staterr & E1000_RXD_STAT_EOP) == E1000_RXD_STAT_EOP); - if (((sc->hw.mac.type == e1000_i350) || - (sc->hw.mac.type == e1000_i354)) && - (staterr & E1000_RXDEXT_STATERR_LB)) - vtag = be16toh(rxd->wb.upper.vlan); - else - vtag = le16toh(rxd->wb.upper.vlan); - /* Make sure bad packets are discarded */ if (eop && ((staterr & E1000_RXDEXT_ERR_FRAME_ERR_MASK) != 0)) { sc->dropped_pkts++; @@ -495,9 +488,13 @@ if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0) igb_rx_checksum(staterr, ri, ptype); - if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 && - (staterr & E1000_RXD_STAT_VP) != 0) { - ri->iri_vtag = vtag; + if (staterr & E1000_RXD_STAT_VP) { + if (((sc->hw.mac.type == e1000_i350) || + (sc->hw.mac.type == e1000_i354)) && + (staterr & E1000_RXDEXT_STATERR_LB)) + ri->iri_vtag = be16toh(rxd->wb.upper.vlan); + else + ri->iri_vtag = le16toh(rxd->wb.upper.vlan); ri->iri_flags |= M_VLANTAG; } diff --git a/sys/dev/iavf/iavf_txrx_iflib.c b/sys/dev/iavf/iavf_txrx_iflib.c --- a/sys/dev/iavf/iavf_txrx_iflib.c +++ b/sys/dev/iavf/iavf_txrx_iflib.c @@ -665,11 +665,12 @@ iavf_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri) { struct iavf_vsi *vsi = arg; + if_softc_ctx_t scctx = vsi->shared; struct iavf_rx_queue *que = &vsi->rx_queues[ri->iri_qsidx]; struct rx_ring *rxr = &que->rxr; union iavf_rx_desc *cur; u32 status, error; - u16 plen, vtag; + u16 plen; u64 qword; u8 ptype; bool eop; @@ -700,10 +701,6 @@ cur->wb.qword1.status_error_len = 0; eop = (status & (1 << IAVF_RX_DESC_STATUS_EOF_SHIFT)); - if (status & (1 << IAVF_RX_DESC_STATUS_L2TAG1P_SHIFT)) - vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1); - else - vtag = 0; /* ** Make sure bad packets are discarded, @@ -726,14 +723,15 @@ rxr->packets++; rxr->rx_packets++; - if ((if_getcapenable(vsi->ifp) & IFCAP_RXCSUM) != 0) + if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0) iavf_rx_checksum(ri, status, error, ptype); ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss); ri->iri_rsstype = iavf_ptype_to_hash(ptype); - ri->iri_vtag = vtag; - ri->iri_nfrags = i; - if (vtag) + if (status & (1 << IAVF_RX_DESC_STATUS_L2TAG1P_SHIFT)) { + ri->iri_vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1); ri->iri_flags |= M_VLANTAG; + } + ri->iri_nfrags = i; return (0); } diff --git a/sys/dev/ice/ice_iflib_txrx.c b/sys/dev/ice/ice_iflib_txrx.c --- a/sys/dev/ice/ice_iflib_txrx.c +++ b/sys/dev/ice/ice_iflib_txrx.c @@ -282,9 +282,10 @@ ice_ift_rxd_pkt_get(void *arg, if_rxd_info_t ri) { struct ice_softc *sc = (struct ice_softc *)arg; + if_softc_ctx_t scctx = sc->scctx; struct ice_rx_queue *rxq = &sc->pf_vsi.rx_queues[ri->iri_qsidx]; union ice_32b_rx_flex_desc *cur; - u16 status0, plen, vtag, ptype; + u16 status0, plen, ptype; bool eop; size_t cidx; int i; @@ -309,10 +310,6 @@ cur->wb.status_error0 = 0; eop = (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_EOF_S)); - if (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S)) - vtag = le16toh(cur->wb.l2tag1); - else - vtag = 0; /* * Make sure packets with bad L2 values are discarded. @@ -334,15 +331,16 @@ rxq->stats.rx_packets++; rxq->stats.rx_bytes += ri->iri_len; - if ((iflib_get_ifp(sc->ctx)->if_capenable & IFCAP_RXCSUM) != 0) + if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0) ice_rx_checksum(rxq, &ri->iri_csum_flags, &ri->iri_csum_data, status0, ptype); ri->iri_flowid = le32toh(RX_FLEX_NIC(&cur->wb, rss_hash)); ri->iri_rsstype = ice_ptype_to_hash(ptype); - ri->iri_vtag = vtag; - ri->iri_nfrags = i; - if (vtag) + if (status0 & BIT(ICE_RX_FLEX_DESC_STATUS0_L2TAG1P_S)) { + ri->iri_vtag = le16toh(cur->wb.l2tag1); ri->iri_flags |= M_VLANTAG; + } + ri->iri_nfrags = i; return (0); } diff --git a/sys/dev/igc/igc_txrx.c b/sys/dev/igc/igc_txrx.c --- a/sys/dev/igc/igc_txrx.c +++ b/sys/dev/igc/igc_txrx.c @@ -461,12 +461,12 @@ struct rx_ring *rxr = &que->rxr; union igc_adv_rx_desc *rxd; - uint16_t pkt_info, len, vtag; + uint16_t pkt_info, len; uint32_t ptype, staterr; int i, cidx; bool eop; - staterr = i = vtag = 0; + staterr = i = 0; cidx = ri->iri_cidx; do { @@ -485,8 +485,6 @@ rxd->wb.upper.status_error = 0; eop = ((staterr & IGC_RXD_STAT_EOP) == IGC_RXD_STAT_EOP); - vtag = le16toh(rxd->wb.upper.vlan); - /* Make sure bad packets are discarded */ if (eop && ((staterr & IGC_RXDEXT_STATERR_RXE) != 0)) { adapter->dropped_pkts++; @@ -517,7 +515,7 @@ if ((scctx->isc_capenable & IFCAP_VLAN_HWTAGGING) != 0 && (staterr & IGC_RXD_STAT_VP) != 0) { - ri->iri_vtag = vtag; + ri->iri_vtag = le16toh(rxd->wb.upper.vlan); ri->iri_flags |= M_VLANTAG; } diff --git a/sys/dev/ixgbe/ix_txrx.c b/sys/dev/ixgbe/ix_txrx.c --- a/sys/dev/ixgbe/ix_txrx.c +++ b/sys/dev/ixgbe/ix_txrx.c @@ -393,13 +393,12 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri) { struct ixgbe_softc *sc = arg; + if_softc_ctx_t scctx = sc->shared; struct ix_rx_queue *que = &sc->rx_queues[ri->iri_qsidx]; struct rx_ring *rxr = &que->rxr; - struct ifnet *ifp = iflib_get_ifp(sc->ctx); union ixgbe_adv_rx_desc *rxd; uint16_t pkt_info, len, cidx, i; - uint16_t vtag = 0; uint32_t ptype; uint32_t staterr = 0; bool eop; @@ -424,16 +423,10 @@ rxd->wb.upper.status_error = 0; eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0); - if ( (rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP) ) { - vtag = le16toh(rxd->wb.upper.vlan); - } else { - vtag = 0; - } - /* Make sure bad packets are discarded */ if (eop && (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) { if (sc->feat_en & IXGBE_FEATURE_VF) - if_inc_counter(ifp, IFCOUNTER_IERRORS, 1); + if_inc_counter(ri->iri_ifp, IFCOUNTER_IERRORS, 1); rxr->rx_discarded++; return (EBADMSG); @@ -452,7 +445,7 @@ rxr->packets++; rxr->rx_bytes += ri->iri_len; - if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) + if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0) ixgbe_rx_checksum(staterr, ri, ptype); ri->iri_flowid = le32toh(rxd->wb.lower.hi_dword.rss); @@ -463,10 +456,12 @@ else ri->iri_rsstype = M_HASHTYPE_OPAQUE_HASH; } - ri->iri_vtag = vtag; - ri->iri_nfrags = i; - if (vtag) + if ((rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP)) { + ri->iri_vtag = le16toh(rxd->wb.upper.vlan); ri->iri_flags |= M_VLANTAG; + } + + ri->iri_nfrags = i; return (0); } /* ixgbe_isc_rxd_pkt_get */ diff --git a/sys/dev/ixl/ixl_txrx.c b/sys/dev/ixl/ixl_txrx.c --- a/sys/dev/ixl/ixl_txrx.c +++ b/sys/dev/ixl/ixl_txrx.c @@ -658,11 +658,12 @@ ixl_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri) { struct ixl_vsi *vsi = arg; + if_softc_ctx_t scctx = vsi->shared; struct ixl_rx_queue *que = &vsi->rx_queues[ri->iri_qsidx]; struct rx_ring *rxr = &que->rxr; union i40e_rx_desc *cur; u32 status, error; - u16 plen, vtag; + u16 plen; u64 qword; u8 ptype; bool eop; @@ -693,10 +694,6 @@ cur->wb.qword1.status_error_len = 0; eop = (status & (1 << I40E_RX_DESC_STATUS_EOF_SHIFT)); - if (status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) - vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1); - else - vtag = 0; /* ** Make sure bad packets are discarded, @@ -719,14 +716,15 @@ rxr->packets++; rxr->rx_packets++; - if ((if_getcapenable(vsi->ifp) & IFCAP_RXCSUM) != 0) + if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0) rxr->csum_errs += ixl_rx_checksum(ri, status, error, ptype); ri->iri_flowid = le32toh(cur->wb.qword0.hi_dword.rss); ri->iri_rsstype = ixl_ptype_to_hash(ptype); - ri->iri_vtag = vtag; - ri->iri_nfrags = i; - if (vtag) + if (status & (1 << I40E_RX_DESC_STATUS_L2TAG1P_SHIFT)) { + ri->iri_vtag = le16toh(cur->wb.qword0.lo_dword.l2tag1); ri->iri_flags |= M_VLANTAG; + } + ri->iri_nfrags = i; return (0); } diff --git a/sys/net/iflib.c b/sys/net/iflib.c --- a/sys/net/iflib.c +++ b/sys/net/iflib.c @@ -4449,6 +4449,7 @@ iflib_stop(ctx); STATE_LOCK(ctx); if_togglecapenable(ifp, setmask); + ctx->ifc_softc_ctx.isc_capenable ^= setmask; STATE_UNLOCK(ctx); if (bits & IFF_DRV_RUNNING && setmask & ~IFCAP_WOL) iflib_init_locked(ctx);