xref: /wlan-driver/qcacld-3.0/core/dp/htt/htt_internal.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2011, 2014-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-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 
20*5113495bSYour Name #ifndef _HTT_INTERNAL__H_
21*5113495bSYour Name #define _HTT_INTERNAL__H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <athdefs.h>            /* A_STATUS */
24*5113495bSYour Name #include <qdf_nbuf.h>           /* qdf_nbuf_t */
25*5113495bSYour Name #include <qdf_util.h>           /* qdf_assert */
26*5113495bSYour Name #include <htc_api.h>            /* HTC_PACKET */
27*5113495bSYour Name 
28*5113495bSYour Name #include <htt_types.h>
29*5113495bSYour Name 
30*5113495bSYour Name /* htt_rx.c */
31*5113495bSYour Name #define RX_MSDU_END_4_FIRST_MSDU_MASK \
32*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_4_FIRST_MSDU_MASK)
33*5113495bSYour Name #define RX_MSDU_END_4_FIRST_MSDU_LSB \
34*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_4_FIRST_MSDU_LSB)
35*5113495bSYour Name #define RX_MPDU_START_0_RETRY_LSB  \
36*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_0_RETRY_LSB)
37*5113495bSYour Name #define RX_MPDU_START_0_RETRY_MASK  \
38*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_0_RETRY_MASK)
39*5113495bSYour Name #define RX_MPDU_START_0_SEQ_NUM_MASK \
40*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_0_SEQ_NUM_MASK)
41*5113495bSYour Name #define RX_MPDU_START_0_SEQ_NUM_LSB \
42*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_0_SEQ_NUM_LSB)
43*5113495bSYour Name #define RX_MPDU_START_2_PN_47_32_LSB \
44*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_2_PN_47_32_LSB)
45*5113495bSYour Name #define RX_MPDU_START_2_PN_47_32_MASK \
46*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_2_PN_47_32_MASK)
47*5113495bSYour Name #define RX_MPDU_START_2_TID_LSB  \
48*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_2_TID_LSB)
49*5113495bSYour Name #define RX_MPDU_START_2_TID_MASK  \
50*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_2_TID_MASK)
51*5113495bSYour Name #define RX_MSDU_END_1_KEY_ID_OCT_MASK \
52*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_1_KEY_ID_OCT_MASK)
53*5113495bSYour Name #define RX_MSDU_END_1_KEY_ID_OCT_LSB \
54*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_1_KEY_ID_OCT_LSB)
55*5113495bSYour Name #define RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK \
56*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_MASK)
57*5113495bSYour Name #define RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB \
58*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_1_EXT_WAPI_PN_63_48_LSB)
59*5113495bSYour Name #define RX_MSDU_END_4_LAST_MSDU_MASK \
60*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_4_LAST_MSDU_MASK)
61*5113495bSYour Name #define RX_MSDU_END_4_LAST_MSDU_LSB \
62*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_END_4_LAST_MSDU_LSB)
63*5113495bSYour Name #define RX_ATTENTION_0_MCAST_BCAST_MASK \
64*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_MCAST_BCAST_MASK)
65*5113495bSYour Name #define RX_ATTENTION_0_MCAST_BCAST_LSB \
66*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_MCAST_BCAST_LSB)
67*5113495bSYour Name #define RX_ATTENTION_0_FRAGMENT_MASK \
68*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_FRAGMENT_MASK)
69*5113495bSYour Name #define RX_ATTENTION_0_FRAGMENT_LSB \
70*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_FRAGMENT_LSB)
71*5113495bSYour Name #define RX_ATTENTION_0_MPDU_LENGTH_ERR_MASK \
72*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_MPDU_LENGTH_ERR_MASK)
73*5113495bSYour Name #define RX_FRAG_INFO_0_RING2_MORE_COUNT_MASK \
74*5113495bSYour Name 	(pdev->targetdef->d_RX_FRAG_INFO_0_RING2_MORE_COUNT_MASK)
75*5113495bSYour Name #define RX_FRAG_INFO_0_RING2_MORE_COUNT_LSB \
76*5113495bSYour Name 	(pdev->targetdef->d_RX_FRAG_INFO_0_RING2_MORE_COUNT_LSB)
77*5113495bSYour Name #define RX_MSDU_START_0_MSDU_LENGTH_MASK \
78*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_START_0_MSDU_LENGTH_MASK)
79*5113495bSYour Name #define RX_MSDU_START_0_MSDU_LENGTH_LSB \
80*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_START_0_MSDU_LENGTH_LSB)
81*5113495bSYour Name #define RX_MPDU_START_0_ENCRYPTED_MASK \
82*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_0_ENCRYPTED_MASK)
83*5113495bSYour Name #define RX_MPDU_START_0_ENCRYPTED_LSB \
84*5113495bSYour Name 	(pdev->targetdef->d_RX_MPDU_START_0_ENCRYPTED_LSB)
85*5113495bSYour Name #define RX_ATTENTION_0_MORE_DATA_MASK \
86*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_MORE_DATA_MASK)
87*5113495bSYour Name #define RX_ATTENTION_0_MSDU_DONE_MASK \
88*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_MSDU_DONE_MASK)
89*5113495bSYour Name #define RX_ATTENTION_0_TCP_UDP_CHKSUM_FAIL_MASK \
90*5113495bSYour Name 	(pdev->targetdef->d_RX_ATTENTION_0_TCP_UDP_CHKSUM_FAIL_MASK)
91*5113495bSYour Name #define RX_MSDU_START_2_DECAP_FORMAT_OFFSET \
92*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_START_2_DECAP_FORMAT_OFFSET)
93*5113495bSYour Name #define RX_MSDU_START_2_DECAP_FORMAT_LSB \
94*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_START_2_DECAP_FORMAT_LSB)
95*5113495bSYour Name #define RX_MSDU_START_2_DECAP_FORMAT_MASK \
96*5113495bSYour Name 	(pdev->targetdef->d_RX_MSDU_START_2_DECAP_FORMAT_MASK)
97*5113495bSYour Name /* end */
98*5113495bSYour Name 
99*5113495bSYour Name #ifndef offsetof
100*5113495bSYour Name #define offsetof(type, field)   ((size_t)(&((type *)0)->field))
101*5113495bSYour Name #endif
102*5113495bSYour Name 
103*5113495bSYour Name #undef MS
104*5113495bSYour Name #define MS(_v, _f) (((_v) & _f ## _MASK) >> _f ## _LSB)
105*5113495bSYour Name #undef SM
106*5113495bSYour Name #define SM(_v, _f) (((_v) << _f ## _LSB) & _f ## _MASK)
107*5113495bSYour Name #undef WO
108*5113495bSYour Name #define WO(_f)      ((_f ## _OFFSET) >> 2)
109*5113495bSYour Name 
110*5113495bSYour Name #define GET_FIELD(_addr, _f) MS(*((A_UINT32 *)(_addr) + WO(_f)), _f)
111*5113495bSYour Name 
112*5113495bSYour Name #include <rx_desc.h>
113*5113495bSYour Name #include <wal_rx_desc.h>        /* struct rx_attention, etc */
114*5113495bSYour Name 
115*5113495bSYour Name struct htt_host_fw_desc_base {
116*5113495bSYour Name 	union {
117*5113495bSYour Name 		struct fw_rx_desc_base val;
118*5113495bSYour Name 		A_UINT32 dummy_pad;     /* make sure it is DOWRD aligned */
119*5113495bSYour Name 	} u;
120*5113495bSYour Name };
121*5113495bSYour Name 
122*5113495bSYour Name 
123*5113495bSYour Name /*
124*5113495bSYour Name  * This struct defines the basic descriptor information used by host,
125*5113495bSYour Name  * which is written either by the 11ac HW MAC into the host Rx data
126*5113495bSYour Name  * buffer ring directly or generated by FW and copied from Rx indication
127*5113495bSYour Name  */
128*5113495bSYour Name struct htt_host_rx_desc_base {
129*5113495bSYour Name 	struct htt_host_fw_desc_base fw_desc;
130*5113495bSYour Name 	struct rx_attention attention;
131*5113495bSYour Name 	struct rx_frag_info frag_info;
132*5113495bSYour Name 	struct rx_mpdu_start mpdu_start;
133*5113495bSYour Name 	struct rx_msdu_start msdu_start;
134*5113495bSYour Name 	struct rx_msdu_end msdu_end;
135*5113495bSYour Name 	struct rx_mpdu_end mpdu_end;
136*5113495bSYour Name 	struct rx_ppdu_start ppdu_start;
137*5113495bSYour Name 	struct rx_ppdu_end ppdu_end;
138*5113495bSYour Name #ifdef QCA_WIFI_3_0_ADRASTEA
139*5113495bSYour Name /* Increased to support some of offload features */
140*5113495bSYour Name #define RX_HTT_HDR_STATUS_LEN 256
141*5113495bSYour Name #else
142*5113495bSYour Name #define RX_HTT_HDR_STATUS_LEN 64
143*5113495bSYour Name #endif
144*5113495bSYour Name 	char rx_hdr_status[RX_HTT_HDR_STATUS_LEN];
145*5113495bSYour Name };
146*5113495bSYour Name 
147*5113495bSYour Name #define RX_DESC_ATTN_MPDU_LEN_ERR_BIT   0x08000000
148*5113495bSYour Name 
149*5113495bSYour Name #define RX_STD_DESC_ATTN_OFFSET	\
150*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, attention))
151*5113495bSYour Name #define RX_STD_DESC_FRAG_INFO_OFFSET \
152*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, frag_info))
153*5113495bSYour Name #define RX_STD_DESC_MPDU_START_OFFSET \
154*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, mpdu_start))
155*5113495bSYour Name #define RX_STD_DESC_MSDU_START_OFFSET \
156*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, msdu_start))
157*5113495bSYour Name #define RX_STD_DESC_MSDU_END_OFFSET \
158*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, msdu_end))
159*5113495bSYour Name #define RX_STD_DESC_MPDU_END_OFFSET \
160*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, mpdu_end))
161*5113495bSYour Name #define RX_STD_DESC_PPDU_START_OFFSET \
162*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, ppdu_start))
163*5113495bSYour Name #define RX_STD_DESC_PPDU_END_OFFSET \
164*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, ppdu_end))
165*5113495bSYour Name #define RX_STD_DESC_HDR_STATUS_OFFSET \
166*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, rx_hdr_status))
167*5113495bSYour Name 
168*5113495bSYour Name #define RX_STD_DESC_FW_MSDU_OFFSET \
169*5113495bSYour Name 	(offsetof(struct htt_host_rx_desc_base, fw_desc))
170*5113495bSYour Name 
171*5113495bSYour Name #define RX_STD_DESC_SIZE (sizeof(struct htt_host_rx_desc_base))
172*5113495bSYour Name 
173*5113495bSYour Name #define RX_DESC_ATTN_OFFSET32       (RX_STD_DESC_ATTN_OFFSET >> 2)
174*5113495bSYour Name #define RX_DESC_FRAG_INFO_OFFSET32  (RX_STD_DESC_FRAG_INFO_OFFSET >> 2)
175*5113495bSYour Name #define RX_DESC_MPDU_START_OFFSET32 (RX_STD_DESC_MPDU_START_OFFSET >> 2)
176*5113495bSYour Name #define RX_DESC_MSDU_START_OFFSET32 (RX_STD_DESC_MSDU_START_OFFSET >> 2)
177*5113495bSYour Name #define RX_DESC_MSDU_END_OFFSET32   (RX_STD_DESC_MSDU_END_OFFSET >> 2)
178*5113495bSYour Name #define RX_DESC_MPDU_END_OFFSET32   (RX_STD_DESC_MPDU_END_OFFSET >> 2)
179*5113495bSYour Name #define RX_DESC_PPDU_START_OFFSET32 (RX_STD_DESC_PPDU_START_OFFSET >> 2)
180*5113495bSYour Name #define RX_DESC_PPDU_END_OFFSET32   (RX_STD_DESC_PPDU_END_OFFSET >> 2)
181*5113495bSYour Name #define RX_DESC_HDR_STATUS_OFFSET32 (RX_STD_DESC_HDR_STATUS_OFFSET >> 2)
182*5113495bSYour Name 
183*5113495bSYour Name #define RX_STD_DESC_SIZE_DWORD      (RX_STD_DESC_SIZE >> 2)
184*5113495bSYour Name 
185*5113495bSYour Name /*
186*5113495bSYour Name  * Make sure there is a minimum headroom provided in the rx netbufs
187*5113495bSYour Name  * for use by the OS shim and OS and rx data consumers.
188*5113495bSYour Name  */
189*5113495bSYour Name #define HTT_RX_BUF_OS_MIN_HEADROOM 32
190*5113495bSYour Name #define HTT_RX_STD_DESC_RESERVATION  \
191*5113495bSYour Name 	((HTT_RX_BUF_OS_MIN_HEADROOM > RX_STD_DESC_SIZE) ? \
192*5113495bSYour Name 	 HTT_RX_BUF_OS_MIN_HEADROOM : RX_STD_DESC_SIZE)
193*5113495bSYour Name #define HTT_RX_DESC_RESERVATION32 \
194*5113495bSYour Name 	(HTT_RX_STD_DESC_RESERVATION >> 2)
195*5113495bSYour Name 
196*5113495bSYour Name #define HTT_RX_DESC_ALIGN_MASK 7        /* 8-byte alignment */
197*5113495bSYour Name 
198*5113495bSYour Name #ifdef DEBUG_RX_RING_BUFFER
199*5113495bSYour Name #ifdef MSM_PLATFORM
200*5113495bSYour Name #define HTT_ADDRESS_MASK   0xfffffffffffffffe
201*5113495bSYour Name #else
202*5113495bSYour Name #define HTT_ADDRESS_MASK   0xfffffffe
203*5113495bSYour Name #endif /* MSM_PLATFORM */
204*5113495bSYour Name 
205*5113495bSYour Name /**
206*5113495bSYour Name  * rx_buf_debug: rx_ring history
207*5113495bSYour Name  *
208*5113495bSYour Name  * There are three types of entries in history:
209*5113495bSYour Name  * 1) rx-descriptors posted (and received)
210*5113495bSYour Name  *    Both of these events are stored on the same entry
211*5113495bSYour Name  *    @paddr : physical address posted on the ring
212*5113495bSYour Name  *    @nbuf  : virtual address of nbuf containing data
213*5113495bSYour Name  *    @ndata : virtual address of data (corresponds to physical address)
214*5113495bSYour Name  *    @posted: time-stamp when the buffer is posted to the ring
215*5113495bSYour Name  *    @recved: time-stamp when the buffer is received (rx_in_order_ind)
216*5113495bSYour Name  *           : or 0, if the buffer has not been received yet
217*5113495bSYour Name  * 2) ring alloc-index (fill-index) updates
218*5113495bSYour Name  *    @paddr : = 0
219*5113495bSYour Name  *    @nbuf  : = 0
220*5113495bSYour Name  *    @ndata : = 0
221*5113495bSYour Name  *    posted : time-stamp when alloc index was updated
222*5113495bSYour Name  *    recved : value of alloc index
223*5113495bSYour Name  * 3) htt_rx_in_order_indication reception
224*5113495bSYour Name  *    @paddr : = 0
225*5113495bSYour Name  *    @nbuf  : = 0
226*5113495bSYour Name  *    @ndata : msdu_cnt
227*5113495bSYour Name  *    @posted: time-stamp when HTT message is received
228*5113495bSYour Name  *    @recvd : 0x48545452584D5367 ('HTTRXMSG')
229*5113495bSYour Name  */
230*5113495bSYour Name #ifdef CONFIG_SLUB_DEBUG_ON
231*5113495bSYour Name #define HTT_RX_RING_BUFF_DBG_LIST          (8 * 1024)
232*5113495bSYour Name #else
233*5113495bSYour Name #define HTT_RX_RING_BUFF_DBG_LIST          (4 * 1024)
234*5113495bSYour Name #endif
235*5113495bSYour Name struct rx_buf_debug {
236*5113495bSYour Name 	qdf_dma_addr_t paddr;
237*5113495bSYour Name 	qdf_nbuf_t     nbuf;
238*5113495bSYour Name 	void          *nbuf_data;
239*5113495bSYour Name 	uint64_t       posted; /* timestamp */
240*5113495bSYour Name 	uint64_t       recved; /* timestamp */
241*5113495bSYour Name 	int            cpu;
242*5113495bSYour Name 
243*5113495bSYour Name };
244*5113495bSYour Name #endif
245*5113495bSYour Name 
htt_rx_desc(qdf_nbuf_t msdu)246*5113495bSYour Name static inline struct htt_host_rx_desc_base *htt_rx_desc(qdf_nbuf_t msdu)
247*5113495bSYour Name {
248*5113495bSYour Name 	return (struct htt_host_rx_desc_base *)
249*5113495bSYour Name 	       (((size_t) (qdf_nbuf_head(msdu) + HTT_RX_DESC_ALIGN_MASK)) &
250*5113495bSYour Name 		~HTT_RX_DESC_ALIGN_MASK);
251*5113495bSYour Name }
252*5113495bSYour Name 
253*5113495bSYour Name #if defined(HELIUMPLUS)
254*5113495bSYour Name /**
255*5113495bSYour Name  * htt_print_rx_desc_lro() - print LRO information in the rx
256*5113495bSYour Name  * descriptor
257*5113495bSYour Name  * @rx_desc: HTT rx descriptor
258*5113495bSYour Name  *
259*5113495bSYour Name  * Prints the LRO related fields in the HTT rx descriptor
260*5113495bSYour Name  *
261*5113495bSYour Name  * Return: none
262*5113495bSYour Name  */
htt_print_rx_desc_lro(struct htt_host_rx_desc_base * rx_desc)263*5113495bSYour Name static inline void htt_print_rx_desc_lro(struct htt_host_rx_desc_base *rx_desc)
264*5113495bSYour Name {
265*5113495bSYour Name 	qdf_nofl_info
266*5113495bSYour Name 		("----------------------RX DESC LRO----------------------\n");
267*5113495bSYour Name 	qdf_nofl_info("msdu_end.lro_eligible:0x%x\n",
268*5113495bSYour Name 		      rx_desc->msdu_end.lro_eligible);
269*5113495bSYour Name 	qdf_nofl_info("msdu_start.tcp_only_ack:0x%x\n",
270*5113495bSYour Name 		      rx_desc->msdu_start.tcp_only_ack);
271*5113495bSYour Name 	qdf_nofl_info("msdu_end.tcp_udp_chksum:0x%x\n",
272*5113495bSYour Name 		      rx_desc->msdu_end.tcp_udp_chksum);
273*5113495bSYour Name 	qdf_nofl_info("msdu_end.tcp_seq_number:0x%x\n",
274*5113495bSYour Name 		      rx_desc->msdu_end.tcp_seq_number);
275*5113495bSYour Name 	qdf_nofl_info("msdu_end.tcp_ack_number:0x%x\n",
276*5113495bSYour Name 		      rx_desc->msdu_end.tcp_ack_number);
277*5113495bSYour Name 	qdf_nofl_info("msdu_start.tcp_proto:0x%x\n",
278*5113495bSYour Name 		      rx_desc->msdu_start.tcp_proto);
279*5113495bSYour Name 	qdf_nofl_info("msdu_start.ipv6_proto:0x%x\n",
280*5113495bSYour Name 		      rx_desc->msdu_start.ipv6_proto);
281*5113495bSYour Name 	qdf_nofl_info("msdu_start.ipv4_proto:0x%x\n",
282*5113495bSYour Name 		      rx_desc->msdu_start.ipv4_proto);
283*5113495bSYour Name 	qdf_nofl_info("msdu_start.l3_offset:0x%x\n",
284*5113495bSYour Name 		      rx_desc->msdu_start.l3_offset);
285*5113495bSYour Name 	qdf_nofl_info("msdu_start.l4_offset:0x%x\n",
286*5113495bSYour Name 		      rx_desc->msdu_start.l4_offset);
287*5113495bSYour Name 	qdf_nofl_info("msdu_start.flow_id_toeplitz:0x%x\n",
288*5113495bSYour Name 		      rx_desc->msdu_start.flow_id_toeplitz);
289*5113495bSYour Name 	qdf_nofl_info
290*5113495bSYour Name 		("---------------------------------------------------------\n");
291*5113495bSYour Name }
292*5113495bSYour Name 
293*5113495bSYour Name /**
294*5113495bSYour Name  * htt_print_rx_desc_lro() - extract LRO information from the rx
295*5113495bSYour Name  * descriptor
296*5113495bSYour Name  * @msdu: network buffer
297*5113495bSYour Name  * @rx_desc: HTT rx descriptor
298*5113495bSYour Name  *
299*5113495bSYour Name  * Extracts the LRO related fields from the HTT rx descriptor
300*5113495bSYour Name  * and stores them in the network buffer's control block
301*5113495bSYour Name  *
302*5113495bSYour Name  * Return: none
303*5113495bSYour Name  */
htt_rx_extract_lro_info(qdf_nbuf_t msdu,struct htt_host_rx_desc_base * rx_desc)304*5113495bSYour Name static inline void htt_rx_extract_lro_info(qdf_nbuf_t msdu,
305*5113495bSYour Name 	 struct htt_host_rx_desc_base *rx_desc)
306*5113495bSYour Name {
307*5113495bSYour Name 	if (rx_desc->attention.tcp_udp_chksum_fail)
308*5113495bSYour Name 		QDF_NBUF_CB_RX_LRO_ELIGIBLE(msdu) = 0;
309*5113495bSYour Name 	else
310*5113495bSYour Name 		QDF_NBUF_CB_RX_LRO_ELIGIBLE(msdu) =
311*5113495bSYour Name 			rx_desc->msdu_end.lro_eligible;
312*5113495bSYour Name 
313*5113495bSYour Name 	if (QDF_NBUF_CB_RX_LRO_ELIGIBLE(msdu)) {
314*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_PURE_ACK(msdu) =
315*5113495bSYour Name 			rx_desc->msdu_start.tcp_only_ack;
316*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_CHKSUM(msdu) =
317*5113495bSYour Name 			rx_desc->msdu_end.tcp_udp_chksum;
318*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_SEQ_NUM(msdu) =
319*5113495bSYour Name 			rx_desc->msdu_end.tcp_seq_number;
320*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_ACK_NUM(msdu) =
321*5113495bSYour Name 			rx_desc->msdu_end.tcp_ack_number;
322*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_WIN(msdu) =
323*5113495bSYour Name 			rx_desc->msdu_end.window_size;
324*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_PROTO(msdu) =
325*5113495bSYour Name 			rx_desc->msdu_start.tcp_proto;
326*5113495bSYour Name 		QDF_NBUF_CB_RX_IPV6_PROTO(msdu) =
327*5113495bSYour Name 			rx_desc->msdu_start.ipv6_proto;
328*5113495bSYour Name 		QDF_NBUF_CB_RX_TCP_OFFSET(msdu) =
329*5113495bSYour Name 			rx_desc->msdu_start.l4_offset;
330*5113495bSYour Name 		QDF_NBUF_CB_RX_FLOW_ID(msdu) =
331*5113495bSYour Name 			rx_desc->msdu_start.flow_id_toeplitz;
332*5113495bSYour Name 	}
333*5113495bSYour Name }
334*5113495bSYour Name #else
htt_print_rx_desc_lro(struct htt_host_rx_desc_base * rx_desc)335*5113495bSYour Name static inline void htt_print_rx_desc_lro(struct htt_host_rx_desc_base *rx_desc)
336*5113495bSYour Name {}
htt_rx_extract_lro_info(qdf_nbuf_t msdu,struct htt_host_rx_desc_base * rx_desc)337*5113495bSYour Name static inline void htt_rx_extract_lro_info(qdf_nbuf_t msdu,
338*5113495bSYour Name 	 struct htt_host_rx_desc_base *rx_desc) {}
339*5113495bSYour Name #endif /* HELIUMPLUS */
340*5113495bSYour Name 
htt_print_rx_desc(struct htt_host_rx_desc_base * rx_desc)341*5113495bSYour Name static inline void htt_print_rx_desc(struct htt_host_rx_desc_base *rx_desc)
342*5113495bSYour Name {
343*5113495bSYour Name 	qdf_nofl_info
344*5113495bSYour Name 		("----------------------RX DESC----------------------------\n");
345*5113495bSYour Name 	qdf_nofl_info("attention: %#010x\n",
346*5113495bSYour Name 		      (unsigned int)(*(uint32_t *)&rx_desc->attention));
347*5113495bSYour Name 	qdf_nofl_info("frag_info: %#010x\n",
348*5113495bSYour Name 		      (unsigned int)(*(uint32_t *)&rx_desc->frag_info));
349*5113495bSYour Name 	qdf_nofl_info("mpdu_start: %#010x %#010x %#010x\n",
350*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->mpdu_start)[0]),
351*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->mpdu_start)[1]),
352*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->mpdu_start)[2]));
353*5113495bSYour Name 	qdf_nofl_info("msdu_start: %#010x %#010x %#010x\n",
354*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_start)[0]),
355*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_start)[1]),
356*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_start)[2]));
357*5113495bSYour Name 	qdf_nofl_info("msdu_end: %#010x %#010x %#010x %#010x %#010x\n",
358*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_end)[0]),
359*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_end)[1]),
360*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_end)[2]),
361*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_end)[3]),
362*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->msdu_end)[4]));
363*5113495bSYour Name 	qdf_nofl_info("mpdu_end: %#010x\n",
364*5113495bSYour Name 		      (unsigned int)(*(uint32_t *)&rx_desc->mpdu_end));
365*5113495bSYour Name 	qdf_nofl_info("ppdu_start: %#010x %#010x %#010x %#010x %#010x\n"
366*5113495bSYour Name 		      "%#010x %#010x %#010x %#010x %#010x\n",
367*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[0]),
368*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[1]),
369*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[2]),
370*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[3]),
371*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[4]),
372*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[5]),
373*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[6]),
374*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[7]),
375*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[8]),
376*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_start)[9]));
377*5113495bSYour Name 	qdf_nofl_info("ppdu_end: %#010x %#010x %#010x %#010x %#010x\n"
378*5113495bSYour Name 		      "%#010x %#010x %#010x %#010x %#010x\n"
379*5113495bSYour Name 		      "%#010x,%#010x %#010x %#010x %#010x\n"
380*5113495bSYour Name 		      "%#010x %#010x %#010x %#010x %#010x\n" "%#010x %#010x\n",
381*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[0]),
382*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[1]),
383*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[2]),
384*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[3]),
385*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[4]),
386*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[5]),
387*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[6]),
388*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[7]),
389*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[8]),
390*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[9]),
391*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[10]),
392*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[11]),
393*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[12]),
394*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[13]),
395*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[14]),
396*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[15]),
397*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[16]),
398*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[17]),
399*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[18]),
400*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[19]),
401*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[20]),
402*5113495bSYour Name 		      (unsigned int)(((uint32_t *)&rx_desc->ppdu_end)[21]));
403*5113495bSYour Name 	qdf_nofl_info
404*5113495bSYour Name 		("---------------------------------------------------------\n");
405*5113495bSYour Name }
406*5113495bSYour Name 
407*5113495bSYour Name #ifndef HTT_ASSERT_LEVEL
408*5113495bSYour Name #define HTT_ASSERT_LEVEL 3
409*5113495bSYour Name #endif
410*5113495bSYour Name 
411*5113495bSYour Name #define HTT_ASSERT_ALWAYS(condition) qdf_assert_always((condition))
412*5113495bSYour Name 
413*5113495bSYour Name #define HTT_ASSERT0(condition) qdf_assert((condition))
414*5113495bSYour Name #if HTT_ASSERT_LEVEL > 0
415*5113495bSYour Name #define HTT_ASSERT1(condition) qdf_assert((condition))
416*5113495bSYour Name #else
417*5113495bSYour Name #define HTT_ASSERT1(condition)
418*5113495bSYour Name #endif
419*5113495bSYour Name 
420*5113495bSYour Name #if HTT_ASSERT_LEVEL > 1
421*5113495bSYour Name #define HTT_ASSERT2(condition) qdf_assert((condition))
422*5113495bSYour Name #else
423*5113495bSYour Name #define HTT_ASSERT2(condition)
424*5113495bSYour Name #endif
425*5113495bSYour Name 
426*5113495bSYour Name #if HTT_ASSERT_LEVEL > 2
427*5113495bSYour Name #define HTT_ASSERT3(condition) qdf_assert((condition))
428*5113495bSYour Name #else
429*5113495bSYour Name #define HTT_ASSERT3(condition)
430*5113495bSYour Name #endif
431*5113495bSYour Name 
432*5113495bSYour Name /*
433*5113495bSYour Name  * HTT_MAX_SEND_QUEUE_DEPTH -
434*5113495bSYour Name  * How many packets HTC should allow to accumulate in a send queue
435*5113495bSYour Name  * before calling the EpSendFull callback to see whether to retain
436*5113495bSYour Name  * or drop packets.
437*5113495bSYour Name  * This is not relevant for LL, where tx descriptors should be immediately
438*5113495bSYour Name  * downloaded to the target.
439*5113495bSYour Name  * This is not very relevant for HL either, since it is anticipated that
440*5113495bSYour Name  * the HL tx download scheduler will not work this far in advance - rather,
441*5113495bSYour Name  * it will make its decisions just-in-time, so it can be responsive to
442*5113495bSYour Name  * changing conditions.
443*5113495bSYour Name  * Hence, this queue depth threshold spec is mostly just a formality.
444*5113495bSYour Name  */
445*5113495bSYour Name #define HTT_MAX_SEND_QUEUE_DEPTH 64
446*5113495bSYour Name 
447*5113495bSYour Name #define IS_PWR2(value) (((value) ^ ((value)-1)) == ((value) << 1) - 1)
448*5113495bSYour Name 
449*5113495bSYour Name /*
450*5113495bSYour Name  * HTT_RX_PRE_ALLOC_POOL_SIZE -
451*5113495bSYour Name  * How many Rx Buffer should be there in pre-allocated pool of buffers.
452*5113495bSYour Name  * This is mainly for low memory condition where kernel fails to alloc
453*5113495bSYour Name  * SKB buffer to the Rx ring.
454*5113495bSYour Name  */
455*5113495bSYour Name #define HTT_RX_PRE_ALLOC_POOL_SIZE 64
456*5113495bSYour Name /* Max rx MSDU size including L2 headers */
457*5113495bSYour Name #define MSDU_SIZE 1560
458*5113495bSYour Name /* Rounding up to a cache line size. */
459*5113495bSYour Name #define HTT_RX_BUF_SIZE  roundup(MSDU_SIZE +				\
460*5113495bSYour Name 				 sizeof(struct htt_host_rx_desc_base),	\
461*5113495bSYour Name 				 QDF_CACHE_LINE_SZ)
462*5113495bSYour Name #define MAX_RX_PAYLOAD_SZ (HTT_RX_BUF_SIZE - RX_STD_DESC_SIZE)
463*5113495bSYour Name /*
464*5113495bSYour Name  * DMA_MAP expects the buffer to be an integral number of cache lines.
465*5113495bSYour Name  * Rather than checking the actual cache line size, this code makes a
466*5113495bSYour Name  * conservative estimate of what the cache line size could be.
467*5113495bSYour Name  */
468*5113495bSYour Name #define HTT_LOG2_MAX_CACHE_LINE_SIZE 7  /* 2^7 = 128 */
469*5113495bSYour Name #define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1)
470*5113495bSYour Name 
471*5113495bSYour Name #ifdef BIG_ENDIAN_HOST
472*5113495bSYour Name /*
473*5113495bSYour Name  * big-endian: bytes within a 4-byte "word" are swapped:
474*5113495bSYour Name  * pre-swap  post-swap
475*5113495bSYour Name  *  index     index
476*5113495bSYour Name  *    0         3
477*5113495bSYour Name  *    1         2
478*5113495bSYour Name  *    2         1
479*5113495bSYour Name  *    3         0
480*5113495bSYour Name  *    4         7
481*5113495bSYour Name  *    5         6
482*5113495bSYour Name  * etc.
483*5113495bSYour Name  * To compute the post-swap index from the pre-swap index, compute
484*5113495bSYour Name  * the byte offset for the start of the word (index & ~0x3) and add
485*5113495bSYour Name  * the swapped byte offset within the word (3 - (index & 0x3)).
486*5113495bSYour Name  */
487*5113495bSYour Name #define HTT_ENDIAN_BYTE_IDX_SWAP(idx) (((idx) & ~0x3) + (3 - ((idx) & 0x3)))
488*5113495bSYour Name #else
489*5113495bSYour Name /* little-endian: no adjustment needed */
490*5113495bSYour Name #define HTT_ENDIAN_BYTE_IDX_SWAP(idx) idx
491*5113495bSYour Name #endif
492*5113495bSYour Name 
493*5113495bSYour Name #define HTT_TX_MUTEX_INIT(_mutex)			\
494*5113495bSYour Name 	qdf_spinlock_create(_mutex)
495*5113495bSYour Name 
496*5113495bSYour Name #define HTT_TX_MUTEX_ACQUIRE(_mutex)			\
497*5113495bSYour Name 	qdf_spin_lock_bh(_mutex)
498*5113495bSYour Name 
499*5113495bSYour Name #define HTT_TX_MUTEX_RELEASE(_mutex)			\
500*5113495bSYour Name 	qdf_spin_unlock_bh(_mutex)
501*5113495bSYour Name 
502*5113495bSYour Name #define HTT_TX_MUTEX_DESTROY(_mutex)			\
503*5113495bSYour Name 	qdf_spinlock_destroy(_mutex)
504*5113495bSYour Name 
505*5113495bSYour Name #ifdef ATH_11AC_TXCOMPACT
506*5113495bSYour Name 
507*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_MUTEX_INIT(_pdev)		\
508*5113495bSYour Name 	qdf_spinlock_create(&_pdev->txnbufq_mutex)
509*5113495bSYour Name 
510*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_MUTEX_DESTROY(_pdev)	       \
511*5113495bSYour Name 	HTT_TX_MUTEX_DESTROY(&_pdev->txnbufq_mutex)
512*5113495bSYour Name 
513*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_REMOVE(_pdev, _msdu)	do {	\
514*5113495bSYour Name 	HTT_TX_MUTEX_ACQUIRE(&_pdev->txnbufq_mutex);	\
515*5113495bSYour Name 	_msdu =  qdf_nbuf_queue_remove(&_pdev->txnbufq);\
516*5113495bSYour Name 	HTT_TX_MUTEX_RELEASE(&_pdev->txnbufq_mutex);    \
517*5113495bSYour Name 	} while (0)
518*5113495bSYour Name 
519*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_ADD(_pdev, _msdu) do {	\
520*5113495bSYour Name 	HTT_TX_MUTEX_ACQUIRE(&_pdev->txnbufq_mutex);	\
521*5113495bSYour Name 	qdf_nbuf_queue_add(&_pdev->txnbufq, _msdu);     \
522*5113495bSYour Name 	HTT_TX_MUTEX_RELEASE(&_pdev->txnbufq_mutex);    \
523*5113495bSYour Name 	} while (0)
524*5113495bSYour Name 
525*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_INSERT_HEAD(_pdev, _msdu) do {   \
526*5113495bSYour Name 	HTT_TX_MUTEX_ACQUIRE(&_pdev->txnbufq_mutex);	   \
527*5113495bSYour Name 	qdf_nbuf_queue_insert_head(&_pdev->txnbufq, _msdu);\
528*5113495bSYour Name 	HTT_TX_MUTEX_RELEASE(&_pdev->txnbufq_mutex);       \
529*5113495bSYour Name 	} while (0)
530*5113495bSYour Name #else
531*5113495bSYour Name 
532*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_MUTEX_INIT(_pdev)
533*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_REMOVE(_pdev, _msdu)
534*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_ADD(_pdev, _msdu)
535*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_INSERT_HEAD(_pdev, _msdu)
536*5113495bSYour Name #define HTT_TX_NBUF_QUEUE_MUTEX_DESTROY(_pdev)
537*5113495bSYour Name 
538*5113495bSYour Name #endif
539*5113495bSYour Name 
540*5113495bSYour Name #ifdef CONFIG_HL_SUPPORT
541*5113495bSYour Name 
htt_tx_resume_handler(void * context)542*5113495bSYour Name static inline void htt_tx_resume_handler(void *context)
543*5113495bSYour Name {
544*5113495bSYour Name }
545*5113495bSYour Name #else
546*5113495bSYour Name 
547*5113495bSYour Name void htt_tx_resume_handler(void *context);
548*5113495bSYour Name #endif
549*5113495bSYour Name 
550*5113495bSYour Name #ifdef ATH_11AC_TXCOMPACT
551*5113495bSYour Name #define HTT_TX_SCHED htt_tx_sched
552*5113495bSYour Name #else
553*5113495bSYour Name #define HTT_TX_SCHED(pdev)      /* no-op */
554*5113495bSYour Name #endif
555*5113495bSYour Name 
556*5113495bSYour Name int htt_tx_attach(struct htt_pdev_t *pdev, int desc_pool_elems);
557*5113495bSYour Name 
558*5113495bSYour Name void htt_tx_detach(struct htt_pdev_t *pdev);
559*5113495bSYour Name 
560*5113495bSYour Name int htt_rx_attach(struct htt_pdev_t *pdev);
561*5113495bSYour Name 
562*5113495bSYour Name #if defined(CONFIG_HL_SUPPORT)
563*5113495bSYour Name 
htt_rx_detach(struct htt_pdev_t * pdev)564*5113495bSYour Name static inline void htt_rx_detach(struct htt_pdev_t *pdev)
565*5113495bSYour Name {
566*5113495bSYour Name }
567*5113495bSYour Name #else
568*5113495bSYour Name 
569*5113495bSYour Name void htt_rx_detach(struct htt_pdev_t *pdev);
570*5113495bSYour Name #endif
571*5113495bSYour Name 
572*5113495bSYour Name int htt_htc_attach(struct htt_pdev_t *pdev, uint16_t service_id);
573*5113495bSYour Name 
574*5113495bSYour Name void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt);
575*5113495bSYour Name #ifdef WLAN_FEATURE_FASTPATH
576*5113495bSYour Name void htt_t2h_msg_handler_fast(void *htt_pdev, qdf_nbuf_t *cmpl_msdus,
577*5113495bSYour Name 			      uint32_t num_cmpls);
578*5113495bSYour Name #else
htt_t2h_msg_handler_fast(void * htt_pdev,qdf_nbuf_t * cmpl_msdus,uint32_t num_cmpls)579*5113495bSYour Name static inline void htt_t2h_msg_handler_fast(void *htt_pdev,
580*5113495bSYour Name 					   qdf_nbuf_t *cmpl_msdus,
581*5113495bSYour Name 					   uint32_t num_cmpls)
582*5113495bSYour Name {
583*5113495bSYour Name }
584*5113495bSYour Name #endif
585*5113495bSYour Name 
586*5113495bSYour Name void htt_h2t_send_complete(void *context, HTC_PACKET *pkt);
587*5113495bSYour Name 
588*5113495bSYour Name QDF_STATUS htt_h2t_ver_req_msg(struct htt_pdev_t *pdev);
589*5113495bSYour Name 
590*5113495bSYour Name int htt_tx_padding_credit_update_handler(void *context, int pad_credit);
591*5113495bSYour Name 
592*5113495bSYour Name #if defined(HELIUMPLUS)
593*5113495bSYour Name QDF_STATUS
594*5113495bSYour Name htt_h2t_frag_desc_bank_cfg_msg(struct htt_pdev_t *pdev);
595*5113495bSYour Name #endif /* defined(HELIUMPLUS) */
596*5113495bSYour Name 
597*5113495bSYour Name QDF_STATUS htt_h2t_rx_ring_cfg_msg_ll(struct htt_pdev_t *pdev);
598*5113495bSYour Name 
599*5113495bSYour Name QDF_STATUS htt_h2t_rx_ring_rfs_cfg_msg_ll(struct htt_pdev_t *pdev);
600*5113495bSYour Name 
601*5113495bSYour Name QDF_STATUS htt_h2t_rx_ring_rfs_cfg_msg_hl(struct htt_pdev_t *pdev);
602*5113495bSYour Name 
603*5113495bSYour Name QDF_STATUS htt_h2t_rx_ring_cfg_msg_hl(struct htt_pdev_t *pdev);
604*5113495bSYour Name 
605*5113495bSYour Name extern QDF_STATUS (*htt_h2t_rx_ring_cfg_msg)(struct htt_pdev_t *pdev);
606*5113495bSYour Name 
607*5113495bSYour Name enum htc_send_full_action htt_h2t_full(void *context, HTC_PACKET *pkt);
608*5113495bSYour Name 
609*5113495bSYour Name struct htt_htc_pkt *htt_htc_pkt_alloc(struct htt_pdev_t *pdev);
610*5113495bSYour Name 
611*5113495bSYour Name void htt_htc_pkt_free(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt);
612*5113495bSYour Name 
613*5113495bSYour Name void htt_htc_pkt_pool_free(struct htt_pdev_t *pdev);
614*5113495bSYour Name 
615*5113495bSYour Name #ifdef ATH_11AC_TXCOMPACT
616*5113495bSYour Name void htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev, int level);
617*5113495bSYour Name 
618*5113495bSYour Name void
619*5113495bSYour Name htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt);
620*5113495bSYour Name 
621*5113495bSYour Name void htt_htc_misc_pkt_pool_free(struct htt_pdev_t *pdev);
622*5113495bSYour Name #endif
623*5113495bSYour Name 
624*5113495bSYour Name #ifdef WLAN_FULL_REORDER_OFFLOAD
625*5113495bSYour Name int
626*5113495bSYour Name htt_rx_hash_list_insert(struct htt_pdev_t *pdev,
627*5113495bSYour Name 			qdf_dma_addr_t paddr,
628*5113495bSYour Name 			qdf_nbuf_t netbuf);
629*5113495bSYour Name #else
630*5113495bSYour Name static inline int
htt_rx_hash_list_insert(struct htt_pdev_t * pdev,qdf_dma_addr_t paddr,qdf_nbuf_t netbuf)631*5113495bSYour Name htt_rx_hash_list_insert(struct htt_pdev_t *pdev,
632*5113495bSYour Name 			qdf_dma_addr_t paddr,
633*5113495bSYour Name 			qdf_nbuf_t netbuf)
634*5113495bSYour Name {
635*5113495bSYour Name 	return 0;
636*5113495bSYour Name }
637*5113495bSYour Name #endif
638*5113495bSYour Name 
639*5113495bSYour Name qdf_nbuf_t
640*5113495bSYour Name htt_rx_hash_list_lookup(struct htt_pdev_t *pdev, qdf_dma_addr_t paddr);
641*5113495bSYour Name 
642*5113495bSYour Name #ifdef IPA_OFFLOAD
643*5113495bSYour Name int
644*5113495bSYour Name htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
645*5113495bSYour Name 		     unsigned int uc_tx_buf_sz,
646*5113495bSYour Name 		     unsigned int uc_tx_buf_cnt,
647*5113495bSYour Name 		     unsigned int uc_tx_partition_base);
648*5113495bSYour Name 
649*5113495bSYour Name int
650*5113495bSYour Name htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev, unsigned int rx_ind_ring_size);
651*5113495bSYour Name 
652*5113495bSYour Name int htt_tx_ipa_uc_detach(struct htt_pdev_t *pdev);
653*5113495bSYour Name 
654*5113495bSYour Name int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev);
655*5113495bSYour Name 
656*5113495bSYour Name #else
657*5113495bSYour Name /**
658*5113495bSYour Name  * htt_tx_ipa_uc_attach() - attach htt ipa uc tx resource
659*5113495bSYour Name  * @pdev: htt context
660*5113495bSYour Name  * @uc_tx_buf_sz: single tx buffer size
661*5113495bSYour Name  * @uc_tx_buf_cnt: total tx buffer count
662*5113495bSYour Name  * @uc_tx_partition_base: tx buffer partition start
663*5113495bSYour Name  *
664*5113495bSYour Name  * Return: 0 success
665*5113495bSYour Name  */
666*5113495bSYour Name static inline int
htt_tx_ipa_uc_attach(struct htt_pdev_t * pdev,unsigned int uc_tx_buf_sz,unsigned int uc_tx_buf_cnt,unsigned int uc_tx_partition_base)667*5113495bSYour Name htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
668*5113495bSYour Name 		     unsigned int uc_tx_buf_sz,
669*5113495bSYour Name 		     unsigned int uc_tx_buf_cnt,
670*5113495bSYour Name 		     unsigned int uc_tx_partition_base)
671*5113495bSYour Name {
672*5113495bSYour Name 	return 0;
673*5113495bSYour Name }
674*5113495bSYour Name 
675*5113495bSYour Name /**
676*5113495bSYour Name  * htt_rx_ipa_uc_attach() - attach htt ipa uc rx resource
677*5113495bSYour Name  * @pdev: htt context
678*5113495bSYour Name  * @rx_ind_ring_size: rx ring size
679*5113495bSYour Name  *
680*5113495bSYour Name  * Return: 0 success
681*5113495bSYour Name  */
682*5113495bSYour Name static inline int
htt_rx_ipa_uc_attach(struct htt_pdev_t * pdev,unsigned int rx_ind_ring_size)683*5113495bSYour Name htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev, unsigned int rx_ind_ring_size)
684*5113495bSYour Name {
685*5113495bSYour Name 	return 0;
686*5113495bSYour Name }
687*5113495bSYour Name 
htt_tx_ipa_uc_detach(struct htt_pdev_t * pdev)688*5113495bSYour Name static inline int htt_tx_ipa_uc_detach(struct htt_pdev_t *pdev)
689*5113495bSYour Name {
690*5113495bSYour Name 	return 0;
691*5113495bSYour Name }
692*5113495bSYour Name 
htt_rx_ipa_uc_detach(struct htt_pdev_t * pdev)693*5113495bSYour Name static inline int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev)
694*5113495bSYour Name {
695*5113495bSYour Name 	return 0;
696*5113495bSYour Name }
697*5113495bSYour Name 
698*5113495bSYour Name #endif /* IPA_OFFLOAD */
699*5113495bSYour Name 
700*5113495bSYour Name /* Maximum Outstanding Bus Download */
701*5113495bSYour Name #define HTT_MAX_BUS_CREDIT 33
702*5113495bSYour Name 
703*5113495bSYour Name #ifdef CONFIG_HL_SUPPORT
704*5113495bSYour Name 
705*5113495bSYour Name /**
706*5113495bSYour Name  * htt_tx_credit_update() - check for diff in bus delta and target delta
707*5113495bSYour Name  * @pdev: pointer to htt device.
708*5113495bSYour Name  *
709*5113495bSYour Name  * Return: min of bus delta and target delta
710*5113495bSYour Name  */
711*5113495bSYour Name int
712*5113495bSYour Name htt_tx_credit_update(struct htt_pdev_t *pdev);
713*5113495bSYour Name #else
714*5113495bSYour Name 
715*5113495bSYour Name static inline int
htt_tx_credit_update(struct htt_pdev_t * pdev)716*5113495bSYour Name htt_tx_credit_update(struct htt_pdev_t *pdev)
717*5113495bSYour Name {
718*5113495bSYour Name 	return 0;
719*5113495bSYour Name }
720*5113495bSYour Name #endif
721*5113495bSYour Name 
722*5113495bSYour Name 
723*5113495bSYour Name #ifdef FEATURE_HL_GROUP_CREDIT_FLOW_CONTROL
724*5113495bSYour Name 
725*5113495bSYour Name #define HTT_TX_GROUP_INDEX_OFFSET \
726*5113495bSYour Name (sizeof(struct htt_txq_group) / sizeof(u_int32_t))
727*5113495bSYour Name 
728*5113495bSYour Name void htt_tx_group_credit_process(struct htt_pdev_t *pdev, u_int32_t *msg_word);
729*5113495bSYour Name #else
730*5113495bSYour Name 
731*5113495bSYour Name static inline
htt_tx_group_credit_process(struct htt_pdev_t * pdev,u_int32_t * msg_word)732*5113495bSYour Name void htt_tx_group_credit_process(struct htt_pdev_t *pdev, u_int32_t *msg_word)
733*5113495bSYour Name {
734*5113495bSYour Name }
735*5113495bSYour Name #endif
736*5113495bSYour Name 
737*5113495bSYour Name #ifdef DEBUG_RX_RING_BUFFER
738*5113495bSYour Name /**
739*5113495bSYour Name  * htt_rx_dbg_rxbuf_init() - init debug rx buff list
740*5113495bSYour Name  * @pdev: pdev handle
741*5113495bSYour Name  *
742*5113495bSYour Name  * Allocation is done from bss segment. This uses vmalloc and has a bit
743*5113495bSYour Name  * of an overhead compared to kmalloc (which qdf_mem_alloc wraps). The impact
744*5113495bSYour Name  * of the overhead to performance will need to be quantified.
745*5113495bSYour Name  *
746*5113495bSYour Name  * Return: none
747*5113495bSYour Name  */
748*5113495bSYour Name static struct rx_buf_debug rx_buff_list_bss[HTT_RX_RING_BUFF_DBG_LIST];
749*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_init(struct htt_pdev_t * pdev)750*5113495bSYour Name void htt_rx_dbg_rxbuf_init(struct htt_pdev_t *pdev)
751*5113495bSYour Name {
752*5113495bSYour Name 	pdev->rx_buff_list = rx_buff_list_bss;
753*5113495bSYour Name 	qdf_spinlock_create(&(pdev->rx_buff_list_lock));
754*5113495bSYour Name 	pdev->rx_buff_index = 0;
755*5113495bSYour Name 	pdev->rx_buff_posted_cum = 0;
756*5113495bSYour Name 	pdev->rx_buff_recvd_cum  = 0;
757*5113495bSYour Name 	pdev->rx_buff_recvd_err  = 0;
758*5113495bSYour Name 	pdev->refill_retry_timer_starts = 0;
759*5113495bSYour Name 	pdev->refill_retry_timer_calls = 0;
760*5113495bSYour Name 	pdev->refill_retry_timer_doubles = 0;
761*5113495bSYour Name }
762*5113495bSYour Name 
763*5113495bSYour Name /**
764*5113495bSYour Name  * htt_display_rx_buf_debug() - display debug rx buff list and some counters
765*5113495bSYour Name  * @pdev: pdev handle
766*5113495bSYour Name  *
767*5113495bSYour Name  * Return: Success
768*5113495bSYour Name  */
htt_display_rx_buf_debug(struct htt_pdev_t * pdev)769*5113495bSYour Name static inline int htt_display_rx_buf_debug(struct htt_pdev_t *pdev)
770*5113495bSYour Name {
771*5113495bSYour Name 	int i;
772*5113495bSYour Name 	struct rx_buf_debug *buf;
773*5113495bSYour Name 
774*5113495bSYour Name 	if ((pdev) &&
775*5113495bSYour Name 	    (pdev->rx_buff_list)) {
776*5113495bSYour Name 		buf = pdev->rx_buff_list;
777*5113495bSYour Name 		for (i = 0; i < HTT_RX_RING_BUFF_DBG_LIST; i++) {
778*5113495bSYour Name 			if (buf[i].posted != 0)
779*5113495bSYour Name 				qdf_nofl_info("[%d][0x%x] %pK %lu %pK %llu %llu",
780*5113495bSYour Name 					      i, buf[i].cpu,
781*5113495bSYour Name 					      buf[i].nbuf_data,
782*5113495bSYour Name 					      (unsigned long)buf[i].paddr,
783*5113495bSYour Name 					      buf[i].nbuf,
784*5113495bSYour Name 					      buf[i].posted,
785*5113495bSYour Name 					      buf[i].recved);
786*5113495bSYour Name 		}
787*5113495bSYour Name 
788*5113495bSYour Name 		qdf_nofl_info("rxbuf_idx %d all_posted: %d all_recvd: %d recv_err: %d",
789*5113495bSYour Name 			      pdev->rx_buff_index,
790*5113495bSYour Name 			      pdev->rx_buff_posted_cum,
791*5113495bSYour Name 			      pdev->rx_buff_recvd_cum,
792*5113495bSYour Name 			      pdev->rx_buff_recvd_err);
793*5113495bSYour Name 
794*5113495bSYour Name 		qdf_nofl_info("timer kicks :%d actual  :%d restarts:%d debtors: %d fill_n: %d",
795*5113495bSYour Name 			      pdev->refill_retry_timer_starts,
796*5113495bSYour Name 			      pdev->refill_retry_timer_calls,
797*5113495bSYour Name 			      pdev->refill_retry_timer_doubles,
798*5113495bSYour Name 			      pdev->rx_buff_debt_invoked,
799*5113495bSYour Name 			      pdev->rx_buff_fill_n_invoked);
800*5113495bSYour Name 	} else
801*5113495bSYour Name 		return -EINVAL;
802*5113495bSYour Name 	return 0;
803*5113495bSYour Name }
804*5113495bSYour Name 
805*5113495bSYour Name /**
806*5113495bSYour Name  * htt_rx_dbg_rxbuf_set() - set element of rx buff list
807*5113495bSYour Name  * @pdev: pdev handle
808*5113495bSYour Name  * @paddr: physical address of netbuf
809*5113495bSYour Name  * @rx_netbuf: received netbuf
810*5113495bSYour Name  *
811*5113495bSYour Name  * Return: none
812*5113495bSYour Name  */
813*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_set(struct htt_pdev_t * pdev,qdf_dma_addr_t paddr,qdf_nbuf_t rx_netbuf)814*5113495bSYour Name void htt_rx_dbg_rxbuf_set(struct htt_pdev_t *pdev, qdf_dma_addr_t paddr,
815*5113495bSYour Name 			  qdf_nbuf_t rx_netbuf)
816*5113495bSYour Name {
817*5113495bSYour Name 	if (pdev->rx_buff_list) {
818*5113495bSYour Name 		qdf_spin_lock_bh(&(pdev->rx_buff_list_lock));
819*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].paddr = paddr;
820*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].nbuf  = rx_netbuf;
821*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].nbuf_data =
822*5113495bSYour Name 							rx_netbuf->data;
823*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].posted =
824*5113495bSYour Name 						qdf_get_log_timestamp();
825*5113495bSYour Name 		pdev->rx_buff_posted_cum++;
826*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].recved = 0;
827*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].cpu =
828*5113495bSYour Name 				(1 << qdf_get_cpu());
829*5113495bSYour Name 		QDF_NBUF_CB_RX_MAP_IDX(rx_netbuf) = pdev->rx_buff_index;
830*5113495bSYour Name 		if (++pdev->rx_buff_index >=
831*5113495bSYour Name 				HTT_RX_RING_BUFF_DBG_LIST)
832*5113495bSYour Name 			pdev->rx_buff_index = 0;
833*5113495bSYour Name 		qdf_spin_unlock_bh(&(pdev->rx_buff_list_lock));
834*5113495bSYour Name 	}
835*5113495bSYour Name }
836*5113495bSYour Name 
837*5113495bSYour Name /**
838*5113495bSYour Name  * htt_rx_dbg_rxbuf_set() - reset element of rx buff list
839*5113495bSYour Name  * @pdev: pdev handle
840*5113495bSYour Name  * @netbuf: rx sk_buff
841*5113495bSYour Name  * Return: none
842*5113495bSYour Name  */
843*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_reset(struct htt_pdev_t * pdev,qdf_nbuf_t netbuf)844*5113495bSYour Name void htt_rx_dbg_rxbuf_reset(struct htt_pdev_t *pdev,
845*5113495bSYour Name 				qdf_nbuf_t netbuf)
846*5113495bSYour Name {
847*5113495bSYour Name 	uint32_t index;
848*5113495bSYour Name 
849*5113495bSYour Name 	if (pdev->rx_buff_list) {
850*5113495bSYour Name 		qdf_spin_lock_bh(&(pdev->rx_buff_list_lock));
851*5113495bSYour Name 		index = QDF_NBUF_CB_RX_MAP_IDX(netbuf);
852*5113495bSYour Name 		if (index < HTT_RX_RING_BUFF_DBG_LIST) {
853*5113495bSYour Name 			pdev->rx_buff_list[index].recved =
854*5113495bSYour Name 				qdf_get_log_timestamp();
855*5113495bSYour Name 			pdev->rx_buff_recvd_cum++;
856*5113495bSYour Name 		} else {
857*5113495bSYour Name 			pdev->rx_buff_recvd_err++;
858*5113495bSYour Name 		}
859*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].cpu |=
860*5113495bSYour Name 				(1 << qdf_get_cpu());
861*5113495bSYour Name 		qdf_spin_unlock_bh(&(pdev->rx_buff_list_lock));
862*5113495bSYour Name 	}
863*5113495bSYour Name }
864*5113495bSYour Name /**
865*5113495bSYour Name  * htt_rx_dbg_rxbuf_indupd() - add a record for alloc index update
866*5113495bSYour Name  * @pdev: pdev handle
867*5113495bSYour Name  * @idx : value of the index
868*5113495bSYour Name  *
869*5113495bSYour Name  * Return: none
870*5113495bSYour Name  */
871*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_indupd(struct htt_pdev_t * pdev,int alloc_index)872*5113495bSYour Name void htt_rx_dbg_rxbuf_indupd(struct htt_pdev_t *pdev, int alloc_index)
873*5113495bSYour Name {
874*5113495bSYour Name 	if (pdev->rx_buff_list) {
875*5113495bSYour Name 		qdf_spin_lock_bh(&(pdev->rx_buff_list_lock));
876*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].paddr = 0;
877*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].nbuf  = 0;
878*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].nbuf_data = 0;
879*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].posted =
880*5113495bSYour Name 						qdf_get_log_timestamp();
881*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].recved =
882*5113495bSYour Name 			(uint64_t)alloc_index;
883*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].cpu =
884*5113495bSYour Name 				(1 << qdf_get_cpu());
885*5113495bSYour Name 		if (++pdev->rx_buff_index >=
886*5113495bSYour Name 				HTT_RX_RING_BUFF_DBG_LIST)
887*5113495bSYour Name 			pdev->rx_buff_index = 0;
888*5113495bSYour Name 		qdf_spin_unlock_bh(&(pdev->rx_buff_list_lock));
889*5113495bSYour Name 	}
890*5113495bSYour Name }
891*5113495bSYour Name /**
892*5113495bSYour Name  * htt_rx_dbg_rxbuf_httrxind() - add a record for recipt of htt rx_ind msg
893*5113495bSYour Name  * @pdev: pdev handle
894*5113495bSYour Name  *
895*5113495bSYour Name  * Return: none
896*5113495bSYour Name  */
897*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_httrxind(struct htt_pdev_t * pdev,unsigned int msdu_cnt)898*5113495bSYour Name void htt_rx_dbg_rxbuf_httrxind(struct htt_pdev_t *pdev, unsigned int msdu_cnt)
899*5113495bSYour Name {
900*5113495bSYour Name 	if (pdev->rx_buff_list) {
901*5113495bSYour Name 		qdf_spin_lock_bh(&(pdev->rx_buff_list_lock));
902*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].paddr = msdu_cnt;
903*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].nbuf  = 0;
904*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].nbuf_data = 0;
905*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].posted =
906*5113495bSYour Name 						qdf_get_log_timestamp();
907*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].recved =
908*5113495bSYour Name 			(uint64_t)0x48545452584D5347; /* 'HTTRXMSG' */
909*5113495bSYour Name 		pdev->rx_buff_list[pdev->rx_buff_index].cpu =
910*5113495bSYour Name 				(1 << qdf_get_cpu());
911*5113495bSYour Name 		if (++pdev->rx_buff_index >=
912*5113495bSYour Name 				HTT_RX_RING_BUFF_DBG_LIST)
913*5113495bSYour Name 			pdev->rx_buff_index = 0;
914*5113495bSYour Name 		qdf_spin_unlock_bh(&(pdev->rx_buff_list_lock));
915*5113495bSYour Name 	}
916*5113495bSYour Name }
917*5113495bSYour Name 
918*5113495bSYour Name /**
919*5113495bSYour Name  * htt_rx_dbg_rxbuf_deinit() - deinit debug rx buff list
920*5113495bSYour Name  * @pdev: pdev handle
921*5113495bSYour Name  *
922*5113495bSYour Name  * Return: none
923*5113495bSYour Name  */
924*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_deinit(struct htt_pdev_t * pdev)925*5113495bSYour Name void htt_rx_dbg_rxbuf_deinit(struct htt_pdev_t *pdev)
926*5113495bSYour Name {
927*5113495bSYour Name 	if (pdev->rx_buff_list)
928*5113495bSYour Name 		pdev->rx_buff_list = NULL;
929*5113495bSYour Name 	qdf_spinlock_destroy(&(pdev->rx_buff_list_lock));
930*5113495bSYour Name }
931*5113495bSYour Name #else
932*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_init(struct htt_pdev_t * pdev)933*5113495bSYour Name void htt_rx_dbg_rxbuf_init(struct htt_pdev_t *pdev)
934*5113495bSYour Name {
935*5113495bSYour Name }
htt_display_rx_buf_debug(struct htt_pdev_t * pdev)936*5113495bSYour Name static inline int htt_display_rx_buf_debug(struct htt_pdev_t *pdev)
937*5113495bSYour Name {
938*5113495bSYour Name 	return 0;
939*5113495bSYour Name }
940*5113495bSYour Name 
941*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_set(struct htt_pdev_t * pdev,uint32_t paddr,qdf_nbuf_t rx_netbuf)942*5113495bSYour Name void htt_rx_dbg_rxbuf_set(struct htt_pdev_t *pdev,
943*5113495bSYour Name 				uint32_t paddr,
944*5113495bSYour Name 				qdf_nbuf_t rx_netbuf)
945*5113495bSYour Name {
946*5113495bSYour Name }
947*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_reset(struct htt_pdev_t * pdev,qdf_nbuf_t netbuf)948*5113495bSYour Name void htt_rx_dbg_rxbuf_reset(struct htt_pdev_t *pdev,
949*5113495bSYour Name 				qdf_nbuf_t netbuf)
950*5113495bSYour Name {
951*5113495bSYour Name }
952*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_indupd(struct htt_pdev_t * pdev,int alloc_index)953*5113495bSYour Name void htt_rx_dbg_rxbuf_indupd(struct htt_pdev_t *pdev,
954*5113495bSYour Name 			     int    alloc_index)
955*5113495bSYour Name {
956*5113495bSYour Name }
957*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_httrxind(struct htt_pdev_t * pdev,unsigned int msdu_cnt)958*5113495bSYour Name void htt_rx_dbg_rxbuf_httrxind(struct htt_pdev_t *pdev,
959*5113495bSYour Name 			       unsigned int msdu_cnt)
960*5113495bSYour Name {
961*5113495bSYour Name }
962*5113495bSYour Name static inline
htt_rx_dbg_rxbuf_deinit(struct htt_pdev_t * pdev)963*5113495bSYour Name void htt_rx_dbg_rxbuf_deinit(struct htt_pdev_t *pdev)
964*5113495bSYour Name {
965*5113495bSYour Name 	return;
966*5113495bSYour Name }
967*5113495bSYour Name #endif
968*5113495bSYour Name 
969*5113495bSYour Name #ifndef HTT_RX_RING_SIZE_MIN
970*5113495bSYour Name #define HTT_RX_RING_SIZE_MIN 128        /* slightly > than one large A-MPDU */
971*5113495bSYour Name #endif
972*5113495bSYour Name 
973*5113495bSYour Name #ifndef HTT_RX_RING_SIZE_MAX
974*5113495bSYour Name #define HTT_RX_RING_SIZE_MAX 2048       /* ~20 ms @ 1 Gbps of 1500B MSDUs */
975*5113495bSYour Name #endif
976*5113495bSYour Name 
977*5113495bSYour Name #ifndef HTT_RX_RING_SIZE_1x1
978*5113495bSYour Name #define HTT_RX_RING_SIZE_1x1 1024      /* ~20 ms @ 400 Mbps of 1500B MSDUs */
979*5113495bSYour Name #endif
980*5113495bSYour Name 
981*5113495bSYour Name #ifndef HTT_RX_AVG_FRM_BYTES
982*5113495bSYour Name #define HTT_RX_AVG_FRM_BYTES 1000
983*5113495bSYour Name #endif
984*5113495bSYour Name 
985*5113495bSYour Name #define HTT_FCS_LEN (4)
986*5113495bSYour Name 
987*5113495bSYour Name #ifdef HTT_DEBUG_DATA
988*5113495bSYour Name #define HTT_PKT_DUMP(x) x
989*5113495bSYour Name #else
990*5113495bSYour Name #define HTT_PKT_DUMP(x) /* no-op */
991*5113495bSYour Name #endif
992*5113495bSYour Name 
993*5113495bSYour Name #ifdef RX_HASH_DEBUG
994*5113495bSYour Name #define HTT_RX_CHECK_MSDU_COUNT(msdu_count) HTT_ASSERT_ALWAYS(msdu_count)
995*5113495bSYour Name #else
996*5113495bSYour Name #define HTT_RX_CHECK_MSDU_COUNT(msdu_count)     /* no-op */
997*5113495bSYour Name #endif
998*5113495bSYour Name 
999*5113495bSYour Name #if HTT_PADDR64
1000*5113495bSYour Name #define NEXT_FIELD_OFFSET_IN32 2
1001*5113495bSYour Name #else /* ! HTT_PADDR64 */
1002*5113495bSYour Name #define NEXT_FIELD_OFFSET_IN32 1
1003*5113495bSYour Name #endif /* HTT_PADDR64 */
1004*5113495bSYour Name 
1005*5113495bSYour Name #define RX_PADDR_MAGIC_PATTERN 0xDEAD0000
1006*5113495bSYour Name 
1007*5113495bSYour Name #if HTT_PADDR64
htt_paddr_trim_to_37(qdf_dma_addr_t paddr)1008*5113495bSYour Name static inline qdf_dma_addr_t htt_paddr_trim_to_37(qdf_dma_addr_t paddr)
1009*5113495bSYour Name {
1010*5113495bSYour Name 	qdf_dma_addr_t ret = paddr;
1011*5113495bSYour Name 
1012*5113495bSYour Name 	if (sizeof(paddr) > 4)
1013*5113495bSYour Name 		ret &= 0x1fffffffff;
1014*5113495bSYour Name 	return ret;
1015*5113495bSYour Name }
1016*5113495bSYour Name #else /* not 64 bits */
htt_paddr_trim_to_37(qdf_dma_addr_t paddr)1017*5113495bSYour Name static inline qdf_dma_addr_t htt_paddr_trim_to_37(qdf_dma_addr_t paddr)
1018*5113495bSYour Name {
1019*5113495bSYour Name 	return paddr;
1020*5113495bSYour Name }
1021*5113495bSYour Name #endif /* HTT_PADDR64 */
1022*5113495bSYour Name 
1023*5113495bSYour Name #ifdef WLAN_FULL_REORDER_OFFLOAD
1024*5113495bSYour Name #ifdef ENABLE_DEBUG_ADDRESS_MARKING
1025*5113495bSYour Name static inline qdf_dma_addr_t
htt_rx_paddr_unmark_high_bits(qdf_dma_addr_t paddr)1026*5113495bSYour Name htt_rx_paddr_unmark_high_bits(qdf_dma_addr_t paddr)
1027*5113495bSYour Name {
1028*5113495bSYour Name 	uint32_t markings;
1029*5113495bSYour Name 
1030*5113495bSYour Name 	if (sizeof(qdf_dma_addr_t) > 4) {
1031*5113495bSYour Name 		markings = (uint32_t)((paddr >> 16) >> 16);
1032*5113495bSYour Name 		/*
1033*5113495bSYour Name 		 * check if it is marked correctly:
1034*5113495bSYour Name 		 * See the mark_high_bits function above for the expected
1035*5113495bSYour Name 		 * pattern.
1036*5113495bSYour Name 		 * the LS 5 bits are the high bits of physical address
1037*5113495bSYour Name 		 * padded (with 0b0) to 8 bits
1038*5113495bSYour Name 		 */
1039*5113495bSYour Name 		if ((markings & 0xFFFF0000) != RX_PADDR_MAGIC_PATTERN) {
1040*5113495bSYour Name 			qdf_print("paddr not marked correctly: 0x%pK!\n",
1041*5113495bSYour Name 				  (void *)paddr);
1042*5113495bSYour Name 			HTT_ASSERT_ALWAYS(0);
1043*5113495bSYour Name 		}
1044*5113495bSYour Name 
1045*5113495bSYour Name 		/* clear markings  for further use */
1046*5113495bSYour Name 		paddr = htt_paddr_trim_to_37(paddr);
1047*5113495bSYour Name 	}
1048*5113495bSYour Name 	return paddr;
1049*5113495bSYour Name }
1050*5113495bSYour Name 
1051*5113495bSYour Name static inline
htt_rx_in_ord_paddr_get(uint32_t * u32p)1052*5113495bSYour Name qdf_dma_addr_t htt_rx_in_ord_paddr_get(uint32_t *u32p)
1053*5113495bSYour Name {
1054*5113495bSYour Name 	qdf_dma_addr_t paddr = 0;
1055*5113495bSYour Name 
1056*5113495bSYour Name 	paddr = (qdf_dma_addr_t)HTT_RX_IN_ORD_PADDR_IND_PADDR_GET(*u32p);
1057*5113495bSYour Name 	if (sizeof(qdf_dma_addr_t) > 4) {
1058*5113495bSYour Name 		u32p++;
1059*5113495bSYour Name 		/* 32 bit architectures dont like <<32 */
1060*5113495bSYour Name 		paddr |= (((qdf_dma_addr_t)
1061*5113495bSYour Name 			  HTT_RX_IN_ORD_PADDR_IND_PADDR_GET(*u32p))
1062*5113495bSYour Name 			  << 16 << 16);
1063*5113495bSYour Name 	}
1064*5113495bSYour Name 	paddr = htt_rx_paddr_unmark_high_bits(paddr);
1065*5113495bSYour Name 
1066*5113495bSYour Name 	return paddr;
1067*5113495bSYour Name }
1068*5113495bSYour Name #else
1069*5113495bSYour Name #if HTT_PADDR64
1070*5113495bSYour Name static inline
htt_rx_in_ord_paddr_get(uint32_t * u32p)1071*5113495bSYour Name qdf_dma_addr_t htt_rx_in_ord_paddr_get(uint32_t *u32p)
1072*5113495bSYour Name {
1073*5113495bSYour Name 	qdf_dma_addr_t paddr = 0;
1074*5113495bSYour Name 
1075*5113495bSYour Name 	paddr = (qdf_dma_addr_t)HTT_RX_IN_ORD_PADDR_IND_PADDR_GET(*u32p);
1076*5113495bSYour Name 	if (sizeof(qdf_dma_addr_t) > 4) {
1077*5113495bSYour Name 		u32p++;
1078*5113495bSYour Name 		/* 32 bit architectures dont like <<32 */
1079*5113495bSYour Name 		paddr |= (((qdf_dma_addr_t)
1080*5113495bSYour Name 			  HTT_RX_IN_ORD_PADDR_IND_PADDR_GET(*u32p))
1081*5113495bSYour Name 			  << 16 << 16);
1082*5113495bSYour Name 	}
1083*5113495bSYour Name 	return paddr;
1084*5113495bSYour Name }
1085*5113495bSYour Name #else
1086*5113495bSYour Name static inline
htt_rx_in_ord_paddr_get(uint32_t * u32p)1087*5113495bSYour Name qdf_dma_addr_t htt_rx_in_ord_paddr_get(uint32_t *u32p)
1088*5113495bSYour Name {
1089*5113495bSYour Name 	return HTT_RX_IN_ORD_PADDR_IND_PADDR_GET(*u32p);
1090*5113495bSYour Name }
1091*5113495bSYour Name #endif
1092*5113495bSYour Name #endif /* ENABLE_DEBUG_ADDRESS_MARKING */
1093*5113495bSYour Name 
1094*5113495bSYour Name static inline
htt_rx_in_order_ring_elems(struct htt_pdev_t * pdev)1095*5113495bSYour Name unsigned int htt_rx_in_order_ring_elems(struct htt_pdev_t *pdev)
1096*5113495bSYour Name {
1097*5113495bSYour Name 	return (*pdev->rx_ring.alloc_idx.vaddr -
1098*5113495bSYour Name 		*pdev->rx_ring.target_idx.vaddr) &
1099*5113495bSYour Name 		pdev->rx_ring.size_mask;
1100*5113495bSYour Name }
1101*5113495bSYour Name 
1102*5113495bSYour Name static inline qdf_nbuf_t
htt_rx_in_order_netbuf_pop(htt_pdev_handle pdev,qdf_dma_addr_t paddr)1103*5113495bSYour Name htt_rx_in_order_netbuf_pop(htt_pdev_handle pdev, qdf_dma_addr_t paddr)
1104*5113495bSYour Name {
1105*5113495bSYour Name 	HTT_ASSERT1(htt_rx_in_order_ring_elems(pdev) != 0);
1106*5113495bSYour Name 	qdf_atomic_dec(&pdev->rx_ring.fill_cnt);
1107*5113495bSYour Name 	paddr = htt_paddr_trim_to_37(paddr);
1108*5113495bSYour Name 	return htt_rx_hash_list_lookup(pdev, paddr);
1109*5113495bSYour Name }
1110*5113495bSYour Name 
1111*5113495bSYour Name #else
1112*5113495bSYour Name static inline
htt_rx_in_ord_paddr_get(uint32_t * u32p)1113*5113495bSYour Name qdf_dma_addr_t htt_rx_in_ord_paddr_get(uint32_t *u32p)
1114*5113495bSYour Name {
1115*5113495bSYour Name 	return 0;
1116*5113495bSYour Name }
1117*5113495bSYour Name 
1118*5113495bSYour Name static inline qdf_nbuf_t
htt_rx_in_order_netbuf_pop(htt_pdev_handle pdev,qdf_dma_addr_t paddr)1119*5113495bSYour Name htt_rx_in_order_netbuf_pop(htt_pdev_handle pdev, qdf_dma_addr_t paddr)
1120*5113495bSYour Name {
1121*5113495bSYour Name 	return NULL;
1122*5113495bSYour Name }
1123*5113495bSYour Name #endif
1124*5113495bSYour Name 
1125*5113495bSYour Name #if defined(FEATURE_MONITOR_MODE_SUPPORT) && defined(WLAN_FULL_REORDER_OFFLOAD)
1126*5113495bSYour Name int htt_rx_mon_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev,
1127*5113495bSYour Name 					qdf_nbuf_t rx_ind_msg,
1128*5113495bSYour Name 					qdf_nbuf_t *head_msdu,
1129*5113495bSYour Name 					qdf_nbuf_t *tail_msdu,
1130*5113495bSYour Name 					uint32_t *replenish_cnt);
1131*5113495bSYour Name 
1132*5113495bSYour Name /**
1133*5113495bSYour Name  * htt_rx_mon_get_rx_status() - Update information about the rx status,
1134*5113495bSYour Name  * which is used later for radiotap updation.
1135*5113495bSYour Name  * @pdev: Pointer to pdev handle
1136*5113495bSYour Name  * @rx_desc: Pointer to struct htt_host_rx_desc_base
1137*5113495bSYour Name  * @rx_status: Return variable updated with rx_status
1138*5113495bSYour Name  *
1139*5113495bSYour Name  * Return: None
1140*5113495bSYour Name  */
1141*5113495bSYour Name void htt_rx_mon_get_rx_status(htt_pdev_handle pdev,
1142*5113495bSYour Name 			      struct htt_host_rx_desc_base *rx_desc,
1143*5113495bSYour Name 			      struct mon_rx_status *rx_status);
1144*5113495bSYour Name #else
1145*5113495bSYour Name static inline
htt_rx_mon_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev,qdf_nbuf_t rx_ind_msg,qdf_nbuf_t * head_msdu,qdf_nbuf_t * tail_msdu,uint32_t * replenish_cnt)1146*5113495bSYour Name int htt_rx_mon_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev,
1147*5113495bSYour Name 					qdf_nbuf_t rx_ind_msg,
1148*5113495bSYour Name 					qdf_nbuf_t *head_msdu,
1149*5113495bSYour Name 					qdf_nbuf_t *tail_msdu,
1150*5113495bSYour Name 					uint32_t *replenish_cnt)
1151*5113495bSYour Name {
1152*5113495bSYour Name 	return 0;
1153*5113495bSYour Name }
1154*5113495bSYour Name 
1155*5113495bSYour Name static inline
htt_rx_mon_get_rx_status(htt_pdev_handle pdev,struct htt_host_rx_desc_base * rx_desc,struct mon_rx_status * rx_status)1156*5113495bSYour Name void htt_rx_mon_get_rx_status(htt_pdev_handle pdev,
1157*5113495bSYour Name 			      struct htt_host_rx_desc_base *rx_desc,
1158*5113495bSYour Name 			      struct mon_rx_status *rx_status)
1159*5113495bSYour Name {
1160*5113495bSYour Name }
1161*5113495bSYour Name #endif
1162*5113495bSYour Name 
1163*5113495bSYour Name #endif /* _HTT_INTERNAL__H_ */
1164