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