net/bnxt: check filter type before clearing it
authorAjit Khaparde <ajit.khaparde@broadcom.com>
Thu, 28 Jun 2018 20:15:42 +0000 (13:15 -0700)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 2 Jul 2018 23:35:58 +0000 (01:35 +0200)
In bnxt_free_filter_mem(), check the filter type and call the
appropriate HWRM command to clear the filter from HW.

Fixes: 5ef3b79fdfe6 ("net/bnxt: support flow filter ops")
Cc: stable@dpdk.org
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt_filter.c

index 31757d3..1038941 100644 (file)
@@ -117,16 +117,29 @@ void bnxt_free_filter_mem(struct bnxt *bp)
        max_filters = bp->max_l2_ctx;
        for (i = 0; i < max_filters; i++) {
                filter = &bp->filter_info[i];
-               if (filter->fw_l2_filter_id != ((uint64_t)-1)) {
-                       PMD_DRV_LOG(ERR, "HWRM filter is not freed??\n");
+               if (filter->fw_l2_filter_id != ((uint64_t)-1) &&
+                   filter->filter_type == HWRM_CFA_L2_FILTER) {
+                       PMD_DRV_LOG(ERR, "L2 filter is not free\n");
                        /* Call HWRM to try to free filter again */
                        rc = bnxt_hwrm_clear_l2_filter(bp, filter);
                        if (rc)
                                PMD_DRV_LOG(ERR,
-                                      "HWRM filter cannot be freed rc = %d\n",
-                                       rc);
+                                           "Cannot free L2 filter: %d\n",
+                                           rc);
                }
                filter->fw_l2_filter_id = UINT64_MAX;
+
+               if (filter->fw_ntuple_filter_id != ((uint64_t)-1) &&
+                   filter->filter_type == HWRM_CFA_NTUPLE_FILTER) {
+                       PMD_DRV_LOG(ERR, "NTUPLE filter is not free\n");
+                       /* Call HWRM to try to free filter again */
+                       rc = bnxt_hwrm_clear_ntuple_filter(bp, filter);
+                       if (rc)
+                               PMD_DRV_LOG(ERR,
+                                           "Cannot free NTUPLE filter: %d\n",
+                                           rc);
+               }
+               filter->fw_ntuple_filter_id = UINT64_MAX;
        }
        STAILQ_INIT(&bp->free_filter_list);