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 #include <linux/dma-mapping.h>
7*5c1def83SBjoern A. Zeeb #include "hal_tx.h"
8*5c1def83SBjoern A. Zeeb #include "hal_rx.h"
9*5c1def83SBjoern A. Zeeb #include "debug.h"
10*5c1def83SBjoern A. Zeeb #include "hal_desc.h"
11*5c1def83SBjoern A. Zeeb #include "hif.h"
12*5c1def83SBjoern A. Zeeb
13*5c1def83SBjoern A. Zeeb static const struct hal_srng_config hw_srng_config_template[] = {
14*5c1def83SBjoern A. Zeeb /* TODO: max_rings can populated by querying HW capabilities */
15*5c1def83SBjoern A. Zeeb [HAL_REO_DST] = {
16*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_REO2SW1,
17*5c1def83SBjoern A. Zeeb .max_rings = 8,
18*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_reo_dest_ring) >> 2,
19*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
20*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
21*5c1def83SBjoern A. Zeeb .max_size = HAL_REO_REO2SW1_RING_BASE_MSB_RING_SIZE,
22*5c1def83SBjoern A. Zeeb },
23*5c1def83SBjoern A. Zeeb [HAL_REO_EXCEPTION] = {
24*5c1def83SBjoern A. Zeeb /* Designating REO2SW0 ring as exception ring.
25*5c1def83SBjoern A. Zeeb * Any of theREO2SW rings can be used as exception ring.
26*5c1def83SBjoern A. Zeeb */
27*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_REO2SW0,
28*5c1def83SBjoern A. Zeeb .max_rings = 1,
29*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_reo_dest_ring) >> 2,
30*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
31*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
32*5c1def83SBjoern A. Zeeb .max_size = HAL_REO_REO2SW0_RING_BASE_MSB_RING_SIZE,
33*5c1def83SBjoern A. Zeeb },
34*5c1def83SBjoern A. Zeeb [HAL_REO_REINJECT] = {
35*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_SW2REO,
36*5c1def83SBjoern A. Zeeb .max_rings = 4,
37*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_reo_entrance_ring) >> 2,
38*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
39*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
40*5c1def83SBjoern A. Zeeb .max_size = HAL_REO_SW2REO_RING_BASE_MSB_RING_SIZE,
41*5c1def83SBjoern A. Zeeb },
42*5c1def83SBjoern A. Zeeb [HAL_REO_CMD] = {
43*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_REO_CMD,
44*5c1def83SBjoern A. Zeeb .max_rings = 1,
45*5c1def83SBjoern A. Zeeb .entry_size = (sizeof(struct hal_tlv_64_hdr) +
46*5c1def83SBjoern A. Zeeb sizeof(struct hal_reo_get_queue_stats)) >> 2,
47*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
48*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
49*5c1def83SBjoern A. Zeeb .max_size = HAL_REO_CMD_RING_BASE_MSB_RING_SIZE,
50*5c1def83SBjoern A. Zeeb },
51*5c1def83SBjoern A. Zeeb [HAL_REO_STATUS] = {
52*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_REO_STATUS,
53*5c1def83SBjoern A. Zeeb .max_rings = 1,
54*5c1def83SBjoern A. Zeeb .entry_size = (sizeof(struct hal_tlv_64_hdr) +
55*5c1def83SBjoern A. Zeeb sizeof(struct hal_reo_get_queue_stats_status)) >> 2,
56*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
57*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
58*5c1def83SBjoern A. Zeeb .max_size = HAL_REO_STATUS_RING_BASE_MSB_RING_SIZE,
59*5c1def83SBjoern A. Zeeb },
60*5c1def83SBjoern A. Zeeb [HAL_TCL_DATA] = {
61*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_SW2TCL1,
62*5c1def83SBjoern A. Zeeb .max_rings = 6,
63*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_tcl_data_cmd) >> 2,
64*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
65*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
66*5c1def83SBjoern A. Zeeb .max_size = HAL_SW2TCL1_RING_BASE_MSB_RING_SIZE,
67*5c1def83SBjoern A. Zeeb },
68*5c1def83SBjoern A. Zeeb [HAL_TCL_CMD] = {
69*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_SW2TCL_CMD,
70*5c1def83SBjoern A. Zeeb .max_rings = 1,
71*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_tcl_gse_cmd) >> 2,
72*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
73*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
74*5c1def83SBjoern A. Zeeb .max_size = HAL_SW2TCL1_CMD_RING_BASE_MSB_RING_SIZE,
75*5c1def83SBjoern A. Zeeb },
76*5c1def83SBjoern A. Zeeb [HAL_TCL_STATUS] = {
77*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_TCL_STATUS,
78*5c1def83SBjoern A. Zeeb .max_rings = 1,
79*5c1def83SBjoern A. Zeeb .entry_size = (sizeof(struct hal_tlv_hdr) +
80*5c1def83SBjoern A. Zeeb sizeof(struct hal_tcl_status_ring)) >> 2,
81*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
82*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
83*5c1def83SBjoern A. Zeeb .max_size = HAL_TCL_STATUS_RING_BASE_MSB_RING_SIZE,
84*5c1def83SBjoern A. Zeeb },
85*5c1def83SBjoern A. Zeeb [HAL_CE_SRC] = {
86*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_CE0_SRC,
87*5c1def83SBjoern A. Zeeb .max_rings = 16,
88*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_ce_srng_src_desc) >> 2,
89*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
90*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
91*5c1def83SBjoern A. Zeeb .max_size = HAL_CE_SRC_RING_BASE_MSB_RING_SIZE,
92*5c1def83SBjoern A. Zeeb },
93*5c1def83SBjoern A. Zeeb [HAL_CE_DST] = {
94*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_CE0_DST,
95*5c1def83SBjoern A. Zeeb .max_rings = 16,
96*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_ce_srng_dest_desc) >> 2,
97*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
98*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
99*5c1def83SBjoern A. Zeeb .max_size = HAL_CE_DST_RING_BASE_MSB_RING_SIZE,
100*5c1def83SBjoern A. Zeeb },
101*5c1def83SBjoern A. Zeeb [HAL_CE_DST_STATUS] = {
102*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_CE0_DST_STATUS,
103*5c1def83SBjoern A. Zeeb .max_rings = 16,
104*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_ce_srng_dst_status_desc) >> 2,
105*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
106*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
107*5c1def83SBjoern A. Zeeb .max_size = HAL_CE_DST_STATUS_RING_BASE_MSB_RING_SIZE,
108*5c1def83SBjoern A. Zeeb },
109*5c1def83SBjoern A. Zeeb [HAL_WBM_IDLE_LINK] = {
110*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WBM_IDLE_LINK,
111*5c1def83SBjoern A. Zeeb .max_rings = 1,
112*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_wbm_link_desc) >> 2,
113*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
114*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
115*5c1def83SBjoern A. Zeeb .max_size = HAL_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE,
116*5c1def83SBjoern A. Zeeb },
117*5c1def83SBjoern A. Zeeb [HAL_SW2WBM_RELEASE] = {
118*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WBM_SW0_RELEASE,
119*5c1def83SBjoern A. Zeeb .max_rings = 2,
120*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_wbm_release_ring) >> 2,
121*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
122*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
123*5c1def83SBjoern A. Zeeb .max_size = HAL_SW2WBM_RELEASE_RING_BASE_MSB_RING_SIZE,
124*5c1def83SBjoern A. Zeeb },
125*5c1def83SBjoern A. Zeeb [HAL_WBM2SW_RELEASE] = {
126*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WBM2SW0_RELEASE,
127*5c1def83SBjoern A. Zeeb .max_rings = 8,
128*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_wbm_release_ring) >> 2,
129*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_UMAC,
130*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
131*5c1def83SBjoern A. Zeeb .max_size = HAL_WBM2SW_RELEASE_RING_BASE_MSB_RING_SIZE,
132*5c1def83SBjoern A. Zeeb },
133*5c1def83SBjoern A. Zeeb [HAL_RXDMA_BUF] = {
134*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
135*5c1def83SBjoern A. Zeeb .max_rings = 1,
136*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_wbm_buffer_ring) >> 2,
137*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_DMAC,
138*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
139*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
140*5c1def83SBjoern A. Zeeb },
141*5c1def83SBjoern A. Zeeb [HAL_RXDMA_DST] = {
142*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WMAC1_RXDMA2SW0,
143*5c1def83SBjoern A. Zeeb .max_rings = 0,
144*5c1def83SBjoern A. Zeeb .entry_size = 0,
145*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
146*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
147*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
148*5c1def83SBjoern A. Zeeb },
149*5c1def83SBjoern A. Zeeb [HAL_RXDMA_MONITOR_BUF] = {
150*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_SW2RXMON_BUF0,
151*5c1def83SBjoern A. Zeeb .max_rings = 1,
152*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_mon_buf_ring) >> 2,
153*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
154*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
155*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
156*5c1def83SBjoern A. Zeeb },
157*5c1def83SBjoern A. Zeeb [HAL_RXDMA_MONITOR_STATUS] = { 0, },
158*5c1def83SBjoern A. Zeeb [HAL_RXDMA_MONITOR_DESC] = { 0, },
159*5c1def83SBjoern A. Zeeb [HAL_RXDMA_DIR_BUF] = {
160*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_RXDMA_DIR_BUF,
161*5c1def83SBjoern A. Zeeb .max_rings = 2,
162*5c1def83SBjoern A. Zeeb .entry_size = 8 >> 2, /* TODO: Define the struct */
163*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
164*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
165*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
166*5c1def83SBjoern A. Zeeb },
167*5c1def83SBjoern A. Zeeb [HAL_PPE2TCL] = {
168*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_PPE2TCL1,
169*5c1def83SBjoern A. Zeeb .max_rings = 1,
170*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_tcl_entrance_from_ppe_ring) >> 2,
171*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
172*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
173*5c1def83SBjoern A. Zeeb .max_size = HAL_SW2TCL1_RING_BASE_MSB_RING_SIZE,
174*5c1def83SBjoern A. Zeeb },
175*5c1def83SBjoern A. Zeeb [HAL_PPE_RELEASE] = {
176*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WBM_PPE_RELEASE,
177*5c1def83SBjoern A. Zeeb .max_rings = 1,
178*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_wbm_release_ring) >> 2,
179*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
180*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
181*5c1def83SBjoern A. Zeeb .max_size = HAL_WBM2PPE_RELEASE_RING_BASE_MSB_RING_SIZE,
182*5c1def83SBjoern A. Zeeb },
183*5c1def83SBjoern A. Zeeb [HAL_TX_MONITOR_BUF] = {
184*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
185*5c1def83SBjoern A. Zeeb .max_rings = 1,
186*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_mon_buf_ring) >> 2,
187*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
188*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_SRC,
189*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
190*5c1def83SBjoern A. Zeeb },
191*5c1def83SBjoern A. Zeeb [HAL_RXDMA_MONITOR_DST] = {
192*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WMAC1_SW2RXMON_BUF0,
193*5c1def83SBjoern A. Zeeb .max_rings = 1,
194*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_mon_dest_desc) >> 2,
195*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
196*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
197*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
198*5c1def83SBjoern A. Zeeb },
199*5c1def83SBjoern A. Zeeb [HAL_TX_MONITOR_DST] = {
200*5c1def83SBjoern A. Zeeb .start_ring_id = HAL_SRNG_RING_ID_WMAC1_TXMON2SW0_BUF0,
201*5c1def83SBjoern A. Zeeb .max_rings = 1,
202*5c1def83SBjoern A. Zeeb .entry_size = sizeof(struct hal_mon_dest_desc) >> 2,
203*5c1def83SBjoern A. Zeeb .mac_type = ATH12K_HAL_SRNG_PMAC,
204*5c1def83SBjoern A. Zeeb .ring_dir = HAL_SRNG_DIR_DST,
205*5c1def83SBjoern A. Zeeb .max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
206*5c1def83SBjoern A. Zeeb }
207*5c1def83SBjoern A. Zeeb };
208*5c1def83SBjoern A. Zeeb
209*5c1def83SBjoern A. Zeeb static const struct ath12k_hal_tcl_to_wbm_rbm_map
210*5c1def83SBjoern A. Zeeb ath12k_hal_qcn9274_tcl_to_wbm_rbm_map[DP_TCL_NUM_RING_MAX] = {
211*5c1def83SBjoern A. Zeeb {
212*5c1def83SBjoern A. Zeeb .wbm_ring_num = 0,
213*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW0_BM,
214*5c1def83SBjoern A. Zeeb },
215*5c1def83SBjoern A. Zeeb {
216*5c1def83SBjoern A. Zeeb .wbm_ring_num = 1,
217*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW1_BM,
218*5c1def83SBjoern A. Zeeb },
219*5c1def83SBjoern A. Zeeb {
220*5c1def83SBjoern A. Zeeb .wbm_ring_num = 2,
221*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW2_BM,
222*5c1def83SBjoern A. Zeeb },
223*5c1def83SBjoern A. Zeeb {
224*5c1def83SBjoern A. Zeeb .wbm_ring_num = 4,
225*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW4_BM,
226*5c1def83SBjoern A. Zeeb }
227*5c1def83SBjoern A. Zeeb };
228*5c1def83SBjoern A. Zeeb
229*5c1def83SBjoern A. Zeeb static const struct ath12k_hal_tcl_to_wbm_rbm_map
230*5c1def83SBjoern A. Zeeb ath12k_hal_wcn7850_tcl_to_wbm_rbm_map[DP_TCL_NUM_RING_MAX] = {
231*5c1def83SBjoern A. Zeeb {
232*5c1def83SBjoern A. Zeeb .wbm_ring_num = 0,
233*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW0_BM,
234*5c1def83SBjoern A. Zeeb },
235*5c1def83SBjoern A. Zeeb {
236*5c1def83SBjoern A. Zeeb .wbm_ring_num = 2,
237*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW2_BM,
238*5c1def83SBjoern A. Zeeb },
239*5c1def83SBjoern A. Zeeb {
240*5c1def83SBjoern A. Zeeb .wbm_ring_num = 4,
241*5c1def83SBjoern A. Zeeb .rbm_id = HAL_RX_BUF_RBM_SW4_BM,
242*5c1def83SBjoern A. Zeeb },
243*5c1def83SBjoern A. Zeeb };
244*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_id_offset(struct ath12k_base * ab)245*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_id_offset(struct ath12k_base *ab)
246*5c1def83SBjoern A. Zeeb {
247*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_ID(ab) - HAL_REO1_RING_BASE_LSB(ab);
248*5c1def83SBjoern A. Zeeb }
249*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_msi1_base_lsb_offset(struct ath12k_base * ab)250*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_msi1_base_lsb_offset(struct ath12k_base *ab)
251*5c1def83SBjoern A. Zeeb {
252*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_MSI1_BASE_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
253*5c1def83SBjoern A. Zeeb }
254*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_msi1_base_msb_offset(struct ath12k_base * ab)255*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_msi1_base_msb_offset(struct ath12k_base *ab)
256*5c1def83SBjoern A. Zeeb {
257*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_MSI1_BASE_MSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
258*5c1def83SBjoern A. Zeeb }
259*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_msi1_data_offset(struct ath12k_base * ab)260*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_msi1_data_offset(struct ath12k_base *ab)
261*5c1def83SBjoern A. Zeeb {
262*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_MSI1_DATA(ab) - HAL_REO1_RING_BASE_LSB(ab);
263*5c1def83SBjoern A. Zeeb }
264*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_base_msb_offset(struct ath12k_base * ab)265*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_base_msb_offset(struct ath12k_base *ab)
266*5c1def83SBjoern A. Zeeb {
267*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_BASE_MSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
268*5c1def83SBjoern A. Zeeb }
269*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_producer_int_setup_offset(struct ath12k_base * ab)270*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_producer_int_setup_offset(struct ath12k_base *ab)
271*5c1def83SBjoern A. Zeeb {
272*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_PRODUCER_INT_SETUP(ab) - HAL_REO1_RING_BASE_LSB(ab);
273*5c1def83SBjoern A. Zeeb }
274*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_hp_addr_lsb_offset(struct ath12k_base * ab)275*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_hp_addr_lsb_offset(struct ath12k_base *ab)
276*5c1def83SBjoern A. Zeeb {
277*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_HP_ADDR_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
278*5c1def83SBjoern A. Zeeb }
279*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_hp_addr_msb_offset(struct ath12k_base * ab)280*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_hp_addr_msb_offset(struct ath12k_base *ab)
281*5c1def83SBjoern A. Zeeb {
282*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_HP_ADDR_MSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
283*5c1def83SBjoern A. Zeeb }
284*5c1def83SBjoern A. Zeeb
ath12k_hal_reo1_ring_misc_offset(struct ath12k_base * ab)285*5c1def83SBjoern A. Zeeb static unsigned int ath12k_hal_reo1_ring_misc_offset(struct ath12k_base *ab)
286*5c1def83SBjoern A. Zeeb {
287*5c1def83SBjoern A. Zeeb return HAL_REO1_RING_MISC(ab) - HAL_REO1_RING_BASE_LSB(ab);
288*5c1def83SBjoern A. Zeeb }
289*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_first_msdu(struct hal_rx_desc * desc)290*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
291*5c1def83SBjoern A. Zeeb {
292*5c1def83SBjoern A. Zeeb return !!le16_get_bits(desc->u.qcn9274.msdu_end.info5,
293*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_FIRST_MSDU);
294*5c1def83SBjoern A. Zeeb }
295*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_last_msdu(struct hal_rx_desc * desc)296*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
297*5c1def83SBjoern A. Zeeb {
298*5c1def83SBjoern A. Zeeb return !!le16_get_bits(desc->u.qcn9274.msdu_end.info5,
299*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_LAST_MSDU);
300*5c1def83SBjoern A. Zeeb }
301*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_l3_pad_bytes(struct hal_rx_desc * desc)302*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
303*5c1def83SBjoern A. Zeeb {
304*5c1def83SBjoern A. Zeeb return le16_get_bits(desc->u.qcn9274.msdu_end.info5,
305*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_L3_HDR_PADDING);
306*5c1def83SBjoern A. Zeeb }
307*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_encrypt_valid(struct hal_rx_desc * desc)308*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
309*5c1def83SBjoern A. Zeeb {
310*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
311*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID);
312*5c1def83SBjoern A. Zeeb }
313*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_encrypt_type(struct hal_rx_desc * desc)314*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_qcn9274_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
315*5c1def83SBjoern A. Zeeb {
316*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.mpdu_start.info2,
317*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO2_ENC_TYPE);
318*5c1def83SBjoern A. Zeeb }
319*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_decap_type(struct hal_rx_desc * desc)320*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_decap_type(struct hal_rx_desc *desc)
321*5c1def83SBjoern A. Zeeb {
322*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info11,
323*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO11_DECAP_FORMAT);
324*5c1def83SBjoern A. Zeeb }
325*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mesh_ctl(struct hal_rx_desc * desc)326*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
327*5c1def83SBjoern A. Zeeb {
328*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info11,
329*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO11_MESH_CTRL_PRESENT);
330*5c1def83SBjoern A. Zeeb }
331*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc * desc)332*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
333*5c1def83SBjoern A. Zeeb {
334*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
335*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID);
336*5c1def83SBjoern A. Zeeb }
337*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc * desc)338*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
339*5c1def83SBjoern A. Zeeb {
340*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
341*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MPDU_FCTRL_VALID);
342*5c1def83SBjoern A. Zeeb }
343*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc * desc)344*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
345*5c1def83SBjoern A. Zeeb {
346*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
347*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MPDU_SEQ_NUM);
348*5c1def83SBjoern A. Zeeb }
349*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_len(struct hal_rx_desc * desc)350*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_qcn9274_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
351*5c1def83SBjoern A. Zeeb {
352*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info10,
353*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO10_MSDU_LENGTH);
354*5c1def83SBjoern A. Zeeb }
355*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_sgi(struct hal_rx_desc * desc)356*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
357*5c1def83SBjoern A. Zeeb {
358*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
359*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_SGI);
360*5c1def83SBjoern A. Zeeb }
361*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc * desc)362*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
363*5c1def83SBjoern A. Zeeb {
364*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
365*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_RATE_MCS);
366*5c1def83SBjoern A. Zeeb }
367*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_rx_bw(struct hal_rx_desc * desc)368*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
369*5c1def83SBjoern A. Zeeb {
370*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
371*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_RECV_BW);
372*5c1def83SBjoern A. Zeeb }
373*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_freq(struct hal_rx_desc * desc)374*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_qcn9274_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
375*5c1def83SBjoern A. Zeeb {
376*5c1def83SBjoern A. Zeeb return __le32_to_cpu(desc->u.qcn9274.msdu_end.phy_meta_data);
377*5c1def83SBjoern A. Zeeb }
378*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_pkt_type(struct hal_rx_desc * desc)379*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
380*5c1def83SBjoern A. Zeeb {
381*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
382*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_PKT_TYPE);
383*5c1def83SBjoern A. Zeeb }
384*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_nss(struct hal_rx_desc * desc)385*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
386*5c1def83SBjoern A. Zeeb {
387*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
388*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_MIMO_SS_BITMAP);
389*5c1def83SBjoern A. Zeeb }
390*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_tid(struct hal_rx_desc * desc)391*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_qcn9274_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
392*5c1def83SBjoern A. Zeeb {
393*5c1def83SBjoern A. Zeeb return le16_get_bits(desc->u.qcn9274.msdu_end.info5,
394*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_TID);
395*5c1def83SBjoern A. Zeeb }
396*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_peer_id(struct hal_rx_desc * desc)397*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
398*5c1def83SBjoern A. Zeeb {
399*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.qcn9274.mpdu_start.sw_peer_id);
400*5c1def83SBjoern A. Zeeb }
401*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_copy_end_tlv(struct hal_rx_desc * fdesc,struct hal_rx_desc * ldesc)402*5c1def83SBjoern A. Zeeb static void ath12k_hw_qcn9274_rx_desc_copy_end_tlv(struct hal_rx_desc *fdesc,
403*5c1def83SBjoern A. Zeeb struct hal_rx_desc *ldesc)
404*5c1def83SBjoern A. Zeeb {
405*5c1def83SBjoern A. Zeeb memcpy(&fdesc->u.qcn9274.msdu_end, &ldesc->u.qcn9274.msdu_end,
406*5c1def83SBjoern A. Zeeb sizeof(struct rx_msdu_end_qcn9274));
407*5c1def83SBjoern A. Zeeb }
408*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc * desc)409*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_qcn9274_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
410*5c1def83SBjoern A. Zeeb {
411*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.qcn9274.mpdu_start.phy_ppdu_id);
412*5c1def83SBjoern A. Zeeb }
413*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_set_msdu_len(struct hal_rx_desc * desc,u16 len)414*5c1def83SBjoern A. Zeeb static void ath12k_hw_qcn9274_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
415*5c1def83SBjoern A. Zeeb {
416*5c1def83SBjoern A. Zeeb u32 info = __le32_to_cpu(desc->u.qcn9274.msdu_end.info10);
417*5c1def83SBjoern A. Zeeb
418*5c1def83SBjoern A. Zeeb info &= ~RX_MSDU_END_INFO10_MSDU_LENGTH;
419*5c1def83SBjoern A. Zeeb info |= u32_encode_bits(len, RX_MSDU_END_INFO10_MSDU_LENGTH);
420*5c1def83SBjoern A. Zeeb
421*5c1def83SBjoern A. Zeeb desc->u.qcn9274.msdu_end.info10 = __cpu_to_le32(info);
422*5c1def83SBjoern A. Zeeb }
423*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_payload(struct hal_rx_desc * desc)424*5c1def83SBjoern A. Zeeb static u8 *ath12k_hw_qcn9274_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
425*5c1def83SBjoern A. Zeeb {
426*5c1def83SBjoern A. Zeeb return &desc->u.qcn9274.msdu_payload[0];
427*5c1def83SBjoern A. Zeeb }
428*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_start_offset(void)429*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_qcn9274_rx_desc_get_mpdu_start_offset(void)
430*5c1def83SBjoern A. Zeeb {
431*5c1def83SBjoern A. Zeeb return offsetof(struct hal_rx_desc_qcn9274, mpdu_start);
432*5c1def83SBjoern A. Zeeb }
433*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset(void)434*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset(void)
435*5c1def83SBjoern A. Zeeb {
436*5c1def83SBjoern A. Zeeb return offsetof(struct hal_rx_desc_qcn9274, msdu_end);
437*5c1def83SBjoern A. Zeeb }
438*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_mac_addr2_valid(struct hal_rx_desc * desc)439*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
440*5c1def83SBjoern A. Zeeb {
441*5c1def83SBjoern A. Zeeb return __le32_to_cpu(desc->u.qcn9274.mpdu_start.info4) &
442*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MAC_ADDR2_VALID;
443*5c1def83SBjoern A. Zeeb }
444*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2(struct hal_rx_desc * desc)445*5c1def83SBjoern A. Zeeb static u8 *ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
446*5c1def83SBjoern A. Zeeb {
447*5c1def83SBjoern A. Zeeb return desc->u.qcn9274.mpdu_start.addr2;
448*5c1def83SBjoern A. Zeeb }
449*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_is_da_mcbc(struct hal_rx_desc * desc)450*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
451*5c1def83SBjoern A. Zeeb {
452*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.qcn9274.msdu_end.info5) &
453*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_DA_IS_MCBC;
454*5c1def83SBjoern A. Zeeb }
455*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_dot11_hdr(struct hal_rx_desc * desc,struct ieee80211_hdr * hdr)456*5c1def83SBjoern A. Zeeb static void ath12k_hw_qcn9274_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
457*5c1def83SBjoern A. Zeeb struct ieee80211_hdr *hdr)
458*5c1def83SBjoern A. Zeeb {
459*5c1def83SBjoern A. Zeeb hdr->frame_control = desc->u.qcn9274.mpdu_start.frame_ctrl;
460*5c1def83SBjoern A. Zeeb hdr->duration_id = desc->u.qcn9274.mpdu_start.duration;
461*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr1, desc->u.qcn9274.mpdu_start.addr1);
462*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr2, desc->u.qcn9274.mpdu_start.addr2);
463*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr3, desc->u.qcn9274.mpdu_start.addr3);
464*5c1def83SBjoern A. Zeeb if (__le32_to_cpu(desc->u.qcn9274.mpdu_start.info4) &
465*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MAC_ADDR4_VALID) {
466*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr4, desc->u.qcn9274.mpdu_start.addr4);
467*5c1def83SBjoern A. Zeeb }
468*5c1def83SBjoern A. Zeeb hdr->seq_ctrl = desc->u.qcn9274.mpdu_start.seq_ctrl;
469*5c1def83SBjoern A. Zeeb }
470*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_crypto_hdr(struct hal_rx_desc * desc,u8 * crypto_hdr,enum hal_encrypt_type enctype)471*5c1def83SBjoern A. Zeeb static void ath12k_hw_qcn9274_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc,
472*5c1def83SBjoern A. Zeeb u8 *crypto_hdr,
473*5c1def83SBjoern A. Zeeb enum hal_encrypt_type enctype)
474*5c1def83SBjoern A. Zeeb {
475*5c1def83SBjoern A. Zeeb unsigned int key_id;
476*5c1def83SBjoern A. Zeeb
477*5c1def83SBjoern A. Zeeb switch (enctype) {
478*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_OPEN:
479*5c1def83SBjoern A. Zeeb return;
480*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_TKIP_NO_MIC:
481*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_TKIP_MIC:
482*5c1def83SBjoern A. Zeeb crypto_hdr[0] =
483*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[0]);
484*5c1def83SBjoern A. Zeeb crypto_hdr[1] = 0;
485*5c1def83SBjoern A. Zeeb crypto_hdr[2] =
486*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274.mpdu_start.pn[0]);
487*5c1def83SBjoern A. Zeeb break;
488*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_CCMP_128:
489*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_CCMP_256:
490*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_GCMP_128:
491*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_AES_GCMP_256:
492*5c1def83SBjoern A. Zeeb crypto_hdr[0] =
493*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274.mpdu_start.pn[0]);
494*5c1def83SBjoern A. Zeeb crypto_hdr[1] =
495*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[0]);
496*5c1def83SBjoern A. Zeeb crypto_hdr[2] = 0;
497*5c1def83SBjoern A. Zeeb break;
498*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WEP_40:
499*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WEP_104:
500*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WEP_128:
501*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WAPI_GCM_SM4:
502*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WAPI:
503*5c1def83SBjoern A. Zeeb return;
504*5c1def83SBjoern A. Zeeb }
505*5c1def83SBjoern A. Zeeb key_id = le32_get_bits(desc->u.qcn9274.mpdu_start.info5,
506*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO5_KEY_ID);
507*5c1def83SBjoern A. Zeeb crypto_hdr[3] = 0x20 | (key_id << 6);
508*5c1def83SBjoern A. Zeeb crypto_hdr[4] = HAL_RX_MPDU_INFO_PN_GET_BYTE3(desc->u.qcn9274.mpdu_start.pn[0]);
509*5c1def83SBjoern A. Zeeb crypto_hdr[5] = HAL_RX_MPDU_INFO_PN_GET_BYTE4(desc->u.qcn9274.mpdu_start.pn[0]);
510*5c1def83SBjoern A. Zeeb crypto_hdr[6] = HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274.mpdu_start.pn[1]);
511*5c1def83SBjoern A. Zeeb crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[1]);
512*5c1def83SBjoern A. Zeeb }
513*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc * desc)514*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc)
515*5c1def83SBjoern A. Zeeb {
516*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.qcn9274.mpdu_start.frame_ctrl);
517*5c1def83SBjoern A. Zeeb }
518*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_create_config_qcn9274(struct ath12k_base * ab)519*5c1def83SBjoern A. Zeeb static int ath12k_hal_srng_create_config_qcn9274(struct ath12k_base *ab)
520*5c1def83SBjoern A. Zeeb {
521*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
522*5c1def83SBjoern A. Zeeb struct hal_srng_config *s;
523*5c1def83SBjoern A. Zeeb
524*5c1def83SBjoern A. Zeeb hal->srng_config = kmemdup(hw_srng_config_template,
525*5c1def83SBjoern A. Zeeb sizeof(hw_srng_config_template),
526*5c1def83SBjoern A. Zeeb GFP_KERNEL);
527*5c1def83SBjoern A. Zeeb if (!hal->srng_config)
528*5c1def83SBjoern A. Zeeb return -ENOMEM;
529*5c1def83SBjoern A. Zeeb
530*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_DST];
531*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_BASE_LSB(ab);
532*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_HP;
533*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_REO2_RING_BASE_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
534*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_REO2_RING_HP - HAL_REO1_RING_HP;
535*5c1def83SBjoern A. Zeeb
536*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_EXCEPTION];
537*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_BASE_LSB(ab);
538*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_HP;
539*5c1def83SBjoern A. Zeeb
540*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_REINJECT];
541*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_BASE_LSB(ab);
542*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_HP;
543*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SW2REO1_RING_BASE_LSB(ab) - HAL_SW2REO_RING_BASE_LSB(ab);
544*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SW2REO1_RING_HP - HAL_SW2REO_RING_HP;
545*5c1def83SBjoern A. Zeeb
546*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_CMD];
547*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_RING_BASE_LSB(ab);
548*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_HP;
549*5c1def83SBjoern A. Zeeb
550*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_STATUS];
551*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_RING_BASE_LSB(ab);
552*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_HP;
553*5c1def83SBjoern A. Zeeb
554*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TCL_DATA];
555*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB;
556*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_HP;
557*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_TCL2_RING_BASE_LSB - HAL_TCL1_RING_BASE_LSB;
558*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_TCL2_RING_HP - HAL_TCL1_RING_HP;
559*5c1def83SBjoern A. Zeeb
560*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TCL_CMD];
561*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_BASE_LSB(ab);
562*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_HP;
563*5c1def83SBjoern A. Zeeb
564*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TCL_STATUS];
565*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_BASE_LSB(ab);
566*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP;
567*5c1def83SBjoern A. Zeeb
568*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_CE_SRC];
569*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_BASE_LSB;
570*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_HP;
571*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
572*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
573*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
574*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
575*5c1def83SBjoern A. Zeeb
576*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_CE_DST];
577*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_BASE_LSB;
578*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_HP;
579*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
580*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
581*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
582*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
583*5c1def83SBjoern A. Zeeb
584*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_CE_DST_STATUS];
585*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG +
586*5c1def83SBjoern A. Zeeb HAL_CE_DST_STATUS_RING_BASE_LSB;
587*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_STATUS_RING_HP;
588*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
589*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
590*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
591*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
592*5c1def83SBjoern A. Zeeb
593*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_WBM_IDLE_LINK];
594*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab);
595*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_HP;
596*5c1def83SBjoern A. Zeeb
597*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_SW2WBM_RELEASE];
598*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG +
599*5c1def83SBjoern A. Zeeb HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab);
600*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_SW_RELEASE_RING_HP;
601*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_WBM_SW1_RELEASE_RING_BASE_LSB(ab) -
602*5c1def83SBjoern A. Zeeb HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab);
603*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_WBM_SW1_RELEASE_RING_HP - HAL_WBM_SW_RELEASE_RING_HP;
604*5c1def83SBjoern A. Zeeb
605*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_WBM2SW_RELEASE];
606*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
607*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_HP;
608*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_WBM1_RELEASE_RING_BASE_LSB(ab) -
609*5c1def83SBjoern A. Zeeb HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
610*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_WBM1_RELEASE_RING_HP - HAL_WBM0_RELEASE_RING_HP;
611*5c1def83SBjoern A. Zeeb
612*5c1def83SBjoern A. Zeeb /* Some LMAC rings are not accessed from the host:
613*5c1def83SBjoern A. Zeeb * RXDMA_BUG, RXDMA_DST, RXDMA_MONITOR_BUF, RXDMA_MONITOR_STATUS,
614*5c1def83SBjoern A. Zeeb * RXDMA_MONITOR_DST, RXDMA_MONITOR_DESC, RXDMA_DIR_BUF_SRC,
615*5c1def83SBjoern A. Zeeb * RXDMA_RX_MONITOR_BUF, TX_MONITOR_BUF, TX_MONITOR_DST, SW2RXDMA
616*5c1def83SBjoern A. Zeeb */
617*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_PPE2TCL];
618*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_PPE2TCL1_RING_BASE_LSB;
619*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_PPE2TCL1_RING_HP;
620*5c1def83SBjoern A. Zeeb
621*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_PPE_RELEASE];
622*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG +
623*5c1def83SBjoern A. Zeeb HAL_WBM_PPE_RELEASE_RING_BASE_LSB(ab);
624*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_PPE_RELEASE_RING_HP;
625*5c1def83SBjoern A. Zeeb
626*5c1def83SBjoern A. Zeeb return 0;
627*5c1def83SBjoern A. Zeeb }
628*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_dp_rx_h_msdu_done(struct hal_rx_desc * desc)629*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_dp_rx_h_msdu_done(struct hal_rx_desc *desc)
630*5c1def83SBjoern A. Zeeb {
631*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.qcn9274.msdu_end.info14,
632*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO14_MSDU_DONE);
633*5c1def83SBjoern A. Zeeb }
634*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_dp_rx_h_l4_cksum_fail(struct hal_rx_desc * desc)635*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_dp_rx_h_l4_cksum_fail(struct hal_rx_desc *desc)
636*5c1def83SBjoern A. Zeeb {
637*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.qcn9274.msdu_end.info13,
638*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL);
639*5c1def83SBjoern A. Zeeb }
640*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_dp_rx_h_ip_cksum_fail(struct hal_rx_desc * desc)641*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_dp_rx_h_ip_cksum_fail(struct hal_rx_desc *desc)
642*5c1def83SBjoern A. Zeeb {
643*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.qcn9274.msdu_end.info13,
644*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO13_IP_CKSUM_FAIL);
645*5c1def83SBjoern A. Zeeb }
646*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_dp_rx_h_is_decrypted(struct hal_rx_desc * desc)647*5c1def83SBjoern A. Zeeb static bool ath12k_hw_qcn9274_dp_rx_h_is_decrypted(struct hal_rx_desc *desc)
648*5c1def83SBjoern A. Zeeb {
649*5c1def83SBjoern A. Zeeb return (le32_get_bits(desc->u.qcn9274.msdu_end.info14,
650*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE) ==
651*5c1def83SBjoern A. Zeeb RX_DESC_DECRYPT_STATUS_CODE_OK);
652*5c1def83SBjoern A. Zeeb }
653*5c1def83SBjoern A. Zeeb
ath12k_hw_qcn9274_dp_rx_h_mpdu_err(struct hal_rx_desc * desc)654*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_qcn9274_dp_rx_h_mpdu_err(struct hal_rx_desc *desc)
655*5c1def83SBjoern A. Zeeb {
656*5c1def83SBjoern A. Zeeb u32 info = __le32_to_cpu(desc->u.qcn9274.msdu_end.info13);
657*5c1def83SBjoern A. Zeeb u32 errmap = 0;
658*5c1def83SBjoern A. Zeeb
659*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_FCS_ERR)
660*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_FCS;
661*5c1def83SBjoern A. Zeeb
662*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
663*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_DECRYPT;
664*5c1def83SBjoern A. Zeeb
665*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
666*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
667*5c1def83SBjoern A. Zeeb
668*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
669*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
670*5c1def83SBjoern A. Zeeb
671*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
672*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
673*5c1def83SBjoern A. Zeeb
674*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
675*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
676*5c1def83SBjoern A. Zeeb
677*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
678*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
679*5c1def83SBjoern A. Zeeb
680*5c1def83SBjoern A. Zeeb return errmap;
681*5c1def83SBjoern A. Zeeb }
682*5c1def83SBjoern A. Zeeb
683*5c1def83SBjoern A. Zeeb const struct hal_ops hal_qcn9274_ops = {
684*5c1def83SBjoern A. Zeeb .rx_desc_get_first_msdu = ath12k_hw_qcn9274_rx_desc_get_first_msdu,
685*5c1def83SBjoern A. Zeeb .rx_desc_get_last_msdu = ath12k_hw_qcn9274_rx_desc_get_last_msdu,
686*5c1def83SBjoern A. Zeeb .rx_desc_get_l3_pad_bytes = ath12k_hw_qcn9274_rx_desc_get_l3_pad_bytes,
687*5c1def83SBjoern A. Zeeb .rx_desc_encrypt_valid = ath12k_hw_qcn9274_rx_desc_encrypt_valid,
688*5c1def83SBjoern A. Zeeb .rx_desc_get_encrypt_type = ath12k_hw_qcn9274_rx_desc_get_encrypt_type,
689*5c1def83SBjoern A. Zeeb .rx_desc_get_decap_type = ath12k_hw_qcn9274_rx_desc_get_decap_type,
690*5c1def83SBjoern A. Zeeb .rx_desc_get_mesh_ctl = ath12k_hw_qcn9274_rx_desc_get_mesh_ctl,
691*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_seq_ctl_vld = ath12k_hw_qcn9274_rx_desc_get_mpdu_seq_ctl_vld,
692*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_fc_valid = ath12k_hw_qcn9274_rx_desc_get_mpdu_fc_valid,
693*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_start_seq_no = ath12k_hw_qcn9274_rx_desc_get_mpdu_start_seq_no,
694*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_len = ath12k_hw_qcn9274_rx_desc_get_msdu_len,
695*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_sgi = ath12k_hw_qcn9274_rx_desc_get_msdu_sgi,
696*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_rate_mcs = ath12k_hw_qcn9274_rx_desc_get_msdu_rate_mcs,
697*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_rx_bw = ath12k_hw_qcn9274_rx_desc_get_msdu_rx_bw,
698*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_freq = ath12k_hw_qcn9274_rx_desc_get_msdu_freq,
699*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_pkt_type = ath12k_hw_qcn9274_rx_desc_get_msdu_pkt_type,
700*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_nss = ath12k_hw_qcn9274_rx_desc_get_msdu_nss,
701*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_tid = ath12k_hw_qcn9274_rx_desc_get_mpdu_tid,
702*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_peer_id = ath12k_hw_qcn9274_rx_desc_get_mpdu_peer_id,
703*5c1def83SBjoern A. Zeeb .rx_desc_copy_end_tlv = ath12k_hw_qcn9274_rx_desc_copy_end_tlv,
704*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_ppdu_id = ath12k_hw_qcn9274_rx_desc_get_mpdu_ppdu_id,
705*5c1def83SBjoern A. Zeeb .rx_desc_set_msdu_len = ath12k_hw_qcn9274_rx_desc_set_msdu_len,
706*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_payload = ath12k_hw_qcn9274_rx_desc_get_msdu_payload,
707*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_start_offset = ath12k_hw_qcn9274_rx_desc_get_mpdu_start_offset,
708*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_end_offset = ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset,
709*5c1def83SBjoern A. Zeeb .rx_desc_mac_addr2_valid = ath12k_hw_qcn9274_rx_desc_mac_addr2_valid,
710*5c1def83SBjoern A. Zeeb .rx_desc_mpdu_start_addr2 = ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2,
711*5c1def83SBjoern A. Zeeb .rx_desc_is_da_mcbc = ath12k_hw_qcn9274_rx_desc_is_da_mcbc,
712*5c1def83SBjoern A. Zeeb .rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_rx_desc_get_dot11_hdr,
713*5c1def83SBjoern A. Zeeb .rx_desc_get_crypto_header = ath12k_hw_qcn9274_rx_desc_get_crypto_hdr,
714*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_frame_ctl = ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl,
715*5c1def83SBjoern A. Zeeb .create_srng_config = ath12k_hal_srng_create_config_qcn9274,
716*5c1def83SBjoern A. Zeeb .tcl_to_wbm_rbm_map = ath12k_hal_qcn9274_tcl_to_wbm_rbm_map,
717*5c1def83SBjoern A. Zeeb .dp_rx_h_msdu_done = ath12k_hw_qcn9274_dp_rx_h_msdu_done,
718*5c1def83SBjoern A. Zeeb .dp_rx_h_l4_cksum_fail = ath12k_hw_qcn9274_dp_rx_h_l4_cksum_fail,
719*5c1def83SBjoern A. Zeeb .dp_rx_h_ip_cksum_fail = ath12k_hw_qcn9274_dp_rx_h_ip_cksum_fail,
720*5c1def83SBjoern A. Zeeb .dp_rx_h_is_decrypted = ath12k_hw_qcn9274_dp_rx_h_is_decrypted,
721*5c1def83SBjoern A. Zeeb .dp_rx_h_mpdu_err = ath12k_hw_qcn9274_dp_rx_h_mpdu_err,
722*5c1def83SBjoern A. Zeeb };
723*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_first_msdu(struct hal_rx_desc * desc)724*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
725*5c1def83SBjoern A. Zeeb {
726*5c1def83SBjoern A. Zeeb return !!le16_get_bits(desc->u.wcn7850.msdu_end.info5,
727*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_FIRST_MSDU);
728*5c1def83SBjoern A. Zeeb }
729*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_last_msdu(struct hal_rx_desc * desc)730*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
731*5c1def83SBjoern A. Zeeb {
732*5c1def83SBjoern A. Zeeb return !!le16_get_bits(desc->u.wcn7850.msdu_end.info5,
733*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_LAST_MSDU);
734*5c1def83SBjoern A. Zeeb }
735*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_l3_pad_bytes(struct hal_rx_desc * desc)736*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
737*5c1def83SBjoern A. Zeeb {
738*5c1def83SBjoern A. Zeeb return le16_get_bits(desc->u.wcn7850.msdu_end.info5,
739*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_L3_HDR_PADDING);
740*5c1def83SBjoern A. Zeeb }
741*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_encrypt_valid(struct hal_rx_desc * desc)742*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
743*5c1def83SBjoern A. Zeeb {
744*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
745*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID);
746*5c1def83SBjoern A. Zeeb }
747*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_encrypt_type(struct hal_rx_desc * desc)748*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
749*5c1def83SBjoern A. Zeeb {
750*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.mpdu_start.info2,
751*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO2_ENC_TYPE);
752*5c1def83SBjoern A. Zeeb }
753*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_decap_type(struct hal_rx_desc * desc)754*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_decap_type(struct hal_rx_desc *desc)
755*5c1def83SBjoern A. Zeeb {
756*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info11,
757*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO11_DECAP_FORMAT);
758*5c1def83SBjoern A. Zeeb }
759*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mesh_ctl(struct hal_rx_desc * desc)760*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
761*5c1def83SBjoern A. Zeeb {
762*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info11,
763*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO11_MESH_CTRL_PRESENT);
764*5c1def83SBjoern A. Zeeb }
765*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc * desc)766*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
767*5c1def83SBjoern A. Zeeb {
768*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
769*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID);
770*5c1def83SBjoern A. Zeeb }
771*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc * desc)772*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
773*5c1def83SBjoern A. Zeeb {
774*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
775*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MPDU_FCTRL_VALID);
776*5c1def83SBjoern A. Zeeb }
777*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc * desc)778*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
779*5c1def83SBjoern A. Zeeb {
780*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
781*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MPDU_SEQ_NUM);
782*5c1def83SBjoern A. Zeeb }
783*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_len(struct hal_rx_desc * desc)784*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_wcn7850_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
785*5c1def83SBjoern A. Zeeb {
786*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info10,
787*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO10_MSDU_LENGTH);
788*5c1def83SBjoern A. Zeeb }
789*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_sgi(struct hal_rx_desc * desc)790*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
791*5c1def83SBjoern A. Zeeb {
792*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
793*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_SGI);
794*5c1def83SBjoern A. Zeeb }
795*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc * desc)796*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
797*5c1def83SBjoern A. Zeeb {
798*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
799*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_RATE_MCS);
800*5c1def83SBjoern A. Zeeb }
801*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_rx_bw(struct hal_rx_desc * desc)802*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
803*5c1def83SBjoern A. Zeeb {
804*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
805*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_RECV_BW);
806*5c1def83SBjoern A. Zeeb }
807*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_freq(struct hal_rx_desc * desc)808*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
809*5c1def83SBjoern A. Zeeb {
810*5c1def83SBjoern A. Zeeb return __le32_to_cpu(desc->u.wcn7850.msdu_end.phy_meta_data);
811*5c1def83SBjoern A. Zeeb }
812*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_pkt_type(struct hal_rx_desc * desc)813*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
814*5c1def83SBjoern A. Zeeb {
815*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
816*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_PKT_TYPE);
817*5c1def83SBjoern A. Zeeb }
818*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_nss(struct hal_rx_desc * desc)819*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
820*5c1def83SBjoern A. Zeeb {
821*5c1def83SBjoern A. Zeeb return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
822*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO12_MIMO_SS_BITMAP);
823*5c1def83SBjoern A. Zeeb }
824*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_tid(struct hal_rx_desc * desc)825*5c1def83SBjoern A. Zeeb static u8 ath12k_hw_wcn7850_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
826*5c1def83SBjoern A. Zeeb {
827*5c1def83SBjoern A. Zeeb return le16_get_bits(desc->u.wcn7850.msdu_end.info5,
828*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_TID);
829*5c1def83SBjoern A. Zeeb }
830*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_peer_id(struct hal_rx_desc * desc)831*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
832*5c1def83SBjoern A. Zeeb {
833*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.wcn7850.mpdu_start.sw_peer_id);
834*5c1def83SBjoern A. Zeeb }
835*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_copy_end_tlv(struct hal_rx_desc * fdesc,struct hal_rx_desc * ldesc)836*5c1def83SBjoern A. Zeeb static void ath12k_hw_wcn7850_rx_desc_copy_end_tlv(struct hal_rx_desc *fdesc,
837*5c1def83SBjoern A. Zeeb struct hal_rx_desc *ldesc)
838*5c1def83SBjoern A. Zeeb {
839*5c1def83SBjoern A. Zeeb memcpy(&fdesc->u.wcn7850.msdu_end, &ldesc->u.wcn7850.msdu_end,
840*5c1def83SBjoern A. Zeeb sizeof(struct rx_msdu_end_qcn9274));
841*5c1def83SBjoern A. Zeeb }
842*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_start_tag(struct hal_rx_desc * desc)843*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc)
844*5c1def83SBjoern A. Zeeb {
845*5c1def83SBjoern A. Zeeb return le64_get_bits(desc->u.wcn7850.mpdu_start_tag,
846*5c1def83SBjoern A. Zeeb HAL_TLV_HDR_TAG);
847*5c1def83SBjoern A. Zeeb }
848*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc * desc)849*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
850*5c1def83SBjoern A. Zeeb {
851*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.wcn7850.mpdu_start.phy_ppdu_id);
852*5c1def83SBjoern A. Zeeb }
853*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_set_msdu_len(struct hal_rx_desc * desc,u16 len)854*5c1def83SBjoern A. Zeeb static void ath12k_hw_wcn7850_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
855*5c1def83SBjoern A. Zeeb {
856*5c1def83SBjoern A. Zeeb u32 info = __le32_to_cpu(desc->u.wcn7850.msdu_end.info10);
857*5c1def83SBjoern A. Zeeb
858*5c1def83SBjoern A. Zeeb info &= ~RX_MSDU_END_INFO10_MSDU_LENGTH;
859*5c1def83SBjoern A. Zeeb info |= u32_encode_bits(len, RX_MSDU_END_INFO10_MSDU_LENGTH);
860*5c1def83SBjoern A. Zeeb
861*5c1def83SBjoern A. Zeeb desc->u.wcn7850.msdu_end.info10 = __cpu_to_le32(info);
862*5c1def83SBjoern A. Zeeb }
863*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_payload(struct hal_rx_desc * desc)864*5c1def83SBjoern A. Zeeb static u8 *ath12k_hw_wcn7850_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
865*5c1def83SBjoern A. Zeeb {
866*5c1def83SBjoern A. Zeeb return &desc->u.wcn7850.msdu_payload[0];
867*5c1def83SBjoern A. Zeeb }
868*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_start_offset(void)869*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_rx_desc_get_mpdu_start_offset(void)
870*5c1def83SBjoern A. Zeeb {
871*5c1def83SBjoern A. Zeeb return offsetof(struct hal_rx_desc_wcn7850, mpdu_start_tag);
872*5c1def83SBjoern A. Zeeb }
873*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset(void)874*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset(void)
875*5c1def83SBjoern A. Zeeb {
876*5c1def83SBjoern A. Zeeb return offsetof(struct hal_rx_desc_wcn7850, msdu_end_tag);
877*5c1def83SBjoern A. Zeeb }
878*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_mac_addr2_valid(struct hal_rx_desc * desc)879*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
880*5c1def83SBjoern A. Zeeb {
881*5c1def83SBjoern A. Zeeb return __le32_to_cpu(desc->u.wcn7850.mpdu_start.info4) &
882*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MAC_ADDR2_VALID;
883*5c1def83SBjoern A. Zeeb }
884*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2(struct hal_rx_desc * desc)885*5c1def83SBjoern A. Zeeb static u8 *ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
886*5c1def83SBjoern A. Zeeb {
887*5c1def83SBjoern A. Zeeb return desc->u.wcn7850.mpdu_start.addr2;
888*5c1def83SBjoern A. Zeeb }
889*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_is_da_mcbc(struct hal_rx_desc * desc)890*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
891*5c1def83SBjoern A. Zeeb {
892*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.wcn7850.msdu_end.info5) &
893*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO5_DA_IS_MCBC;
894*5c1def83SBjoern A. Zeeb }
895*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_dot11_hdr(struct hal_rx_desc * desc,struct ieee80211_hdr * hdr)896*5c1def83SBjoern A. Zeeb static void ath12k_hw_wcn7850_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
897*5c1def83SBjoern A. Zeeb struct ieee80211_hdr *hdr)
898*5c1def83SBjoern A. Zeeb {
899*5c1def83SBjoern A. Zeeb hdr->frame_control = desc->u.wcn7850.mpdu_start.frame_ctrl;
900*5c1def83SBjoern A. Zeeb hdr->duration_id = desc->u.wcn7850.mpdu_start.duration;
901*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr1, desc->u.wcn7850.mpdu_start.addr1);
902*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr2, desc->u.wcn7850.mpdu_start.addr2);
903*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr3, desc->u.wcn7850.mpdu_start.addr3);
904*5c1def83SBjoern A. Zeeb if (__le32_to_cpu(desc->u.wcn7850.mpdu_start.info4) &
905*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO4_MAC_ADDR4_VALID) {
906*5c1def83SBjoern A. Zeeb ether_addr_copy(hdr->addr4, desc->u.wcn7850.mpdu_start.addr4);
907*5c1def83SBjoern A. Zeeb }
908*5c1def83SBjoern A. Zeeb hdr->seq_ctrl = desc->u.wcn7850.mpdu_start.seq_ctrl;
909*5c1def83SBjoern A. Zeeb }
910*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_crypto_hdr(struct hal_rx_desc * desc,u8 * crypto_hdr,enum hal_encrypt_type enctype)911*5c1def83SBjoern A. Zeeb static void ath12k_hw_wcn7850_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc,
912*5c1def83SBjoern A. Zeeb u8 *crypto_hdr,
913*5c1def83SBjoern A. Zeeb enum hal_encrypt_type enctype)
914*5c1def83SBjoern A. Zeeb {
915*5c1def83SBjoern A. Zeeb unsigned int key_id;
916*5c1def83SBjoern A. Zeeb
917*5c1def83SBjoern A. Zeeb switch (enctype) {
918*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_OPEN:
919*5c1def83SBjoern A. Zeeb return;
920*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_TKIP_NO_MIC:
921*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_TKIP_MIC:
922*5c1def83SBjoern A. Zeeb crypto_hdr[0] =
923*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[0]);
924*5c1def83SBjoern A. Zeeb crypto_hdr[1] = 0;
925*5c1def83SBjoern A. Zeeb crypto_hdr[2] =
926*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.wcn7850.mpdu_start.pn[0]);
927*5c1def83SBjoern A. Zeeb break;
928*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_CCMP_128:
929*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_CCMP_256:
930*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_GCMP_128:
931*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_AES_GCMP_256:
932*5c1def83SBjoern A. Zeeb crypto_hdr[0] =
933*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.wcn7850.mpdu_start.pn[0]);
934*5c1def83SBjoern A. Zeeb crypto_hdr[1] =
935*5c1def83SBjoern A. Zeeb HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[0]);
936*5c1def83SBjoern A. Zeeb crypto_hdr[2] = 0;
937*5c1def83SBjoern A. Zeeb break;
938*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WEP_40:
939*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WEP_104:
940*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WEP_128:
941*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WAPI_GCM_SM4:
942*5c1def83SBjoern A. Zeeb case HAL_ENCRYPT_TYPE_WAPI:
943*5c1def83SBjoern A. Zeeb return;
944*5c1def83SBjoern A. Zeeb }
945*5c1def83SBjoern A. Zeeb key_id = u32_get_bits(__le32_to_cpu(desc->u.wcn7850.mpdu_start.info5),
946*5c1def83SBjoern A. Zeeb RX_MPDU_START_INFO5_KEY_ID);
947*5c1def83SBjoern A. Zeeb crypto_hdr[3] = 0x20 | (key_id << 6);
948*5c1def83SBjoern A. Zeeb crypto_hdr[4] = HAL_RX_MPDU_INFO_PN_GET_BYTE3(desc->u.wcn7850.mpdu_start.pn[0]);
949*5c1def83SBjoern A. Zeeb crypto_hdr[5] = HAL_RX_MPDU_INFO_PN_GET_BYTE4(desc->u.wcn7850.mpdu_start.pn[0]);
950*5c1def83SBjoern A. Zeeb crypto_hdr[6] = HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.wcn7850.mpdu_start.pn[1]);
951*5c1def83SBjoern A. Zeeb crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[1]);
952*5c1def83SBjoern A. Zeeb }
953*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc * desc)954*5c1def83SBjoern A. Zeeb static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc)
955*5c1def83SBjoern A. Zeeb {
956*5c1def83SBjoern A. Zeeb return __le16_to_cpu(desc->u.wcn7850.mpdu_start.frame_ctrl);
957*5c1def83SBjoern A. Zeeb }
958*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_create_config_wcn7850(struct ath12k_base * ab)959*5c1def83SBjoern A. Zeeb static int ath12k_hal_srng_create_config_wcn7850(struct ath12k_base *ab)
960*5c1def83SBjoern A. Zeeb {
961*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
962*5c1def83SBjoern A. Zeeb struct hal_srng_config *s;
963*5c1def83SBjoern A. Zeeb
964*5c1def83SBjoern A. Zeeb hal->srng_config = kmemdup(hw_srng_config_template,
965*5c1def83SBjoern A. Zeeb sizeof(hw_srng_config_template),
966*5c1def83SBjoern A. Zeeb GFP_KERNEL);
967*5c1def83SBjoern A. Zeeb if (!hal->srng_config)
968*5c1def83SBjoern A. Zeeb return -ENOMEM;
969*5c1def83SBjoern A. Zeeb
970*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_DST];
971*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_BASE_LSB(ab);
972*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_HP;
973*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_REO2_RING_BASE_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
974*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_REO2_RING_HP - HAL_REO1_RING_HP;
975*5c1def83SBjoern A. Zeeb
976*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_EXCEPTION];
977*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_BASE_LSB(ab);
978*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_HP;
979*5c1def83SBjoern A. Zeeb
980*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_REINJECT];
981*5c1def83SBjoern A. Zeeb s->max_rings = 1;
982*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_BASE_LSB(ab);
983*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_HP;
984*5c1def83SBjoern A. Zeeb
985*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_CMD];
986*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_RING_BASE_LSB(ab);
987*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_HP;
988*5c1def83SBjoern A. Zeeb
989*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_REO_STATUS];
990*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_RING_BASE_LSB(ab);
991*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_HP;
992*5c1def83SBjoern A. Zeeb
993*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TCL_DATA];
994*5c1def83SBjoern A. Zeeb s->max_rings = 5;
995*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB;
996*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_HP;
997*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_TCL2_RING_BASE_LSB - HAL_TCL1_RING_BASE_LSB;
998*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_TCL2_RING_HP - HAL_TCL1_RING_HP;
999*5c1def83SBjoern A. Zeeb
1000*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TCL_CMD];
1001*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_BASE_LSB(ab);
1002*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_HP;
1003*5c1def83SBjoern A. Zeeb
1004*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TCL_STATUS];
1005*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_BASE_LSB(ab);
1006*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP;
1007*5c1def83SBjoern A. Zeeb
1008*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_CE_SRC];
1009*5c1def83SBjoern A. Zeeb s->max_rings = 12;
1010*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_BASE_LSB;
1011*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_HP;
1012*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
1013*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
1014*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
1015*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
1016*5c1def83SBjoern A. Zeeb
1017*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_CE_DST];
1018*5c1def83SBjoern A. Zeeb s->max_rings = 12;
1019*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_BASE_LSB;
1020*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_HP;
1021*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1022*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1023*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1024*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1025*5c1def83SBjoern A. Zeeb
1026*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_CE_DST_STATUS];
1027*5c1def83SBjoern A. Zeeb s->max_rings = 12;
1028*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG +
1029*5c1def83SBjoern A. Zeeb HAL_CE_DST_STATUS_RING_BASE_LSB;
1030*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_STATUS_RING_HP;
1031*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1032*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1033*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1034*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1035*5c1def83SBjoern A. Zeeb
1036*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_WBM_IDLE_LINK];
1037*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab);
1038*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_HP;
1039*5c1def83SBjoern A. Zeeb
1040*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_SW2WBM_RELEASE];
1041*5c1def83SBjoern A. Zeeb s->max_rings = 1;
1042*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG +
1043*5c1def83SBjoern A. Zeeb HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab);
1044*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_SW_RELEASE_RING_HP;
1045*5c1def83SBjoern A. Zeeb
1046*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_WBM2SW_RELEASE];
1047*5c1def83SBjoern A. Zeeb s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
1048*5c1def83SBjoern A. Zeeb s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_HP;
1049*5c1def83SBjoern A. Zeeb s->reg_size[0] = HAL_WBM1_RELEASE_RING_BASE_LSB(ab) -
1050*5c1def83SBjoern A. Zeeb HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
1051*5c1def83SBjoern A. Zeeb s->reg_size[1] = HAL_WBM1_RELEASE_RING_HP - HAL_WBM0_RELEASE_RING_HP;
1052*5c1def83SBjoern A. Zeeb
1053*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_RXDMA_BUF];
1054*5c1def83SBjoern A. Zeeb s->max_rings = 2;
1055*5c1def83SBjoern A. Zeeb s->mac_type = ATH12K_HAL_SRNG_PMAC;
1056*5c1def83SBjoern A. Zeeb
1057*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_RXDMA_DST];
1058*5c1def83SBjoern A. Zeeb s->max_rings = 1;
1059*5c1def83SBjoern A. Zeeb s->entry_size = sizeof(struct hal_reo_entrance_ring) >> 2;
1060*5c1def83SBjoern A. Zeeb
1061*5c1def83SBjoern A. Zeeb /* below rings are not used */
1062*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_RXDMA_DIR_BUF];
1063*5c1def83SBjoern A. Zeeb s->max_rings = 0;
1064*5c1def83SBjoern A. Zeeb
1065*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_PPE2TCL];
1066*5c1def83SBjoern A. Zeeb s->max_rings = 0;
1067*5c1def83SBjoern A. Zeeb
1068*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_PPE_RELEASE];
1069*5c1def83SBjoern A. Zeeb s->max_rings = 0;
1070*5c1def83SBjoern A. Zeeb
1071*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TX_MONITOR_BUF];
1072*5c1def83SBjoern A. Zeeb s->max_rings = 0;
1073*5c1def83SBjoern A. Zeeb
1074*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_TX_MONITOR_DST];
1075*5c1def83SBjoern A. Zeeb s->max_rings = 0;
1076*5c1def83SBjoern A. Zeeb
1077*5c1def83SBjoern A. Zeeb s = &hal->srng_config[HAL_PPE2TCL];
1078*5c1def83SBjoern A. Zeeb s->max_rings = 0;
1079*5c1def83SBjoern A. Zeeb
1080*5c1def83SBjoern A. Zeeb return 0;
1081*5c1def83SBjoern A. Zeeb }
1082*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_dp_rx_h_msdu_done(struct hal_rx_desc * desc)1083*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_dp_rx_h_msdu_done(struct hal_rx_desc *desc)
1084*5c1def83SBjoern A. Zeeb {
1085*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.wcn7850.msdu_end.info14,
1086*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO14_MSDU_DONE);
1087*5c1def83SBjoern A. Zeeb }
1088*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_dp_rx_h_l4_cksum_fail(struct hal_rx_desc * desc)1089*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_dp_rx_h_l4_cksum_fail(struct hal_rx_desc *desc)
1090*5c1def83SBjoern A. Zeeb {
1091*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.wcn7850.msdu_end.info13,
1092*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL);
1093*5c1def83SBjoern A. Zeeb }
1094*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_dp_rx_h_ip_cksum_fail(struct hal_rx_desc * desc)1095*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_dp_rx_h_ip_cksum_fail(struct hal_rx_desc *desc)
1096*5c1def83SBjoern A. Zeeb {
1097*5c1def83SBjoern A. Zeeb return !!le32_get_bits(desc->u.wcn7850.msdu_end.info13,
1098*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO13_IP_CKSUM_FAIL);
1099*5c1def83SBjoern A. Zeeb }
1100*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_dp_rx_h_is_decrypted(struct hal_rx_desc * desc)1101*5c1def83SBjoern A. Zeeb static bool ath12k_hw_wcn7850_dp_rx_h_is_decrypted(struct hal_rx_desc *desc)
1102*5c1def83SBjoern A. Zeeb {
1103*5c1def83SBjoern A. Zeeb return (le32_get_bits(desc->u.wcn7850.msdu_end.info14,
1104*5c1def83SBjoern A. Zeeb RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE) ==
1105*5c1def83SBjoern A. Zeeb RX_DESC_DECRYPT_STATUS_CODE_OK);
1106*5c1def83SBjoern A. Zeeb }
1107*5c1def83SBjoern A. Zeeb
ath12k_hw_wcn7850_dp_rx_h_mpdu_err(struct hal_rx_desc * desc)1108*5c1def83SBjoern A. Zeeb static u32 ath12k_hw_wcn7850_dp_rx_h_mpdu_err(struct hal_rx_desc *desc)
1109*5c1def83SBjoern A. Zeeb {
1110*5c1def83SBjoern A. Zeeb u32 info = __le32_to_cpu(desc->u.wcn7850.msdu_end.info13);
1111*5c1def83SBjoern A. Zeeb u32 errmap = 0;
1112*5c1def83SBjoern A. Zeeb
1113*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_FCS_ERR)
1114*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_FCS;
1115*5c1def83SBjoern A. Zeeb
1116*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
1117*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_DECRYPT;
1118*5c1def83SBjoern A. Zeeb
1119*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
1120*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
1121*5c1def83SBjoern A. Zeeb
1122*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
1123*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
1124*5c1def83SBjoern A. Zeeb
1125*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
1126*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
1127*5c1def83SBjoern A. Zeeb
1128*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
1129*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
1130*5c1def83SBjoern A. Zeeb
1131*5c1def83SBjoern A. Zeeb if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
1132*5c1def83SBjoern A. Zeeb errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
1133*5c1def83SBjoern A. Zeeb
1134*5c1def83SBjoern A. Zeeb return errmap;
1135*5c1def83SBjoern A. Zeeb }
1136*5c1def83SBjoern A. Zeeb
1137*5c1def83SBjoern A. Zeeb const struct hal_ops hal_wcn7850_ops = {
1138*5c1def83SBjoern A. Zeeb .rx_desc_get_first_msdu = ath12k_hw_wcn7850_rx_desc_get_first_msdu,
1139*5c1def83SBjoern A. Zeeb .rx_desc_get_last_msdu = ath12k_hw_wcn7850_rx_desc_get_last_msdu,
1140*5c1def83SBjoern A. Zeeb .rx_desc_get_l3_pad_bytes = ath12k_hw_wcn7850_rx_desc_get_l3_pad_bytes,
1141*5c1def83SBjoern A. Zeeb .rx_desc_encrypt_valid = ath12k_hw_wcn7850_rx_desc_encrypt_valid,
1142*5c1def83SBjoern A. Zeeb .rx_desc_get_encrypt_type = ath12k_hw_wcn7850_rx_desc_get_encrypt_type,
1143*5c1def83SBjoern A. Zeeb .rx_desc_get_decap_type = ath12k_hw_wcn7850_rx_desc_get_decap_type,
1144*5c1def83SBjoern A. Zeeb .rx_desc_get_mesh_ctl = ath12k_hw_wcn7850_rx_desc_get_mesh_ctl,
1145*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_seq_ctl_vld = ath12k_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld,
1146*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_fc_valid = ath12k_hw_wcn7850_rx_desc_get_mpdu_fc_valid,
1147*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_start_seq_no = ath12k_hw_wcn7850_rx_desc_get_mpdu_start_seq_no,
1148*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_len = ath12k_hw_wcn7850_rx_desc_get_msdu_len,
1149*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_sgi = ath12k_hw_wcn7850_rx_desc_get_msdu_sgi,
1150*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_rate_mcs = ath12k_hw_wcn7850_rx_desc_get_msdu_rate_mcs,
1151*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_rx_bw = ath12k_hw_wcn7850_rx_desc_get_msdu_rx_bw,
1152*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_freq = ath12k_hw_wcn7850_rx_desc_get_msdu_freq,
1153*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_pkt_type = ath12k_hw_wcn7850_rx_desc_get_msdu_pkt_type,
1154*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_nss = ath12k_hw_wcn7850_rx_desc_get_msdu_nss,
1155*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_tid = ath12k_hw_wcn7850_rx_desc_get_mpdu_tid,
1156*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_peer_id = ath12k_hw_wcn7850_rx_desc_get_mpdu_peer_id,
1157*5c1def83SBjoern A. Zeeb .rx_desc_copy_end_tlv = ath12k_hw_wcn7850_rx_desc_copy_end_tlv,
1158*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_start_tag = ath12k_hw_wcn7850_rx_desc_get_mpdu_start_tag,
1159*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_ppdu_id = ath12k_hw_wcn7850_rx_desc_get_mpdu_ppdu_id,
1160*5c1def83SBjoern A. Zeeb .rx_desc_set_msdu_len = ath12k_hw_wcn7850_rx_desc_set_msdu_len,
1161*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_payload = ath12k_hw_wcn7850_rx_desc_get_msdu_payload,
1162*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_start_offset = ath12k_hw_wcn7850_rx_desc_get_mpdu_start_offset,
1163*5c1def83SBjoern A. Zeeb .rx_desc_get_msdu_end_offset = ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset,
1164*5c1def83SBjoern A. Zeeb .rx_desc_mac_addr2_valid = ath12k_hw_wcn7850_rx_desc_mac_addr2_valid,
1165*5c1def83SBjoern A. Zeeb .rx_desc_mpdu_start_addr2 = ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2,
1166*5c1def83SBjoern A. Zeeb .rx_desc_is_da_mcbc = ath12k_hw_wcn7850_rx_desc_is_da_mcbc,
1167*5c1def83SBjoern A. Zeeb .rx_desc_get_dot11_hdr = ath12k_hw_wcn7850_rx_desc_get_dot11_hdr,
1168*5c1def83SBjoern A. Zeeb .rx_desc_get_crypto_header = ath12k_hw_wcn7850_rx_desc_get_crypto_hdr,
1169*5c1def83SBjoern A. Zeeb .rx_desc_get_mpdu_frame_ctl = ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl,
1170*5c1def83SBjoern A. Zeeb .create_srng_config = ath12k_hal_srng_create_config_wcn7850,
1171*5c1def83SBjoern A. Zeeb .tcl_to_wbm_rbm_map = ath12k_hal_wcn7850_tcl_to_wbm_rbm_map,
1172*5c1def83SBjoern A. Zeeb .dp_rx_h_msdu_done = ath12k_hw_wcn7850_dp_rx_h_msdu_done,
1173*5c1def83SBjoern A. Zeeb .dp_rx_h_l4_cksum_fail = ath12k_hw_wcn7850_dp_rx_h_l4_cksum_fail,
1174*5c1def83SBjoern A. Zeeb .dp_rx_h_ip_cksum_fail = ath12k_hw_wcn7850_dp_rx_h_ip_cksum_fail,
1175*5c1def83SBjoern A. Zeeb .dp_rx_h_is_decrypted = ath12k_hw_wcn7850_dp_rx_h_is_decrypted,
1176*5c1def83SBjoern A. Zeeb .dp_rx_h_mpdu_err = ath12k_hw_wcn7850_dp_rx_h_mpdu_err,
1177*5c1def83SBjoern A. Zeeb };
1178*5c1def83SBjoern A. Zeeb
ath12k_hal_alloc_cont_rdp(struct ath12k_base * ab)1179*5c1def83SBjoern A. Zeeb static int ath12k_hal_alloc_cont_rdp(struct ath12k_base *ab)
1180*5c1def83SBjoern A. Zeeb {
1181*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1182*5c1def83SBjoern A. Zeeb size_t size;
1183*5c1def83SBjoern A. Zeeb
1184*5c1def83SBjoern A. Zeeb size = sizeof(u32) * HAL_SRNG_RING_ID_MAX;
1185*5c1def83SBjoern A. Zeeb hal->rdp.vaddr = dma_alloc_coherent(ab->dev, size, &hal->rdp.paddr,
1186*5c1def83SBjoern A. Zeeb GFP_KERNEL);
1187*5c1def83SBjoern A. Zeeb if (!hal->rdp.vaddr)
1188*5c1def83SBjoern A. Zeeb return -ENOMEM;
1189*5c1def83SBjoern A. Zeeb
1190*5c1def83SBjoern A. Zeeb return 0;
1191*5c1def83SBjoern A. Zeeb }
1192*5c1def83SBjoern A. Zeeb
ath12k_hal_free_cont_rdp(struct ath12k_base * ab)1193*5c1def83SBjoern A. Zeeb static void ath12k_hal_free_cont_rdp(struct ath12k_base *ab)
1194*5c1def83SBjoern A. Zeeb {
1195*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1196*5c1def83SBjoern A. Zeeb size_t size;
1197*5c1def83SBjoern A. Zeeb
1198*5c1def83SBjoern A. Zeeb if (!hal->rdp.vaddr)
1199*5c1def83SBjoern A. Zeeb return;
1200*5c1def83SBjoern A. Zeeb
1201*5c1def83SBjoern A. Zeeb size = sizeof(u32) * HAL_SRNG_RING_ID_MAX;
1202*5c1def83SBjoern A. Zeeb dma_free_coherent(ab->dev, size,
1203*5c1def83SBjoern A. Zeeb hal->rdp.vaddr, hal->rdp.paddr);
1204*5c1def83SBjoern A. Zeeb hal->rdp.vaddr = NULL;
1205*5c1def83SBjoern A. Zeeb }
1206*5c1def83SBjoern A. Zeeb
ath12k_hal_alloc_cont_wrp(struct ath12k_base * ab)1207*5c1def83SBjoern A. Zeeb static int ath12k_hal_alloc_cont_wrp(struct ath12k_base *ab)
1208*5c1def83SBjoern A. Zeeb {
1209*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1210*5c1def83SBjoern A. Zeeb size_t size;
1211*5c1def83SBjoern A. Zeeb
1212*5c1def83SBjoern A. Zeeb size = sizeof(u32) * (HAL_SRNG_NUM_PMAC_RINGS + HAL_SRNG_NUM_DMAC_RINGS);
1213*5c1def83SBjoern A. Zeeb hal->wrp.vaddr = dma_alloc_coherent(ab->dev, size, &hal->wrp.paddr,
1214*5c1def83SBjoern A. Zeeb GFP_KERNEL);
1215*5c1def83SBjoern A. Zeeb if (!hal->wrp.vaddr)
1216*5c1def83SBjoern A. Zeeb return -ENOMEM;
1217*5c1def83SBjoern A. Zeeb
1218*5c1def83SBjoern A. Zeeb return 0;
1219*5c1def83SBjoern A. Zeeb }
1220*5c1def83SBjoern A. Zeeb
ath12k_hal_free_cont_wrp(struct ath12k_base * ab)1221*5c1def83SBjoern A. Zeeb static void ath12k_hal_free_cont_wrp(struct ath12k_base *ab)
1222*5c1def83SBjoern A. Zeeb {
1223*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1224*5c1def83SBjoern A. Zeeb size_t size;
1225*5c1def83SBjoern A. Zeeb
1226*5c1def83SBjoern A. Zeeb if (!hal->wrp.vaddr)
1227*5c1def83SBjoern A. Zeeb return;
1228*5c1def83SBjoern A. Zeeb
1229*5c1def83SBjoern A. Zeeb size = sizeof(u32) * (HAL_SRNG_NUM_PMAC_RINGS + HAL_SRNG_NUM_DMAC_RINGS);
1230*5c1def83SBjoern A. Zeeb dma_free_coherent(ab->dev, size,
1231*5c1def83SBjoern A. Zeeb hal->wrp.vaddr, hal->wrp.paddr);
1232*5c1def83SBjoern A. Zeeb hal->wrp.vaddr = NULL;
1233*5c1def83SBjoern A. Zeeb }
1234*5c1def83SBjoern A. Zeeb
ath12k_hal_ce_dst_setup(struct ath12k_base * ab,struct hal_srng * srng,int ring_num)1235*5c1def83SBjoern A. Zeeb static void ath12k_hal_ce_dst_setup(struct ath12k_base *ab,
1236*5c1def83SBjoern A. Zeeb struct hal_srng *srng, int ring_num)
1237*5c1def83SBjoern A. Zeeb {
1238*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config = &ab->hal.srng_config[HAL_CE_DST];
1239*5c1def83SBjoern A. Zeeb u32 addr;
1240*5c1def83SBjoern A. Zeeb u32 val;
1241*5c1def83SBjoern A. Zeeb
1242*5c1def83SBjoern A. Zeeb addr = HAL_CE_DST_RING_CTRL +
1243*5c1def83SBjoern A. Zeeb srng_config->reg_start[HAL_SRNG_REG_GRP_R0] +
1244*5c1def83SBjoern A. Zeeb ring_num * srng_config->reg_size[HAL_SRNG_REG_GRP_R0];
1245*5c1def83SBjoern A. Zeeb
1246*5c1def83SBjoern A. Zeeb val = ath12k_hif_read32(ab, addr);
1247*5c1def83SBjoern A. Zeeb val &= ~HAL_CE_DST_R0_DEST_CTRL_MAX_LEN;
1248*5c1def83SBjoern A. Zeeb val |= u32_encode_bits(srng->u.dst_ring.max_buffer_length,
1249*5c1def83SBjoern A. Zeeb HAL_CE_DST_R0_DEST_CTRL_MAX_LEN);
1250*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, addr, val);
1251*5c1def83SBjoern A. Zeeb }
1252*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_dst_hw_init(struct ath12k_base * ab,struct hal_srng * srng)1253*5c1def83SBjoern A. Zeeb static void ath12k_hal_srng_dst_hw_init(struct ath12k_base *ab,
1254*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1255*5c1def83SBjoern A. Zeeb {
1256*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1257*5c1def83SBjoern A. Zeeb u32 val;
1258*5c1def83SBjoern A. Zeeb u64 hp_addr;
1259*5c1def83SBjoern A. Zeeb u32 reg_base;
1260*5c1def83SBjoern A. Zeeb
1261*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1262*5c1def83SBjoern A. Zeeb
1263*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
1264*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base +
1265*5c1def83SBjoern A. Zeeb ath12k_hal_reo1_ring_msi1_base_lsb_offset(ab),
1266*5c1def83SBjoern A. Zeeb srng->msi_addr);
1267*5c1def83SBjoern A. Zeeb
1268*5c1def83SBjoern A. Zeeb val = u32_encode_bits(((u64)srng->msi_addr >> HAL_ADDR_MSB_REG_SHIFT),
1269*5c1def83SBjoern A. Zeeb HAL_REO1_RING_MSI1_BASE_MSB_ADDR) |
1270*5c1def83SBjoern A. Zeeb HAL_REO1_RING_MSI1_BASE_MSB_MSI1_ENABLE;
1271*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base +
1272*5c1def83SBjoern A. Zeeb ath12k_hal_reo1_ring_msi1_base_msb_offset(ab), val);
1273*5c1def83SBjoern A. Zeeb
1274*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1275*5c1def83SBjoern A. Zeeb reg_base + ath12k_hal_reo1_ring_msi1_data_offset(ab),
1276*5c1def83SBjoern A. Zeeb srng->msi_data);
1277*5c1def83SBjoern A. Zeeb }
1278*5c1def83SBjoern A. Zeeb
1279*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base, srng->ring_base_paddr);
1280*5c1def83SBjoern A. Zeeb
1281*5c1def83SBjoern A. Zeeb val = u32_encode_bits(((u64)srng->ring_base_paddr >> HAL_ADDR_MSB_REG_SHIFT),
1282*5c1def83SBjoern A. Zeeb HAL_REO1_RING_BASE_MSB_RING_BASE_ADDR_MSB) |
1283*5c1def83SBjoern A. Zeeb u32_encode_bits((srng->entry_size * srng->num_entries),
1284*5c1def83SBjoern A. Zeeb HAL_REO1_RING_BASE_MSB_RING_SIZE);
1285*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_base_msb_offset(ab), val);
1286*5c1def83SBjoern A. Zeeb
1287*5c1def83SBjoern A. Zeeb val = u32_encode_bits(srng->ring_id, HAL_REO1_RING_ID_RING_ID) |
1288*5c1def83SBjoern A. Zeeb u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE);
1289*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_id_offset(ab), val);
1290*5c1def83SBjoern A. Zeeb
1291*5c1def83SBjoern A. Zeeb /* interrupt setup */
1292*5c1def83SBjoern A. Zeeb val = u32_encode_bits((srng->intr_timer_thres_us >> 3),
1293*5c1def83SBjoern A. Zeeb HAL_REO1_RING_PRDR_INT_SETUP_INTR_TMR_THOLD);
1294*5c1def83SBjoern A. Zeeb
1295*5c1def83SBjoern A. Zeeb val |= u32_encode_bits((srng->intr_batch_cntr_thres_entries * srng->entry_size),
1296*5c1def83SBjoern A. Zeeb HAL_REO1_RING_PRDR_INT_SETUP_BATCH_COUNTER_THOLD);
1297*5c1def83SBjoern A. Zeeb
1298*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1299*5c1def83SBjoern A. Zeeb reg_base + ath12k_hal_reo1_ring_producer_int_setup_offset(ab),
1300*5c1def83SBjoern A. Zeeb val);
1301*5c1def83SBjoern A. Zeeb
1302*5c1def83SBjoern A. Zeeb hp_addr = hal->rdp.paddr +
1303*5c1def83SBjoern A. Zeeb ((unsigned long)srng->u.dst_ring.hp_addr -
1304*5c1def83SBjoern A. Zeeb (unsigned long)hal->rdp.vaddr);
1305*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_hp_addr_lsb_offset(ab),
1306*5c1def83SBjoern A. Zeeb hp_addr & HAL_ADDR_LSB_REG_MASK);
1307*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_hp_addr_msb_offset(ab),
1308*5c1def83SBjoern A. Zeeb hp_addr >> HAL_ADDR_MSB_REG_SHIFT);
1309*5c1def83SBjoern A. Zeeb
1310*5c1def83SBjoern A. Zeeb /* Initialize head and tail pointers to indicate ring is empty */
1311*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1312*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base, 0);
1313*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + HAL_REO1_RING_TP_OFFSET, 0);
1314*5c1def83SBjoern A. Zeeb *srng->u.dst_ring.hp_addr = 0;
1315*5c1def83SBjoern A. Zeeb
1316*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1317*5c1def83SBjoern A. Zeeb val = 0;
1318*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
1319*5c1def83SBjoern A. Zeeb val |= HAL_REO1_RING_MISC_DATA_TLV_SWAP;
1320*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
1321*5c1def83SBjoern A. Zeeb val |= HAL_REO1_RING_MISC_HOST_FW_SWAP;
1322*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
1323*5c1def83SBjoern A. Zeeb val |= HAL_REO1_RING_MISC_MSI_SWAP;
1324*5c1def83SBjoern A. Zeeb val |= HAL_REO1_RING_MISC_SRNG_ENABLE;
1325*5c1def83SBjoern A. Zeeb
1326*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_misc_offset(ab), val);
1327*5c1def83SBjoern A. Zeeb }
1328*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_src_hw_init(struct ath12k_base * ab,struct hal_srng * srng)1329*5c1def83SBjoern A. Zeeb static void ath12k_hal_srng_src_hw_init(struct ath12k_base *ab,
1330*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1331*5c1def83SBjoern A. Zeeb {
1332*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1333*5c1def83SBjoern A. Zeeb u32 val;
1334*5c1def83SBjoern A. Zeeb u64 tp_addr;
1335*5c1def83SBjoern A. Zeeb u32 reg_base;
1336*5c1def83SBjoern A. Zeeb
1337*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1338*5c1def83SBjoern A. Zeeb
1339*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
1340*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base +
1341*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_MSI1_BASE_LSB_OFFSET(ab),
1342*5c1def83SBjoern A. Zeeb srng->msi_addr);
1343*5c1def83SBjoern A. Zeeb
1344*5c1def83SBjoern A. Zeeb val = u32_encode_bits(((u64)srng->msi_addr >> HAL_ADDR_MSB_REG_SHIFT),
1345*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_MSI1_BASE_MSB_ADDR) |
1346*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_MSI1_BASE_MSB_MSI1_ENABLE;
1347*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base +
1348*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_MSI1_BASE_MSB_OFFSET(ab),
1349*5c1def83SBjoern A. Zeeb val);
1350*5c1def83SBjoern A. Zeeb
1351*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base +
1352*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_MSI1_DATA_OFFSET(ab),
1353*5c1def83SBjoern A. Zeeb srng->msi_data);
1354*5c1def83SBjoern A. Zeeb }
1355*5c1def83SBjoern A. Zeeb
1356*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base, srng->ring_base_paddr);
1357*5c1def83SBjoern A. Zeeb
1358*5c1def83SBjoern A. Zeeb val = u32_encode_bits(((u64)srng->ring_base_paddr >> HAL_ADDR_MSB_REG_SHIFT),
1359*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_BASE_MSB_RING_BASE_ADDR_MSB) |
1360*5c1def83SBjoern A. Zeeb u32_encode_bits((srng->entry_size * srng->num_entries),
1361*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_BASE_MSB_RING_SIZE);
1362*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_BASE_MSB_OFFSET, val);
1363*5c1def83SBjoern A. Zeeb
1364*5c1def83SBjoern A. Zeeb val = u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE);
1365*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_ID_OFFSET(ab), val);
1366*5c1def83SBjoern A. Zeeb
1367*5c1def83SBjoern A. Zeeb val = u32_encode_bits(srng->intr_timer_thres_us,
1368*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_CONSR_INT_SETUP_IX0_INTR_TMR_THOLD);
1369*5c1def83SBjoern A. Zeeb
1370*5c1def83SBjoern A. Zeeb val |= u32_encode_bits((srng->intr_batch_cntr_thres_entries * srng->entry_size),
1371*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_CONSR_INT_SETUP_IX0_BATCH_COUNTER_THOLD);
1372*5c1def83SBjoern A. Zeeb
1373*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1374*5c1def83SBjoern A. Zeeb reg_base + HAL_TCL1_RING_CONSR_INT_SETUP_IX0_OFFSET(ab),
1375*5c1def83SBjoern A. Zeeb val);
1376*5c1def83SBjoern A. Zeeb
1377*5c1def83SBjoern A. Zeeb val = 0;
1378*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN) {
1379*5c1def83SBjoern A. Zeeb val |= u32_encode_bits(srng->u.src_ring.low_threshold,
1380*5c1def83SBjoern A. Zeeb HAL_TCL1_RING_CONSR_INT_SETUP_IX1_LOW_THOLD);
1381*5c1def83SBjoern A. Zeeb }
1382*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1383*5c1def83SBjoern A. Zeeb reg_base + HAL_TCL1_RING_CONSR_INT_SETUP_IX1_OFFSET(ab),
1384*5c1def83SBjoern A. Zeeb val);
1385*5c1def83SBjoern A. Zeeb
1386*5c1def83SBjoern A. Zeeb if (srng->ring_id != HAL_SRNG_RING_ID_WBM_IDLE_LINK) {
1387*5c1def83SBjoern A. Zeeb tp_addr = hal->rdp.paddr +
1388*5c1def83SBjoern A. Zeeb ((unsigned long)srng->u.src_ring.tp_addr -
1389*5c1def83SBjoern A. Zeeb (unsigned long)hal->rdp.vaddr);
1390*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1391*5c1def83SBjoern A. Zeeb reg_base + HAL_TCL1_RING_TP_ADDR_LSB_OFFSET(ab),
1392*5c1def83SBjoern A. Zeeb tp_addr & HAL_ADDR_LSB_REG_MASK);
1393*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1394*5c1def83SBjoern A. Zeeb reg_base + HAL_TCL1_RING_TP_ADDR_MSB_OFFSET(ab),
1395*5c1def83SBjoern A. Zeeb tp_addr >> HAL_ADDR_MSB_REG_SHIFT);
1396*5c1def83SBjoern A. Zeeb }
1397*5c1def83SBjoern A. Zeeb
1398*5c1def83SBjoern A. Zeeb /* Initialize head and tail pointers to indicate ring is empty */
1399*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1400*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base, 0);
1401*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_TP_OFFSET, 0);
1402*5c1def83SBjoern A. Zeeb *srng->u.src_ring.tp_addr = 0;
1403*5c1def83SBjoern A. Zeeb
1404*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1405*5c1def83SBjoern A. Zeeb val = 0;
1406*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
1407*5c1def83SBjoern A. Zeeb val |= HAL_TCL1_RING_MISC_DATA_TLV_SWAP;
1408*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
1409*5c1def83SBjoern A. Zeeb val |= HAL_TCL1_RING_MISC_HOST_FW_SWAP;
1410*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
1411*5c1def83SBjoern A. Zeeb val |= HAL_TCL1_RING_MISC_MSI_SWAP;
1412*5c1def83SBjoern A. Zeeb
1413*5c1def83SBjoern A. Zeeb /* Loop count is not used for SRC rings */
1414*5c1def83SBjoern A. Zeeb val |= HAL_TCL1_RING_MISC_MSI_LOOPCNT_DISABLE;
1415*5c1def83SBjoern A. Zeeb
1416*5c1def83SBjoern A. Zeeb val |= HAL_TCL1_RING_MISC_SRNG_ENABLE;
1417*5c1def83SBjoern A. Zeeb
1418*5c1def83SBjoern A. Zeeb if (srng->ring_id == HAL_SRNG_RING_ID_WBM_IDLE_LINK)
1419*5c1def83SBjoern A. Zeeb val |= HAL_TCL1_RING_MISC_MSI_RING_ID_DISABLE;
1420*5c1def83SBjoern A. Zeeb
1421*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_MISC_OFFSET(ab), val);
1422*5c1def83SBjoern A. Zeeb }
1423*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_hw_init(struct ath12k_base * ab,struct hal_srng * srng)1424*5c1def83SBjoern A. Zeeb static void ath12k_hal_srng_hw_init(struct ath12k_base *ab,
1425*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1426*5c1def83SBjoern A. Zeeb {
1427*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1428*5c1def83SBjoern A. Zeeb ath12k_hal_srng_src_hw_init(ab, srng);
1429*5c1def83SBjoern A. Zeeb else
1430*5c1def83SBjoern A. Zeeb ath12k_hal_srng_dst_hw_init(ab, srng);
1431*5c1def83SBjoern A. Zeeb }
1432*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_ring_id(struct ath12k_base * ab,enum hal_ring_type type,int ring_num,int mac_id)1433*5c1def83SBjoern A. Zeeb static int ath12k_hal_srng_get_ring_id(struct ath12k_base *ab,
1434*5c1def83SBjoern A. Zeeb enum hal_ring_type type,
1435*5c1def83SBjoern A. Zeeb int ring_num, int mac_id)
1436*5c1def83SBjoern A. Zeeb {
1437*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config = &ab->hal.srng_config[type];
1438*5c1def83SBjoern A. Zeeb int ring_id;
1439*5c1def83SBjoern A. Zeeb
1440*5c1def83SBjoern A. Zeeb if (ring_num >= srng_config->max_rings) {
1441*5c1def83SBjoern A. Zeeb ath12k_warn(ab, "invalid ring number :%d\n", ring_num);
1442*5c1def83SBjoern A. Zeeb return -EINVAL;
1443*5c1def83SBjoern A. Zeeb }
1444*5c1def83SBjoern A. Zeeb
1445*5c1def83SBjoern A. Zeeb ring_id = srng_config->start_ring_id + ring_num;
1446*5c1def83SBjoern A. Zeeb if (srng_config->mac_type == ATH12K_HAL_SRNG_PMAC)
1447*5c1def83SBjoern A. Zeeb ring_id += mac_id * HAL_SRNG_RINGS_PER_PMAC;
1448*5c1def83SBjoern A. Zeeb
1449*5c1def83SBjoern A. Zeeb if (WARN_ON(ring_id >= HAL_SRNG_RING_ID_MAX))
1450*5c1def83SBjoern A. Zeeb return -EINVAL;
1451*5c1def83SBjoern A. Zeeb
1452*5c1def83SBjoern A. Zeeb return ring_id;
1453*5c1def83SBjoern A. Zeeb }
1454*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_entrysize(struct ath12k_base * ab,u32 ring_type)1455*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_get_entrysize(struct ath12k_base *ab, u32 ring_type)
1456*5c1def83SBjoern A. Zeeb {
1457*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config;
1458*5c1def83SBjoern A. Zeeb
1459*5c1def83SBjoern A. Zeeb if (WARN_ON(ring_type >= HAL_MAX_RING_TYPES))
1460*5c1def83SBjoern A. Zeeb return -EINVAL;
1461*5c1def83SBjoern A. Zeeb
1462*5c1def83SBjoern A. Zeeb srng_config = &ab->hal.srng_config[ring_type];
1463*5c1def83SBjoern A. Zeeb
1464*5c1def83SBjoern A. Zeeb return (srng_config->entry_size << 2);
1465*5c1def83SBjoern A. Zeeb }
1466*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_max_entries(struct ath12k_base * ab,u32 ring_type)1467*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_get_max_entries(struct ath12k_base *ab, u32 ring_type)
1468*5c1def83SBjoern A. Zeeb {
1469*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config;
1470*5c1def83SBjoern A. Zeeb
1471*5c1def83SBjoern A. Zeeb if (WARN_ON(ring_type >= HAL_MAX_RING_TYPES))
1472*5c1def83SBjoern A. Zeeb return -EINVAL;
1473*5c1def83SBjoern A. Zeeb
1474*5c1def83SBjoern A. Zeeb srng_config = &ab->hal.srng_config[ring_type];
1475*5c1def83SBjoern A. Zeeb
1476*5c1def83SBjoern A. Zeeb return (srng_config->max_size / srng_config->entry_size);
1477*5c1def83SBjoern A. Zeeb }
1478*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_params(struct ath12k_base * ab,struct hal_srng * srng,struct hal_srng_params * params)1479*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_get_params(struct ath12k_base *ab, struct hal_srng *srng,
1480*5c1def83SBjoern A. Zeeb struct hal_srng_params *params)
1481*5c1def83SBjoern A. Zeeb {
1482*5c1def83SBjoern A. Zeeb params->ring_base_paddr = srng->ring_base_paddr;
1483*5c1def83SBjoern A. Zeeb params->ring_base_vaddr = srng->ring_base_vaddr;
1484*5c1def83SBjoern A. Zeeb params->num_entries = srng->num_entries;
1485*5c1def83SBjoern A. Zeeb params->intr_timer_thres_us = srng->intr_timer_thres_us;
1486*5c1def83SBjoern A. Zeeb params->intr_batch_cntr_thres_entries =
1487*5c1def83SBjoern A. Zeeb srng->intr_batch_cntr_thres_entries;
1488*5c1def83SBjoern A. Zeeb params->low_threshold = srng->u.src_ring.low_threshold;
1489*5c1def83SBjoern A. Zeeb params->msi_addr = srng->msi_addr;
1490*5c1def83SBjoern A. Zeeb params->msi2_addr = srng->msi2_addr;
1491*5c1def83SBjoern A. Zeeb params->msi_data = srng->msi_data;
1492*5c1def83SBjoern A. Zeeb params->msi2_data = srng->msi2_data;
1493*5c1def83SBjoern A. Zeeb params->flags = srng->flags;
1494*5c1def83SBjoern A. Zeeb }
1495*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_hp_addr(struct ath12k_base * ab,struct hal_srng * srng)1496*5c1def83SBjoern A. Zeeb dma_addr_t ath12k_hal_srng_get_hp_addr(struct ath12k_base *ab,
1497*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1498*5c1def83SBjoern A. Zeeb {
1499*5c1def83SBjoern A. Zeeb if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
1500*5c1def83SBjoern A. Zeeb return 0;
1501*5c1def83SBjoern A. Zeeb
1502*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1503*5c1def83SBjoern A. Zeeb return ab->hal.wrp.paddr +
1504*5c1def83SBjoern A. Zeeb ((unsigned long)srng->u.src_ring.hp_addr -
1505*5c1def83SBjoern A. Zeeb (unsigned long)ab->hal.wrp.vaddr);
1506*5c1def83SBjoern A. Zeeb else
1507*5c1def83SBjoern A. Zeeb return ab->hal.rdp.paddr +
1508*5c1def83SBjoern A. Zeeb ((unsigned long)srng->u.dst_ring.hp_addr -
1509*5c1def83SBjoern A. Zeeb (unsigned long)ab->hal.rdp.vaddr);
1510*5c1def83SBjoern A. Zeeb }
1511*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_tp_addr(struct ath12k_base * ab,struct hal_srng * srng)1512*5c1def83SBjoern A. Zeeb dma_addr_t ath12k_hal_srng_get_tp_addr(struct ath12k_base *ab,
1513*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1514*5c1def83SBjoern A. Zeeb {
1515*5c1def83SBjoern A. Zeeb if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
1516*5c1def83SBjoern A. Zeeb return 0;
1517*5c1def83SBjoern A. Zeeb
1518*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1519*5c1def83SBjoern A. Zeeb return ab->hal.rdp.paddr +
1520*5c1def83SBjoern A. Zeeb ((unsigned long)srng->u.src_ring.tp_addr -
1521*5c1def83SBjoern A. Zeeb (unsigned long)ab->hal.rdp.vaddr);
1522*5c1def83SBjoern A. Zeeb else
1523*5c1def83SBjoern A. Zeeb return ab->hal.wrp.paddr +
1524*5c1def83SBjoern A. Zeeb ((unsigned long)srng->u.dst_ring.tp_addr -
1525*5c1def83SBjoern A. Zeeb (unsigned long)ab->hal.wrp.vaddr);
1526*5c1def83SBjoern A. Zeeb }
1527*5c1def83SBjoern A. Zeeb
ath12k_hal_ce_get_desc_size(enum hal_ce_desc type)1528*5c1def83SBjoern A. Zeeb u32 ath12k_hal_ce_get_desc_size(enum hal_ce_desc type)
1529*5c1def83SBjoern A. Zeeb {
1530*5c1def83SBjoern A. Zeeb switch (type) {
1531*5c1def83SBjoern A. Zeeb case HAL_CE_DESC_SRC:
1532*5c1def83SBjoern A. Zeeb return sizeof(struct hal_ce_srng_src_desc);
1533*5c1def83SBjoern A. Zeeb case HAL_CE_DESC_DST:
1534*5c1def83SBjoern A. Zeeb return sizeof(struct hal_ce_srng_dest_desc);
1535*5c1def83SBjoern A. Zeeb case HAL_CE_DESC_DST_STATUS:
1536*5c1def83SBjoern A. Zeeb return sizeof(struct hal_ce_srng_dst_status_desc);
1537*5c1def83SBjoern A. Zeeb }
1538*5c1def83SBjoern A. Zeeb
1539*5c1def83SBjoern A. Zeeb return 0;
1540*5c1def83SBjoern A. Zeeb }
1541*5c1def83SBjoern A. Zeeb
ath12k_hal_ce_src_set_desc(struct hal_ce_srng_src_desc * desc,dma_addr_t paddr,u32 len,u32 id,u8 byte_swap_data)1542*5c1def83SBjoern A. Zeeb void ath12k_hal_ce_src_set_desc(struct hal_ce_srng_src_desc *desc, dma_addr_t paddr,
1543*5c1def83SBjoern A. Zeeb u32 len, u32 id, u8 byte_swap_data)
1544*5c1def83SBjoern A. Zeeb {
1545*5c1def83SBjoern A. Zeeb desc->buffer_addr_low = cpu_to_le32(paddr & HAL_ADDR_LSB_REG_MASK);
1546*5c1def83SBjoern A. Zeeb desc->buffer_addr_info =
1547*5c1def83SBjoern A. Zeeb le32_encode_bits(((u64)paddr >> HAL_ADDR_MSB_REG_SHIFT),
1548*5c1def83SBjoern A. Zeeb HAL_CE_SRC_DESC_ADDR_INFO_ADDR_HI) |
1549*5c1def83SBjoern A. Zeeb le32_encode_bits(byte_swap_data,
1550*5c1def83SBjoern A. Zeeb HAL_CE_SRC_DESC_ADDR_INFO_BYTE_SWAP) |
1551*5c1def83SBjoern A. Zeeb le32_encode_bits(0, HAL_CE_SRC_DESC_ADDR_INFO_GATHER) |
1552*5c1def83SBjoern A. Zeeb le32_encode_bits(len, HAL_CE_SRC_DESC_ADDR_INFO_LEN);
1553*5c1def83SBjoern A. Zeeb desc->meta_info = le32_encode_bits(id, HAL_CE_SRC_DESC_META_INFO_DATA);
1554*5c1def83SBjoern A. Zeeb }
1555*5c1def83SBjoern A. Zeeb
ath12k_hal_ce_dst_set_desc(struct hal_ce_srng_dest_desc * desc,dma_addr_t paddr)1556*5c1def83SBjoern A. Zeeb void ath12k_hal_ce_dst_set_desc(struct hal_ce_srng_dest_desc *desc, dma_addr_t paddr)
1557*5c1def83SBjoern A. Zeeb {
1558*5c1def83SBjoern A. Zeeb desc->buffer_addr_low = cpu_to_le32(paddr & HAL_ADDR_LSB_REG_MASK);
1559*5c1def83SBjoern A. Zeeb desc->buffer_addr_info =
1560*5c1def83SBjoern A. Zeeb le32_encode_bits(((u64)paddr >> HAL_ADDR_MSB_REG_SHIFT),
1561*5c1def83SBjoern A. Zeeb HAL_CE_DEST_DESC_ADDR_INFO_ADDR_HI);
1562*5c1def83SBjoern A. Zeeb }
1563*5c1def83SBjoern A. Zeeb
ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc * desc)1564*5c1def83SBjoern A. Zeeb u32 ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc)
1565*5c1def83SBjoern A. Zeeb {
1566*5c1def83SBjoern A. Zeeb u32 len;
1567*5c1def83SBjoern A. Zeeb
1568*5c1def83SBjoern A. Zeeb len = le32_get_bits(desc->flags, HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
1569*5c1def83SBjoern A. Zeeb desc->flags &= ~cpu_to_le32(HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
1570*5c1def83SBjoern A. Zeeb
1571*5c1def83SBjoern A. Zeeb return len;
1572*5c1def83SBjoern A. Zeeb }
1573*5c1def83SBjoern A. Zeeb
ath12k_hal_set_link_desc_addr(struct hal_wbm_link_desc * desc,u32 cookie,dma_addr_t paddr)1574*5c1def83SBjoern A. Zeeb void ath12k_hal_set_link_desc_addr(struct hal_wbm_link_desc *desc, u32 cookie,
1575*5c1def83SBjoern A. Zeeb dma_addr_t paddr)
1576*5c1def83SBjoern A. Zeeb {
1577*5c1def83SBjoern A. Zeeb desc->buf_addr_info.info0 = le32_encode_bits((paddr & HAL_ADDR_LSB_REG_MASK),
1578*5c1def83SBjoern A. Zeeb BUFFER_ADDR_INFO0_ADDR);
1579*5c1def83SBjoern A. Zeeb desc->buf_addr_info.info1 =
1580*5c1def83SBjoern A. Zeeb le32_encode_bits(((u64)paddr >> HAL_ADDR_MSB_REG_SHIFT),
1581*5c1def83SBjoern A. Zeeb BUFFER_ADDR_INFO1_ADDR) |
1582*5c1def83SBjoern A. Zeeb le32_encode_bits(1, BUFFER_ADDR_INFO1_RET_BUF_MGR) |
1583*5c1def83SBjoern A. Zeeb le32_encode_bits(cookie, BUFFER_ADDR_INFO1_SW_COOKIE);
1584*5c1def83SBjoern A. Zeeb }
1585*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_dst_peek(struct ath12k_base * ab,struct hal_srng * srng)1586*5c1def83SBjoern A. Zeeb void *ath12k_hal_srng_dst_peek(struct ath12k_base *ab, struct hal_srng *srng)
1587*5c1def83SBjoern A. Zeeb {
1588*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1589*5c1def83SBjoern A. Zeeb
1590*5c1def83SBjoern A. Zeeb if (srng->u.dst_ring.tp != srng->u.dst_ring.cached_hp)
1591*5c1def83SBjoern A. Zeeb return (srng->ring_base_vaddr + srng->u.dst_ring.tp);
1592*5c1def83SBjoern A. Zeeb
1593*5c1def83SBjoern A. Zeeb return NULL;
1594*5c1def83SBjoern A. Zeeb }
1595*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_dst_get_next_entry(struct ath12k_base * ab,struct hal_srng * srng)1596*5c1def83SBjoern A. Zeeb void *ath12k_hal_srng_dst_get_next_entry(struct ath12k_base *ab,
1597*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1598*5c1def83SBjoern A. Zeeb {
1599*5c1def83SBjoern A. Zeeb void *desc;
1600*5c1def83SBjoern A. Zeeb
1601*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1602*5c1def83SBjoern A. Zeeb
1603*5c1def83SBjoern A. Zeeb if (srng->u.dst_ring.tp == srng->u.dst_ring.cached_hp)
1604*5c1def83SBjoern A. Zeeb return NULL;
1605*5c1def83SBjoern A. Zeeb
1606*5c1def83SBjoern A. Zeeb desc = srng->ring_base_vaddr + srng->u.dst_ring.tp;
1607*5c1def83SBjoern A. Zeeb
1608*5c1def83SBjoern A. Zeeb srng->u.dst_ring.tp = (srng->u.dst_ring.tp + srng->entry_size) %
1609*5c1def83SBjoern A. Zeeb srng->ring_size;
1610*5c1def83SBjoern A. Zeeb
1611*5c1def83SBjoern A. Zeeb return desc;
1612*5c1def83SBjoern A. Zeeb }
1613*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_dst_num_free(struct ath12k_base * ab,struct hal_srng * srng,bool sync_hw_ptr)1614*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_dst_num_free(struct ath12k_base *ab, struct hal_srng *srng,
1615*5c1def83SBjoern A. Zeeb bool sync_hw_ptr)
1616*5c1def83SBjoern A. Zeeb {
1617*5c1def83SBjoern A. Zeeb u32 tp, hp;
1618*5c1def83SBjoern A. Zeeb
1619*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1620*5c1def83SBjoern A. Zeeb
1621*5c1def83SBjoern A. Zeeb tp = srng->u.dst_ring.tp;
1622*5c1def83SBjoern A. Zeeb
1623*5c1def83SBjoern A. Zeeb if (sync_hw_ptr) {
1624*5c1def83SBjoern A. Zeeb hp = *srng->u.dst_ring.hp_addr;
1625*5c1def83SBjoern A. Zeeb srng->u.dst_ring.cached_hp = hp;
1626*5c1def83SBjoern A. Zeeb } else {
1627*5c1def83SBjoern A. Zeeb hp = srng->u.dst_ring.cached_hp;
1628*5c1def83SBjoern A. Zeeb }
1629*5c1def83SBjoern A. Zeeb
1630*5c1def83SBjoern A. Zeeb if (hp >= tp)
1631*5c1def83SBjoern A. Zeeb return (hp - tp) / srng->entry_size;
1632*5c1def83SBjoern A. Zeeb else
1633*5c1def83SBjoern A. Zeeb return (srng->ring_size - tp + hp) / srng->entry_size;
1634*5c1def83SBjoern A. Zeeb }
1635*5c1def83SBjoern A. Zeeb
1636*5c1def83SBjoern A. Zeeb /* Returns number of available entries in src ring */
ath12k_hal_srng_src_num_free(struct ath12k_base * ab,struct hal_srng * srng,bool sync_hw_ptr)1637*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_src_num_free(struct ath12k_base *ab, struct hal_srng *srng,
1638*5c1def83SBjoern A. Zeeb bool sync_hw_ptr)
1639*5c1def83SBjoern A. Zeeb {
1640*5c1def83SBjoern A. Zeeb u32 tp, hp;
1641*5c1def83SBjoern A. Zeeb
1642*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1643*5c1def83SBjoern A. Zeeb
1644*5c1def83SBjoern A. Zeeb hp = srng->u.src_ring.hp;
1645*5c1def83SBjoern A. Zeeb
1646*5c1def83SBjoern A. Zeeb if (sync_hw_ptr) {
1647*5c1def83SBjoern A. Zeeb tp = *srng->u.src_ring.tp_addr;
1648*5c1def83SBjoern A. Zeeb srng->u.src_ring.cached_tp = tp;
1649*5c1def83SBjoern A. Zeeb } else {
1650*5c1def83SBjoern A. Zeeb tp = srng->u.src_ring.cached_tp;
1651*5c1def83SBjoern A. Zeeb }
1652*5c1def83SBjoern A. Zeeb
1653*5c1def83SBjoern A. Zeeb if (tp > hp)
1654*5c1def83SBjoern A. Zeeb return ((tp - hp) / srng->entry_size) - 1;
1655*5c1def83SBjoern A. Zeeb else
1656*5c1def83SBjoern A. Zeeb return ((srng->ring_size - hp + tp) / srng->entry_size) - 1;
1657*5c1def83SBjoern A. Zeeb }
1658*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_src_get_next_entry(struct ath12k_base * ab,struct hal_srng * srng)1659*5c1def83SBjoern A. Zeeb void *ath12k_hal_srng_src_get_next_entry(struct ath12k_base *ab,
1660*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1661*5c1def83SBjoern A. Zeeb {
1662*5c1def83SBjoern A. Zeeb void *desc;
1663*5c1def83SBjoern A. Zeeb u32 next_hp;
1664*5c1def83SBjoern A. Zeeb
1665*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1666*5c1def83SBjoern A. Zeeb
1667*5c1def83SBjoern A. Zeeb /* TODO: Using % is expensive, but we have to do this since size of some
1668*5c1def83SBjoern A. Zeeb * SRNG rings is not power of 2 (due to descriptor sizes). Need to see
1669*5c1def83SBjoern A. Zeeb * if separate function is defined for rings having power of 2 ring size
1670*5c1def83SBjoern A. Zeeb * (TCL2SW, REO2SW, SW2RXDMA and CE rings) so that we can avoid the
1671*5c1def83SBjoern A. Zeeb * overhead of % by using mask (with &).
1672*5c1def83SBjoern A. Zeeb */
1673*5c1def83SBjoern A. Zeeb next_hp = (srng->u.src_ring.hp + srng->entry_size) % srng->ring_size;
1674*5c1def83SBjoern A. Zeeb
1675*5c1def83SBjoern A. Zeeb if (next_hp == srng->u.src_ring.cached_tp)
1676*5c1def83SBjoern A. Zeeb return NULL;
1677*5c1def83SBjoern A. Zeeb
1678*5c1def83SBjoern A. Zeeb desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
1679*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp = next_hp;
1680*5c1def83SBjoern A. Zeeb
1681*5c1def83SBjoern A. Zeeb /* TODO: Reap functionality is not used by all rings. If particular
1682*5c1def83SBjoern A. Zeeb * ring does not use reap functionality, we need not update reap_hp
1683*5c1def83SBjoern A. Zeeb * with next_hp pointer. Need to make sure a separate function is used
1684*5c1def83SBjoern A. Zeeb * before doing any optimization by removing below code updating
1685*5c1def83SBjoern A. Zeeb * reap_hp.
1686*5c1def83SBjoern A. Zeeb */
1687*5c1def83SBjoern A. Zeeb srng->u.src_ring.reap_hp = next_hp;
1688*5c1def83SBjoern A. Zeeb
1689*5c1def83SBjoern A. Zeeb return desc;
1690*5c1def83SBjoern A. Zeeb }
1691*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_src_reap_next(struct ath12k_base * ab,struct hal_srng * srng)1692*5c1def83SBjoern A. Zeeb void *ath12k_hal_srng_src_reap_next(struct ath12k_base *ab,
1693*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1694*5c1def83SBjoern A. Zeeb {
1695*5c1def83SBjoern A. Zeeb void *desc;
1696*5c1def83SBjoern A. Zeeb u32 next_reap_hp;
1697*5c1def83SBjoern A. Zeeb
1698*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1699*5c1def83SBjoern A. Zeeb
1700*5c1def83SBjoern A. Zeeb next_reap_hp = (srng->u.src_ring.reap_hp + srng->entry_size) %
1701*5c1def83SBjoern A. Zeeb srng->ring_size;
1702*5c1def83SBjoern A. Zeeb
1703*5c1def83SBjoern A. Zeeb if (next_reap_hp == srng->u.src_ring.cached_tp)
1704*5c1def83SBjoern A. Zeeb return NULL;
1705*5c1def83SBjoern A. Zeeb
1706*5c1def83SBjoern A. Zeeb desc = srng->ring_base_vaddr + next_reap_hp;
1707*5c1def83SBjoern A. Zeeb srng->u.src_ring.reap_hp = next_reap_hp;
1708*5c1def83SBjoern A. Zeeb
1709*5c1def83SBjoern A. Zeeb return desc;
1710*5c1def83SBjoern A. Zeeb }
1711*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_src_get_next_reaped(struct ath12k_base * ab,struct hal_srng * srng)1712*5c1def83SBjoern A. Zeeb void *ath12k_hal_srng_src_get_next_reaped(struct ath12k_base *ab,
1713*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
1714*5c1def83SBjoern A. Zeeb {
1715*5c1def83SBjoern A. Zeeb void *desc;
1716*5c1def83SBjoern A. Zeeb
1717*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1718*5c1def83SBjoern A. Zeeb
1719*5c1def83SBjoern A. Zeeb if (srng->u.src_ring.hp == srng->u.src_ring.reap_hp)
1720*5c1def83SBjoern A. Zeeb return NULL;
1721*5c1def83SBjoern A. Zeeb
1722*5c1def83SBjoern A. Zeeb desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
1723*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp = (srng->u.src_ring.hp + srng->entry_size) %
1724*5c1def83SBjoern A. Zeeb srng->ring_size;
1725*5c1def83SBjoern A. Zeeb
1726*5c1def83SBjoern A. Zeeb return desc;
1727*5c1def83SBjoern A. Zeeb }
1728*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_access_begin(struct ath12k_base * ab,struct hal_srng * srng)1729*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_access_begin(struct ath12k_base *ab, struct hal_srng *srng)
1730*5c1def83SBjoern A. Zeeb {
1731*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1732*5c1def83SBjoern A. Zeeb
1733*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1734*5c1def83SBjoern A. Zeeb srng->u.src_ring.cached_tp =
1735*5c1def83SBjoern A. Zeeb *(volatile u32 *)srng->u.src_ring.tp_addr;
1736*5c1def83SBjoern A. Zeeb else
1737*5c1def83SBjoern A. Zeeb srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr;
1738*5c1def83SBjoern A. Zeeb }
1739*5c1def83SBjoern A. Zeeb
1740*5c1def83SBjoern A. Zeeb /* Update cached ring head/tail pointers to HW. ath12k_hal_srng_access_begin()
1741*5c1def83SBjoern A. Zeeb * should have been called before this.
1742*5c1def83SBjoern A. Zeeb */
ath12k_hal_srng_access_end(struct ath12k_base * ab,struct hal_srng * srng)1743*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_access_end(struct ath12k_base *ab, struct hal_srng *srng)
1744*5c1def83SBjoern A. Zeeb {
1745*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
1746*5c1def83SBjoern A. Zeeb
1747*5c1def83SBjoern A. Zeeb /* TODO: See if we need a write memory barrier here */
1748*5c1def83SBjoern A. Zeeb if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) {
1749*5c1def83SBjoern A. Zeeb /* For LMAC rings, ring pointer updates are done through FW and
1750*5c1def83SBjoern A. Zeeb * hence written to a shared memory location that is read by FW
1751*5c1def83SBjoern A. Zeeb */
1752*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
1753*5c1def83SBjoern A. Zeeb srng->u.src_ring.last_tp =
1754*5c1def83SBjoern A. Zeeb *(volatile u32 *)srng->u.src_ring.tp_addr;
1755*5c1def83SBjoern A. Zeeb *srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
1756*5c1def83SBjoern A. Zeeb } else {
1757*5c1def83SBjoern A. Zeeb srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
1758*5c1def83SBjoern A. Zeeb *srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
1759*5c1def83SBjoern A. Zeeb }
1760*5c1def83SBjoern A. Zeeb } else {
1761*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
1762*5c1def83SBjoern A. Zeeb srng->u.src_ring.last_tp =
1763*5c1def83SBjoern A. Zeeb *(volatile u32 *)srng->u.src_ring.tp_addr;
1764*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1765*5c1def83SBjoern A. Zeeb (unsigned long)srng->u.src_ring.hp_addr -
1766*5c1def83SBjoern A. Zeeb (unsigned long)ab->mem,
1767*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp);
1768*5c1def83SBjoern A. Zeeb } else {
1769*5c1def83SBjoern A. Zeeb srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
1770*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1771*5c1def83SBjoern A. Zeeb (unsigned long)srng->u.dst_ring.tp_addr -
1772*5c1def83SBjoern A. Zeeb (unsigned long)ab->mem,
1773*5c1def83SBjoern A. Zeeb srng->u.dst_ring.tp);
1774*5c1def83SBjoern A. Zeeb }
1775*5c1def83SBjoern A. Zeeb }
1776*5c1def83SBjoern A. Zeeb
1777*5c1def83SBjoern A. Zeeb srng->timestamp = jiffies;
1778*5c1def83SBjoern A. Zeeb }
1779*5c1def83SBjoern A. Zeeb
ath12k_hal_setup_link_idle_list(struct ath12k_base * ab,struct hal_wbm_idle_scatter_list * sbuf,u32 nsbufs,u32 tot_link_desc,u32 end_offset)1780*5c1def83SBjoern A. Zeeb void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,
1781*5c1def83SBjoern A. Zeeb struct hal_wbm_idle_scatter_list *sbuf,
1782*5c1def83SBjoern A. Zeeb u32 nsbufs, u32 tot_link_desc,
1783*5c1def83SBjoern A. Zeeb u32 end_offset)
1784*5c1def83SBjoern A. Zeeb {
1785*5c1def83SBjoern A. Zeeb struct ath12k_buffer_addr *link_addr;
1786*5c1def83SBjoern A. Zeeb int i;
1787*5c1def83SBjoern A. Zeeb u32 reg_scatter_buf_sz = HAL_WBM_IDLE_SCATTER_BUF_SIZE / 64;
1788*5c1def83SBjoern A. Zeeb u32 val;
1789*5c1def83SBjoern A. Zeeb
1790*5c1def83SBjoern A. Zeeb #if defined(__linux__)
1791*5c1def83SBjoern A. Zeeb link_addr = (void *)sbuf[0].vaddr + HAL_WBM_IDLE_SCATTER_BUF_SIZE;
1792*5c1def83SBjoern A. Zeeb #elif defined(__FreeBSD__)
1793*5c1def83SBjoern A. Zeeb link_addr = (void *)((uintptr_t)sbuf[0].vaddr + HAL_WBM_IDLE_SCATTER_BUF_SIZE);
1794*5c1def83SBjoern A. Zeeb #endif
1795*5c1def83SBjoern A. Zeeb
1796*5c1def83SBjoern A. Zeeb for (i = 1; i < nsbufs; i++) {
1797*5c1def83SBjoern A. Zeeb link_addr->info0 = cpu_to_le32(sbuf[i].paddr & HAL_ADDR_LSB_REG_MASK);
1798*5c1def83SBjoern A. Zeeb
1799*5c1def83SBjoern A. Zeeb link_addr->info1 =
1800*5c1def83SBjoern A. Zeeb le32_encode_bits((u64)sbuf[i].paddr >> HAL_ADDR_MSB_REG_SHIFT,
1801*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
1802*5c1def83SBjoern A. Zeeb le32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
1803*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG);
1804*5c1def83SBjoern A. Zeeb
1805*5c1def83SBjoern A. Zeeb #if defined(__linux__)
1806*5c1def83SBjoern A. Zeeb link_addr = (void *)sbuf[i].vaddr +
1807*5c1def83SBjoern A. Zeeb HAL_WBM_IDLE_SCATTER_BUF_SIZE;
1808*5c1def83SBjoern A. Zeeb #elif defined(__FreeBSD__)
1809*5c1def83SBjoern A. Zeeb link_addr = (void *)((uintptr_t)sbuf[i].vaddr +
1810*5c1def83SBjoern A. Zeeb HAL_WBM_IDLE_SCATTER_BUF_SIZE);
1811*5c1def83SBjoern A. Zeeb #endif
1812*5c1def83SBjoern A. Zeeb }
1813*5c1def83SBjoern A. Zeeb
1814*5c1def83SBjoern A. Zeeb val = u32_encode_bits(reg_scatter_buf_sz, HAL_WBM_SCATTER_BUFFER_SIZE) |
1815*5c1def83SBjoern A. Zeeb u32_encode_bits(0x1, HAL_WBM_LINK_DESC_IDLE_LIST_MODE);
1816*5c1def83SBjoern A. Zeeb
1817*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1818*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1819*5c1def83SBjoern A. Zeeb HAL_WBM_R0_IDLE_LIST_CONTROL_ADDR(ab),
1820*5c1def83SBjoern A. Zeeb val);
1821*5c1def83SBjoern A. Zeeb
1822*5c1def83SBjoern A. Zeeb val = u32_encode_bits(reg_scatter_buf_sz * nsbufs,
1823*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST);
1824*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1825*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_R0_IDLE_LIST_SIZE_ADDR(ab),
1826*5c1def83SBjoern A. Zeeb val);
1827*5c1def83SBjoern A. Zeeb
1828*5c1def83SBjoern A. Zeeb val = u32_encode_bits(sbuf[0].paddr & HAL_ADDR_LSB_REG_MASK,
1829*5c1def83SBjoern A. Zeeb BUFFER_ADDR_INFO0_ADDR);
1830*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1831*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1832*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_RING_BASE_LSB(ab),
1833*5c1def83SBjoern A. Zeeb val);
1834*5c1def83SBjoern A. Zeeb
1835*5c1def83SBjoern A. Zeeb val = u32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
1836*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG) |
1837*5c1def83SBjoern A. Zeeb u32_encode_bits((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT,
1838*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32);
1839*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1840*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1841*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_RING_BASE_MSB(ab),
1842*5c1def83SBjoern A. Zeeb val);
1843*5c1def83SBjoern A. Zeeb
1844*5c1def83SBjoern A. Zeeb /* Setup head and tail pointers for the idle list */
1845*5c1def83SBjoern A. Zeeb val = u32_encode_bits(sbuf[nsbufs - 1].paddr, BUFFER_ADDR_INFO0_ADDR);
1846*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1847*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1848*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(ab),
1849*5c1def83SBjoern A. Zeeb val);
1850*5c1def83SBjoern A. Zeeb
1851*5c1def83SBjoern A. Zeeb val = u32_encode_bits(((u64)sbuf[nsbufs - 1].paddr >> HAL_ADDR_MSB_REG_SHIFT),
1852*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
1853*5c1def83SBjoern A. Zeeb u32_encode_bits((end_offset >> 2),
1854*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_HEAD_P_OFFSET_IX1);
1855*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1856*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1857*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX1(ab),
1858*5c1def83SBjoern A. Zeeb val);
1859*5c1def83SBjoern A. Zeeb
1860*5c1def83SBjoern A. Zeeb val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
1861*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1862*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1863*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(ab),
1864*5c1def83SBjoern A. Zeeb val);
1865*5c1def83SBjoern A. Zeeb
1866*5c1def83SBjoern A. Zeeb val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
1867*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1868*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1869*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX0(ab),
1870*5c1def83SBjoern A. Zeeb val);
1871*5c1def83SBjoern A. Zeeb
1872*5c1def83SBjoern A. Zeeb val = u32_encode_bits(((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT),
1873*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
1874*5c1def83SBjoern A. Zeeb u32_encode_bits(0, HAL_WBM_SCATTERED_DESC_TAIL_P_OFFSET_IX1);
1875*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1876*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1877*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX1(ab),
1878*5c1def83SBjoern A. Zeeb val);
1879*5c1def83SBjoern A. Zeeb
1880*5c1def83SBjoern A. Zeeb val = 2 * tot_link_desc;
1881*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1882*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1883*5c1def83SBjoern A. Zeeb HAL_WBM_SCATTERED_DESC_PTR_HP_ADDR(ab),
1884*5c1def83SBjoern A. Zeeb val);
1885*5c1def83SBjoern A. Zeeb
1886*5c1def83SBjoern A. Zeeb /* Enable the SRNG */
1887*5c1def83SBjoern A. Zeeb val = u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE) |
1888*5c1def83SBjoern A. Zeeb u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_RIND_ID_DISABLE);
1889*5c1def83SBjoern A. Zeeb ath12k_hif_write32(ab,
1890*5c1def83SBjoern A. Zeeb HAL_SEQ_WCSS_UMAC_WBM_REG +
1891*5c1def83SBjoern A. Zeeb HAL_WBM_IDLE_LINK_RING_MISC_ADDR(ab),
1892*5c1def83SBjoern A. Zeeb val);
1893*5c1def83SBjoern A. Zeeb }
1894*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_setup(struct ath12k_base * ab,enum hal_ring_type type,int ring_num,int mac_id,struct hal_srng_params * params)1895*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_setup(struct ath12k_base *ab, enum hal_ring_type type,
1896*5c1def83SBjoern A. Zeeb int ring_num, int mac_id,
1897*5c1def83SBjoern A. Zeeb struct hal_srng_params *params)
1898*5c1def83SBjoern A. Zeeb {
1899*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
1900*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config = &ab->hal.srng_config[type];
1901*5c1def83SBjoern A. Zeeb struct hal_srng *srng;
1902*5c1def83SBjoern A. Zeeb int ring_id;
1903*5c1def83SBjoern A. Zeeb u32 idx;
1904*5c1def83SBjoern A. Zeeb int i;
1905*5c1def83SBjoern A. Zeeb u32 reg_base;
1906*5c1def83SBjoern A. Zeeb
1907*5c1def83SBjoern A. Zeeb ring_id = ath12k_hal_srng_get_ring_id(ab, type, ring_num, mac_id);
1908*5c1def83SBjoern A. Zeeb if (ring_id < 0)
1909*5c1def83SBjoern A. Zeeb return ring_id;
1910*5c1def83SBjoern A. Zeeb
1911*5c1def83SBjoern A. Zeeb srng = &hal->srng_list[ring_id];
1912*5c1def83SBjoern A. Zeeb
1913*5c1def83SBjoern A. Zeeb srng->ring_id = ring_id;
1914*5c1def83SBjoern A. Zeeb srng->ring_dir = srng_config->ring_dir;
1915*5c1def83SBjoern A. Zeeb srng->ring_base_paddr = params->ring_base_paddr;
1916*5c1def83SBjoern A. Zeeb srng->ring_base_vaddr = params->ring_base_vaddr;
1917*5c1def83SBjoern A. Zeeb srng->entry_size = srng_config->entry_size;
1918*5c1def83SBjoern A. Zeeb srng->num_entries = params->num_entries;
1919*5c1def83SBjoern A. Zeeb srng->ring_size = srng->entry_size * srng->num_entries;
1920*5c1def83SBjoern A. Zeeb srng->intr_batch_cntr_thres_entries =
1921*5c1def83SBjoern A. Zeeb params->intr_batch_cntr_thres_entries;
1922*5c1def83SBjoern A. Zeeb srng->intr_timer_thres_us = params->intr_timer_thres_us;
1923*5c1def83SBjoern A. Zeeb srng->flags = params->flags;
1924*5c1def83SBjoern A. Zeeb srng->msi_addr = params->msi_addr;
1925*5c1def83SBjoern A. Zeeb srng->msi2_addr = params->msi2_addr;
1926*5c1def83SBjoern A. Zeeb srng->msi_data = params->msi_data;
1927*5c1def83SBjoern A. Zeeb srng->msi2_data = params->msi2_data;
1928*5c1def83SBjoern A. Zeeb srng->initialized = 1;
1929*5c1def83SBjoern A. Zeeb spin_lock_init(&srng->lock);
1930*5c1def83SBjoern A. Zeeb lockdep_set_class(&srng->lock, &srng->lock_key);
1931*5c1def83SBjoern A. Zeeb
1932*5c1def83SBjoern A. Zeeb for (i = 0; i < HAL_SRNG_NUM_REG_GRP; i++) {
1933*5c1def83SBjoern A. Zeeb srng->hwreg_base[i] = srng_config->reg_start[i] +
1934*5c1def83SBjoern A. Zeeb (ring_num * srng_config->reg_size[i]);
1935*5c1def83SBjoern A. Zeeb }
1936*5c1def83SBjoern A. Zeeb
1937*5c1def83SBjoern A. Zeeb memset(srng->ring_base_vaddr, 0,
1938*5c1def83SBjoern A. Zeeb (srng->entry_size * srng->num_entries) << 2);
1939*5c1def83SBjoern A. Zeeb
1940*5c1def83SBjoern A. Zeeb reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1941*5c1def83SBjoern A. Zeeb
1942*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
1943*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp = 0;
1944*5c1def83SBjoern A. Zeeb srng->u.src_ring.cached_tp = 0;
1945*5c1def83SBjoern A. Zeeb srng->u.src_ring.reap_hp = srng->ring_size - srng->entry_size;
1946*5c1def83SBjoern A. Zeeb srng->u.src_ring.tp_addr = (void *)(hal->rdp.vaddr + ring_id);
1947*5c1def83SBjoern A. Zeeb srng->u.src_ring.low_threshold = params->low_threshold *
1948*5c1def83SBjoern A. Zeeb srng->entry_size;
1949*5c1def83SBjoern A. Zeeb if (srng_config->mac_type == ATH12K_HAL_SRNG_UMAC) {
1950*5c1def83SBjoern A. Zeeb if (!ab->hw_params->supports_shadow_regs)
1951*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp_addr =
1952*5c1def83SBjoern A. Zeeb (u32 *)((unsigned long)ab->mem + reg_base);
1953*5c1def83SBjoern A. Zeeb else
1954*5c1def83SBjoern A. Zeeb ath12k_dbg(ab, ATH12K_DBG_HAL,
1955*5c1def83SBjoern A. Zeeb "hal type %d ring_num %d reg_base 0x%x shadow 0x%lx\n",
1956*5c1def83SBjoern A. Zeeb type, ring_num,
1957*5c1def83SBjoern A. Zeeb reg_base,
1958*5c1def83SBjoern A. Zeeb (unsigned long)srng->u.src_ring.hp_addr -
1959*5c1def83SBjoern A. Zeeb (unsigned long)ab->mem);
1960*5c1def83SBjoern A. Zeeb } else {
1961*5c1def83SBjoern A. Zeeb idx = ring_id - HAL_SRNG_RING_ID_DMAC_CMN_ID_START;
1962*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp_addr = (void *)(hal->wrp.vaddr +
1963*5c1def83SBjoern A. Zeeb idx);
1964*5c1def83SBjoern A. Zeeb srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
1965*5c1def83SBjoern A. Zeeb }
1966*5c1def83SBjoern A. Zeeb } else {
1967*5c1def83SBjoern A. Zeeb /* During initialization loop count in all the descriptors
1968*5c1def83SBjoern A. Zeeb * will be set to zero, and HW will set it to 1 on completing
1969*5c1def83SBjoern A. Zeeb * descriptor update in first loop, and increments it by 1 on
1970*5c1def83SBjoern A. Zeeb * subsequent loops (loop count wraps around after reaching
1971*5c1def83SBjoern A. Zeeb * 0xffff). The 'loop_cnt' in SW ring state is the expected
1972*5c1def83SBjoern A. Zeeb * loop count in descriptors updated by HW (to be processed
1973*5c1def83SBjoern A. Zeeb * by SW).
1974*5c1def83SBjoern A. Zeeb */
1975*5c1def83SBjoern A. Zeeb srng->u.dst_ring.loop_cnt = 1;
1976*5c1def83SBjoern A. Zeeb srng->u.dst_ring.tp = 0;
1977*5c1def83SBjoern A. Zeeb srng->u.dst_ring.cached_hp = 0;
1978*5c1def83SBjoern A. Zeeb srng->u.dst_ring.hp_addr = (void *)(hal->rdp.vaddr + ring_id);
1979*5c1def83SBjoern A. Zeeb if (srng_config->mac_type == ATH12K_HAL_SRNG_UMAC) {
1980*5c1def83SBjoern A. Zeeb if (!ab->hw_params->supports_shadow_regs)
1981*5c1def83SBjoern A. Zeeb srng->u.dst_ring.tp_addr =
1982*5c1def83SBjoern A. Zeeb (u32 *)((unsigned long)ab->mem + reg_base +
1983*5c1def83SBjoern A. Zeeb (HAL_REO1_RING_TP - HAL_REO1_RING_HP));
1984*5c1def83SBjoern A. Zeeb else
1985*5c1def83SBjoern A. Zeeb ath12k_dbg(ab, ATH12K_DBG_HAL,
1986*5c1def83SBjoern A. Zeeb "type %d ring_num %d target_reg 0x%x shadow 0x%lx\n",
1987*5c1def83SBjoern A. Zeeb type, ring_num,
1988*5c1def83SBjoern A. Zeeb reg_base + HAL_REO1_RING_TP - HAL_REO1_RING_HP,
1989*5c1def83SBjoern A. Zeeb (unsigned long)srng->u.dst_ring.tp_addr -
1990*5c1def83SBjoern A. Zeeb (unsigned long)ab->mem);
1991*5c1def83SBjoern A. Zeeb } else {
1992*5c1def83SBjoern A. Zeeb /* For PMAC & DMAC rings, tail pointer updates will be done
1993*5c1def83SBjoern A. Zeeb * through FW by writing to a shared memory location
1994*5c1def83SBjoern A. Zeeb */
1995*5c1def83SBjoern A. Zeeb idx = ring_id - HAL_SRNG_RING_ID_DMAC_CMN_ID_START;
1996*5c1def83SBjoern A. Zeeb srng->u.dst_ring.tp_addr = (void *)(hal->wrp.vaddr +
1997*5c1def83SBjoern A. Zeeb idx);
1998*5c1def83SBjoern A. Zeeb srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
1999*5c1def83SBjoern A. Zeeb }
2000*5c1def83SBjoern A. Zeeb }
2001*5c1def83SBjoern A. Zeeb
2002*5c1def83SBjoern A. Zeeb if (srng_config->mac_type != ATH12K_HAL_SRNG_UMAC)
2003*5c1def83SBjoern A. Zeeb return ring_id;
2004*5c1def83SBjoern A. Zeeb
2005*5c1def83SBjoern A. Zeeb ath12k_hal_srng_hw_init(ab, srng);
2006*5c1def83SBjoern A. Zeeb
2007*5c1def83SBjoern A. Zeeb if (type == HAL_CE_DST) {
2008*5c1def83SBjoern A. Zeeb srng->u.dst_ring.max_buffer_length = params->max_buffer_len;
2009*5c1def83SBjoern A. Zeeb ath12k_hal_ce_dst_setup(ab, srng, ring_num);
2010*5c1def83SBjoern A. Zeeb }
2011*5c1def83SBjoern A. Zeeb
2012*5c1def83SBjoern A. Zeeb return ring_id;
2013*5c1def83SBjoern A. Zeeb }
2014*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_update_hp_tp_addr(struct ath12k_base * ab,int shadow_cfg_idx,enum hal_ring_type ring_type,int ring_num)2015*5c1def83SBjoern A. Zeeb static void ath12k_hal_srng_update_hp_tp_addr(struct ath12k_base *ab,
2016*5c1def83SBjoern A. Zeeb int shadow_cfg_idx,
2017*5c1def83SBjoern A. Zeeb enum hal_ring_type ring_type,
2018*5c1def83SBjoern A. Zeeb int ring_num)
2019*5c1def83SBjoern A. Zeeb {
2020*5c1def83SBjoern A. Zeeb struct hal_srng *srng;
2021*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2022*5c1def83SBjoern A. Zeeb int ring_id;
2023*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
2024*5c1def83SBjoern A. Zeeb
2025*5c1def83SBjoern A. Zeeb ring_id = ath12k_hal_srng_get_ring_id(ab, ring_type, ring_num, 0);
2026*5c1def83SBjoern A. Zeeb if (ring_id < 0)
2027*5c1def83SBjoern A. Zeeb return;
2028*5c1def83SBjoern A. Zeeb
2029*5c1def83SBjoern A. Zeeb srng = &hal->srng_list[ring_id];
2030*5c1def83SBjoern A. Zeeb
2031*5c1def83SBjoern A. Zeeb if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
2032*5c1def83SBjoern A. Zeeb srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
2033*5c1def83SBjoern A. Zeeb (unsigned long)ab->mem);
2034*5c1def83SBjoern A. Zeeb else
2035*5c1def83SBjoern A. Zeeb srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
2036*5c1def83SBjoern A. Zeeb (unsigned long)ab->mem);
2037*5c1def83SBjoern A. Zeeb }
2038*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_update_shadow_config(struct ath12k_base * ab,enum hal_ring_type ring_type,int ring_num)2039*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_update_shadow_config(struct ath12k_base *ab,
2040*5c1def83SBjoern A. Zeeb enum hal_ring_type ring_type,
2041*5c1def83SBjoern A. Zeeb int ring_num)
2042*5c1def83SBjoern A. Zeeb {
2043*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2044*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
2045*5c1def83SBjoern A. Zeeb int shadow_cfg_idx = hal->num_shadow_reg_configured;
2046*5c1def83SBjoern A. Zeeb u32 target_reg;
2047*5c1def83SBjoern A. Zeeb
2048*5c1def83SBjoern A. Zeeb if (shadow_cfg_idx >= HAL_SHADOW_NUM_REGS)
2049*5c1def83SBjoern A. Zeeb return -EINVAL;
2050*5c1def83SBjoern A. Zeeb
2051*5c1def83SBjoern A. Zeeb hal->num_shadow_reg_configured++;
2052*5c1def83SBjoern A. Zeeb
2053*5c1def83SBjoern A. Zeeb target_reg = srng_config->reg_start[HAL_HP_OFFSET_IN_REG_START];
2054*5c1def83SBjoern A. Zeeb target_reg += srng_config->reg_size[HAL_HP_OFFSET_IN_REG_START] *
2055*5c1def83SBjoern A. Zeeb ring_num;
2056*5c1def83SBjoern A. Zeeb
2057*5c1def83SBjoern A. Zeeb /* For destination ring, shadow the TP */
2058*5c1def83SBjoern A. Zeeb if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
2059*5c1def83SBjoern A. Zeeb target_reg += HAL_OFFSET_FROM_HP_TO_TP;
2060*5c1def83SBjoern A. Zeeb
2061*5c1def83SBjoern A. Zeeb hal->shadow_reg_addr[shadow_cfg_idx] = target_reg;
2062*5c1def83SBjoern A. Zeeb
2063*5c1def83SBjoern A. Zeeb /* update hp/tp addr to hal structure*/
2064*5c1def83SBjoern A. Zeeb ath12k_hal_srng_update_hp_tp_addr(ab, shadow_cfg_idx, ring_type,
2065*5c1def83SBjoern A. Zeeb ring_num);
2066*5c1def83SBjoern A. Zeeb
2067*5c1def83SBjoern A. Zeeb ath12k_dbg(ab, ATH12K_DBG_HAL,
2068*5c1def83SBjoern A. Zeeb "target_reg %x, shadow reg 0x%x shadow_idx 0x%x, ring_type %d, ring num %d",
2069*5c1def83SBjoern A. Zeeb target_reg,
2070*5c1def83SBjoern A. Zeeb HAL_SHADOW_REG(shadow_cfg_idx),
2071*5c1def83SBjoern A. Zeeb shadow_cfg_idx,
2072*5c1def83SBjoern A. Zeeb ring_type, ring_num);
2073*5c1def83SBjoern A. Zeeb
2074*5c1def83SBjoern A. Zeeb return 0;
2075*5c1def83SBjoern A. Zeeb }
2076*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_shadow_config(struct ath12k_base * ab)2077*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_shadow_config(struct ath12k_base *ab)
2078*5c1def83SBjoern A. Zeeb {
2079*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2080*5c1def83SBjoern A. Zeeb int ring_type, ring_num;
2081*5c1def83SBjoern A. Zeeb
2082*5c1def83SBjoern A. Zeeb /* update all the non-CE srngs. */
2083*5c1def83SBjoern A. Zeeb for (ring_type = 0; ring_type < HAL_MAX_RING_TYPES; ring_type++) {
2084*5c1def83SBjoern A. Zeeb struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
2085*5c1def83SBjoern A. Zeeb
2086*5c1def83SBjoern A. Zeeb if (ring_type == HAL_CE_SRC ||
2087*5c1def83SBjoern A. Zeeb ring_type == HAL_CE_DST ||
2088*5c1def83SBjoern A. Zeeb ring_type == HAL_CE_DST_STATUS)
2089*5c1def83SBjoern A. Zeeb continue;
2090*5c1def83SBjoern A. Zeeb
2091*5c1def83SBjoern A. Zeeb if (srng_config->mac_type == ATH12K_HAL_SRNG_DMAC ||
2092*5c1def83SBjoern A. Zeeb srng_config->mac_type == ATH12K_HAL_SRNG_PMAC)
2093*5c1def83SBjoern A. Zeeb continue;
2094*5c1def83SBjoern A. Zeeb
2095*5c1def83SBjoern A. Zeeb for (ring_num = 0; ring_num < srng_config->max_rings; ring_num++)
2096*5c1def83SBjoern A. Zeeb ath12k_hal_srng_update_shadow_config(ab, ring_type, ring_num);
2097*5c1def83SBjoern A. Zeeb }
2098*5c1def83SBjoern A. Zeeb }
2099*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_get_shadow_config(struct ath12k_base * ab,u32 ** cfg,u32 * len)2100*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_get_shadow_config(struct ath12k_base *ab,
2101*5c1def83SBjoern A. Zeeb u32 **cfg, u32 *len)
2102*5c1def83SBjoern A. Zeeb {
2103*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2104*5c1def83SBjoern A. Zeeb
2105*5c1def83SBjoern A. Zeeb *len = hal->num_shadow_reg_configured;
2106*5c1def83SBjoern A. Zeeb *cfg = hal->shadow_reg_addr;
2107*5c1def83SBjoern A. Zeeb }
2108*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_shadow_update_hp_tp(struct ath12k_base * ab,struct hal_srng * srng)2109*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_shadow_update_hp_tp(struct ath12k_base *ab,
2110*5c1def83SBjoern A. Zeeb struct hal_srng *srng)
2111*5c1def83SBjoern A. Zeeb {
2112*5c1def83SBjoern A. Zeeb lockdep_assert_held(&srng->lock);
2113*5c1def83SBjoern A. Zeeb
2114*5c1def83SBjoern A. Zeeb /* check whether the ring is empty. Update the shadow
2115*5c1def83SBjoern A. Zeeb * HP only when then ring isn't' empty.
2116*5c1def83SBjoern A. Zeeb */
2117*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC &&
2118*5c1def83SBjoern A. Zeeb *srng->u.src_ring.tp_addr != srng->u.src_ring.hp)
2119*5c1def83SBjoern A. Zeeb ath12k_hal_srng_access_end(ab, srng);
2120*5c1def83SBjoern A. Zeeb }
2121*5c1def83SBjoern A. Zeeb
ath12k_hal_register_srng_lock_keys(struct ath12k_base * ab)2122*5c1def83SBjoern A. Zeeb static void ath12k_hal_register_srng_lock_keys(struct ath12k_base *ab)
2123*5c1def83SBjoern A. Zeeb {
2124*5c1def83SBjoern A. Zeeb #if defined(__linux__)
2125*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2126*5c1def83SBjoern A. Zeeb #endif
2127*5c1def83SBjoern A. Zeeb u32 ring_id;
2128*5c1def83SBjoern A. Zeeb
2129*5c1def83SBjoern A. Zeeb for (ring_id = 0; ring_id < HAL_SRNG_RING_ID_MAX; ring_id++)
2130*5c1def83SBjoern A. Zeeb lockdep_register_key(&hal->srng_list[ring_id].lock_key);
2131*5c1def83SBjoern A. Zeeb }
2132*5c1def83SBjoern A. Zeeb
ath12k_hal_unregister_srng_lock_keys(struct ath12k_base * ab)2133*5c1def83SBjoern A. Zeeb static void ath12k_hal_unregister_srng_lock_keys(struct ath12k_base *ab)
2134*5c1def83SBjoern A. Zeeb {
2135*5c1def83SBjoern A. Zeeb #if defined(__linux__)
2136*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2137*5c1def83SBjoern A. Zeeb #endif
2138*5c1def83SBjoern A. Zeeb u32 ring_id;
2139*5c1def83SBjoern A. Zeeb
2140*5c1def83SBjoern A. Zeeb for (ring_id = 0; ring_id < HAL_SRNG_RING_ID_MAX; ring_id++)
2141*5c1def83SBjoern A. Zeeb lockdep_unregister_key(&hal->srng_list[ring_id].lock_key);
2142*5c1def83SBjoern A. Zeeb }
2143*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_init(struct ath12k_base * ab)2144*5c1def83SBjoern A. Zeeb int ath12k_hal_srng_init(struct ath12k_base *ab)
2145*5c1def83SBjoern A. Zeeb {
2146*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2147*5c1def83SBjoern A. Zeeb int ret;
2148*5c1def83SBjoern A. Zeeb
2149*5c1def83SBjoern A. Zeeb memset(hal, 0, sizeof(*hal));
2150*5c1def83SBjoern A. Zeeb
2151*5c1def83SBjoern A. Zeeb ret = ab->hw_params->hal_ops->create_srng_config(ab);
2152*5c1def83SBjoern A. Zeeb if (ret)
2153*5c1def83SBjoern A. Zeeb goto err_hal;
2154*5c1def83SBjoern A. Zeeb
2155*5c1def83SBjoern A. Zeeb ret = ath12k_hal_alloc_cont_rdp(ab);
2156*5c1def83SBjoern A. Zeeb if (ret)
2157*5c1def83SBjoern A. Zeeb goto err_hal;
2158*5c1def83SBjoern A. Zeeb
2159*5c1def83SBjoern A. Zeeb ret = ath12k_hal_alloc_cont_wrp(ab);
2160*5c1def83SBjoern A. Zeeb if (ret)
2161*5c1def83SBjoern A. Zeeb goto err_free_cont_rdp;
2162*5c1def83SBjoern A. Zeeb
2163*5c1def83SBjoern A. Zeeb ath12k_hal_register_srng_lock_keys(ab);
2164*5c1def83SBjoern A. Zeeb
2165*5c1def83SBjoern A. Zeeb return 0;
2166*5c1def83SBjoern A. Zeeb
2167*5c1def83SBjoern A. Zeeb err_free_cont_rdp:
2168*5c1def83SBjoern A. Zeeb ath12k_hal_free_cont_rdp(ab);
2169*5c1def83SBjoern A. Zeeb
2170*5c1def83SBjoern A. Zeeb err_hal:
2171*5c1def83SBjoern A. Zeeb return ret;
2172*5c1def83SBjoern A. Zeeb }
2173*5c1def83SBjoern A. Zeeb
ath12k_hal_srng_deinit(struct ath12k_base * ab)2174*5c1def83SBjoern A. Zeeb void ath12k_hal_srng_deinit(struct ath12k_base *ab)
2175*5c1def83SBjoern A. Zeeb {
2176*5c1def83SBjoern A. Zeeb struct ath12k_hal *hal = &ab->hal;
2177*5c1def83SBjoern A. Zeeb
2178*5c1def83SBjoern A. Zeeb ath12k_hal_unregister_srng_lock_keys(ab);
2179*5c1def83SBjoern A. Zeeb ath12k_hal_free_cont_rdp(ab);
2180*5c1def83SBjoern A. Zeeb ath12k_hal_free_cont_wrp(ab);
2181*5c1def83SBjoern A. Zeeb kfree(hal->srng_config);
2182*5c1def83SBjoern A. Zeeb hal->srng_config = NULL;
2183*5c1def83SBjoern A. Zeeb }
2184*5c1def83SBjoern A. Zeeb
ath12k_hal_dump_srng_stats(struct ath12k_base * ab)2185*5c1def83SBjoern A. Zeeb void ath12k_hal_dump_srng_stats(struct ath12k_base *ab)
2186*5c1def83SBjoern A. Zeeb {
2187*5c1def83SBjoern A. Zeeb struct hal_srng *srng;
2188*5c1def83SBjoern A. Zeeb struct ath12k_ext_irq_grp *irq_grp;
2189*5c1def83SBjoern A. Zeeb struct ath12k_ce_pipe *ce_pipe;
2190*5c1def83SBjoern A. Zeeb int i;
2191*5c1def83SBjoern A. Zeeb
2192*5c1def83SBjoern A. Zeeb ath12k_err(ab, "Last interrupt received for each CE:\n");
2193*5c1def83SBjoern A. Zeeb for (i = 0; i < ab->hw_params->ce_count; i++) {
2194*5c1def83SBjoern A. Zeeb ce_pipe = &ab->ce.ce_pipe[i];
2195*5c1def83SBjoern A. Zeeb
2196*5c1def83SBjoern A. Zeeb if (ath12k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
2197*5c1def83SBjoern A. Zeeb continue;
2198*5c1def83SBjoern A. Zeeb
2199*5c1def83SBjoern A. Zeeb ath12k_err(ab, "CE_id %d pipe_num %d %ums before\n",
2200*5c1def83SBjoern A. Zeeb i, ce_pipe->pipe_num,
2201*5c1def83SBjoern A. Zeeb jiffies_to_msecs(jiffies - ce_pipe->timestamp));
2202*5c1def83SBjoern A. Zeeb }
2203*5c1def83SBjoern A. Zeeb
2204*5c1def83SBjoern A. Zeeb ath12k_err(ab, "\nLast interrupt received for each group:\n");
2205*5c1def83SBjoern A. Zeeb for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
2206*5c1def83SBjoern A. Zeeb irq_grp = &ab->ext_irq_grp[i];
2207*5c1def83SBjoern A. Zeeb ath12k_err(ab, "group_id %d %ums before\n",
2208*5c1def83SBjoern A. Zeeb irq_grp->grp_id,
2209*5c1def83SBjoern A. Zeeb jiffies_to_msecs(jiffies - irq_grp->timestamp));
2210*5c1def83SBjoern A. Zeeb }
2211*5c1def83SBjoern A. Zeeb
2212*5c1def83SBjoern A. Zeeb for (i = 0; i < HAL_SRNG_RING_ID_MAX; i++) {
2213*5c1def83SBjoern A. Zeeb srng = &ab->hal.srng_list[i];
2214*5c1def83SBjoern A. Zeeb
2215*5c1def83SBjoern A. Zeeb if (!srng->initialized)
2216*5c1def83SBjoern A. Zeeb continue;
2217*5c1def83SBjoern A. Zeeb
2218*5c1def83SBjoern A. Zeeb if (srng->ring_dir == HAL_SRNG_DIR_SRC)
2219*5c1def83SBjoern A. Zeeb ath12k_err(ab,
2220*5c1def83SBjoern A. Zeeb "src srng id %u hp %u, reap_hp %u, cur tp %u, cached tp %u last tp %u napi processed before %ums\n",
2221*5c1def83SBjoern A. Zeeb srng->ring_id, srng->u.src_ring.hp,
2222*5c1def83SBjoern A. Zeeb srng->u.src_ring.reap_hp,
2223*5c1def83SBjoern A. Zeeb *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp,
2224*5c1def83SBjoern A. Zeeb srng->u.src_ring.last_tp,
2225*5c1def83SBjoern A. Zeeb jiffies_to_msecs(jiffies - srng->timestamp));
2226*5c1def83SBjoern A. Zeeb else if (srng->ring_dir == HAL_SRNG_DIR_DST)
2227*5c1def83SBjoern A. Zeeb ath12k_err(ab,
2228*5c1def83SBjoern A. Zeeb "dst srng id %u tp %u, cur hp %u, cached hp %u last hp %u napi processed before %ums\n",
2229*5c1def83SBjoern A. Zeeb srng->ring_id, srng->u.dst_ring.tp,
2230*5c1def83SBjoern A. Zeeb *srng->u.dst_ring.hp_addr,
2231*5c1def83SBjoern A. Zeeb srng->u.dst_ring.cached_hp,
2232*5c1def83SBjoern A. Zeeb srng->u.dst_ring.last_hp,
2233*5c1def83SBjoern A. Zeeb jiffies_to_msecs(jiffies - srng->timestamp));
2234*5c1def83SBjoern A. Zeeb }
2235*5c1def83SBjoern A. Zeeb }
2236