net/bnxt: fix duplicate creation of ntuple filter
[dpdk.git] / drivers / net / bnxt / bnxt_ethdev.c
index 8c9926b..dc437b4 100644 (file)
@@ -145,7 +145,7 @@ static const struct rte_pci_id bnxt_pci_id_map[] = {
        ETH_RSS_NONFRAG_IPV6_TCP |      \
        ETH_RSS_NONFRAG_IPV6_UDP)
 
-static void bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
+static int bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask);
 
 /***********************/
 
@@ -591,7 +591,9 @@ static int bnxt_dev_start_op(struct rte_eth_dev *eth_dev)
                vlan_mask |= ETH_VLAN_FILTER_MASK;
        if (eth_dev->data->dev_conf.rxmode.hw_vlan_strip)
                vlan_mask |= ETH_VLAN_STRIP_MASK;
-       bnxt_vlan_offload_set_op(eth_dev, vlan_mask);
+       rc = bnxt_vlan_offload_set_op(eth_dev, vlan_mask);
+       if (rc)
+               goto error;
 
        return 0;
 
@@ -1350,7 +1352,7 @@ static int bnxt_vlan_filter_set_op(struct rte_eth_dev *eth_dev,
                return bnxt_del_vlan_filter(bp, vlan_id);
 }
 
-static void
+static int
 bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
 {
        struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
@@ -1382,6 +1384,8 @@ bnxt_vlan_offload_set_op(struct rte_eth_dev *dev, int mask)
 
        if (mask & ETH_VLAN_EXTEND_MASK)
                RTE_LOG(ERR, PMD, "Extend VLAN Not supported\n");
+
+       return 0;
 }
 
 static void
@@ -1952,25 +1956,29 @@ parse_ntuple_filter(struct bnxt *bp,
 }
 
 static struct bnxt_filter_info*
