From: Kalesh AP Date: Tue, 10 Dec 2019 15:05:25 +0000 (+0530) Subject: net/bnxt: restore VLAN filters during reset recovery X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=151c8240ac6ad32269a04b5012cabceea0843abb net/bnxt: restore VLAN filters during reset recovery Older Firmware could have state information such as MAC Filters, VLAN settings etc configured by user. But new Firmware is unaware of this state information and as a result driver should restore these settings during reset recovery. This patch restores the user configured vlan settings prior to hot FW upgrade or FW error. Signed-off-by: Kalesh AP Reviewed-by: Ajit Khaparde --- diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index addc8502a4..d72a756ee9 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3796,6 +3796,29 @@ static void bnxt_dev_cleanup(struct bnxt *bp) bnxt_uninit_resources(bp, true); } +static int bnxt_restore_vlan_filters(struct bnxt *bp) +{ + struct rte_eth_dev *dev = bp->eth_dev; + struct rte_vlan_filter_conf *vfc; + int vidx, vbit, rc; + uint16_t vlan_id; + + for (vlan_id = 1; vlan_id <= RTE_ETHER_MAX_VLAN_ID; vlan_id++) { + vfc = &dev->data->vlan_filter_conf; + vidx = vlan_id / 64; + vbit = vlan_id % 64; + + /* Each bit corresponds to a VLAN id */ + if (vfc->ids[vidx] & (UINT64_C(1) << vbit)) { + rc = bnxt_add_vlan_filter(bp, vlan_id); + if (rc) + return rc; + } + } + + return 0; +} + static int bnxt_restore_mac_filters(struct bnxt *bp) { struct rte_eth_dev *dev = bp->eth_dev; @@ -3849,6 +3872,10 @@ static int bnxt_restore_filters(struct bnxt *bp) ret = bnxt_promiscuous_enable_op(dev); ret = bnxt_restore_mac_filters(bp); + if (ret) + return ret; + + ret = bnxt_restore_vlan_filters(bp); /* TODO restore other filters as well */ return ret; }