net/bnxt: get rid of ff pools and use VNIC info array
[dpdk.git] / drivers / net / bnxt / bnxt_flow.c
index a491e9d..1afe674 100644 (file)
@@ -678,7 +678,7 @@ bnxt_get_l2_filter(struct bnxt *bp, struct bnxt_filter_info *nf,
        struct bnxt_vnic_info *vnic0;
        int rc;
 
-       vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
+       vnic0 = &bp->vnic_info[0];
        f0 = STAILQ_FIRST(&vnic0->filter);
 
        /* This flow has same DST MAC as the port/l2 filter. */
@@ -763,8 +763,8 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,
                }
                PMD_DRV_LOG(DEBUG, "Queue index %d\n", act_q->index);
 
-               vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
-               vnic = STAILQ_FIRST(&bp->ff_pool[act_q->index]);
+               vnic0 = &bp->vnic_info[0];
+               vnic =  &bp->vnic_info[act_q->index];
                if (vnic == NULL) {
                        rte_flow_error_set(error,
                                           EINVAL,
@@ -786,7 +786,7 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,
                PMD_DRV_LOG(DEBUG, "VNIC found\n");
                break;
        case RTE_FLOW_ACTION_TYPE_DROP:
-               vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
+               vnic0 = &bp->vnic_info[0];
                filter1 = bnxt_get_l2_filter(bp, filter, vnic0);
                if (filter1 == NULL) {
                        rc = -ENOSPC;
@@ -802,7 +802,7 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,
                                HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_DROP;
                break;
        case RTE_FLOW_ACTION_TYPE_COUNT:
-               vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
+               vnic0 = &bp->vnic_info[0];
                filter1 = bnxt_get_l2_filter(bp, filter, vnic0);
                if (filter1 == NULL) {
                        rc = -ENOSPC;
@@ -854,7 +854,7 @@ bnxt_validate_and_parse_flow(struct rte_eth_dev *dev,
                filter->mirror_vnic_id = dflt_vnic;
                filter->enables |= NTUPLE_FLTR_ALLOC_INPUT_EN_MIRROR_VNIC_ID;
 
-               vnic0 = STAILQ_FIRST(&bp->ff_pool[0]);
+               vnic0 = &bp->vnic_info[0];
                filter1 = bnxt_get_l2_filter(bp, filter, vnic0);
                if (filter1 == NULL) {
                        rc = -ENOSPC;
@@ -968,9 +968,13 @@ bnxt_match_filter(struct bnxt *bp, struct bnxt_filter_info *nf)
                                    sizeof(nf->dst_ipaddr_mask))) {
                                if (mf->dst_id == nf->dst_id)
                                        return -EEXIST;
-                               /* Same Flow, Different queue
+                               /*
+                                * Same Flow, Different queue
                                 * Clear the old ntuple filter
+                                * Reuse the matching L2 filter
+                                * ID for the new filter
                                 */
+                               nf->fw_l2_filter_id = mf->fw_l2_filter_id;
                                if (nf->filter_type == HWRM_CFA_EM_FILTER)
                                        bnxt_hwrm_clear_em_filter(bp, mf);
                                if (nf->filter_type == HWRM_CFA_NTUPLE_FILTER)