Merge tag 'ath-next-20231215' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath
[linux-2.6-block.git] / drivers / net / wireless / ath / ath11k / hw.c
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
5  */
6
7 #include <linux/types.h>
8 #include <linux/bitops.h>
9 #include <linux/bitfield.h>
10
11 #include "core.h"
12 #include "ce.h"
13 #include "hif.h"
14 #include "hal.h"
15 #include "hw.h"
16
17 /* Map from pdev index to hw mac index */
18 static u8 ath11k_hw_ipq8074_mac_from_pdev_id(int pdev_idx)
19 {
20         switch (pdev_idx) {
21         case 0:
22                 return 0;
23         case 1:
24                 return 2;
25         case 2:
26                 return 1;
27         default:
28                 return ATH11K_INVALID_HW_MAC_ID;
29         }
30 }
31
32 static u8 ath11k_hw_ipq6018_mac_from_pdev_id(int pdev_idx)
33 {
34         return pdev_idx;
35 }
36
37 static void ath11k_hw_ipq8074_tx_mesh_enable(struct ath11k_base *ab,
38                                              struct hal_tcl_data_cmd *tcl_cmd)
39 {
40         tcl_cmd->info2 |= FIELD_PREP(HAL_IPQ8074_TCL_DATA_CMD_INFO2_MESH_ENABLE,
41                                      true);
42 }
43
44 static void ath11k_hw_qcn9074_tx_mesh_enable(struct ath11k_base *ab,
45                                              struct hal_tcl_data_cmd *tcl_cmd)
46 {
47         tcl_cmd->info3 |= FIELD_PREP(HAL_QCN9074_TCL_DATA_CMD_INFO3_MESH_ENABLE,
48                                      true);
49 }
50
51 static void ath11k_hw_wcn6855_tx_mesh_enable(struct ath11k_base *ab,
52                                              struct hal_tcl_data_cmd *tcl_cmd)
53 {
54         tcl_cmd->info3 |= FIELD_PREP(HAL_QCN9074_TCL_DATA_CMD_INFO3_MESH_ENABLE,
55                                      true);
56 }
57
58 static void ath11k_init_wmi_config_qca6390(struct ath11k_base *ab,
59                                            struct target_resource_config *config)
60 {
61         config->num_vdevs = 4;
62         config->num_peers = 16;
63         config->num_tids = 32;
64
65         config->num_offload_peers = 3;
66         config->num_offload_reorder_buffs = 3;
67         config->num_peer_keys = TARGET_NUM_PEER_KEYS;
68         config->ast_skid_limit = TARGET_AST_SKID_LIMIT;
69         config->tx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
70         config->rx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
71         config->rx_timeout_pri[0] = TARGET_RX_TIMEOUT_LO_PRI;
72         config->rx_timeout_pri[1] = TARGET_RX_TIMEOUT_LO_PRI;
73         config->rx_timeout_pri[2] = TARGET_RX_TIMEOUT_LO_PRI;
74         config->rx_timeout_pri[3] = TARGET_RX_TIMEOUT_HI_PRI;
75         config->rx_decap_mode = TARGET_DECAP_MODE_NATIVE_WIFI;
76         config->scan_max_pending_req = TARGET_SCAN_MAX_PENDING_REQS;
77         config->bmiss_offload_max_vdev = TARGET_BMISS_OFFLOAD_MAX_VDEV;
78         config->roam_offload_max_vdev = TARGET_ROAM_OFFLOAD_MAX_VDEV;
79         config->roam_offload_max_ap_profiles = TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES;
80         config->num_mcast_groups = 0;
81         config->num_mcast_table_elems = 0;
82         config->mcast2ucast_mode = 0;
83         config->tx_dbg_log_size = TARGET_TX_DBG_LOG_SIZE;
84         config->num_wds_entries = 0;
85         config->dma_burst_size = 0;
86         config->rx_skip_defrag_timeout_dup_detection_check = 0;
87         config->vow_config = TARGET_VOW_CONFIG;
88         config->gtk_offload_max_vdev = 2;
89         config->num_msdu_desc = 0x400;
90         config->beacon_tx_offload_max_vdev = 2;
91         config->rx_batchmode = TARGET_RX_BATCHMODE;
92
93         config->peer_map_unmap_v2_support = 0;
94         config->use_pdev_id = 1;
95         config->max_frag_entries = 0xa;
96         config->num_tdls_vdevs = 0x1;
97         config->num_tdls_conn_table_entries = 8;
98         config->beacon_tx_offload_max_vdev = 0x2;
99         config->num_multicast_filter_entries = 0x20;
100         config->num_wow_filters = 0x16;
101         config->num_keep_alive_pattern = 0;
102         config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64;
103 }
104
105 static void ath11k_hw_ipq8074_reo_setup(struct ath11k_base *ab)
106 {
107         u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG;
108         u32 val;
109         /* Each hash entry uses three bits to map to a particular ring. */
110         u32 ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 |
111                 HAL_HASH_ROUTING_RING_SW2 << 3 |
112                 HAL_HASH_ROUTING_RING_SW3 << 6 |
113                 HAL_HASH_ROUTING_RING_SW4 << 9 |
114                 HAL_HASH_ROUTING_RING_SW1 << 12 |
115                 HAL_HASH_ROUTING_RING_SW2 << 15 |
116                 HAL_HASH_ROUTING_RING_SW3 << 18 |
117                 HAL_HASH_ROUTING_RING_SW4 << 21;
118
119         val = ath11k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE);
120
121         val &= ~HAL_REO1_GEN_ENABLE_FRAG_DST_RING;
122         val |= FIELD_PREP(HAL_REO1_GEN_ENABLE_FRAG_DST_RING,
123                         HAL_SRNG_RING_ID_REO2SW1) |
124                 FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE, 1) |
125                 FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1);
126         ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val);
127
128         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab),
129                            HAL_DEFAULT_REO_TIMEOUT_USEC);
130         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(ab),
131                            HAL_DEFAULT_REO_TIMEOUT_USEC);
132         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(ab),
133                            HAL_DEFAULT_REO_TIMEOUT_USEC);
134         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(ab),
135                            HAL_DEFAULT_REO_TIMEOUT_USEC);
136
137         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_0,
138                            FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
139                                       ring_hash_map));
140         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_1,
141                            FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
142                                       ring_hash_map));
143         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2,
144                            FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
145                                       ring_hash_map));
146         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3,
147                            FIELD_PREP(HAL_REO_DEST_RING_CTRL_HASH_RING_MAP,
148                                       ring_hash_map));
149 }
150
151 static void ath11k_init_wmi_config_ipq8074(struct ath11k_base *ab,
152                                            struct target_resource_config *config)
153 {
154         config->num_vdevs = ab->num_radios * TARGET_NUM_VDEVS(ab);
155
156         if (ab->num_radios == 2) {
157                 config->num_peers = TARGET_NUM_PEERS(ab, DBS);
158                 config->num_tids = TARGET_NUM_TIDS(ab, DBS);
159         } else if (ab->num_radios == 3) {
160                 config->num_peers = TARGET_NUM_PEERS(ab, DBS_SBS);
161                 config->num_tids = TARGET_NUM_TIDS(ab, DBS_SBS);
162         } else {
163                 /* Control should not reach here */
164                 config->num_peers = TARGET_NUM_PEERS(ab, SINGLE);
165                 config->num_tids = TARGET_NUM_TIDS(ab, SINGLE);
166         }
167         config->num_offload_peers = TARGET_NUM_OFFLD_PEERS;
168         config->num_offload_reorder_buffs = TARGET_NUM_OFFLD_REORDER_BUFFS;
169         config->num_peer_keys = TARGET_NUM_PEER_KEYS;
170         config->ast_skid_limit = TARGET_AST_SKID_LIMIT;
171         config->tx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
172         config->rx_chain_mask = (1 << ab->target_caps.num_rf_chains) - 1;
173         config->rx_timeout_pri[0] = TARGET_RX_TIMEOUT_LO_PRI;
174         config->rx_timeout_pri[1] = TARGET_RX_TIMEOUT_LO_PRI;
175         config->rx_timeout_pri[2] = TARGET_RX_TIMEOUT_LO_PRI;
176         config->rx_timeout_pri[3] = TARGET_RX_TIMEOUT_HI_PRI;
177
178         if (test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags))
179                 config->rx_decap_mode = TARGET_DECAP_MODE_RAW;
180         else
181                 config->rx_decap_mode = TARGET_DECAP_MODE_NATIVE_WIFI;
182
183         config->scan_max_pending_req = TARGET_SCAN_MAX_PENDING_REQS;
184         config->bmiss_offload_max_vdev = TARGET_BMISS_OFFLOAD_MAX_VDEV;
185         config->roam_offload_max_vdev = TARGET_ROAM_OFFLOAD_MAX_VDEV;
186         config->roam_offload_max_ap_profiles = TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES;
187         config->num_mcast_groups = TARGET_NUM_MCAST_GROUPS;
188         config->num_mcast_table_elems = TARGET_NUM_MCAST_TABLE_ELEMS;
189         config->mcast2ucast_mode = TARGET_MCAST2UCAST_MODE;
190         config->tx_dbg_log_size = TARGET_TX_DBG_LOG_SIZE;
191         config->num_wds_entries = TARGET_NUM_WDS_ENTRIES;
192         config->dma_burst_size = TARGET_DMA_BURST_SIZE;
193         config->rx_skip_defrag_timeout_dup_detection_check =
194                 TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
195         config->vow_config = TARGET_VOW_CONFIG;
196         config->gtk_offload_max_vdev = TARGET_GTK_OFFLOAD_MAX_VDEV;
197         config->num_msdu_desc = TARGET_NUM_MSDU_DESC;
198         config->beacon_tx_offload_max_vdev = ab->num_radios * TARGET_MAX_BCN_OFFLD;
199         config->rx_batchmode = TARGET_RX_BATCHMODE;
200         config->peer_map_unmap_v2_support = 1;
201         config->twt_ap_pdev_count = ab->num_radios;
202         config->twt_ap_sta_count = 1000;
203         config->flag1 |= WMI_RSRC_CFG_FLAG1_BSS_CHANNEL_INFO_64;
204         config->flag1 |= WMI_RSRC_CFG_FLAG1_ACK_RSSI;
205         config->ema_max_vap_cnt = ab->num_radios;
206         config->ema_max_profile_period = TARGET_EMA_MAX_PROFILE_PERIOD;
207         config->beacon_tx_offload_max_vdev += config->ema_max_vap_cnt;
208 }
209
210 static int ath11k_hw_mac_id_to_pdev_id_ipq8074(struct ath11k_hw_params *hw,
211                                                int mac_id)
212 {
213         return mac_id;
214 }
215
216 static int ath11k_hw_mac_id_to_srng_id_ipq8074(struct ath11k_hw_params *hw,
217                                                int mac_id)
218 {
219         return 0;
220 }
221
222 static int ath11k_hw_mac_id_to_pdev_id_qca6390(struct ath11k_hw_params *hw,
223                                                int mac_id)
224 {
225         return 0;
226 }
227
228 static int ath11k_hw_mac_id_to_srng_id_qca6390(struct ath11k_hw_params *hw,
229                                                int mac_id)
230 {
231         return mac_id;
232 }
233
234 static bool ath11k_hw_ipq8074_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
235 {
236         return !!FIELD_GET(RX_MSDU_END_INFO2_FIRST_MSDU,
237                            __le32_to_cpu(desc->u.ipq8074.msdu_end.info2));
238 }
239
240 static bool ath11k_hw_ipq8074_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
241 {
242         return !!FIELD_GET(RX_MSDU_END_INFO2_LAST_MSDU,
243                            __le32_to_cpu(desc->u.ipq8074.msdu_end.info2));
244 }
245
246 static u8 ath11k_hw_ipq8074_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
247 {
248         return FIELD_GET(RX_MSDU_END_INFO2_L3_HDR_PADDING,
249                          __le32_to_cpu(desc->u.ipq8074.msdu_end.info2));
250 }
251
252 static u8 *ath11k_hw_ipq8074_rx_desc_get_hdr_status(struct hal_rx_desc *desc)
253 {
254         return desc->u.ipq8074.hdr_status;
255 }
256
257 static bool ath11k_hw_ipq8074_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
258 {
259         return __le32_to_cpu(desc->u.ipq8074.mpdu_start.info1) &
260                RX_MPDU_START_INFO1_ENCRYPT_INFO_VALID;
261 }
262
263 static u32 ath11k_hw_ipq8074_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
264 {
265         return FIELD_GET(RX_MPDU_START_INFO2_ENC_TYPE,
266                          __le32_to_cpu(desc->u.ipq8074.mpdu_start.info2));
267 }
268
269 static u8 ath11k_hw_ipq8074_rx_desc_get_decap_type(struct hal_rx_desc *desc)
270 {
271         return FIELD_GET(RX_MSDU_START_INFO2_DECAP_FORMAT,
272                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info2));
273 }
274
275 static u8 ath11k_hw_ipq8074_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
276 {
277         return FIELD_GET(RX_MSDU_START_INFO2_MESH_CTRL_PRESENT,
278                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info2));
279 }
280
281 static bool ath11k_hw_ipq8074_rx_desc_get_ldpc_support(struct hal_rx_desc *desc)
282 {
283         return FIELD_GET(RX_MSDU_START_INFO2_LDPC,
284                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info2));
285 }
286
287 static bool ath11k_hw_ipq8074_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
288 {
289         return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_CTRL_VALID,
290                            __le32_to_cpu(desc->u.ipq8074.mpdu_start.info1));
291 }
292
293 static bool ath11k_hw_ipq8074_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
294 {
295         return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_FCTRL_VALID,
296                            __le32_to_cpu(desc->u.ipq8074.mpdu_start.info1));
297 }
298
299 static u16 ath11k_hw_ipq8074_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
300 {
301         return FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_NUM,
302                          __le32_to_cpu(desc->u.ipq8074.mpdu_start.info1));
303 }
304
305 static u16 ath11k_hw_ipq8074_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
306 {
307         return FIELD_GET(RX_MSDU_START_INFO1_MSDU_LENGTH,
308                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info1));
309 }
310
311 static u8 ath11k_hw_ipq8074_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
312 {
313         return FIELD_GET(RX_MSDU_START_INFO3_SGI,
314                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info3));
315 }
316
317 static u8 ath11k_hw_ipq8074_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
318 {
319         return FIELD_GET(RX_MSDU_START_INFO3_RATE_MCS,
320                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info3));
321 }
322
323 static u8 ath11k_hw_ipq8074_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
324 {
325         return FIELD_GET(RX_MSDU_START_INFO3_RECV_BW,
326                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info3));
327 }
328
329 static u32 ath11k_hw_ipq8074_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
330 {
331         return __le32_to_cpu(desc->u.ipq8074.msdu_start.phy_meta_data);
332 }
333
334 static u8 ath11k_hw_ipq8074_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
335 {
336         return FIELD_GET(RX_MSDU_START_INFO3_PKT_TYPE,
337                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info3));
338 }
339
340 static u8 ath11k_hw_ipq8074_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
341 {
342         return FIELD_GET(RX_MSDU_START_INFO3_MIMO_SS_BITMAP,
343                          __le32_to_cpu(desc->u.ipq8074.msdu_start.info3));
344 }
345
346 static u8 ath11k_hw_ipq8074_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
347 {
348         return FIELD_GET(RX_MPDU_START_INFO2_TID,
349                          __le32_to_cpu(desc->u.ipq8074.mpdu_start.info2));
350 }
351
352 static u16 ath11k_hw_ipq8074_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
353 {
354         return __le16_to_cpu(desc->u.ipq8074.mpdu_start.sw_peer_id);
355 }
356
357 static void ath11k_hw_ipq8074_rx_desc_copy_attn_end(struct hal_rx_desc *fdesc,
358                                                     struct hal_rx_desc *ldesc)
359 {
360         memcpy((u8 *)&fdesc->u.ipq8074.msdu_end, (u8 *)&ldesc->u.ipq8074.msdu_end,
361                sizeof(struct rx_msdu_end_ipq8074));
362         memcpy((u8 *)&fdesc->u.ipq8074.attention, (u8 *)&ldesc->u.ipq8074.attention,
363                sizeof(struct rx_attention));
364         memcpy((u8 *)&fdesc->u.ipq8074.mpdu_end, (u8 *)&ldesc->u.ipq8074.mpdu_end,
365                sizeof(struct rx_mpdu_end));
366 }
367
368 static u32 ath11k_hw_ipq8074_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc)
369 {
370         return FIELD_GET(HAL_TLV_HDR_TAG,
371                          __le32_to_cpu(desc->u.ipq8074.mpdu_start_tag));
372 }
373
374 static u32 ath11k_hw_ipq8074_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
375 {
376         return __le16_to_cpu(desc->u.ipq8074.mpdu_start.phy_ppdu_id);
377 }
378
379 static void ath11k_hw_ipq8074_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
380 {
381         u32 info = __le32_to_cpu(desc->u.ipq8074.msdu_start.info1);
382
383         info &= ~RX_MSDU_START_INFO1_MSDU_LENGTH;
384         info |= FIELD_PREP(RX_MSDU_START_INFO1_MSDU_LENGTH, len);
385
386         desc->u.ipq8074.msdu_start.info1 = __cpu_to_le32(info);
387 }
388
389 static bool ath11k_hw_ipq8074_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
390 {
391         return __le32_to_cpu(desc->u.ipq8074.mpdu_start.info1) &
392                RX_MPDU_START_INFO1_MAC_ADDR2_VALID;
393 }
394
395 static u8 *ath11k_hw_ipq8074_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
396 {
397         return desc->u.ipq8074.mpdu_start.addr2;
398 }
399
400 static
401 struct rx_attention *ath11k_hw_ipq8074_rx_desc_get_attention(struct hal_rx_desc *desc)
402 {
403         return &desc->u.ipq8074.attention;
404 }
405
406 static u8 *ath11k_hw_ipq8074_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
407 {
408         return &desc->u.ipq8074.msdu_payload[0];
409 }
410
411 static bool ath11k_hw_qcn9074_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
412 {
413         return !!FIELD_GET(RX_MSDU_END_INFO4_FIRST_MSDU,
414                            __le16_to_cpu(desc->u.qcn9074.msdu_end.info4));
415 }
416
417 static bool ath11k_hw_qcn9074_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
418 {
419         return !!FIELD_GET(RX_MSDU_END_INFO4_LAST_MSDU,
420                            __le16_to_cpu(desc->u.qcn9074.msdu_end.info4));
421 }
422
423 static u8 ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
424 {
425         return FIELD_GET(RX_MSDU_END_INFO4_L3_HDR_PADDING,
426                          __le16_to_cpu(desc->u.qcn9074.msdu_end.info4));
427 }
428
429 static u8 *ath11k_hw_qcn9074_rx_desc_get_hdr_status(struct hal_rx_desc *desc)
430 {
431         return desc->u.qcn9074.hdr_status;
432 }
433
434 static bool ath11k_hw_qcn9074_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
435 {
436         return __le32_to_cpu(desc->u.qcn9074.mpdu_start.info11) &
437                RX_MPDU_START_INFO11_ENCRYPT_INFO_VALID;
438 }
439
440 static u32 ath11k_hw_qcn9074_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
441 {
442         return FIELD_GET(RX_MPDU_START_INFO9_ENC_TYPE,
443                          __le32_to_cpu(desc->u.qcn9074.mpdu_start.info9));
444 }
445
446 static u8 ath11k_hw_qcn9074_rx_desc_get_decap_type(struct hal_rx_desc *desc)
447 {
448         return FIELD_GET(RX_MSDU_START_INFO2_DECAP_FORMAT,
449                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info2));
450 }
451
452 static u8 ath11k_hw_qcn9074_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
453 {
454         return FIELD_GET(RX_MSDU_START_INFO2_MESH_CTRL_PRESENT,
455                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info2));
456 }
457
458 static bool ath11k_hw_qcn9074_rx_desc_get_ldpc_support(struct hal_rx_desc *desc)
459 {
460         return FIELD_GET(RX_MSDU_START_INFO2_LDPC,
461                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info2));
462 }
463
464 static bool ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
465 {
466         return !!FIELD_GET(RX_MPDU_START_INFO11_MPDU_SEQ_CTRL_VALID,
467                            __le32_to_cpu(desc->u.qcn9074.mpdu_start.info11));
468 }
469
470 static bool ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
471 {
472         return !!FIELD_GET(RX_MPDU_START_INFO11_MPDU_FCTRL_VALID,
473                            __le32_to_cpu(desc->u.qcn9074.mpdu_start.info11));
474 }
475
476 static u16 ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
477 {
478         return FIELD_GET(RX_MPDU_START_INFO11_MPDU_SEQ_NUM,
479                          __le32_to_cpu(desc->u.qcn9074.mpdu_start.info11));
480 }
481
482 static u16 ath11k_hw_qcn9074_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
483 {
484         return FIELD_GET(RX_MSDU_START_INFO1_MSDU_LENGTH,
485                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info1));
486 }
487
488 static u8 ath11k_hw_qcn9074_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
489 {
490         return FIELD_GET(RX_MSDU_START_INFO3_SGI,
491                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info3));
492 }
493
494 static u8 ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
495 {
496         return FIELD_GET(RX_MSDU_START_INFO3_RATE_MCS,
497                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info3));
498 }
499
500 static u8 ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
501 {
502         return FIELD_GET(RX_MSDU_START_INFO3_RECV_BW,
503                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info3));
504 }
505
506 static u32 ath11k_hw_qcn9074_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
507 {
508         return __le32_to_cpu(desc->u.qcn9074.msdu_start.phy_meta_data);
509 }
510
511 static u8 ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
512 {
513         return FIELD_GET(RX_MSDU_START_INFO3_PKT_TYPE,
514                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info3));
515 }
516
517 static u8 ath11k_hw_qcn9074_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
518 {
519         return FIELD_GET(RX_MSDU_START_INFO3_MIMO_SS_BITMAP,
520                          __le32_to_cpu(desc->u.qcn9074.msdu_start.info3));
521 }
522
523 static u8 ath11k_hw_qcn9074_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
524 {
525         return FIELD_GET(RX_MPDU_START_INFO9_TID,
526                          __le32_to_cpu(desc->u.qcn9074.mpdu_start.info9));
527 }
528
529 static u16 ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
530 {
531         return __le16_to_cpu(desc->u.qcn9074.mpdu_start.sw_peer_id);
532 }
533
534 static void ath11k_hw_qcn9074_rx_desc_copy_attn_end(struct hal_rx_desc *fdesc,
535                                                     struct hal_rx_desc *ldesc)
536 {
537         memcpy((u8 *)&fdesc->u.qcn9074.msdu_end, (u8 *)&ldesc->u.qcn9074.msdu_end,
538                sizeof(struct rx_msdu_end_qcn9074));
539         memcpy((u8 *)&fdesc->u.qcn9074.attention, (u8 *)&ldesc->u.qcn9074.attention,
540                sizeof(struct rx_attention));
541         memcpy((u8 *)&fdesc->u.qcn9074.mpdu_end, (u8 *)&ldesc->u.qcn9074.mpdu_end,
542                sizeof(struct rx_mpdu_end));
543 }
544
545 static u32 ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc)
546 {
547         return FIELD_GET(HAL_TLV_HDR_TAG,
548                          __le32_to_cpu(desc->u.qcn9074.mpdu_start_tag));
549 }
550
551 static u32 ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
552 {
553         return __le16_to_cpu(desc->u.qcn9074.mpdu_start.phy_ppdu_id);
554 }
555
556 static void ath11k_hw_qcn9074_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
557 {
558         u32 info = __le32_to_cpu(desc->u.qcn9074.msdu_start.info1);
559
560         info &= ~RX_MSDU_START_INFO1_MSDU_LENGTH;
561         info |= FIELD_PREP(RX_MSDU_START_INFO1_MSDU_LENGTH, len);
562
563         desc->u.qcn9074.msdu_start.info1 = __cpu_to_le32(info);
564 }
565
566 static
567 struct rx_attention *ath11k_hw_qcn9074_rx_desc_get_attention(struct hal_rx_desc *desc)
568 {
569         return &desc->u.qcn9074.attention;
570 }
571
572 static u8 *ath11k_hw_qcn9074_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
573 {
574         return &desc->u.qcn9074.msdu_payload[0];
575 }
576
577 static bool ath11k_hw_ipq9074_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
578 {
579         return __le32_to_cpu(desc->u.qcn9074.mpdu_start.info11) &
580                RX_MPDU_START_INFO11_MAC_ADDR2_VALID;
581 }
582
583 static u8 *ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
584 {
585         return desc->u.qcn9074.mpdu_start.addr2;
586 }
587
588 static bool ath11k_hw_wcn6855_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
589 {
590         return !!FIELD_GET(RX_MSDU_END_INFO2_FIRST_MSDU_WCN6855,
591                            __le32_to_cpu(desc->u.wcn6855.msdu_end.info2));
592 }
593
594 static bool ath11k_hw_wcn6855_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
595 {
596         return !!FIELD_GET(RX_MSDU_END_INFO2_LAST_MSDU_WCN6855,
597                            __le32_to_cpu(desc->u.wcn6855.msdu_end.info2));
598 }
599
600 static u8 ath11k_hw_wcn6855_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
601 {
602         return FIELD_GET(RX_MSDU_END_INFO2_L3_HDR_PADDING,
603                          __le32_to_cpu(desc->u.wcn6855.msdu_end.info2));
604 }
605
606 static u8 *ath11k_hw_wcn6855_rx_desc_get_hdr_status(struct hal_rx_desc *desc)
607 {
608         return desc->u.wcn6855.hdr_status;
609 }
610
611 static bool ath11k_hw_wcn6855_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
612 {
613         return __le32_to_cpu(desc->u.wcn6855.mpdu_start.info1) &
614                RX_MPDU_START_INFO1_ENCRYPT_INFO_VALID;
615 }
616
617 static u32 ath11k_hw_wcn6855_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
618 {
619         return FIELD_GET(RX_MPDU_START_INFO2_ENC_TYPE,
620                          __le32_to_cpu(desc->u.wcn6855.mpdu_start.info2));
621 }
622
623 static u8 ath11k_hw_wcn6855_rx_desc_get_decap_type(struct hal_rx_desc *desc)
624 {
625         return FIELD_GET(RX_MSDU_START_INFO2_DECAP_FORMAT,
626                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info2));
627 }
628
629 static u8 ath11k_hw_wcn6855_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
630 {
631         return FIELD_GET(RX_MSDU_START_INFO2_MESH_CTRL_PRESENT,
632                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info2));
633 }
634
635 static bool ath11k_hw_wcn6855_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
636 {
637         return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_CTRL_VALID,
638                            __le32_to_cpu(desc->u.wcn6855.mpdu_start.info1));
639 }
640
641 static bool ath11k_hw_wcn6855_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
642 {
643         return !!FIELD_GET(RX_MPDU_START_INFO1_MPDU_FCTRL_VALID,
644                            __le32_to_cpu(desc->u.wcn6855.mpdu_start.info1));
645 }
646
647 static u16 ath11k_hw_wcn6855_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
648 {
649         return FIELD_GET(RX_MPDU_START_INFO1_MPDU_SEQ_NUM,
650                          __le32_to_cpu(desc->u.wcn6855.mpdu_start.info1));
651 }
652
653 static u16 ath11k_hw_wcn6855_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
654 {
655         return FIELD_GET(RX_MSDU_START_INFO1_MSDU_LENGTH,
656                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info1));
657 }
658
659 static u8 ath11k_hw_wcn6855_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
660 {
661         return FIELD_GET(RX_MSDU_START_INFO3_SGI,
662                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info3));
663 }
664
665 static u8 ath11k_hw_wcn6855_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
666 {
667         return FIELD_GET(RX_MSDU_START_INFO3_RATE_MCS,
668                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info3));
669 }
670
671 static u8 ath11k_hw_wcn6855_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
672 {
673         return FIELD_GET(RX_MSDU_START_INFO3_RECV_BW,
674                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info3));
675 }
676
677 static u32 ath11k_hw_wcn6855_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
678 {
679         return __le32_to_cpu(desc->u.wcn6855.msdu_start.phy_meta_data);
680 }
681
682 static u8 ath11k_hw_wcn6855_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
683 {
684         return FIELD_GET(RX_MSDU_START_INFO3_PKT_TYPE,
685                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info3));
686 }
687
688 static u8 ath11k_hw_wcn6855_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
689 {
690         return FIELD_GET(RX_MSDU_START_INFO3_MIMO_SS_BITMAP,
691                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info3));
692 }
693
694 static u8 ath11k_hw_wcn6855_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
695 {
696         return FIELD_GET(RX_MPDU_START_INFO2_TID_WCN6855,
697                          __le32_to_cpu(desc->u.wcn6855.mpdu_start.info2));
698 }
699
700 static u16 ath11k_hw_wcn6855_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
701 {
702         return __le16_to_cpu(desc->u.wcn6855.mpdu_start.sw_peer_id);
703 }
704
705 static void ath11k_hw_wcn6855_rx_desc_copy_attn_end(struct hal_rx_desc *fdesc,
706                                                     struct hal_rx_desc *ldesc)
707 {
708         memcpy((u8 *)&fdesc->u.wcn6855.msdu_end, (u8 *)&ldesc->u.wcn6855.msdu_end,
709                sizeof(struct rx_msdu_end_wcn6855));
710         memcpy((u8 *)&fdesc->u.wcn6855.attention, (u8 *)&ldesc->u.wcn6855.attention,
711                sizeof(struct rx_attention));
712         memcpy((u8 *)&fdesc->u.wcn6855.mpdu_end, (u8 *)&ldesc->u.wcn6855.mpdu_end,
713                sizeof(struct rx_mpdu_end));
714 }
715
716 static u32 ath11k_hw_wcn6855_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc)
717 {
718         return FIELD_GET(HAL_TLV_HDR_TAG,
719                          __le32_to_cpu(desc->u.wcn6855.mpdu_start_tag));
720 }
721
722 static u32 ath11k_hw_wcn6855_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
723 {
724         return __le16_to_cpu(desc->u.wcn6855.mpdu_start.phy_ppdu_id);
725 }
726
727 static void ath11k_hw_wcn6855_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
728 {
729         u32 info = __le32_to_cpu(desc->u.wcn6855.msdu_start.info1);
730
731         info &= ~RX_MSDU_START_INFO1_MSDU_LENGTH;
732         info |= FIELD_PREP(RX_MSDU_START_INFO1_MSDU_LENGTH, len);
733
734         desc->u.wcn6855.msdu_start.info1 = __cpu_to_le32(info);
735 }
736
737 static
738 struct rx_attention *ath11k_hw_wcn6855_rx_desc_get_attention(struct hal_rx_desc *desc)
739 {
740         return &desc->u.wcn6855.attention;
741 }
742
743 static u8 *ath11k_hw_wcn6855_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
744 {
745         return &desc->u.wcn6855.msdu_payload[0];
746 }
747
748 static bool ath11k_hw_wcn6855_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
749 {
750         return __le32_to_cpu(desc->u.wcn6855.mpdu_start.info1) &
751                RX_MPDU_START_INFO1_MAC_ADDR2_VALID;
752 }
753
754 static u8 *ath11k_hw_wcn6855_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
755 {
756         return desc->u.wcn6855.mpdu_start.addr2;
757 }
758
759 static void ath11k_hw_wcn6855_reo_setup(struct ath11k_base *ab)
760 {
761         u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG;
762         u32 val;
763         /* Each hash entry uses four bits to map to a particular ring. */
764         u32 ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 |
765                 HAL_HASH_ROUTING_RING_SW2 << 4 |
766                 HAL_HASH_ROUTING_RING_SW3 << 8 |
767                 HAL_HASH_ROUTING_RING_SW4 << 12 |
768                 HAL_HASH_ROUTING_RING_SW1 << 16 |
769                 HAL_HASH_ROUTING_RING_SW2 << 20 |
770                 HAL_HASH_ROUTING_RING_SW3 << 24 |
771                 HAL_HASH_ROUTING_RING_SW4 << 28;
772
773         val = ath11k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE);
774         val |= FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE, 1) |
775                 FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1);
776         ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val);
777
778         val = ath11k_hif_read32(ab, reo_base + HAL_REO1_MISC_CTL(ab));
779         val &= ~HAL_REO1_MISC_CTL_FRAGMENT_DST_RING;
780         val |= FIELD_PREP(HAL_REO1_MISC_CTL_FRAGMENT_DST_RING, HAL_SRNG_RING_ID_REO2SW1);
781         ath11k_hif_write32(ab, reo_base + HAL_REO1_MISC_CTL(ab), val);
782
783         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab),
784                            HAL_DEFAULT_REO_TIMEOUT_USEC);
785         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(ab),
786                            HAL_DEFAULT_REO_TIMEOUT_USEC);
787         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(ab),
788                            HAL_DEFAULT_REO_TIMEOUT_USEC);
789         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(ab),
790                            HAL_DEFAULT_REO_TIMEOUT_USEC);
791
792         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2,
793                            ring_hash_map);
794         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3,
795                            ring_hash_map);
796 }
797
798 static void ath11k_hw_ipq5018_reo_setup(struct ath11k_base *ab)
799 {
800         u32 reo_base = HAL_SEQ_WCSS_UMAC_REO_REG;
801         u32 val;
802
803         /* Each hash entry uses three bits to map to a particular ring. */
804         u32 ring_hash_map = HAL_HASH_ROUTING_RING_SW1 << 0 |
805                 HAL_HASH_ROUTING_RING_SW2 << 4 |
806                 HAL_HASH_ROUTING_RING_SW3 << 8 |
807                 HAL_HASH_ROUTING_RING_SW4 << 12 |
808                 HAL_HASH_ROUTING_RING_SW1 << 16 |
809                 HAL_HASH_ROUTING_RING_SW2 << 20 |
810                 HAL_HASH_ROUTING_RING_SW3 << 24 |
811                 HAL_HASH_ROUTING_RING_SW4 << 28;
812
813         val = ath11k_hif_read32(ab, reo_base + HAL_REO1_GEN_ENABLE);
814
815         val &= ~HAL_REO1_GEN_ENABLE_FRAG_DST_RING;
816         val |= FIELD_PREP(HAL_REO1_GEN_ENABLE_FRAG_DST_RING,
817                         HAL_SRNG_RING_ID_REO2SW1) |
818                 FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_LIST_ENABLE, 1) |
819                 FIELD_PREP(HAL_REO1_GEN_ENABLE_AGING_FLUSH_ENABLE, 1);
820         ath11k_hif_write32(ab, reo_base + HAL_REO1_GEN_ENABLE, val);
821
822         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_0(ab),
823                            HAL_DEFAULT_REO_TIMEOUT_USEC);
824         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_1(ab),
825                            HAL_DEFAULT_REO_TIMEOUT_USEC);
826         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_2(ab),
827                            HAL_DEFAULT_REO_TIMEOUT_USEC);
828         ath11k_hif_write32(ab, reo_base + HAL_REO1_AGING_THRESH_IX_3(ab),
829                            HAL_DEFAULT_REO_TIMEOUT_USEC);
830
831         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_0,
832                            ring_hash_map);
833         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_1,
834                            ring_hash_map);
835         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_2,
836                            ring_hash_map);
837         ath11k_hif_write32(ab, reo_base + HAL_REO1_DEST_RING_CTRL_IX_3,
838                            ring_hash_map);
839 }
840
841 static u16
842 ath11k_hw_ipq8074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info)
843 {
844         u16 peer_id = 0;
845
846         peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
847                             __le32_to_cpu(mpdu_info->u.ipq8074.info0));
848
849         return peer_id;
850 }
851
852 static u16
853 ath11k_hw_qcn9074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info)
854 {
855         u16 peer_id = 0;
856
857         peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
858                             __le32_to_cpu(mpdu_info->u.qcn9074.info0));
859
860         return peer_id;
861 }
862
863 static u16
864 ath11k_hw_wcn6855_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info)
865 {
866         u16 peer_id = 0;
867
868         peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855,
869                             __le32_to_cpu(mpdu_info->u.wcn6855.info0));
870         return peer_id;
871 }
872
873 static bool ath11k_hw_wcn6855_rx_desc_get_ldpc_support(struct hal_rx_desc *desc)
874 {
875         return FIELD_GET(RX_MSDU_START_INFO2_LDPC,
876                          __le32_to_cpu(desc->u.wcn6855.msdu_start.info2));
877 }
878
879 static u32 ath11k_hw_ipq8074_get_tcl_ring_selector(struct sk_buff *skb)
880 {
881         /* Let the default ring selection be based on current processor
882          * number, where one of the 3 tcl rings are selected based on
883          * the smp_processor_id(). In case that ring
884          * is full/busy, we resort to other available rings.
885          * If all rings are full, we drop the packet.
886          *
887          * TODO: Add throttling logic when all rings are full
888          */
889         return smp_processor_id();
890 }
891
892 static u32 ath11k_hw_wcn6750_get_tcl_ring_selector(struct sk_buff *skb)
893 {
894         /* Select the TCL ring based on the flow hash of the SKB instead
895          * of CPU ID. Since applications pumping the traffic can be scheduled
896          * on multiple CPUs, there is a chance that packets of the same flow
897          * could end on different TCL rings, this could sometimes results in
898          * an out of order arrival of the packets at the receiver.
899          */
900         return skb_get_hash(skb);
901 }
902
903 const struct ath11k_hw_ops ipq8074_ops = {
904         .get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
905         .wmi_init_config = ath11k_init_wmi_config_ipq8074,
906         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074,
907         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074,
908         .tx_mesh_enable = ath11k_hw_ipq8074_tx_mesh_enable,
909         .rx_desc_get_first_msdu = ath11k_hw_ipq8074_rx_desc_get_first_msdu,
910         .rx_desc_get_last_msdu = ath11k_hw_ipq8074_rx_desc_get_last_msdu,
911         .rx_desc_get_l3_pad_bytes = ath11k_hw_ipq8074_rx_desc_get_l3_pad_bytes,
912         .rx_desc_get_hdr_status = ath11k_hw_ipq8074_rx_desc_get_hdr_status,
913         .rx_desc_encrypt_valid = ath11k_hw_ipq8074_rx_desc_encrypt_valid,
914         .rx_desc_get_encrypt_type = ath11k_hw_ipq8074_rx_desc_get_encrypt_type,
915         .rx_desc_get_decap_type = ath11k_hw_ipq8074_rx_desc_get_decap_type,
916         .rx_desc_get_mesh_ctl = ath11k_hw_ipq8074_rx_desc_get_mesh_ctl,
917         .rx_desc_get_ldpc_support = ath11k_hw_ipq8074_rx_desc_get_ldpc_support,
918         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_ipq8074_rx_desc_get_mpdu_seq_ctl_vld,
919         .rx_desc_get_mpdu_fc_valid = ath11k_hw_ipq8074_rx_desc_get_mpdu_fc_valid,
920         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_ipq8074_rx_desc_get_mpdu_start_seq_no,
921         .rx_desc_get_msdu_len = ath11k_hw_ipq8074_rx_desc_get_msdu_len,
922         .rx_desc_get_msdu_sgi = ath11k_hw_ipq8074_rx_desc_get_msdu_sgi,
923         .rx_desc_get_msdu_rate_mcs = ath11k_hw_ipq8074_rx_desc_get_msdu_rate_mcs,
924         .rx_desc_get_msdu_rx_bw = ath11k_hw_ipq8074_rx_desc_get_msdu_rx_bw,
925         .rx_desc_get_msdu_freq = ath11k_hw_ipq8074_rx_desc_get_msdu_freq,
926         .rx_desc_get_msdu_pkt_type = ath11k_hw_ipq8074_rx_desc_get_msdu_pkt_type,
927         .rx_desc_get_msdu_nss = ath11k_hw_ipq8074_rx_desc_get_msdu_nss,
928         .rx_desc_get_mpdu_tid = ath11k_hw_ipq8074_rx_desc_get_mpdu_tid,
929         .rx_desc_get_mpdu_peer_id = ath11k_hw_ipq8074_rx_desc_get_mpdu_peer_id,
930         .rx_desc_copy_attn_end_tlv = ath11k_hw_ipq8074_rx_desc_copy_attn_end,
931         .rx_desc_get_mpdu_start_tag = ath11k_hw_ipq8074_rx_desc_get_mpdu_start_tag,
932         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_ipq8074_rx_desc_get_mpdu_ppdu_id,
933         .rx_desc_set_msdu_len = ath11k_hw_ipq8074_rx_desc_set_msdu_len,
934         .rx_desc_get_attention = ath11k_hw_ipq8074_rx_desc_get_attention,
935         .rx_desc_get_msdu_payload = ath11k_hw_ipq8074_rx_desc_get_msdu_payload,
936         .reo_setup = ath11k_hw_ipq8074_reo_setup,
937         .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid,
938         .rx_desc_mac_addr2_valid = ath11k_hw_ipq8074_rx_desc_mac_addr2_valid,
939         .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq8074_rx_desc_mpdu_start_addr2,
940         .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
941 };
942
943 const struct ath11k_hw_ops ipq6018_ops = {
944         .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id,
945         .wmi_init_config = ath11k_init_wmi_config_ipq8074,
946         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074,
947         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074,
948         .tx_mesh_enable = ath11k_hw_ipq8074_tx_mesh_enable,
949         .rx_desc_get_first_msdu = ath11k_hw_ipq8074_rx_desc_get_first_msdu,
950         .rx_desc_get_last_msdu = ath11k_hw_ipq8074_rx_desc_get_last_msdu,
951         .rx_desc_get_l3_pad_bytes = ath11k_hw_ipq8074_rx_desc_get_l3_pad_bytes,
952         .rx_desc_get_hdr_status = ath11k_hw_ipq8074_rx_desc_get_hdr_status,
953         .rx_desc_encrypt_valid = ath11k_hw_ipq8074_rx_desc_encrypt_valid,
954         .rx_desc_get_encrypt_type = ath11k_hw_ipq8074_rx_desc_get_encrypt_type,
955         .rx_desc_get_decap_type = ath11k_hw_ipq8074_rx_desc_get_decap_type,
956         .rx_desc_get_mesh_ctl = ath11k_hw_ipq8074_rx_desc_get_mesh_ctl,
957         .rx_desc_get_ldpc_support = ath11k_hw_ipq8074_rx_desc_get_ldpc_support,
958         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_ipq8074_rx_desc_get_mpdu_seq_ctl_vld,
959         .rx_desc_get_mpdu_fc_valid = ath11k_hw_ipq8074_rx_desc_get_mpdu_fc_valid,
960         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_ipq8074_rx_desc_get_mpdu_start_seq_no,
961         .rx_desc_get_msdu_len = ath11k_hw_ipq8074_rx_desc_get_msdu_len,
962         .rx_desc_get_msdu_sgi = ath11k_hw_ipq8074_rx_desc_get_msdu_sgi,
963         .rx_desc_get_msdu_rate_mcs = ath11k_hw_ipq8074_rx_desc_get_msdu_rate_mcs,
964         .rx_desc_get_msdu_rx_bw = ath11k_hw_ipq8074_rx_desc_get_msdu_rx_bw,
965         .rx_desc_get_msdu_freq = ath11k_hw_ipq8074_rx_desc_get_msdu_freq,
966         .rx_desc_get_msdu_pkt_type = ath11k_hw_ipq8074_rx_desc_get_msdu_pkt_type,
967         .rx_desc_get_msdu_nss = ath11k_hw_ipq8074_rx_desc_get_msdu_nss,
968         .rx_desc_get_mpdu_tid = ath11k_hw_ipq8074_rx_desc_get_mpdu_tid,
969         .rx_desc_get_mpdu_peer_id = ath11k_hw_ipq8074_rx_desc_get_mpdu_peer_id,
970         .rx_desc_copy_attn_end_tlv = ath11k_hw_ipq8074_rx_desc_copy_attn_end,
971         .rx_desc_get_mpdu_start_tag = ath11k_hw_ipq8074_rx_desc_get_mpdu_start_tag,
972         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_ipq8074_rx_desc_get_mpdu_ppdu_id,
973         .rx_desc_set_msdu_len = ath11k_hw_ipq8074_rx_desc_set_msdu_len,
974         .rx_desc_get_attention = ath11k_hw_ipq8074_rx_desc_get_attention,
975         .rx_desc_get_msdu_payload = ath11k_hw_ipq8074_rx_desc_get_msdu_payload,
976         .reo_setup = ath11k_hw_ipq8074_reo_setup,
977         .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid,
978         .rx_desc_mac_addr2_valid = ath11k_hw_ipq8074_rx_desc_mac_addr2_valid,
979         .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq8074_rx_desc_mpdu_start_addr2,
980         .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
981 };
982
983 const struct ath11k_hw_ops qca6390_ops = {
984         .get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
985         .wmi_init_config = ath11k_init_wmi_config_qca6390,
986         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_qca6390,
987         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_qca6390,
988         .tx_mesh_enable = ath11k_hw_ipq8074_tx_mesh_enable,
989         .rx_desc_get_first_msdu = ath11k_hw_ipq8074_rx_desc_get_first_msdu,
990         .rx_desc_get_last_msdu = ath11k_hw_ipq8074_rx_desc_get_last_msdu,
991         .rx_desc_get_l3_pad_bytes = ath11k_hw_ipq8074_rx_desc_get_l3_pad_bytes,
992         .rx_desc_get_hdr_status = ath11k_hw_ipq8074_rx_desc_get_hdr_status,
993         .rx_desc_encrypt_valid = ath11k_hw_ipq8074_rx_desc_encrypt_valid,
994         .rx_desc_get_encrypt_type = ath11k_hw_ipq8074_rx_desc_get_encrypt_type,
995         .rx_desc_get_decap_type = ath11k_hw_ipq8074_rx_desc_get_decap_type,
996         .rx_desc_get_mesh_ctl = ath11k_hw_ipq8074_rx_desc_get_mesh_ctl,
997         .rx_desc_get_ldpc_support = ath11k_hw_ipq8074_rx_desc_get_ldpc_support,
998         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_ipq8074_rx_desc_get_mpdu_seq_ctl_vld,
999         .rx_desc_get_mpdu_fc_valid = ath11k_hw_ipq8074_rx_desc_get_mpdu_fc_valid,
1000         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_ipq8074_rx_desc_get_mpdu_start_seq_no,
1001         .rx_desc_get_msdu_len = ath11k_hw_ipq8074_rx_desc_get_msdu_len,
1002         .rx_desc_get_msdu_sgi = ath11k_hw_ipq8074_rx_desc_get_msdu_sgi,
1003         .rx_desc_get_msdu_rate_mcs = ath11k_hw_ipq8074_rx_desc_get_msdu_rate_mcs,
1004         .rx_desc_get_msdu_rx_bw = ath11k_hw_ipq8074_rx_desc_get_msdu_rx_bw,
1005         .rx_desc_get_msdu_freq = ath11k_hw_ipq8074_rx_desc_get_msdu_freq,
1006         .rx_desc_get_msdu_pkt_type = ath11k_hw_ipq8074_rx_desc_get_msdu_pkt_type,
1007         .rx_desc_get_msdu_nss = ath11k_hw_ipq8074_rx_desc_get_msdu_nss,
1008         .rx_desc_get_mpdu_tid = ath11k_hw_ipq8074_rx_desc_get_mpdu_tid,
1009         .rx_desc_get_mpdu_peer_id = ath11k_hw_ipq8074_rx_desc_get_mpdu_peer_id,
1010         .rx_desc_copy_attn_end_tlv = ath11k_hw_ipq8074_rx_desc_copy_attn_end,
1011         .rx_desc_get_mpdu_start_tag = ath11k_hw_ipq8074_rx_desc_get_mpdu_start_tag,
1012         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_ipq8074_rx_desc_get_mpdu_ppdu_id,
1013         .rx_desc_set_msdu_len = ath11k_hw_ipq8074_rx_desc_set_msdu_len,
1014         .rx_desc_get_attention = ath11k_hw_ipq8074_rx_desc_get_attention,
1015         .rx_desc_get_msdu_payload = ath11k_hw_ipq8074_rx_desc_get_msdu_payload,
1016         .reo_setup = ath11k_hw_ipq8074_reo_setup,
1017         .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid,
1018         .rx_desc_mac_addr2_valid = ath11k_hw_ipq8074_rx_desc_mac_addr2_valid,
1019         .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq8074_rx_desc_mpdu_start_addr2,
1020         .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
1021 };
1022
1023 const struct ath11k_hw_ops qcn9074_ops = {
1024         .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id,
1025         .wmi_init_config = ath11k_init_wmi_config_ipq8074,
1026         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074,
1027         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074,
1028         .tx_mesh_enable = ath11k_hw_qcn9074_tx_mesh_enable,
1029         .rx_desc_get_first_msdu = ath11k_hw_qcn9074_rx_desc_get_first_msdu,
1030         .rx_desc_get_last_msdu = ath11k_hw_qcn9074_rx_desc_get_last_msdu,
1031         .rx_desc_get_l3_pad_bytes = ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes,
1032         .rx_desc_get_hdr_status = ath11k_hw_qcn9074_rx_desc_get_hdr_status,
1033         .rx_desc_encrypt_valid = ath11k_hw_qcn9074_rx_desc_encrypt_valid,
1034         .rx_desc_get_encrypt_type = ath11k_hw_qcn9074_rx_desc_get_encrypt_type,
1035         .rx_desc_get_decap_type = ath11k_hw_qcn9074_rx_desc_get_decap_type,
1036         .rx_desc_get_mesh_ctl = ath11k_hw_qcn9074_rx_desc_get_mesh_ctl,
1037         .rx_desc_get_ldpc_support = ath11k_hw_qcn9074_rx_desc_get_ldpc_support,
1038         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld,
1039         .rx_desc_get_mpdu_fc_valid = ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid,
1040         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no,
1041         .rx_desc_get_msdu_len = ath11k_hw_qcn9074_rx_desc_get_msdu_len,
1042         .rx_desc_get_msdu_sgi = ath11k_hw_qcn9074_rx_desc_get_msdu_sgi,
1043         .rx_desc_get_msdu_rate_mcs = ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs,
1044         .rx_desc_get_msdu_rx_bw = ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw,
1045         .rx_desc_get_msdu_freq = ath11k_hw_qcn9074_rx_desc_get_msdu_freq,
1046         .rx_desc_get_msdu_pkt_type = ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type,
1047         .rx_desc_get_msdu_nss = ath11k_hw_qcn9074_rx_desc_get_msdu_nss,
1048         .rx_desc_get_mpdu_tid = ath11k_hw_qcn9074_rx_desc_get_mpdu_tid,
1049         .rx_desc_get_mpdu_peer_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id,
1050         .rx_desc_copy_attn_end_tlv = ath11k_hw_qcn9074_rx_desc_copy_attn_end,
1051         .rx_desc_get_mpdu_start_tag = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag,
1052         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id,
1053         .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len,
1054         .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention,
1055         .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload,
1056         .reo_setup = ath11k_hw_ipq8074_reo_setup,
1057         .mpdu_info_get_peerid = ath11k_hw_qcn9074_mpdu_info_get_peerid,
1058         .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid,
1059         .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2,
1060         .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
1061 };
1062
1063 const struct ath11k_hw_ops wcn6855_ops = {
1064         .get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
1065         .wmi_init_config = ath11k_init_wmi_config_qca6390,
1066         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_qca6390,
1067         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_qca6390,
1068         .tx_mesh_enable = ath11k_hw_wcn6855_tx_mesh_enable,
1069         .rx_desc_get_first_msdu = ath11k_hw_wcn6855_rx_desc_get_first_msdu,
1070         .rx_desc_get_last_msdu = ath11k_hw_wcn6855_rx_desc_get_last_msdu,
1071         .rx_desc_get_l3_pad_bytes = ath11k_hw_wcn6855_rx_desc_get_l3_pad_bytes,
1072         .rx_desc_get_hdr_status = ath11k_hw_wcn6855_rx_desc_get_hdr_status,
1073         .rx_desc_encrypt_valid = ath11k_hw_wcn6855_rx_desc_encrypt_valid,
1074         .rx_desc_get_encrypt_type = ath11k_hw_wcn6855_rx_desc_get_encrypt_type,
1075         .rx_desc_get_decap_type = ath11k_hw_wcn6855_rx_desc_get_decap_type,
1076         .rx_desc_get_mesh_ctl = ath11k_hw_wcn6855_rx_desc_get_mesh_ctl,
1077         .rx_desc_get_ldpc_support = ath11k_hw_wcn6855_rx_desc_get_ldpc_support,
1078         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_wcn6855_rx_desc_get_mpdu_seq_ctl_vld,
1079         .rx_desc_get_mpdu_fc_valid = ath11k_hw_wcn6855_rx_desc_get_mpdu_fc_valid,
1080         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_wcn6855_rx_desc_get_mpdu_start_seq_no,
1081         .rx_desc_get_msdu_len = ath11k_hw_wcn6855_rx_desc_get_msdu_len,
1082         .rx_desc_get_msdu_sgi = ath11k_hw_wcn6855_rx_desc_get_msdu_sgi,
1083         .rx_desc_get_msdu_rate_mcs = ath11k_hw_wcn6855_rx_desc_get_msdu_rate_mcs,
1084         .rx_desc_get_msdu_rx_bw = ath11k_hw_wcn6855_rx_desc_get_msdu_rx_bw,
1085         .rx_desc_get_msdu_freq = ath11k_hw_wcn6855_rx_desc_get_msdu_freq,
1086         .rx_desc_get_msdu_pkt_type = ath11k_hw_wcn6855_rx_desc_get_msdu_pkt_type,
1087         .rx_desc_get_msdu_nss = ath11k_hw_wcn6855_rx_desc_get_msdu_nss,
1088         .rx_desc_get_mpdu_tid = ath11k_hw_wcn6855_rx_desc_get_mpdu_tid,
1089         .rx_desc_get_mpdu_peer_id = ath11k_hw_wcn6855_rx_desc_get_mpdu_peer_id,
1090         .rx_desc_copy_attn_end_tlv = ath11k_hw_wcn6855_rx_desc_copy_attn_end,
1091         .rx_desc_get_mpdu_start_tag = ath11k_hw_wcn6855_rx_desc_get_mpdu_start_tag,
1092         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_wcn6855_rx_desc_get_mpdu_ppdu_id,
1093         .rx_desc_set_msdu_len = ath11k_hw_wcn6855_rx_desc_set_msdu_len,
1094         .rx_desc_get_attention = ath11k_hw_wcn6855_rx_desc_get_attention,
1095         .rx_desc_get_msdu_payload = ath11k_hw_wcn6855_rx_desc_get_msdu_payload,
1096         .reo_setup = ath11k_hw_wcn6855_reo_setup,
1097         .mpdu_info_get_peerid = ath11k_hw_wcn6855_mpdu_info_get_peerid,
1098         .rx_desc_mac_addr2_valid = ath11k_hw_wcn6855_rx_desc_mac_addr2_valid,
1099         .rx_desc_mpdu_start_addr2 = ath11k_hw_wcn6855_rx_desc_mpdu_start_addr2,
1100         .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
1101 };
1102
1103 const struct ath11k_hw_ops wcn6750_ops = {
1104         .get_hw_mac_from_pdev_id = ath11k_hw_ipq8074_mac_from_pdev_id,
1105         .wmi_init_config = ath11k_init_wmi_config_qca6390,
1106         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_qca6390,
1107         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_qca6390,
1108         .tx_mesh_enable = ath11k_hw_qcn9074_tx_mesh_enable,
1109         .rx_desc_get_first_msdu = ath11k_hw_qcn9074_rx_desc_get_first_msdu,
1110         .rx_desc_get_last_msdu = ath11k_hw_qcn9074_rx_desc_get_last_msdu,
1111         .rx_desc_get_l3_pad_bytes = ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes,
1112         .rx_desc_get_hdr_status = ath11k_hw_qcn9074_rx_desc_get_hdr_status,
1113         .rx_desc_encrypt_valid = ath11k_hw_qcn9074_rx_desc_encrypt_valid,
1114         .rx_desc_get_encrypt_type = ath11k_hw_qcn9074_rx_desc_get_encrypt_type,
1115         .rx_desc_get_decap_type = ath11k_hw_qcn9074_rx_desc_get_decap_type,
1116         .rx_desc_get_mesh_ctl = ath11k_hw_qcn9074_rx_desc_get_mesh_ctl,
1117         .rx_desc_get_ldpc_support = ath11k_hw_qcn9074_rx_desc_get_ldpc_support,
1118         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld,
1119         .rx_desc_get_mpdu_fc_valid = ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid,
1120         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no,
1121         .rx_desc_get_msdu_len = ath11k_hw_qcn9074_rx_desc_get_msdu_len,
1122         .rx_desc_get_msdu_sgi = ath11k_hw_qcn9074_rx_desc_get_msdu_sgi,
1123         .rx_desc_get_msdu_rate_mcs = ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs,
1124         .rx_desc_get_msdu_rx_bw = ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw,
1125         .rx_desc_get_msdu_freq = ath11k_hw_qcn9074_rx_desc_get_msdu_freq,
1126         .rx_desc_get_msdu_pkt_type = ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type,
1127         .rx_desc_get_msdu_nss = ath11k_hw_qcn9074_rx_desc_get_msdu_nss,
1128         .rx_desc_get_mpdu_tid = ath11k_hw_qcn9074_rx_desc_get_mpdu_tid,
1129         .rx_desc_get_mpdu_peer_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id,
1130         .rx_desc_copy_attn_end_tlv = ath11k_hw_qcn9074_rx_desc_copy_attn_end,
1131         .rx_desc_get_mpdu_start_tag = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag,
1132         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id,
1133         .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len,
1134         .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention,
1135         .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload,
1136         .reo_setup = ath11k_hw_wcn6855_reo_setup,
1137         .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid,
1138         .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid,
1139         .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2,
1140         .get_ring_selector = ath11k_hw_wcn6750_get_tcl_ring_selector,
1141 };
1142
1143 /* IPQ5018 hw ops is similar to QCN9074 except for the dest ring remap */
1144 const struct ath11k_hw_ops ipq5018_ops = {
1145         .get_hw_mac_from_pdev_id = ath11k_hw_ipq6018_mac_from_pdev_id,
1146         .wmi_init_config = ath11k_init_wmi_config_ipq8074,
1147         .mac_id_to_pdev_id = ath11k_hw_mac_id_to_pdev_id_ipq8074,
1148         .mac_id_to_srng_id = ath11k_hw_mac_id_to_srng_id_ipq8074,
1149         .tx_mesh_enable = ath11k_hw_qcn9074_tx_mesh_enable,
1150         .rx_desc_get_first_msdu = ath11k_hw_qcn9074_rx_desc_get_first_msdu,
1151         .rx_desc_get_last_msdu = ath11k_hw_qcn9074_rx_desc_get_last_msdu,
1152         .rx_desc_get_l3_pad_bytes = ath11k_hw_qcn9074_rx_desc_get_l3_pad_bytes,
1153         .rx_desc_get_hdr_status = ath11k_hw_qcn9074_rx_desc_get_hdr_status,
1154         .rx_desc_encrypt_valid = ath11k_hw_qcn9074_rx_desc_encrypt_valid,
1155         .rx_desc_get_encrypt_type = ath11k_hw_qcn9074_rx_desc_get_encrypt_type,
1156         .rx_desc_get_decap_type = ath11k_hw_qcn9074_rx_desc_get_decap_type,
1157         .rx_desc_get_mesh_ctl = ath11k_hw_qcn9074_rx_desc_get_mesh_ctl,
1158         .rx_desc_get_ldpc_support = ath11k_hw_qcn9074_rx_desc_get_ldpc_support,
1159         .rx_desc_get_mpdu_seq_ctl_vld = ath11k_hw_qcn9074_rx_desc_get_mpdu_seq_ctl_vld,
1160         .rx_desc_get_mpdu_fc_valid = ath11k_hw_qcn9074_rx_desc_get_mpdu_fc_valid,
1161         .rx_desc_get_mpdu_start_seq_no = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_seq_no,
1162         .rx_desc_get_msdu_len = ath11k_hw_qcn9074_rx_desc_get_msdu_len,
1163         .rx_desc_get_msdu_sgi = ath11k_hw_qcn9074_rx_desc_get_msdu_sgi,
1164         .rx_desc_get_msdu_rate_mcs = ath11k_hw_qcn9074_rx_desc_get_msdu_rate_mcs,
1165         .rx_desc_get_msdu_rx_bw = ath11k_hw_qcn9074_rx_desc_get_msdu_rx_bw,
1166         .rx_desc_get_msdu_freq = ath11k_hw_qcn9074_rx_desc_get_msdu_freq,
1167         .rx_desc_get_msdu_pkt_type = ath11k_hw_qcn9074_rx_desc_get_msdu_pkt_type,
1168         .rx_desc_get_msdu_nss = ath11k_hw_qcn9074_rx_desc_get_msdu_nss,
1169         .rx_desc_get_mpdu_tid = ath11k_hw_qcn9074_rx_desc_get_mpdu_tid,
1170         .rx_desc_get_mpdu_peer_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_peer_id,
1171         .rx_desc_copy_attn_end_tlv = ath11k_hw_qcn9074_rx_desc_copy_attn_end,
1172         .rx_desc_get_mpdu_start_tag = ath11k_hw_qcn9074_rx_desc_get_mpdu_start_tag,
1173         .rx_desc_get_mpdu_ppdu_id = ath11k_hw_qcn9074_rx_desc_get_mpdu_ppdu_id,
1174         .rx_desc_set_msdu_len = ath11k_hw_qcn9074_rx_desc_set_msdu_len,
1175         .rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention,
1176         .reo_setup = ath11k_hw_ipq5018_reo_setup,
1177         .rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload,
1178         .mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid,
1179         .rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid,
1180         .rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2,
1181         .get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
1182 };
1183
1184 #define ATH11K_TX_RING_MASK_0 BIT(0)
1185 #define ATH11K_TX_RING_MASK_1 BIT(1)
1186 #define ATH11K_TX_RING_MASK_2 BIT(2)
1187 #define ATH11K_TX_RING_MASK_3 BIT(3)
1188 #define ATH11K_TX_RING_MASK_4 BIT(4)
1189
1190 #define ATH11K_RX_RING_MASK_0 0x1
1191 #define ATH11K_RX_RING_MASK_1 0x2
1192 #define ATH11K_RX_RING_MASK_2 0x4
1193 #define ATH11K_RX_RING_MASK_3 0x8
1194
1195 #define ATH11K_RX_ERR_RING_MASK_0 0x1
1196
1197 #define ATH11K_RX_WBM_REL_RING_MASK_0 0x1
1198
1199 #define ATH11K_REO_STATUS_RING_MASK_0 0x1
1200
1201 #define ATH11K_RXDMA2HOST_RING_MASK_0 0x1
1202 #define ATH11K_RXDMA2HOST_RING_MASK_1 0x2
1203 #define ATH11K_RXDMA2HOST_RING_MASK_2 0x4
1204
1205 #define ATH11K_HOST2RXDMA_RING_MASK_0 0x1
1206 #define ATH11K_HOST2RXDMA_RING_MASK_1 0x2
1207 #define ATH11K_HOST2RXDMA_RING_MASK_2 0x4
1208
1209 #define ATH11K_RX_MON_STATUS_RING_MASK_0 0x1
1210 #define ATH11K_RX_MON_STATUS_RING_MASK_1 0x2
1211 #define ATH11K_RX_MON_STATUS_RING_MASK_2 0x4
1212
1213 const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_ipq8074 = {
1214         .tx  = {
1215                 ATH11K_TX_RING_MASK_0,
1216                 ATH11K_TX_RING_MASK_1,
1217                 ATH11K_TX_RING_MASK_2,
1218         },
1219         .rx_mon_status = {
1220                 0, 0, 0, 0,
1221                 ATH11K_RX_MON_STATUS_RING_MASK_0,
1222                 ATH11K_RX_MON_STATUS_RING_MASK_1,
1223                 ATH11K_RX_MON_STATUS_RING_MASK_2,
1224         },
1225         .rx = {
1226                 0, 0, 0, 0, 0, 0, 0,
1227                 ATH11K_RX_RING_MASK_0,
1228                 ATH11K_RX_RING_MASK_1,
1229                 ATH11K_RX_RING_MASK_2,
1230                 ATH11K_RX_RING_MASK_3,
1231         },
1232         .rx_err = {
1233                 ATH11K_RX_ERR_RING_MASK_0,
1234         },
1235         .rx_wbm_rel = {
1236                 ATH11K_RX_WBM_REL_RING_MASK_0,
1237         },
1238         .reo_status = {
1239                 0, 0, 0,
1240                 ATH11K_REO_STATUS_RING_MASK_0,
1241         },
1242         .rxdma2host = {
1243                 ATH11K_RXDMA2HOST_RING_MASK_0,
1244                 ATH11K_RXDMA2HOST_RING_MASK_1,
1245                 ATH11K_RXDMA2HOST_RING_MASK_2,
1246         },
1247         .host2rxdma = {
1248                 ATH11K_HOST2RXDMA_RING_MASK_0,
1249                 ATH11K_HOST2RXDMA_RING_MASK_1,
1250                 ATH11K_HOST2RXDMA_RING_MASK_2,
1251         },
1252 };
1253
1254 const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qca6390 = {
1255         .tx  = {
1256                 ATH11K_TX_RING_MASK_0,
1257         },
1258         .rx_mon_status = {
1259                 0, 0, 0, 0,
1260                 ATH11K_RX_MON_STATUS_RING_MASK_0,
1261                 ATH11K_RX_MON_STATUS_RING_MASK_1,
1262                 ATH11K_RX_MON_STATUS_RING_MASK_2,
1263         },
1264         .rx = {
1265                 0, 0, 0, 0, 0, 0, 0,
1266                 ATH11K_RX_RING_MASK_0,
1267                 ATH11K_RX_RING_MASK_1,
1268                 ATH11K_RX_RING_MASK_2,
1269                 ATH11K_RX_RING_MASK_3,
1270         },
1271         .rx_err = {
1272                 ATH11K_RX_ERR_RING_MASK_0,
1273         },
1274         .rx_wbm_rel = {
1275                 ATH11K_RX_WBM_REL_RING_MASK_0,
1276         },
1277         .reo_status = {
1278                 ATH11K_REO_STATUS_RING_MASK_0,
1279         },
1280         .rxdma2host = {
1281                 ATH11K_RXDMA2HOST_RING_MASK_0,
1282                 ATH11K_RXDMA2HOST_RING_MASK_1,
1283                 ATH11K_RXDMA2HOST_RING_MASK_2,
1284         },
1285         .host2rxdma = {
1286         },
1287 };
1288
1289 /* Target firmware's Copy Engine configuration. */
1290 const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq8074[] = {
1291         /* CE0: host->target HTC control and raw streams */
1292         {
1293                 .pipenum = __cpu_to_le32(0),
1294                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1295                 .nentries = __cpu_to_le32(32),
1296                 .nbytes_max = __cpu_to_le32(2048),
1297                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1298                 .reserved = __cpu_to_le32(0),
1299         },
1300
1301         /* CE1: target->host HTT + HTC control */
1302         {
1303                 .pipenum = __cpu_to_le32(1),
1304                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1305                 .nentries = __cpu_to_le32(32),
1306                 .nbytes_max = __cpu_to_le32(2048),
1307                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1308                 .reserved = __cpu_to_le32(0),
1309         },
1310
1311         /* CE2: target->host WMI */
1312         {
1313                 .pipenum = __cpu_to_le32(2),
1314                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1315                 .nentries = __cpu_to_le32(32),
1316                 .nbytes_max = __cpu_to_le32(2048),
1317                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1318                 .reserved = __cpu_to_le32(0),
1319         },
1320
1321         /* CE3: host->target WMI */
1322         {
1323                 .pipenum = __cpu_to_le32(3),
1324                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1325                 .nentries = __cpu_to_le32(32),
1326                 .nbytes_max = __cpu_to_le32(2048),
1327                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1328                 .reserved = __cpu_to_le32(0),
1329         },
1330
1331         /* CE4: host->target HTT */
1332         {
1333                 .pipenum = __cpu_to_le32(4),
1334                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1335                 .nentries = __cpu_to_le32(256),
1336                 .nbytes_max = __cpu_to_le32(256),
1337                 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
1338                 .reserved = __cpu_to_le32(0),
1339         },
1340
1341         /* CE5: target->host Pktlog */
1342         {
1343                 .pipenum = __cpu_to_le32(5),
1344                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1345                 .nentries = __cpu_to_le32(32),
1346                 .nbytes_max = __cpu_to_le32(2048),
1347                 .flags = __cpu_to_le32(0),
1348                 .reserved = __cpu_to_le32(0),
1349         },
1350
1351         /* CE6: Reserved for target autonomous hif_memcpy */
1352         {
1353                 .pipenum = __cpu_to_le32(6),
1354                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
1355                 .nentries = __cpu_to_le32(32),
1356                 .nbytes_max = __cpu_to_le32(65535),
1357                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1358                 .reserved = __cpu_to_le32(0),
1359         },
1360
1361         /* CE7 used only by Host */
1362         {
1363                 .pipenum = __cpu_to_le32(7),
1364                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1365                 .nentries = __cpu_to_le32(32),
1366                 .nbytes_max = __cpu_to_le32(2048),
1367                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1368                 .reserved = __cpu_to_le32(0),
1369         },
1370
1371         /* CE8 target->host used only by IPA */
1372         {
1373                 .pipenum = __cpu_to_le32(8),
1374                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
1375                 .nentries = __cpu_to_le32(32),
1376                 .nbytes_max = __cpu_to_le32(65535),
1377                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1378                 .reserved = __cpu_to_le32(0),
1379         },
1380
1381         /* CE9 host->target HTT */
1382         {
1383                 .pipenum = __cpu_to_le32(9),
1384                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1385                 .nentries = __cpu_to_le32(32),
1386                 .nbytes_max = __cpu_to_le32(2048),
1387                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1388                 .reserved = __cpu_to_le32(0),
1389         },
1390
1391         /* CE10 target->host HTT */
1392         {
1393                 .pipenum = __cpu_to_le32(10),
1394                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H),
1395                 .nentries = __cpu_to_le32(0),
1396                 .nbytes_max = __cpu_to_le32(0),
1397                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1398                 .reserved = __cpu_to_le32(0),
1399         },
1400
1401         /* CE11 Not used */
1402 };
1403
1404 /* Map from service/endpoint to Copy Engine.
1405  * This table is derived from the CE_PCI TABLE, above.
1406  * It is passed to the Target at startup for use by firmware.
1407  */
1408 const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq8074[] = {
1409         {
1410                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1411                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1412                 .pipenum = __cpu_to_le32(3),
1413         },
1414         {
1415                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1416                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1417                 .pipenum = __cpu_to_le32(2),
1418         },
1419         {
1420                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1421                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1422                 .pipenum = __cpu_to_le32(3),
1423         },
1424         {
1425                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1426                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1427                 .pipenum = __cpu_to_le32(2),
1428         },
1429         {
1430                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1431                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1432                 .pipenum = __cpu_to_le32(3),
1433         },
1434         {
1435                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1436                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1437                 .pipenum = __cpu_to_le32(2),
1438         },
1439         {
1440                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1441                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1442                 .pipenum = __cpu_to_le32(3),
1443         },
1444         {
1445                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1446                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1447                 .pipenum = __cpu_to_le32(2),
1448         },
1449         {
1450                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1451                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1452                 .pipenum = __cpu_to_le32(3),
1453         },
1454         {
1455                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1456                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1457                 .pipenum = __cpu_to_le32(2),
1458         },
1459         {
1460                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
1461                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1462                 .pipenum = __cpu_to_le32(7),
1463         },
1464         {
1465                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
1466                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1467                 .pipenum = __cpu_to_le32(2),
1468         },
1469         {
1470                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC2),
1471                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1472                 .pipenum = __cpu_to_le32(9),
1473         },
1474         {
1475                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC2),
1476                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1477                 .pipenum = __cpu_to_le32(2),
1478         },
1479         {
1480                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1481                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1482                 .pipenum = __cpu_to_le32(0),
1483         },
1484         {
1485                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1486                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1487                 .pipenum = __cpu_to_le32(1),
1488         },
1489         { /* not used */
1490                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
1491                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1492                 .pipenum = __cpu_to_le32(0),
1493         },
1494         { /* not used */
1495                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
1496                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1497                 .pipenum = __cpu_to_le32(1),
1498         },
1499         {
1500                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1501                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1502                 .pipenum = __cpu_to_le32(4),
1503         },
1504         {
1505                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1506                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1507                 .pipenum = __cpu_to_le32(1),
1508         },
1509         {
1510                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
1511                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1512                 .pipenum = __cpu_to_le32(5),
1513         },
1514
1515         /* (Additions here) */
1516
1517         { /* terminator entry */ }
1518 };
1519
1520 const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq6018[] = {
1521         {
1522                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1523                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1524                 .pipenum = __cpu_to_le32(3),
1525         },
1526         {
1527                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1528                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1529                 .pipenum = __cpu_to_le32(2),
1530         },
1531         {
1532                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1533                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1534                 .pipenum = __cpu_to_le32(3),
1535         },
1536         {
1537                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1538                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1539                 .pipenum = __cpu_to_le32(2),
1540         },
1541         {
1542                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1543                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1544                 .pipenum = __cpu_to_le32(3),
1545         },
1546         {
1547                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1548                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1549                 .pipenum = __cpu_to_le32(2),
1550         },
1551         {
1552                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1553                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1554                 .pipenum = __cpu_to_le32(3),
1555         },
1556         {
1557                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1558                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1559                 .pipenum = __cpu_to_le32(2),
1560         },
1561         {
1562                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1563                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1564                 .pipenum = __cpu_to_le32(3),
1565         },
1566         {
1567                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1568                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1569                 .pipenum = __cpu_to_le32(2),
1570         },
1571         {
1572                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
1573                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1574                 .pipenum = __cpu_to_le32(7),
1575         },
1576         {
1577                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL_MAC1),
1578                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1579                 .pipenum = __cpu_to_le32(2),
1580         },
1581         {
1582                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1583                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1584                 .pipenum = __cpu_to_le32(0),
1585         },
1586         {
1587                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1588                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1589                 .pipenum = __cpu_to_le32(1),
1590         },
1591         { /* not used */
1592                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
1593                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1594                 .pipenum = __cpu_to_le32(0),
1595         },
1596         { /* not used */
1597                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
1598                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1599                 .pipenum = __cpu_to_le32(1),
1600         },
1601         {
1602                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1603                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
1604                 .pipenum = __cpu_to_le32(4),
1605         },
1606         {
1607                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1608                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1609                 .pipenum = __cpu_to_le32(1),
1610         },
1611         {
1612                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
1613                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
1614                 .pipenum = __cpu_to_le32(5),
1615         },
1616
1617         /* (Additions here) */
1618
1619         { /* terminator entry */ }
1620 };
1621
1622 /* Target firmware's Copy Engine configuration. */
1623 const struct ce_pipe_config ath11k_target_ce_config_wlan_qca6390[] = {
1624         /* CE0: host->target HTC control and raw streams */
1625         {
1626                 .pipenum = __cpu_to_le32(0),
1627                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1628                 .nentries = __cpu_to_le32(32),
1629                 .nbytes_max = __cpu_to_le32(2048),
1630                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1631                 .reserved = __cpu_to_le32(0),
1632         },
1633
1634         /* CE1: target->host HTT + HTC control */
1635         {
1636                 .pipenum = __cpu_to_le32(1),
1637                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1638                 .nentries = __cpu_to_le32(32),
1639                 .nbytes_max = __cpu_to_le32(2048),
1640                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1641                 .reserved = __cpu_to_le32(0),
1642         },
1643
1644         /* CE2: target->host WMI */
1645         {
1646                 .pipenum = __cpu_to_le32(2),
1647                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1648                 .nentries = __cpu_to_le32(32),
1649                 .nbytes_max = __cpu_to_le32(2048),
1650                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1651                 .reserved = __cpu_to_le32(0),
1652         },
1653
1654         /* CE3: host->target WMI */
1655         {
1656                 .pipenum = __cpu_to_le32(3),
1657                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1658                 .nentries = __cpu_to_le32(32),
1659                 .nbytes_max = __cpu_to_le32(2048),
1660                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1661                 .reserved = __cpu_to_le32(0),
1662         },
1663
1664         /* CE4: host->target HTT */
1665         {
1666                 .pipenum = __cpu_to_le32(4),
1667                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1668                 .nentries = __cpu_to_le32(256),
1669                 .nbytes_max = __cpu_to_le32(256),
1670                 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
1671                 .reserved = __cpu_to_le32(0),
1672         },
1673
1674         /* CE5: target->host Pktlog */
1675         {
1676                 .pipenum = __cpu_to_le32(5),
1677                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1678                 .nentries = __cpu_to_le32(32),
1679                 .nbytes_max = __cpu_to_le32(2048),
1680                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1681                 .reserved = __cpu_to_le32(0),
1682         },
1683
1684         /* CE6: Reserved for target autonomous hif_memcpy */
1685         {
1686                 .pipenum = __cpu_to_le32(6),
1687                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
1688                 .nentries = __cpu_to_le32(32),
1689                 .nbytes_max = __cpu_to_le32(16384),
1690                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1691                 .reserved = __cpu_to_le32(0),
1692         },
1693
1694         /* CE7 used only by Host */
1695         {
1696                 .pipenum = __cpu_to_le32(7),
1697                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H),
1698                 .nentries = __cpu_to_le32(0),
1699                 .nbytes_max = __cpu_to_le32(0),
1700                 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
1701                 .reserved = __cpu_to_le32(0),
1702         },
1703
1704         /* CE8 target->host used only by IPA */
1705         {
1706                 .pipenum = __cpu_to_le32(8),
1707                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
1708                 .nentries = __cpu_to_le32(32),
1709                 .nbytes_max = __cpu_to_le32(16384),
1710                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1711                 .reserved = __cpu_to_le32(0),
1712         },
1713         /* CE 9, 10, 11 are used by MHI driver */
1714 };
1715
1716 /* Map from service/endpoint to Copy Engine.
1717  * This table is derived from the CE_PCI TABLE, above.
1718  * It is passed to the Target at startup for use by firmware.
1719  */
1720 const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qca6390[] = {
1721         {
1722                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1723                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1724                 __cpu_to_le32(3),
1725         },
1726         {
1727                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1728                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1729                 __cpu_to_le32(2),
1730         },
1731         {
1732                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1733                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1734                 __cpu_to_le32(3),
1735         },
1736         {
1737                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1738                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1739                 __cpu_to_le32(2),
1740         },
1741         {
1742                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1743                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1744                 __cpu_to_le32(3),
1745         },
1746         {
1747                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1748                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1749                 __cpu_to_le32(2),
1750         },
1751         {
1752                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1753                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1754                 __cpu_to_le32(3),
1755         },
1756         {
1757                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1758                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1759                 __cpu_to_le32(2),
1760         },
1761         {
1762                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1763                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1764                 __cpu_to_le32(3),
1765         },
1766         {
1767                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1768                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1769                 __cpu_to_le32(2),
1770         },
1771         {
1772                 __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1773                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1774                 __cpu_to_le32(0),
1775         },
1776         {
1777                 __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1778                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1779                 __cpu_to_le32(2),
1780         },
1781         {
1782                 __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1783                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1784                 __cpu_to_le32(4),
1785         },
1786         {
1787                 __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1788                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1789                 __cpu_to_le32(1),
1790         },
1791
1792         /* (Additions here) */
1793
1794         { /* must be last */
1795                 __cpu_to_le32(0),
1796                 __cpu_to_le32(0),
1797                 __cpu_to_le32(0),
1798         },
1799 };
1800
1801 /* Target firmware's Copy Engine configuration. */
1802 const struct ce_pipe_config ath11k_target_ce_config_wlan_qcn9074[] = {
1803         /* CE0: host->target HTC control and raw streams */
1804         {
1805                 .pipenum = __cpu_to_le32(0),
1806                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1807                 .nentries = __cpu_to_le32(32),
1808                 .nbytes_max = __cpu_to_le32(2048),
1809                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1810                 .reserved = __cpu_to_le32(0),
1811         },
1812
1813         /* CE1: target->host HTT + HTC control */
1814         {
1815                 .pipenum = __cpu_to_le32(1),
1816                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1817                 .nentries = __cpu_to_le32(32),
1818                 .nbytes_max = __cpu_to_le32(2048),
1819                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1820                 .reserved = __cpu_to_le32(0),
1821         },
1822
1823         /* CE2: target->host WMI */
1824         {
1825                 .pipenum = __cpu_to_le32(2),
1826                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1827                 .nentries = __cpu_to_le32(32),
1828                 .nbytes_max = __cpu_to_le32(2048),
1829                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1830                 .reserved = __cpu_to_le32(0),
1831         },
1832
1833         /* CE3: host->target WMI */
1834         {
1835                 .pipenum = __cpu_to_le32(3),
1836                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1837                 .nentries = __cpu_to_le32(32),
1838                 .nbytes_max = __cpu_to_le32(2048),
1839                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1840                 .reserved = __cpu_to_le32(0),
1841         },
1842
1843         /* CE4: host->target HTT */
1844         {
1845                 .pipenum = __cpu_to_le32(4),
1846                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
1847                 .nentries = __cpu_to_le32(256),
1848                 .nbytes_max = __cpu_to_le32(256),
1849                 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
1850                 .reserved = __cpu_to_le32(0),
1851         },
1852
1853         /* CE5: target->host Pktlog */
1854         {
1855                 .pipenum = __cpu_to_le32(5),
1856                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
1857                 .nentries = __cpu_to_le32(32),
1858                 .nbytes_max = __cpu_to_le32(2048),
1859                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1860                 .reserved = __cpu_to_le32(0),
1861         },
1862
1863         /* CE6: Reserved for target autonomous hif_memcpy */
1864         {
1865                 .pipenum = __cpu_to_le32(6),
1866                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
1867                 .nentries = __cpu_to_le32(32),
1868                 .nbytes_max = __cpu_to_le32(16384),
1869                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1870                 .reserved = __cpu_to_le32(0),
1871         },
1872
1873         /* CE7 used only by Host */
1874         {
1875                 .pipenum = __cpu_to_le32(7),
1876                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H),
1877                 .nentries = __cpu_to_le32(0),
1878                 .nbytes_max = __cpu_to_le32(0),
1879                 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
1880                 .reserved = __cpu_to_le32(0),
1881         },
1882
1883         /* CE8 target->host used only by IPA */
1884         {
1885                 .pipenum = __cpu_to_le32(8),
1886                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
1887                 .nentries = __cpu_to_le32(32),
1888                 .nbytes_max = __cpu_to_le32(16384),
1889                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
1890                 .reserved = __cpu_to_le32(0),
1891         },
1892         /* CE 9, 10, 11 are used by MHI driver */
1893 };
1894
1895 /* Map from service/endpoint to Copy Engine.
1896  * This table is derived from the CE_PCI TABLE, above.
1897  * It is passed to the Target at startup for use by firmware.
1898  */
1899 const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_qcn9074[] = {
1900         {
1901                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1902                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1903                 __cpu_to_le32(3),
1904         },
1905         {
1906                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
1907                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1908                 __cpu_to_le32(2),
1909         },
1910         {
1911                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1912                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1913                 __cpu_to_le32(3),
1914         },
1915         {
1916                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
1917                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1918                 __cpu_to_le32(2),
1919         },
1920         {
1921                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1922                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1923                 __cpu_to_le32(3),
1924         },
1925         {
1926                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
1927                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1928                 __cpu_to_le32(2),
1929         },
1930         {
1931                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1932                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1933                 __cpu_to_le32(3),
1934         },
1935         {
1936                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
1937                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1938                 __cpu_to_le32(2),
1939         },
1940         {
1941                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1942                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1943                 __cpu_to_le32(3),
1944         },
1945         {
1946                 __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
1947                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1948                 __cpu_to_le32(2),
1949         },
1950         {
1951                 __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1952                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1953                 __cpu_to_le32(0),
1954         },
1955         {
1956                 __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
1957                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1958                 __cpu_to_le32(1),
1959         },
1960         {
1961                 __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
1962                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1963                 __cpu_to_le32(0),
1964         },
1965         {
1966                 __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
1967                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1968                 __cpu_to_le32(1),
1969         },
1970         {
1971                 __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1972                 __cpu_to_le32(PIPEDIR_OUT),     /* out = UL = host -> target */
1973                 __cpu_to_le32(4),
1974         },
1975         {
1976                 __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
1977                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1978                 __cpu_to_le32(1),
1979         },
1980         {
1981                 __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
1982                 __cpu_to_le32(PIPEDIR_IN),      /* in = DL = target -> host */
1983                 __cpu_to_le32(5),
1984         },
1985
1986         /* (Additions here) */
1987
1988         { /* must be last */
1989                 __cpu_to_le32(0),
1990                 __cpu_to_le32(0),
1991                 __cpu_to_le32(0),
1992         },
1993 };
1994
1995 const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_qcn9074 = {
1996         .tx  = {
1997                 ATH11K_TX_RING_MASK_0,
1998                 ATH11K_TX_RING_MASK_1,
1999                 ATH11K_TX_RING_MASK_2,
2000         },
2001         .rx_mon_status = {
2002                 0, 0, 0,
2003                 ATH11K_RX_MON_STATUS_RING_MASK_0,
2004                 ATH11K_RX_MON_STATUS_RING_MASK_1,
2005                 ATH11K_RX_MON_STATUS_RING_MASK_2,
2006         },
2007         .rx = {
2008                 0, 0, 0, 0,
2009                 ATH11K_RX_RING_MASK_0,
2010                 ATH11K_RX_RING_MASK_1,
2011                 ATH11K_RX_RING_MASK_2,
2012                 ATH11K_RX_RING_MASK_3,
2013         },
2014         .rx_err = {
2015                 0, 0, 0,
2016                 ATH11K_RX_ERR_RING_MASK_0,
2017         },
2018         .rx_wbm_rel = {
2019                 0, 0, 0,
2020                 ATH11K_RX_WBM_REL_RING_MASK_0,
2021         },
2022         .reo_status = {
2023                 0, 0, 0,
2024                 ATH11K_REO_STATUS_RING_MASK_0,
2025         },
2026         .rxdma2host = {
2027                 0, 0, 0,
2028                 ATH11K_RXDMA2HOST_RING_MASK_0,
2029         },
2030         .host2rxdma = {
2031                 0, 0, 0,
2032                 ATH11K_HOST2RXDMA_RING_MASK_0,
2033         },
2034 };
2035
2036 const struct ath11k_hw_ring_mask ath11k_hw_ring_mask_wcn6750 = {
2037         .tx  = {
2038                 ATH11K_TX_RING_MASK_0,
2039                 0,
2040                 ATH11K_TX_RING_MASK_2,
2041                 0,
2042                 ATH11K_TX_RING_MASK_4,
2043         },
2044         .rx_mon_status = {
2045                 0, 0, 0, 0, 0, 0,
2046                 ATH11K_RX_MON_STATUS_RING_MASK_0,
2047         },
2048         .rx = {
2049                 0, 0, 0, 0, 0, 0, 0,
2050                 ATH11K_RX_RING_MASK_0,
2051                 ATH11K_RX_RING_MASK_1,
2052                 ATH11K_RX_RING_MASK_2,
2053                 ATH11K_RX_RING_MASK_3,
2054         },
2055         .rx_err = {
2056                 0, ATH11K_RX_ERR_RING_MASK_0,
2057         },
2058         .rx_wbm_rel = {
2059                 0, ATH11K_RX_WBM_REL_RING_MASK_0,
2060         },
2061         .reo_status = {
2062                 0, ATH11K_REO_STATUS_RING_MASK_0,
2063         },
2064         .rxdma2host = {
2065                 ATH11K_RXDMA2HOST_RING_MASK_0,
2066                 ATH11K_RXDMA2HOST_RING_MASK_1,
2067                 ATH11K_RXDMA2HOST_RING_MASK_2,
2068         },
2069         .host2rxdma = {
2070         },
2071 };
2072
2073 /* Target firmware's Copy Engine configuration for IPQ5018 */
2074 const struct ce_pipe_config ath11k_target_ce_config_wlan_ipq5018[] = {
2075         /* CE0: host->target HTC control and raw streams */
2076         {
2077                 .pipenum = __cpu_to_le32(0),
2078                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
2079                 .nentries = __cpu_to_le32(32),
2080                 .nbytes_max = __cpu_to_le32(2048),
2081                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2082                 .reserved = __cpu_to_le32(0),
2083         },
2084
2085         /* CE1: target->host HTT + HTC control */
2086         {
2087                 .pipenum = __cpu_to_le32(1),
2088                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
2089                 .nentries = __cpu_to_le32(32),
2090                 .nbytes_max = __cpu_to_le32(2048),
2091                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2092                 .reserved = __cpu_to_le32(0),
2093         },
2094
2095         /* CE2: target->host WMI */
2096         {
2097                 .pipenum = __cpu_to_le32(2),
2098                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
2099                 .nentries = __cpu_to_le32(32),
2100                 .nbytes_max = __cpu_to_le32(2048),
2101                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2102                 .reserved = __cpu_to_le32(0),
2103         },
2104
2105         /* CE3: host->target WMI */
2106         {
2107                 .pipenum = __cpu_to_le32(3),
2108                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
2109                 .nentries = __cpu_to_le32(32),
2110                 .nbytes_max = __cpu_to_le32(2048),
2111                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2112                 .reserved = __cpu_to_le32(0),
2113         },
2114
2115         /* CE4: host->target HTT */
2116         {
2117                 .pipenum = __cpu_to_le32(4),
2118                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
2119                 .nentries = __cpu_to_le32(256),
2120                 .nbytes_max = __cpu_to_le32(256),
2121                 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR),
2122                 .reserved = __cpu_to_le32(0),
2123         },
2124
2125         /* CE5: target->host Pktlog */
2126         {
2127                 .pipenum = __cpu_to_le32(5),
2128                 .pipedir = __cpu_to_le32(PIPEDIR_IN),
2129                 .nentries = __cpu_to_le32(32),
2130                 .nbytes_max = __cpu_to_le32(2048),
2131                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2132                 .reserved = __cpu_to_le32(0),
2133         },
2134
2135         /* CE6: Reserved for target autonomous hif_memcpy */
2136         {
2137                 .pipenum = __cpu_to_le32(6),
2138                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
2139                 .nentries = __cpu_to_le32(32),
2140                 .nbytes_max = __cpu_to_le32(16384),
2141                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2142                 .reserved = __cpu_to_le32(0),
2143         },
2144
2145         /* CE7 used only by Host */
2146         {
2147                 .pipenum = __cpu_to_le32(7),
2148                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),
2149                 .nentries = __cpu_to_le32(32),
2150                 .nbytes_max = __cpu_to_le32(2048),
2151                 .flags = __cpu_to_le32(0x2000),
2152                 .reserved = __cpu_to_le32(0),
2153         },
2154
2155         /* CE8 target->host used only by IPA */
2156         {
2157                 .pipenum = __cpu_to_le32(8),
2158                 .pipedir = __cpu_to_le32(PIPEDIR_INOUT),
2159                 .nentries = __cpu_to_le32(32),
2160                 .nbytes_max = __cpu_to_le32(16384),
2161                 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
2162                 .reserved = __cpu_to_le32(0),
2163         },
2164 };
2165
2166 /* Map from service/endpoint to Copy Engine for IPQ5018.
2167  * This table is derived from the CE TABLE, above.
2168  * It is passed to the Target at startup for use by firmware.
2169  */
2170 const struct service_to_pipe ath11k_target_service_to_ce_map_wlan_ipq5018[] = {
2171         {
2172                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
2173                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2174                 .pipenum = __cpu_to_le32(3),
2175         },
2176         {
2177                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VO),
2178                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2179                 .pipenum = __cpu_to_le32(2),
2180         },
2181         {
2182                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
2183                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2184                 .pipenum = __cpu_to_le32(3),
2185         },
2186         {
2187                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BK),
2188                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2189                 .pipenum = __cpu_to_le32(2),
2190         },
2191         {
2192                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
2193                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2194                 .pipenum = __cpu_to_le32(3),
2195         },
2196         {
2197                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_BE),
2198                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2199                 .pipenum = __cpu_to_le32(2),
2200         },
2201         {
2202                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
2203                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2204                 .pipenum = __cpu_to_le32(3),
2205         },
2206         {
2207                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_DATA_VI),
2208                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2209                 .pipenum = __cpu_to_le32(2),
2210         },
2211         {
2212                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
2213                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2214                 .pipenum = __cpu_to_le32(3),
2215         },
2216         {
2217                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_WMI_CONTROL),
2218                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2219                 .pipenum = __cpu_to_le32(2),
2220         },
2221
2222         {
2223                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
2224                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2225                 .pipenum = __cpu_to_le32(0),
2226         },
2227         {
2228                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_RSVD_CTRL),
2229                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2230                 .pipenum = __cpu_to_le32(1),
2231         },
2232
2233         {
2234                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
2235                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2236                 .pipenum = __cpu_to_le32(0),
2237         },
2238         {
2239                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_TEST_RAW_STREAMS),
2240                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2241                 .pipenum = __cpu_to_le32(1),
2242         },
2243         {
2244                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
2245                 .pipedir = __cpu_to_le32(PIPEDIR_OUT),  /* out = UL = host -> target */
2246                 .pipenum = __cpu_to_le32(4),
2247         },
2248         {
2249                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_HTT_DATA_MSG),
2250                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2251                 .pipenum = __cpu_to_le32(1),
2252         },
2253         {
2254                 .service_id = __cpu_to_le32(ATH11K_HTC_SVC_ID_PKT_LOG),
2255                 .pipedir = __cpu_to_le32(PIPEDIR_IN),   /* in = DL = target -> host */
2256                 .pipenum = __cpu_to_le32(5),
2257         },
2258
2259        /* (Additions here) */
2260
2261         { /* terminator entry */ }
2262 };
2263
2264 const struct ce_ie_addr ath11k_ce_ie_addr_ipq8074 = {
2265         .ie1_reg_addr = CE_HOST_IE_ADDRESS,
2266         .ie2_reg_addr = CE_HOST_IE_2_ADDRESS,
2267         .ie3_reg_addr = CE_HOST_IE_3_ADDRESS,
2268 };
2269
2270 const struct ce_ie_addr ath11k_ce_ie_addr_ipq5018 = {
2271         .ie1_reg_addr = CE_HOST_IPQ5018_IE_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
2272         .ie2_reg_addr = CE_HOST_IPQ5018_IE_2_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
2273         .ie3_reg_addr = CE_HOST_IPQ5018_IE_3_ADDRESS - HAL_IPQ5018_CE_WFSS_REG_BASE,
2274 };
2275
2276 const struct ce_remap ath11k_ce_remap_ipq5018 = {
2277         .base = HAL_IPQ5018_CE_WFSS_REG_BASE,
2278         .size = HAL_IPQ5018_CE_SIZE,
2279 };
2280
2281 const struct ath11k_hw_regs ipq8074_regs = {
2282         /* SW2TCL(x) R0 ring configuration address */
2283         .hal_tcl1_ring_base_lsb = 0x00000510,
2284         .hal_tcl1_ring_base_msb = 0x00000514,
2285         .hal_tcl1_ring_id = 0x00000518,
2286         .hal_tcl1_ring_misc = 0x00000520,
2287         .hal_tcl1_ring_tp_addr_lsb = 0x0000052c,
2288         .hal_tcl1_ring_tp_addr_msb = 0x00000530,
2289         .hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000540,
2290         .hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000544,
2291         .hal_tcl1_ring_msi1_base_lsb = 0x00000558,
2292         .hal_tcl1_ring_msi1_base_msb = 0x0000055c,
2293         .hal_tcl1_ring_msi1_data = 0x00000560,
2294         .hal_tcl2_ring_base_lsb = 0x00000568,
2295         .hal_tcl_ring_base_lsb = 0x00000618,
2296
2297         /* TCL STATUS ring address */
2298         .hal_tcl_status_ring_base_lsb = 0x00000720,
2299
2300         /* REO2SW(x) R0 ring configuration address */
2301         .hal_reo1_ring_base_lsb = 0x0000029c,
2302         .hal_reo1_ring_base_msb = 0x000002a0,
2303         .hal_reo1_ring_id = 0x000002a4,
2304         .hal_reo1_ring_misc = 0x000002ac,
2305         .hal_reo1_ring_hp_addr_lsb = 0x000002b0,
2306         .hal_reo1_ring_hp_addr_msb = 0x000002b4,
2307         .hal_reo1_ring_producer_int_setup = 0x000002c0,
2308         .hal_reo1_ring_msi1_base_lsb = 0x000002e4,
2309         .hal_reo1_ring_msi1_base_msb = 0x000002e8,
2310         .hal_reo1_ring_msi1_data = 0x000002ec,
2311         .hal_reo2_ring_base_lsb = 0x000002f4,
2312         .hal_reo1_aging_thresh_ix_0 = 0x00000564,
2313         .hal_reo1_aging_thresh_ix_1 = 0x00000568,
2314         .hal_reo1_aging_thresh_ix_2 = 0x0000056c,
2315         .hal_reo1_aging_thresh_ix_3 = 0x00000570,
2316
2317         /* REO2SW(x) R2 ring pointers (head/tail) address */
2318         .hal_reo1_ring_hp = 0x00003038,
2319         .hal_reo1_ring_tp = 0x0000303c,
2320         .hal_reo2_ring_hp = 0x00003040,
2321
2322         /* REO2TCL R0 ring configuration address */
2323         .hal_reo_tcl_ring_base_lsb = 0x000003fc,
2324         .hal_reo_tcl_ring_hp = 0x00003058,
2325
2326         /* REO CMD ring address */
2327         .hal_reo_cmd_ring_base_lsb = 0x00000194,
2328         .hal_reo_cmd_ring_hp = 0x00003020,
2329
2330         /* REO status address */
2331         .hal_reo_status_ring_base_lsb = 0x00000504,
2332         .hal_reo_status_hp = 0x00003070,
2333
2334         /* SW2REO ring address */
2335         .hal_sw2reo_ring_base_lsb = 0x000001ec,
2336         .hal_sw2reo_ring_hp = 0x00003028,
2337
2338         /* WCSS relative address */
2339         .hal_seq_wcss_umac_ce0_src_reg = 0x00a00000,
2340         .hal_seq_wcss_umac_ce0_dst_reg = 0x00a01000,
2341         .hal_seq_wcss_umac_ce1_src_reg = 0x00a02000,
2342         .hal_seq_wcss_umac_ce1_dst_reg = 0x00a03000,
2343
2344         /* WBM Idle address */
2345         .hal_wbm_idle_link_ring_base_lsb = 0x00000860,
2346         .hal_wbm_idle_link_ring_misc = 0x00000870,
2347
2348         /* SW2WBM release address */
2349         .hal_wbm_release_ring_base_lsb = 0x000001d8,
2350
2351         /* WBM2SW release address */
2352         .hal_wbm0_release_ring_base_lsb = 0x00000910,
2353         .hal_wbm1_release_ring_base_lsb = 0x00000968,
2354
2355         /* PCIe base address */
2356         .pcie_qserdes_sysclk_en_sel = 0x0,
2357         .pcie_pcs_osc_dtct_config_base = 0x0,
2358
2359         /* Shadow register area */
2360         .hal_shadow_base_addr = 0x0,
2361
2362         /* REO misc control register, not used in IPQ8074 */
2363         .hal_reo1_misc_ctl = 0x0,
2364 };
2365
2366 const struct ath11k_hw_regs qca6390_regs = {
2367         /* SW2TCL(x) R0 ring configuration address */
2368         .hal_tcl1_ring_base_lsb = 0x00000684,
2369         .hal_tcl1_ring_base_msb = 0x00000688,
2370         .hal_tcl1_ring_id = 0x0000068c,
2371         .hal_tcl1_ring_misc = 0x00000694,
2372         .hal_tcl1_ring_tp_addr_lsb = 0x000006a0,
2373         .hal_tcl1_ring_tp_addr_msb = 0x000006a4,
2374         .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006b4,
2375         .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006b8,
2376         .hal_tcl1_ring_msi1_base_lsb = 0x000006cc,
2377         .hal_tcl1_ring_msi1_base_msb = 0x000006d0,
2378         .hal_tcl1_ring_msi1_data = 0x000006d4,
2379         .hal_tcl2_ring_base_lsb = 0x000006dc,
2380         .hal_tcl_ring_base_lsb = 0x0000078c,
2381
2382         /* TCL STATUS ring address */
2383         .hal_tcl_status_ring_base_lsb = 0x00000894,
2384
2385         /* REO2SW(x) R0 ring configuration address */
2386         .hal_reo1_ring_base_lsb = 0x00000244,
2387         .hal_reo1_ring_base_msb = 0x00000248,
2388         .hal_reo1_ring_id = 0x0000024c,
2389         .hal_reo1_ring_misc = 0x00000254,
2390         .hal_reo1_ring_hp_addr_lsb = 0x00000258,
2391         .hal_reo1_ring_hp_addr_msb = 0x0000025c,
2392         .hal_reo1_ring_producer_int_setup = 0x00000268,
2393         .hal_reo1_ring_msi1_base_lsb = 0x0000028c,
2394         .hal_reo1_ring_msi1_base_msb = 0x00000290,
2395         .hal_reo1_ring_msi1_data = 0x00000294,
2396         .hal_reo2_ring_base_lsb = 0x0000029c,
2397         .hal_reo1_aging_thresh_ix_0 = 0x0000050c,
2398         .hal_reo1_aging_thresh_ix_1 = 0x00000510,
2399         .hal_reo1_aging_thresh_ix_2 = 0x00000514,
2400         .hal_reo1_aging_thresh_ix_3 = 0x00000518,
2401
2402         /* REO2SW(x) R2 ring pointers (head/tail) address */
2403         .hal_reo1_ring_hp = 0x00003030,
2404         .hal_reo1_ring_tp = 0x00003034,
2405         .hal_reo2_ring_hp = 0x00003038,
2406
2407         /* REO2TCL R0 ring configuration address */
2408         .hal_reo_tcl_ring_base_lsb = 0x000003a4,
2409         .hal_reo_tcl_ring_hp = 0x00003050,
2410
2411         /* REO CMD ring address */
2412         .hal_reo_cmd_ring_base_lsb = 0x00000194,
2413         .hal_reo_cmd_ring_hp = 0x00003020,
2414
2415         /* REO status address */
2416         .hal_reo_status_ring_base_lsb = 0x000004ac,
2417         .hal_reo_status_hp = 0x00003068,
2418
2419         /* SW2REO ring address */
2420         .hal_sw2reo_ring_base_lsb = 0x000001ec,
2421         .hal_sw2reo_ring_hp = 0x00003028,
2422
2423         /* WCSS relative address */
2424         .hal_seq_wcss_umac_ce0_src_reg = 0x00a00000,
2425         .hal_seq_wcss_umac_ce0_dst_reg = 0x00a01000,
2426         .hal_seq_wcss_umac_ce1_src_reg = 0x00a02000,
2427         .hal_seq_wcss_umac_ce1_dst_reg = 0x00a03000,
2428
2429         /* WBM Idle address */
2430         .hal_wbm_idle_link_ring_base_lsb = 0x00000860,
2431         .hal_wbm_idle_link_ring_misc = 0x00000870,
2432
2433         /* SW2WBM release address */
2434         .hal_wbm_release_ring_base_lsb = 0x000001d8,
2435
2436         /* WBM2SW release address */
2437         .hal_wbm0_release_ring_base_lsb = 0x00000910,
2438         .hal_wbm1_release_ring_base_lsb = 0x00000968,
2439
2440         /* PCIe base address */
2441         .pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
2442         .pcie_pcs_osc_dtct_config_base = 0x01e0c628,
2443
2444         /* Shadow register area */
2445         .hal_shadow_base_addr = 0x000008fc,
2446
2447         /* REO misc control register, not used in QCA6390 */
2448         .hal_reo1_misc_ctl = 0x0,
2449 };
2450
2451 const struct ath11k_hw_regs qcn9074_regs = {
2452         /* SW2TCL(x) R0 ring configuration address */
2453         .hal_tcl1_ring_base_lsb = 0x000004f0,
2454         .hal_tcl1_ring_base_msb = 0x000004f4,
2455         .hal_tcl1_ring_id = 0x000004f8,
2456         .hal_tcl1_ring_misc = 0x00000500,
2457         .hal_tcl1_ring_tp_addr_lsb = 0x0000050c,
2458         .hal_tcl1_ring_tp_addr_msb = 0x00000510,
2459         .hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000520,
2460         .hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000524,
2461         .hal_tcl1_ring_msi1_base_lsb = 0x00000538,
2462         .hal_tcl1_ring_msi1_base_msb = 0x0000053c,
2463         .hal_tcl1_ring_msi1_data = 0x00000540,
2464         .hal_tcl2_ring_base_lsb = 0x00000548,
2465         .hal_tcl_ring_base_lsb = 0x000005f8,
2466
2467         /* TCL STATUS ring address */
2468         .hal_tcl_status_ring_base_lsb = 0x00000700,
2469
2470         /* REO2SW(x) R0 ring configuration address */
2471         .hal_reo1_ring_base_lsb = 0x0000029c,
2472         .hal_reo1_ring_base_msb = 0x000002a0,
2473         .hal_reo1_ring_id = 0x000002a4,
2474         .hal_reo1_ring_misc = 0x000002ac,
2475         .hal_reo1_ring_hp_addr_lsb = 0x000002b0,
2476         .hal_reo1_ring_hp_addr_msb = 0x000002b4,
2477         .hal_reo1_ring_producer_int_setup = 0x000002c0,
2478         .hal_reo1_ring_msi1_base_lsb = 0x000002e4,
2479         .hal_reo1_ring_msi1_base_msb = 0x000002e8,
2480         .hal_reo1_ring_msi1_data = 0x000002ec,
2481         .hal_reo2_ring_base_lsb = 0x000002f4,
2482         .hal_reo1_aging_thresh_ix_0 = 0x00000564,
2483         .hal_reo1_aging_thresh_ix_1 = 0x00000568,
2484         .hal_reo1_aging_thresh_ix_2 = 0x0000056c,
2485         .hal_reo1_aging_thresh_ix_3 = 0x00000570,
2486
2487         /* REO2SW(x) R2 ring pointers (head/tail) address */
2488         .hal_reo1_ring_hp = 0x00003038,
2489         .hal_reo1_ring_tp = 0x0000303c,
2490         .hal_reo2_ring_hp = 0x00003040,
2491
2492         /* REO2TCL R0 ring configuration address */
2493         .hal_reo_tcl_ring_base_lsb = 0x000003fc,
2494         .hal_reo_tcl_ring_hp = 0x00003058,
2495
2496         /* REO CMD ring address */
2497         .hal_reo_cmd_ring_base_lsb = 0x00000194,
2498         .hal_reo_cmd_ring_hp = 0x00003020,
2499
2500         /* REO status address */
2501         .hal_reo_status_ring_base_lsb = 0x00000504,
2502         .hal_reo_status_hp = 0x00003070,
2503
2504         /* SW2REO ring address */
2505         .hal_sw2reo_ring_base_lsb = 0x000001ec,
2506         .hal_sw2reo_ring_hp = 0x00003028,
2507
2508         /* WCSS relative address */
2509         .hal_seq_wcss_umac_ce0_src_reg = 0x01b80000,
2510         .hal_seq_wcss_umac_ce0_dst_reg = 0x01b81000,
2511         .hal_seq_wcss_umac_ce1_src_reg = 0x01b82000,
2512         .hal_seq_wcss_umac_ce1_dst_reg = 0x01b83000,
2513
2514         /* WBM Idle address */
2515         .hal_wbm_idle_link_ring_base_lsb = 0x00000874,
2516         .hal_wbm_idle_link_ring_misc = 0x00000884,
2517
2518         /* SW2WBM release address */
2519         .hal_wbm_release_ring_base_lsb = 0x000001ec,
2520
2521         /* WBM2SW release address */
2522         .hal_wbm0_release_ring_base_lsb = 0x00000924,
2523         .hal_wbm1_release_ring_base_lsb = 0x0000097c,
2524
2525         /* PCIe base address */
2526         .pcie_qserdes_sysclk_en_sel = 0x01e0e0a8,
2527         .pcie_pcs_osc_dtct_config_base = 0x01e0f45c,
2528
2529         /* Shadow register area */
2530         .hal_shadow_base_addr = 0x0,
2531
2532         /* REO misc control register, not used in QCN9074 */
2533         .hal_reo1_misc_ctl = 0x0,
2534 };
2535
2536 const struct ath11k_hw_regs wcn6855_regs = {
2537         /* SW2TCL(x) R0 ring configuration address */
2538         .hal_tcl1_ring_base_lsb = 0x00000690,
2539         .hal_tcl1_ring_base_msb = 0x00000694,
2540         .hal_tcl1_ring_id = 0x00000698,
2541         .hal_tcl1_ring_misc = 0x000006a0,
2542         .hal_tcl1_ring_tp_addr_lsb = 0x000006ac,
2543         .hal_tcl1_ring_tp_addr_msb = 0x000006b0,
2544         .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c0,
2545         .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c4,
2546         .hal_tcl1_ring_msi1_base_lsb = 0x000006d8,
2547         .hal_tcl1_ring_msi1_base_msb = 0x000006dc,
2548         .hal_tcl1_ring_msi1_data = 0x000006e0,
2549         .hal_tcl2_ring_base_lsb = 0x000006e8,
2550         .hal_tcl_ring_base_lsb = 0x00000798,
2551
2552         /* TCL STATUS ring address */
2553         .hal_tcl_status_ring_base_lsb = 0x000008a0,
2554
2555         /* REO2SW(x) R0 ring configuration address */
2556         .hal_reo1_ring_base_lsb = 0x00000244,
2557         .hal_reo1_ring_base_msb = 0x00000248,
2558         .hal_reo1_ring_id = 0x0000024c,
2559         .hal_reo1_ring_misc = 0x00000254,
2560         .hal_reo1_ring_hp_addr_lsb = 0x00000258,
2561         .hal_reo1_ring_hp_addr_msb = 0x0000025c,
2562         .hal_reo1_ring_producer_int_setup = 0x00000268,
2563         .hal_reo1_ring_msi1_base_lsb = 0x0000028c,
2564         .hal_reo1_ring_msi1_base_msb = 0x00000290,
2565         .hal_reo1_ring_msi1_data = 0x00000294,
2566         .hal_reo2_ring_base_lsb = 0x0000029c,
2567         .hal_reo1_aging_thresh_ix_0 = 0x000005bc,
2568         .hal_reo1_aging_thresh_ix_1 = 0x000005c0,
2569         .hal_reo1_aging_thresh_ix_2 = 0x000005c4,
2570         .hal_reo1_aging_thresh_ix_3 = 0x000005c8,
2571
2572         /* REO2SW(x) R2 ring pointers (head/tail) address */
2573         .hal_reo1_ring_hp = 0x00003030,
2574         .hal_reo1_ring_tp = 0x00003034,
2575         .hal_reo2_ring_hp = 0x00003038,
2576
2577         /* REO2TCL R0 ring configuration address */
2578         .hal_reo_tcl_ring_base_lsb = 0x00000454,
2579         .hal_reo_tcl_ring_hp = 0x00003060,
2580
2581         /* REO CMD ring address */
2582         .hal_reo_cmd_ring_base_lsb = 0x00000194,
2583         .hal_reo_cmd_ring_hp = 0x00003020,
2584
2585         /* REO status address */
2586         .hal_reo_status_ring_base_lsb = 0x0000055c,
2587         .hal_reo_status_hp = 0x00003078,
2588
2589         /* SW2REO ring address */
2590         .hal_sw2reo_ring_base_lsb = 0x000001ec,
2591         .hal_sw2reo_ring_hp = 0x00003028,
2592
2593         /* WCSS relative address */
2594         .hal_seq_wcss_umac_ce0_src_reg = 0x1b80000,
2595         .hal_seq_wcss_umac_ce0_dst_reg = 0x1b81000,
2596         .hal_seq_wcss_umac_ce1_src_reg = 0x1b82000,
2597         .hal_seq_wcss_umac_ce1_dst_reg = 0x1b83000,
2598
2599         /* WBM Idle address */
2600         .hal_wbm_idle_link_ring_base_lsb = 0x00000870,
2601         .hal_wbm_idle_link_ring_misc = 0x00000880,
2602
2603         /* SW2WBM release address */
2604         .hal_wbm_release_ring_base_lsb = 0x000001e8,
2605
2606         /* WBM2SW release address */
2607         .hal_wbm0_release_ring_base_lsb = 0x00000920,
2608         .hal_wbm1_release_ring_base_lsb = 0x00000978,
2609
2610         /* PCIe base address */
2611         .pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
2612         .pcie_pcs_osc_dtct_config_base = 0x01e0c628,
2613
2614         /* Shadow register area */
2615         .hal_shadow_base_addr = 0x000008fc,
2616
2617         /* REO misc control register, used for fragment
2618          * destination ring config in WCN6855.
2619          */
2620         .hal_reo1_misc_ctl = 0x00000630,
2621 };
2622
2623 const struct ath11k_hw_regs wcn6750_regs = {
2624         /* SW2TCL(x) R0 ring configuration address */
2625         .hal_tcl1_ring_base_lsb = 0x00000694,
2626         .hal_tcl1_ring_base_msb = 0x00000698,
2627         .hal_tcl1_ring_id = 0x0000069c,
2628         .hal_tcl1_ring_misc = 0x000006a4,
2629         .hal_tcl1_ring_tp_addr_lsb = 0x000006b0,
2630         .hal_tcl1_ring_tp_addr_msb = 0x000006b4,
2631         .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c4,
2632         .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c8,
2633         .hal_tcl1_ring_msi1_base_lsb = 0x000006dc,
2634         .hal_tcl1_ring_msi1_base_msb = 0x000006e0,
2635         .hal_tcl1_ring_msi1_data = 0x000006e4,
2636         .hal_tcl2_ring_base_lsb = 0x000006ec,
2637         .hal_tcl_ring_base_lsb = 0x0000079c,
2638
2639         /* TCL STATUS ring address */
2640         .hal_tcl_status_ring_base_lsb = 0x000008a4,
2641
2642         /* REO2SW(x) R0 ring configuration address */
2643         .hal_reo1_ring_base_lsb = 0x000001ec,
2644         .hal_reo1_ring_base_msb = 0x000001f0,
2645         .hal_reo1_ring_id = 0x000001f4,
2646         .hal_reo1_ring_misc = 0x000001fc,
2647         .hal_reo1_ring_hp_addr_lsb = 0x00000200,
2648         .hal_reo1_ring_hp_addr_msb = 0x00000204,
2649         .hal_reo1_ring_producer_int_setup = 0x00000210,
2650         .hal_reo1_ring_msi1_base_lsb = 0x00000234,
2651         .hal_reo1_ring_msi1_base_msb = 0x00000238,
2652         .hal_reo1_ring_msi1_data = 0x0000023c,
2653         .hal_reo2_ring_base_lsb = 0x00000244,
2654         .hal_reo1_aging_thresh_ix_0 = 0x00000564,
2655         .hal_reo1_aging_thresh_ix_1 = 0x00000568,
2656         .hal_reo1_aging_thresh_ix_2 = 0x0000056c,
2657         .hal_reo1_aging_thresh_ix_3 = 0x00000570,
2658
2659         /* REO2SW(x) R2 ring pointers (head/tail) address */
2660         .hal_reo1_ring_hp = 0x00003028,
2661         .hal_reo1_ring_tp = 0x0000302c,
2662         .hal_reo2_ring_hp = 0x00003030,
2663
2664         /* REO2TCL R0 ring configuration address */
2665         .hal_reo_tcl_ring_base_lsb = 0x000003fc,
2666         .hal_reo_tcl_ring_hp = 0x00003058,
2667
2668         /* REO CMD ring address */
2669         .hal_reo_cmd_ring_base_lsb = 0x000000e4,
2670         .hal_reo_cmd_ring_hp = 0x00003010,
2671
2672         /* REO status address */
2673         .hal_reo_status_ring_base_lsb = 0x00000504,
2674         .hal_reo_status_hp = 0x00003070,
2675
2676         /* SW2REO ring address */
2677         .hal_sw2reo_ring_base_lsb = 0x0000013c,
2678         .hal_sw2reo_ring_hp = 0x00003018,
2679
2680         /* WCSS relative address */
2681         .hal_seq_wcss_umac_ce0_src_reg = 0x01b80000,
2682         .hal_seq_wcss_umac_ce0_dst_reg = 0x01b81000,
2683         .hal_seq_wcss_umac_ce1_src_reg = 0x01b82000,
2684         .hal_seq_wcss_umac_ce1_dst_reg = 0x01b83000,
2685
2686         /* WBM Idle address */
2687         .hal_wbm_idle_link_ring_base_lsb = 0x00000874,
2688         .hal_wbm_idle_link_ring_misc = 0x00000884,
2689
2690         /* SW2WBM release address */
2691         .hal_wbm_release_ring_base_lsb = 0x000001ec,
2692
2693         /* WBM2SW release address */
2694         .hal_wbm0_release_ring_base_lsb = 0x00000924,
2695         .hal_wbm1_release_ring_base_lsb = 0x0000097c,
2696
2697         /* PCIe base address */
2698         .pcie_qserdes_sysclk_en_sel = 0x0,
2699         .pcie_pcs_osc_dtct_config_base = 0x0,
2700
2701         /* Shadow register area */
2702         .hal_shadow_base_addr = 0x00000504,
2703
2704         /* REO misc control register, used for fragment
2705          * destination ring config in WCN6750.
2706          */
2707         .hal_reo1_misc_ctl = 0x000005d8,
2708 };
2709
2710 static const struct ath11k_hw_tcl2wbm_rbm_map ath11k_hw_tcl2wbm_rbm_map_ipq8074[] = {
2711         {
2712                 .tcl_ring_num = 0,
2713                 .wbm_ring_num = 0,
2714                 .rbm_id = HAL_RX_BUF_RBM_SW0_BM,
2715         },
2716         {
2717                 .tcl_ring_num = 1,
2718                 .wbm_ring_num = 1,
2719                 .rbm_id = HAL_RX_BUF_RBM_SW1_BM,
2720         },
2721         {
2722                 .tcl_ring_num = 2,
2723                 .wbm_ring_num = 2,
2724                 .rbm_id = HAL_RX_BUF_RBM_SW2_BM,
2725         },
2726 };
2727
2728 static const struct ath11k_hw_tcl2wbm_rbm_map ath11k_hw_tcl2wbm_rbm_map_wcn6750[] = {
2729         {
2730                 .tcl_ring_num = 0,
2731                 .wbm_ring_num = 0,
2732                 .rbm_id = HAL_RX_BUF_RBM_SW0_BM,
2733         },
2734         {
2735                 .tcl_ring_num = 1,
2736                 .wbm_ring_num = 4,
2737                 .rbm_id = HAL_RX_BUF_RBM_SW4_BM,
2738         },
2739         {
2740                 .tcl_ring_num = 2,
2741                 .wbm_ring_num = 2,
2742                 .rbm_id = HAL_RX_BUF_RBM_SW2_BM,
2743         },
2744 };
2745
2746 const struct ath11k_hw_regs ipq5018_regs = {
2747         /* SW2TCL(x) R0 ring configuration address */
2748         .hal_tcl1_ring_base_lsb = 0x00000694,
2749         .hal_tcl1_ring_base_msb = 0x00000698,
2750         .hal_tcl1_ring_id =     0x0000069c,
2751         .hal_tcl1_ring_misc = 0x000006a4,
2752         .hal_tcl1_ring_tp_addr_lsb = 0x000006b0,
2753         .hal_tcl1_ring_tp_addr_msb = 0x000006b4,
2754         .hal_tcl1_ring_consumer_int_setup_ix0 = 0x000006c4,
2755         .hal_tcl1_ring_consumer_int_setup_ix1 = 0x000006c8,
2756         .hal_tcl1_ring_msi1_base_lsb = 0x000006dc,
2757         .hal_tcl1_ring_msi1_base_msb = 0x000006e0,
2758         .hal_tcl1_ring_msi1_data = 0x000006e4,
2759         .hal_tcl2_ring_base_lsb = 0x000006ec,
2760         .hal_tcl_ring_base_lsb = 0x0000079c,
2761
2762         /* TCL STATUS ring address */
2763         .hal_tcl_status_ring_base_lsb = 0x000008a4,
2764
2765         /* REO2SW(x) R0 ring configuration address */
2766         .hal_reo1_ring_base_lsb = 0x000001ec,
2767         .hal_reo1_ring_base_msb = 0x000001f0,
2768         .hal_reo1_ring_id = 0x000001f4,
2769         .hal_reo1_ring_misc = 0x000001fc,
2770         .hal_reo1_ring_hp_addr_lsb = 0x00000200,
2771         .hal_reo1_ring_hp_addr_msb = 0x00000204,
2772         .hal_reo1_ring_producer_int_setup = 0x00000210,
2773         .hal_reo1_ring_msi1_base_lsb = 0x00000234,
2774         .hal_reo1_ring_msi1_base_msb = 0x00000238,
2775         .hal_reo1_ring_msi1_data = 0x0000023c,
2776         .hal_reo2_ring_base_lsb = 0x00000244,
2777         .hal_reo1_aging_thresh_ix_0 = 0x00000564,
2778         .hal_reo1_aging_thresh_ix_1 = 0x00000568,
2779         .hal_reo1_aging_thresh_ix_2 = 0x0000056c,
2780         .hal_reo1_aging_thresh_ix_3 = 0x00000570,
2781
2782         /* REO2SW(x) R2 ring pointers (head/tail) address */
2783         .hal_reo1_ring_hp = 0x00003028,
2784         .hal_reo1_ring_tp = 0x0000302c,
2785         .hal_reo2_ring_hp = 0x00003030,
2786
2787         /* REO2TCL R0 ring configuration address */
2788         .hal_reo_tcl_ring_base_lsb = 0x000003fc,
2789         .hal_reo_tcl_ring_hp = 0x00003058,
2790
2791         /* SW2REO ring address */
2792         .hal_sw2reo_ring_base_lsb = 0x0000013c,
2793         .hal_sw2reo_ring_hp = 0x00003018,
2794
2795         /* REO CMD ring address */
2796         .hal_reo_cmd_ring_base_lsb = 0x000000e4,
2797         .hal_reo_cmd_ring_hp = 0x00003010,
2798
2799         /* REO status address */
2800         .hal_reo_status_ring_base_lsb = 0x00000504,
2801         .hal_reo_status_hp = 0x00003070,
2802
2803         /* WCSS relative address */
2804         .hal_seq_wcss_umac_ce0_src_reg = 0x08400000
2805                 - HAL_IPQ5018_CE_WFSS_REG_BASE,
2806         .hal_seq_wcss_umac_ce0_dst_reg = 0x08401000
2807                 - HAL_IPQ5018_CE_WFSS_REG_BASE,
2808         .hal_seq_wcss_umac_ce1_src_reg = 0x08402000
2809                 - HAL_IPQ5018_CE_WFSS_REG_BASE,
2810         .hal_seq_wcss_umac_ce1_dst_reg = 0x08403000
2811                 - HAL_IPQ5018_CE_WFSS_REG_BASE,
2812
2813         /* WBM Idle address */
2814         .hal_wbm_idle_link_ring_base_lsb = 0x00000874,
2815         .hal_wbm_idle_link_ring_misc = 0x00000884,
2816
2817         /* SW2WBM release address */
2818         .hal_wbm_release_ring_base_lsb = 0x000001ec,
2819
2820         /* WBM2SW release address */
2821         .hal_wbm0_release_ring_base_lsb = 0x00000924,
2822         .hal_wbm1_release_ring_base_lsb = 0x0000097c,
2823 };
2824
2825 const struct ath11k_hw_hal_params ath11k_hw_hal_params_ipq8074 = {
2826         .rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM,
2827         .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074,
2828 };
2829
2830 const struct ath11k_hw_hal_params ath11k_hw_hal_params_qca6390 = {
2831         .rx_buf_rbm = HAL_RX_BUF_RBM_SW1_BM,
2832         .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_ipq8074,
2833 };
2834
2835 const struct ath11k_hw_hal_params ath11k_hw_hal_params_wcn6750 = {
2836         .rx_buf_rbm = HAL_RX_BUF_RBM_SW1_BM,
2837         .tcl2wbm_rbm_map = ath11k_hw_tcl2wbm_rbm_map_wcn6750,
2838 };
2839
2840 static const struct cfg80211_sar_freq_ranges ath11k_hw_sar_freq_ranges_wcn6855[] = {
2841         {.start_freq = 2402, .end_freq = 2482 },  /* 2G ch1~ch13 */
2842         {.start_freq = 5150, .end_freq = 5250 },  /* 5G UNII-1 ch32~ch48 */
2843         {.start_freq = 5250, .end_freq = 5725 },  /* 5G UNII-2 ch50~ch144 */
2844         {.start_freq = 5725, .end_freq = 5810 },  /* 5G UNII-3 ch149~ch161 */
2845         {.start_freq = 5815, .end_freq = 5895 },  /* 5G UNII-4 ch163~ch177 */
2846         {.start_freq = 5925, .end_freq = 6165 },  /* 6G UNII-5 Ch1, Ch2 ~ Ch41 */
2847         {.start_freq = 6165, .end_freq = 6425 },  /* 6G UNII-5 ch45~ch93 */
2848         {.start_freq = 6425, .end_freq = 6525 },  /* 6G UNII-6 ch97~ch113 */
2849         {.start_freq = 6525, .end_freq = 6705 },  /* 6G UNII-7 ch117~ch149 */
2850         {.start_freq = 6705, .end_freq = 6875 },  /* 6G UNII-7 ch153~ch185 */
2851         {.start_freq = 6875, .end_freq = 7125 },  /* 6G UNII-8 ch189~ch233 */
2852 };
2853
2854 const struct cfg80211_sar_capa ath11k_hw_sar_capa_wcn6855 = {
2855         .type = NL80211_SAR_TYPE_POWER,
2856         .num_freq_ranges = (ARRAY_SIZE(ath11k_hw_sar_freq_ranges_wcn6855)),
2857         .freq_ranges = ath11k_hw_sar_freq_ranges_wcn6855,
2858 };