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