xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/li/dp_li_tx.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name #include "cdp_txrx_cmn_struct.h"
20*5113495bSYour Name #include "dp_types.h"
21*5113495bSYour Name #include "dp_tx.h"
22*5113495bSYour Name #include "dp_li_tx.h"
23*5113495bSYour Name #include "dp_tx_desc.h"
24*5113495bSYour Name #include <dp_internal.h>
25*5113495bSYour Name #include <dp_htt.h>
26*5113495bSYour Name #include <hal_li_api.h>
27*5113495bSYour Name #include <hal_li_tx.h>
28*5113495bSYour Name #include "dp_peer.h"
29*5113495bSYour Name #ifdef FEATURE_WDS
30*5113495bSYour Name #include "dp_txrx_wds.h"
31*5113495bSYour Name #endif
32*5113495bSYour Name #include "dp_li.h"
33*5113495bSYour Name 
34*5113495bSYour Name extern uint8_t sec_type_map[MAX_CDP_SEC_TYPE];
35*5113495bSYour Name 
36*5113495bSYour Name QDF_STATUS
dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc * soc,void * tx_comp_hal_desc,struct dp_tx_desc_s ** r_tx_desc)37*5113495bSYour Name dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc *soc,
38*5113495bSYour Name 				       void *tx_comp_hal_desc,
39*5113495bSYour Name 				       struct dp_tx_desc_s **r_tx_desc)
40*5113495bSYour Name {
41*5113495bSYour Name 	uint8_t pool_id;
42*5113495bSYour Name 	uint32_t tx_desc_id;
43*5113495bSYour Name 
44*5113495bSYour Name 	tx_desc_id = hal_tx_comp_get_desc_id(tx_comp_hal_desc);
45*5113495bSYour Name 	pool_id = (tx_desc_id & DP_TX_DESC_ID_POOL_MASK) >>
46*5113495bSYour Name 			DP_TX_DESC_ID_POOL_OS;
47*5113495bSYour Name 
48*5113495bSYour Name 	/* Find Tx descriptor */
49*5113495bSYour Name 	*r_tx_desc = dp_tx_desc_find(soc, pool_id,
50*5113495bSYour Name 				     (tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
51*5113495bSYour Name 							DP_TX_DESC_ID_PAGE_OS,
52*5113495bSYour Name 				     (tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
53*5113495bSYour Name 						DP_TX_DESC_ID_OFFSET_OS,
54*5113495bSYour Name 				     (tx_desc_id & DP_TX_DESC_ID_SPCL_MASK));
55*5113495bSYour Name 	/* Pool id is not matching. Error */
56*5113495bSYour Name 	if ((*r_tx_desc)->pool_id != pool_id) {
57*5113495bSYour Name 		dp_tx_comp_alert("Tx Comp pool id %d not matched %d",
58*5113495bSYour Name 				 pool_id, (*r_tx_desc)->pool_id);
59*5113495bSYour Name 
60*5113495bSYour Name 		qdf_assert_always(0);
61*5113495bSYour Name 	}
62*5113495bSYour Name 
63*5113495bSYour Name 	(*r_tx_desc)->peer_id = hal_tx_comp_get_peer_id(tx_comp_hal_desc);
64*5113495bSYour Name 
65*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
66*5113495bSYour Name }
67*5113495bSYour Name 
68*5113495bSYour Name static inline
dp_tx_process_mec_notify_li(struct dp_soc * soc,uint8_t * status)69*5113495bSYour Name void dp_tx_process_mec_notify_li(struct dp_soc *soc, uint8_t *status)
70*5113495bSYour Name {
71*5113495bSYour Name 	struct dp_vdev *vdev;
72*5113495bSYour Name 	uint8_t vdev_id;
73*5113495bSYour Name 	uint32_t *htt_desc = (uint32_t *)status;
74*5113495bSYour Name 
75*5113495bSYour Name 	/*
76*5113495bSYour Name 	 * Get vdev id from HTT status word in case of MEC
77*5113495bSYour Name 	 * notification
78*5113495bSYour Name 	 */
79*5113495bSYour Name 	vdev_id = HTT_TX_WBM_COMPLETION_V2_VDEV_ID_GET(htt_desc[3]);
80*5113495bSYour Name 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
81*5113495bSYour Name 		return;
82*5113495bSYour Name 
83*5113495bSYour Name 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
84*5113495bSYour Name 				     DP_MOD_ID_HTT_COMP);
85*5113495bSYour Name 	if (!vdev)
86*5113495bSYour Name 		return;
87*5113495bSYour Name 	dp_tx_mec_handler(vdev, status);
88*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT_COMP);
89*5113495bSYour Name }
90*5113495bSYour Name 
dp_tx_process_htt_completion_li(struct dp_soc * soc,struct dp_tx_desc_s * tx_desc,uint8_t * status,uint8_t ring_id)91*5113495bSYour Name void dp_tx_process_htt_completion_li(struct dp_soc *soc,
92*5113495bSYour Name 				     struct dp_tx_desc_s *tx_desc,
93*5113495bSYour Name 				     uint8_t *status,
94*5113495bSYour Name 				     uint8_t ring_id)
95*5113495bSYour Name {
96*5113495bSYour Name 	uint8_t tx_status;
97*5113495bSYour Name 	struct dp_pdev *pdev;
98*5113495bSYour Name 	struct dp_vdev *vdev = NULL;
99*5113495bSYour Name 	struct hal_tx_completion_status ts = {0};
100*5113495bSYour Name 	uint32_t *htt_desc = (uint32_t *)status;
101*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
102*5113495bSYour Name 	dp_txrx_ref_handle txrx_ref_handle = NULL;
103*5113495bSYour Name 	struct cdp_tid_tx_stats *tid_stats = NULL;
104*5113495bSYour Name 	struct htt_soc *htt_handle;
105*5113495bSYour Name 	uint8_t vdev_id;
106*5113495bSYour Name 
107*5113495bSYour Name 	tx_status = HTT_TX_WBM_COMPLETION_V2_TX_STATUS_GET(htt_desc[0]);
108*5113495bSYour Name 	htt_handle = (struct htt_soc *)soc->htt_handle;
109*5113495bSYour Name 	htt_wbm_event_record(htt_handle->htt_logger_handle, tx_status, status);
110*5113495bSYour Name 
111*5113495bSYour Name 	/*
112*5113495bSYour Name 	 * There can be scenario where WBM consuming descriptor enqueued
113*5113495bSYour Name 	 * from TQM2WBM first and TQM completion can happen before MEC
114*5113495bSYour Name 	 * notification comes from FW2WBM. Avoid access any field of tx
115*5113495bSYour Name 	 * descriptor in case of MEC notify.
116*5113495bSYour Name 	 */
117*5113495bSYour Name 	if (tx_status == HTT_TX_FW2WBM_TX_STATUS_MEC_NOTIFY)
118*5113495bSYour Name 		return dp_tx_process_mec_notify_li(soc, status);
119*5113495bSYour Name 
120*5113495bSYour Name 	/*
121*5113495bSYour Name 	 * If the descriptor is already freed in vdev_detach,
122*5113495bSYour Name 	 * continue to next descriptor
123*5113495bSYour Name 	 */
124*5113495bSYour Name 	if (qdf_unlikely(!tx_desc->flags)) {
125*5113495bSYour Name 		dp_tx_comp_info_rl("Descriptor freed in vdev_detach %d",
126*5113495bSYour Name 				   tx_desc->id);
127*5113495bSYour Name 		return;
128*5113495bSYour Name 	}
129*5113495bSYour Name 
130*5113495bSYour Name 	if (qdf_unlikely(tx_desc->vdev_id == DP_INVALID_VDEV_ID)) {
131*5113495bSYour Name 		dp_tx_comp_info_rl("Invalid vdev_id %d", tx_desc->id);
132*5113495bSYour Name 		tx_desc->flags |= DP_TX_DESC_FLAG_TX_COMP_ERR;
133*5113495bSYour Name 		goto release_tx_desc;
134*5113495bSYour Name 	}
135*5113495bSYour Name 
136*5113495bSYour Name 	pdev = tx_desc->pdev;
137*5113495bSYour Name 	if (qdf_unlikely(!pdev)) {
138*5113495bSYour Name 		dp_tx_comp_warn("The pdev in TX desc is NULL, dropped.");
139*5113495bSYour Name 		dp_tx_comp_warn("tx_status: %u", tx_status);
140*5113495bSYour Name 		tx_desc->flags |= DP_TX_DESC_FLAG_TX_COMP_ERR;
141*5113495bSYour Name 		goto release_tx_desc;
142*5113495bSYour Name 	}
143*5113495bSYour Name 
144*5113495bSYour Name 	if (qdf_unlikely(tx_desc->pdev->is_pdev_down)) {
145*5113495bSYour Name 		dp_tx_comp_info_rl("pdev in down state %d", tx_desc->id);
146*5113495bSYour Name 		tx_desc->flags |= DP_TX_DESC_FLAG_TX_COMP_ERR;
147*5113495bSYour Name 		goto release_tx_desc;
148*5113495bSYour Name 	}
149*5113495bSYour Name 
150*5113495bSYour Name 	qdf_assert(tx_desc->pdev);
151*5113495bSYour Name 
152*5113495bSYour Name 	vdev_id = tx_desc->vdev_id;
153*5113495bSYour Name 	vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
154*5113495bSYour Name 				     DP_MOD_ID_HTT_COMP);
155*5113495bSYour Name 
156*5113495bSYour Name 	if (qdf_unlikely(!vdev)) {
157*5113495bSYour Name 		dp_tx_comp_info_rl("Unable to get vdev ref  %d", tx_desc->id);
158*5113495bSYour Name 		tx_desc->flags |= DP_TX_DESC_FLAG_TX_COMP_ERR;
159*5113495bSYour Name 		goto release_tx_desc;
160*5113495bSYour Name 	}
161*5113495bSYour Name 
162*5113495bSYour Name 	switch (tx_status) {
163*5113495bSYour Name 	case HTT_TX_FW2WBM_TX_STATUS_OK:
164*5113495bSYour Name 	case HTT_TX_FW2WBM_TX_STATUS_DROP:
165*5113495bSYour Name 	case HTT_TX_FW2WBM_TX_STATUS_TTL:
166*5113495bSYour Name 	{
167*5113495bSYour Name 		uint8_t tid;
168*5113495bSYour Name 		uint8_t transmit_cnt_valid = 0;
169*5113495bSYour Name 
170*5113495bSYour Name 		if (HTT_TX_WBM_COMPLETION_V2_VALID_GET(htt_desc[2])) {
171*5113495bSYour Name 			ts.peer_id =
172*5113495bSYour Name 				HTT_TX_WBM_COMPLETION_V2_SW_PEER_ID_GET(
173*5113495bSYour Name 						htt_desc[2]);
174*5113495bSYour Name 			ts.tid =
175*5113495bSYour Name 				HTT_TX_WBM_COMPLETION_V2_TID_NUM_GET(
176*5113495bSYour Name 						htt_desc[2]);
177*5113495bSYour Name 		} else {
178*5113495bSYour Name 			ts.peer_id = HTT_INVALID_PEER;
179*5113495bSYour Name 			ts.tid = HTT_INVALID_TID;
180*5113495bSYour Name 		}
181*5113495bSYour Name 		ts.release_src = HAL_TX_COMP_RELEASE_SOURCE_FW;
182*5113495bSYour Name 		ts.ppdu_id =
183*5113495bSYour Name 			HTT_TX_WBM_COMPLETION_V2_SCH_CMD_ID_GET(
184*5113495bSYour Name 					htt_desc[1]);
185*5113495bSYour Name 		ts.ack_frame_rssi =
186*5113495bSYour Name 			HTT_TX_WBM_COMPLETION_V2_ACK_FRAME_RSSI_GET(
187*5113495bSYour Name 					htt_desc[1]);
188*5113495bSYour Name 		transmit_cnt_valid =
189*5113495bSYour Name 			HTT_TX_WBM_COMPLETION_V2_TRANSMIT_CNT_VALID_GET(
190*5113495bSYour Name 					htt_desc[2]);
191*5113495bSYour Name 		if (transmit_cnt_valid)
192*5113495bSYour Name 			ts.transmit_cnt =
193*5113495bSYour Name 				HTT_TX_WBM_COMPLETION_V2_TRANSMIT_COUNT_GET(
194*5113495bSYour Name 						htt_desc[0]);
195*5113495bSYour Name 
196*5113495bSYour Name 		ts.tsf = htt_desc[3];
197*5113495bSYour Name 		ts.first_msdu = 1;
198*5113495bSYour Name 		ts.last_msdu = 1;
199*5113495bSYour Name 		switch (tx_status) {
200*5113495bSYour Name 		case HTT_TX_FW2WBM_TX_STATUS_OK:
201*5113495bSYour Name 			ts.status = HAL_TX_TQM_RR_FRAME_ACKED;
202*5113495bSYour Name 			break;
203*5113495bSYour Name 		case HTT_TX_FW2WBM_TX_STATUS_DROP:
204*5113495bSYour Name 			ts.status = HAL_TX_TQM_RR_REM_CMD_REM;
205*5113495bSYour Name 			break;
206*5113495bSYour Name 		case HTT_TX_FW2WBM_TX_STATUS_TTL:
207*5113495bSYour Name 			ts.status = HAL_TX_TQM_RR_REM_CMD_TX;
208*5113495bSYour Name 			break;
209*5113495bSYour Name 		}
210*5113495bSYour Name 		tid = ts.tid;
211*5113495bSYour Name 		if (qdf_unlikely(tid >= CDP_MAX_DATA_TIDS))
212*5113495bSYour Name 			tid = CDP_MAX_DATA_TIDS - 1;
213*5113495bSYour Name 
214*5113495bSYour Name 		tid_stats = &pdev->stats.tid_stats.tid_tx_stats[ring_id][tid];
215*5113495bSYour Name 
216*5113495bSYour Name 		if (qdf_unlikely(pdev->delay_stats_flag) ||
217*5113495bSYour Name 		    qdf_unlikely(dp_is_vdev_tx_delay_stats_enabled(vdev)))
218*5113495bSYour Name 			dp_tx_compute_delay(vdev, tx_desc, tid, ring_id);
219*5113495bSYour Name 		if (tx_status < CDP_MAX_TX_HTT_STATUS)
220*5113495bSYour Name 			tid_stats->htt_status_cnt[tx_status]++;
221*5113495bSYour Name 
222*5113495bSYour Name 		txrx_peer = dp_txrx_peer_get_ref_by_id(soc, ts.peer_id,
223*5113495bSYour Name 						       &txrx_ref_handle,
224*5113495bSYour Name 						       DP_MOD_ID_HTT_COMP);
225*5113495bSYour Name 		if (qdf_likely(txrx_peer)) {
226*5113495bSYour Name 			DP_PEER_STATS_FLAT_INC_PKT(txrx_peer, comp_pkt, 1,
227*5113495bSYour Name 						   qdf_nbuf_len(tx_desc->nbuf));
228*5113495bSYour Name 			if (tx_status != HTT_TX_FW2WBM_TX_STATUS_OK)
229*5113495bSYour Name 				DP_PEER_STATS_FLAT_INC(txrx_peer, tx_failed, 1);
230*5113495bSYour Name 		}
231*5113495bSYour Name 
232*5113495bSYour Name 		dp_tx_comp_process_tx_status(soc, tx_desc, &ts, txrx_peer,
233*5113495bSYour Name 					     ring_id);
234*5113495bSYour Name 		dp_tx_comp_process_desc(soc, tx_desc, &ts, txrx_peer);
235*5113495bSYour Name 		dp_tx_desc_release(soc, tx_desc, tx_desc->pool_id);
236*5113495bSYour Name 
237*5113495bSYour Name 		if (qdf_likely(txrx_peer))
238*5113495bSYour Name 			dp_txrx_peer_unref_delete(txrx_ref_handle,
239*5113495bSYour Name 						  DP_MOD_ID_HTT_COMP);
240*5113495bSYour Name 
241*5113495bSYour Name 		break;
242*5113495bSYour Name 	}
243*5113495bSYour Name 	case HTT_TX_FW2WBM_TX_STATUS_REINJECT:
244*5113495bSYour Name 	{
245*5113495bSYour Name 		uint8_t reinject_reason;
246*5113495bSYour Name 
247*5113495bSYour Name 		reinject_reason =
248*5113495bSYour Name 			HTT_TX_WBM_COMPLETION_V2_REINJECT_REASON_GET(
249*5113495bSYour Name 								htt_desc[0]);
250*5113495bSYour Name 		dp_tx_reinject_handler(soc, vdev, tx_desc,
251*5113495bSYour Name 				       status, reinject_reason);
252*5113495bSYour Name 		break;
253*5113495bSYour Name 	}
254*5113495bSYour Name 	case HTT_TX_FW2WBM_TX_STATUS_INSPECT:
255*5113495bSYour Name 	{
256*5113495bSYour Name 		dp_tx_inspect_handler(soc, vdev, tx_desc, status);
257*5113495bSYour Name 		break;
258*5113495bSYour Name 	}
259*5113495bSYour Name 	case HTT_TX_FW2WBM_TX_STATUS_VDEVID_MISMATCH:
260*5113495bSYour Name 	{
261*5113495bSYour Name 		DP_STATS_INC(vdev,
262*5113495bSYour Name 			     tx_i[DP_XMIT_LINK].dropped.fail_per_pkt_vdev_id_check,
263*5113495bSYour Name 			     1);
264*5113495bSYour Name 		goto release_tx_desc;
265*5113495bSYour Name 	}
266*5113495bSYour Name 	default:
267*5113495bSYour Name 		dp_tx_comp_err("Invalid HTT tx_status %d\n",
268*5113495bSYour Name 			       tx_status);
269*5113495bSYour Name 		goto release_tx_desc;
270*5113495bSYour Name 	}
271*5113495bSYour Name 
272*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT_COMP);
273*5113495bSYour Name 	return;
274*5113495bSYour Name 
275*5113495bSYour Name release_tx_desc:
276*5113495bSYour Name 	dp_tx_comp_free_buf(soc, tx_desc, false);
277*5113495bSYour Name 	dp_tx_desc_release(soc, tx_desc, tx_desc->pool_id);
278*5113495bSYour Name 	if (vdev)
279*5113495bSYour Name 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT_COMP);
280*5113495bSYour Name }
281*5113495bSYour Name 
282*5113495bSYour Name #ifdef QCA_OL_TX_MULTIQ_SUPPORT
283*5113495bSYour Name /**
284*5113495bSYour Name  * dp_tx_get_rbm_id_li() - Get the RBM ID for data transmission completion.
285*5113495bSYour Name  * @soc: DP soc structure pointer
286*5113495bSYour Name  * @ring_id: Transmit Queue/ring_id to be used when XPS is enabled
287*5113495bSYour Name  *
288*5113495bSYour Name  * Return: HAL ring handle
289*5113495bSYour Name  */
290*5113495bSYour Name #ifdef IPA_OFFLOAD
dp_tx_get_rbm_id_li(struct dp_soc * soc,uint8_t ring_id)291*5113495bSYour Name static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
292*5113495bSYour Name 					  uint8_t ring_id)
293*5113495bSYour Name {
294*5113495bSYour Name 	return (ring_id + soc->wbm_sw0_bm_id);
295*5113495bSYour Name }
296*5113495bSYour Name #else
297*5113495bSYour Name #ifndef QCA_DP_ENABLE_TX_COMP_RING4
dp_tx_get_rbm_id_li(struct dp_soc * soc,uint8_t ring_id)298*5113495bSYour Name static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
299*5113495bSYour Name 					  uint8_t ring_id)
300*5113495bSYour Name {
301*5113495bSYour Name 	return (ring_id ? HAL_WBM_SW0_BM_ID + (ring_id - 1) :
302*5113495bSYour Name 		HAL_WBM_SW2_BM_ID);
303*5113495bSYour Name }
304*5113495bSYour Name #else
dp_tx_get_rbm_id_li(struct dp_soc * soc,uint8_t ring_id)305*5113495bSYour Name static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
306*5113495bSYour Name 					  uint8_t ring_id)
307*5113495bSYour Name {
308*5113495bSYour Name 	if (ring_id == soc->num_tcl_data_rings)
309*5113495bSYour Name 		return HAL_WBM_SW4_BM_ID(soc->wbm_sw0_bm_id);
310*5113495bSYour Name 	return (ring_id + HAL_WBM_SW0_BM_ID(soc->wbm_sw0_bm_id));
311*5113495bSYour Name }
312*5113495bSYour Name #endif
313*5113495bSYour Name #endif
314*5113495bSYour Name #else
315*5113495bSYour Name #ifdef TX_MULTI_TCL
316*5113495bSYour Name #ifdef IPA_OFFLOAD
dp_tx_get_rbm_id_li(struct dp_soc * soc,uint8_t ring_id)317*5113495bSYour Name static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
318*5113495bSYour Name 					  uint8_t ring_id)
319*5113495bSYour Name {
320*5113495bSYour Name 	if (soc->wlan_cfg_ctx->ipa_enabled)
321*5113495bSYour Name 		return (ring_id + soc->wbm_sw0_bm_id);
322*5113495bSYour Name 
323*5113495bSYour Name 	return soc->wlan_cfg_ctx->tcl_wbm_map_array[ring_id].wbm_rbm_id;
324*5113495bSYour Name }
325*5113495bSYour Name #else
dp_tx_get_rbm_id_li(struct dp_soc * soc,uint8_t ring_id)326*5113495bSYour Name static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
327*5113495bSYour Name 					  uint8_t ring_id)
328*5113495bSYour Name {
329*5113495bSYour Name 	return soc->wlan_cfg_ctx->tcl_wbm_map_array[ring_id].wbm_rbm_id;
330*5113495bSYour Name }
331*5113495bSYour Name #endif
332*5113495bSYour Name #else
dp_tx_get_rbm_id_li(struct dp_soc * soc,uint8_t ring_id)333*5113495bSYour Name static inline uint8_t dp_tx_get_rbm_id_li(struct dp_soc *soc,
334*5113495bSYour Name 					  uint8_t ring_id)
335*5113495bSYour Name {
336*5113495bSYour Name 	return (ring_id + soc->wbm_sw0_bm_id);
337*5113495bSYour Name }
338*5113495bSYour Name #endif
339*5113495bSYour Name #endif
340*5113495bSYour Name 
341*5113495bSYour Name #if defined(CLEAR_SW2TCL_CONSUMED_DESC)
342*5113495bSYour Name /**
343*5113495bSYour Name  * dp_tx_clear_consumed_hw_descs - Reset all the consumed Tx ring descs to 0
344*5113495bSYour Name  *
345*5113495bSYour Name  * @soc: DP soc handle
346*5113495bSYour Name  * @hal_ring_hdl: Source ring pointer
347*5113495bSYour Name  *
348*5113495bSYour Name  * Return: void
349*5113495bSYour Name  */
350*5113495bSYour Name static inline
dp_tx_clear_consumed_hw_descs(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)351*5113495bSYour Name void dp_tx_clear_consumed_hw_descs(struct dp_soc *soc,
352*5113495bSYour Name 				   hal_ring_handle_t hal_ring_hdl)
353*5113495bSYour Name {
354*5113495bSYour Name 	void *desc = hal_srng_src_get_next_consumed(soc->hal_soc, hal_ring_hdl);
355*5113495bSYour Name 
356*5113495bSYour Name 	while (desc) {
357*5113495bSYour Name 		hal_tx_desc_clear(desc);
358*5113495bSYour Name 		desc = hal_srng_src_get_next_consumed(soc->hal_soc,
359*5113495bSYour Name 						      hal_ring_hdl);
360*5113495bSYour Name 	}
361*5113495bSYour Name }
362*5113495bSYour Name 
363*5113495bSYour Name #else
364*5113495bSYour Name static inline
dp_tx_clear_consumed_hw_descs(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)365*5113495bSYour Name void dp_tx_clear_consumed_hw_descs(struct dp_soc *soc,
366*5113495bSYour Name 				   hal_ring_handle_t hal_ring_hdl)
367*5113495bSYour Name {
368*5113495bSYour Name }
369*5113495bSYour Name #endif /* CLEAR_SW2TCL_CONSUMED_DESC */
370*5113495bSYour Name 
371*5113495bSYour Name #ifdef WLAN_CONFIG_TX_DELAY
372*5113495bSYour Name static inline
dp_tx_compute_hw_delay_li(struct dp_soc * soc,struct dp_vdev * vdev,struct hal_tx_completion_status * ts,uint32_t * delay_us)373*5113495bSYour Name QDF_STATUS dp_tx_compute_hw_delay_li(struct dp_soc *soc,
374*5113495bSYour Name 				     struct dp_vdev *vdev,
375*5113495bSYour Name 				     struct hal_tx_completion_status *ts,
376*5113495bSYour Name 				     uint32_t *delay_us)
377*5113495bSYour Name {
378*5113495bSYour Name 	return dp_tx_compute_hw_delay_us(ts, vdev->delta_tsf, delay_us);
379*5113495bSYour Name }
380*5113495bSYour Name #else
381*5113495bSYour Name static inline
dp_tx_compute_hw_delay_li(struct dp_soc * soc,struct dp_vdev * vdev,struct hal_tx_completion_status * ts,uint32_t * delay_us)382*5113495bSYour Name QDF_STATUS dp_tx_compute_hw_delay_li(struct dp_soc *soc,
383*5113495bSYour Name 				     struct dp_vdev *vdev,
384*5113495bSYour Name 				     struct hal_tx_completion_status *ts,
385*5113495bSYour Name 				     uint32_t *delay_us)
386*5113495bSYour Name {
387*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
388*5113495bSYour Name }
389*5113495bSYour Name #endif
390*5113495bSYour Name 
391*5113495bSYour Name #ifdef CONFIG_SAWF
392*5113495bSYour Name /**
393*5113495bSYour Name  * dp_sawf_config_li - Configure sawf specific fields in tcl
394*5113495bSYour Name  *
395*5113495bSYour Name  * @soc: DP soc handle
396*5113495bSYour Name  * @hal_tx_desc_cached: tx descriptor
397*5113495bSYour Name  * @fw_metadata: firmware metadata
398*5113495bSYour Name  * @vdev_id: vdev id
399*5113495bSYour Name  * @nbuf: skb buffer
400*5113495bSYour Name  * @msdu_info: msdu info
401*5113495bSYour Name  *
402*5113495bSYour Name  * Return: void
403*5113495bSYour Name  */
404*5113495bSYour Name static inline
dp_sawf_config_li(struct dp_soc * soc,uint32_t * hal_tx_desc_cached,uint16_t * fw_metadata,uint16_t vdev_id,qdf_nbuf_t nbuf,struct dp_tx_msdu_info_s * msdu_info)405*5113495bSYour Name void dp_sawf_config_li(struct dp_soc *soc, uint32_t *hal_tx_desc_cached,
406*5113495bSYour Name 		       uint16_t *fw_metadata, uint16_t vdev_id,
407*5113495bSYour Name 		       qdf_nbuf_t nbuf, struct dp_tx_msdu_info_s *msdu_info)
408*5113495bSYour Name {
409*5113495bSYour Name 	uint8_t q_id = 0;
410*5113495bSYour Name 	uint32_t flow_idx = 0;
411*5113495bSYour Name 
412*5113495bSYour Name 	q_id = dp_sawf_queue_id_get(nbuf);
413*5113495bSYour Name 	if (q_id == DP_SAWF_DEFAULT_Q_INVALID)
414*5113495bSYour Name 		return;
415*5113495bSYour Name 
416*5113495bSYour Name 	msdu_info->tid = (q_id & (CDP_DATA_TID_MAX - 1));
417*5113495bSYour Name 	hal_tx_desc_set_hlos_tid(hal_tx_desc_cached,
418*5113495bSYour Name 				 (q_id & (CDP_DATA_TID_MAX - 1)));
419*5113495bSYour Name 
420*5113495bSYour Name 	if ((q_id >= DP_SAWF_DEFAULT_QUEUE_MIN) &&
421*5113495bSYour Name 	    (q_id < DP_SAWF_DEFAULT_QUEUE_MAX))
422*5113495bSYour Name 		return;
423*5113495bSYour Name 
424*5113495bSYour Name 	if (!wlan_cfg_get_sawf_config(soc->wlan_cfg_ctx))
425*5113495bSYour Name 		return;
426*5113495bSYour Name 
427*5113495bSYour Name 	dp_sawf_tcl_cmd(fw_metadata, nbuf);
428*5113495bSYour Name 
429*5113495bSYour Name 	/* For SAWF, q_id starts from DP_SAWF_Q_MAX */
430*5113495bSYour Name 	if (!dp_sawf_get_search_index(soc, nbuf, vdev_id,
431*5113495bSYour Name 				      q_id, &flow_idx))
432*5113495bSYour Name 		hal_tx_desc_set_to_fw(hal_tx_desc_cached, true);
433*5113495bSYour Name 
434*5113495bSYour Name 	hal_tx_desc_set_search_type_li(soc->hal_soc, hal_tx_desc_cached,
435*5113495bSYour Name 				       HAL_TX_ADDR_INDEX_SEARCH);
436*5113495bSYour Name 	hal_tx_desc_set_search_index_li(soc->hal_soc, hal_tx_desc_cached,
437*5113495bSYour Name 					flow_idx);
438*5113495bSYour Name }
439*5113495bSYour Name #else
440*5113495bSYour Name static inline
dp_sawf_config_li(struct dp_soc * soc,uint32_t * hal_tx_desc_cached,uint16_t * fw_metadata,uint16_t vdev_id,qdf_nbuf_t nbuf,struct dp_tx_msdu_info_s * msdu_info)441*5113495bSYour Name void dp_sawf_config_li(struct dp_soc *soc, uint32_t *hal_tx_desc_cached,
442*5113495bSYour Name 		       uint16_t *fw_metadata, uint16_t vdev_id,
443*5113495bSYour Name 		       qdf_nbuf_t nbuf, struct dp_tx_msdu_info_s *msdu_info)
444*5113495bSYour Name {
445*5113495bSYour Name }
446*5113495bSYour Name 
447*5113495bSYour Name #define dp_sawf_tx_enqueue_peer_stats(soc, tx_desc)
448*5113495bSYour Name #define dp_sawf_tx_enqueue_fail_peer_stats(soc, tx_desc)
449*5113495bSYour Name #endif
450*5113495bSYour Name 
451*5113495bSYour Name QDF_STATUS
dp_tx_hw_enqueue_li(struct dp_soc * soc,struct dp_vdev * vdev,struct dp_tx_desc_s * tx_desc,uint16_t fw_metadata,struct cdp_tx_exception_metadata * tx_exc_metadata,struct dp_tx_msdu_info_s * msdu_info)452*5113495bSYour Name dp_tx_hw_enqueue_li(struct dp_soc *soc, struct dp_vdev *vdev,
453*5113495bSYour Name 		    struct dp_tx_desc_s *tx_desc, uint16_t fw_metadata,
454*5113495bSYour Name 		    struct cdp_tx_exception_metadata *tx_exc_metadata,
455*5113495bSYour Name 		    struct dp_tx_msdu_info_s *msdu_info)
456*5113495bSYour Name {
457*5113495bSYour Name 	void *hal_tx_desc;
458*5113495bSYour Name 	uint32_t *hal_tx_desc_cached;
459*5113495bSYour Name 	int coalesce = 0;
460*5113495bSYour Name 	struct dp_tx_queue *tx_q = &msdu_info->tx_queue;
461*5113495bSYour Name 	uint8_t ring_id = tx_q->ring_id & DP_TX_QUEUE_MASK;
462*5113495bSYour Name 	uint8_t tid;
463*5113495bSYour Name 
464*5113495bSYour Name 	/*
465*5113495bSYour Name 	 * Setting it initialization statically here to avoid
466*5113495bSYour Name 	 * a memset call jump with qdf_mem_set call
467*5113495bSYour Name 	 */
468*5113495bSYour Name 	uint8_t cached_desc[HAL_TX_DESC_LEN_BYTES] = { 0 };
469*5113495bSYour Name 
470*5113495bSYour Name 	enum cdp_sec_type sec_type = ((tx_exc_metadata &&
471*5113495bSYour Name 			tx_exc_metadata->sec_type != CDP_INVALID_SEC_TYPE) ?
472*5113495bSYour Name 			tx_exc_metadata->sec_type : vdev->sec_type);
473*5113495bSYour Name 
474*5113495bSYour Name 	/* Return Buffer Manager ID */
475*5113495bSYour Name 	uint8_t bm_id = dp_tx_get_rbm_id_li(soc, ring_id);
476*5113495bSYour Name 
477*5113495bSYour Name 	hal_ring_handle_t hal_ring_hdl = NULL;
478*5113495bSYour Name 
479*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_RESOURCES;
480*5113495bSYour Name 
481*5113495bSYour Name 	if (!dp_tx_is_desc_id_valid(soc, tx_desc->id)) {
482*5113495bSYour Name 		dp_err_rl("Invalid tx desc id:%d", tx_desc->id);
483*5113495bSYour Name 		return QDF_STATUS_E_RESOURCES;
484*5113495bSYour Name 	}
485*5113495bSYour Name 
486*5113495bSYour Name 	hal_tx_desc_cached = (void *)cached_desc;
487*5113495bSYour Name 
488*5113495bSYour Name 	hal_tx_desc_set_buf_addr(soc->hal_soc, hal_tx_desc_cached,
489*5113495bSYour Name 				 tx_desc->dma_addr, bm_id, tx_desc->id,
490*5113495bSYour Name 				 (tx_desc->flags & DP_TX_DESC_FLAG_FRAG));
491*5113495bSYour Name 	hal_tx_desc_set_lmac_id_li(soc->hal_soc, hal_tx_desc_cached,
492*5113495bSYour Name 				   vdev->lmac_id);
493*5113495bSYour Name 	hal_tx_desc_set_search_type_li(soc->hal_soc, hal_tx_desc_cached,
494*5113495bSYour Name 				       vdev->search_type);
495*5113495bSYour Name 	hal_tx_desc_set_search_index_li(soc->hal_soc, hal_tx_desc_cached,
496*5113495bSYour Name 					vdev->bss_ast_idx);
497*5113495bSYour Name 	hal_tx_desc_set_dscp_tid_table_id(soc->hal_soc, hal_tx_desc_cached,
498*5113495bSYour Name 					  vdev->dscp_tid_map_id);
499*5113495bSYour Name 
500*5113495bSYour Name 	hal_tx_desc_set_encrypt_type(hal_tx_desc_cached,
501*5113495bSYour Name 				     sec_type_map[sec_type]);
502*5113495bSYour Name 	hal_tx_desc_set_cache_set_num(soc->hal_soc, hal_tx_desc_cached,
503*5113495bSYour Name 				      (vdev->bss_ast_hash & 0xF));
504*5113495bSYour Name 
505*5113495bSYour Name 	if (dp_sawf_tag_valid_get(tx_desc->nbuf)) {
506*5113495bSYour Name 		dp_sawf_config_li(soc, hal_tx_desc_cached, &fw_metadata,
507*5113495bSYour Name 				  vdev->vdev_id, tx_desc->nbuf, msdu_info);
508*5113495bSYour Name 		dp_sawf_tx_enqueue_peer_stats(soc, tx_desc);
509*5113495bSYour Name 	}
510*5113495bSYour Name 
511*5113495bSYour Name 	hal_tx_desc_set_fw_metadata(hal_tx_desc_cached, fw_metadata);
512*5113495bSYour Name 	hal_tx_desc_set_buf_length(hal_tx_desc_cached, tx_desc->length);
513*5113495bSYour Name 	hal_tx_desc_set_buf_offset(hal_tx_desc_cached, tx_desc->pkt_offset);
514*5113495bSYour Name 	hal_tx_desc_set_encap_type(hal_tx_desc_cached, tx_desc->tx_encap_type);
515*5113495bSYour Name 	hal_tx_desc_set_addr_search_flags(hal_tx_desc_cached,
516*5113495bSYour Name 					  vdev->hal_desc_addr_search_flags);
517*5113495bSYour Name 
518*5113495bSYour Name 	if (tx_desc->flags & DP_TX_DESC_FLAG_TO_FW)
519*5113495bSYour Name 		hal_tx_desc_set_to_fw(hal_tx_desc_cached, 1);
520*5113495bSYour Name 
521*5113495bSYour Name 	/* verify checksum offload configuration*/
522*5113495bSYour Name 	if ((qdf_nbuf_get_tx_cksum(tx_desc->nbuf) ==
523*5113495bSYour Name 				   QDF_NBUF_TX_CKSUM_TCP_UDP) ||
524*5113495bSYour Name 	      qdf_nbuf_is_tso(tx_desc->nbuf))  {
525*5113495bSYour Name 		hal_tx_desc_set_l3_checksum_en(hal_tx_desc_cached, 1);
526*5113495bSYour Name 		hal_tx_desc_set_l4_checksum_en(hal_tx_desc_cached, 1);
527*5113495bSYour Name 	}
528*5113495bSYour Name 
529*5113495bSYour Name 	tid = msdu_info->tid;
530*5113495bSYour Name 	if (tid != HTT_TX_EXT_TID_INVALID)
531*5113495bSYour Name 		hal_tx_desc_set_hlos_tid(hal_tx_desc_cached, tid);
532*5113495bSYour Name 
533*5113495bSYour Name 	if (tx_desc->flags & DP_TX_DESC_FLAG_MESH)
534*5113495bSYour Name 		hal_tx_desc_set_mesh_en(soc->hal_soc, hal_tx_desc_cached, 1);
535*5113495bSYour Name 
536*5113495bSYour Name 	if (!dp_tx_desc_set_ktimestamp(vdev, tx_desc))
537*5113495bSYour Name 		dp_tx_desc_set_timestamp(tx_desc);
538*5113495bSYour Name 
539*5113495bSYour Name 	dp_verbose_debug("length:%d , type = %d, dma_addr %llx, offset %d desc id %u",
540*5113495bSYour Name 			 tx_desc->length,
541*5113495bSYour Name 			 (tx_desc->flags & DP_TX_DESC_FLAG_FRAG),
542*5113495bSYour Name 			 (uint64_t)tx_desc->dma_addr, tx_desc->pkt_offset,
543*5113495bSYour Name 			 tx_desc->id);
544*5113495bSYour Name 
545*5113495bSYour Name 	hal_ring_hdl = dp_tx_get_hal_ring_hdl(soc, ring_id);
546*5113495bSYour Name 
547*5113495bSYour Name 	if (qdf_unlikely(dp_tx_hal_ring_access_start(soc, hal_ring_hdl))) {
548*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
549*5113495bSYour Name 			  "%s %d : HAL RING Access Failed -- %pK",
550*5113495bSYour Name 			 __func__, __LINE__, hal_ring_hdl);
551*5113495bSYour Name 		DP_STATS_INC(soc, tx.tcl_ring_full[ring_id], 1);
552*5113495bSYour Name 		DP_STATS_INC(vdev, tx_i[DP_XMIT_LINK].dropped.enqueue_fail,
553*5113495bSYour Name 			     1);
554*5113495bSYour Name 		dp_sawf_tx_enqueue_fail_peer_stats(soc, tx_desc);
555*5113495bSYour Name 		return status;
556*5113495bSYour Name 	}
557*5113495bSYour Name 
558*5113495bSYour Name 	dp_tx_clear_consumed_hw_descs(soc, hal_ring_hdl);
559*5113495bSYour Name 
560*5113495bSYour Name 	/* Sync cached descriptor with HW */
561*5113495bSYour Name 
562*5113495bSYour Name 	hal_tx_desc = hal_srng_src_get_next(soc->hal_soc, hal_ring_hdl);
563*5113495bSYour Name 	if (qdf_unlikely(!hal_tx_desc)) {
564*5113495bSYour Name 		dp_verbose_debug("TCL ring full ring_id:%d", ring_id);
565*5113495bSYour Name 		DP_STATS_INC(soc, tx.tcl_ring_full[ring_id], 1);
566*5113495bSYour Name 		DP_STATS_INC(vdev, tx_i[DP_XMIT_LINK].dropped.enqueue_fail,
567*5113495bSYour Name 			     1);
568*5113495bSYour Name 		dp_sawf_tx_enqueue_fail_peer_stats(soc, tx_desc);
569*5113495bSYour Name 		goto ring_access_fail;
570*5113495bSYour Name 	}
571*5113495bSYour Name 
572*5113495bSYour Name 	tx_desc->flags |= DP_TX_DESC_FLAG_QUEUED_TX;
573*5113495bSYour Name 	dp_vdev_peer_stats_update_protocol_cnt_tx(vdev, tx_desc->nbuf);
574*5113495bSYour Name 	hal_tx_desc_sync(hal_tx_desc_cached, hal_tx_desc);
575*5113495bSYour Name 	coalesce = dp_tx_attempt_coalescing(soc, vdev, tx_desc, tid,
576*5113495bSYour Name 					    msdu_info, ring_id);
577*5113495bSYour Name 	DP_STATS_INC_PKT(vdev, tx_i[DP_XMIT_LINK].processed, 1,
578*5113495bSYour Name 			 tx_desc->length);
579*5113495bSYour Name 	DP_STATS_INC(soc, tx.tcl_enq[ring_id], 1);
580*5113495bSYour Name 	dp_tx_update_stats(soc, tx_desc, ring_id);
581*5113495bSYour Name 	status = QDF_STATUS_SUCCESS;
582*5113495bSYour Name 
583*5113495bSYour Name 	dp_tx_hw_desc_update_evt((uint8_t *)hal_tx_desc_cached,
584*5113495bSYour Name 				 hal_ring_hdl, soc, ring_id);
585*5113495bSYour Name 
586*5113495bSYour Name ring_access_fail:
587*5113495bSYour Name 	dp_tx_ring_access_end_wrapper(soc, hal_ring_hdl, coalesce);
588*5113495bSYour Name 	dp_pkt_add_timestamp(vdev, QDF_PKT_TX_DRIVER_EXIT,
589*5113495bSYour Name 			     qdf_get_log_timestamp(), tx_desc->nbuf);
590*5113495bSYour Name 
591*5113495bSYour Name 	return status;
592*5113495bSYour Name }
593*5113495bSYour Name 
dp_tx_desc_pool_init_li(struct dp_soc * soc,uint32_t num_elem,uint8_t pool_id,bool spcl_tx_desc)594*5113495bSYour Name QDF_STATUS dp_tx_desc_pool_init_li(struct dp_soc *soc,
595*5113495bSYour Name 				   uint32_t num_elem,
596*5113495bSYour Name 				   uint8_t pool_id,
597*5113495bSYour Name 				   bool spcl_tx_desc)
598*5113495bSYour Name {
599*5113495bSYour Name 	uint32_t id, count, page_id, offset, pool_id_32;
600*5113495bSYour Name 	struct dp_tx_desc_s *tx_desc;
601*5113495bSYour Name 	struct dp_tx_desc_pool_s *tx_desc_pool;
602*5113495bSYour Name 	uint16_t num_desc_per_page;
603*5113495bSYour Name 
604*5113495bSYour Name 	if (spcl_tx_desc)
605*5113495bSYour Name 		tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, pool_id);
606*5113495bSYour Name 	else
607*5113495bSYour Name 		tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id);
608*5113495bSYour Name 	tx_desc = tx_desc_pool->freelist;
609*5113495bSYour Name 	count = 0;
610*5113495bSYour Name 	pool_id_32 = (uint32_t)pool_id;
611*5113495bSYour Name 	num_desc_per_page = tx_desc_pool->desc_pages.num_element_per_page;
612*5113495bSYour Name 	while (tx_desc) {
613*5113495bSYour Name 		page_id = count / num_desc_per_page;
614*5113495bSYour Name 		offset = count % num_desc_per_page;
615*5113495bSYour Name 		id = ((!!spcl_tx_desc) <<  DP_TX_DESC_ID_SPCL_OS |
616*5113495bSYour Name 			(pool_id_32 << DP_TX_DESC_ID_POOL_OS) |
617*5113495bSYour Name 			(page_id << DP_TX_DESC_ID_PAGE_OS) | offset);
618*5113495bSYour Name 
619*5113495bSYour Name 		tx_desc->id = id;
620*5113495bSYour Name 		tx_desc->pool_id = pool_id;
621*5113495bSYour Name 		tx_desc->vdev_id = DP_INVALID_VDEV_ID;
622*5113495bSYour Name 		dp_tx_desc_set_magic(tx_desc, DP_TX_MAGIC_PATTERN_FREE);
623*5113495bSYour Name 		tx_desc = tx_desc->next;
624*5113495bSYour Name 		count++;
625*5113495bSYour Name 	}
626*5113495bSYour Name 
627*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
628*5113495bSYour Name }
629*5113495bSYour Name 
dp_tx_desc_pool_deinit_li(struct dp_soc * soc,struct dp_tx_desc_pool_s * tx_desc_pool,uint8_t pool_id,bool spcl_tx_desc)630*5113495bSYour Name void dp_tx_desc_pool_deinit_li(struct dp_soc *soc,
631*5113495bSYour Name 			       struct dp_tx_desc_pool_s *tx_desc_pool,
632*5113495bSYour Name 			       uint8_t pool_id, bool spcl_tx_desc)
633*5113495bSYour Name {
634*5113495bSYour Name }
635*5113495bSYour Name 
dp_tx_compute_tx_delay_li(struct dp_soc * soc,struct dp_vdev * vdev,struct hal_tx_completion_status * ts,uint32_t * delay_us)636*5113495bSYour Name QDF_STATUS dp_tx_compute_tx_delay_li(struct dp_soc *soc,
637*5113495bSYour Name 				     struct dp_vdev *vdev,
638*5113495bSYour Name 				     struct hal_tx_completion_status *ts,
639*5113495bSYour Name 				     uint32_t *delay_us)
640*5113495bSYour Name {
641*5113495bSYour Name 	return dp_tx_compute_hw_delay_li(soc, vdev, ts, delay_us);
642*5113495bSYour Name }
643*5113495bSYour Name 
dp_tx_desc_pool_alloc_li(struct dp_soc * soc,uint32_t num_elem,uint8_t pool_id)644*5113495bSYour Name QDF_STATUS dp_tx_desc_pool_alloc_li(struct dp_soc *soc, uint32_t num_elem,
645*5113495bSYour Name 				    uint8_t pool_id)
646*5113495bSYour Name {
647*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
648*5113495bSYour Name }
649*5113495bSYour Name 
dp_tx_desc_pool_free_li(struct dp_soc * soc,uint8_t pool_id)650*5113495bSYour Name void dp_tx_desc_pool_free_li(struct dp_soc *soc, uint8_t pool_id)
651*5113495bSYour Name {
652*5113495bSYour Name }
653