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