xref: /wlan-driver/qca-wifi-host-cmn/hal/wifi3.0/hal_reo.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2019, 2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef _HAL_REO_H_
21*5113495bSYour Name #define _HAL_REO_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <qdf_types.h>
24*5113495bSYour Name /* HW headers */
25*5113495bSYour Name #include <reo_descriptor_threshold_reached_status.h>
26*5113495bSYour Name #include <reo_flush_queue.h>
27*5113495bSYour Name #include <reo_flush_timeout_list_status.h>
28*5113495bSYour Name #include <reo_unblock_cache.h>
29*5113495bSYour Name #include <reo_flush_cache.h>
30*5113495bSYour Name #include <reo_flush_queue_status.h>
31*5113495bSYour Name #include <reo_get_queue_stats.h>
32*5113495bSYour Name #include <reo_unblock_cache_status.h>
33*5113495bSYour Name #include <reo_flush_cache_status.h>
34*5113495bSYour Name #include <reo_flush_timeout_list.h>
35*5113495bSYour Name #include <reo_get_queue_stats_status.h>
36*5113495bSYour Name #include <reo_update_rx_reo_queue.h>
37*5113495bSYour Name #include <reo_update_rx_reo_queue_status.h>
38*5113495bSYour Name #include <tlv_tag_def.h>
39*5113495bSYour Name 
40*5113495bSYour Name /* SW headers */
41*5113495bSYour Name #include "hal_api.h"
42*5113495bSYour Name #include "hal_rx_hw_defines.h"
43*5113495bSYour Name 
44*5113495bSYour Name /*---------------------------------------------------------------------------
45*5113495bSYour Name   Preprocessor definitions and constants
46*5113495bSYour Name   ---------------------------------------------------------------------------*/
47*5113495bSYour Name 
48*5113495bSYour Name /* TLV values */
49*5113495bSYour Name #define HAL_REO_GET_QUEUE_STATS_TLV	WIFIREO_GET_QUEUE_STATS_E
50*5113495bSYour Name #define HAL_REO_FLUSH_QUEUE_TLV		WIFIREO_FLUSH_QUEUE_E
51*5113495bSYour Name #define HAL_REO_FLUSH_CACHE_TLV		WIFIREO_FLUSH_CACHE_E
52*5113495bSYour Name #define HAL_REO_UNBLOCK_CACHE_TLV	WIFIREO_UNBLOCK_CACHE_E
53*5113495bSYour Name #define HAL_REO_FLUSH_TIMEOUT_LIST_TLV	WIFIREO_FLUSH_TIMEOUT_LIST_E
54*5113495bSYour Name #define HAL_REO_RX_UPDATE_QUEUE_TLV     WIFIREO_UPDATE_RX_REO_QUEUE_E
55*5113495bSYour Name 
56*5113495bSYour Name #define HAL_REO_QUEUE_STATS_STATUS_TLV	WIFIREO_GET_QUEUE_STATS_STATUS_E
57*5113495bSYour Name #define HAL_REO_FLUSH_QUEUE_STATUS_TLV	WIFIREO_FLUSH_QUEUE_STATUS_E
58*5113495bSYour Name #define HAL_REO_FLUSH_CACHE_STATUS_TLV	WIFIREO_FLUSH_CACHE_STATUS_E
59*5113495bSYour Name #define HAL_REO_UNBLK_CACHE_STATUS_TLV	WIFIREO_UNBLOCK_CACHE_STATUS_E
60*5113495bSYour Name #define HAL_REO_TIMOUT_LIST_STATUS_TLV	WIFIREO_FLUSH_TIMEOUT_LIST_STATUS_E
61*5113495bSYour Name #define HAL_REO_DESC_THRES_STATUS_TLV	\
62*5113495bSYour Name 	WIFIREO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_E
63*5113495bSYour Name #define HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV WIFIREO_UPDATE_RX_REO_QUEUE_STATUS_E
64*5113495bSYour Name 
65*5113495bSYour Name #define HAL_SET_FIELD(block, field, value) \
66*5113495bSYour Name 	((value << (block ## _ ## field ## _LSB)) &	\
67*5113495bSYour Name 	 (block ## _ ## field ## _MASK))
68*5113495bSYour Name 
69*5113495bSYour Name #define HAL_GET_FIELD(block, field, value)		\
70*5113495bSYour Name 	((value & (block ## _ ## field ## _MASK)) >>	\
71*5113495bSYour Name 	 (block ## _ ## field ## _LSB))
72*5113495bSYour Name 
73*5113495bSYour Name #define HAL_SET_TLV_HDR(desc, tag, len) \
74*5113495bSYour Name 	do {						\
75*5113495bSYour Name 		((struct tlv_32_hdr *) desc)->tlv_tag = tag;	\
76*5113495bSYour Name 		((struct tlv_32_hdr *) desc)->tlv_len = len;	\
77*5113495bSYour Name 	} while (0)
78*5113495bSYour Name 
79*5113495bSYour Name #define HAL_GET_TLV(desc)	(((struct tlv_32_hdr *) desc)->tlv_tag)
80*5113495bSYour Name 
81*5113495bSYour Name #define HAL_OFFSET_DW(_block, _field) (HAL_OFFSET(_block, _field) >> 2)
82*5113495bSYour Name #define HAL_OFFSET_QW(_block, _field) (HAL_OFFSET(_block, _field) >> 3)
83*5113495bSYour Name /* dword offsets in REO cmd TLV */
84*5113495bSYour Name #define CMD_HEADER_DW_OFFSET	0
85*5113495bSYour Name 
86*5113495bSYour Name /* TODO: See if the following definition is available in HW headers */
87*5113495bSYour Name #define HAL_REO_OWNED 4
88*5113495bSYour Name #define HAL_REO_QUEUE_DESC 8
89*5113495bSYour Name 
90*5113495bSYour Name /* TODO: Using associated link desc counter 1 for Rx. Check with FW on
91*5113495bSYour Name  * how these counters are assigned
92*5113495bSYour Name  */
93*5113495bSYour Name #define HAL_RX_LINK_DESC_CNTR 1
94*5113495bSYour Name /* TODO: Following definition should be from HW headers */
95*5113495bSYour Name #define HAL_DESC_REO_OWNED 4
96*5113495bSYour Name 
97*5113495bSYour Name #ifndef TID_TO_WME_AC
98*5113495bSYour Name /**
99*5113495bSYour Name  * enum hal_wme_access_category: Access category enums
100*5113495bSYour Name  * @WME_AC_BE: best effort
101*5113495bSYour Name  * @WME_AC_BK: background
102*5113495bSYour Name  * @WME_AC_VI: video
103*5113495bSYour Name  * @WME_AC_VO: voice
104*5113495bSYour Name  */
105*5113495bSYour Name enum hal_wme_access_category {
106*5113495bSYour Name 	WME_AC_BE,
107*5113495bSYour Name 	WME_AC_BK,
108*5113495bSYour Name 	WME_AC_VI,
109*5113495bSYour Name 	WME_AC_VO
110*5113495bSYour Name };
111*5113495bSYour Name 
112*5113495bSYour Name #define TID_TO_WME_AC(_tid) ( \
113*5113495bSYour Name 	(((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \
114*5113495bSYour Name 	(((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK : \
115*5113495bSYour Name 	(((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI : \
116*5113495bSYour Name 	WME_AC_VO)
117*5113495bSYour Name #endif
118*5113495bSYour Name #define HAL_NON_QOS_TID 16
119*5113495bSYour Name 
120*5113495bSYour Name /**
121*5113495bSYour Name  * enum reo_unblock_cache_type: Enum for unblock type in REO unblock command
122*5113495bSYour Name  * @UNBLOCK_RES_INDEX: Unblock a block resource
123*5113495bSYour Name  * @UNBLOCK_CACHE: Unblock cache
124*5113495bSYour Name  */
125*5113495bSYour Name enum reo_unblock_cache_type {
126*5113495bSYour Name 	UNBLOCK_RES_INDEX	= 0,
127*5113495bSYour Name 	UNBLOCK_CACHE		= 1
128*5113495bSYour Name };
129*5113495bSYour Name 
130*5113495bSYour Name /**
131*5113495bSYour Name  * enum reo_thres_index_reg: Enum for reo descriptor usage counter for
132*5113495bSYour Name  *	which threshold status is being indicated.
133*5113495bSYour Name  * @reo_desc_counter0_threshold: counter0 reached threshold
134*5113495bSYour Name  * @reo_desc_counter1_threshold: counter1 reached threshold
135*5113495bSYour Name  * @reo_desc_counter2_threshold: counter2 reached threshold
136*5113495bSYour Name  * @reo_desc_counter_sum_threshold: Total count reached threshold
137*5113495bSYour Name  */
138*5113495bSYour Name enum reo_thres_index_reg {
139*5113495bSYour Name 	reo_desc_counter0_threshold = 0,
140*5113495bSYour Name 	reo_desc_counter1_threshold = 1,
141*5113495bSYour Name 	reo_desc_counter2_threshold = 2,
142*5113495bSYour Name 	reo_desc_counter_sum_threshold = 3
143*5113495bSYour Name };
144*5113495bSYour Name 
145*5113495bSYour Name /**
146*5113495bSYour Name  * enum reo_cmd_exec_status: Enum for execution status of REO command
147*5113495bSYour Name  *
148*5113495bSYour Name  * @HAL_REO_CMD_SUCCESS: Command has successfully be executed
149*5113495bSYour Name  * @HAL_REO_CMD_BLOCKED: Command could not be executed as the queue or cache
150*5113495bSYour Name  *	was blocked
151*5113495bSYour Name  * @HAL_REO_CMD_FAILED: Command has encountered problems when executing, like
152*5113495bSYour Name  *	the queue descriptor not being valid
153*5113495bSYour Name  * @HAL_REO_CMD_RESOURCE_BLOCKED: Command could not be executed as a resource
154*5113495bSYour Name  *	was blocked
155*5113495bSYour Name  * @HAL_REO_CMD_DRAIN: Command was drained before it could be executed
156*5113495bSYour Name  */
157*5113495bSYour Name enum reo_cmd_exec_status {
158*5113495bSYour Name 	HAL_REO_CMD_SUCCESS = 0,
159*5113495bSYour Name 	HAL_REO_CMD_BLOCKED = 1,
160*5113495bSYour Name 	HAL_REO_CMD_FAILED = 2,
161*5113495bSYour Name 	HAL_REO_CMD_RESOURCE_BLOCKED = 3,
162*5113495bSYour Name 	HAL_REO_CMD_DRAIN = 0xff
163*5113495bSYour Name };
164*5113495bSYour Name 
165*5113495bSYour Name /**
166*5113495bSYour Name  * struct hal_reo_cmd_params_std - Standard REO command parameters
167*5113495bSYour Name  * @need_status: Status required for the command
168*5113495bSYour Name  * @addr_lo: Lower 32 bits of REO queue descriptor address
169*5113495bSYour Name  * @addr_hi: Upper 8 bits of REO queue descriptor address
170*5113495bSYour Name  */
171*5113495bSYour Name struct hal_reo_cmd_params_std {
172*5113495bSYour Name 	bool need_status;
173*5113495bSYour Name 	uint32_t addr_lo;
174*5113495bSYour Name 	uint8_t addr_hi;
175*5113495bSYour Name };
176*5113495bSYour Name 
177*5113495bSYour Name /**
178*5113495bSYour Name  * struct hal_reo_cmd_get_queue_stats_params - Parameters to
179*5113495bSYour Name  *                                             CMD_GET_QUEUE_STATScommand
180*5113495bSYour Name  * @clear: Clear stats after retrieving
181*5113495bSYour Name  */
182*5113495bSYour Name struct hal_reo_cmd_get_queue_stats_params {
183*5113495bSYour Name 	bool clear;
184*5113495bSYour Name };
185*5113495bSYour Name 
186*5113495bSYour Name /**
187*5113495bSYour Name  * struct hal_reo_cmd_flush_queue_params - Parameters to CMD_FLUSH_QUEUE
188*5113495bSYour Name  * @block_use_after_flush: Block usage after flush till unblock command
189*5113495bSYour Name  * @index: Blocking resource to be used
190*5113495bSYour Name  */
191*5113495bSYour Name struct hal_reo_cmd_flush_queue_params {
192*5113495bSYour Name 	bool block_use_after_flush;
193*5113495bSYour Name 	uint8_t index;
194*5113495bSYour Name };
195*5113495bSYour Name 
196*5113495bSYour Name /**
197*5113495bSYour Name  * struct hal_reo_cmd_flush_cache_params - Parameters to CMD_FLUSH_CACHE
198*5113495bSYour Name  * @fwd_mpdus_in_queue: Forward MPDUs before flushing descriptor
199*5113495bSYour Name  * @rel_block_index: Release blocking resource used earlier
200*5113495bSYour Name  * @cache_block_res_index: Blocking resource to be used
201*5113495bSYour Name  * @flush_no_inval: Flush without invalidatig descriptor
202*5113495bSYour Name  * @block_use_after_flush: Block usage after flush till unblock command
203*5113495bSYour Name  * @flush_entire_cache: Flush entire REO cache
204*5113495bSYour Name  * @flush_q_1k_desc:
205*5113495bSYour Name  */
206*5113495bSYour Name struct hal_reo_cmd_flush_cache_params {
207*5113495bSYour Name 	bool fwd_mpdus_in_queue;
208*5113495bSYour Name 	bool rel_block_index;
209*5113495bSYour Name 	uint8_t cache_block_res_index;
210*5113495bSYour Name 	bool flush_no_inval;
211*5113495bSYour Name 	bool block_use_after_flush;
212*5113495bSYour Name 	bool flush_entire_cache;
213*5113495bSYour Name 	bool flush_q_1k_desc;
214*5113495bSYour Name };
215*5113495bSYour Name 
216*5113495bSYour Name /**
217*5113495bSYour Name  * struct hal_reo_cmd_unblock_cache_params - Parameters to CMD_UNBLOCK_CACHE
218*5113495bSYour Name  * @type: Unblock type (enum reo_unblock_cache_type)
219*5113495bSYour Name  * @index: Blocking index to be released
220*5113495bSYour Name  */
221*5113495bSYour Name struct hal_reo_cmd_unblock_cache_params {
222*5113495bSYour Name 	enum reo_unblock_cache_type type;
223*5113495bSYour Name 	uint8_t index;
224*5113495bSYour Name };
225*5113495bSYour Name 
226*5113495bSYour Name /**
227*5113495bSYour Name  * struct hal_reo_cmd_flush_timeout_list_params - Parameters to
228*5113495bSYour Name  *                                                CMD_FLUSH_TIMEOUT_LIST
229*5113495bSYour Name  * @ac_list: AC timeout list to be flushed
230*5113495bSYour Name  * @min_rel_desc: Min. number of link descriptors to be release
231*5113495bSYour Name  * @min_fwd_buf: Min. number of buffers to be forwarded
232*5113495bSYour Name  */
233*5113495bSYour Name struct hal_reo_cmd_flush_timeout_list_params {
234*5113495bSYour Name 	uint8_t ac_list;
235*5113495bSYour Name 	uint16_t min_rel_desc;
236*5113495bSYour Name 	uint16_t min_fwd_buf;
237*5113495bSYour Name };
238*5113495bSYour Name 
239*5113495bSYour Name /**
240*5113495bSYour Name  * struct hal_reo_cmd_update_queue_params - Parameters to
241*5113495bSYour Name  *                                          CMD_UPDATE_RX_REO_QUEUE
242*5113495bSYour Name  * @update_rx_queue_num: Update receive queue number
243*5113495bSYour Name  * @update_vld: Update valid bit
244*5113495bSYour Name  * @update_assoc_link_desc: Update associated link descriptor
245*5113495bSYour Name  * @update_disable_dup_detect: Update duplicate detection
246*5113495bSYour Name  * @update_soft_reorder_enab: Update soft reorder enable
247*5113495bSYour Name  * @update_ac: Update access category
248*5113495bSYour Name  * @update_bar: Update BAR received bit
249*5113495bSYour Name  * @update_rty: Update retry bit
250*5113495bSYour Name  * @update_chk_2k_mode: Update chk_2k_mode setting
251*5113495bSYour Name  * @update_oor_mode: Update OOR mode setting
252*5113495bSYour Name  * @update_ba_window_size: Update BA window size
253*5113495bSYour Name  * @update_pn_check_needed: Update pn_check_needed
254*5113495bSYour Name  * @update_pn_even: Update pn_even
255*5113495bSYour Name  * @update_pn_uneven: Update pn_uneven
256*5113495bSYour Name  * @update_pn_hand_enab: Update pn_handling_enable
257*5113495bSYour Name  * @update_pn_size: Update pn_size
258*5113495bSYour Name  * @update_ignore_ampdu: Update ignore_ampdu
259*5113495bSYour Name  * @update_svld: update svld
260*5113495bSYour Name  * @update_ssn: Update SSN
261*5113495bSYour Name  * @update_seq_2k_err_detect: Update seq_2k_err_detected flag
262*5113495bSYour Name  * @update_pn_err_detect: Update pn_err_detected flag
263*5113495bSYour Name  * @update_pn_valid: Update pn_valid
264*5113495bSYour Name  * @update_pn: Update PN
265*5113495bSYour Name  * @rx_queue_num: rx_queue_num to be updated
266*5113495bSYour Name  * @vld: valid bit to be updated
267*5113495bSYour Name  * @assoc_link_desc: assoc_link_desc counter
268*5113495bSYour Name  * @disable_dup_detect: disable_dup_detect to be updated
269*5113495bSYour Name  * @soft_reorder_enab: soft_reorder_enab to be updated
270*5113495bSYour Name  * @ac: AC to be updated
271*5113495bSYour Name  * @bar: BAR flag to be updated
272*5113495bSYour Name  * @rty: RTY flag to be updated
273*5113495bSYour Name  * @chk_2k_mode: check_2k_mode setting to be updated
274*5113495bSYour Name  * @oor_mode: oor_mode to be updated
275*5113495bSYour Name  * @pn_check_needed: pn_check_needed to be updated
276*5113495bSYour Name  * @pn_even: pn_even to be updated
277*5113495bSYour Name  * @pn_uneven: pn_uneven to be updated
278*5113495bSYour Name  * @pn_hand_enab: pn_handling_enable to be updated
279*5113495bSYour Name  * @ignore_ampdu: ignore_ampdu to be updated
280*5113495bSYour Name  * @ba_window_size: BA window size to be updated
281*5113495bSYour Name  * @pn_size: pn_size to be updated
282*5113495bSYour Name  * @svld: svld flag to be updated
283*5113495bSYour Name  * @ssn: SSN to be updated
284*5113495bSYour Name  * @seq_2k_err_detect: seq_2k_err_detected flag to be updated
285*5113495bSYour Name  * @pn_err_detect: pn_err_detected flag to be updated
286*5113495bSYour Name  * @pn_31_0: PN bits 31-0
287*5113495bSYour Name  * @pn_63_32: PN bits 63-32
288*5113495bSYour Name  * @pn_95_64: PN bits 95-64
289*5113495bSYour Name  * @pn_127_96: PN bits 127-96
290*5113495bSYour Name  */
291*5113495bSYour Name struct hal_reo_cmd_update_queue_params {
292*5113495bSYour Name 	uint32_t update_rx_queue_num:1,
293*5113495bSYour Name 		update_vld:1,
294*5113495bSYour Name 		update_assoc_link_desc:1,
295*5113495bSYour Name 		update_disable_dup_detect:1,
296*5113495bSYour Name 		update_soft_reorder_enab:1,
297*5113495bSYour Name 		update_ac:1,
298*5113495bSYour Name 		update_bar:1,
299*5113495bSYour Name 		update_rty:1,
300*5113495bSYour Name 		update_chk_2k_mode:1,
301*5113495bSYour Name 		update_oor_mode:1,
302*5113495bSYour Name 		update_ba_window_size:1,
303*5113495bSYour Name 		update_pn_check_needed:1,
304*5113495bSYour Name 		update_pn_even:1,
305*5113495bSYour Name 		update_pn_uneven:1,
306*5113495bSYour Name 		update_pn_hand_enab:1,
307*5113495bSYour Name 		update_pn_size:1,
308*5113495bSYour Name 		update_ignore_ampdu:1,
309*5113495bSYour Name 		update_svld:1,
310*5113495bSYour Name 		update_ssn:1,
311*5113495bSYour Name 		update_seq_2k_err_detect:1,
312*5113495bSYour Name 		update_pn_err_detect:1,
313*5113495bSYour Name 		update_pn_valid:1,
314*5113495bSYour Name 		update_pn:1;
315*5113495bSYour Name 	uint32_t rx_queue_num:16,
316*5113495bSYour Name 		vld:1,
317*5113495bSYour Name 		assoc_link_desc:2,
318*5113495bSYour Name 		disable_dup_detect:1,
319*5113495bSYour Name 		soft_reorder_enab:1,
320*5113495bSYour Name 		ac:2,
321*5113495bSYour Name 		bar:1,
322*5113495bSYour Name 		rty:1,
323*5113495bSYour Name 		chk_2k_mode:1,
324*5113495bSYour Name 		oor_mode:1,
325*5113495bSYour Name 		pn_check_needed:1,
326*5113495bSYour Name 		pn_even:1,
327*5113495bSYour Name 		pn_uneven:1,
328*5113495bSYour Name 		pn_hand_enab:1,
329*5113495bSYour Name 		ignore_ampdu:1;
330*5113495bSYour Name 	uint32_t ba_window_size:15,
331*5113495bSYour Name 		pn_size:2,
332*5113495bSYour Name 		svld:1,
333*5113495bSYour Name 		ssn:12,
334*5113495bSYour Name 		seq_2k_err_detect:1,
335*5113495bSYour Name 		pn_err_detect:1;
336*5113495bSYour Name 	uint32_t pn_31_0:32;
337*5113495bSYour Name 	uint32_t pn_63_32:32;
338*5113495bSYour Name 	uint32_t pn_95_64:32;
339*5113495bSYour Name 	uint32_t pn_127_96:32;
340*5113495bSYour Name };
341*5113495bSYour Name 
342*5113495bSYour Name /**
343*5113495bSYour Name  * struct hal_reo_cmd_params - Common structure to pass REO command parameters
344*5113495bSYour Name  * @std: Standard parameters
345*5113495bSYour Name  * @u: Union of various REO command parameters
346*5113495bSYour Name  */
347*5113495bSYour Name struct hal_reo_cmd_params {
348*5113495bSYour Name 	struct hal_reo_cmd_params_std std;
349*5113495bSYour Name 	union {
350*5113495bSYour Name 		struct hal_reo_cmd_get_queue_stats_params stats_params;
351*5113495bSYour Name 		struct hal_reo_cmd_flush_queue_params fl_queue_params;
352*5113495bSYour Name 		struct hal_reo_cmd_flush_cache_params fl_cache_params;
353*5113495bSYour Name 		struct hal_reo_cmd_unblock_cache_params unblk_cache_params;
354*5113495bSYour Name 		struct hal_reo_cmd_flush_timeout_list_params fl_tim_list_params;
355*5113495bSYour Name 		struct hal_reo_cmd_update_queue_params upd_queue_params;
356*5113495bSYour Name 	} u;
357*5113495bSYour Name };
358*5113495bSYour Name 
359*5113495bSYour Name /**
360*5113495bSYour Name  * struct hal_reo_status_header - Common REO status header
361*5113495bSYour Name  * @cmd_num: Command number
362*5113495bSYour Name  * @exec_time: execution time
363*5113495bSYour Name  * @status: command execution status
364*5113495bSYour Name  * @tstamp: Timestamp of status updated
365*5113495bSYour Name  */
366*5113495bSYour Name struct hal_reo_status_header {
367*5113495bSYour Name 	uint16_t cmd_num;
368*5113495bSYour Name 	uint16_t exec_time;
369*5113495bSYour Name 	enum reo_cmd_exec_status status;
370*5113495bSYour Name 	uint32_t tstamp;
371*5113495bSYour Name };
372*5113495bSYour Name 
373*5113495bSYour Name /**
374*5113495bSYour Name  * struct hal_reo_queue_status - REO queue status structure
375*5113495bSYour Name  * @header: Common REO status header
376*5113495bSYour Name  * @ssn: SSN of current BA window
377*5113495bSYour Name  * @curr_idx: last forwarded pkt
378*5113495bSYour Name  * @pn_31_0:
379*5113495bSYour Name  * @pn_63_32:
380*5113495bSYour Name  * @pn_95_64:
381*5113495bSYour Name  * @pn_127_96: PN number bits extracted from IV field
382*5113495bSYour Name  * @last_rx_enq_tstamp: Last enqueue timestamp
383*5113495bSYour Name  * @last_rx_deq_tstamp: Last dequeue timestamp
384*5113495bSYour Name  * @rx_bitmap_31_0:
385*5113495bSYour Name  * @rx_bitmap_63_32:
386*5113495bSYour Name  * @rx_bitmap_95_64:
387*5113495bSYour Name  * @rx_bitmap_127_96:
388*5113495bSYour Name  * @rx_bitmap_159_128:
389*5113495bSYour Name  * @rx_bitmap_191_160:
390*5113495bSYour Name  * @rx_bitmap_223_192:
391*5113495bSYour Name  * @rx_bitmap_255_224: bits of rx bitmap where each bit corresponds to a frame
392*5113495bSYour Name  *	               held in re-order queue
393*5113495bSYour Name  * @curr_mpdu_cnt: Number of MPDUs in the queue
394*5113495bSYour Name  * @curr_msdu_cnt: Number of MSDUs in the queue
395*5113495bSYour Name  * @fwd_timeout_cnt: Frames forwarded due to timeout
396*5113495bSYour Name  * @fwd_bar_cnt: Frames forwarded BAR frame
397*5113495bSYour Name  * @dup_cnt: duplicate frames detected
398*5113495bSYour Name  * @frms_in_order_cnt: Frames received in order
399*5113495bSYour Name  * @bar_rcvd_cnt: BAR frame count
400*5113495bSYour Name  * @mpdu_frms_cnt: MPDUs processed by REO
401*5113495bSYour Name  * @msdu_frms_cnt: MSDUs processed by REO
402*5113495bSYour Name  * @total_cnt: frames processed by REO
403*5113495bSYour Name  * @late_recv_mpdu_cnt: received after window had moved on
404*5113495bSYour Name  * @win_jump_2k: 2K jump count
405*5113495bSYour Name  * @hole_cnt: sequence hole count
406*5113495bSYour Name  */
407*5113495bSYour Name struct hal_reo_queue_status {
408*5113495bSYour Name 	struct hal_reo_status_header header;
409*5113495bSYour Name 	uint16_t ssn;
410*5113495bSYour Name 	uint8_t curr_idx;
411*5113495bSYour Name 	uint32_t pn_31_0, pn_63_32, pn_95_64, pn_127_96;
412*5113495bSYour Name 	uint32_t last_rx_enq_tstamp, last_rx_deq_tstamp;
413*5113495bSYour Name 	uint32_t rx_bitmap_31_0, rx_bitmap_63_32, rx_bitmap_95_64;
414*5113495bSYour Name 	uint32_t rx_bitmap_127_96, rx_bitmap_159_128, rx_bitmap_191_160;
415*5113495bSYour Name 	uint32_t rx_bitmap_223_192, rx_bitmap_255_224;
416*5113495bSYour Name 	uint8_t curr_mpdu_cnt, curr_msdu_cnt;
417*5113495bSYour Name 	uint8_t fwd_timeout_cnt, fwd_bar_cnt;
418*5113495bSYour Name 	uint16_t dup_cnt;
419*5113495bSYour Name 	uint32_t frms_in_order_cnt;
420*5113495bSYour Name 	uint8_t bar_rcvd_cnt;
421*5113495bSYour Name 	uint32_t mpdu_frms_cnt, msdu_frms_cnt, total_cnt;
422*5113495bSYour Name 	uint16_t late_recv_mpdu_cnt;
423*5113495bSYour Name 	uint8_t win_jump_2k;
424*5113495bSYour Name 	uint16_t hole_cnt;
425*5113495bSYour Name };
426*5113495bSYour Name 
427*5113495bSYour Name /**
428*5113495bSYour Name  * struct hal_reo_flush_queue_status - FLUSH_QUEUE status structure
429*5113495bSYour Name  * @header: Common REO status header
430*5113495bSYour Name  * @error: Error detected
431*5113495bSYour Name  */
432*5113495bSYour Name struct hal_reo_flush_queue_status {
433*5113495bSYour Name 	struct hal_reo_status_header header;
434*5113495bSYour Name 	bool error;
435*5113495bSYour Name };
436*5113495bSYour Name 
437*5113495bSYour Name /**
438*5113495bSYour Name  * struct hal_reo_flush_cache_status - FLUSH_CACHE status structure
439*5113495bSYour Name  * @header: Common REO status header
440*5113495bSYour Name  * @error: Error detected
441*5113495bSYour Name  * @block_error: Blocking related error
442*5113495bSYour Name  * @cache_flush_status: Cache hit/miss
443*5113495bSYour Name  * @cache_flush_status_desc_type: type of descriptor flushed
444*5113495bSYour Name  * @cache_flush_cnt: number of lines actually flushed
445*5113495bSYour Name  */
446*5113495bSYour Name struct hal_reo_flush_cache_status {
447*5113495bSYour Name 	struct hal_reo_status_header header;
448*5113495bSYour Name 	bool error;
449*5113495bSYour Name 	uint8_t block_error;
450*5113495bSYour Name 	bool cache_flush_status;
451*5113495bSYour Name 	uint8_t cache_flush_status_desc_type;
452*5113495bSYour Name 	uint8_t cache_flush_cnt;
453*5113495bSYour Name };
454*5113495bSYour Name 
455*5113495bSYour Name /**
456*5113495bSYour Name  * struct hal_reo_unblk_cache_status - UNBLOCK_CACHE status structure
457*5113495bSYour Name  * @header: Common REO status header
458*5113495bSYour Name  * @error: error detected
459*5113495bSYour Name  * @unblock_type: resource or cache
460*5113495bSYour Name  */
461*5113495bSYour Name struct hal_reo_unblk_cache_status {
462*5113495bSYour Name 	struct hal_reo_status_header header;
463*5113495bSYour Name 	bool error;
464*5113495bSYour Name 	enum reo_unblock_cache_type unblock_type;
465*5113495bSYour Name };
466*5113495bSYour Name 
467*5113495bSYour Name /**
468*5113495bSYour Name  * struct hal_reo_flush_timeout_list_status - FLUSH_TIMEOUT_LIST status
469*5113495bSYour Name  *                                            structure
470*5113495bSYour Name  * @header: Common REO status header
471*5113495bSYour Name  * @error: error detected
472*5113495bSYour Name  * @list_empty: timeout list empty
473*5113495bSYour Name  * @rel_desc_cnt: number of link descriptors released
474*5113495bSYour Name  * @fwd_buf_cnt: number of buffers forwarded to REO destination ring
475*5113495bSYour Name  */
476*5113495bSYour Name struct hal_reo_flush_timeout_list_status {
477*5113495bSYour Name 	struct hal_reo_status_header header;
478*5113495bSYour Name 	bool error;
479*5113495bSYour Name 	bool list_empty;
480*5113495bSYour Name 	uint16_t rel_desc_cnt;
481*5113495bSYour Name 	uint16_t fwd_buf_cnt;
482*5113495bSYour Name };
483*5113495bSYour Name 
484*5113495bSYour Name /**
485*5113495bSYour Name  * struct hal_reo_desc_thres_reached_status - desc_thres_reached status
486*5113495bSYour Name  *                                            structure
487*5113495bSYour Name  * @header: Common REO status header
488*5113495bSYour Name  * @thres_index: Index of descriptor threshold counter
489*5113495bSYour Name  * @link_desc_counter0: descriptor counter value
490*5113495bSYour Name  * @link_desc_counter1: descriptor counter value
491*5113495bSYour Name  * @link_desc_counter2: descriptor counter value
492*5113495bSYour Name  * @link_desc_counter_sum: overall descriptor count
493*5113495bSYour Name  */
494*5113495bSYour Name struct hal_reo_desc_thres_reached_status {
495*5113495bSYour Name 	struct hal_reo_status_header header;
496*5113495bSYour Name 	enum reo_thres_index_reg thres_index;
497*5113495bSYour Name 	uint32_t link_desc_counter0, link_desc_counter1, link_desc_counter2;
498*5113495bSYour Name 	uint32_t link_desc_counter_sum;
499*5113495bSYour Name };
500*5113495bSYour Name 
501*5113495bSYour Name /**
502*5113495bSYour Name  * struct hal_reo_update_rx_queue_status - UPDATE_RX_QUEUE status structure
503*5113495bSYour Name  * @header: Common REO status header
504*5113495bSYour Name  */
505*5113495bSYour Name struct hal_reo_update_rx_queue_status {
506*5113495bSYour Name 	struct hal_reo_status_header header;
507*5113495bSYour Name };
508*5113495bSYour Name 
509*5113495bSYour Name /**
510*5113495bSYour Name  * union hal_reo_status - Union to pass REO status to callbacks
511*5113495bSYour Name  * @queue_status: Refer to struct hal_reo_queue_status
512*5113495bSYour Name  * @fl_cache_status: Refer to struct hal_reo_flush_cache_status
513*5113495bSYour Name  * @fl_queue_status: Refer to struct hal_reo_flush_queue_status
514*5113495bSYour Name  * @fl_timeout_status: Refer to struct hal_reo_flush_timeout_list_status
515*5113495bSYour Name  * @unblk_cache_status: Refer to struct hal_reo_unblk_cache_status
516*5113495bSYour Name  * @thres_status: struct hal_reo_desc_thres_reached_status
517*5113495bSYour Name  * @rx_queue_status: struct hal_reo_update_rx_queue_status
518*5113495bSYour Name  */
519*5113495bSYour Name union hal_reo_status {
520*5113495bSYour Name 	struct hal_reo_queue_status queue_status;
521*5113495bSYour Name 	struct hal_reo_flush_cache_status fl_cache_status;
522*5113495bSYour Name 	struct hal_reo_flush_queue_status fl_queue_status;
523*5113495bSYour Name 	struct hal_reo_flush_timeout_list_status fl_timeout_status;
524*5113495bSYour Name 	struct hal_reo_unblk_cache_status unblk_cache_status;
525*5113495bSYour Name 	struct hal_reo_desc_thres_reached_status thres_status;
526*5113495bSYour Name 	struct hal_reo_update_rx_queue_status rx_queue_status;
527*5113495bSYour Name };
528*5113495bSYour Name 
529*5113495bSYour Name #ifdef HAL_DISABLE_NON_BA_2K_JUMP_ERROR
hal_update_non_ba_win_size(int tid,uint32_t ba_window_size)530*5113495bSYour Name static inline uint32_t hal_update_non_ba_win_size(int tid,
531*5113495bSYour Name 						  uint32_t ba_window_size)
532*5113495bSYour Name {
533*5113495bSYour Name 	return ba_window_size;
534*5113495bSYour Name }
535*5113495bSYour Name #else
hal_update_non_ba_win_size(int tid,uint32_t ba_window_size)536*5113495bSYour Name static inline uint32_t hal_update_non_ba_win_size(int tid,
537*5113495bSYour Name 						  uint32_t ba_window_size)
538*5113495bSYour Name {
539*5113495bSYour Name 	if ((ba_window_size == 1) && (tid != HAL_NON_QOS_TID))
540*5113495bSYour Name 		ba_window_size++;
541*5113495bSYour Name 
542*5113495bSYour Name 	return ba_window_size;
543*5113495bSYour Name }
544*5113495bSYour Name #endif
545*5113495bSYour Name 
546*5113495bSYour Name #define BLOCK_RES_MASK		0xF
hal_find_one_bit(uint8_t x)547*5113495bSYour Name static inline uint8_t hal_find_one_bit(uint8_t x)
548*5113495bSYour Name {
549*5113495bSYour Name 	uint8_t y = (x & (~x + 1)) & BLOCK_RES_MASK;
550*5113495bSYour Name 	uint8_t pos;
551*5113495bSYour Name 
552*5113495bSYour Name 	for (pos = 0; y; y >>= 1)
553*5113495bSYour Name 		pos++;
554*5113495bSYour Name 
555*5113495bSYour Name 	return pos-1;
556*5113495bSYour Name }
557*5113495bSYour Name 
hal_find_zero_bit(uint8_t x)558*5113495bSYour Name static inline uint8_t hal_find_zero_bit(uint8_t x)
559*5113495bSYour Name {
560*5113495bSYour Name 	uint8_t y = (~x & (x+1)) & BLOCK_RES_MASK;
561*5113495bSYour Name 	uint8_t pos;
562*5113495bSYour Name 
563*5113495bSYour Name 	for (pos = 0; y; y >>= 1)
564*5113495bSYour Name 		pos++;
565*5113495bSYour Name 
566*5113495bSYour Name 	return pos-1;
567*5113495bSYour Name }
568*5113495bSYour Name 
569*5113495bSYour Name /* REO command ring routines */
570*5113495bSYour Name 
571*5113495bSYour Name /**
572*5113495bSYour Name  * hal_uniform_desc_hdr_setup() - setup reo_queue_ext descriptor
573*5113495bSYour Name  * @desc: descriptor to setup
574*5113495bSYour Name  * @owner: owner info
575*5113495bSYour Name  * @buffer_type: buffer type
576*5113495bSYour Name  */
577*5113495bSYour Name static inline void
hal_uniform_desc_hdr_setup(uint32_t * desc,uint32_t owner,uint32_t buffer_type)578*5113495bSYour Name hal_uniform_desc_hdr_setup(uint32_t *desc, uint32_t owner, uint32_t buffer_type)
579*5113495bSYour Name {
580*5113495bSYour Name 	HAL_DESC_SET_FIELD(desc, HAL_UNIFORM_DESCRIPTOR_HEADER, OWNER,
581*5113495bSYour Name 			   owner);
582*5113495bSYour Name 	HAL_DESC_SET_FIELD(desc, HAL_UNIFORM_DESCRIPTOR_HEADER, BUFFER_TYPE,
583*5113495bSYour Name 			   buffer_type);
584*5113495bSYour Name }
585*5113495bSYour Name 
586*5113495bSYour Name /**
587*5113495bSYour Name  * hal_reo_send_cmd() - Send reo cmd using the params provided.
588*5113495bSYour Name  * @hal_soc_hdl: HAL soc handle
589*5113495bSYour Name  * @hal_ring_hdl: srng handle
590*5113495bSYour Name  * @cmd: cmd ID
591*5113495bSYour Name  * @cmd_params: command params
592*5113495bSYour Name  *
593*5113495bSYour Name  * Return: cmd number
594*5113495bSYour Name  */
595*5113495bSYour Name static inline int
hal_reo_send_cmd(hal_soc_handle_t hal_soc_hdl,hal_ring_handle_t hal_ring_hdl,enum hal_reo_cmd_type cmd,struct hal_reo_cmd_params * cmd_params)596*5113495bSYour Name hal_reo_send_cmd(hal_soc_handle_t hal_soc_hdl,
597*5113495bSYour Name 		 hal_ring_handle_t  hal_ring_hdl,
598*5113495bSYour Name 		 enum hal_reo_cmd_type cmd,
599*5113495bSYour Name 		 struct hal_reo_cmd_params *cmd_params)
600*5113495bSYour Name {
601*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
602*5113495bSYour Name 
603*5113495bSYour Name 	if (!hal_soc || !hal_soc->ops) {
604*5113495bSYour Name 		hal_err("hal handle is NULL");
605*5113495bSYour Name 		QDF_BUG(0);
606*5113495bSYour Name 		return -EINVAL;
607*5113495bSYour Name 	}
608*5113495bSYour Name 
609*5113495bSYour Name 	if (hal_soc->ops->hal_reo_send_cmd)
610*5113495bSYour Name 		return hal_soc->ops->hal_reo_send_cmd(hal_soc_hdl, hal_ring_hdl,
611*5113495bSYour Name 						      cmd, cmd_params);
612*5113495bSYour Name 
613*5113495bSYour Name 	return -EINVAL;
614*5113495bSYour Name }
615*5113495bSYour Name 
616*5113495bSYour Name #ifdef DP_UMAC_HW_RESET_SUPPORT
617*5113495bSYour Name /**
618*5113495bSYour Name  * hal_register_reo_send_cmd() - Register Reo send command callback.
619*5113495bSYour Name  * @hal_soc_hdl: HAL soc handle
620*5113495bSYour Name  *
621*5113495bSYour Name  * Return: void
622*5113495bSYour Name  */
hal_register_reo_send_cmd(hal_soc_handle_t hal_soc_hdl)623*5113495bSYour Name static inline void hal_register_reo_send_cmd(hal_soc_handle_t hal_soc_hdl)
624*5113495bSYour Name {
625*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
626*5113495bSYour Name 
627*5113495bSYour Name 	if (!hal_soc || !hal_soc->ops) {
628*5113495bSYour Name 		hal_err("hal handle is NULL");
629*5113495bSYour Name 		QDF_BUG(0);
630*5113495bSYour Name 		return;
631*5113495bSYour Name 	}
632*5113495bSYour Name 
633*5113495bSYour Name 	if (hal_soc->ops->hal_register_reo_send_cmd)
634*5113495bSYour Name 		hal_soc->ops->hal_register_reo_send_cmd(hal_soc);
635*5113495bSYour Name }
636*5113495bSYour Name 
637*5113495bSYour Name /**
638*5113495bSYour Name  * hal_unregister_reo_send_cmd() - Unregister Reo send command callback.
639*5113495bSYour Name  * @hal_soc_hdl: HAL soc handle
640*5113495bSYour Name  *
641*5113495bSYour Name  * Return: void
642*5113495bSYour Name  */
643*5113495bSYour Name static inline void
hal_unregister_reo_send_cmd(hal_soc_handle_t hal_soc_hdl)644*5113495bSYour Name hal_unregister_reo_send_cmd(hal_soc_handle_t hal_soc_hdl)
645*5113495bSYour Name {
646*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
647*5113495bSYour Name 
648*5113495bSYour Name 	if (!hal_soc || !hal_soc->ops) {
649*5113495bSYour Name 		hal_err("hal handle is NULL");
650*5113495bSYour Name 		QDF_BUG(0);
651*5113495bSYour Name 		return;
652*5113495bSYour Name 	}
653*5113495bSYour Name 
654*5113495bSYour Name 	if (hal_soc->ops->hal_unregister_reo_send_cmd)
655*5113495bSYour Name 		return hal_soc->ops->hal_unregister_reo_send_cmd(hal_soc);
656*5113495bSYour Name }
657*5113495bSYour Name 
658*5113495bSYour Name static inline void
hal_reset_rx_reo_tid_queue(hal_soc_handle_t hal_soc_hdl,void * hw_qdesc_vaddr,uint32_t size)659*5113495bSYour Name hal_reset_rx_reo_tid_queue(hal_soc_handle_t hal_soc_hdl, void *hw_qdesc_vaddr,
660*5113495bSYour Name 			   uint32_t size)
661*5113495bSYour Name {
662*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
663*5113495bSYour Name 
664*5113495bSYour Name 	if (hal_soc->ops->hal_reset_rx_reo_tid_q)
665*5113495bSYour Name 		hal_soc->ops->hal_reset_rx_reo_tid_q(hal_soc, hw_qdesc_vaddr,
666*5113495bSYour Name 						     size);
667*5113495bSYour Name }
668*5113495bSYour Name 
669*5113495bSYour Name #endif
670*5113495bSYour Name 
671*5113495bSYour Name static inline QDF_STATUS
hal_reo_status_update(hal_soc_handle_t hal_soc_hdl,hal_ring_desc_t reo_desc,void * st_handle,uint32_t tlv,int * num_ref)672*5113495bSYour Name hal_reo_status_update(hal_soc_handle_t hal_soc_hdl,
673*5113495bSYour Name 		      hal_ring_desc_t reo_desc, void *st_handle,
674*5113495bSYour Name 		      uint32_t tlv, int *num_ref)
675*5113495bSYour Name {
676*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
677*5113495bSYour Name 
678*5113495bSYour Name 	if (hal_soc->ops->hal_reo_send_cmd)
679*5113495bSYour Name 		return hal_soc->ops->hal_reo_status_update(hal_soc_hdl,
680*5113495bSYour Name 							   reo_desc,
681*5113495bSYour Name 							   st_handle,
682*5113495bSYour Name 							   tlv, num_ref);
683*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
684*5113495bSYour Name }
685*5113495bSYour Name 
686*5113495bSYour Name /* REO Status ring routines */
hal_reo_qdesc_setup(hal_soc_handle_t hal_soc_hdl,int tid,uint32_t ba_window_size,uint32_t start_seq,void * hw_qdesc_vaddr,qdf_dma_addr_t hw_qdesc_paddr,int pn_type,uint8_t vdev_stats_id)687*5113495bSYour Name static inline void hal_reo_qdesc_setup(hal_soc_handle_t hal_soc_hdl, int tid,
688*5113495bSYour Name 				       uint32_t ba_window_size,
689*5113495bSYour Name 			 uint32_t start_seq, void *hw_qdesc_vaddr,
690*5113495bSYour Name 			 qdf_dma_addr_t hw_qdesc_paddr,
691*5113495bSYour Name 			 int pn_type, uint8_t vdev_stats_id)
692*5113495bSYour Name {
693*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
694*5113495bSYour Name 
695*5113495bSYour Name 	if (!hal_soc || !hal_soc->ops) {
696*5113495bSYour Name 		hal_err("hal handle is NULL");
697*5113495bSYour Name 		QDF_BUG(0);
698*5113495bSYour Name 		return;
699*5113495bSYour Name 	}
700*5113495bSYour Name 
701*5113495bSYour Name 	if (hal_soc->ops->hal_reo_qdesc_setup)
702*5113495bSYour Name 		hal_soc->ops->hal_reo_qdesc_setup(hal_soc_hdl, tid,
703*5113495bSYour Name 						  ba_window_size, start_seq,
704*5113495bSYour Name 						  hw_qdesc_vaddr,
705*5113495bSYour Name 						  hw_qdesc_paddr, pn_type,
706*5113495bSYour Name 						  vdev_stats_id);
707*5113495bSYour Name }
708*5113495bSYour Name 
709*5113495bSYour Name /**
710*5113495bSYour Name  * hal_get_ba_aging_timeout - Retrieve BA aging timeout
711*5113495bSYour Name  * @hal_soc_hdl: Opaque HAL SOC handle
712*5113495bSYour Name  * @ac: Access category
713*5113495bSYour Name  * @value: timeout duration in millisec
714*5113495bSYour Name  */
hal_get_ba_aging_timeout(hal_soc_handle_t hal_soc_hdl,uint8_t ac,uint32_t * value)715*5113495bSYour Name static inline void hal_get_ba_aging_timeout(hal_soc_handle_t hal_soc_hdl,
716*5113495bSYour Name 					    uint8_t ac,
717*5113495bSYour Name 					    uint32_t *value)
718*5113495bSYour Name {
719*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
720*5113495bSYour Name 
721*5113495bSYour Name 	hal_soc->ops->hal_get_ba_aging_timeout(hal_soc_hdl, ac, value);
722*5113495bSYour Name }
723*5113495bSYour Name 
724*5113495bSYour Name /**
725*5113495bSYour Name  * hal_set_ba_aging_timeout() - Set BA aging timeout
726*5113495bSYour Name  * @hal_soc_hdl: Opaque HAL SOC handle
727*5113495bSYour Name  * @ac: Access category
728*5113495bSYour Name  * @value: timeout duration value in millisec
729*5113495bSYour Name  */
hal_set_ba_aging_timeout(hal_soc_handle_t hal_soc_hdl,uint8_t ac,uint32_t value)730*5113495bSYour Name static inline void hal_set_ba_aging_timeout(hal_soc_handle_t hal_soc_hdl,
731*5113495bSYour Name 					    uint8_t ac,
732*5113495bSYour Name 					    uint32_t value)
733*5113495bSYour Name {
734*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
735*5113495bSYour Name 
736*5113495bSYour Name 	hal_soc->ops->hal_set_ba_aging_timeout(hal_soc_hdl, ac, value);
737*5113495bSYour Name }
738*5113495bSYour Name 
739*5113495bSYour Name /**
740*5113495bSYour Name  * hal_get_reo_reg_base_offset() - Get REO register base offset
741*5113495bSYour Name  * @hal_soc_hdl: HAL soc handle
742*5113495bSYour Name  *
743*5113495bSYour Name  * Return: REO register base
744*5113495bSYour Name  */
hal_get_reo_reg_base_offset(hal_soc_handle_t hal_soc_hdl)745*5113495bSYour Name static inline uint32_t hal_get_reo_reg_base_offset(hal_soc_handle_t hal_soc_hdl)
746*5113495bSYour Name {
747*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
748*5113495bSYour Name 
749*5113495bSYour Name 	return hal_soc->ops->hal_get_reo_reg_base_offset();
750*5113495bSYour Name }
751*5113495bSYour Name 
752*5113495bSYour Name static inline uint32_t
hal_gen_reo_remap_val(hal_soc_handle_t hal_soc_hdl,enum hal_reo_remap_reg remap_reg,uint8_t * ix0_map)753*5113495bSYour Name hal_gen_reo_remap_val(hal_soc_handle_t hal_soc_hdl,
754*5113495bSYour Name 		      enum hal_reo_remap_reg remap_reg,
755*5113495bSYour Name 		      uint8_t *ix0_map)
756*5113495bSYour Name {
757*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
758*5113495bSYour Name 
759*5113495bSYour Name 	if (!hal_soc || !hal_soc->ops) {
760*5113495bSYour Name 		hal_err("hal handle is NULL");
761*5113495bSYour Name 		QDF_BUG(0);
762*5113495bSYour Name 		return 0;
763*5113495bSYour Name 	}
764*5113495bSYour Name 
765*5113495bSYour Name 	if (hal_soc->ops->hal_gen_reo_remap_val)
766*5113495bSYour Name 		return hal_soc->ops->hal_gen_reo_remap_val(remap_reg, ix0_map);
767*5113495bSYour Name 
768*5113495bSYour Name 	return 0;
769*5113495bSYour Name }
770*5113495bSYour Name 
771*5113495bSYour Name static inline uint8_t
hal_get_tlv_hdr_size(hal_soc_handle_t hal_soc_hdl)772*5113495bSYour Name hal_get_tlv_hdr_size(hal_soc_handle_t hal_soc_hdl)
773*5113495bSYour Name {
774*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
775*5113495bSYour Name 
776*5113495bSYour Name 	if (hal_soc->ops->hal_get_tlv_hdr_size)
777*5113495bSYour Name 		return hal_soc->ops->hal_get_tlv_hdr_size();
778*5113495bSYour Name 
779*5113495bSYour Name 	return 0;
780*5113495bSYour Name }
781*5113495bSYour Name /* Function Proto-types */
782*5113495bSYour Name 
783*5113495bSYour Name /**
784*5113495bSYour Name  * hal_reo_init_cmd_ring() - Initialize descriptors of REO command SRNG
785*5113495bSYour Name  *                           with command number
786*5113495bSYour Name  * @hal_soc_hdl: Handle to HAL SoC structure
787*5113495bSYour Name  * @hal_ring_hdl: Handle to HAL SRNG structure
788*5113495bSYour Name  *
789*5113495bSYour Name  * Return: none
790*5113495bSYour Name  */
791*5113495bSYour Name void hal_reo_init_cmd_ring(hal_soc_handle_t hal_soc_hdl,
792*5113495bSYour Name 			   hal_ring_handle_t hal_ring_hdl);
793*5113495bSYour Name 
794*5113495bSYour Name #ifdef REO_SHARED_QREF_TABLE_EN
795*5113495bSYour Name /**
796*5113495bSYour Name  * hal_reo_shared_qaddr_setup(): Setup reo qref LUT
797*5113495bSYour Name  * @hal_soc_hdl: Hal soc pointer
798*5113495bSYour Name  * @reo_qref: REO QREF table to populate
799*5113495bSYour Name  *
800*5113495bSYour Name  * Allocate MLO and Non MLO table for storing REO queue
801*5113495bSYour Name  * reference pointers
802*5113495bSYour Name  *
803*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success else a QDF error.
804*5113495bSYour Name  */
805*5113495bSYour Name static inline QDF_STATUS
hal_reo_shared_qaddr_setup(hal_soc_handle_t hal_soc_hdl,struct reo_queue_ref_table * reo_qref)806*5113495bSYour Name hal_reo_shared_qaddr_setup(hal_soc_handle_t hal_soc_hdl,
807*5113495bSYour Name 			   struct reo_queue_ref_table *reo_qref)
808*5113495bSYour Name {
809*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
810*5113495bSYour Name 
811*5113495bSYour Name 	if (hal_soc->ops->hal_reo_shared_qaddr_setup)
812*5113495bSYour Name 		return hal_soc->ops->hal_reo_shared_qaddr_setup(hal_soc_hdl,
813*5113495bSYour Name 								reo_qref);
814*5113495bSYour Name 
815*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
816*5113495bSYour Name }
817*5113495bSYour Name 
818*5113495bSYour Name /**
819*5113495bSYour Name  * hal_reo_shared_qaddr_detach(): Detach reo qref LUT
820*5113495bSYour Name  * @hal_soc_hdl: Hal soc pointer
821*5113495bSYour Name  *
822*5113495bSYour Name  * Detach MLO and Non MLO table start addr to HW reg
823*5113495bSYour Name  *
824*5113495bSYour Name  * Return: void
825*5113495bSYour Name  */
826*5113495bSYour Name static inline void
hal_reo_shared_qaddr_detach(hal_soc_handle_t hal_soc_hdl)827*5113495bSYour Name hal_reo_shared_qaddr_detach(hal_soc_handle_t hal_soc_hdl)
828*5113495bSYour Name {
829*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
830*5113495bSYour Name 
831*5113495bSYour Name 	if (hal_soc->ops->hal_reo_shared_qaddr_detach)
832*5113495bSYour Name 		return hal_soc->ops->hal_reo_shared_qaddr_detach(hal_soc_hdl);
833*5113495bSYour Name }
834*5113495bSYour Name 
835*5113495bSYour Name #else
836*5113495bSYour Name static inline QDF_STATUS
hal_reo_shared_qaddr_setup(hal_soc_handle_t hal_soc_hdl,struct reo_queue_ref_table * reo_qref)837*5113495bSYour Name hal_reo_shared_qaddr_setup(hal_soc_handle_t hal_soc_hdl,
838*5113495bSYour Name 			   struct reo_queue_ref_table *reo_qref)
839*5113495bSYour Name {
840*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
841*5113495bSYour Name }
842*5113495bSYour Name 
843*5113495bSYour Name static inline void
hal_reo_shared_qaddr_detach(hal_soc_handle_t hal_soc_hdl)844*5113495bSYour Name hal_reo_shared_qaddr_detach(hal_soc_handle_t hal_soc_hdl) {}
845*5113495bSYour Name #endif /* REO_SHARED_QREF_TABLE_EN */
846*5113495bSYour Name #endif /* _HAL_REO_H */
847