Linux Audio

Check our new training course

In-person Linux kernel drivers training

Jun 16-20, 2025
Register
Loading...
Note: File does not exist in v4.6.
   1// SPDX-License-Identifier: BSD-3-Clause-Clear
   2/*
   3 * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
   4 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
   5 */
   6
   7#include <linux/types.h>
   8#include <linux/bitops.h>
   9#include <linux/bitfield.h>
  10
  11#include "core.h"
  12#include "ce.h"
  13#include "hif.h"
  14#include "hal.h"
  15#include "hw.h"
  16
  17/* Map from pdev index to hw mac index */
  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};