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