xref: /wlan-dirver/qca-wifi-host-cmn/hal/wifi3.0/qcn9224/v2/hal_9224v2.c (revision 2b23d2e388c3e0ba9ac6113a9da98706fc6be2fd)
1 /*
2  * Copyright (c) 2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 #include "hal_9224.h"
18 
19 struct hal_hw_srng_config hw_srng_table_9224v2[] = {
20 	/* TODO: max_rings can populated by querying HW capabilities */
21 	{ /* REO_DST */
22 		.start_ring_id = HAL_SRNG_REO2SW1,
23 		.max_rings = 8,
24 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
25 		.lmac_ring = FALSE,
26 		.ring_dir = HAL_SRNG_DST_RING,
27 		.reg_start = {
28 			HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(
29 				REO_REG_REG_BASE),
30 			HWIO_REO_R2_REO2SW1_RING_HP_ADDR(
31 				REO_REG_REG_BASE)
32 		},
33 		.reg_size = {
34 			HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) -
35 				HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0),
36 			HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) -
37 				HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0),
38 		},
39 		.max_size =
40 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >>
41 			HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT,
42 	},
43 	{ /* REO_EXCEPTION */
44 		/* Designating REO2SW0 ring as exception ring. This ring is
45 		 * similar to other REO2SW rings though it is named as REO2SW0.
46 		 * Any of theREO2SW rings can be used as exception ring.
47 		 */
48 		.start_ring_id = HAL_SRNG_REO2SW0,
49 		.max_rings = 1,
50 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
51 		.lmac_ring = FALSE,
52 		.ring_dir = HAL_SRNG_DST_RING,
53 		.reg_start = {
54 			HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR(
55 				REO_REG_REG_BASE),
56 			HWIO_REO_R2_REO2SW0_RING_HP_ADDR(
57 				REO_REG_REG_BASE)
58 		},
59 		/* Single ring - provide ring size if multiple rings of this
60 		 * type are supported
61 		 */
62 		.reg_size = {},
63 		.max_size =
64 			HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >>
65 			HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT,
66 	},
67 	{ /* REO_REINJECT */
68 		.start_ring_id = HAL_SRNG_SW2REO,
69 		.max_rings = 4,
70 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
71 		.lmac_ring = FALSE,
72 		.ring_dir = HAL_SRNG_SRC_RING,
73 		.reg_start = {
74 			HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(
75 				REO_REG_REG_BASE),
76 			HWIO_REO_R2_SW2REO_RING_HP_ADDR(
77 				REO_REG_REG_BASE)
78 		},
79 		/* Single ring - provide ring size if multiple rings of this
80 		 * type are supported
81 		 */
82 		.reg_size = {
83 			HWIO_REO_R0_SW2REO1_RING_BASE_LSB_ADDR(0) -
84 				HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(0),
85 			HWIO_REO_R2_SW2REO1_RING_HP_ADDR(0) -
86 				HWIO_REO_R2_SW2REO_RING_HP_ADDR(0)
87 		},
88 		.max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >>
89 				HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT,
90 	},
91 	{ /* REO_CMD */
92 		.start_ring_id = HAL_SRNG_REO_CMD,
93 		.max_rings = 1,
94 		.entry_size = (sizeof(struct tlv_32_hdr) +
95 			sizeof(struct reo_get_queue_stats)) >> 2,
96 		.lmac_ring = FALSE,
97 		.ring_dir = HAL_SRNG_SRC_RING,
98 		.reg_start = {
99 			HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR(
100 				REO_REG_REG_BASE),
101 			HWIO_REO_R2_REO_CMD_RING_HP_ADDR(
102 				REO_REG_REG_BASE),
103 		},
104 		/* Single ring - provide ring size if multiple rings of this
105 		 * type are supported
106 		 */
107 		.reg_size = {},
108 		.max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >>
109 			HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT,
110 	},
111 	{ /* REO_STATUS */
112 		.start_ring_id = HAL_SRNG_REO_STATUS,
113 		.max_rings = 1,
114 		.entry_size = (sizeof(struct tlv_32_hdr) +
115 			sizeof(struct reo_get_queue_stats_status)) >> 2,
116 		.lmac_ring = FALSE,
117 		.ring_dir = HAL_SRNG_DST_RING,
118 		.reg_start = {
119 			HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR(
120 				REO_REG_REG_BASE),
121 			HWIO_REO_R2_REO_STATUS_RING_HP_ADDR(
122 				REO_REG_REG_BASE),
123 		},
124 		/* Single ring - provide ring size if multiple rings of this
125 		 * type are supported
126 		 */
127 		.reg_size = {},
128 		.max_size =
129 		HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
130 			HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
131 	},
132 	{ /* TCL_DATA */
133 		.start_ring_id = HAL_SRNG_SW2TCL1,
134 		.max_rings = 6,
135 		.entry_size = sizeof(struct tcl_data_cmd) >> 2,
136 		.lmac_ring = FALSE,
137 		.ring_dir = HAL_SRNG_SRC_RING,
138 		.reg_start = {
139 			HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(
140 				MAC_TCL_REG_REG_BASE),
141 			HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(
142 				MAC_TCL_REG_REG_BASE),
143 		},
144 		.reg_size = {
145 			HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) -
146 				HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0),
147 			HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) -
148 				HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0),
149 		},
150 		.max_size =
151 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
152 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
153 	},
154 	{ /* TCL_CMD/CREDIT */
155 	  /* qca8074v2 and qcn9224 uses this ring for data commands */
156 		.start_ring_id = HAL_SRNG_SW2TCL_CMD,
157 		.max_rings = 1,
158 		.entry_size = sizeof(struct tcl_data_cmd) >> 2,
159 		.lmac_ring =  FALSE,
160 		.ring_dir = HAL_SRNG_SRC_RING,
161 		.reg_start = {
162 			HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR(
163 				MAC_TCL_REG_REG_BASE),
164 			HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR(
165 				MAC_TCL_REG_REG_BASE),
166 		},
167 		/* Single ring - provide ring size if multiple rings of this
168 		 * type are supported
169 		 */
170 		.reg_size = {},
171 		.max_size =
172 		HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >>
173 		HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT,
174 	},
175 	{ /* TCL_STATUS */
176 		.start_ring_id = HAL_SRNG_TCL_STATUS,
177 		.max_rings = 1,
178 		.entry_size = (sizeof(struct tlv_32_hdr) +
179 			sizeof(struct tcl_status_ring)) >> 2,
180 		.lmac_ring = FALSE,
181 		.ring_dir = HAL_SRNG_DST_RING,
182 		.reg_start = {
183 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR(
184 				MAC_TCL_REG_REG_BASE),
185 			HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR(
186 				MAC_TCL_REG_REG_BASE),
187 		},
188 		/* Single ring - provide ring size if multiple rings of this
189 		 * type are supported
190 		 */
191 		.reg_size = {},
192 		.max_size =
193 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >>
194 			HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT,
195 	},
196 	{ /* CE_SRC */
197 		.start_ring_id = HAL_SRNG_CE_0_SRC,
198 		.max_rings = 16,
199 		.entry_size = sizeof(struct ce_src_desc) >> 2,
200 		.lmac_ring = FALSE,
201 		.ring_dir = HAL_SRNG_SRC_RING,
202 		.reg_start = {
203 		HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR(
204 				WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
205 		HWIO_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR(
206 				WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE),
207 		},
208 		.reg_size = {
209 		WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
210 		WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
211 		WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE -
212 		WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE,
213 		},
214 		.max_size =
215 		HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >>
216 		HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT,
217 	},
218 	{ /* CE_DST */
219 		.start_ring_id = HAL_SRNG_CE_0_DST,
220 		.max_rings = 16,
221 		.entry_size = 8 >> 2,
222 		/*TODO: entry_size above should actually be
223 		 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition
224 		 * of struct ce_dst_desc in HW header files
225 		 */
226 		.lmac_ring = FALSE,
227 		.ring_dir = HAL_SRNG_SRC_RING,
228 		.reg_start = {
229 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR(
230 		WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
231 		HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR(
232 		WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
233 		},
234 		.reg_size = {
235 		WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
236 		WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
237 		WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
238 		WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
239 		},
240 		.max_size =
241 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >>
242 		HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT,
243 	},
244 	{ /* CE_DST_STATUS */
245 		.start_ring_id = HAL_SRNG_CE_0_DST_STATUS,
246 		.max_rings = 16,
247 		.entry_size = sizeof(struct ce_stat_desc) >> 2,
248 		.lmac_ring = FALSE,
249 		.ring_dir = HAL_SRNG_DST_RING,
250 		.reg_start = {
251 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR(
252 				WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
253 		HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR(
254 				WFSS_CE_0_CHANNEL_DST_REG_REG_BASE),
255 		},
256 		/* TODO: check destination status ring registers */
257 		.reg_size = {
258 		WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
259 		WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
260 		WFSS_CE_1_CHANNEL_DST_REG_REG_BASE -
261 		WFSS_CE_0_CHANNEL_DST_REG_REG_BASE,
262 		},
263 		.max_size =
264 	HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >>
265 		HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT,
266 	},
267 	{ /* WBM_IDLE_LINK */
268 		.start_ring_id = HAL_SRNG_WBM_IDLE_LINK,
269 		.max_rings = 1,
270 		.entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2,
271 		.lmac_ring = FALSE,
272 		.ring_dir = HAL_SRNG_SRC_RING,
273 		.reg_start = {
274 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
275 		HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE),
276 		},
277 		/* Single ring - provide ring size if multiple rings of this
278 		 * type are supported
279 		 */
280 		.reg_size = {},
281 		.max_size =
282 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >>
283 		HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT,
284 	},
285 	{ /* SW2WBM_RELEASE */
286 		.start_ring_id = HAL_SRNG_WBM_SW_RELEASE,
287 		.max_rings = 2,
288 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
289 		.lmac_ring = FALSE,
290 		.ring_dir = HAL_SRNG_SRC_RING,
291 		.reg_start = {
292 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
293 		HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
294 		},
295 		.reg_size = {
296 		HWIO_WBM_R0_SW1_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE) -
297 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
298 		HWIO_WBM_R2_SW1_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE) -
299 		HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE)
300 		},
301 		.max_size =
302 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
303 		HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
304 	},
305 	{ /* WBM2SW_RELEASE */
306 		.start_ring_id = HAL_SRNG_WBM2SW0_RELEASE,
307 		.max_rings = 8,
308 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
309 		.lmac_ring = FALSE,
310 		.ring_dir = HAL_SRNG_DST_RING,
311 		.reg_start = {
312 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
313 				WBM_REG_REG_BASE),
314 		HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
315 				WBM_REG_REG_BASE),
316 		},
317 		.reg_size = {
318 		HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(
319 				WBM_REG_REG_BASE) -
320 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(
321 				WBM_REG_REG_BASE),
322 		HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(
323 				WBM_REG_REG_BASE) -
324 		HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(
325 				WBM_REG_REG_BASE),
326 		},
327 		.max_size =
328 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
329 		HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
330 	},
331 	{ /* RXDMA_BUF */
332 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0,
333 #ifdef IPA_OFFLOAD
334 		.max_rings = 3,
335 #else
336 		.max_rings = 3,
337 #endif
338 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
339 		.lmac_ring = TRUE,
340 		.ring_dir = HAL_SRNG_SRC_RING,
341 		/* reg_start is not set because LMAC rings are not accessed
342 		 * from host
343 		 */
344 		.reg_start = {},
345 		.reg_size = {},
346 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
347 	},
348 	{ /* RXDMA_DST */
349 		.start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0,
350 		.max_rings = 0,
351 		.entry_size = 0/*sizeof(struct reo_entrance_ring) >> 2*/,
352 		.lmac_ring =  TRUE,
353 		.ring_dir = HAL_SRNG_DST_RING,
354 		/* reg_start is not set because LMAC rings are not accessed
355 		 * from host
356 		 */
357 		.reg_start = {},
358 		.reg_size = {},
359 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
360 	},
361 #ifdef QCA_MONITOR_2_0_SUPPORT
362 	{ /* RXDMA_MONITOR_BUF */
363 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF,
364 		.max_rings = 1,
365 		.entry_size = sizeof(struct mon_ingress_ring) >> 2,
366 		.lmac_ring = TRUE,
367 		.ring_dir = HAL_SRNG_SRC_RING,
368 		/* reg_start is not set because LMAC rings are not accessed
369 		 * from host
370 		 */
371 		.reg_start = {},
372 		.reg_size = {},
373 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
374 	},
375 #else
376 	{},
377 #endif
378 	{ /* RXDMA_MONITOR_STATUS */
379 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF,
380 		.max_rings = 0,
381 		.entry_size = sizeof(struct wbm_buffer_ring) >> 2,
382 		.lmac_ring = TRUE,
383 		.ring_dir = HAL_SRNG_SRC_RING,
384 		/* reg_start is not set because LMAC rings are not accessed
385 		 * from host
386 		 */
387 		.reg_start = {},
388 		.reg_size = {},
389 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
390 	},
391 #ifdef QCA_MONITOR_2_0_SUPPORT
392 	{ /* RXDMA_MONITOR_DST */
393 		.start_ring_id = HAL_SRNG_WMAC1_RXMON2SW0,
394 		.max_rings = 2,
395 		.entry_size = sizeof(struct mon_destination_ring) >> 2,
396 		.lmac_ring = TRUE,
397 		.ring_dir = HAL_SRNG_DST_RING,
398 		/* reg_start is not set because LMAC rings are not accessed
399 		 * from host
400 		 */
401 		.reg_start = {},
402 		.reg_size = {},
403 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
404 	},
405 #else
406 	{},
407 #endif
408 	{ /* RXDMA_MONITOR_DESC */
409 		.start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC,
410 		.max_rings = 0,
411 		.entry_size = 0/*sizeof(struct sw_monitor_ring) >> 2*/,
412 		.lmac_ring = TRUE,
413 		.ring_dir = HAL_SRNG_DST_RING,
414 		/* reg_start is not set because LMAC rings are not accessed
415 		 * from host
416 		 */
417 		.reg_start = {},
418 		.reg_size = {},
419 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
420 	},
421 
422 	{ /* DIR_BUF_RX_DMA_SRC */
423 		.start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING,
424 		/* one ring for spectral and one ring for cfr */
425 		.max_rings = 2,
426 		.entry_size = 2,
427 		.lmac_ring = TRUE,
428 		.ring_dir = HAL_SRNG_SRC_RING,
429 		/* reg_start is not set because LMAC rings are not accessed
430 		 * from host
431 		 */
432 		.reg_start = {},
433 		.reg_size = {},
434 		.max_size = HAL_RXDMA_MAX_RING_SIZE,
435 	},
436 #ifdef WLAN_FEATURE_CIF_CFR
437 	{ /* WIFI_POS_SRC */
438 		.start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING,
439 		.max_rings = 1,
440 		.entry_size = sizeof(wmi_oem_dma_buf_release_entry)  >> 2,
441 		.lmac_ring = TRUE,
442 		.ring_dir = HAL_SRNG_SRC_RING,
443 		/* reg_start is not set because LMAC rings are not accessed
444 		 * from host
445 		 */
446 		.reg_start = {},
447 		.reg_size = {},
448 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
449 	},
450 #endif
451 	{ /* REO2PPE */
452 		.start_ring_id = HAL_SRNG_REO2PPE,
453 		.max_rings = 1,
454 		.entry_size = sizeof(struct reo_destination_ring) >> 2,
455 		.lmac_ring = FALSE,
456 		.ring_dir = HAL_SRNG_DST_RING,
457 		.reg_start = {
458 			HWIO_REO_R0_REO2PPE_RING_BASE_LSB_ADDR(
459 				REO_REG_REG_BASE),
460 			HWIO_REO_R2_REO2PPE_RING_HP_ADDR(
461 				REO_REG_REG_BASE),
462 		},
463 		/* Single ring - provide ring size if multiple rings of this
464 		 * type are supported
465 		 */
466 		.reg_size = {},
467 		.max_size =
468 		HWIO_REO_R0_REO2PPE_RING_BASE_LSB_RING_BASE_ADDR_LSB_BMSK >>
469 		HWIO_REO_R0_REO2PPE_RING_BASE_LSB_RING_BASE_ADDR_LSB_SHFT,
470 	},
471 	{ /* PPE2TCL */
472 		.start_ring_id = HAL_SRNG_PPE2TCL1,
473 		.max_rings = 1,
474 		.entry_size = sizeof(struct tcl_entrance_from_ppe_ring) >> 2,
475 		.lmac_ring = FALSE,
476 		.ring_dir = HAL_SRNG_SRC_RING,
477 		.reg_start = {
478 			HWIO_TCL_R0_PPE2TCL1_RING_BASE_LSB_ADDR(
479 				MAC_TCL_REG_REG_BASE),
480 			HWIO_TCL_R2_PPE2TCL1_RING_HP_ADDR(
481 				MAC_TCL_REG_REG_BASE),
482 		},
483 		.reg_size = {},
484 		.max_size =
485 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >>
486 			HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT,
487 	},
488 	{ /* PPE_RELEASE */
489 		.start_ring_id = HAL_SRNG_WBM_PPE_RELEASE,
490 		.max_rings = 1,
491 		.entry_size = sizeof(struct wbm_release_ring) >> 2,
492 		.lmac_ring = FALSE,
493 		.ring_dir = HAL_SRNG_SRC_RING,
494 		.reg_start = {
495 		HWIO_WBM_R0_PPE_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE),
496 		HWIO_WBM_R2_PPE_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE),
497 		},
498 		.reg_size = {},
499 		.max_size =
500 		HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >>
501 		HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT,
502 	},
503 #ifdef QCA_MONITOR_2_0_SUPPORT
504 	{ /* TX_MONITOR_BUF */
505 		.start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
506 		.max_rings = 1,
507 		.entry_size = sizeof(struct mon_ingress_ring) >> 2,
508 		.lmac_ring = TRUE,
509 		.ring_dir = HAL_SRNG_SRC_RING,
510 		/* reg_start is not set because LMAC rings are not accessed
511 		 * from host
512 		 */
513 		.reg_start = {},
514 		.reg_size = {},
515 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
516 	},
517 	{ /* TX_MONITOR_DST */
518 		.start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0,
519 		.max_rings = 2,
520 		.entry_size = sizeof(struct mon_destination_ring) >> 2,
521 		.lmac_ring = TRUE,
522 		.ring_dir = HAL_SRNG_DST_RING,
523 		/* reg_start is not set because LMAC rings are not accessed
524 		 * from host
525 		 */
526 		.reg_start = {},
527 		.reg_size = {},
528 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
529 	},
530 #else
531 	{},
532 	{},
533 #endif
534 	{ /* SW2RXDMA */
535 		.start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
536 		.max_rings = 3,
537 		.entry_size = sizeof(struct reo_entrance_ring) >> 2,
538 		.lmac_ring =  TRUE,
539 		.ring_dir = HAL_SRNG_SRC_RING,
540 		/* reg_start is not set because LMAC rings are not accessed
541 		 * from host
542 		 */
543 		.reg_start = {},
544 		.reg_size = {},
545 		.max_size = HAL_RXDMA_MAX_RING_SIZE_BE,
546 	},
547 };
548 
549 /*
550  * hal_reo_config_reo2ppe_dest_info() - Configure reo2ppe dest info
551  * @hal_soc_hdl: HAL SoC Context
552  *
553  * Return: None.
554  */
555 static inline
556 void hal_reo_config_reo2ppe_dest_info_9224(hal_soc_handle_t hal_soc_hdl)
557 {
558 	HAL_REG_WRITE((struct hal_soc *)hal_soc_hdl,
559 		      HWIO_REO_R0_REO2PPE_DEST_INFO_ADDR(REO_REG_REG_BASE),
560 		      REO2PPE_RULE_FAIL_FB);
561 }
562 
563 static void hal_hw_txrx_ops_override_qcn9224_v2(struct hal_soc *hal_soc)
564 {
565 	hal_soc->ops->hal_reo_config_reo2ppe_dest_info =
566 					hal_reo_config_reo2ppe_dest_info_9224;
567 }
568 /**
569  * hal_qcn9224_attach()- Attach 9224 target specific hal_soc ops,
570  *			  offset and srng table
571  * Return: void
572  */
573 void hal_qcn9224v2_attach(struct hal_soc *hal_soc)
574 {
575 	hal_soc->hw_srng_table = hw_srng_table_9224v2;
576 
577 	hal_srng_hw_reg_offset_init_generic(hal_soc);
578 	hal_srng_hw_reg_offset_init_qcn9224(hal_soc);
579 
580 	hal_hw_txrx_default_ops_attach_be(hal_soc);
581 	hal_hw_txrx_ops_attach_qcn9224(hal_soc);
582 	if (hal_soc->static_window_map)
583 		hal_write_window_register(hal_soc);
584 	hal_soc->dmac_cmn_src_rxbuf_ring = true;
585 
586 	hal_hw_txrx_ops_override_qcn9224_v2(hal_soc);
587 }
588