net/bnxt: support Thor template
[dpdk.git] / drivers / net / bnxt / tf_ulp / ulp_mark_mgr.c
index b3527ec..271520e 100644 (file)
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2014-2020 Broadcom
+ * Copyright(c) 2014-2021 Broadcom
  * All rights reserved.
  */
 
@@ -18,6 +18,8 @@
                                                BNXT_ULP_MARK_VALID)
 #define ULP_MARK_DB_ENTRY_IS_INVALID(mark_info) (!((mark_info)->flags &\
                                                   BNXT_ULP_MARK_VALID))
+#define ULP_MARK_DB_ENTRY_SET_VFR_ID(mark_info) ((mark_info)->flags |=\
+                                                BNXT_ULP_MARK_VFR_ID)
 #define ULP_MARK_DB_ENTRY_IS_VFR_ID(mark_info) ((mark_info)->flags &\
                                                BNXT_ULP_MARK_VFR_ID)
 #define ULP_MARK_DB_ENTRY_IS_GLOBAL_HW_FID(mark_info) ((mark_info)->flags &\
@@ -71,6 +73,12 @@ ulp_mark_db_init(struct bnxt_ulp_context *ctxt)
                return -EINVAL;
        }
 
+       if (!dparms->mark_db_lfid_entries || !dparms->mark_db_gfid_entries) {
+               BNXT_TF_DBG(DEBUG, "mark Table is not allocated\n");
+               bnxt_ulp_cntxt_ptr2_mark_db_set(ctxt, NULL);
+               return 0;
+       }
+
        mark_tbl = rte_zmalloc("ulp_rx_mark_tbl_ptr",
                               sizeof(struct bnxt_ulp_mark_tbl), 0);
        if (!mark_tbl)
@@ -118,9 +126,11 @@ gfid_not_required:
        return 0;
 
 mem_error:
-       rte_free(mark_tbl->gfid_tbl);
-       rte_free(mark_tbl->lfid_tbl);
-       rte_free(mark_tbl);
+       if (mark_tbl) {
+               rte_free(mark_tbl->gfid_tbl);
+               rte_free(mark_tbl->lfid_tbl);
+               rte_free(mark_tbl);
+       }
        BNXT_TF_DBG(DEBUG, "Failed to allocate memory for mark mgr\n");
        return -ENOMEM;
 }
@@ -178,10 +188,8 @@ ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
                return -EINVAL;
 
        mtbl = bnxt_ulp_cntxt_ptr2_mark_db_get(ctxt);
-       if (!mtbl) {
-               BNXT_TF_DBG(ERR, "Unable to get Mark Table\n");
+       if (!mtbl)
                return -EINVAL;
-       }
 
        idx = ulp_mark_db_idx_get(is_gfid, fid, mtbl);
 
@@ -190,9 +198,6 @@ ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
                    ULP_MARK_DB_ENTRY_IS_INVALID(&mtbl->gfid_tbl[idx]))
                        return -EINVAL;
 
-               BNXT_TF_DBG(DEBUG, "Get GFID[0x%0x] = 0x%0x\n",
-                           idx, mtbl->gfid_tbl[idx].mark_id);
-
                *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->gfid_tbl[idx]);
                *mark = mtbl->gfid_tbl[idx].mark_id;
        } else {
@@ -200,9 +205,6 @@ ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
                    ULP_MARK_DB_ENTRY_IS_INVALID(&mtbl->lfid_tbl[idx]))
                        return -EINVAL;
 
-               BNXT_TF_DBG(DEBUG, "Get LFID[0x%0x] = 0x%0x\n",
-                           idx, mtbl->lfid_tbl[idx].mark_id);
-
                *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->lfid_tbl[idx]);
                *mark = mtbl->lfid_tbl[idx].mark_id;
        }
@@ -263,6 +265,9 @@ ulp_mark_db_mark_add(struct bnxt_ulp_context *ctxt,
                BNXT_TF_DBG(DEBUG, "Set LFID[0x%0x] = 0x%0x\n", fid, mark);
                mtbl->lfid_tbl[fid].mark_id = mark;
                ULP_MARK_DB_ENTRY_SET_VALID(&mtbl->lfid_tbl[fid]);
+
+               if (mark_flag & BNXT_ULP_MARK_VFR_ID)
+                       ULP_MARK_DB_ENTRY_SET_VFR_ID(&mtbl->lfid_tbl[fid]);
        }
 
        return 0;