xref: /linux/drivers/net/wireless/ath/ath12k/wifi7/hal_rx.c (revision 37a93dd5c49b5fda807fd204edf2547c3493319c)
1dc722ea9SPavankumar Nandeshwar // SPDX-License-Identifier: BSD-3-Clause-Clear
2dc722ea9SPavankumar Nandeshwar /*
3dc722ea9SPavankumar Nandeshwar  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4dc722ea9SPavankumar Nandeshwar  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5dc722ea9SPavankumar Nandeshwar  */
6dc722ea9SPavankumar Nandeshwar 
7dc722ea9SPavankumar Nandeshwar #include "../debug.h"
8dc722ea9SPavankumar Nandeshwar #include "../hal.h"
9dc722ea9SPavankumar Nandeshwar #include "../hif.h"
10020225bbSPavankumar Nandeshwar #include "hal_tx.h"
114f57d718SPavankumar Nandeshwar #include "hal_rx.h"
1287a230ecSPavankumar Nandeshwar #include "hal_desc.h"
132bb41934SPavankumar Nandeshwar #include "hal.h"
14dc722ea9SPavankumar Nandeshwar 
15972f34d5SPavankumar Nandeshwar static
16972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_set_desc_hdr(struct hal_desc_header *hdr,
17dc722ea9SPavankumar Nandeshwar 				       u8 owner, u8 buffer_type, u32 magic)
18dc722ea9SPavankumar Nandeshwar {
19dc722ea9SPavankumar Nandeshwar 	hdr->info0 = le32_encode_bits(owner, HAL_DESC_HDR_INFO0_OWNER) |
20dc722ea9SPavankumar Nandeshwar 		     le32_encode_bits(buffer_type, HAL_DESC_HDR_INFO0_BUF_TYPE);
21dc722ea9SPavankumar Nandeshwar 
22dc722ea9SPavankumar Nandeshwar 	/* Magic pattern in reserved bits for debugging */
23dc722ea9SPavankumar Nandeshwar 	hdr->info0 |= le32_encode_bits(magic, HAL_DESC_HDR_INFO0_DBG_RESERVED);
24dc722ea9SPavankumar Nandeshwar }
25dc722ea9SPavankumar Nandeshwar 
269615a672SBaochen Qiang static int ath12k_wifi7_hal_reo_cmd_queue_stats(struct ath12k_hal *hal, void *tlv,
27dc722ea9SPavankumar Nandeshwar 						struct ath12k_hal_reo_cmd *cmd)
28dc722ea9SPavankumar Nandeshwar {
29dc722ea9SPavankumar Nandeshwar 	struct hal_reo_get_queue_stats *desc;
30dc722ea9SPavankumar Nandeshwar 
319615a672SBaochen Qiang 	desc = hal->ops->reo_cmd_enc_tlv_hdr(tlv, HAL_REO_GET_QUEUE_STATS,
329615a672SBaochen Qiang 					     sizeof(*desc));
33dc722ea9SPavankumar Nandeshwar 	memset_startat(desc, 0, queue_addr_lo);
34dc722ea9SPavankumar Nandeshwar 
35dc722ea9SPavankumar Nandeshwar 	desc->cmd.info0 &= ~cpu_to_le32(HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED);
36dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_NEED_STATUS)
37dc722ea9SPavankumar Nandeshwar 		desc->cmd.info0 |= cpu_to_le32(HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED);
38dc722ea9SPavankumar Nandeshwar 
39dc722ea9SPavankumar Nandeshwar 	desc->queue_addr_lo = cpu_to_le32(cmd->addr_lo);
40dc722ea9SPavankumar Nandeshwar 	desc->info0 = le32_encode_bits(cmd->addr_hi,
41dc722ea9SPavankumar Nandeshwar 				       HAL_REO_GET_QUEUE_STATS_INFO0_QUEUE_ADDR_HI);
42dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_STATS_CLEAR)
43dc722ea9SPavankumar Nandeshwar 		desc->info0 |= cpu_to_le32(HAL_REO_GET_QUEUE_STATS_INFO0_CLEAR_STATS);
44dc722ea9SPavankumar Nandeshwar 
45dc722ea9SPavankumar Nandeshwar 	return le32_get_bits(desc->cmd.info0, HAL_REO_CMD_HDR_INFO0_CMD_NUMBER);
46dc722ea9SPavankumar Nandeshwar }
47dc722ea9SPavankumar Nandeshwar 
489615a672SBaochen Qiang static int ath12k_wifi7_hal_reo_cmd_flush_cache(struct ath12k_hal *hal, void *tlv,
49dc722ea9SPavankumar Nandeshwar 						struct ath12k_hal_reo_cmd *cmd)
50dc722ea9SPavankumar Nandeshwar {
51dc722ea9SPavankumar Nandeshwar 	struct hal_reo_flush_cache *desc;
52dc722ea9SPavankumar Nandeshwar 	u8 avail_slot = ffz(hal->avail_blk_resource);
53dc722ea9SPavankumar Nandeshwar 
54dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_FLUSH_BLOCK_LATER) {
55dc722ea9SPavankumar Nandeshwar 		if (avail_slot >= HAL_MAX_AVAIL_BLK_RES)
56dc722ea9SPavankumar Nandeshwar 			return -ENOSPC;
57dc722ea9SPavankumar Nandeshwar 
58dc722ea9SPavankumar Nandeshwar 		hal->current_blk_index = avail_slot;
59dc722ea9SPavankumar Nandeshwar 	}
60dc722ea9SPavankumar Nandeshwar 
619615a672SBaochen Qiang 	desc = hal->ops->reo_cmd_enc_tlv_hdr(tlv, HAL_REO_FLUSH_CACHE,
629615a672SBaochen Qiang 					     sizeof(*desc));
63dc722ea9SPavankumar Nandeshwar 	memset_startat(desc, 0, cache_addr_lo);
64dc722ea9SPavankumar Nandeshwar 
65dc722ea9SPavankumar Nandeshwar 	desc->cmd.info0 &= ~cpu_to_le32(HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED);
66dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_NEED_STATUS)
67dc722ea9SPavankumar Nandeshwar 		desc->cmd.info0 |= cpu_to_le32(HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED);
68dc722ea9SPavankumar Nandeshwar 
69dc722ea9SPavankumar Nandeshwar 	desc->cache_addr_lo = cpu_to_le32(cmd->addr_lo);
70dc722ea9SPavankumar Nandeshwar 	desc->info0 = le32_encode_bits(cmd->addr_hi,
71dc722ea9SPavankumar Nandeshwar 				       HAL_REO_FLUSH_CACHE_INFO0_CACHE_ADDR_HI);
72dc722ea9SPavankumar Nandeshwar 
73dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_FLUSH_FWD_ALL_MPDUS)
74dc722ea9SPavankumar Nandeshwar 		desc->info0 |= cpu_to_le32(HAL_REO_FLUSH_CACHE_INFO0_FWD_ALL_MPDUS);
75dc722ea9SPavankumar Nandeshwar 
76dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_FLUSH_BLOCK_LATER) {
77dc722ea9SPavankumar Nandeshwar 		desc->info0 |= cpu_to_le32(HAL_REO_FLUSH_CACHE_INFO0_BLOCK_CACHE_USAGE);
78dc722ea9SPavankumar Nandeshwar 		desc->info0 |=
79dc722ea9SPavankumar Nandeshwar 			le32_encode_bits(avail_slot,
80dc722ea9SPavankumar Nandeshwar 					 HAL_REO_FLUSH_CACHE_INFO0_BLOCK_RESRC_IDX);
81dc722ea9SPavankumar Nandeshwar 	}
82dc722ea9SPavankumar Nandeshwar 
83dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_FLUSH_NO_INVAL)
84dc722ea9SPavankumar Nandeshwar 		desc->info0 |= cpu_to_le32(HAL_REO_FLUSH_CACHE_INFO0_FLUSH_WO_INVALIDATE);
85dc722ea9SPavankumar Nandeshwar 
86dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_FLUSH_ALL)
87dc722ea9SPavankumar Nandeshwar 		desc->info0 |= cpu_to_le32(HAL_REO_FLUSH_CACHE_INFO0_FLUSH_ALL);
88dc722ea9SPavankumar Nandeshwar 
89631ee338SJeff Johnson 	if (cmd->flag & HAL_REO_CMD_FLG_FLUSH_QUEUE_1K_DESC)
90631ee338SJeff Johnson 		desc->info0 |= cpu_to_le32(HAL_REO_FLUSH_CACHE_INFO0_FLUSH_QUEUE_1K_DESC);
91631ee338SJeff Johnson 
92dc722ea9SPavankumar Nandeshwar 	return le32_get_bits(desc->cmd.info0, HAL_REO_CMD_HDR_INFO0_CMD_NUMBER);
93dc722ea9SPavankumar Nandeshwar }
94dc722ea9SPavankumar Nandeshwar 
95972f34d5SPavankumar Nandeshwar static int
969615a672SBaochen Qiang ath12k_wifi7_hal_reo_cmd_update_rx_queue(struct ath12k_hal *hal, void *tlv,
97dc722ea9SPavankumar Nandeshwar 					 struct ath12k_hal_reo_cmd *cmd)
98dc722ea9SPavankumar Nandeshwar {
99dc722ea9SPavankumar Nandeshwar 	struct hal_reo_update_rx_queue *desc;
100dc722ea9SPavankumar Nandeshwar 
1019615a672SBaochen Qiang 	desc = hal->ops->reo_cmd_enc_tlv_hdr(tlv, HAL_REO_UPDATE_RX_REO_QUEUE,
1029615a672SBaochen Qiang 					     sizeof(*desc));
103dc722ea9SPavankumar Nandeshwar 	memset_startat(desc, 0, queue_addr_lo);
104dc722ea9SPavankumar Nandeshwar 
105dc722ea9SPavankumar Nandeshwar 	desc->cmd.info0 &= ~cpu_to_le32(HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED);
106dc722ea9SPavankumar Nandeshwar 	if (cmd->flag & HAL_REO_CMD_FLG_NEED_STATUS)
107dc722ea9SPavankumar Nandeshwar 		desc->cmd.info0 |= cpu_to_le32(HAL_REO_CMD_HDR_INFO0_STATUS_REQUIRED);
108dc722ea9SPavankumar Nandeshwar 
109dc722ea9SPavankumar Nandeshwar 	desc->queue_addr_lo = cpu_to_le32(cmd->addr_lo);
110dc722ea9SPavankumar Nandeshwar 	desc->info0 =
111dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(cmd->addr_hi,
112dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_QUEUE_ADDR_HI) |
113dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_RX_QUEUE_NUM),
114dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_RX_QUEUE_NUM) |
115dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_VLD),
116dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_VLD) |
117dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_ALDC),
118dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_ASSOC_LNK_DESC_CNT) |
119dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_DIS_DUP_DETECTION),
120dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_DIS_DUP_DETECTION) |
121dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_SOFT_REORDER_EN),
122dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_SOFT_REORDER_EN) |
123dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_AC),
124dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_AC) |
125dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_BAR),
126dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_BAR) |
127dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_RETRY),
128dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_RETRY) |
129dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_CHECK_2K_MODE),
130dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_CHECK_2K_MODE) |
131dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_OOR_MODE),
132dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_OOR_MODE) |
133dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_BA_WINDOW_SIZE),
134dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_BA_WINDOW_SIZE) |
135dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_PN_CHECK),
136dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_PN_CHECK) |
137dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_EVEN_PN),
138dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_EVEN_PN) |
139dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_UNEVEN_PN),
140dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_UNEVEN_PN) |
141dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_PN_HANDLE_ENABLE),
142dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_PN_HANDLE_ENABLE) |
143dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_PN_SIZE),
144dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_PN_SIZE) |
145dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_IGNORE_AMPDU_FLG),
146dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_IGNORE_AMPDU_FLG) |
147dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_SVLD),
148dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_SVLD) |
149dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_SSN),
150dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_SSN) |
151dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_SEQ_2K_ERR),
152dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_SEQ_2K_ERR) |
153dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_PN_VALID),
154dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_PN_VALID) |
155dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd0 & HAL_REO_CMD_UPD0_PN),
156dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO0_UPD_PN);
157dc722ea9SPavankumar Nandeshwar 
158dc722ea9SPavankumar Nandeshwar 	desc->info1 =
159dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(cmd->rx_queue_num,
160dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_RX_QUEUE_NUMBER) |
161dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_VLD),
162dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_VLD) |
163dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(u32_get_bits(cmd->upd1, HAL_REO_CMD_UPD1_ALDC),
164dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_ASSOC_LNK_DESC_COUNTER) |
165dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_DIS_DUP_DETECTION),
166dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_DIS_DUP_DETECTION) |
167dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_SOFT_REORDER_EN),
168dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_SOFT_REORDER_EN) |
169dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(u32_get_bits(cmd->upd1, HAL_REO_CMD_UPD1_AC),
170dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_AC) |
171dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_BAR),
172dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_BAR) |
173dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_CHECK_2K_MODE),
174dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_CHECK_2K_MODE) |
175dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_RETRY),
176dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_RETRY) |
177dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_OOR_MODE),
178dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_OOR_MODE) |
179dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_PN_CHECK),
180dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_PN_CHECK) |
181dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_EVEN_PN),
182dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_EVEN_PN) |
183dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_UNEVEN_PN),
184dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_UNEVEN_PN) |
185dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_PN_HANDLE_ENABLE),
186dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_PN_HANDLE_ENABLE) |
187dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd1 & HAL_REO_CMD_UPD1_IGNORE_AMPDU_FLG),
188dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO1_IGNORE_AMPDU_FLG);
189dc722ea9SPavankumar Nandeshwar 
190dc722ea9SPavankumar Nandeshwar 	if (cmd->pn_size == 24)
191dc722ea9SPavankumar Nandeshwar 		cmd->pn_size = HAL_RX_REO_QUEUE_PN_SIZE_24;
192dc722ea9SPavankumar Nandeshwar 	else if (cmd->pn_size == 48)
193dc722ea9SPavankumar Nandeshwar 		cmd->pn_size = HAL_RX_REO_QUEUE_PN_SIZE_48;
194dc722ea9SPavankumar Nandeshwar 	else if (cmd->pn_size == 128)
195dc722ea9SPavankumar Nandeshwar 		cmd->pn_size = HAL_RX_REO_QUEUE_PN_SIZE_128;
196dc722ea9SPavankumar Nandeshwar 
197dc722ea9SPavankumar Nandeshwar 	if (cmd->ba_window_size < 1)
198dc722ea9SPavankumar Nandeshwar 		cmd->ba_window_size = 1;
199dc722ea9SPavankumar Nandeshwar 
200dc722ea9SPavankumar Nandeshwar 	if (cmd->ba_window_size == 1)
201dc722ea9SPavankumar Nandeshwar 		cmd->ba_window_size++;
202dc722ea9SPavankumar Nandeshwar 
203dc722ea9SPavankumar Nandeshwar 	desc->info2 =
204dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(cmd->ba_window_size - 1,
205dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO2_BA_WINDOW_SIZE) |
206dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(cmd->pn_size, HAL_REO_UPD_RX_QUEUE_INFO2_PN_SIZE) |
207dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd2 & HAL_REO_CMD_UPD2_SVLD),
208dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO2_SVLD) |
209dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(u32_get_bits(cmd->upd2, HAL_REO_CMD_UPD2_SSN),
210dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO2_SSN) |
211dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd2 & HAL_REO_CMD_UPD2_SEQ_2K_ERR),
212dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO2_SEQ_2K_ERR) |
213dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(!!(cmd->upd2 & HAL_REO_CMD_UPD2_PN_ERR),
214dc722ea9SPavankumar Nandeshwar 				 HAL_REO_UPD_RX_QUEUE_INFO2_PN_ERR);
215dc722ea9SPavankumar Nandeshwar 
216dc722ea9SPavankumar Nandeshwar 	return le32_get_bits(desc->cmd.info0, HAL_REO_CMD_HDR_INFO0_CMD_NUMBER);
217dc722ea9SPavankumar Nandeshwar }
218dc722ea9SPavankumar Nandeshwar 
219972f34d5SPavankumar Nandeshwar int ath12k_wifi7_hal_reo_cmd_send(struct ath12k_base *ab, struct hal_srng *srng,
220dc722ea9SPavankumar Nandeshwar 				  enum hal_reo_cmd_type type,
221dc722ea9SPavankumar Nandeshwar 				  struct ath12k_hal_reo_cmd *cmd)
222dc722ea9SPavankumar Nandeshwar {
2239615a672SBaochen Qiang 	struct ath12k_hal *hal = &ab->hal;
2249615a672SBaochen Qiang 	void *reo_desc;
225dc722ea9SPavankumar Nandeshwar 	int ret;
226dc722ea9SPavankumar Nandeshwar 
227dc722ea9SPavankumar Nandeshwar 	spin_lock_bh(&srng->lock);
228dc722ea9SPavankumar Nandeshwar 
229dc722ea9SPavankumar Nandeshwar 	ath12k_hal_srng_access_begin(ab, srng);
230dc722ea9SPavankumar Nandeshwar 	reo_desc = ath12k_hal_srng_src_get_next_entry(ab, srng);
231dc722ea9SPavankumar Nandeshwar 	if (!reo_desc) {
232dc722ea9SPavankumar Nandeshwar 		ret = -ENOBUFS;
233dc722ea9SPavankumar Nandeshwar 		goto out;
234dc722ea9SPavankumar Nandeshwar 	}
235dc722ea9SPavankumar Nandeshwar 
236dc722ea9SPavankumar Nandeshwar 	switch (type) {
237dc722ea9SPavankumar Nandeshwar 	case HAL_REO_CMD_GET_QUEUE_STATS:
2389615a672SBaochen Qiang 		ret = ath12k_wifi7_hal_reo_cmd_queue_stats(hal, reo_desc, cmd);
239dc722ea9SPavankumar Nandeshwar 		break;
240dc722ea9SPavankumar Nandeshwar 	case HAL_REO_CMD_FLUSH_CACHE:
2419615a672SBaochen Qiang 		ret = ath12k_wifi7_hal_reo_cmd_flush_cache(hal, reo_desc, cmd);
242dc722ea9SPavankumar Nandeshwar 		break;
243dc722ea9SPavankumar Nandeshwar 	case HAL_REO_CMD_UPDATE_RX_QUEUE:
2449615a672SBaochen Qiang 		ret = ath12k_wifi7_hal_reo_cmd_update_rx_queue(hal, reo_desc, cmd);
245dc722ea9SPavankumar Nandeshwar 		break;
246dc722ea9SPavankumar Nandeshwar 	case HAL_REO_CMD_FLUSH_QUEUE:
247dc722ea9SPavankumar Nandeshwar 	case HAL_REO_CMD_UNBLOCK_CACHE:
248dc722ea9SPavankumar Nandeshwar 	case HAL_REO_CMD_FLUSH_TIMEOUT_LIST:
249dc722ea9SPavankumar Nandeshwar 		ath12k_warn(ab, "Unsupported reo command %d\n", type);
250dc722ea9SPavankumar Nandeshwar 		ret = -EOPNOTSUPP;
251dc722ea9SPavankumar Nandeshwar 		break;
252dc722ea9SPavankumar Nandeshwar 	default:
253dc722ea9SPavankumar Nandeshwar 		ath12k_warn(ab, "Unknown reo command %d\n", type);
254dc722ea9SPavankumar Nandeshwar 		ret = -EINVAL;
255dc722ea9SPavankumar Nandeshwar 		break;
256dc722ea9SPavankumar Nandeshwar 	}
257dc722ea9SPavankumar Nandeshwar 
258dc722ea9SPavankumar Nandeshwar out:
259dc722ea9SPavankumar Nandeshwar 	ath12k_hal_srng_access_end(ab, srng);
260dc722ea9SPavankumar Nandeshwar 	spin_unlock_bh(&srng->lock);
261dc722ea9SPavankumar Nandeshwar 
262dc722ea9SPavankumar Nandeshwar 	return ret;
263dc722ea9SPavankumar Nandeshwar }
264dc722ea9SPavankumar Nandeshwar 
265972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_rx_buf_addr_info_set(struct ath12k_buffer_addr *binfo,
266972f34d5SPavankumar Nandeshwar 					   dma_addr_t paddr, u32 cookie,
267972f34d5SPavankumar Nandeshwar 					   u8 manager)
268dc722ea9SPavankumar Nandeshwar {
269dc722ea9SPavankumar Nandeshwar 	u32 paddr_lo, paddr_hi;
270dc722ea9SPavankumar Nandeshwar 
271dc722ea9SPavankumar Nandeshwar 	paddr_lo = lower_32_bits(paddr);
272dc722ea9SPavankumar Nandeshwar 	paddr_hi = upper_32_bits(paddr);
273dc722ea9SPavankumar Nandeshwar 	binfo->info0 = le32_encode_bits(paddr_lo, BUFFER_ADDR_INFO0_ADDR);
274dc722ea9SPavankumar Nandeshwar 	binfo->info1 = le32_encode_bits(paddr_hi, BUFFER_ADDR_INFO1_ADDR) |
275dc722ea9SPavankumar Nandeshwar 		       le32_encode_bits(cookie, BUFFER_ADDR_INFO1_SW_COOKIE) |
276dc722ea9SPavankumar Nandeshwar 		       le32_encode_bits(manager, BUFFER_ADDR_INFO1_RET_BUF_MGR);
277dc722ea9SPavankumar Nandeshwar }
278dc722ea9SPavankumar Nandeshwar 
279972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_rx_buf_addr_info_get(struct ath12k_buffer_addr *binfo,
280dc722ea9SPavankumar Nandeshwar 					   dma_addr_t *paddr,
281dc722ea9SPavankumar Nandeshwar 					   u32 *cookie, u8 *rbm)
282dc722ea9SPavankumar Nandeshwar {
283dc722ea9SPavankumar Nandeshwar 	*paddr = (((u64)le32_get_bits(binfo->info1, BUFFER_ADDR_INFO1_ADDR)) << 32) |
284dc722ea9SPavankumar Nandeshwar 		le32_get_bits(binfo->info0, BUFFER_ADDR_INFO0_ADDR);
285dc722ea9SPavankumar Nandeshwar 	*cookie = le32_get_bits(binfo->info1, BUFFER_ADDR_INFO1_SW_COOKIE);
286dc722ea9SPavankumar Nandeshwar 	*rbm = le32_get_bits(binfo->info1, BUFFER_ADDR_INFO1_RET_BUF_MGR);
287dc722ea9SPavankumar Nandeshwar }
288dc722ea9SPavankumar Nandeshwar 
289972f34d5SPavankumar Nandeshwar void
290972f34d5SPavankumar Nandeshwar ath12k_wifi7_hal_rx_msdu_link_info_get(struct hal_rx_msdu_link *link,
291972f34d5SPavankumar Nandeshwar 				       u32 *num_msdus, u32 *msdu_cookies,
292dc722ea9SPavankumar Nandeshwar 				       enum hal_rx_buf_return_buf_manager *rbm)
293dc722ea9SPavankumar Nandeshwar {
294dc722ea9SPavankumar Nandeshwar 	struct hal_rx_msdu_details *msdu;
295dc722ea9SPavankumar Nandeshwar 	u32 val;
296dc722ea9SPavankumar Nandeshwar 	int i;
297dc722ea9SPavankumar Nandeshwar 
298dc722ea9SPavankumar Nandeshwar 	*num_msdus = HAL_NUM_RX_MSDUS_PER_LINK_DESC;
299dc722ea9SPavankumar Nandeshwar 
300dc722ea9SPavankumar Nandeshwar 	msdu = &link->msdu_link[0];
301dc722ea9SPavankumar Nandeshwar 	*rbm = le32_get_bits(msdu->buf_addr_info.info1,
302dc722ea9SPavankumar Nandeshwar 			     BUFFER_ADDR_INFO1_RET_BUF_MGR);
303dc722ea9SPavankumar Nandeshwar 
304dc722ea9SPavankumar Nandeshwar 	for (i = 0; i < *num_msdus; i++) {
305dc722ea9SPavankumar Nandeshwar 		msdu = &link->msdu_link[i];
306dc722ea9SPavankumar Nandeshwar 
307dc722ea9SPavankumar Nandeshwar 		val = le32_get_bits(msdu->buf_addr_info.info0,
308dc722ea9SPavankumar Nandeshwar 				    BUFFER_ADDR_INFO0_ADDR);
309dc722ea9SPavankumar Nandeshwar 		if (val == 0) {
310dc722ea9SPavankumar Nandeshwar 			*num_msdus = i;
311dc722ea9SPavankumar Nandeshwar 			break;
312dc722ea9SPavankumar Nandeshwar 		}
313dc722ea9SPavankumar Nandeshwar 		*msdu_cookies = le32_get_bits(msdu->buf_addr_info.info1,
314dc722ea9SPavankumar Nandeshwar 					      BUFFER_ADDR_INFO1_SW_COOKIE);
315dc722ea9SPavankumar Nandeshwar 		msdu_cookies++;
316dc722ea9SPavankumar Nandeshwar 	}
317dc722ea9SPavankumar Nandeshwar }
318dc722ea9SPavankumar Nandeshwar 
31996b42732SPavankumar Nandeshwar int ath12k_wifi7_hal_desc_reo_parse_err(struct ath12k_dp *dp,
320dc722ea9SPavankumar Nandeshwar 					struct hal_reo_dest_ring *desc,
321dc722ea9SPavankumar Nandeshwar 					dma_addr_t *paddr, u32 *desc_bank)
322dc722ea9SPavankumar Nandeshwar {
32396b42732SPavankumar Nandeshwar 	struct ath12k_base *ab = dp->ab;
324dc722ea9SPavankumar Nandeshwar 	enum hal_reo_dest_ring_push_reason push_reason;
325dc722ea9SPavankumar Nandeshwar 	enum hal_reo_dest_ring_error_code err_code;
326631ee338SJeff Johnson 	u32 cookie;
327dc722ea9SPavankumar Nandeshwar 
328dc722ea9SPavankumar Nandeshwar 	push_reason = le32_get_bits(desc->info0,
329dc722ea9SPavankumar Nandeshwar 				    HAL_REO_DEST_RING_INFO0_PUSH_REASON);
330dc722ea9SPavankumar Nandeshwar 	err_code = le32_get_bits(desc->info0,
331dc722ea9SPavankumar Nandeshwar 				 HAL_REO_DEST_RING_INFO0_ERROR_CODE);
332775fe5acSPavankumar Nandeshwar 	dp->device_stats.reo_error[err_code]++;
333dc722ea9SPavankumar Nandeshwar 
334dc722ea9SPavankumar Nandeshwar 	if (push_reason != HAL_REO_DEST_RING_PUSH_REASON_ERR_DETECTED &&
335dc722ea9SPavankumar Nandeshwar 	    push_reason != HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) {
336dc722ea9SPavankumar Nandeshwar 		ath12k_warn(ab, "expected error push reason code, received %d\n",
337dc722ea9SPavankumar Nandeshwar 			    push_reason);
338dc722ea9SPavankumar Nandeshwar 		return -EINVAL;
339dc722ea9SPavankumar Nandeshwar 	}
340dc722ea9SPavankumar Nandeshwar 
34196b42732SPavankumar Nandeshwar 	ath12k_wifi7_hal_rx_reo_ent_paddr_get(&desc->buf_addr_info, paddr,
342972f34d5SPavankumar Nandeshwar 					      &cookie);
343dc722ea9SPavankumar Nandeshwar 	*desc_bank = u32_get_bits(cookie, DP_LINK_DESC_BANK_MASK);
344dc722ea9SPavankumar Nandeshwar 
345dc722ea9SPavankumar Nandeshwar 	return 0;
346dc722ea9SPavankumar Nandeshwar }
347dc722ea9SPavankumar Nandeshwar 
34896b42732SPavankumar Nandeshwar int ath12k_wifi7_hal_wbm_desc_parse_err(struct ath12k_dp *dp, void *desc,
349dc722ea9SPavankumar Nandeshwar 					struct hal_rx_wbm_rel_info *rel_info)
350dc722ea9SPavankumar Nandeshwar {
351dc722ea9SPavankumar Nandeshwar 	struct hal_wbm_release_ring *wbm_desc = desc;
352dc722ea9SPavankumar Nandeshwar 	struct hal_wbm_release_ring_cc_rx *wbm_cc_desc = desc;
353dc722ea9SPavankumar Nandeshwar 	enum hal_wbm_rel_desc_type type;
354dc722ea9SPavankumar Nandeshwar 	enum hal_wbm_rel_src_module rel_src;
355dc722ea9SPavankumar Nandeshwar 	bool hw_cc_done;
356dc722ea9SPavankumar Nandeshwar 	u64 desc_va;
357dc722ea9SPavankumar Nandeshwar 	u32 val;
358dc722ea9SPavankumar Nandeshwar 
359dc722ea9SPavankumar Nandeshwar 	type = le32_get_bits(wbm_desc->info0, HAL_WBM_RELEASE_INFO0_DESC_TYPE);
360dc722ea9SPavankumar Nandeshwar 	/* We expect only WBM_REL buffer type */
361dc722ea9SPavankumar Nandeshwar 	if (type != HAL_WBM_REL_DESC_TYPE_REL_MSDU) {
362dc722ea9SPavankumar Nandeshwar 		WARN_ON(1);
363dc722ea9SPavankumar Nandeshwar 		return -EINVAL;
364dc722ea9SPavankumar Nandeshwar 	}
365dc722ea9SPavankumar Nandeshwar 
366dc722ea9SPavankumar Nandeshwar 	rel_src = le32_get_bits(wbm_desc->info0,
367dc722ea9SPavankumar Nandeshwar 				HAL_WBM_RELEASE_INFO0_REL_SRC_MODULE);
368dc722ea9SPavankumar Nandeshwar 	if (rel_src != HAL_WBM_REL_SRC_MODULE_RXDMA &&
369dc722ea9SPavankumar Nandeshwar 	    rel_src != HAL_WBM_REL_SRC_MODULE_REO)
370dc722ea9SPavankumar Nandeshwar 		return -EINVAL;
371dc722ea9SPavankumar Nandeshwar 
372dc722ea9SPavankumar Nandeshwar 	/* The format of wbm rel ring desc changes based on the
373dc722ea9SPavankumar Nandeshwar 	 * hw cookie conversion status
374dc722ea9SPavankumar Nandeshwar 	 */
375dc722ea9SPavankumar Nandeshwar 	hw_cc_done = le32_get_bits(wbm_desc->info0,
376dc722ea9SPavankumar Nandeshwar 				   HAL_WBM_RELEASE_RX_INFO0_CC_STATUS);
377dc722ea9SPavankumar Nandeshwar 
378dc722ea9SPavankumar Nandeshwar 	if (!hw_cc_done) {
379dc722ea9SPavankumar Nandeshwar 		val = le32_get_bits(wbm_desc->buf_addr_info.info1,
380dc722ea9SPavankumar Nandeshwar 				    BUFFER_ADDR_INFO1_RET_BUF_MGR);
381dc722ea9SPavankumar Nandeshwar 		if (val != HAL_RX_BUF_RBM_SW3_BM) {
382775fe5acSPavankumar Nandeshwar 			dp->device_stats.invalid_rbm++;
383dc722ea9SPavankumar Nandeshwar 			return -EINVAL;
384dc722ea9SPavankumar Nandeshwar 		}
385dc722ea9SPavankumar Nandeshwar 
386dc722ea9SPavankumar Nandeshwar 		rel_info->cookie = le32_get_bits(wbm_desc->buf_addr_info.info1,
387dc722ea9SPavankumar Nandeshwar 						 BUFFER_ADDR_INFO1_SW_COOKIE);
388dc722ea9SPavankumar Nandeshwar 
389dc722ea9SPavankumar Nandeshwar 		rel_info->rx_desc = NULL;
390dc722ea9SPavankumar Nandeshwar 	} else {
391dc722ea9SPavankumar Nandeshwar 		val = le32_get_bits(wbm_cc_desc->info0,
392dc722ea9SPavankumar Nandeshwar 				    HAL_WBM_RELEASE_RX_CC_INFO0_RBM);
393dc722ea9SPavankumar Nandeshwar 		if (val != HAL_RX_BUF_RBM_SW3_BM) {
394775fe5acSPavankumar Nandeshwar 			dp->device_stats.invalid_rbm++;
395dc722ea9SPavankumar Nandeshwar 			return -EINVAL;
396dc722ea9SPavankumar Nandeshwar 		}
397dc722ea9SPavankumar Nandeshwar 
398dc722ea9SPavankumar Nandeshwar 		rel_info->cookie = le32_get_bits(wbm_cc_desc->info1,
399dc722ea9SPavankumar Nandeshwar 						 HAL_WBM_RELEASE_RX_CC_INFO1_COOKIE);
400dc722ea9SPavankumar Nandeshwar 
401dc722ea9SPavankumar Nandeshwar 		desc_va = ((u64)le32_to_cpu(wbm_cc_desc->buf_va_hi) << 32 |
402dc722ea9SPavankumar Nandeshwar 			   le32_to_cpu(wbm_cc_desc->buf_va_lo));
403dc722ea9SPavankumar Nandeshwar 		rel_info->rx_desc =
404dc722ea9SPavankumar Nandeshwar 			(struct ath12k_rx_desc_info *)((unsigned long)desc_va);
405dc722ea9SPavankumar Nandeshwar 	}
406dc722ea9SPavankumar Nandeshwar 
407dc722ea9SPavankumar Nandeshwar 	rel_info->err_rel_src = rel_src;
408dc722ea9SPavankumar Nandeshwar 	rel_info->hw_cc_done = hw_cc_done;
409dc722ea9SPavankumar Nandeshwar 
410dc722ea9SPavankumar Nandeshwar 	rel_info->first_msdu = le32_get_bits(wbm_desc->info3,
411dc722ea9SPavankumar Nandeshwar 					     HAL_WBM_RELEASE_INFO3_FIRST_MSDU);
412dc722ea9SPavankumar Nandeshwar 	rel_info->last_msdu = le32_get_bits(wbm_desc->info3,
413dc722ea9SPavankumar Nandeshwar 					    HAL_WBM_RELEASE_INFO3_LAST_MSDU);
414dc722ea9SPavankumar Nandeshwar 	rel_info->continuation = le32_get_bits(wbm_desc->info3,
415dc722ea9SPavankumar Nandeshwar 					       HAL_WBM_RELEASE_INFO3_CONTINUATION);
416dc722ea9SPavankumar Nandeshwar 
417dc722ea9SPavankumar Nandeshwar 	if (rel_info->err_rel_src == HAL_WBM_REL_SRC_MODULE_REO) {
418dc722ea9SPavankumar Nandeshwar 		rel_info->push_reason =
419dc722ea9SPavankumar Nandeshwar 			le32_get_bits(wbm_desc->info0,
420dc722ea9SPavankumar Nandeshwar 				      HAL_WBM_RELEASE_INFO0_REO_PUSH_REASON);
421dc722ea9SPavankumar Nandeshwar 		rel_info->err_code =
422dc722ea9SPavankumar Nandeshwar 			le32_get_bits(wbm_desc->info0,
423dc722ea9SPavankumar Nandeshwar 				      HAL_WBM_RELEASE_INFO0_REO_ERROR_CODE);
424dc722ea9SPavankumar Nandeshwar 	} else {
425dc722ea9SPavankumar Nandeshwar 		rel_info->push_reason =
426dc722ea9SPavankumar Nandeshwar 			le32_get_bits(wbm_desc->info0,
427dc722ea9SPavankumar Nandeshwar 				      HAL_WBM_RELEASE_INFO0_RXDMA_PUSH_REASON);
428dc722ea9SPavankumar Nandeshwar 		rel_info->err_code =
429dc722ea9SPavankumar Nandeshwar 			le32_get_bits(wbm_desc->info0,
430dc722ea9SPavankumar Nandeshwar 				      HAL_WBM_RELEASE_INFO0_RXDMA_ERROR_CODE);
431dc722ea9SPavankumar Nandeshwar 	}
432dc722ea9SPavankumar Nandeshwar 
43311157e09SHarsh Kumar Bijlani 	rel_info->peer_metadata = wbm_desc->info2;
43411157e09SHarsh Kumar Bijlani 
435dc722ea9SPavankumar Nandeshwar 	return 0;
436dc722ea9SPavankumar Nandeshwar }
437dc722ea9SPavankumar Nandeshwar 
43896b42732SPavankumar Nandeshwar void ath12k_wifi7_hal_rx_reo_ent_paddr_get(struct ath12k_buffer_addr *buff_addr,
439dc722ea9SPavankumar Nandeshwar 					   dma_addr_t *paddr, u32 *cookie)
440dc722ea9SPavankumar Nandeshwar {
441dc722ea9SPavankumar Nandeshwar 	*paddr = ((u64)(le32_get_bits(buff_addr->info1,
442dc722ea9SPavankumar Nandeshwar 				      BUFFER_ADDR_INFO1_ADDR)) << 32) |
443dc722ea9SPavankumar Nandeshwar 		le32_get_bits(buff_addr->info0, BUFFER_ADDR_INFO0_ADDR);
444dc722ea9SPavankumar Nandeshwar 
445dc722ea9SPavankumar Nandeshwar 	*cookie = le32_get_bits(buff_addr->info1, BUFFER_ADDR_INFO1_SW_COOKIE);
446dc722ea9SPavankumar Nandeshwar }
447dc722ea9SPavankumar Nandeshwar 
448c8706025SPavankumar Nandeshwar void ath12k_wifi7_hal_rx_reo_ent_buf_paddr_get(void *rx_desc, dma_addr_t *paddr,
449dc722ea9SPavankumar Nandeshwar 					       u32 *sw_cookie,
450dc722ea9SPavankumar Nandeshwar 					       struct ath12k_buffer_addr **pp_buf_addr,
451dc722ea9SPavankumar Nandeshwar 					       u8 *rbm, u32 *msdu_cnt)
452dc722ea9SPavankumar Nandeshwar {
453dc722ea9SPavankumar Nandeshwar 	struct hal_reo_entrance_ring *reo_ent_ring =
454dc722ea9SPavankumar Nandeshwar 		(struct hal_reo_entrance_ring *)rx_desc;
455dc722ea9SPavankumar Nandeshwar 	struct ath12k_buffer_addr *buf_addr_info;
456dc722ea9SPavankumar Nandeshwar 	struct rx_mpdu_desc *rx_mpdu_desc_info_details;
457dc722ea9SPavankumar Nandeshwar 
458dc722ea9SPavankumar Nandeshwar 	rx_mpdu_desc_info_details =
459dc722ea9SPavankumar Nandeshwar 			(struct rx_mpdu_desc *)&reo_ent_ring->rx_mpdu_info;
460dc722ea9SPavankumar Nandeshwar 
461dc722ea9SPavankumar Nandeshwar 	*msdu_cnt = le32_get_bits(rx_mpdu_desc_info_details->info0,
462dc722ea9SPavankumar Nandeshwar 				  RX_MPDU_DESC_INFO0_MSDU_COUNT);
463dc722ea9SPavankumar Nandeshwar 
464dc722ea9SPavankumar Nandeshwar 	buf_addr_info = (struct ath12k_buffer_addr *)&reo_ent_ring->buf_addr_info;
465dc722ea9SPavankumar Nandeshwar 
466dc722ea9SPavankumar Nandeshwar 	*paddr = (((u64)le32_get_bits(buf_addr_info->info1,
467dc722ea9SPavankumar Nandeshwar 				      BUFFER_ADDR_INFO1_ADDR)) << 32) |
468dc722ea9SPavankumar Nandeshwar 			le32_get_bits(buf_addr_info->info0,
469dc722ea9SPavankumar Nandeshwar 				      BUFFER_ADDR_INFO0_ADDR);
470dc722ea9SPavankumar Nandeshwar 
471dc722ea9SPavankumar Nandeshwar 	*sw_cookie = le32_get_bits(buf_addr_info->info1,
472dc722ea9SPavankumar Nandeshwar 				   BUFFER_ADDR_INFO1_SW_COOKIE);
473dc722ea9SPavankumar Nandeshwar 	*rbm = le32_get_bits(buf_addr_info->info1,
474dc722ea9SPavankumar Nandeshwar 			     BUFFER_ADDR_INFO1_RET_BUF_MGR);
475dc722ea9SPavankumar Nandeshwar 
476dc722ea9SPavankumar Nandeshwar 	*pp_buf_addr = (void *)buf_addr_info;
477dc722ea9SPavankumar Nandeshwar }
478dc722ea9SPavankumar Nandeshwar 
479c8706025SPavankumar Nandeshwar void ath12k_wifi7_hal_rx_msdu_list_get(struct ath12k *ar,
480c8706025SPavankumar Nandeshwar 				       void *link_desc_opaque,
481c8706025SPavankumar Nandeshwar 				       void *msdu_list_opaque, u16 *num_msdus)
482dc722ea9SPavankumar Nandeshwar {
483c8706025SPavankumar Nandeshwar 	struct hal_rx_msdu_link *link_desc =
484c8706025SPavankumar Nandeshwar 				(struct hal_rx_msdu_link *)link_desc_opaque;
485c8706025SPavankumar Nandeshwar 	struct hal_rx_msdu_list *msdu_list =
486c8706025SPavankumar Nandeshwar 				(struct hal_rx_msdu_list *)msdu_list_opaque;
487dc722ea9SPavankumar Nandeshwar 	struct hal_rx_msdu_details *msdu_details = NULL;
488dc722ea9SPavankumar Nandeshwar 	struct rx_msdu_desc *msdu_desc_info = NULL;
489dc722ea9SPavankumar Nandeshwar 	u32 last = 0, first = 0;
490dc722ea9SPavankumar Nandeshwar 	u8 tmp = 0;
491dc722ea9SPavankumar Nandeshwar 	int i;
492dc722ea9SPavankumar Nandeshwar 
493dc722ea9SPavankumar Nandeshwar 	last = u32_encode_bits(last, RX_MSDU_DESC_INFO0_LAST_MSDU_IN_MPDU);
494dc722ea9SPavankumar Nandeshwar 	first = u32_encode_bits(first, RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU);
495dc722ea9SPavankumar Nandeshwar 	msdu_details = &link_desc->msdu_link[0];
496dc722ea9SPavankumar Nandeshwar 
497dc722ea9SPavankumar Nandeshwar 	for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
498dc722ea9SPavankumar Nandeshwar 		if (!i && le32_get_bits(msdu_details[i].buf_addr_info.info0,
499dc722ea9SPavankumar Nandeshwar 					BUFFER_ADDR_INFO0_ADDR) == 0)
500dc722ea9SPavankumar Nandeshwar 			break;
501dc722ea9SPavankumar Nandeshwar 		if (le32_get_bits(msdu_details[i].buf_addr_info.info0,
502dc722ea9SPavankumar Nandeshwar 				  BUFFER_ADDR_INFO0_ADDR) == 0) {
503dc722ea9SPavankumar Nandeshwar 			msdu_desc_info = &msdu_details[i - 1].rx_msdu_info;
504dc722ea9SPavankumar Nandeshwar 			msdu_desc_info->info0 |= cpu_to_le32(last);
505dc722ea9SPavankumar Nandeshwar 			break;
506dc722ea9SPavankumar Nandeshwar 		}
507dc722ea9SPavankumar Nandeshwar 		msdu_desc_info = &msdu_details[i].rx_msdu_info;
508dc722ea9SPavankumar Nandeshwar 
509dc722ea9SPavankumar Nandeshwar 		if (!i)
510dc722ea9SPavankumar Nandeshwar 			msdu_desc_info->info0 |= cpu_to_le32(first);
511dc722ea9SPavankumar Nandeshwar 		else if (i == (HAL_RX_NUM_MSDU_DESC - 1))
512dc722ea9SPavankumar Nandeshwar 			msdu_desc_info->info0 |= cpu_to_le32(last);
513dc722ea9SPavankumar Nandeshwar 		msdu_list->msdu_info[i].msdu_flags = le32_to_cpu(msdu_desc_info->info0);
514dc722ea9SPavankumar Nandeshwar 		msdu_list->msdu_info[i].msdu_len =
515dc722ea9SPavankumar Nandeshwar 			 HAL_RX_MSDU_PKT_LENGTH_GET(msdu_desc_info->info0);
516dc722ea9SPavankumar Nandeshwar 		msdu_list->sw_cookie[i] =
517dc722ea9SPavankumar Nandeshwar 			le32_get_bits(msdu_details[i].buf_addr_info.info1,
518dc722ea9SPavankumar Nandeshwar 				      BUFFER_ADDR_INFO1_SW_COOKIE);
519dc722ea9SPavankumar Nandeshwar 		tmp = le32_get_bits(msdu_details[i].buf_addr_info.info1,
520dc722ea9SPavankumar Nandeshwar 				    BUFFER_ADDR_INFO1_RET_BUF_MGR);
521dc722ea9SPavankumar Nandeshwar 		msdu_list->paddr[i] =
522dc722ea9SPavankumar Nandeshwar 			((u64)(le32_get_bits(msdu_details[i].buf_addr_info.info1,
523dc722ea9SPavankumar Nandeshwar 					     BUFFER_ADDR_INFO1_ADDR)) << 32) |
524dc722ea9SPavankumar Nandeshwar 			le32_get_bits(msdu_details[i].buf_addr_info.info0,
525dc722ea9SPavankumar Nandeshwar 				      BUFFER_ADDR_INFO0_ADDR);
526dc722ea9SPavankumar Nandeshwar 		msdu_list->rbm[i] = tmp;
527dc722ea9SPavankumar Nandeshwar 	}
528dc722ea9SPavankumar Nandeshwar 	*num_msdus = i;
529dc722ea9SPavankumar Nandeshwar }
530dc722ea9SPavankumar Nandeshwar 
531972f34d5SPavankumar Nandeshwar void
532972f34d5SPavankumar Nandeshwar ath12k_wifi7_hal_rx_msdu_link_desc_set(struct ath12k_base *ab,
533dc722ea9SPavankumar Nandeshwar 				       struct hal_wbm_release_ring *desc,
534dc722ea9SPavankumar Nandeshwar 				       struct ath12k_buffer_addr *buf_addr_info,
535dc722ea9SPavankumar Nandeshwar 				       enum hal_wbm_rel_bm_act action)
536dc722ea9SPavankumar Nandeshwar {
537dc722ea9SPavankumar Nandeshwar 	desc->buf_addr_info = *buf_addr_info;
538dc722ea9SPavankumar Nandeshwar 	desc->info0 |= le32_encode_bits(HAL_WBM_REL_SRC_MODULE_SW,
539dc722ea9SPavankumar Nandeshwar 					HAL_WBM_RELEASE_INFO0_REL_SRC_MODULE) |
540dc722ea9SPavankumar Nandeshwar 		    le32_encode_bits(action, HAL_WBM_RELEASE_INFO0_BM_ACTION) |
541dc722ea9SPavankumar Nandeshwar 		    le32_encode_bits(HAL_WBM_REL_DESC_TYPE_MSDU_LINK,
542dc722ea9SPavankumar Nandeshwar 				     HAL_WBM_RELEASE_INFO0_DESC_TYPE);
543dc722ea9SPavankumar Nandeshwar }
544dc722ea9SPavankumar Nandeshwar 
545972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_status_queue_stats(struct ath12k_base *ab,
5461f165022SBaochen Qiang 					     struct hal_reo_get_queue_stats_status *desc,
547dc722ea9SPavankumar Nandeshwar 					     struct hal_reo_status *status)
548dc722ea9SPavankumar Nandeshwar {
549dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
550dc722ea9SPavankumar Nandeshwar 				le32_get_bits(desc->hdr.info0,
551dc722ea9SPavankumar Nandeshwar 					      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
552dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
553dc722ea9SPavankumar Nandeshwar 				le32_get_bits(desc->hdr.info0,
554dc722ea9SPavankumar Nandeshwar 					      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
555dc722ea9SPavankumar Nandeshwar 
556dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "Queue stats status:\n");
557dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "header: cmd_num %d status %d\n",
558dc722ea9SPavankumar Nandeshwar 		   status->uniform_hdr.cmd_num,
559dc722ea9SPavankumar Nandeshwar 		   status->uniform_hdr.cmd_status);
560dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "ssn %u cur_idx %u\n",
561dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info0,
562dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO0_SSN),
563dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info0,
564dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO0_CUR_IDX));
565dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "pn = [%08x, %08x, %08x, %08x]\n",
566dc722ea9SPavankumar Nandeshwar 		   desc->pn[0], desc->pn[1], desc->pn[2], desc->pn[3]);
567dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "last_rx: enqueue_tstamp %08x dequeue_tstamp %08x\n",
568dc722ea9SPavankumar Nandeshwar 		   desc->last_rx_enqueue_timestamp,
569dc722ea9SPavankumar Nandeshwar 		   desc->last_rx_dequeue_timestamp);
570dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "rx_bitmap [%08x %08x %08x %08x %08x %08x %08x %08x]\n",
571dc722ea9SPavankumar Nandeshwar 		   desc->rx_bitmap[0], desc->rx_bitmap[1], desc->rx_bitmap[2],
572dc722ea9SPavankumar Nandeshwar 		   desc->rx_bitmap[3], desc->rx_bitmap[4], desc->rx_bitmap[5],
573dc722ea9SPavankumar Nandeshwar 		   desc->rx_bitmap[6], desc->rx_bitmap[7]);
574dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "count: cur_mpdu %u cur_msdu %u\n",
575dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info1,
576dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO1_MPDU_COUNT),
577dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info1,
578dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO1_MSDU_COUNT));
579dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "fwd_timeout %u fwd_bar %u dup_count %u\n",
580dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info2,
581dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO2_TIMEOUT_COUNT),
582dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info2,
583dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO2_FDTB_COUNT),
584dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info2,
585dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO2_DUPLICATE_COUNT));
586dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "frames_in_order %u bar_rcvd %u\n",
587dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info3,
588dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO3_FIO_COUNT),
589dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info3,
590dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO3_BAR_RCVD_CNT));
591dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "num_mpdus %d num_msdus %d total_bytes %d\n",
592dc722ea9SPavankumar Nandeshwar 		   desc->num_mpdu_frames, desc->num_msdu_frames,
593dc722ea9SPavankumar Nandeshwar 		   desc->total_bytes);
594dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "late_rcvd %u win_jump_2k %u hole_cnt %u\n",
595dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info4,
596dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO4_LATE_RX_MPDU),
597dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info2,
598dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO2_WINDOW_JMP2K),
599dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info4,
600dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO4_HOLE_COUNT));
601dc722ea9SPavankumar Nandeshwar 	ath12k_dbg(ab, ATH12K_DBG_HAL, "looping count %u\n",
602dc722ea9SPavankumar Nandeshwar 		   le32_get_bits(desc->info5,
603dc722ea9SPavankumar Nandeshwar 				 HAL_REO_GET_QUEUE_STATS_STATUS_INFO5_LOOPING_CNT));
604dc722ea9SPavankumar Nandeshwar }
605dc722ea9SPavankumar Nandeshwar 
606972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_flush_queue_status(struct ath12k_base *ab,
6071f165022SBaochen Qiang 					     struct hal_reo_flush_queue_status *desc,
608dc722ea9SPavankumar Nandeshwar 					     struct hal_reo_status *status)
609dc722ea9SPavankumar Nandeshwar {
610dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
611dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
612dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
613dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
614dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
615dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
616dc722ea9SPavankumar Nandeshwar 	status->u.flush_queue.err_detected =
617dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
618dc722ea9SPavankumar Nandeshwar 				      HAL_REO_FLUSH_QUEUE_INFO0_ERR_DETECTED);
619dc722ea9SPavankumar Nandeshwar }
620dc722ea9SPavankumar Nandeshwar 
621972f34d5SPavankumar Nandeshwar void
622972f34d5SPavankumar Nandeshwar ath12k_wifi7_hal_reo_flush_cache_status(struct ath12k_base *ab,
6231f165022SBaochen Qiang 					struct hal_reo_flush_cache_status *desc,
624dc722ea9SPavankumar Nandeshwar 					struct hal_reo_status *status)
625dc722ea9SPavankumar Nandeshwar {
626dc722ea9SPavankumar Nandeshwar 	struct ath12k_hal *hal = &ab->hal;
627dc722ea9SPavankumar Nandeshwar 
628dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
629dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
630dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
631dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
632dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
633dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
634dc722ea9SPavankumar Nandeshwar 
635dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.err_detected =
636dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
637dc722ea9SPavankumar Nandeshwar 				      HAL_REO_FLUSH_CACHE_STATUS_INFO0_IS_ERR);
638dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.err_code =
639dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
640dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_CACHE_STATUS_INFO0_BLOCK_ERR_CODE);
641dc722ea9SPavankumar Nandeshwar 	if (!status->u.flush_cache.err_code)
642dc722ea9SPavankumar Nandeshwar 		hal->avail_blk_resource |= BIT(hal->current_blk_index);
643dc722ea9SPavankumar Nandeshwar 
644dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.cache_controller_flush_status_hit =
645dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
646dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_CACHE_STATUS_INFO0_FLUSH_STATUS_HIT);
647dc722ea9SPavankumar Nandeshwar 
648dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.cache_controller_flush_status_desc_type =
649dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
650dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_CACHE_STATUS_INFO0_FLUSH_DESC_TYPE);
651dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.cache_controller_flush_status_client_id =
652dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
653dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_CACHE_STATUS_INFO0_FLUSH_CLIENT_ID);
654dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.cache_controller_flush_status_err =
655dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
656dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_CACHE_STATUS_INFO0_FLUSH_ERR);
657dc722ea9SPavankumar Nandeshwar 	status->u.flush_cache.cache_controller_flush_status_cnt =
658dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
659dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_CACHE_STATUS_INFO0_FLUSH_COUNT);
660dc722ea9SPavankumar Nandeshwar }
661dc722ea9SPavankumar Nandeshwar 
662972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_unblk_cache_status(struct ath12k_base *ab,
6631f165022SBaochen Qiang 					     struct hal_reo_unblock_cache_status *desc,
664dc722ea9SPavankumar Nandeshwar 					     struct hal_reo_status *status)
665dc722ea9SPavankumar Nandeshwar {
666dc722ea9SPavankumar Nandeshwar 	struct ath12k_hal *hal = &ab->hal;
667dc722ea9SPavankumar Nandeshwar 
668dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
669dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
670dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
671dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
672dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
673dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
674dc722ea9SPavankumar Nandeshwar 
675dc722ea9SPavankumar Nandeshwar 	status->u.unblock_cache.err_detected =
676dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
677dc722ea9SPavankumar Nandeshwar 				      HAL_REO_UNBLOCK_CACHE_STATUS_INFO0_IS_ERR);
678dc722ea9SPavankumar Nandeshwar 	status->u.unblock_cache.unblock_type =
679dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
680dc722ea9SPavankumar Nandeshwar 				      HAL_REO_UNBLOCK_CACHE_STATUS_INFO0_TYPE);
681dc722ea9SPavankumar Nandeshwar 
682dc722ea9SPavankumar Nandeshwar 	if (!status->u.unblock_cache.err_detected &&
683dc722ea9SPavankumar Nandeshwar 	    status->u.unblock_cache.unblock_type ==
684dc722ea9SPavankumar Nandeshwar 	    HAL_REO_STATUS_UNBLOCK_BLOCKING_RESOURCE)
685dc722ea9SPavankumar Nandeshwar 		hal->avail_blk_resource &= ~BIT(hal->current_blk_index);
686dc722ea9SPavankumar Nandeshwar }
687dc722ea9SPavankumar Nandeshwar 
688972f34d5SPavankumar Nandeshwar void
689972f34d5SPavankumar Nandeshwar ath12k_wifi7_hal_reo_flush_timeout_list_status(struct ath12k_base *ab,
6901f165022SBaochen Qiang 					       struct hal_reo_flush_timeout_list_status *desc,
691dc722ea9SPavankumar Nandeshwar 					       struct hal_reo_status *status)
692dc722ea9SPavankumar Nandeshwar {
693dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
694dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
695dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
696dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
697dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
698dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
699dc722ea9SPavankumar Nandeshwar 
700dc722ea9SPavankumar Nandeshwar 	status->u.timeout_list.err_detected =
701dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
702dc722ea9SPavankumar Nandeshwar 				      HAL_REO_FLUSH_TIMEOUT_STATUS_INFO0_IS_ERR);
703dc722ea9SPavankumar Nandeshwar 	status->u.timeout_list.list_empty =
704dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
705dc722ea9SPavankumar Nandeshwar 				      HAL_REO_FLUSH_TIMEOUT_STATUS_INFO0_LIST_EMPTY);
706dc722ea9SPavankumar Nandeshwar 
707dc722ea9SPavankumar Nandeshwar 	status->u.timeout_list.release_desc_cnt =
708dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info1,
709dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_TIMEOUT_STATUS_INFO1_REL_DESC_COUNT);
710dc722ea9SPavankumar Nandeshwar 	status->u.timeout_list.fwd_buf_cnt =
711dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
712dc722ea9SPavankumar Nandeshwar 			      HAL_REO_FLUSH_TIMEOUT_STATUS_INFO1_FWD_BUF_COUNT);
713dc722ea9SPavankumar Nandeshwar }
714dc722ea9SPavankumar Nandeshwar 
715972f34d5SPavankumar Nandeshwar void
716972f34d5SPavankumar Nandeshwar ath12k_wifi7_hal_reo_desc_thresh_reached_status(struct ath12k_base *ab,
7171f165022SBaochen Qiang 						struct hal_reo_desc_thresh_reached_status *desc,
718dc722ea9SPavankumar Nandeshwar 						struct hal_reo_status *status)
719dc722ea9SPavankumar Nandeshwar {
720dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
721dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
722dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
723dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
724dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->hdr.info0,
725dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
726dc722ea9SPavankumar Nandeshwar 
727dc722ea9SPavankumar Nandeshwar 	status->u.desc_thresh_reached.threshold_idx =
728dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info0,
729dc722ea9SPavankumar Nandeshwar 			      HAL_REO_DESC_THRESH_STATUS_INFO0_THRESH_INDEX);
730dc722ea9SPavankumar Nandeshwar 
731dc722ea9SPavankumar Nandeshwar 	status->u.desc_thresh_reached.link_desc_counter0 =
732dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info1,
733dc722ea9SPavankumar Nandeshwar 			      HAL_REO_DESC_THRESH_STATUS_INFO1_LINK_DESC_COUNTER0);
734dc722ea9SPavankumar Nandeshwar 
735dc722ea9SPavankumar Nandeshwar 	status->u.desc_thresh_reached.link_desc_counter1 =
736dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info2,
737dc722ea9SPavankumar Nandeshwar 			      HAL_REO_DESC_THRESH_STATUS_INFO2_LINK_DESC_COUNTER1);
738dc722ea9SPavankumar Nandeshwar 
739dc722ea9SPavankumar Nandeshwar 	status->u.desc_thresh_reached.link_desc_counter2 =
740dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info3,
741dc722ea9SPavankumar Nandeshwar 			      HAL_REO_DESC_THRESH_STATUS_INFO3_LINK_DESC_COUNTER2);
742dc722ea9SPavankumar Nandeshwar 
743dc722ea9SPavankumar Nandeshwar 	status->u.desc_thresh_reached.link_desc_counter_sum =
744dc722ea9SPavankumar Nandeshwar 		le32_get_bits(desc->info4,
745dc722ea9SPavankumar Nandeshwar 			      HAL_REO_DESC_THRESH_STATUS_INFO4_LINK_DESC_COUNTER_SUM);
746dc722ea9SPavankumar Nandeshwar }
747dc722ea9SPavankumar Nandeshwar 
748972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_update_rx_reo_queue_status(struct ath12k_base *ab,
7491f165022SBaochen Qiang 						     struct hal_reo_status_hdr *desc,
750dc722ea9SPavankumar Nandeshwar 						     struct hal_reo_status *status)
751dc722ea9SPavankumar Nandeshwar {
752dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_num =
753dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
754dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_STATUS_NUM);
755dc722ea9SPavankumar Nandeshwar 	status->uniform_hdr.cmd_status =
756dc722ea9SPavankumar Nandeshwar 			le32_get_bits(desc->info0,
757dc722ea9SPavankumar Nandeshwar 				      HAL_REO_STATUS_HDR_INFO0_EXEC_STATUS);
758dc722ea9SPavankumar Nandeshwar }
759dc722ea9SPavankumar Nandeshwar 
760972f34d5SPavankumar Nandeshwar u32 ath12k_wifi7_hal_reo_qdesc_size(u32 ba_window_size, u8 tid)
761dc722ea9SPavankumar Nandeshwar {
762dc722ea9SPavankumar Nandeshwar 	u32 num_ext_desc, num_1k_desc = 0;
763dc722ea9SPavankumar Nandeshwar 
764dc722ea9SPavankumar Nandeshwar 	if (ba_window_size <= 1) {
765dc722ea9SPavankumar Nandeshwar 		if (tid != HAL_DESC_REO_NON_QOS_TID)
766dc722ea9SPavankumar Nandeshwar 			num_ext_desc = 1;
767dc722ea9SPavankumar Nandeshwar 		else
768dc722ea9SPavankumar Nandeshwar 			num_ext_desc = 0;
769dc722ea9SPavankumar Nandeshwar 
770dc722ea9SPavankumar Nandeshwar 	} else if (ba_window_size <= 105) {
771dc722ea9SPavankumar Nandeshwar 		num_ext_desc = 1;
772dc722ea9SPavankumar Nandeshwar 	} else if (ba_window_size <= 210) {
773dc722ea9SPavankumar Nandeshwar 		num_ext_desc = 2;
774dc722ea9SPavankumar Nandeshwar 	} else if (ba_window_size <= 256) {
775dc722ea9SPavankumar Nandeshwar 		num_ext_desc = 3;
776dc722ea9SPavankumar Nandeshwar 	} else {
777dc722ea9SPavankumar Nandeshwar 		num_ext_desc = 10;
778dc722ea9SPavankumar Nandeshwar 		num_1k_desc = 1;
779dc722ea9SPavankumar Nandeshwar 	}
780dc722ea9SPavankumar Nandeshwar 
781dc722ea9SPavankumar Nandeshwar 	return sizeof(struct hal_rx_reo_queue) +
782dc722ea9SPavankumar Nandeshwar 		(num_ext_desc * sizeof(struct hal_rx_reo_queue_ext)) +
783dc722ea9SPavankumar Nandeshwar 		(num_1k_desc * sizeof(struct hal_rx_reo_queue_1k));
784dc722ea9SPavankumar Nandeshwar }
785dc722ea9SPavankumar Nandeshwar 
786972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_qdesc_setup(struct hal_rx_reo_queue *qdesc,
787dc722ea9SPavankumar Nandeshwar 				      int tid, u32 ba_window_size,
788dc722ea9SPavankumar Nandeshwar 				      u32 start_seq, enum hal_pn_type type)
789dc722ea9SPavankumar Nandeshwar {
790dc722ea9SPavankumar Nandeshwar 	struct hal_rx_reo_queue_ext *ext_desc;
791dc722ea9SPavankumar Nandeshwar 
792972f34d5SPavankumar Nandeshwar 	ath12k_wifi7_hal_reo_set_desc_hdr(&qdesc->desc_hdr, HAL_DESC_REO_OWNED,
793dc722ea9SPavankumar Nandeshwar 					  HAL_DESC_REO_QUEUE_DESC,
794dc722ea9SPavankumar Nandeshwar 					  REO_QUEUE_DESC_MAGIC_DEBUG_PATTERN_0);
795dc722ea9SPavankumar Nandeshwar 
796dc722ea9SPavankumar Nandeshwar 	qdesc->rx_queue_num = le32_encode_bits(tid, HAL_RX_REO_QUEUE_RX_QUEUE_NUMBER);
797dc722ea9SPavankumar Nandeshwar 
798dc722ea9SPavankumar Nandeshwar 	qdesc->info0 =
799dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(1, HAL_RX_REO_QUEUE_INFO0_VLD) |
800dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(1, HAL_RX_REO_QUEUE_INFO0_ASSOC_LNK_DESC_COUNTER) |
801dc722ea9SPavankumar Nandeshwar 		le32_encode_bits(ath12k_tid_to_ac(tid), HAL_RX_REO_QUEUE_INFO0_AC);
802dc722ea9SPavankumar Nandeshwar 
803dc722ea9SPavankumar Nandeshwar 	if (ba_window_size < 1)
804dc722ea9SPavankumar Nandeshwar 		ba_window_size = 1;
805dc722ea9SPavankumar Nandeshwar 
806dc722ea9SPavankumar Nandeshwar 	if (ba_window_size == 1 && tid != HAL_DESC_REO_NON_QOS_TID)
807dc722ea9SPavankumar Nandeshwar 		ba_window_size++;
808dc722ea9SPavankumar Nandeshwar 
809dc722ea9SPavankumar Nandeshwar 	if (ba_window_size == 1)
810dc722ea9SPavankumar Nandeshwar 		qdesc->info0 |= le32_encode_bits(1, HAL_RX_REO_QUEUE_INFO0_RETRY);
811dc722ea9SPavankumar Nandeshwar 
812dc722ea9SPavankumar Nandeshwar 	qdesc->info0 |= le32_encode_bits(ba_window_size - 1,
813dc722ea9SPavankumar Nandeshwar 					 HAL_RX_REO_QUEUE_INFO0_BA_WINDOW_SIZE);
814dc722ea9SPavankumar Nandeshwar 	switch (type) {
815dc722ea9SPavankumar Nandeshwar 	case HAL_PN_TYPE_NONE:
816dc722ea9SPavankumar Nandeshwar 	case HAL_PN_TYPE_WAPI_EVEN:
817dc722ea9SPavankumar Nandeshwar 	case HAL_PN_TYPE_WAPI_UNEVEN:
818dc722ea9SPavankumar Nandeshwar 		break;
819dc722ea9SPavankumar Nandeshwar 	case HAL_PN_TYPE_WPA:
820dc722ea9SPavankumar Nandeshwar 		qdesc->info0 |=
821dc722ea9SPavankumar Nandeshwar 			le32_encode_bits(1, HAL_RX_REO_QUEUE_INFO0_PN_CHECK) |
822dc722ea9SPavankumar Nandeshwar 			le32_encode_bits(HAL_RX_REO_QUEUE_PN_SIZE_48,
823dc722ea9SPavankumar Nandeshwar 					 HAL_RX_REO_QUEUE_INFO0_PN_SIZE);
824dc722ea9SPavankumar Nandeshwar 		break;
825dc722ea9SPavankumar Nandeshwar 	}
826dc722ea9SPavankumar Nandeshwar 
827dc722ea9SPavankumar Nandeshwar 	/* TODO: Set Ignore ampdu flags based on BA window size and/or
828dc722ea9SPavankumar Nandeshwar 	 * AMPDU capabilities
829dc722ea9SPavankumar Nandeshwar 	 */
830dc722ea9SPavankumar Nandeshwar 	qdesc->info0 |= le32_encode_bits(1, HAL_RX_REO_QUEUE_INFO0_IGNORE_AMPDU_FLG);
831dc722ea9SPavankumar Nandeshwar 
832dc722ea9SPavankumar Nandeshwar 	qdesc->info1 |= le32_encode_bits(0, HAL_RX_REO_QUEUE_INFO1_SVLD);
833dc722ea9SPavankumar Nandeshwar 
834dc722ea9SPavankumar Nandeshwar 	if (start_seq <= 0xfff)
835dc722ea9SPavankumar Nandeshwar 		qdesc->info1 = le32_encode_bits(start_seq,
836dc722ea9SPavankumar Nandeshwar 						HAL_RX_REO_QUEUE_INFO1_SSN);
837dc722ea9SPavankumar Nandeshwar 
838dc722ea9SPavankumar Nandeshwar 	if (tid == HAL_DESC_REO_NON_QOS_TID)
839dc722ea9SPavankumar Nandeshwar 		return;
840dc722ea9SPavankumar Nandeshwar 
841dc722ea9SPavankumar Nandeshwar 	ext_desc = qdesc->ext_desc;
842dc722ea9SPavankumar Nandeshwar 
843dc722ea9SPavankumar Nandeshwar 	/* TODO: HW queue descriptors are currently allocated for max BA
844dc722ea9SPavankumar Nandeshwar 	 * window size for all QOS TIDs so that same descriptor can be used
845dc722ea9SPavankumar Nandeshwar 	 * later when ADDBA request is received. This should be changed to
846dc722ea9SPavankumar Nandeshwar 	 * allocate HW queue descriptors based on BA window size being
847dc722ea9SPavankumar Nandeshwar 	 * negotiated (0 for non BA cases), and reallocate when BA window
848dc722ea9SPavankumar Nandeshwar 	 * size changes and also send WMI message to FW to change the REO
849dc722ea9SPavankumar Nandeshwar 	 * queue descriptor in Rx peer entry as part of dp_rx_tid_update.
850dc722ea9SPavankumar Nandeshwar 	 */
851dc722ea9SPavankumar Nandeshwar 	memset(ext_desc, 0, 3 * sizeof(*ext_desc));
852972f34d5SPavankumar Nandeshwar 	ath12k_wifi7_hal_reo_set_desc_hdr(&ext_desc->desc_hdr,
853972f34d5SPavankumar Nandeshwar 					  HAL_DESC_REO_OWNED,
854dc722ea9SPavankumar Nandeshwar 					  HAL_DESC_REO_QUEUE_EXT_DESC,
855dc722ea9SPavankumar Nandeshwar 					  REO_QUEUE_DESC_MAGIC_DEBUG_PATTERN_1);
856dc722ea9SPavankumar Nandeshwar 	ext_desc++;
857972f34d5SPavankumar Nandeshwar 	ath12k_wifi7_hal_reo_set_desc_hdr(&ext_desc->desc_hdr,
858972f34d5SPavankumar Nandeshwar 					  HAL_DESC_REO_OWNED,
859dc722ea9SPavankumar Nandeshwar 					  HAL_DESC_REO_QUEUE_EXT_DESC,
860dc722ea9SPavankumar Nandeshwar 					  REO_QUEUE_DESC_MAGIC_DEBUG_PATTERN_2);
861dc722ea9SPavankumar Nandeshwar 	ext_desc++;
862972f34d5SPavankumar Nandeshwar 	ath12k_wifi7_hal_reo_set_desc_hdr(&ext_desc->desc_hdr,
863972f34d5SPavankumar Nandeshwar 					  HAL_DESC_REO_OWNED,
864dc722ea9SPavankumar Nandeshwar 					  HAL_DESC_REO_QUEUE_EXT_DESC,
865dc722ea9SPavankumar Nandeshwar 					  REO_QUEUE_DESC_MAGIC_DEBUG_PATTERN_3);
866dc722ea9SPavankumar Nandeshwar }
867dc722ea9SPavankumar Nandeshwar 
8689615a672SBaochen Qiang void ath12k_wifi7_hal_reo_init_cmd_ring_tlv64(struct ath12k_base *ab,
869dc722ea9SPavankumar Nandeshwar 					      struct hal_srng *srng)
870dc722ea9SPavankumar Nandeshwar {
871dc722ea9SPavankumar Nandeshwar 	struct hal_srng_params params;
872dc722ea9SPavankumar Nandeshwar 	struct hal_tlv_64_hdr *tlv;
873dc722ea9SPavankumar Nandeshwar 	struct hal_reo_get_queue_stats *desc;
874dc722ea9SPavankumar Nandeshwar 	int i, cmd_num = 1;
875dc722ea9SPavankumar Nandeshwar 	int entry_size;
876dc722ea9SPavankumar Nandeshwar 	u8 *entry;
877dc722ea9SPavankumar Nandeshwar 
878dc722ea9SPavankumar Nandeshwar 	memset(&params, 0, sizeof(params));
879dc722ea9SPavankumar Nandeshwar 
880dc722ea9SPavankumar Nandeshwar 	entry_size = ath12k_hal_srng_get_entrysize(ab, HAL_REO_CMD);
881dc722ea9SPavankumar Nandeshwar 	ath12k_hal_srng_get_params(ab, srng, &params);
882dc722ea9SPavankumar Nandeshwar 	entry = (u8 *)params.ring_base_vaddr;
883dc722ea9SPavankumar Nandeshwar 
884dc722ea9SPavankumar Nandeshwar 	for (i = 0; i < params.num_entries; i++) {
885dc722ea9SPavankumar Nandeshwar 		tlv = (struct hal_tlv_64_hdr *)entry;
886dc722ea9SPavankumar Nandeshwar 		desc = (struct hal_reo_get_queue_stats *)tlv->value;
887dc722ea9SPavankumar Nandeshwar 		desc->cmd.info0 = le32_encode_bits(cmd_num++,
888dc722ea9SPavankumar Nandeshwar 						   HAL_REO_CMD_HDR_INFO0_CMD_NUMBER);
889dc722ea9SPavankumar Nandeshwar 		entry += entry_size;
890dc722ea9SPavankumar Nandeshwar 	}
891dc722ea9SPavankumar Nandeshwar }
892dc722ea9SPavankumar Nandeshwar 
893*b7ffeb0fSBaochen Qiang void ath12k_wifi7_hal_reo_init_cmd_ring_tlv32(struct ath12k_base *ab,
894*b7ffeb0fSBaochen Qiang 					      struct hal_srng *srng)
895*b7ffeb0fSBaochen Qiang {
896*b7ffeb0fSBaochen Qiang 	struct hal_reo_get_queue_stats *desc;
897*b7ffeb0fSBaochen Qiang 	struct hal_srng_params params;
898*b7ffeb0fSBaochen Qiang 	struct hal_tlv_hdr *tlv;
899*b7ffeb0fSBaochen Qiang 	int i, cmd_num = 1;
900*b7ffeb0fSBaochen Qiang 	int entry_size;
901*b7ffeb0fSBaochen Qiang 	u8 *entry;
902*b7ffeb0fSBaochen Qiang 
903*b7ffeb0fSBaochen Qiang 	memset(&params, 0, sizeof(params));
904*b7ffeb0fSBaochen Qiang 
905*b7ffeb0fSBaochen Qiang 	entry_size = ath12k_hal_srng_get_entrysize(ab, HAL_REO_CMD);
906*b7ffeb0fSBaochen Qiang 	ath12k_hal_srng_get_params(ab, srng, &params);
907*b7ffeb0fSBaochen Qiang 	entry = (u8 *)params.ring_base_vaddr;
908*b7ffeb0fSBaochen Qiang 
909*b7ffeb0fSBaochen Qiang 	for (i = 0; i < params.num_entries; i++) {
910*b7ffeb0fSBaochen Qiang 		tlv = (struct hal_tlv_hdr *)entry;
911*b7ffeb0fSBaochen Qiang 		desc = (struct hal_reo_get_queue_stats *)tlv->value;
912*b7ffeb0fSBaochen Qiang 		desc->cmd.info0 = le32_encode_bits(cmd_num++,
913*b7ffeb0fSBaochen Qiang 						   HAL_REO_CMD_HDR_INFO0_CMD_NUMBER);
914*b7ffeb0fSBaochen Qiang 		entry += entry_size;
915*b7ffeb0fSBaochen Qiang 	}
916*b7ffeb0fSBaochen Qiang }
917*b7ffeb0fSBaochen Qiang 
918972f34d5SPavankumar Nandeshwar void ath12k_wifi7_hal_reo_hw_setup(struct ath12k_base *ab, u32 ring_hash_map)
919dc722ea9SPavankumar Nandeshwar {
920b3821366SPavankumar Nandeshwar 	struct ath12k_hal *hal = &ab->hal;
921b3821366SPavankumar Nandeshwar 
922dc722ea9SPavankumar Nandeshwar 	u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG;
923dc722ea9SPavankumar Nandeshwar 	u32 val;
924dc722ea9SPavankumar Nandeshwar 
925dc722ea9SPavankumar Nandeshwar 	val = ath12k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE);
926dc722ea9SPavankumar Nandeshwar 
927dc722ea9SPavankumar Nandeshwar 	val |= u32_encode_bits(1, HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE) |
928dc722ea9SPavankumar Nandeshwar 	       u32_encode_bits(1, HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE);
929dc722ea9SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val);
930dc722ea9SPavankumar Nandeshwar 
931b3821366SPavankumar Nandeshwar 	val = ath12k_hif_read32(ab, reo_base + HAL_REO1_MISC_CTRL_ADDR(hal));
932dc722ea9SPavankumar Nandeshwar 
933dc722ea9SPavankumar Nandeshwar 	val &= ~(HAL_REO1_MISC_CTL_FRAG_DST_RING |
934dc722ea9SPavankumar Nandeshwar 		 HAL_REO1_MISC_CTL_BAR_DST_RING);
935dc722ea9SPavankumar Nandeshwar 	val |= u32_encode_bits(HAL_SRNG_RING_ID_REO2SW0,
936dc722ea9SPavankumar Nandeshwar 			       HAL_REO1_MISC_CTL_FRAG_DST_RING);
937dc722ea9SPavankumar Nandeshwar 	val |= u32_encode_bits(HAL_SRNG_RING_ID_REO2SW0,
938dc722ea9SPavankumar Nandeshwar 			       HAL_REO1_MISC_CTL_BAR_DST_RING);
939b3821366SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_MISC_CTRL_ADDR(hal), val);
940dc722ea9SPavankumar Nandeshwar 
941b3821366SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(hal),
942dc722ea9SPavankumar Nandeshwar 			   HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_USEC);
943b3821366SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(hal),
944dc722ea9SPavankumar Nandeshwar 			   HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_USEC);
945b3821366SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(hal),
946dc722ea9SPavankumar Nandeshwar 			   HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_USEC);
947b3821366SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(hal),
948dc722ea9SPavankumar Nandeshwar 			   HAL_DEFAULT_VO_REO_TIMEOUT_USEC);
949dc722ea9SPavankumar Nandeshwar 
950dc722ea9SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2,
951dc722ea9SPavankumar Nandeshwar 			   ring_hash_map);
952dc722ea9SPavankumar Nandeshwar 	ath12k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3,
953dc722ea9SPavankumar Nandeshwar 			   ring_hash_map);
954dc722ea9SPavankumar Nandeshwar }
955dc722ea9SPavankumar Nandeshwar 
956631ee338SJeff Johnson void ath12k_wifi7_hal_reo_shared_qaddr_cache_clear(struct ath12k_base *ab)
957dc722ea9SPavankumar Nandeshwar {
958dc722ea9SPavankumar Nandeshwar 	u32 val;
959b3821366SPavankumar Nandeshwar 	struct ath12k_hal *hal = &ab->hal;
9600cafe8ccSHarsh Kumar Bijlani 	struct ath12k_dp *dp = ath12k_ab_to_dp(ab);
961dc722ea9SPavankumar Nandeshwar 
9620cafe8ccSHarsh Kumar Bijlani 	lockdep_assert_held(&dp->dp_lock);
963dc722ea9SPavankumar Nandeshwar 	val = ath12k_hif_read32(ab, HAL_SEQ_WCSS_UMAC_REO_REG +
964b3821366SPavankumar Nandeshwar 				HAL_REO1_QDESC_ADDR(hal));
965dc722ea9SPavankumar Nandeshwar 
966dc722ea9SPavankumar Nandeshwar 	val |= u32_encode_bits(1, HAL_REO_QDESC_ADDR_READ_CLEAR_QDESC_ARRAY);
967dc722ea9SPavankumar Nandeshwar 	ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG +
968b3821366SPavankumar Nandeshwar 			   HAL_REO1_QDESC_ADDR(hal), val);
969dc722ea9SPavankumar Nandeshwar 
970dc722ea9SPavankumar Nandeshwar 	val &= ~HAL_REO_QDESC_ADDR_READ_CLEAR_QDESC_ARRAY;
971dc722ea9SPavankumar Nandeshwar 	ath12k_hif_write32(ab, HAL_SEQ_WCSS_UMAC_REO_REG +
972b3821366SPavankumar Nandeshwar 			   HAL_REO1_QDESC_ADDR(hal), val);
973dc722ea9SPavankumar Nandeshwar }
974