Index: sys/dev/bnxt/if_bnxt.c =================================================================== --- sys/dev/bnxt/if_bnxt.c (revision 345888) +++ sys/dev/bnxt/if_bnxt.c (working copy) @@ -797,6 +797,13 @@ /* These likely get lost... */ IFCAP_VLAN_HWCSUM | IFCAP_JUMBO_MTU; + /* HWRM interface v1.9.1 doesn't support VLAN HW Filters PR236983 */ + if (softc->ver_info->hwrm_if_major == 1 + && softc->ver_info->hwrm_if_minor < 9) { + scctx->isc_capabilities |= IFCAP_VLAN_HWFILTER; + scctx->isc_capenable |= IFCAP_VLAN_HWFILTER; + } + if (bnxt_wol_supported(softc)) scctx->isc_capenable |= IFCAP_WOL_MAGIC; @@ -1015,6 +1022,7 @@ bnxt_init(if_ctx_t ctx) { struct bnxt_softc *softc = iflib_get_softc(ctx); + if_t ifp = iflib_get_ifp(ctx); struct ifmediareq ifmr; int i, j; int rc; @@ -1165,6 +1173,10 @@ bnxt_do_enable_intr(&softc->def_cp_ring); bnxt_media_status(softc->ctx, &ifmr); + if (if_getcapabilities(ifp) & IFCAP_VLAN_HWFILTER) + softc->vnic_info.rx_mask &= ~HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN; + else + softc->vnic_info.rx_mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN; bnxt_hwrm_cfa_l2_set_rx_mask(softc, &softc->vnic_info); return; @@ -1381,10 +1393,12 @@ softc->vnic_info.rx_mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_PROMISCUOUS | HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN; - else + else { softc->vnic_info.rx_mask &= - ~(HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_PROMISCUOUS | - HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN); + ~HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_PROMISCUOUS; + if (if_getcapabilities(ifp) & IFCAP_VLAN_HWFILTER) + softc->vnic_info.rx_mask &= ~HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN; + } rc = bnxt_hwrm_cfa_l2_set_rx_mask(softc, &softc->vnic_info);