diff options
| -rw-r--r-- | sys/dev/ixgbe/if_ixv.c | 30 | ||||
| -rw-r--r-- | sys/dev/ixgbe/ix_txrx.c | 3 |
2 files changed, 22 insertions, 11 deletions
diff --git a/sys/dev/ixgbe/if_ixv.c b/sys/dev/ixgbe/if_ixv.c index e1fb720511fb..a6a3465b60d7 100644 --- a/sys/dev/ixgbe/if_ixv.c +++ b/sys/dev/ixgbe/if_ixv.c @@ -1470,6 +1470,7 @@ ixv_initialize_receive_units(if_ctx_t ctx) static void ixv_setup_vlan_support(if_ctx_t ctx) { + struct ifnet *ifp = iflib_get_ifp(ctx); struct adapter *adapter = iflib_get_softc(ctx); struct ixgbe_hw *hw = &adapter->hw; u32 ctrl, vid, vfta, retry; @@ -1483,19 +1484,28 @@ ixv_setup_vlan_support(if_ctx_t ctx) if (adapter->num_vlans == 0) return; - /* Enable the queues */ - for (int i = 0; i < adapter->num_rx_queues; i++) { - ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)); - ctrl |= IXGBE_RXDCTL_VME; - IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl); - /* - * Let Rx path know that it needs to store VLAN tag - * as part of extra mbuf info. - */ - adapter->rx_queues[i].rxr.vtag_strip = TRUE; + if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) { + /* Enable the queues */ + for (int i = 0; i < adapter->num_rx_queues; i++) { + ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)); + ctrl |= IXGBE_RXDCTL_VME; + IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl); + /* + * Let Rx path know that it needs to store VLAN tag + * as part of extra mbuf info. + */ + adapter->rx_queues[i].rxr.vtag_strip = TRUE; + } } /* + * If filtering VLAN tags is disabled, + * there is no need to fill VLAN Filter Table Array (VFTA). + */ + if ((ifp->if_capenable & IFCAP_VLAN_HWFILTER) == 0) + return; + + /* * A soft reset zero's out the VFTA, so * we need to repopulate it now. */ diff --git a/sys/dev/ixgbe/ix_txrx.c b/sys/dev/ixgbe/ix_txrx.c index 3fef6c5889d1..91c92c56a6df 100644 --- a/sys/dev/ixgbe/ix_txrx.c +++ b/sys/dev/ixgbe/ix_txrx.c @@ -430,7 +430,8 @@ ixgbe_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri) rxd->wb.upper.status_error = 0; eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0); - if (staterr & IXGBE_RXD_STAT_VP) { + + if ( (rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP) ) { vtag = le16toh(rxd->wb.upper.vlan); } else { vtag = 0; |
