1313ac35aSVenkat Duvvuru /* SPDX-License-Identifier: BSD-3-Clause 2e6e8f03eSRandy Schacher * Copyright(c) 2014-2023 Broadcom 3313ac35aSVenkat Duvvuru * All rights reserved. 4313ac35aSVenkat Duvvuru */ 5313ac35aSVenkat Duvvuru 6313ac35aSVenkat Duvvuru #include <rte_common.h> 7313ac35aSVenkat Duvvuru #include <rte_malloc.h> 8313ac35aSVenkat Duvvuru #include <rte_log.h> 9ae905028SMike Baucom #include "bnxt.h" 10313ac35aSVenkat Duvvuru #include "bnxt_ulp.h" 11*0c036a14SPeter Spreadborough #include "bnxt_ulp_utils.h" 12313ac35aSVenkat Duvvuru #include "tf_ext_flow_handle.h" 13313ac35aSVenkat Duvvuru #include "ulp_mark_mgr.h" 14313ac35aSVenkat Duvvuru #include "bnxt_tf_common.h" 158ce17d56SKishore Padmanabha #include "ulp_template_db_enum.h" 16313ac35aSVenkat Duvvuru #include "ulp_template_struct.h" 17313ac35aSVenkat Duvvuru 188a32d5c4SKishore Padmanabha #define ULP_MARK_DB_ENTRY_SET_VALID(mark_info) ((mark_info)->flags |=\ 198a32d5c4SKishore Padmanabha BNXT_ULP_MARK_VALID) 208a32d5c4SKishore Padmanabha #define ULP_MARK_DB_ENTRY_IS_INVALID(mark_info) (!((mark_info)->flags &\ 218a32d5c4SKishore Padmanabha BNXT_ULP_MARK_VALID)) 22bac18ea2SVenkat Duvvuru #define ULP_MARK_DB_ENTRY_SET_VFR_ID(mark_info) ((mark_info)->flags |=\ 23bac18ea2SVenkat Duvvuru BNXT_ULP_MARK_VFR_ID) 247e3a1670SKishore Padmanabha #define ULP_MARK_DB_ENTRY_IS_VFR_ID(mark_info) ((mark_info)->flags &\ 257e3a1670SKishore Padmanabha BNXT_ULP_MARK_VFR_ID) 268a32d5c4SKishore Padmanabha #define ULP_MARK_DB_ENTRY_IS_GLOBAL_HW_FID(mark_info) ((mark_info)->flags &\ 278a32d5c4SKishore Padmanabha BNXT_ULP_MARK_GLOBAL_HW_FID) 288a32d5c4SKishore Padmanabha 29ae905028SMike Baucom static inline uint32_t 30ae905028SMike Baucom ulp_mark_db_idx_get(bool is_gfid, uint32_t fid, struct bnxt_ulp_mark_tbl *mtbl) 31ae905028SMike Baucom { 32ae905028SMike Baucom uint32_t idx = 0, hashtype = 0; 33ae905028SMike Baucom 34ae905028SMike Baucom if (is_gfid) { 35ae905028SMike Baucom TF_GET_HASH_TYPE_FROM_GFID(fid, hashtype); 36ae905028SMike Baucom TF_GET_HASH_INDEX_FROM_GFID(fid, idx); 37ae905028SMike Baucom 38ae905028SMike Baucom /* Need to truncate anything beyond supported flows */ 39ae905028SMike Baucom idx &= mtbl->gfid_mask; 40ae905028SMike Baucom if (hashtype) 41ae905028SMike Baucom idx |= mtbl->gfid_type_bit; 42ae905028SMike Baucom } else { 43ae905028SMike Baucom idx = fid; 44ae905028SMike Baucom } 45ae905028SMike Baucom return idx; 46ae905028SMike Baucom } 47ae905028SMike Baucom 48313ac35aSVenkat Duvvuru /* 49313ac35aSVenkat Duvvuru * Allocate and Initialize all Mark Manager resources for this ulp context. 50313ac35aSVenkat Duvvuru * 51313ac35aSVenkat Duvvuru * ctxt [in] The ulp context for the mark manager. 52313ac35aSVenkat Duvvuru * 53313ac35aSVenkat Duvvuru */ 54313ac35aSVenkat Duvvuru int32_t 55313ac35aSVenkat Duvvuru ulp_mark_db_init(struct bnxt_ulp_context *ctxt) 56313ac35aSVenkat Duvvuru { 57313ac35aSVenkat Duvvuru struct bnxt_ulp_device_params *dparms; 58313ac35aSVenkat Duvvuru struct bnxt_ulp_mark_tbl *mark_tbl = NULL; 59313ac35aSVenkat Duvvuru uint32_t dev_id; 60313ac35aSVenkat Duvvuru 61313ac35aSVenkat Duvvuru if (!ctxt) { 62dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Invalid ULP CTXT\n"); 63313ac35aSVenkat Duvvuru return -EINVAL; 64313ac35aSVenkat Duvvuru } 65313ac35aSVenkat Duvvuru 66313ac35aSVenkat Duvvuru if (bnxt_ulp_cntxt_dev_id_get(ctxt, &dev_id)) { 67dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Failed to get device id\n"); 68313ac35aSVenkat Duvvuru return -EINVAL; 69313ac35aSVenkat Duvvuru } 70313ac35aSVenkat Duvvuru 71313ac35aSVenkat Duvvuru dparms = bnxt_ulp_device_params_get(dev_id); 72313ac35aSVenkat Duvvuru if (!dparms) { 73dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Failed to device parms\n"); 74313ac35aSVenkat Duvvuru return -EINVAL; 75313ac35aSVenkat Duvvuru } 76313ac35aSVenkat Duvvuru 773fe124d2SKishore Padmanabha if (!dparms->mark_db_lfid_entries || !dparms->mark_db_gfid_entries) { 78dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "mark Table is not allocated\n"); 793fe124d2SKishore Padmanabha bnxt_ulp_cntxt_ptr2_mark_db_set(ctxt, NULL); 803fe124d2SKishore Padmanabha return 0; 813fe124d2SKishore Padmanabha } 823fe124d2SKishore Padmanabha 83313ac35aSVenkat Duvvuru mark_tbl = rte_zmalloc("ulp_rx_mark_tbl_ptr", 84313ac35aSVenkat Duvvuru sizeof(struct bnxt_ulp_mark_tbl), 0); 85313ac35aSVenkat Duvvuru if (!mark_tbl) 86313ac35aSVenkat Duvvuru goto mem_error; 87313ac35aSVenkat Duvvuru 88313ac35aSVenkat Duvvuru /* Need to allocate 2 * Num flows to account for hash type bit.*/ 89cd01ecffSKishore Padmanabha mark_tbl->lfid_num_entries = dparms->mark_db_lfid_entries; 90313ac35aSVenkat Duvvuru mark_tbl->lfid_tbl = rte_zmalloc("ulp_rx_em_flow_mark_table", 918a32d5c4SKishore Padmanabha mark_tbl->lfid_num_entries * 92313ac35aSVenkat Duvvuru sizeof(struct bnxt_lfid_mark_info), 93313ac35aSVenkat Duvvuru 0); 94313ac35aSVenkat Duvvuru if (!mark_tbl->lfid_tbl) 95313ac35aSVenkat Duvvuru goto mem_error; 96313ac35aSVenkat Duvvuru 978a32d5c4SKishore Padmanabha /* Need to allocate 2 * Num flows to account for hash type bit */ 98cd01ecffSKishore Padmanabha mark_tbl->gfid_num_entries = dparms->mark_db_gfid_entries; 99bbc5f1a0SKishore Padmanabha if (!mark_tbl->gfid_num_entries) 100bbc5f1a0SKishore Padmanabha goto gfid_not_required; 101bbc5f1a0SKishore Padmanabha 102313ac35aSVenkat Duvvuru mark_tbl->gfid_tbl = rte_zmalloc("ulp_rx_eem_flow_mark_table", 1038a32d5c4SKishore Padmanabha mark_tbl->gfid_num_entries * 104313ac35aSVenkat Duvvuru sizeof(struct bnxt_gfid_mark_info), 105313ac35aSVenkat Duvvuru 0); 106313ac35aSVenkat Duvvuru if (!mark_tbl->gfid_tbl) 107313ac35aSVenkat Duvvuru goto mem_error; 108313ac35aSVenkat Duvvuru 109313ac35aSVenkat Duvvuru /* 110313ac35aSVenkat Duvvuru * These values are used to compress the FID to the allowable index 1118a32d5c4SKishore Padmanabha * space. The FID from hw may be the full hash which may be a big 1128a32d5c4SKishore Padmanabha * value to allocate and so allocate only needed hash values. 1138a32d5c4SKishore Padmanabha * gfid mask is the number of flow entries for the each left/right 1148a32d5c4SKishore Padmanabha * hash The gfid type bit is used to get to the higher or lower hash 1158a32d5c4SKishore Padmanabha * entries. 116313ac35aSVenkat Duvvuru */ 1178a32d5c4SKishore Padmanabha mark_tbl->gfid_mask = (mark_tbl->gfid_num_entries / 2) - 1; 1188a32d5c4SKishore Padmanabha mark_tbl->gfid_type_bit = (mark_tbl->gfid_num_entries / 2); 119313ac35aSVenkat Duvvuru 120dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "GFID Max = 0x%08x GFID MASK = 0x%08x\n", 1218a32d5c4SKishore Padmanabha mark_tbl->gfid_num_entries - 1, 122313ac35aSVenkat Duvvuru mark_tbl->gfid_mask); 123313ac35aSVenkat Duvvuru 124bbc5f1a0SKishore Padmanabha gfid_not_required: 12505a11d7dSMike Baucom /* Add the mark tbl to the ulp context. */ 126313ac35aSVenkat Duvvuru bnxt_ulp_cntxt_ptr2_mark_db_set(ctxt, mark_tbl); 127313ac35aSVenkat Duvvuru return 0; 128313ac35aSVenkat Duvvuru 129313ac35aSVenkat Duvvuru mem_error: 13029261167SKishore Padmanabha if (mark_tbl) { 131313ac35aSVenkat Duvvuru rte_free(mark_tbl->gfid_tbl); 132313ac35aSVenkat Duvvuru rte_free(mark_tbl->lfid_tbl); 133313ac35aSVenkat Duvvuru rte_free(mark_tbl); 13429261167SKishore Padmanabha } 135dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Failed to allocate memory for mark mgr\n"); 136313ac35aSVenkat Duvvuru return -ENOMEM; 137313ac35aSVenkat Duvvuru } 13870e64b27SVenkat Duvvuru 13970e64b27SVenkat Duvvuru /* 14070e64b27SVenkat Duvvuru * Release all resources in the Mark Manager for this ulp context 14170e64b27SVenkat Duvvuru * 14270e64b27SVenkat Duvvuru * ctxt [in] The ulp context for the mark manager 14370e64b27SVenkat Duvvuru * 14470e64b27SVenkat Duvvuru */ 14570e64b27SVenkat Duvvuru int32_t 14670e64b27SVenkat Duvvuru ulp_mark_db_deinit(struct bnxt_ulp_context *ctxt) 14770e64b27SVenkat Duvvuru { 14870e64b27SVenkat Duvvuru struct bnxt_ulp_mark_tbl *mtbl; 14970e64b27SVenkat Duvvuru 15070e64b27SVenkat Duvvuru mtbl = bnxt_ulp_cntxt_ptr2_mark_db_get(ctxt); 15170e64b27SVenkat Duvvuru 15270e64b27SVenkat Duvvuru if (mtbl) { 15370e64b27SVenkat Duvvuru rte_free(mtbl->gfid_tbl); 15470e64b27SVenkat Duvvuru rte_free(mtbl->lfid_tbl); 15570e64b27SVenkat Duvvuru rte_free(mtbl); 15670e64b27SVenkat Duvvuru 15770e64b27SVenkat Duvvuru /* Safe to ignore on deinit */ 15870e64b27SVenkat Duvvuru (void)bnxt_ulp_cntxt_ptr2_mark_db_set(ctxt, NULL); 15970e64b27SVenkat Duvvuru } 16070e64b27SVenkat Duvvuru 16170e64b27SVenkat Duvvuru return 0; 16270e64b27SVenkat Duvvuru } 163ae905028SMike Baucom 164ae905028SMike Baucom /* 165b87abb2eSVenkat Duvvuru * Get a Mark from the Mark Manager 166b87abb2eSVenkat Duvvuru * 167b87abb2eSVenkat Duvvuru * ctxt [in] The ulp context for the mark manager 168b87abb2eSVenkat Duvvuru * 169b87abb2eSVenkat Duvvuru * is_gfid [in] The type of fid (GFID or LFID) 170b87abb2eSVenkat Duvvuru * 171b87abb2eSVenkat Duvvuru * fid [in] The flow id that is returned by HW in BD 172b87abb2eSVenkat Duvvuru * 1737e3a1670SKishore Padmanabha * vfr_flag [out].it indicatesif mark is vfr_id or mark id 1747e3a1670SKishore Padmanabha * 175b87abb2eSVenkat Duvvuru * mark [out] The mark that is associated with the FID 176b87abb2eSVenkat Duvvuru * 177b87abb2eSVenkat Duvvuru */ 178b87abb2eSVenkat Duvvuru int32_t 179b87abb2eSVenkat Duvvuru ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt, 180b87abb2eSVenkat Duvvuru bool is_gfid, 181b87abb2eSVenkat Duvvuru uint32_t fid, 1827e3a1670SKishore Padmanabha uint32_t *vfr_flag, 183b87abb2eSVenkat Duvvuru uint32_t *mark) 184b87abb2eSVenkat Duvvuru { 185b87abb2eSVenkat Duvvuru struct bnxt_ulp_mark_tbl *mtbl; 186b87abb2eSVenkat Duvvuru uint32_t idx = 0; 187b87abb2eSVenkat Duvvuru 188b87abb2eSVenkat Duvvuru if (!ctxt || !mark) 189b87abb2eSVenkat Duvvuru return -EINVAL; 190b87abb2eSVenkat Duvvuru 191b87abb2eSVenkat Duvvuru mtbl = bnxt_ulp_cntxt_ptr2_mark_db_get(ctxt); 1923fe124d2SKishore Padmanabha if (!mtbl) 193b87abb2eSVenkat Duvvuru return -EINVAL; 194b87abb2eSVenkat Duvvuru 195b87abb2eSVenkat Duvvuru idx = ulp_mark_db_idx_get(is_gfid, fid, mtbl); 196b87abb2eSVenkat Duvvuru 197b87abb2eSVenkat Duvvuru if (is_gfid) { 1988a32d5c4SKishore Padmanabha if (idx >= mtbl->gfid_num_entries || 1998a32d5c4SKishore Padmanabha ULP_MARK_DB_ENTRY_IS_INVALID(&mtbl->gfid_tbl[idx])) 200b87abb2eSVenkat Duvvuru return -EINVAL; 201b87abb2eSVenkat Duvvuru 2027e3a1670SKishore Padmanabha *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->gfid_tbl[idx]); 203b87abb2eSVenkat Duvvuru *mark = mtbl->gfid_tbl[idx].mark_id; 204b87abb2eSVenkat Duvvuru } else { 2058a32d5c4SKishore Padmanabha if (idx >= mtbl->lfid_num_entries || 2068a32d5c4SKishore Padmanabha ULP_MARK_DB_ENTRY_IS_INVALID(&mtbl->lfid_tbl[idx])) 207b87abb2eSVenkat Duvvuru return -EINVAL; 208b87abb2eSVenkat Duvvuru 2097e3a1670SKishore Padmanabha *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->lfid_tbl[idx]); 210b87abb2eSVenkat Duvvuru *mark = mtbl->lfid_tbl[idx].mark_id; 211b87abb2eSVenkat Duvvuru } 212b87abb2eSVenkat Duvvuru 213b87abb2eSVenkat Duvvuru return 0; 214b87abb2eSVenkat Duvvuru } 215b87abb2eSVenkat Duvvuru 216b87abb2eSVenkat Duvvuru /* 217ae905028SMike Baucom * Adds a Mark to the Mark Manager 218ae905028SMike Baucom * 219ae905028SMike Baucom * ctxt [in] The ulp context for the mark manager 220ae905028SMike Baucom * 2218a32d5c4SKishore Padmanabha * mark_flag [in] mark flags. 222ae905028SMike Baucom * 223ae905028SMike Baucom * fid [in] The flow id that is returned by HW in BD 224ae905028SMike Baucom * 225ae905028SMike Baucom * mark [in] The mark to be associated with the FID 226ae905028SMike Baucom * 227ae905028SMike Baucom */ 228ae905028SMike Baucom int32_t 229ae905028SMike Baucom ulp_mark_db_mark_add(struct bnxt_ulp_context *ctxt, 2308a32d5c4SKishore Padmanabha uint32_t mark_flag, 2318a32d5c4SKishore Padmanabha uint32_t fid, 232ae905028SMike Baucom uint32_t mark) 233ae905028SMike Baucom { 2348a32d5c4SKishore Padmanabha struct bnxt_ulp_mark_tbl *mtbl; 2358a32d5c4SKishore Padmanabha uint32_t idx = 0; 2368a32d5c4SKishore Padmanabha bool is_gfid; 2378a32d5c4SKishore Padmanabha 2388a32d5c4SKishore Padmanabha if (!ctxt) { 239dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid ulp context\n"); 2408a32d5c4SKishore Padmanabha return -EINVAL; 2418a32d5c4SKishore Padmanabha } 2428a32d5c4SKishore Padmanabha 2438a32d5c4SKishore Padmanabha mtbl = bnxt_ulp_cntxt_ptr2_mark_db_get(ctxt); 2448a32d5c4SKishore Padmanabha if (!mtbl) { 245dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Unable to get Mark DB\n"); 2468a32d5c4SKishore Padmanabha return -EINVAL; 2478a32d5c4SKishore Padmanabha } 2488a32d5c4SKishore Padmanabha 2498a32d5c4SKishore Padmanabha is_gfid = (mark_flag & BNXT_ULP_MARK_GLOBAL_HW_FID); 2508a32d5c4SKishore Padmanabha if (is_gfid) { 2518a32d5c4SKishore Padmanabha idx = ulp_mark_db_idx_get(is_gfid, fid, mtbl); 2528a32d5c4SKishore Padmanabha if (idx >= mtbl->gfid_num_entries) { 253dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Mark index greater than allocated\n"); 2548a32d5c4SKishore Padmanabha return -EINVAL; 2558a32d5c4SKishore Padmanabha } 256dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Set GFID[0x%0x] = 0x%0x\n", idx, mark); 2578a32d5c4SKishore Padmanabha mtbl->gfid_tbl[idx].mark_id = mark; 2588a32d5c4SKishore Padmanabha ULP_MARK_DB_ENTRY_SET_VALID(&mtbl->gfid_tbl[idx]); 2598a32d5c4SKishore Padmanabha 2608a32d5c4SKishore Padmanabha } else { 2618a32d5c4SKishore Padmanabha /* For the LFID, the FID is used as the index */ 2628a32d5c4SKishore Padmanabha if (fid >= mtbl->lfid_num_entries) { 263dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Mark index greater than allocated\n"); 2648a32d5c4SKishore Padmanabha return -EINVAL; 2658a32d5c4SKishore Padmanabha } 266dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Set LFID[0x%0x] = 0x%0x\n", fid, mark); 2678a32d5c4SKishore Padmanabha mtbl->lfid_tbl[fid].mark_id = mark; 2688a32d5c4SKishore Padmanabha ULP_MARK_DB_ENTRY_SET_VALID(&mtbl->lfid_tbl[fid]); 269bac18ea2SVenkat Duvvuru 270bac18ea2SVenkat Duvvuru if (mark_flag & BNXT_ULP_MARK_VFR_ID) 271bac18ea2SVenkat Duvvuru ULP_MARK_DB_ENTRY_SET_VFR_ID(&mtbl->lfid_tbl[fid]); 2728a32d5c4SKishore Padmanabha } 2738a32d5c4SKishore Padmanabha 2748a32d5c4SKishore Padmanabha return 0; 275ae905028SMike Baucom } 27605a11d7dSMike Baucom 27705a11d7dSMike Baucom /* 27805a11d7dSMike Baucom * Removes a Mark from the Mark Manager 27905a11d7dSMike Baucom * 28005a11d7dSMike Baucom * ctxt [in] The ulp context for the mark manager 28105a11d7dSMike Baucom * 2828a32d5c4SKishore Padmanabha * mark_flag [in] mark flags. 28305a11d7dSMike Baucom * 28405a11d7dSMike Baucom * fid [in] The flow id that is returned by HW in BD 28505a11d7dSMike Baucom * 28605a11d7dSMike Baucom */ 28705a11d7dSMike Baucom int32_t 28805a11d7dSMike Baucom ulp_mark_db_mark_del(struct bnxt_ulp_context *ctxt, 2898a32d5c4SKishore Padmanabha uint32_t mark_flag, 2908a32d5c4SKishore Padmanabha uint32_t fid) 29105a11d7dSMike Baucom { 2928a32d5c4SKishore Padmanabha struct bnxt_ulp_mark_tbl *mtbl; 2938a32d5c4SKishore Padmanabha uint32_t idx = 0; 2948a32d5c4SKishore Padmanabha bool is_gfid; 2958a32d5c4SKishore Padmanabha 2968a32d5c4SKishore Padmanabha if (!ctxt) { 297dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Invalid ulp context\n"); 2988a32d5c4SKishore Padmanabha return -EINVAL; 2998a32d5c4SKishore Padmanabha } 3008a32d5c4SKishore Padmanabha 3018a32d5c4SKishore Padmanabha mtbl = bnxt_ulp_cntxt_ptr2_mark_db_get(ctxt); 3028a32d5c4SKishore Padmanabha if (!mtbl) { 303dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, "Unable to get Mark DB\n"); 3048a32d5c4SKishore Padmanabha return -EINVAL; 3058a32d5c4SKishore Padmanabha } 3068a32d5c4SKishore Padmanabha 3078a32d5c4SKishore Padmanabha is_gfid = (mark_flag & BNXT_ULP_MARK_GLOBAL_HW_FID); 3088a32d5c4SKishore Padmanabha if (is_gfid) { 3098a32d5c4SKishore Padmanabha idx = ulp_mark_db_idx_get(is_gfid, fid, mtbl); 3108a32d5c4SKishore Padmanabha if (idx >= mtbl->gfid_num_entries) { 311dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, 312dd0191d5SShuanglin Wang "Mark index greater than allocated\n"); 3138a32d5c4SKishore Padmanabha return -EINVAL; 3148a32d5c4SKishore Padmanabha } 315dd0191d5SShuanglin Wang BNXT_DRV_DBG(DEBUG, "Reset GFID[0x%0x]\n", idx); 3168a32d5c4SKishore Padmanabha memset(&mtbl->gfid_tbl[idx], 0, 3178a32d5c4SKishore Padmanabha sizeof(struct bnxt_gfid_mark_info)); 3188a32d5c4SKishore Padmanabha 3198a32d5c4SKishore Padmanabha } else { 3208a32d5c4SKishore Padmanabha /* For the LFID, the FID is used as the index */ 3218a32d5c4SKishore Padmanabha if (fid >= mtbl->lfid_num_entries) { 322dd0191d5SShuanglin Wang BNXT_DRV_DBG(ERR, 323dd0191d5SShuanglin Wang "Mark index greater than allocated\n"); 3248a32d5c4SKishore Padmanabha return -EINVAL; 3258a32d5c4SKishore Padmanabha } 3268a32d5c4SKishore Padmanabha memset(&mtbl->lfid_tbl[fid], 0, 3278a32d5c4SKishore Padmanabha sizeof(struct bnxt_lfid_mark_info)); 3288a32d5c4SKishore Padmanabha } 3298a32d5c4SKishore Padmanabha 3308a32d5c4SKishore Padmanabha return 0; 33105a11d7dSMike Baucom } 332