-bnxt_match_ntuple_filter(struct bnxt_vnic_info *vnic,
+bnxt_match_ntuple_filter(struct bnxt *bp,
                         struct bnxt_filter_info *bfilter)
 {
        struct bnxt_filter_info *mfilter = NULL;
+       int i;
 
-       STAILQ_FOREACH(mfilter, &vnic->filter, next) {
-               if (bfilter->src_ipaddr[0] == mfilter->src_ipaddr[0] &&
-                   bfilter->src_ipaddr_mask[0] ==
-                   mfilter->src_ipaddr_mask[0] &&
-                   bfilter->src_port == mfilter->src_port &&
-                   bfilter->src_port_mask == mfilter->src_port_mask &&
-                   bfilter->dst_ipaddr[0] == mfilter->dst_ipaddr[0] &&
-                   bfilter->dst_ipaddr_mask[0] ==
-                   mfilter->dst_ipaddr_mask[0] &&
-                   bfilter->dst_port == mfilter->dst_port &&
-                   bfilter->dst_port_mask == mfilter->dst_port_mask &&
-                   bfilter->flags == mfilter->flags &&
-                   bfilter->enables == mfilter->enables)
-                       return mfilter;
+       for (i = bp->nr_vnics - 1; i >= 0; i--) {
+               struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
+               STAILQ_FOREACH(mfilter, &vnic->filter, next) {
+                       if (bfilter->src_ipaddr[0] == mfilter->src_ipaddr[0] &&
+                           bfilter->src_ipaddr_mask[0] ==
+                           mfilter->src_ipaddr_mask[0] &&
+                           bfilter->src_port == mfilter->src_port &&
+                           bfilter->src_port_mask == mfilter->src_port_mask &&
+                           bfilter->dst_ipaddr[0] == mfilter->dst_ipaddr[0] &&
+                           bfilter->dst_ipaddr_mask[0] ==
+                           mfilter->dst_ipaddr_mask[0] &&
+                           bfilter->dst_port == mfilter->dst_port &&
+                           bfilter->dst_port_mask == mfilter->dst_port_mask &&
+                           bfilter->flags == mfilter->flags &&
+                           bfilter->enables == mfilter->enables)
+                               return mfilter;
+               }
        }
        return NULL;
 }
@@ -2019,7 +2027,7 @@ bnxt_cfg_ntuple_filter(struct bnxt *bp,
        bfilter->ethertype = 0x800;
        bfilter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE;
 
-       mfilter = bnxt_match_ntuple_filter(vnic, bfilter);
+       mfilter = bnxt_match_ntuple_filter(bp, bfilter);
 
        if (mfilter != NULL && filter_op == RTE_ETH_FILTER_ADD) {
                RTE_LOG(ERR, PMD, "filter exists.");
@@ -2403,6 +2411,7 @@ bnxt_fdir_filter(struct rte_eth_dev *dev,
                ret = bnxt_parse_fdir_filter(bp, fdir, filter);
                if (ret != 0)
                        goto free_filter;
+               filter->filter_type = HWRM_CFA_NTUPLE_FILTER;
 
                match = bnxt_match_fdir(bp, filter);
                if (match != NULL && filter_op == RTE_ETH_FILTER_ADD) {
@@ -2423,7 +2432,6 @@ bnxt_fdir_filter(struct rte_eth_dev *dev,
                        STAILQ_FIRST(&bp->ff_pool[fdir->action.rx_queue]);
 
                if (filter_op == RTE_ETH_FILTER_ADD) {
-                       filter->filter_type = HWRM_CFA_NTUPLE_FILTER;
                        ret = bnxt_hwrm_set_ntuple_filter(bp,
                                                          filter->dst_id,
                                                          filter);
@@ -2792,7 +2800,7 @@ bnxt_dev_init(struct rte_eth_dev *eth_dev)
        const struct rte_memzone *mz = NULL;
        static int version_printed;
        uint32_t total_alloc_len;
-       phys_addr_t mz_phys_addr;
+       rte_iova_t mz_phys_addr;
        struct bnxt *bp;
        int rc;
 
@@ -2843,13 +2851,13 @@ skip_init:
                                return -ENOMEM;
                }
                memset(mz->addr, 0, mz->len);
-               mz_phys_addr = mz->phys_addr;
+               mz_phys_addr = mz->iova;
                if ((unsigned long)mz->addr == mz_phys_addr) {
                        RTE_LOG(WARNING, PMD,
                                "Memzone physical address same as virtual.\n");
                        RTE_LOG(WARNING, PMD,
-                               "Using rte_mem_virt2phy()\n");
-                       mz_phys_addr = rte_mem_virt2phy(mz->addr);
+                               "Using rte_mem_virt2iova()\n");
+                       mz_phys_addr = rte_mem_virt2iova(mz->addr);
                        if (mz_phys_addr == 0) {
                                RTE_LOG(ERR, PMD,
                                "unable to map address to physical memory\n");
@@ -2878,13 +2886,13 @@ skip_init:
                                return -ENOMEM;
                }
                memset(mz->addr, 0, mz->len);
-               mz_phys_addr = mz->phys_addr;
+               mz_phys_addr = mz->iova;
                if ((unsigned long)mz->addr == mz_phys_addr) {
                        RTE_LOG(WARNING, PMD,
                                "Memzone physical address same as virtual.\n");
                        RTE_LOG(WARNING, PMD,
-                               "Using rte_mem_virt2phy()\n");
-                       mz_phys_addr = rte_mem_virt2phy(mz->addr);
+                               "Using rte_mem_virt2iova()\n");
+                       mz_phys_addr = rte_mem_virt2iova(mz->addr);
                        if (mz_phys_addr == 0) {
                                RTE_LOG(ERR, PMD,
                                "unable to map address to physical memory\n");
@@ -2967,6 +2975,8 @@ skip_init:
        ALLOW_FUNC(HWRM_VNIC_RSS_COS_LB_CTX_FREE);
        ALLOW_FUNC(HWRM_CFA_L2_FILTER_FREE);
        ALLOW_FUNC(HWRM_STAT_CTX_FREE);
+       ALLOW_FUNC(HWRM_PORT_PHY_QCFG);
+       ALLOW_FUNC(HWRM_VNIC_TPA_CFG);
        rc = bnxt_hwrm_func_driver_register(bp);
        if (rc) {
                RTE_LOG(ERR, PMD,