1// SPDX-License-Identifier: BSD-3-Clause-Clear
2/*
3 * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2022, 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 */
18static 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
32static u8 ath11k_hw_ipq6018_mac_from_pdev_id(int pdev_idx)
33{
34	return pdev_idx;
35}
36
37static 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
44static 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
51static 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
58static 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
105static 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
151static 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
210static 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
216static int ath11k_hw_mac_id_to_srng_id_ipq8074(struct ath11k_hw_params *hw,
217					       int mac_id)
218{
219	return 0;
220}
221
222static int ath11k_hw_mac_id_to_pdev_id_qca6390(struct ath11k_hw_params *hw,
223					       int mac_id)
224{
225	return 0;
226}
227
228static 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
234static 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
240static 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
246static 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
252static u8 *ath11k_hw_ipq8074_rx_desc_get_hdr_status(struct hal_rx_desc *desc)
253{
254	return desc->u.ipq8074.hdr_status;
255}
256
257static 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
263static 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
269static 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
275static 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
281static 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
287static 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
293static 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
299static 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
305static 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
311static 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
317static 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
323static 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
329static 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
334static 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
340static 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
346static 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
352static 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
357static 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
368static 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
374static 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
379static 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
389static 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
395static 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
400static
401struct rx_attention *ath11k_hw_ipq8074_rx_desc_get_attention(struct hal_rx_desc *desc)
402{
403	return &desc->u.ipq8074.attention;
404}
405
406static 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
411static 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
417static 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
423static 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
429static u8 *ath11k_hw_qcn9074_rx_desc_get_hdr_status(struct hal_rx_desc *desc)
430{
431	return desc->u.qcn9074.hdr_status;
432}
433
434static 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
440static 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
446static 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
452static 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
458static 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
464static 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
470static 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
476static 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
482static 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
488static 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
494static 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
500static 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
506static 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
511static 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
517static 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
523static 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
529static 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
534static 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
545static 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
551static 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
556static 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
566static
567struct rx_attention *ath11k_hw_qcn9074_rx_desc_get_attention(struct hal_rx_desc *desc)
568{
569	return &desc->u.qcn9074.attention;
570}
571
572static 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
577static 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
583static 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
588static 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
594static 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
600static 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
606static u8 *ath11k_hw_wcn6855_rx_desc_get_hdr_status(struct hal_rx_desc *desc)
607{
608	return desc->u.wcn6855.hdr_status;
609}
610
611static 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
617static 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
623static 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
629static 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
635static 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
641static 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
647static 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
653static 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
659static 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
665static 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
671static 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
677static 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
682static 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
688static 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
694static 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
700static 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
705static 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
716static 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
722static 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
727static 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
737static
738struct rx_attention *ath11k_hw_wcn6855_rx_desc_get_attention(struct hal_rx_desc *desc)
739{
740	return &desc->u.wcn6855.attention;
741}
742
743static 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
748static 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
754static 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
759static 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
798static 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
841static u16
842ath11k_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
852static u16
853ath11k_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
863static u16
864ath11k_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
873static 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
879static 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
892static 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
903const 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
943const 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
983const 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
1023const 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
1063const 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
1103const 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 */
1144const 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
1213const 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
1254const 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. */
1290const 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 */
1408const 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
1520const 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. */
1623const 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 */
1720const 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. */
1802const 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 */
1899const 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
1995const 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
2036const 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 */
2074const 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 */
2170const 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
2264const 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
2270const 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
2276const struct ce_remap ath11k_ce_remap_ipq5018 = {
2277	.base = HAL_IPQ5018_CE_WFSS_REG_BASE,
2278	.size = HAL_IPQ5018_CE_SIZE,
2279};
2280
2281const 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
2366const 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
2451const 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
2536const 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
2623const 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
2710static 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
2728static 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
2746const 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
2825const 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
2830const 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
2835const 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
2840static 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
2854const 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};
2859