Re: Broadcom bnxt driver issue with promisc mode

From: <sthaug_at_nethelp.no>
Date: Thu, 04 Nov 2021 09:18:39 UTC
> After survey about solution for Broadcom bnxt driver issue with promiscous mode. I am not found any normal solution with that situation.
> Only workaround to using promiscous mode to have normal operations with these cards. This isn't normal by me!
> 
> I look and do some debug on bnxt driver. Issue came from hardware filter in ASIC. On init driver and its ring buffers default states of filter are all block. Also I saw that we have not ability to append configured VLANs on the host into broadcom vlan tag list to be allowed for further processing from network stack.
> Then my solution is simple and effective in such situation. I append to filter mask bit for passing further for processing all tagged vlans and native/primary vlan too.
> 
> This is enough to have normal packet processing for bnxt driver.
> We have such BCM57414 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller. I tested patch on them.
> 
> Patch is make on FreeBSD 14.0-CURRENT #3 main-n244973-c02a28754bc-dirty: Tue Nov  2 20:53:08 EET 2021
> 
> If you are thinking it is ok. You can feel free to merge it to FreeBSD existing driver.

This patch solved a big problem for me also. My environment is FreeBSD
12.2-STABLE (r370686), with a 2 port BCM57412. The bnxt interfaces
work fine as long as I configure IP address on the main (physical)
interface - no VLANs. If I configure a VLAN interface (e.g. bnxt1.91),
this only works if I put the main interface in promiscuous mode.

After updating if_bnxt.c with the patch from Michael Pounov, I am now
able to use VLAN interfaces without putting the main interface in
promiscuous mode.

This is the output from pciconf -lv:

bnxt0@pci0:24:0:0:      class=0x020000 card=0x412014e4 chip=0x16d614e4 rev=0x01 hdr=0x00
    vendor     = 'Broadcom Inc. and subsidiaries'
    device     = 'BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller'
    class      = network
    subclass   = ethernet
bnxt1@pci0:24:0:1:      class=0x020000 card=0x412014e4 chip=0x16d614e4 rev=0x01 hdr=0x00
    vendor     = 'Broadcom Inc. and subsidiaries'
    device     = 'BCM57412 NetXtreme-E 10Gb RDMA Ethernet Controller'
    class      = network
    subclass   = ethernet

Below I have enclosed the patch I used for 12.2-STABLE - the only
difference, as far as I can see, is slightly different line numbers.

Thank you Michael Pounov!

Steinar Haug, Nethelp consulting, sthaug@nethelp.no

----------------------------------------------------------------------

--- sys/dev/bnxt/if_bnxt.c.orig	2021-09-28 21:25:17.000000000 +0200
+++ sys/dev/bnxt/if_bnxt.c	2021-11-04 07:59:24.720236000 +0100
@@ -587,7 +587,8 @@
 	softc->vnic_info.def_ring_grp = (uint16_t)HWRM_NA_SIGNATURE;
 	softc->vnic_info.cos_rule = (uint16_t)HWRM_NA_SIGNATURE;
 	softc->vnic_info.lb_rule = (uint16_t)HWRM_NA_SIGNATURE;
-	softc->vnic_info.rx_mask = HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_BCAST;
+	softc->vnic_info.rx_mask = HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_BCAST |
+		HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN;
 	softc->vnic_info.mc_list_count = 0;
 	softc->vnic_info.flags = BNXT_VNIC_FLAG_DEFAULT;
 	rc = iflib_dma_alloc(ctx, BNXT_MAX_MC_ADDRS * ETHER_ADDR_LEN,
@@ -1384,8 +1385,7 @@
 		    HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ANYVLAN_NONVLAN;
 	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);
 
 	rc = bnxt_hwrm_cfa_l2_set_rx_mask(softc, &softc->vnic_info);