blob: ad2cad2a4b6961fbeec5bf21ab737e6291539966 [file] [log] [blame]
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001/*
Akshay Kosigi6a206752019-06-10 23:14:52 +05302 * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07003 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +053019#include "hal_api.h"
Balamurugan Mahalingamf72cb1f2018-06-25 12:18:34 +053020#include "hal_hw_headers.h"
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -070021#include "hal_reo.h"
22#include "hal_tx.h"
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +053023#include "hal_rx.h"
Pratik Gandhidc82a772018-01-30 18:57:05 +053024#include "qdf_module.h"
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -070025
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +053026/* TODO: See if the following definition is available in HW headers */
27#define HAL_REO_OWNED 4
28#define HAL_REO_QUEUE_DESC 8
29#define HAL_REO_QUEUE_EXT_DESC 9
30
31/* TODO: Using associated link desc counter 1 for Rx. Check with FW on
32 * how these counters are assigned
33 */
34#define HAL_RX_LINK_DESC_CNTR 1
35/* TODO: Following definition should be from HW headers */
36#define HAL_DESC_REO_OWNED 4
37
38/**
39 * hal_uniform_desc_hdr_setup - setup reo_queue_ext descritpro
40 * @owner - owner info
41 * @buffer_type - buffer type
42 */
43static inline void hal_uniform_desc_hdr_setup(uint32_t *desc, uint32_t owner,
44 uint32_t buffer_type)
45{
46 HAL_DESC_SET_FIELD(desc, UNIFORM_DESCRIPTOR_HEADER_0, OWNER,
47 owner);
48 HAL_DESC_SET_FIELD(desc, UNIFORM_DESCRIPTOR_HEADER_0, BUFFER_TYPE,
49 buffer_type);
50}
51
52#ifndef TID_TO_WME_AC
53#define WME_AC_BE 0 /* best effort */
54#define WME_AC_BK 1 /* background */
55#define WME_AC_VI 2 /* video */
56#define WME_AC_VO 3 /* voice */
57
58#define TID_TO_WME_AC(_tid) ( \
59 (((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \
60 (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK : \
61 (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI : \
62 WME_AC_VO)
63#endif
64#define HAL_NON_QOS_TID 16
65
66/**
67 * hal_reo_qdesc_setup - Setup HW REO queue descriptor
68 *
69 * @hal_soc: Opaque HAL SOC handle
70 * @ba_window_size: BlockAck window size
71 * @start_seq: Starting sequence number
72 * @hw_qdesc_vaddr: Virtual address of REO queue descriptor memory
73 * @hw_qdesc_paddr: Physical address of REO queue descriptor memory
74 * @tid: TID
75 *
76 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +053077void hal_reo_qdesc_setup(hal_soc_handle_t hal_soc_hdl, int tid,
78 uint32_t ba_window_size,
79 uint32_t start_seq, void *hw_qdesc_vaddr,
80 qdf_dma_addr_t hw_qdesc_paddr,
81 int pn_type)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +053082{
83 uint32_t *reo_queue_desc = (uint32_t *)hw_qdesc_vaddr;
84 uint32_t *reo_queue_ext_desc;
85 uint32_t reg_val;
86 uint32_t pn_enable;
87 uint32_t pn_size = 0;
88
89 qdf_mem_zero(hw_qdesc_vaddr, sizeof(struct rx_reo_queue));
90
91 hal_uniform_desc_hdr_setup(reo_queue_desc, HAL_DESC_REO_OWNED,
92 HAL_REO_QUEUE_DESC);
93 /* Fixed pattern in reserved bits for debugging */
94 HAL_DESC_SET_FIELD(reo_queue_desc, UNIFORM_DESCRIPTOR_HEADER_0,
95 RESERVED_0A, 0xDDBEEF);
96
97 /* This a just a SW meta data and will be copied to REO destination
98 * descriptors indicated by hardware.
99 * TODO: Setting TID in this field. See if we should set something else.
100 */
101 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_1,
102 RECEIVE_QUEUE_NUMBER, tid);
103 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2,
104 VLD, 1);
105 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2,
106 ASSOCIATED_LINK_DESCRIPTOR_COUNTER, HAL_RX_LINK_DESC_CNTR);
107
108 /*
109 * Fields DISABLE_DUPLICATE_DETECTION and SOFT_REORDER_ENABLE will be 0
110 */
111
112 reg_val = TID_TO_WME_AC(tid);
113 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2, AC, reg_val);
114
115 if (ba_window_size < 1)
116 ba_window_size = 1;
Karunakar Dasineni26ebbe42018-05-31 07:59:10 -0700117 /* WAR to get 2k exception in Non BA case.
118 * Setting window size to 2 to get 2k jump exception
119 * when we receive aggregates in Non BA case
120 */
121 if ((ba_window_size == 1) && (tid != HAL_NON_QOS_TID))
122 ba_window_size++;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530123 /* Set RTY bit for non-BA case. Duplicate detection is currently not
124 * done by HW in non-BA case if RTY bit is not set.
125 * TODO: This is a temporary War and should be removed once HW fix is
126 * made to check and discard duplicates even if RTY bit is not set.
127 */
128 if (ba_window_size == 1)
129 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2, RTY, 1);
130
131 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2, BA_WINDOW_SIZE,
132 ba_window_size - 1);
133
134 switch (pn_type) {
135 case HAL_PN_WPA:
136 pn_enable = 1;
137 pn_size = PN_SIZE_48;
138 break;
139 case HAL_PN_WAPI_EVEN:
140 case HAL_PN_WAPI_UNEVEN:
141 pn_enable = 1;
142 pn_size = PN_SIZE_128;
143 break;
144 default:
145 pn_enable = 0;
146 break;
147 }
148
149 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2, PN_CHECK_NEEDED,
150 pn_enable);
151
152 if (pn_type == HAL_PN_WAPI_EVEN)
153 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2,
154 PN_SHALL_BE_EVEN, 1);
155 else if (pn_type == HAL_PN_WAPI_UNEVEN)
156 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2,
157 PN_SHALL_BE_UNEVEN, 1);
158
Radha krishna Simha Jiguru65c212d2019-09-09 19:04:09 +0530159 /*
160 * TODO: Need to check if PN handling in SW needs to be enabled
161 * So far this is not a requirement
162 */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530163
164 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2, PN_SIZE,
165 pn_size);
166
167 /* TODO: Check if RX_REO_QUEUE_2_IGNORE_AMPDU_FLAG need to be set
168 * based on BA window size and/or AMPDU capabilities
169 */
170 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_2,
171 IGNORE_AMPDU_FLAG, 1);
172
173 if (start_seq <= 0xfff)
174 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_3, SSN,
175 start_seq);
176
177 /* TODO: SVLD should be set to 1 if a valid SSN is received in ADDBA,
178 * but REO is not delivering packets if we set it to 1. Need to enable
179 * this once the issue is resolved
180 */
181 HAL_DESC_SET_FIELD(reo_queue_desc, RX_REO_QUEUE_3, SVLD, 0);
182
183 /* TODO: Check if we should set start PN for WAPI */
184
185#ifdef notyet
186 /* Setup first queue extension if BA window size is more than 1 */
187 if (ba_window_size > 1) {
188 reo_queue_ext_desc =
189 (uint32_t *)(((struct rx_reo_queue *)reo_queue_desc) +
190 1);
191 qdf_mem_zero(reo_queue_ext_desc,
192 sizeof(struct rx_reo_queue_ext));
193 hal_uniform_desc_hdr_setup(reo_queue_ext_desc,
194 HAL_DESC_REO_OWNED, HAL_REO_QUEUE_EXT_DESC);
195 }
196 /* Setup second queue extension if BA window size is more than 105 */
197 if (ba_window_size > 105) {
198 reo_queue_ext_desc = (uint32_t *)
199 (((struct rx_reo_queue_ext *)reo_queue_ext_desc) + 1);
200 qdf_mem_zero(reo_queue_ext_desc,
201 sizeof(struct rx_reo_queue_ext));
202 hal_uniform_desc_hdr_setup(reo_queue_ext_desc,
203 HAL_DESC_REO_OWNED, HAL_REO_QUEUE_EXT_DESC);
204 }
205 /* Setup third queue extension if BA window size is more than 210 */
206 if (ba_window_size > 210) {
207 reo_queue_ext_desc = (uint32_t *)
208 (((struct rx_reo_queue_ext *)reo_queue_ext_desc) + 1);
209 qdf_mem_zero(reo_queue_ext_desc,
210 sizeof(struct rx_reo_queue_ext));
211 hal_uniform_desc_hdr_setup(reo_queue_ext_desc,
212 HAL_DESC_REO_OWNED, HAL_REO_QUEUE_EXT_DESC);
213 }
214#else
215 /* TODO: HW queue descriptors are currently allocated for max BA
216 * window size for all QOS TIDs so that same descriptor can be used
217 * later when ADDBA request is recevied. This should be changed to
218 * allocate HW queue descriptors based on BA window size being
219 * negotiated (0 for non BA cases), and reallocate when BA window
220 * size changes and also send WMI message to FW to change the REO
221 * queue descriptor in Rx peer entry as part of dp_rx_tid_update.
222 */
223 if (tid != HAL_NON_QOS_TID) {
224 reo_queue_ext_desc = (uint32_t *)
225 (((struct rx_reo_queue *)reo_queue_desc) + 1);
226 qdf_mem_zero(reo_queue_ext_desc, 3 *
227 sizeof(struct rx_reo_queue_ext));
228 /* Initialize first reo queue extension descriptor */
229 hal_uniform_desc_hdr_setup(reo_queue_ext_desc,
230 HAL_DESC_REO_OWNED, HAL_REO_QUEUE_EXT_DESC);
231 /* Fixed pattern in reserved bits for debugging */
232 HAL_DESC_SET_FIELD(reo_queue_ext_desc,
233 UNIFORM_DESCRIPTOR_HEADER_0, RESERVED_0A, 0xADBEEF);
234 /* Initialize second reo queue extension descriptor */
235 reo_queue_ext_desc = (uint32_t *)
236 (((struct rx_reo_queue_ext *)reo_queue_ext_desc) + 1);
237 hal_uniform_desc_hdr_setup(reo_queue_ext_desc,
238 HAL_DESC_REO_OWNED, HAL_REO_QUEUE_EXT_DESC);
239 /* Fixed pattern in reserved bits for debugging */
240 HAL_DESC_SET_FIELD(reo_queue_ext_desc,
241 UNIFORM_DESCRIPTOR_HEADER_0, RESERVED_0A, 0xBDBEEF);
242 /* Initialize third reo queue extension descriptor */
243 reo_queue_ext_desc = (uint32_t *)
244 (((struct rx_reo_queue_ext *)reo_queue_ext_desc) + 1);
245 hal_uniform_desc_hdr_setup(reo_queue_ext_desc,
246 HAL_DESC_REO_OWNED, HAL_REO_QUEUE_EXT_DESC);
247 /* Fixed pattern in reserved bits for debugging */
248 HAL_DESC_SET_FIELD(reo_queue_ext_desc,
249 UNIFORM_DESCRIPTOR_HEADER_0, RESERVED_0A, 0xCDBEEF);
250 }
251#endif
252}
253qdf_export_symbol(hal_reo_qdesc_setup);
254
Nandha Kishore Easwarane6a27f72018-09-01 23:04:33 +0530255/**
256 * hal_get_ba_aging_timeout - Get BA Aging timeout
257 *
258 * @hal_soc: Opaque HAL SOC handle
259 * @ac: Access category
260 * @value: window size to get
261 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530262void hal_get_ba_aging_timeout(hal_soc_handle_t hal_soc_hdl, uint8_t ac,
Nandha Kishore Easwarane6a27f72018-09-01 23:04:33 +0530263 uint32_t *value)
264{
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530265 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
Nandha Kishore Easwarane6a27f72018-09-01 23:04:33 +0530266
267 switch (ac) {
268 case WME_AC_BE:
269 *value = HAL_REG_READ(soc,
270 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
271 SEQ_WCSS_UMAC_REO_REG_OFFSET)) / 1000;
272 break;
273 case WME_AC_BK:
274 *value = HAL_REG_READ(soc,
275 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
276 SEQ_WCSS_UMAC_REO_REG_OFFSET)) / 1000;
277 break;
278 case WME_AC_VI:
279 *value = HAL_REG_READ(soc,
280 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
281 SEQ_WCSS_UMAC_REO_REG_OFFSET)) / 1000;
282 break;
283 case WME_AC_VO:
284 *value = HAL_REG_READ(soc,
285 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
286 SEQ_WCSS_UMAC_REO_REG_OFFSET)) / 1000;
287 break;
288 default:
289 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
290 "Invalid AC: %d\n", ac);
291 }
292}
293
294qdf_export_symbol(hal_get_ba_aging_timeout);
295
296/**
297 * hal_set_ba_aging_timeout - Set BA Aging timeout
298 *
299 * @hal_soc: Opaque HAL SOC handle
300 * @ac: Access category
301 * ac: 0 - Background, 1 - Best Effort, 2 - Video, 3 - Voice
302 * @value: Input value to set
303 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530304void hal_set_ba_aging_timeout(hal_soc_handle_t hal_soc_hdl, uint8_t ac,
Nandha Kishore Easwarane6a27f72018-09-01 23:04:33 +0530305 uint32_t value)
306{
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530307 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
Nandha Kishore Easwarane6a27f72018-09-01 23:04:33 +0530308
309 switch (ac) {
310 case WME_AC_BE:
311 HAL_REG_WRITE(soc,
312 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
313 SEQ_WCSS_UMAC_REO_REG_OFFSET),
314 value * 1000);
315 break;
316 case WME_AC_BK:
317 HAL_REG_WRITE(soc,
318 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
319 SEQ_WCSS_UMAC_REO_REG_OFFSET),
320 value * 1000);
321 break;
322 case WME_AC_VI:
323 HAL_REG_WRITE(soc,
324 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
325 SEQ_WCSS_UMAC_REO_REG_OFFSET),
326 value * 1000);
327 break;
328 case WME_AC_VO:
329 HAL_REG_WRITE(soc,
330 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
331 SEQ_WCSS_UMAC_REO_REG_OFFSET),
332 value * 1000);
333 break;
334 default:
335 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
336 "Invalid AC: %d\n", ac);
337 }
338}
339
340qdf_export_symbol(hal_set_ba_aging_timeout);
341
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700342#define BLOCK_RES_MASK 0xF
343static inline uint8_t hal_find_one_bit(uint8_t x)
344{
345 uint8_t y = (x & (~x + 1)) & BLOCK_RES_MASK;
346 uint8_t pos;
347
348 for (pos = 0; y; y >>= 1)
349 pos++;
350
351 return pos-1;
352}
353
354static inline uint8_t hal_find_zero_bit(uint8_t x)
355{
356 uint8_t y = (~x & (x+1)) & BLOCK_RES_MASK;
357 uint8_t pos;
358
359 for (pos = 0; y; y >>= 1)
360 pos++;
361
362 return pos-1;
363}
364
365inline void hal_reo_cmd_set_descr_addr(uint32_t *reo_desc,
366 enum hal_reo_cmd_type type,
367 uint32_t paddr_lo,
368 uint8_t paddr_hi)
369{
370 switch (type) {
371 case CMD_GET_QUEUE_STATS:
372 HAL_DESC_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS_1,
373 RX_REO_QUEUE_DESC_ADDR_31_0, paddr_lo);
374 HAL_DESC_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS_2,
375 RX_REO_QUEUE_DESC_ADDR_39_32, paddr_hi);
376 break;
377 case CMD_FLUSH_QUEUE:
378 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_QUEUE_1,
379 FLUSH_DESC_ADDR_31_0, paddr_lo);
380 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_QUEUE_2,
381 FLUSH_DESC_ADDR_39_32, paddr_hi);
382 break;
383 case CMD_FLUSH_CACHE:
384 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_1,
385 FLUSH_ADDR_31_0, paddr_lo);
386 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2,
387 FLUSH_ADDR_39_32, paddr_hi);
388 break;
389 case CMD_UPDATE_RX_REO_QUEUE:
390 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_1,
391 RX_REO_QUEUE_DESC_ADDR_31_0, paddr_lo);
392 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
393 RX_REO_QUEUE_DESC_ADDR_39_32, paddr_hi);
394 break;
395 default:
396 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
Aditya Sathishded018e2018-07-02 16:25:21 +0530397 "%s: Invalid REO command type", __func__);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700398 break;
399 }
400}
401
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530402inline int hal_reo_cmd_queue_stats(hal_ring_handle_t hal_ring_hdl,
403 hal_soc_handle_t hal_soc_hdl,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530404 struct hal_reo_cmd_params *cmd)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700405
406{
407 uint32_t *reo_desc, val;
Akshay Kosigi6a206752019-06-10 23:14:52 +0530408 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700409
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530410 hal_srng_access_start(hal_soc_hdl, hal_ring_hdl);
411 reo_desc = hal_srng_src_get_next(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800412 if (!reo_desc) {
413 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
Aditya Sathishded018e2018-07-02 16:25:21 +0530414 "%s: Out of cmd ring entries", __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530415 hal_srng_access_end(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800416 return -EBUSY;
417 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700418
419 HAL_SET_TLV_HDR(reo_desc, WIFIREO_GET_QUEUE_STATS_E,
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800420 sizeof(struct reo_get_queue_stats));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700421
422 /* Offsets of descriptor fields defined in HW headers start from
423 * the field after TLV header */
424 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530425 qdf_mem_zero((reo_desc + NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER),
Karunakar Dasineni6a526752018-08-02 08:56:19 -0700426 sizeof(struct reo_get_queue_stats) -
427 (NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER << 2));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700428
429 HAL_DESC_SET_FIELD(reo_desc, UNIFORM_REO_CMD_HEADER_0,
430 REO_STATUS_REQUIRED, cmd->std.need_status);
431
432 hal_reo_cmd_set_descr_addr(reo_desc, CMD_GET_QUEUE_STATS,
433 cmd->std.addr_lo,
434 cmd->std.addr_hi);
435
436 HAL_DESC_SET_FIELD(reo_desc, REO_GET_QUEUE_STATS_2, CLEAR_STATS,
437 cmd->u.stats_params.clear);
438
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530439 hal_srng_access_end(hal_soc, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700440
441 val = reo_desc[CMD_HEADER_DW_OFFSET];
442 return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER_0, REO_CMD_NUMBER,
443 val);
444}
Pratik Gandhidc82a772018-01-30 18:57:05 +0530445qdf_export_symbol(hal_reo_cmd_queue_stats);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700446
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530447inline int hal_reo_cmd_flush_queue(hal_ring_handle_t hal_ring_hdl,
448 hal_soc_handle_t hal_soc_hdl,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530449 struct hal_reo_cmd_params *cmd)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700450{
451 uint32_t *reo_desc, val;
Akshay Kosigi6a206752019-06-10 23:14:52 +0530452 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700453
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530454 hal_srng_access_start(hal_soc_hdl, hal_ring_hdl);
455 reo_desc = hal_srng_src_get_next(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800456 if (!reo_desc) {
457 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
Aditya Sathishded018e2018-07-02 16:25:21 +0530458 "%s: Out of cmd ring entries", __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530459 hal_srng_access_end(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800460 return -EBUSY;
461 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700462
463 HAL_SET_TLV_HDR(reo_desc, WIFIREO_FLUSH_QUEUE_E,
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800464 sizeof(struct reo_flush_queue));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700465
466 /* Offsets of descriptor fields defined in HW headers start from
467 * the field after TLV header */
468 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530469 qdf_mem_zero((reo_desc + NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER),
Karunakar Dasineni6a526752018-08-02 08:56:19 -0700470 sizeof(struct reo_flush_queue) -
471 (NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER << 2));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700472
473 HAL_DESC_SET_FIELD(reo_desc, UNIFORM_REO_CMD_HEADER_0,
474 REO_STATUS_REQUIRED, cmd->std.need_status);
475
476 hal_reo_cmd_set_descr_addr(reo_desc, CMD_FLUSH_QUEUE, cmd->std.addr_lo,
477 cmd->std.addr_hi);
478
479 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_QUEUE_2,
480 BLOCK_DESC_ADDR_USAGE_AFTER_FLUSH,
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700481 cmd->u.fl_queue_params.block_use_after_flush);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700482
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700483 if (cmd->u.fl_queue_params.block_use_after_flush) {
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700484 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_QUEUE_2,
485 BLOCK_RESOURCE_INDEX, cmd->u.fl_queue_params.index);
486 }
487
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530488 hal_srng_access_end(hal_soc, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700489 val = reo_desc[CMD_HEADER_DW_OFFSET];
490 return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER_0, REO_CMD_NUMBER,
491 val);
492}
Pratik Gandhidc82a772018-01-30 18:57:05 +0530493qdf_export_symbol(hal_reo_cmd_flush_queue);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700494
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530495inline int hal_reo_cmd_flush_cache(hal_ring_handle_t hal_ring_hdl,
496 hal_soc_handle_t hal_soc_hdl,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530497 struct hal_reo_cmd_params *cmd)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700498{
499 uint32_t *reo_desc, val;
500 struct hal_reo_cmd_flush_cache_params *cp;
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700501 uint8_t index = 0;
Akshay Kosigi6a206752019-06-10 23:14:52 +0530502 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700503
504 cp = &cmd->u.fl_cache_params;
505
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530506 hal_srng_access_start(hal_soc_hdl, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700507
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700508 /* We need a cache block resource for this operation, and REO HW has
509 * only 4 such blocking resources. These resources are managed using
510 * reo_res_bitmap, and we return failure if none is available.
511 */
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700512 if (cp->block_use_after_flush) {
Akshay Kosigi6a206752019-06-10 23:14:52 +0530513 index = hal_find_zero_bit(hal_soc->reo_res_bitmap);
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700514 if (index > 3) {
Aditya Sathishded018e2018-07-02 16:25:21 +0530515 qdf_print("%s, No blocking resource available!",
516 __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530517 hal_srng_access_end(hal_soc, hal_ring_hdl);
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700518 return -EBUSY;
519 }
Akshay Kosigi6a206752019-06-10 23:14:52 +0530520 hal_soc->index = index;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700521 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700522
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530523 reo_desc = hal_srng_src_get_next(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800524 if (!reo_desc) {
525 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
Aditya Sathishded018e2018-07-02 16:25:21 +0530526 "%s: Out of cmd ring entries", __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530527 hal_srng_access_end(hal_soc, hal_ring_hdl);
528 hal_srng_dump(hal_ring_handle_to_hal_srng(hal_ring_hdl));
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800529 return -EBUSY;
530 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700531
532 HAL_SET_TLV_HDR(reo_desc, WIFIREO_FLUSH_CACHE_E,
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800533 sizeof(struct reo_flush_cache));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700534
535 /* Offsets of descriptor fields defined in HW headers start from
536 * the field after TLV header */
537 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530538 qdf_mem_zero((reo_desc + NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER),
Karunakar Dasineni6a526752018-08-02 08:56:19 -0700539 sizeof(struct reo_flush_cache) -
540 (NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER << 2));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700541
542 HAL_DESC_SET_FIELD(reo_desc, UNIFORM_REO_CMD_HEADER_0,
543 REO_STATUS_REQUIRED, cmd->std.need_status);
544
545 hal_reo_cmd_set_descr_addr(reo_desc, CMD_FLUSH_CACHE, cmd->std.addr_lo,
546 cmd->std.addr_hi);
547
548 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2,
549 FORWARD_ALL_MPDUS_IN_QUEUE, cp->fwd_mpdus_in_queue);
550
551 /* set it to 0 for now */
552 cp->rel_block_index = 0;
553 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2,
554 RELEASE_CACHE_BLOCK_INDEX, cp->rel_block_index);
555
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700556 if (cp->block_use_after_flush) {
557 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2,
558 CACHE_BLOCK_RESOURCE_INDEX, index);
559 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700560
561 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2,
562 FLUSH_WITHOUT_INVALIDATE, cp->flush_no_inval);
563
564 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2,
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700565 BLOCK_CACHE_USAGE_AFTER_FLUSH, cp->block_use_after_flush);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700566
567 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_CACHE_2, FLUSH_ENTIRE_CACHE,
568 cp->flush_all);
569
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530570 hal_srng_access_end(hal_soc, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700571 val = reo_desc[CMD_HEADER_DW_OFFSET];
572 return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER_0, REO_CMD_NUMBER,
573 val);
574}
Pratik Gandhidc82a772018-01-30 18:57:05 +0530575qdf_export_symbol(hal_reo_cmd_flush_cache);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700576
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530577inline int hal_reo_cmd_unblock_cache(hal_ring_handle_t hal_ring_hdl,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530578 hal_soc_handle_t hal_soc_hdl,
579 struct hal_reo_cmd_params *cmd)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700580
581{
Akshay Kosigi6a206752019-06-10 23:14:52 +0530582 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700583 uint32_t *reo_desc, val;
Venkata Sharath Chandra Manchala8e8d8f12017-01-13 00:00:58 -0800584 uint8_t index = 0;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700585
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530586 hal_srng_access_start(hal_soc_hdl, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700587
588 if (cmd->u.unblk_cache_params.type == UNBLOCK_RES_INDEX) {
Akshay Kosigi6a206752019-06-10 23:14:52 +0530589 index = hal_find_one_bit(hal_soc->reo_res_bitmap);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700590 if (index > 3) {
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530591 hal_srng_access_end(hal_soc, hal_ring_hdl);
Aditya Sathishded018e2018-07-02 16:25:21 +0530592 qdf_print("%s: No blocking resource to unblock!",
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700593 __func__);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800594 return -EBUSY;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700595 }
596 }
597
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530598 reo_desc = hal_srng_src_get_next(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800599 if (!reo_desc) {
600 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
Aditya Sathishded018e2018-07-02 16:25:21 +0530601 "%s: Out of cmd ring entries", __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530602 hal_srng_access_end(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800603 return -EBUSY;
604 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700605
606 HAL_SET_TLV_HDR(reo_desc, WIFIREO_UNBLOCK_CACHE_E,
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800607 sizeof(struct reo_unblock_cache));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700608
609 /* Offsets of descriptor fields defined in HW headers start from
610 * the field after TLV header */
611 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530612 qdf_mem_zero((reo_desc + NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER),
Karunakar Dasineni6a526752018-08-02 08:56:19 -0700613 sizeof(struct reo_unblock_cache) -
614 (NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER << 2));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700615
616 HAL_DESC_SET_FIELD(reo_desc, UNIFORM_REO_CMD_HEADER_0,
617 REO_STATUS_REQUIRED, cmd->std.need_status);
618
619 HAL_DESC_SET_FIELD(reo_desc, REO_UNBLOCK_CACHE_1,
620 UNBLOCK_TYPE, cmd->u.unblk_cache_params.type);
621
622 if (cmd->u.unblk_cache_params.type == UNBLOCK_RES_INDEX) {
623 HAL_DESC_SET_FIELD(reo_desc, REO_UNBLOCK_CACHE_1,
Karunakar Dasineni4f886f32017-05-31 22:39:39 -0700624 CACHE_BLOCK_RESOURCE_INDEX,
625 cmd->u.unblk_cache_params.index);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700626 }
627
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530628 hal_srng_access_end(hal_soc, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700629 val = reo_desc[CMD_HEADER_DW_OFFSET];
630 return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER_0, REO_CMD_NUMBER,
631 val);
632}
Pratik Gandhidc82a772018-01-30 18:57:05 +0530633qdf_export_symbol(hal_reo_cmd_unblock_cache);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700634
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530635inline int hal_reo_cmd_flush_timeout_list(hal_ring_handle_t hal_ring_hdl,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530636 hal_soc_handle_t hal_soc_hdl,
637 struct hal_reo_cmd_params *cmd)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700638{
Akshay Kosigi6a206752019-06-10 23:14:52 +0530639 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700640 uint32_t *reo_desc, val;
641
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530642 hal_srng_access_start(hal_soc_hdl, hal_ring_hdl);
643 reo_desc = hal_srng_src_get_next(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800644 if (!reo_desc) {
645 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
Aditya Sathishded018e2018-07-02 16:25:21 +0530646 "%s: Out of cmd ring entries", __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530647 hal_srng_access_end(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800648 return -EBUSY;
649 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700650
651 HAL_SET_TLV_HDR(reo_desc, WIFIREO_FLUSH_TIMEOUT_LIST_E,
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800652 sizeof(struct reo_flush_timeout_list));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700653
654 /* Offsets of descriptor fields defined in HW headers start from
655 * the field after TLV header */
656 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530657 qdf_mem_zero((reo_desc + NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER),
Karunakar Dasineni6a526752018-08-02 08:56:19 -0700658 sizeof(struct reo_flush_timeout_list) -
659 (NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER << 2));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700660
661 HAL_DESC_SET_FIELD(reo_desc, UNIFORM_REO_CMD_HEADER_0,
662 REO_STATUS_REQUIRED, cmd->std.need_status);
663
664 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_TIMEOUT_LIST_1, AC_TIMOUT_LIST,
665 cmd->u.fl_tim_list_params.ac_list);
666
667 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_TIMEOUT_LIST_2,
668 MINIMUM_RELEASE_DESC_COUNT,
669 cmd->u.fl_tim_list_params.min_rel_desc);
670
671 HAL_DESC_SET_FIELD(reo_desc, REO_FLUSH_TIMEOUT_LIST_2,
672 MINIMUM_FORWARD_BUF_COUNT,
673 cmd->u.fl_tim_list_params.min_fwd_buf);
674
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530675 hal_srng_access_end(hal_soc, hal_ring_hdl);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700676 val = reo_desc[CMD_HEADER_DW_OFFSET];
677 return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER_0, REO_CMD_NUMBER,
678 val);
679}
Pratik Gandhidc82a772018-01-30 18:57:05 +0530680qdf_export_symbol(hal_reo_cmd_flush_timeout_list);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700681
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530682inline int hal_reo_cmd_update_rx_queue(hal_ring_handle_t hal_ring_hdl,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530683 hal_soc_handle_t hal_soc_hdl,
684 struct hal_reo_cmd_params *cmd)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700685{
Akshay Kosigi6a206752019-06-10 23:14:52 +0530686 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700687 uint32_t *reo_desc, val;
688 struct hal_reo_cmd_update_queue_params *p;
Venkata Sharath Chandra Manchala5ee6efd2019-08-01 11:22:04 -0700689 struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700690
691 p = &cmd->u.upd_queue_params;
692
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530693 hal_srng_access_start(hal_soc_hdl, hal_ring_hdl);
694 reo_desc = hal_srng_src_get_next(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800695 if (!reo_desc) {
696 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
Aditya Sathishded018e2018-07-02 16:25:21 +0530697 "%s: Out of cmd ring entries", __func__);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530698 hal_srng_access_end(hal_soc, hal_ring_hdl);
Karunakar Dasinenia8c779b2017-01-11 13:57:55 -0800699 return -EBUSY;
700 }
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700701
702 HAL_SET_TLV_HDR(reo_desc, WIFIREO_UPDATE_RX_REO_QUEUE_E,
703 sizeof(struct reo_update_rx_reo_queue));
704
705 /* Offsets of descriptor fields defined in HW headers start from
706 * the field after TLV header */
707 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530708 qdf_mem_zero((reo_desc + NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER),
Karunakar Dasineni6a526752018-08-02 08:56:19 -0700709 sizeof(struct reo_update_rx_reo_queue) -
710 (NUM_OF_DWORDS_UNIFORM_REO_CMD_HEADER << 2));
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700711
712 HAL_DESC_SET_FIELD(reo_desc, UNIFORM_REO_CMD_HEADER_0,
713 REO_STATUS_REQUIRED, cmd->std.need_status);
714
715 hal_reo_cmd_set_descr_addr(reo_desc, CMD_UPDATE_RX_REO_QUEUE,
716 cmd->std.addr_lo, cmd->std.addr_hi);
717
718 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
719 UPDATE_RECEIVE_QUEUE_NUMBER, p->update_rx_queue_num);
720
721 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2, UPDATE_VLD,
722 p->update_vld);
723
724 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
725 UPDATE_ASSOCIATED_LINK_DESCRIPTOR_COUNTER,
726 p->update_assoc_link_desc);
727
728 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
729 UPDATE_DISABLE_DUPLICATE_DETECTION,
730 p->update_disable_dup_detect);
731
732 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
733 UPDATE_DISABLE_DUPLICATE_DETECTION,
734 p->update_disable_dup_detect);
735
736 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
737 UPDATE_SOFT_REORDER_ENABLE,
738 p->update_soft_reorder_enab);
739
740 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
741 UPDATE_AC, p->update_ac);
742
743 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
744 UPDATE_BAR, p->update_bar);
745
746 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
747 UPDATE_BAR, p->update_bar);
748
749 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
750 UPDATE_RTY, p->update_rty);
751
752 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
753 UPDATE_CHK_2K_MODE, p->update_chk_2k_mode);
754
755 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
756 UPDATE_OOR_MODE, p->update_oor_mode);
757
758 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
759 UPDATE_BA_WINDOW_SIZE, p->update_ba_window_size);
760
761 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
762 UPDATE_PN_CHECK_NEEDED, p->update_pn_check_needed);
763
764 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
765 UPDATE_PN_SHALL_BE_EVEN, p->update_pn_even);
766
767 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
768 UPDATE_PN_SHALL_BE_UNEVEN, p->update_pn_uneven);
769
770 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
771 UPDATE_PN_HANDLING_ENABLE, p->update_pn_hand_enab);
772
773 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
774 UPDATE_PN_SIZE, p->update_pn_size);
775
776 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
777 UPDATE_IGNORE_AMPDU_FLAG, p->update_ignore_ampdu);
778
779 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
780 UPDATE_SVLD, p->update_svld);
781
782 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
783 UPDATE_SSN, p->update_ssn);
784
785 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
786 UPDATE_SEQ_2K_ERROR_DETECTED_FLAG,
787 p->update_seq_2k_err_detect);
788
789 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
790 UPDATE_PN_VALID, p->update_pn_valid);
791
792 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_2,
793 UPDATE_PN, p->update_pn);
794
795 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
796 RECEIVE_QUEUE_NUMBER, p->rx_queue_num);
797
798 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
799 VLD, p->vld);
800
801 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
802 ASSOCIATED_LINK_DESCRIPTOR_COUNTER,
803 p->assoc_link_desc);
804
805 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
806 DISABLE_DUPLICATE_DETECTION, p->disable_dup_detect);
807
808 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
809 SOFT_REORDER_ENABLE, p->soft_reorder_enab);
810
811 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3, AC, p->ac);
812
813 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
814 BAR, p->bar);
815
816 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
817 CHK_2K_MODE, p->chk_2k_mode);
818
819 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
820 RTY, p->rty);
821
822 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
823 OOR_MODE, p->oor_mode);
824
825 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
826 PN_CHECK_NEEDED, p->pn_check_needed);
827
828 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
829 PN_SHALL_BE_EVEN, p->pn_even);
830
831 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
832 PN_SHALL_BE_UNEVEN, p->pn_uneven);
833
834 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
835 PN_HANDLING_ENABLE, p->pn_hand_enab);
836
837 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_3,
838 IGNORE_AMPDU_FLAG, p->ignore_ampdu);
839
Karunakar Dasineni7957fa92017-02-23 23:05:40 -0800840 if (p->ba_window_size < 1)
841 p->ba_window_size = 1;
sumedh baikadydf4a57c2018-04-08 22:19:22 -0700842 /*
843 * WAR to get 2k exception in Non BA case.
844 * Setting window size to 2 to get 2k jump exception
845 * when we receive aggregates in Non BA case
846 */
847 if (p->ba_window_size == 1)
848 p->ba_window_size++;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700849 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_4,
Karunakar Dasineni7957fa92017-02-23 23:05:40 -0800850 BA_WINDOW_SIZE, p->ba_window_size - 1);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700851
Gurumoorthi Gnanasambandhaned4bcf82017-05-24 00:10:59 +0530852 if (p->pn_size == 24)
853 p->pn_size = PN_SIZE_24;
854 else if (p->pn_size == 48)
855 p->pn_size = PN_SIZE_48;
856 else if (p->pn_size == 128)
857 p->pn_size = PN_SIZE_128;
858
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700859 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_4,
860 PN_SIZE, p->pn_size);
861
862 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_4,
863 SVLD, p->svld);
864
865 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_4,
866 SSN, p->ssn);
867
868 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_4,
869 SEQ_2K_ERROR_DETECTED_FLAG, p->seq_2k_err_detect);
870
871 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_4,
872 PN_ERROR_DETECTED_FLAG, p->pn_err_detect);
873
874 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_5,
875 PN_31_0, p->pn_31_0);
876
877 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_6,
878 PN_63_32, p->pn_63_32);
879
880 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_7,
881 PN_95_64, p->pn_95_64);
882
883 HAL_DESC_SET_FIELD(reo_desc, REO_UPDATE_RX_REO_QUEUE_8,
884 PN_127_96, p->pn_127_96);
885
Venkata Sharath Chandra Manchala5ee6efd2019-08-01 11:22:04 -0700886 if (hif_pm_runtime_get(hal_soc->hif_handle) == 0) {
887 hal_srng_access_end(hal_soc_hdl, hal_ring_hdl);
888 hif_pm_runtime_put(hal_soc->hif_handle);
889 } else {
890 hal_srng_access_end_reap(hal_soc_hdl, hal_ring_hdl);
891 srng->needs_flush++;
892 }
893
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700894 val = reo_desc[CMD_HEADER_DW_OFFSET];
895 return HAL_GET_FIELD(UNIFORM_REO_CMD_HEADER_0, REO_CMD_NUMBER,
896 val);
897}
Pratik Gandhidc82a772018-01-30 18:57:05 +0530898qdf_export_symbol(hal_reo_cmd_update_rx_queue);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700899
Akshay Kosigi6a206752019-06-10 23:14:52 +0530900inline void
901hal_reo_queue_stats_status(uint32_t *reo_desc,
902 struct hal_reo_queue_status *st,
903 hal_soc_handle_t hal_soc_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700904{
Akshay Kosigi6a206752019-06-10 23:14:52 +0530905 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700906 uint32_t val;
907
908 /* Offsets of descriptor fields defined in HW headers start
909 * from the field after TLV header */
910 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
911
912 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530913 hal_reo_status_get_header(reo_desc, HAL_REO_QUEUE_STATS_STATUS_TLV,
914 &(st->header), hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -0700915
916 /* SSN */
917 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_2, SSN)];
918 st->ssn = HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_2, SSN, val);
919
920 /* current index */
921 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_2,
922 CURRENT_INDEX)];
923 st->curr_idx =
924 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_2,
925 CURRENT_INDEX, val);
926
927 /* PN bits */
928 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_3,
929 PN_31_0)];
930 st->pn_31_0 =
931 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_3,
932 PN_31_0, val);
933
934 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_4,
935 PN_63_32)];
936 st->pn_63_32 =
937 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_4,
938 PN_63_32, val);
939
940 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_5,
941 PN_95_64)];
942 st->pn_95_64 =
943 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_5,
944 PN_95_64, val);
945
946 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_6,
947 PN_127_96)];
948 st->pn_127_96 =
949 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_6,
950 PN_127_96, val);
951
952 /* timestamps */
953 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_7,
954 LAST_RX_ENQUEUE_TIMESTAMP)];
955 st->last_rx_enq_tstamp =
956 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_7,
957 LAST_RX_ENQUEUE_TIMESTAMP, val);
958
959 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_8,
960 LAST_RX_DEQUEUE_TIMESTAMP)];
961 st->last_rx_deq_tstamp =
962 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_8,
963 LAST_RX_DEQUEUE_TIMESTAMP, val);
964
965 /* rx bitmap */
966 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_9,
967 RX_BITMAP_31_0)];
968 st->rx_bitmap_31_0 =
969 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_9,
970 RX_BITMAP_31_0, val);
971
972 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_10,
973 RX_BITMAP_63_32)];
974 st->rx_bitmap_63_32 =
975 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_10,
976 RX_BITMAP_63_32, val);
977
978 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_11,
979 RX_BITMAP_95_64)];
980 st->rx_bitmap_95_64 =
981 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_11,
982 RX_BITMAP_95_64, val);
983
984 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_12,
985 RX_BITMAP_127_96)];
986 st->rx_bitmap_127_96 =
987 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_12,
988 RX_BITMAP_127_96, val);
989
990 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_13,
991 RX_BITMAP_159_128)];
992 st->rx_bitmap_159_128 =
993 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_13,
994 RX_BITMAP_159_128, val);
995
996 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_14,
997 RX_BITMAP_191_160)];
998 st->rx_bitmap_191_160 =
999 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_14,
1000 RX_BITMAP_191_160, val);
1001
1002 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_15,
1003 RX_BITMAP_223_192)];
1004 st->rx_bitmap_223_192 =
1005 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_15,
1006 RX_BITMAP_223_192, val);
1007
1008 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_16,
1009 RX_BITMAP_255_224)];
1010 st->rx_bitmap_255_224 =
1011 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_16,
1012 RX_BITMAP_255_224, val);
1013
1014 /* various counts */
1015 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_17,
1016 CURRENT_MPDU_COUNT)];
1017 st->curr_mpdu_cnt =
1018 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_17,
1019 CURRENT_MPDU_COUNT, val);
1020
1021 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_17,
1022 CURRENT_MSDU_COUNT)];
1023 st->curr_msdu_cnt =
1024 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_17,
1025 CURRENT_MSDU_COUNT, val);
1026
1027 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_18,
1028 TIMEOUT_COUNT)];
1029 st->fwd_timeout_cnt =
1030 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_18,
1031 TIMEOUT_COUNT, val);
1032
1033 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_18,
1034 FORWARD_DUE_TO_BAR_COUNT)];
1035 st->fwd_bar_cnt =
1036 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_18,
1037 FORWARD_DUE_TO_BAR_COUNT, val);
1038
1039 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_18,
1040 DUPLICATE_COUNT)];
1041 st->dup_cnt =
1042 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_18,
1043 DUPLICATE_COUNT, val);
1044
1045 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_19,
1046 FRAMES_IN_ORDER_COUNT)];
1047 st->frms_in_order_cnt =
1048 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_19,
1049 FRAMES_IN_ORDER_COUNT, val);
1050
1051 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_19,
1052 BAR_RECEIVED_COUNT)];
1053 st->bar_rcvd_cnt =
1054 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_19,
1055 BAR_RECEIVED_COUNT, val);
1056
1057 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_20,
1058 MPDU_FRAMES_PROCESSED_COUNT)];
1059 st->mpdu_frms_cnt =
1060 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_20,
1061 MPDU_FRAMES_PROCESSED_COUNT, val);
1062
1063 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_21,
1064 MSDU_FRAMES_PROCESSED_COUNT)];
1065 st->msdu_frms_cnt =
1066 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_21,
1067 MSDU_FRAMES_PROCESSED_COUNT, val);
1068
1069 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_22,
1070 TOTAL_PROCESSED_BYTE_COUNT)];
1071 st->total_cnt =
1072 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_22,
1073 TOTAL_PROCESSED_BYTE_COUNT, val);
1074
1075 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_23,
1076 LATE_RECEIVE_MPDU_COUNT)];
1077 st->late_recv_mpdu_cnt =
1078 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_23,
1079 LATE_RECEIVE_MPDU_COUNT, val);
1080
1081 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_23,
1082 WINDOW_JUMP_2K)];
1083 st->win_jump_2k =
1084 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_23,
1085 WINDOW_JUMP_2K, val);
1086
1087 val = reo_desc[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_23,
1088 HOLE_COUNT)];
1089 st->hole_cnt =
1090 HAL_GET_FIELD(REO_GET_QUEUE_STATS_STATUS_23,
1091 HOLE_COUNT, val);
1092}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301093qdf_export_symbol(hal_reo_queue_stats_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001094
Akshay Kosigi6a206752019-06-10 23:14:52 +05301095inline void
1096hal_reo_flush_queue_status(uint32_t *reo_desc,
1097 struct hal_reo_flush_queue_status *st,
1098 hal_soc_handle_t hal_soc_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001099{
Akshay Kosigi6a206752019-06-10 23:14:52 +05301100 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001101 uint32_t val;
1102
1103 /* Offsets of descriptor fields defined in HW headers start
1104 * from the field after TLV header */
1105 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
1106
1107 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301108 hal_reo_status_get_header(reo_desc, HAL_REO_FLUSH_QUEUE_STATUS_TLV,
1109 &(st->header), hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001110
1111 /* error bit */
1112 val = reo_desc[HAL_OFFSET(REO_FLUSH_QUEUE_STATUS_2,
1113 ERROR_DETECTED)];
1114 st->error = HAL_GET_FIELD(REO_FLUSH_QUEUE_STATUS_2, ERROR_DETECTED,
1115 val);
1116}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301117qdf_export_symbol(hal_reo_flush_queue_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001118
Akshay Kosigi6a206752019-06-10 23:14:52 +05301119inline void
1120hal_reo_flush_cache_status(uint32_t *reo_desc,
1121 struct hal_reo_flush_cache_status *st,
1122 hal_soc_handle_t hal_soc_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001123{
Akshay Kosigi6a206752019-06-10 23:14:52 +05301124 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001125 uint32_t val;
1126
1127 /* Offsets of descriptor fields defined in HW headers start
1128 * from the field after TLV header */
1129 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
1130
1131 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301132 hal_reo_status_get_header(reo_desc, HAL_REO_FLUSH_CACHE_STATUS_TLV,
1133 &(st->header), hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001134
1135 /* error bit */
1136 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_2,
1137 ERROR_DETECTED)];
1138 st->error = HAL_GET_FIELD(REO_FLUSH_QUEUE_STATUS_2, ERROR_DETECTED,
1139 val);
1140
1141 /* block error */
1142 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_2,
1143 BLOCK_ERROR_DETAILS)];
1144 st->block_error = HAL_GET_FIELD(REO_FLUSH_CACHE_STATUS_2,
1145 BLOCK_ERROR_DETAILS,
1146 val);
1147 if (!st->block_error)
Akshay Kosigi6a206752019-06-10 23:14:52 +05301148 qdf_set_bit(hal_soc->index,
1149 (unsigned long *)&hal_soc->reo_res_bitmap);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001150
1151 /* cache flush status */
1152 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_2,
1153 CACHE_CONTROLLER_FLUSH_STATUS_HIT)];
1154 st->cache_flush_status = HAL_GET_FIELD(REO_FLUSH_CACHE_STATUS_2,
1155 CACHE_CONTROLLER_FLUSH_STATUS_HIT,
1156 val);
1157
1158 /* cache flush descriptor type */
1159 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_2,
1160 CACHE_CONTROLLER_FLUSH_STATUS_DESC_TYPE)];
1161 st->cache_flush_status_desc_type =
1162 HAL_GET_FIELD(REO_FLUSH_CACHE_STATUS_2,
1163 CACHE_CONTROLLER_FLUSH_STATUS_DESC_TYPE,
1164 val);
1165
1166 /* cache flush count */
1167 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_2,
1168 CACHE_CONTROLLER_FLUSH_COUNT)];
1169 st->cache_flush_cnt =
1170 HAL_GET_FIELD(REO_FLUSH_CACHE_STATUS_2,
1171 CACHE_CONTROLLER_FLUSH_COUNT,
1172 val);
1173
1174}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301175qdf_export_symbol(hal_reo_flush_cache_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001176
1177inline void hal_reo_unblock_cache_status(uint32_t *reo_desc,
Akshay Kosigi6a206752019-06-10 23:14:52 +05301178 hal_soc_handle_t hal_soc_hdl,
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001179 struct hal_reo_unblk_cache_status *st)
1180{
Akshay Kosigi6a206752019-06-10 23:14:52 +05301181 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001182 uint32_t val;
1183
1184 /* Offsets of descriptor fields defined in HW headers start
1185 * from the field after TLV header */
1186 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
1187
1188 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301189 hal_reo_status_get_header(reo_desc, HAL_REO_UNBLK_CACHE_STATUS_TLV,
Akshay Kosigi6a206752019-06-10 23:14:52 +05301190 &st->header, hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001191
1192 /* error bit */
1193 val = reo_desc[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_2,
1194 ERROR_DETECTED)];
1195 st->error = HAL_GET_FIELD(REO_UNBLOCK_CACHE_STATUS_2,
1196 ERROR_DETECTED,
1197 val);
1198
1199 /* unblock type */
1200 val = reo_desc[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_2,
1201 UNBLOCK_TYPE)];
1202 st->unblock_type = HAL_GET_FIELD(REO_UNBLOCK_CACHE_STATUS_2,
1203 UNBLOCK_TYPE,
1204 val);
1205
1206 if (!st->error && (st->unblock_type == UNBLOCK_RES_INDEX))
Akshay Kosigi6a206752019-06-10 23:14:52 +05301207 qdf_clear_bit(hal_soc->index,
1208 (unsigned long *)&hal_soc->reo_res_bitmap);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001209}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301210qdf_export_symbol(hal_reo_unblock_cache_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001211
1212inline void hal_reo_flush_timeout_list_status(
1213 uint32_t *reo_desc,
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301214 struct hal_reo_flush_timeout_list_status *st,
Akshay Kosigi6a206752019-06-10 23:14:52 +05301215 hal_soc_handle_t hal_soc_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001216
1217{
Akshay Kosigi6a206752019-06-10 23:14:52 +05301218 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001219 uint32_t val;
1220
1221 /* Offsets of descriptor fields defined in HW headers start
1222 * from the field after TLV header */
1223 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
1224
1225 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301226 hal_reo_status_get_header(reo_desc, HAL_REO_TIMOUT_LIST_STATUS_TLV,
1227 &(st->header), hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001228
1229 /* error bit */
1230 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_2,
1231 ERROR_DETECTED)];
1232 st->error = HAL_GET_FIELD(REO_FLUSH_TIMEOUT_LIST_STATUS_2,
1233 ERROR_DETECTED,
1234 val);
1235
1236 /* list empty */
1237 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_2,
1238 TIMOUT_LIST_EMPTY)];
1239 st->list_empty = HAL_GET_FIELD(REO_FLUSH_TIMEOUT_LIST_STATUS_2,
1240 TIMOUT_LIST_EMPTY,
1241 val);
1242
1243 /* release descriptor count */
1244 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_3,
1245 RELEASE_DESC_COUNT)];
1246 st->rel_desc_cnt = HAL_GET_FIELD(REO_FLUSH_TIMEOUT_LIST_STATUS_3,
1247 RELEASE_DESC_COUNT,
1248 val);
1249
1250 /* forward buf count */
1251 val = reo_desc[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_3,
1252 FORWARD_BUF_COUNT)];
1253 st->fwd_buf_cnt = HAL_GET_FIELD(REO_FLUSH_TIMEOUT_LIST_STATUS_3,
1254 FORWARD_BUF_COUNT,
1255 val);
1256}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301257qdf_export_symbol(hal_reo_flush_timeout_list_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001258
1259inline void hal_reo_desc_thres_reached_status(
1260 uint32_t *reo_desc,
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301261 struct hal_reo_desc_thres_reached_status *st,
Akshay Kosigi6a206752019-06-10 23:14:52 +05301262 hal_soc_handle_t hal_soc_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001263{
Akshay Kosigi6a206752019-06-10 23:14:52 +05301264 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001265 uint32_t val;
1266
1267 /* Offsets of descriptor fields defined in HW headers start
1268 * from the field after TLV header */
1269 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
1270
1271 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301272 hal_reo_status_get_header(reo_desc,
1273 HAL_REO_DESC_THRES_STATUS_TLV,
1274 &(st->header), hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001275
1276 /* threshold index */
1277 val = reo_desc[HAL_OFFSET_DW(
1278 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_2,
1279 THRESHOLD_INDEX)];
1280 st->thres_index = HAL_GET_FIELD(
1281 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_2,
1282 THRESHOLD_INDEX,
1283 val);
1284
1285 /* link desc counters */
1286 val = reo_desc[HAL_OFFSET_DW(
1287 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_3,
1288 LINK_DESCRIPTOR_COUNTER0)];
1289 st->link_desc_counter0 = HAL_GET_FIELD(
1290 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_3,
1291 LINK_DESCRIPTOR_COUNTER0,
1292 val);
1293
1294 val = reo_desc[HAL_OFFSET_DW(
1295 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_4,
1296 LINK_DESCRIPTOR_COUNTER1)];
1297 st->link_desc_counter1 = HAL_GET_FIELD(
1298 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_4,
1299 LINK_DESCRIPTOR_COUNTER1,
1300 val);
1301
1302 val = reo_desc[HAL_OFFSET_DW(
1303 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_5,
1304 LINK_DESCRIPTOR_COUNTER2)];
1305 st->link_desc_counter2 = HAL_GET_FIELD(
1306 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_5,
1307 LINK_DESCRIPTOR_COUNTER2,
1308 val);
1309
1310 val = reo_desc[HAL_OFFSET_DW(
1311 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_6,
1312 LINK_DESCRIPTOR_COUNTER_SUM)];
1313 st->link_desc_counter_sum = HAL_GET_FIELD(
1314 REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_6,
1315 LINK_DESCRIPTOR_COUNTER_SUM,
1316 val);
1317}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301318qdf_export_symbol(hal_reo_desc_thres_reached_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001319
Akshay Kosigi6a206752019-06-10 23:14:52 +05301320inline void
1321hal_reo_rx_update_queue_status(uint32_t *reo_desc,
1322 struct hal_reo_update_rx_queue_status *st,
1323 hal_soc_handle_t hal_soc_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001324{
Akshay Kosigi6a206752019-06-10 23:14:52 +05301325 struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
1326
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001327 /* Offsets of descriptor fields defined in HW headers start
1328 * from the field after TLV header */
1329 reo_desc += (sizeof(struct tlv_32_hdr) >> 2);
1330
1331 /* header */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301332 hal_reo_status_get_header(reo_desc,
1333 HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV,
1334 &(st->header), hal_soc);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001335}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301336qdf_export_symbol(hal_reo_rx_update_queue_status);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001337
1338/**
1339 * hal_reo_init_cmd_ring() - Initialize descriptors of REO command SRNG
1340 * with command number
1341 * @hal_soc: Handle to HAL SoC structure
1342 * @hal_ring: Handle to HAL SRNG structure
1343 *
1344 * Return: none
1345 */
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +05301346inline void hal_reo_init_cmd_ring(hal_soc_handle_t hal_soc_hdl,
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05301347 hal_ring_handle_t hal_ring_hdl)
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001348{
1349 int cmd_num;
1350 uint32_t *desc_addr;
1351 struct hal_srng_params srng_params;
1352 uint32_t desc_size;
1353 uint32_t num_desc;
Akshay Kosigi6a206752019-06-10 23:14:52 +05301354 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001355
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05301356 hal_get_srng_params(hal_soc_hdl, hal_ring_hdl, &srng_params);
Manoj Ekbote4f0c6b12016-10-30 16:01:38 -07001357
1358 desc_addr = (uint32_t *)(srng_params.ring_base_vaddr);
1359 desc_addr += (sizeof(struct tlv_32_hdr) >> 2);
1360 desc_size = hal_srng_get_entrysize(soc, REO_CMD) >> 2;
1361 num_desc = srng_params.num_entries;
1362 cmd_num = 1;
1363 while (num_desc) {
1364 /* Offsets of descriptor fields defined in HW headers start
1365 * from the field after TLV header */
1366 HAL_DESC_SET_FIELD(desc_addr, UNIFORM_REO_CMD_HEADER_0,
1367 REO_CMD_NUMBER, cmd_num);
1368 desc_addr += desc_size;
1369 num_desc--; cmd_num++;
1370 }
1371
1372 soc->reo_res_bitmap = 0;
1373}
Pratik Gandhidc82a772018-01-30 18:57:05 +05301374qdf_export_symbol(hal_reo_init_cmd_ring);