xref: /dpdk/drivers/net/bnxt/tf_ulp/ulp_mark_mgr.c (revision 0c036a1485b9d9163a8fa8059ed5272d060c05e0)
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