X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Fbnxt_ethdev.c;h=d72a756ee9728fde0a8ddd48b9bd04e04cd4769d;hb=151c8240ac6a;hp=c70b072bf61cf50e492e80bc5d9419257314ffee;hpb=fb590010d97549284612c2f31ae3a45b8f9277f7;p=dpdk.git diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index c70b072bf6..d72a756ee9 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -3796,6 +3796,71 @@ 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; + struct rte_eth_dev_info dev_info; + struct rte_ether_addr *addr; + uint64_t pool_mask; + uint32_t pool = 0; + uint16_t i; + int rc; + + if (BNXT_VF(bp) & !BNXT_VF_IS_TRUSTED(bp)) + return 0; + + rc = bnxt_dev_info_get_op(dev, &dev_info); + if (rc) + return rc; + + /* replay MAC address configuration */ + for (i = 1; i < dev_info.max_mac_addrs; i++) { + addr = &dev->data->mac_addrs[i]; + + /* skip zero address */ + if (rte_is_zero_ether_addr(addr)) + continue; + + pool = 0; + pool_mask = dev->data->mac_pool_sel[i]; + + do { + if (pool_mask & 1ULL) { + rc = bnxt_mac_addr_add_op(dev, addr, i, pool); + if (rc) + return rc; + } + pool_mask >>= 1; + pool++; + } while (pool_mask); + } + + return 0; +} + static int bnxt_restore_filters(struct bnxt *bp) { struct rte_eth_dev *dev = bp->eth_dev; @@ -3806,6 +3871,11 @@ static int bnxt_restore_filters(struct bnxt *bp) if (dev->data->promiscuous) 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; }