xref: /wlan-driver/qcacld-3.0/core/dp/htt/htt_rx.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 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 
20*5113495bSYour Name /**
21*5113495bSYour Name  * @file htt_rx.c
22*5113495bSYour Name  * @brief Implement receive aspects of HTT.
23*5113495bSYour Name  * @details
24*5113495bSYour Name  *  This file contains three categories of HTT rx code:
25*5113495bSYour Name  *  1.  An abstraction of the rx descriptor, to hide the
26*5113495bSYour Name  *      differences between the HL vs. LL rx descriptor.
27*5113495bSYour Name  *  2.  Functions for providing access to the (series of)
28*5113495bSYour Name  *      rx descriptor(s) and rx frame(s) associated with
29*5113495bSYour Name  *      an rx indication message.
30*5113495bSYour Name  *  3.  Functions for setting up and using the MAC DMA
31*5113495bSYour Name  *      rx ring (applies to LL only).
32*5113495bSYour Name  */
33*5113495bSYour Name 
34*5113495bSYour Name #include <qdf_mem.h>         /* qdf_mem_malloc,free, etc. */
35*5113495bSYour Name #include <qdf_types.h>          /* qdf_print, bool */
36*5113495bSYour Name #include <qdf_nbuf.h>           /* qdf_nbuf_t, etc. */
37*5113495bSYour Name #include <qdf_timer.h>		/* qdf_timer_free */
38*5113495bSYour Name 
39*5113495bSYour Name #include <htt.h>                /* HTT_HL_RX_DESC_SIZE */
40*5113495bSYour Name #include <ol_cfg.h>
41*5113495bSYour Name #include <ol_rx.h>
42*5113495bSYour Name #include <ol_htt_rx_api.h>
43*5113495bSYour Name #include <htt_internal.h>       /* HTT_ASSERT, htt_pdev_t, HTT_RX_BUF_SIZE */
44*5113495bSYour Name #include "regtable.h"
45*5113495bSYour Name 
46*5113495bSYour Name #include <cds_ieee80211_common.h>   /* ieee80211_frame, ieee80211_qoscntl */
47*5113495bSYour Name #include <cds_utils.h>
48*5113495bSYour Name #include <wlan_policy_mgr_api.h>
49*5113495bSYour Name #include "ol_txrx_types.h"
50*5113495bSYour Name #ifdef DEBUG_DMA_DONE
51*5113495bSYour Name #include <asm/barrier.h>
52*5113495bSYour Name #include <wma_api.h>
53*5113495bSYour Name #endif
54*5113495bSYour Name #include <pktlog_ac_fmt.h>
55*5113495bSYour Name 
56*5113495bSYour Name /**
57*5113495bSYour Name  * htt_rx_mpdu_wifi_hdr_retrieve() - retrieve 802.11 header
58*5113495bSYour Name  * @pdev - pdev handle
59*5113495bSYour Name  * @mpdu_desc - mpdu descriptor
60*5113495bSYour Name  *
61*5113495bSYour Name  * Return : pointer to 802.11 header
62*5113495bSYour Name  */
htt_rx_mpdu_wifi_hdr_retrieve(htt_pdev_handle pdev,void * mpdu_desc)63*5113495bSYour Name char *htt_rx_mpdu_wifi_hdr_retrieve(htt_pdev_handle pdev, void *mpdu_desc)
64*5113495bSYour Name {
65*5113495bSYour Name 	struct htt_host_rx_desc_base *rx_desc =
66*5113495bSYour Name 		(struct htt_host_rx_desc_base *)mpdu_desc;
67*5113495bSYour Name 
68*5113495bSYour Name 	if (!rx_desc)
69*5113495bSYour Name 		return NULL;
70*5113495bSYour Name 	else
71*5113495bSYour Name 		return rx_desc->rx_hdr_status;
72*5113495bSYour Name }
73*5113495bSYour Name 
74*5113495bSYour Name /**
75*5113495bSYour Name  * htt_rx_mpdu_desc_tsf32() - Return the TSF timestamp indicating when
76*5113495bSYour Name  *                            a MPDU was received.
77*5113495bSYour Name  * @pdev - the HTT instance the rx data was received on
78*5113495bSYour Name  * @mpdu_desc - the abstract descriptor for the MPDU in question
79*5113495bSYour Name  *
80*5113495bSYour Name  * return : 32 LSBs of TSF time at which the MPDU's PPDU was received
81*5113495bSYour Name  */
htt_rx_mpdu_desc_tsf32(htt_pdev_handle pdev,void * mpdu_desc)82*5113495bSYour Name uint32_t htt_rx_mpdu_desc_tsf32(htt_pdev_handle pdev, void *mpdu_desc)
83*5113495bSYour Name {
84*5113495bSYour Name 	return 0;
85*5113495bSYour Name }
86*5113495bSYour Name 
87*5113495bSYour Name static inline
htt_rx_msdu_fw_desc_get(htt_pdev_handle pdev,void * msdu_desc)88*5113495bSYour Name uint8_t htt_rx_msdu_fw_desc_get(htt_pdev_handle pdev, void *msdu_desc)
89*5113495bSYour Name {
90*5113495bSYour Name 	/*
91*5113495bSYour Name 	 * HL and LL use the same format for FW rx desc, but have the FW rx desc
92*5113495bSYour Name 	 * in different locations.
93*5113495bSYour Name 	 * In LL, the FW rx descriptor has been copied into the same
94*5113495bSYour Name 	 * htt_host_rx_desc_base struct that holds the HW rx desc.
95*5113495bSYour Name 	 * In HL, the FW rx descriptor, along with the MSDU payload,
96*5113495bSYour Name 	 * is in the same buffer as the rx indication message.
97*5113495bSYour Name 	 *
98*5113495bSYour Name 	 * Use the FW rx desc offset configured during startup to account for
99*5113495bSYour Name 	 * this difference between HL vs. LL.
100*5113495bSYour Name 	 *
101*5113495bSYour Name 	 * An optimization would be to define the LL and HL msdu_desc pointer
102*5113495bSYour Name 	 * in such a way that they both use the same offset to the FW rx desc.
103*5113495bSYour Name 	 * Then the following functions could be converted to macros, without
104*5113495bSYour Name 	 * needing to expose the htt_pdev_t definition outside HTT.
105*5113495bSYour Name 	 */
106*5113495bSYour Name 	return *(((uint8_t *)msdu_desc) + pdev->rx_fw_desc_offset);
107*5113495bSYour Name }
108*5113495bSYour Name 
htt_rx_msdu_discard(htt_pdev_handle pdev,void * msdu_desc)109*5113495bSYour Name int htt_rx_msdu_discard(htt_pdev_handle pdev, void *msdu_desc)
110*5113495bSYour Name {
111*5113495bSYour Name 	return htt_rx_msdu_fw_desc_get(pdev, msdu_desc) & FW_RX_DESC_DISCARD_M;
112*5113495bSYour Name }
113*5113495bSYour Name 
htt_rx_msdu_forward(htt_pdev_handle pdev,void * msdu_desc)114*5113495bSYour Name int htt_rx_msdu_forward(htt_pdev_handle pdev, void *msdu_desc)
115*5113495bSYour Name {
116*5113495bSYour Name 	return htt_rx_msdu_fw_desc_get(pdev, msdu_desc) & FW_RX_DESC_FORWARD_M;
117*5113495bSYour Name }
118*5113495bSYour Name 
htt_rx_msdu_inspect(htt_pdev_handle pdev,void * msdu_desc)119*5113495bSYour Name int htt_rx_msdu_inspect(htt_pdev_handle pdev, void *msdu_desc)
120*5113495bSYour Name {
121*5113495bSYour Name 	return htt_rx_msdu_fw_desc_get(pdev, msdu_desc) & FW_RX_DESC_INSPECT_M;
122*5113495bSYour Name }
123*5113495bSYour Name 
124*5113495bSYour Name void
htt_rx_msdu_actions(htt_pdev_handle pdev,void * msdu_desc,int * discard,int * forward,int * inspect)125*5113495bSYour Name htt_rx_msdu_actions(htt_pdev_handle pdev,
126*5113495bSYour Name 		    void *msdu_desc, int *discard, int *forward, int *inspect)
127*5113495bSYour Name {
128*5113495bSYour Name 	uint8_t rx_msdu_fw_desc = htt_rx_msdu_fw_desc_get(pdev, msdu_desc);
129*5113495bSYour Name #ifdef HTT_DEBUG_DATA
130*5113495bSYour Name 	HTT_PRINT("act:0x%x ", rx_msdu_fw_desc);
131*5113495bSYour Name #endif
132*5113495bSYour Name 	*discard = rx_msdu_fw_desc & FW_RX_DESC_DISCARD_M;
133*5113495bSYour Name 	*forward = rx_msdu_fw_desc & FW_RX_DESC_FORWARD_M;
134*5113495bSYour Name 	*inspect = rx_msdu_fw_desc & FW_RX_DESC_INSPECT_M;
135*5113495bSYour Name }
136*5113495bSYour Name 
htt_rx_amsdu_rx_in_order_get_pktlog(qdf_nbuf_t rx_ind_msg)137*5113495bSYour Name uint32_t htt_rx_amsdu_rx_in_order_get_pktlog(qdf_nbuf_t rx_ind_msg)
138*5113495bSYour Name {
139*5113495bSYour Name 	uint32_t *msg_word;
140*5113495bSYour Name 
141*5113495bSYour Name 	msg_word = (uint32_t *)qdf_nbuf_data(rx_ind_msg);
142*5113495bSYour Name 	return HTT_RX_IN_ORD_PADDR_IND_PKTLOG_GET(*msg_word);
143*5113495bSYour Name }
144*5113495bSYour Name 
htt_rx_mpdu_desc_rssi_dbm(htt_pdev_handle pdev,void * mpdu_desc)145*5113495bSYour Name int16_t htt_rx_mpdu_desc_rssi_dbm(htt_pdev_handle pdev, void *mpdu_desc)
146*5113495bSYour Name {
147*5113495bSYour Name 	/*
148*5113495bSYour Name 	 * Currently the RSSI is provided only as a field in the
149*5113495bSYour Name 	 * HTT_T2H_RX_IND message, rather than in each rx descriptor.
150*5113495bSYour Name 	 */
151*5113495bSYour Name 	return HTT_RSSI_INVALID;
152*5113495bSYour Name }
153*5113495bSYour Name 
154*5113495bSYour Name /*
155*5113495bSYour Name  * htt_rx_amsdu_pop -
156*5113495bSYour Name  * global function pointer that is programmed during attach to point
157*5113495bSYour Name  * to either htt_rx_amsdu_pop_ll or htt_rx_amsdu_rx_in_order_pop_ll.
158*5113495bSYour Name  */
159*5113495bSYour Name int (*htt_rx_amsdu_pop)(htt_pdev_handle pdev,
160*5113495bSYour Name 			qdf_nbuf_t rx_ind_msg,
161*5113495bSYour Name 			qdf_nbuf_t *head_msdu, qdf_nbuf_t *tail_msdu,
162*5113495bSYour Name 			uint32_t *msdu_count);
163*5113495bSYour Name 
164*5113495bSYour Name /*
165*5113495bSYour Name  * htt_rx_frag_pop -
166*5113495bSYour Name  * global function pointer that is programmed during attach to point
167*5113495bSYour Name  * to either htt_rx_amsdu_pop_ll
168*5113495bSYour Name  */
169*5113495bSYour Name int (*htt_rx_frag_pop)(htt_pdev_handle pdev,
170*5113495bSYour Name 		       qdf_nbuf_t rx_ind_msg,
171*5113495bSYour Name 		       qdf_nbuf_t *head_msdu, qdf_nbuf_t *tail_msdu,
172*5113495bSYour Name 		       uint32_t *msdu_count);
173*5113495bSYour Name 
174*5113495bSYour Name int (*htt_rx_offload_msdu_cnt)(htt_pdev_handle pdev);
175*5113495bSYour Name 
176*5113495bSYour Name int
177*5113495bSYour Name (*htt_rx_offload_msdu_pop)(htt_pdev_handle pdev,
178*5113495bSYour Name 			   qdf_nbuf_t offload_deliver_msg,
179*5113495bSYour Name 			   int *vdev_id,
180*5113495bSYour Name 			   int *peer_id,
181*5113495bSYour Name 			   int *tid,
182*5113495bSYour Name 			   uint8_t *fw_desc,
183*5113495bSYour Name 			   qdf_nbuf_t *head_buf, qdf_nbuf_t *tail_buf);
184*5113495bSYour Name 
185*5113495bSYour Name void * (*htt_rx_mpdu_desc_list_next)(htt_pdev_handle pdev,
186*5113495bSYour Name 				     qdf_nbuf_t rx_ind_msg);
187*5113495bSYour Name 
188*5113495bSYour Name bool (*htt_rx_mpdu_desc_retry)(htt_pdev_handle pdev, void *mpdu_desc);
189*5113495bSYour Name 
190*5113495bSYour Name uint16_t (*htt_rx_mpdu_desc_seq_num)(htt_pdev_handle pdev, void *mpdu_desc,
191*5113495bSYour Name 				     bool update_seq_num);
192*5113495bSYour Name 
193*5113495bSYour Name void (*htt_rx_mpdu_desc_pn)(htt_pdev_handle pdev,
194*5113495bSYour Name 			    void *mpdu_desc,
195*5113495bSYour Name 			    union htt_rx_pn_t *pn, int pn_len_bits);
196*5113495bSYour Name 
197*5113495bSYour Name uint8_t (*htt_rx_mpdu_desc_tid)(htt_pdev_handle pdev, void *mpdu_desc);
198*5113495bSYour Name 
199*5113495bSYour Name bool (*htt_rx_msdu_desc_completes_mpdu)(htt_pdev_handle pdev, void *msdu_desc);
200*5113495bSYour Name 
201*5113495bSYour Name bool (*htt_rx_msdu_first_msdu_flag)(htt_pdev_handle pdev, void *msdu_desc);
202*5113495bSYour Name 
203*5113495bSYour Name int (*htt_rx_msdu_has_wlan_mcast_flag)(htt_pdev_handle pdev, void *msdu_desc);
204*5113495bSYour Name 
205*5113495bSYour Name bool (*htt_rx_msdu_is_wlan_mcast)(htt_pdev_handle pdev, void *msdu_desc);
206*5113495bSYour Name 
207*5113495bSYour Name int (*htt_rx_msdu_is_frag)(htt_pdev_handle pdev, void *msdu_desc);
208*5113495bSYour Name 
209*5113495bSYour Name void * (*htt_rx_msdu_desc_retrieve)(htt_pdev_handle pdev, qdf_nbuf_t msdu);
210*5113495bSYour Name 
211*5113495bSYour Name bool (*htt_rx_mpdu_is_encrypted)(htt_pdev_handle pdev, void *mpdu_desc);
212*5113495bSYour Name 
213*5113495bSYour Name bool (*htt_rx_msdu_desc_key_id)(htt_pdev_handle pdev,
214*5113495bSYour Name 				void *mpdu_desc, uint8_t *key_id);
215*5113495bSYour Name 
216*5113495bSYour Name bool (*htt_rx_msdu_chan_info_present)(
217*5113495bSYour Name 	htt_pdev_handle pdev,
218*5113495bSYour Name 	void *mpdu_desc);
219*5113495bSYour Name 
220*5113495bSYour Name bool (*htt_rx_msdu_center_freq)(
221*5113495bSYour Name 	htt_pdev_handle pdev,
222*5113495bSYour Name 	struct ol_txrx_peer_t *peer,
223*5113495bSYour Name 	void *mpdu_desc,
224*5113495bSYour Name 	uint16_t *primary_chan_center_freq_mhz,
225*5113495bSYour Name 	uint16_t *contig_chan1_center_freq_mhz,
226*5113495bSYour Name 	uint16_t *contig_chan2_center_freq_mhz,
227*5113495bSYour Name 	uint8_t *phy_mode);
228*5113495bSYour Name 
htt_rx_desc_frame_free(htt_pdev_handle htt_pdev,qdf_nbuf_t msdu)229*5113495bSYour Name void htt_rx_desc_frame_free(htt_pdev_handle htt_pdev, qdf_nbuf_t msdu)
230*5113495bSYour Name {
231*5113495bSYour Name 	qdf_nbuf_free(msdu);
232*5113495bSYour Name }
233*5113495bSYour Name 
htt_rx_msdu_desc_free(htt_pdev_handle htt_pdev,qdf_nbuf_t msdu)234*5113495bSYour Name void htt_rx_msdu_desc_free(htt_pdev_handle htt_pdev, qdf_nbuf_t msdu)
235*5113495bSYour Name {
236*5113495bSYour Name 	/*
237*5113495bSYour Name 	 * The rx descriptor is in the same buffer as the rx MSDU payload,
238*5113495bSYour Name 	 * and does not need to be freed separately.
239*5113495bSYour Name 	 */
240*5113495bSYour Name }
241*5113495bSYour Name 
htt_rx_msdu_buff_replenish(htt_pdev_handle pdev)242*5113495bSYour Name void htt_rx_msdu_buff_replenish(htt_pdev_handle pdev)
243*5113495bSYour Name {
244*5113495bSYour Name 	if (qdf_atomic_dec_and_test(&pdev->rx_ring.refill_ref_cnt))
245*5113495bSYour Name 		htt_rx_fill_ring_count(pdev);
246*5113495bSYour Name 
247*5113495bSYour Name 	qdf_atomic_inc(&pdev->rx_ring.refill_ref_cnt);
248*5113495bSYour Name }
249*5113495bSYour Name 
250*5113495bSYour Name #ifdef IPA_OFFLOAD
251*5113495bSYour Name #ifdef QCA_WIFI_3_0
252*5113495bSYour Name /**
253*5113495bSYour Name  * htt_rx_ipa_uc_alloc_wdi2_rsc() - Allocate WDI2.0 resources
254*5113495bSYour Name  * @pdev: htt context
255*5113495bSYour Name  * @rx_ind_ring_elements: rx ring elements
256*5113495bSYour Name  *
257*5113495bSYour Name  * Return: 0 success
258*5113495bSYour Name  */
htt_rx_ipa_uc_alloc_wdi2_rsc(struct htt_pdev_t * pdev,unsigned int rx_ind_ring_elements)259*5113495bSYour Name static int htt_rx_ipa_uc_alloc_wdi2_rsc(struct htt_pdev_t *pdev,
260*5113495bSYour Name 			 unsigned int rx_ind_ring_elements)
261*5113495bSYour Name {
262*5113495bSYour Name 	/*
263*5113495bSYour Name 	 * Allocate RX2 indication ring
264*5113495bSYour Name 	 * RX2 IND ring element
265*5113495bSYour Name 	 *   4bytes: pointer
266*5113495bSYour Name 	 *   2bytes: VDEV ID
267*5113495bSYour Name 	 *   2bytes: length
268*5113495bSYour Name 	 *
269*5113495bSYour Name 	 * RX indication ring size, by bytes
270*5113495bSYour Name 	 */
271*5113495bSYour Name 	pdev->ipa_uc_rx_rsc.rx2_ind_ring =
272*5113495bSYour Name 		qdf_mem_shared_mem_alloc(pdev->osdev,
273*5113495bSYour Name 					 rx_ind_ring_elements *
274*5113495bSYour Name 					 sizeof(target_paddr_t));
275*5113495bSYour Name 	if (!pdev->ipa_uc_rx_rsc.rx2_ind_ring) {
276*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_ERROR,
277*5113495bSYour Name 			  "%s: Unable to allocate memory for IPA rx2 ind ring",
278*5113495bSYour Name 			  __func__);
279*5113495bSYour Name 		return 1;
280*5113495bSYour Name 	}
281*5113495bSYour Name 
282*5113495bSYour Name 	pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx =
283*5113495bSYour Name 		qdf_mem_shared_mem_alloc(pdev->osdev, 4);
284*5113495bSYour Name 	if (!pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx) {
285*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_ERROR,
286*5113495bSYour Name 			  "%s: Unable to allocate memory for IPA rx proc done index",
287*5113495bSYour Name 			  __func__);
288*5113495bSYour Name 		qdf_mem_shared_mem_free(pdev->osdev,
289*5113495bSYour Name 					pdev->ipa_uc_rx_rsc.rx2_ind_ring);
290*5113495bSYour Name 		return 1;
291*5113495bSYour Name 	}
292*5113495bSYour Name 
293*5113495bSYour Name 	return 0;
294*5113495bSYour Name }
295*5113495bSYour Name 
296*5113495bSYour Name /**
297*5113495bSYour Name  * htt_rx_ipa_uc_free_wdi2_rsc() - Free WDI2.0 resources
298*5113495bSYour Name  * @pdev: htt context
299*5113495bSYour Name  *
300*5113495bSYour Name  * Return: None
301*5113495bSYour Name  */
htt_rx_ipa_uc_free_wdi2_rsc(struct htt_pdev_t * pdev)302*5113495bSYour Name static void htt_rx_ipa_uc_free_wdi2_rsc(struct htt_pdev_t *pdev)
303*5113495bSYour Name {
304*5113495bSYour Name 	qdf_mem_shared_mem_free(pdev->osdev, pdev->ipa_uc_rx_rsc.rx2_ind_ring);
305*5113495bSYour Name 	qdf_mem_shared_mem_free(pdev->osdev,
306*5113495bSYour Name 				pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx);
307*5113495bSYour Name }
308*5113495bSYour Name #else
htt_rx_ipa_uc_alloc_wdi2_rsc(struct htt_pdev_t * pdev,unsigned int rx_ind_ring_elements)309*5113495bSYour Name static int htt_rx_ipa_uc_alloc_wdi2_rsc(struct htt_pdev_t *pdev,
310*5113495bSYour Name 			 unsigned int rx_ind_ring_elements)
311*5113495bSYour Name {
312*5113495bSYour Name 	return 0;
313*5113495bSYour Name }
314*5113495bSYour Name 
htt_rx_ipa_uc_free_wdi2_rsc(struct htt_pdev_t * pdev)315*5113495bSYour Name static void htt_rx_ipa_uc_free_wdi2_rsc(struct htt_pdev_t *pdev)
316*5113495bSYour Name {
317*5113495bSYour Name }
318*5113495bSYour Name #endif
319*5113495bSYour Name 
320*5113495bSYour Name /**
321*5113495bSYour Name  * htt_rx_ipa_uc_attach() - attach htt ipa uc rx resource
322*5113495bSYour Name  * @pdev: htt context
323*5113495bSYour Name  * @rx_ind_ring_size: rx ring size
324*5113495bSYour Name  *
325*5113495bSYour Name  * Return: 0 success
326*5113495bSYour Name  */
htt_rx_ipa_uc_attach(struct htt_pdev_t * pdev,unsigned int rx_ind_ring_elements)327*5113495bSYour Name int htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev,
328*5113495bSYour Name 			 unsigned int rx_ind_ring_elements)
329*5113495bSYour Name {
330*5113495bSYour Name 	int ret = 0;
331*5113495bSYour Name 
332*5113495bSYour Name 	/*
333*5113495bSYour Name 	 * Allocate RX indication ring
334*5113495bSYour Name 	 * RX IND ring element
335*5113495bSYour Name 	 *   4bytes: pointer
336*5113495bSYour Name 	 *   2bytes: VDEV ID
337*5113495bSYour Name 	 *   2bytes: length
338*5113495bSYour Name 	 */
339*5113495bSYour Name 	pdev->ipa_uc_rx_rsc.rx_ind_ring =
340*5113495bSYour Name 		qdf_mem_shared_mem_alloc(pdev->osdev,
341*5113495bSYour Name 					 rx_ind_ring_elements *
342*5113495bSYour Name 					 sizeof(struct ipa_uc_rx_ring_elem_t));
343*5113495bSYour Name 	if (!pdev->ipa_uc_rx_rsc.rx_ind_ring) {
344*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_ERROR,
345*5113495bSYour Name 			  "%s: Unable to allocate memory for IPA rx ind ring",
346*5113495bSYour Name 			  __func__);
347*5113495bSYour Name 		return 1;
348*5113495bSYour Name 	}
349*5113495bSYour Name 
350*5113495bSYour Name 	pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx =
351*5113495bSYour Name 		qdf_mem_shared_mem_alloc(pdev->osdev, 4);
352*5113495bSYour Name 	if (!pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx) {
353*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_HTT, QDF_TRACE_LEVEL_ERROR,
354*5113495bSYour Name 			  "%s: Unable to allocate memory for IPA rx proc done index",
355*5113495bSYour Name 			  __func__);
356*5113495bSYour Name 		qdf_mem_shared_mem_free(pdev->osdev,
357*5113495bSYour Name 					pdev->ipa_uc_rx_rsc.rx_ind_ring);
358*5113495bSYour Name 		return 1;
359*5113495bSYour Name 	}
360*5113495bSYour Name 
361*5113495bSYour Name 	ret = htt_rx_ipa_uc_alloc_wdi2_rsc(pdev, rx_ind_ring_elements);
362*5113495bSYour Name 	if (ret) {
363*5113495bSYour Name 		qdf_mem_shared_mem_free(pdev->osdev, pdev->ipa_uc_rx_rsc.rx_ind_ring);
364*5113495bSYour Name 		qdf_mem_shared_mem_free(pdev->osdev,
365*5113495bSYour Name 					pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx);
366*5113495bSYour Name 	}
367*5113495bSYour Name 	return ret;
368*5113495bSYour Name }
369*5113495bSYour Name 
htt_rx_ipa_uc_detach(struct htt_pdev_t * pdev)370*5113495bSYour Name int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev)
371*5113495bSYour Name {
372*5113495bSYour Name 	qdf_mem_shared_mem_free(pdev->osdev, pdev->ipa_uc_rx_rsc.rx_ind_ring);
373*5113495bSYour Name 	qdf_mem_shared_mem_free(pdev->osdev,
374*5113495bSYour Name 				pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx);
375*5113495bSYour Name 
376*5113495bSYour Name 	htt_rx_ipa_uc_free_wdi2_rsc(pdev);
377*5113495bSYour Name 	return 0;
378*5113495bSYour Name }
379*5113495bSYour Name #endif /* IPA_OFFLOAD */
380*5113495bSYour Name 
381*5113495bSYour Name #ifdef CONNECTIVITY_PKTLOG
382*5113495bSYour Name /**
383*5113495bSYour Name  * htt_register_rx_pkt_dump_callback() - registers callback to
384*5113495bSYour Name  *   get rx pkt status and call callback to do rx packet dump
385*5113495bSYour Name  *
386*5113495bSYour Name  * @pdev: htt pdev handle
387*5113495bSYour Name  * @callback: callback to get rx pkt status and
388*5113495bSYour Name  *     call callback to do rx packet dump
389*5113495bSYour Name  *
390*5113495bSYour Name  * This function is used to register the callback to get
391*5113495bSYour Name  * rx pkt status and call callback to do rx packet dump
392*5113495bSYour Name  *
393*5113495bSYour Name  * Return: None
394*5113495bSYour Name  *
395*5113495bSYour Name  */
htt_register_rx_pkt_dump_callback(struct htt_pdev_t * pdev,tp_rx_pkt_dump_cb callback)396*5113495bSYour Name void htt_register_rx_pkt_dump_callback(struct htt_pdev_t *pdev,
397*5113495bSYour Name 				tp_rx_pkt_dump_cb callback)
398*5113495bSYour Name {
399*5113495bSYour Name 	if (!pdev) {
400*5113495bSYour Name 		qdf_print("pdev is NULL");
401*5113495bSYour Name 		return;
402*5113495bSYour Name 	}
403*5113495bSYour Name 	pdev->rx_pkt_dump_cb = callback;
404*5113495bSYour Name }
405*5113495bSYour Name 
406*5113495bSYour Name /**
407*5113495bSYour Name  * htt_deregister_rx_pkt_dump_callback() - deregisters callback to
408*5113495bSYour Name  *   get rx pkt status and call callback to do rx packet dump
409*5113495bSYour Name  *
410*5113495bSYour Name  * @pdev: htt pdev handle
411*5113495bSYour Name  *
412*5113495bSYour Name  * This function is used to deregister the callback to get
413*5113495bSYour Name  * rx pkt status and call callback to do rx packet dump
414*5113495bSYour Name  *
415*5113495bSYour Name  * Return: None
416*5113495bSYour Name  *
417*5113495bSYour Name  */
htt_deregister_rx_pkt_dump_callback(struct htt_pdev_t * pdev)418*5113495bSYour Name void htt_deregister_rx_pkt_dump_callback(struct htt_pdev_t *pdev)
419*5113495bSYour Name {
420*5113495bSYour Name 	if (!pdev) {
421*5113495bSYour Name 		qdf_print("pdev is NULL");
422*5113495bSYour Name 		return;
423*5113495bSYour Name 	}
424*5113495bSYour Name 	pdev->rx_pkt_dump_cb = NULL;
425*5113495bSYour Name }
426*5113495bSYour Name #endif
427*5113495bSYour Name 
428*5113495bSYour Name #ifdef WLAN_FEATURE_TSF_PLUS
htt_rx_enable_ppdu_end(int * enable_ppdu_end)429*5113495bSYour Name void htt_rx_enable_ppdu_end(int *enable_ppdu_end)
430*5113495bSYour Name {
431*5113495bSYour Name 	*enable_ppdu_end = 1;
432*5113495bSYour Name }
433*5113495bSYour Name #endif
434