1 /* 2 * Copyright (c) 2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 #include "qdf_types.h" 20 #include "qdf_util.h" 21 #include "qdf_mem.h" 22 #include "qdf_nbuf.h" 23 #include "qdf_module.h" 24 25 #include "target_type.h" 26 #include "wcss_version.h" 27 28 #include "hal_be_hw_headers.h" 29 #include "hal_internal.h" 30 #include "hal_api.h" 31 #include "hal_flow.h" 32 #include "rx_flow_search_entry.h" 33 #include "hal_rx_flow_info.h" 34 #include "hal_be_api.h" 35 #include "tcl_entrance_from_ppe_ring.h" 36 #include "sw_monitor_ring.h" 37 #include "wcss_seq_hwioreg_umac.h" 38 #include "wfss_ce_reg_seq_hwioreg.h" 39 #include <uniform_reo_status_header.h> 40 #include <wbm_release_ring_tx.h> 41 #include <phyrx_location.h> 42 #ifdef WLAN_PKT_CAPTURE_TX_2_0 43 #include <mon_ingress_ring.h> 44 #include <mon_destination_ring.h> 45 #endif 46 #include "rx_reo_queue_1k.h" 47 48 #include <hal_be_rx.h> 49 50 #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \ 51 RX_MPDU_START_RX_MPDU_INFO_DETAILS_RXPCU_MPDU_FILTER_IN_CATEGORY_OFFSET 52 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \ 53 RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET 54 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \ 55 RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET 56 #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \ 57 RX_MPDU_DETAILS_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET 58 #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \ 59 REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET 60 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER \ 61 STATUS_HEADER_REO_STATUS_NUMBER 62 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \ 63 STATUS_HEADER_TIMESTAMP 64 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \ 65 RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET 66 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \ 67 RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET 68 #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \ 69 TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET 70 #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \ 71 TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET 72 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \ 73 TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_OFFSET 74 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \ 75 BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_LSB 76 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \ 77 BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_MASK 78 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \ 79 BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_LSB 80 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \ 81 BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_MASK 82 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \ 83 BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB 84 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \ 85 BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK 86 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \ 87 BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB 88 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \ 89 BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK 90 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \ 91 TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_LSB 92 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \ 93 TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_MASK 94 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \ 95 WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK 96 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \ 97 WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET 98 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \ 99 WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB 100 101 #if defined(WLAN_PKT_CAPTURE_TX_2_0) || defined(WLAN_PKT_CAPTURE_RX_2_0) 102 #include "hal_be_api_mon.h" 103 #endif 104 105 #ifdef CONFIG_WIFI_EMULATION_WIFI_3_0 106 #define CMEM_REG_BASE 0x0010e000 107 108 #define CMEM_WINDOW_ADDRESS_9224 \ 109 ((CMEM_REG_BASE >> WINDOW_SHIFT) & WINDOW_VALUE_MASK) 110 #endif 111 112 #define CE_WINDOW_ADDRESS_9224 \ 113 ((CE_WFSS_CE_REG_BASE >> WINDOW_SHIFT) & WINDOW_VALUE_MASK) 114 115 #define UMAC_WINDOW_ADDRESS_9224 \ 116 ((UMAC_BASE >> WINDOW_SHIFT) & WINDOW_VALUE_MASK) 117 118 #ifdef CONFIG_WIFI_EMULATION_WIFI_3_0 119 #define WINDOW_CONFIGURATION_VALUE_9224 \ 120 ((CE_WINDOW_ADDRESS_9224 << 6) |\ 121 (UMAC_WINDOW_ADDRESS_9224 << 12) | \ 122 CMEM_WINDOW_ADDRESS_9224 | \ 123 WINDOW_ENABLE_BIT) 124 #else 125 #define WINDOW_CONFIGURATION_VALUE_9224 \ 126 ((CE_WINDOW_ADDRESS_9224 << 6) |\ 127 (UMAC_WINDOW_ADDRESS_9224 << 12) | \ 128 WINDOW_ENABLE_BIT) 129 #endif 130 131 /* For Berryllium sw2rxdma ring size increased to 20 bits */ 132 #define HAL_RXDMA_MAX_RING_SIZE_BE 0xFFFFF 133 134 #include "hal_9224_rx.h" 135 #include "hal_9224_tx.h" 136 #include "hal_be_rx_tlv.h" 137 #include <hal_be_generic_api.h> 138 139 #define PMM_REG_BASE_QCN9224 0xB500F8 140 141 /** 142 * hal_read_pmm_scratch_reg() - API to read PMM Scratch register 143 * @soc: HAL soc 144 * @base_addr: Base PMM register 145 * @reg_enum: Enum of the scratch register 146 * 147 * Return: uint32_t 148 */ 149 static inline 150 uint32_t hal_read_pmm_scratch_reg(struct hal_soc *soc, 151 uint32_t base_addr, 152 enum hal_scratch_reg_enum reg_enum) 153 { 154 uint32_t val = 0; 155 156 pld_reg_read(soc->qdf_dev->dev, base_addr + (reg_enum * 4), &val, NULL); 157 return val; 158 } 159 160 /** 161 * hal_get_tsf2_scratch_reg_qcn9224() - API to read tsf2 scratch register 162 * @hal_soc_hdl: HAL soc context 163 * @mac_id: mac id 164 * @value: Pointer to update tsf2 value 165 * 166 * Return: void 167 */ 168 static void hal_get_tsf2_scratch_reg_qcn9224(hal_soc_handle_t hal_soc_hdl, 169 uint8_t mac_id, uint64_t *value) 170 { 171 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl; 172 uint32_t offset_lo, offset_hi; 173 enum hal_scratch_reg_enum enum_lo, enum_hi; 174 175 hal_get_tsf_enum(DEFAULT_TSF_ID, mac_id, &enum_lo, &enum_hi); 176 177 offset_lo = hal_read_pmm_scratch_reg(soc, 178 PMM_REG_BASE_QCN9224, 179 enum_lo); 180 181 offset_hi = hal_read_pmm_scratch_reg(soc, 182 PMM_REG_BASE_QCN9224, 183 enum_hi); 184 185 *value = ((uint64_t)(offset_hi) << 32 | offset_lo); 186 } 187 188 /** 189 * hal_get_tqm_scratch_reg_qcn9224() - API to read tqm scratch register 190 * @hal_soc_hdl: HAL soc context 191 * @value: Pointer to update tqm value 192 * 193 * Return: void 194 */ 195 static void hal_get_tqm_scratch_reg_qcn9224(hal_soc_handle_t hal_soc_hdl, 196 uint64_t *value) 197 { 198 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl; 199 uint32_t offset_lo, offset_hi; 200 201 offset_lo = hal_read_pmm_scratch_reg(soc, 202 PMM_REG_BASE_QCN9224, 203 PMM_TQM_CLOCK_OFFSET_LO_US); 204 205 offset_hi = hal_read_pmm_scratch_reg(soc, 206 PMM_REG_BASE_QCN9224, 207 PMM_TQM_CLOCK_OFFSET_HI_US); 208 209 *value = ((uint64_t)(offset_hi) << 32 | offset_lo); 210 } 211 212 #define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2) 213 #define HAL_PPE_VP_ENTRIES_MAX 32 214 #define HAL_PPE_VP_SEARCH_IDX_REG_MAX 8 215 216 /** 217 * hal_get_link_desc_size_9224() - API to get the link desc size 218 * 219 * Return: uint32_t 220 */ 221 static uint32_t hal_get_link_desc_size_9224(void) 222 { 223 return LINK_DESC_SIZE; 224 } 225 226 /** 227 * hal_rx_get_tlv_9224() - API to get the tlv 228 * @rx_tlv: TLV data extracted from the rx packet 229 * 230 * Return: uint8_t 231 */ 232 static uint8_t hal_rx_get_tlv_9224(void *rx_tlv) 233 { 234 return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY, RECEIVE_BANDWIDTH); 235 } 236 237 /** 238 * hal_rx_wbm_err_msdu_continuation_get_9224() - API to check if WBM msdu 239 * continuation bit is set 240 * @wbm_desc: wbm release ring descriptor 241 * 242 * Return: true if msdu continuation bit is set. 243 */ 244 static inline 245 uint8_t hal_rx_wbm_err_msdu_continuation_get_9224(void *wbm_desc) 246 { 247 uint32_t comp_desc = *(uint32_t *)(((uint8_t *)wbm_desc) + 248 WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_OFFSET); 249 250 return (comp_desc & 251 WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_MASK) >> 252 WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_LSB; 253 } 254 255 #if (defined(WLAN_SA_API_ENABLE)) && (defined(QCA_WIFI_QCA9574)) 256 #define HAL_RX_EVM_DEMF_SEGMENT_SIZE 128 257 #define HAL_RX_EVM_DEMF_MAX_STREAMS 2 258 #define HAL_RX_SU_EVM_MEMBER_LEN 4 259 static inline void 260 hal_rx_update_su_evm_info(void *rx_tlv, 261 void *ppdu_info_hdl) 262 { 263 uint32_t nss_count, pilot_count; 264 uint16_t istream = 0, ipilot = 0; 265 uint8_t pilot_shift = 0; 266 uint8_t *pilot_ptr = NULL; 267 uint16_t segment = 0; 268 269 struct hal_rx_ppdu_info *ppdu_info = 270 (struct hal_rx_ppdu_info *)ppdu_info_hdl; 271 nss_count = ppdu_info->evm_info.nss_count; 272 pilot_count = ppdu_info->evm_info.pilot_count; 273 274 if (nss_count * pilot_count > HAL_RX_MAX_SU_EVM_COUNT) 275 return; 276 277 /* move rx_tlv by 4 to skip no_of_data_sym, nss_cnt and pilot_cnt */ 278 rx_tlv = (uint8_t *)rx_tlv + HAL_RX_SU_EVM_MEMBER_LEN; 279 280 /* EVM values = number_of_streams * number_of_pilots 281 * each EVM value is 8 bits, So, each variable acc_linear_evm_x_y 282 * is (32 bits) will contain 4 EVM values. 283 * For ex: 284 * acc_linear_evm_0_0 : <Pilot0, stream0>, <Pilot0, stream1>, 285 * <Pilot1, stream0>, <Pilot1, stream1> 286 * ..... 287 * acc_linear_evm_1_15 : <Pilot62, stream0>, <Pilot62, stream1>, 288 * <Pilot63, stream0>, <Pilot63, stream1> ... 289 */ 290 291 for (istream = 0; istream < nss_count; istream++) { 292 segment = HAL_RX_EVM_DEMF_SEGMENT_SIZE * (istream / HAL_RX_EVM_DEMF_MAX_STREAMS); 293 pilot_ptr = (uint8_t *)rx_tlv + segment; 294 for (ipilot = 0; ipilot < pilot_count; ipilot++) { 295 /* In case there is one stream in Demf segment, 296 * pilots are one after the other 297 */ 298 if (nss_count == 1 || 299 ((nss_count == HAL_RX_EVM_DEMF_MAX_STREAMS + 1) && 300 (istream == HAL_RX_EVM_DEMF_MAX_STREAMS))) 301 pilot_shift = ipilot; 302 /* In case there are more than one stream in DemF 303 * segment, pilot 0 of all streams come one after the 304 * other before pilot 1 305 */ 306 else 307 pilot_shift = (ipilot * HAL_RX_EVM_DEMF_MAX_STREAMS) 308 + (istream % HAL_RX_EVM_DEMF_MAX_STREAMS); 309 310 ppdu_info->evm_info.pilot_evm[segment + pilot_shift] = 311 *(pilot_ptr + pilot_shift); 312 } 313 } 314 } 315 316 /** 317 * hal_rx_proc_phyrx_other_receive_info_tlv_9224() - API to get tlv info 318 * @rx_tlv_hdr: RX TLV header 319 * @ppdu_info_hdl: Handle to PPDU info to update 320 * 321 * Return: None 322 */ 323 static inline 324 void hal_rx_proc_phyrx_other_receive_info_tlv_9224(void *rx_tlv_hdr, 325 void *ppdu_info_hdl) 326 { 327 uint32_t tlv_len, tlv_tag; 328 void *rx_tlv; 329 struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl; 330 331 tlv_len = HAL_RX_GET_USER_TLV64_LEN(rx_tlv_hdr); 332 rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV64_HDR_SIZE; 333 334 if (!tlv_len) 335 return; 336 337 tlv_tag = HAL_RX_GET_USER_TLV64_TYPE(rx_tlv); 338 tlv_len = HAL_RX_GET_USER_TLV64_LEN(rx_tlv); 339 340 if (!tlv_len) 341 return; 342 343 switch (tlv_tag) { 344 case WIFIPHYRX_OTHER_RECEIVE_INFO_EVM_DETAILS_E: 345 /* Skip TLV length to get TLV content */ 346 rx_tlv = (uint8_t *)rx_tlv + HAL_RX_TLV64_HDR_SIZE; 347 ppdu_info->evm_info.number_of_symbols = HAL_RX_GET(rx_tlv, 348 PHYRX_OTHER_RECEIVE_INFO, 349 EVM_DETAILS_NUMBER_OF_DATA_SYM); 350 ppdu_info->evm_info.pilot_count = HAL_RX_GET(rx_tlv, 351 PHYRX_OTHER_RECEIVE_INFO, 352 EVM_DETAILS_NUMBER_OF_PILOTS); 353 ppdu_info->evm_info.nss_count = HAL_RX_GET(rx_tlv, 354 PHYRX_OTHER_RECEIVE_INFO, 355 EVM_DETAILS_NUMBER_OF_STREAMS); 356 hal_rx_update_su_evm_info(rx_tlv, ppdu_info_hdl); 357 break; 358 default: 359 QDF_TRACE(QDF_MODULE_ID_HAL, QDF_TRACE_LEVEL_DEBUG, 360 "%s unhandled TLV type: %d, TLV len:%d", 361 __func__, tlv_tag, tlv_len); 362 break; 363 } 364 } 365 366 #else 367 /** 368 * hal_rx_proc_phyrx_other_receive_info_tlv_9224() - API to get tlv info 369 * @rx_tlv_hdr: RX TLV header 370 * @ppdu_info_hdl: Handle to PPDU info to update 371 * 372 * Return: None 373 */ 374 static inline 375 void hal_rx_proc_phyrx_other_receive_info_tlv_9224(void *rx_tlv_hdr, 376 void *ppdu_info_hdl) 377 { 378 } 379 #endif /* WLAN_SA_API_ENABLE && QCA_WIFI_QCA9574 */ 380 381 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) 382 static inline 383 void hal_rx_get_bb_info_9224(void *rx_tlv, void *ppdu_info_hdl) 384 { 385 struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl; 386 387 ppdu_info->cfr_info.bb_captured_channel = 388 HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_CHANNEL); 389 390 ppdu_info->cfr_info.bb_captured_timeout = 391 HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_TIMEOUT); 392 393 ppdu_info->cfr_info.bb_captured_reason = 394 HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_REASON); 395 } 396 397 static inline 398 void hal_rx_get_rtt_info_9224(void *rx_tlv, void *ppdu_info_hdl) 399 { 400 struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl; 401 402 ppdu_info->cfr_info.rx_location_info_valid = 403 HAL_RX_GET_64(rx_tlv, PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 404 RX_LOCATION_INFO_VALID); 405 406 ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 = 407 HAL_RX_GET_64(rx_tlv, 408 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 409 RTT_CHE_BUFFER_POINTER_LOW32); 410 411 ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 = 412 HAL_RX_GET_64(rx_tlv, 413 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 414 RTT_CHE_BUFFER_POINTER_HIGH8); 415 416 ppdu_info->cfr_info.chan_capture_status = 417 HAL_GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv); 418 419 ppdu_info->cfr_info.rx_start_ts = 420 HAL_RX_GET_64(rx_tlv, 421 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 422 RX_START_TS); 423 424 ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t) 425 HAL_RX_GET_64(rx_tlv, 426 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 427 RTT_CFO_MEASUREMENT); 428 429 ppdu_info->cfr_info.agc_gain_info0 = 430 HAL_RX_GET_64(rx_tlv, 431 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 432 GAIN_CHAIN0); 433 434 ppdu_info->cfr_info.agc_gain_info0 |= 435 (((uint32_t)HAL_RX_GET_64(rx_tlv, 436 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 437 GAIN_CHAIN1)) << 16); 438 439 ppdu_info->cfr_info.agc_gain_info1 = 440 HAL_RX_GET_64(rx_tlv, 441 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 442 GAIN_CHAIN2); 443 444 ppdu_info->cfr_info.agc_gain_info1 |= 445 (((uint32_t)HAL_RX_GET_64(rx_tlv, 446 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 447 GAIN_CHAIN3)) << 16); 448 449 ppdu_info->cfr_info.agc_gain_info2 = 0; 450 451 ppdu_info->cfr_info.agc_gain_info3 = 0; 452 453 ppdu_info->cfr_info.mcs_rate = 454 HAL_RX_GET_64(rx_tlv, 455 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 456 RTT_MCS_RATE); 457 ppdu_info->cfr_info.gi_type = 458 HAL_RX_GET_64(rx_tlv, 459 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 460 RTT_GI_TYPE); 461 } 462 #endif 463 464 #ifdef CONFIG_WORD_BASED_TLV 465 /** 466 * hal_rx_dump_mpdu_start_tlv_9224() - dump RX mpdu_start TLV in structured 467 * human readable format. 468 * @mpdustart: pointer the rx_attention TLV in pkt. 469 * @dbg_level: log level. 470 * 471 * Return: void 472 */ 473 static inline void hal_rx_dump_mpdu_start_tlv_9224(void *mpdustart, 474 uint8_t dbg_level) 475 { 476 struct rx_mpdu_start_compact *mpdu_info = 477 (struct rx_mpdu_start_compact *)mpdustart; 478 479 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 480 "rx_mpdu_start tlv (1/5) - " 481 "rx_reo_queue_desc_addr_39_32 :%x" 482 "receive_queue_number:%x " 483 "pre_delim_err_warning:%x " 484 "first_delim_err:%x " 485 "pn_31_0:%x " 486 "pn_63_32:%x " 487 "pn_95_64:%x ", 488 mpdu_info->rx_reo_queue_desc_addr_39_32, 489 mpdu_info->receive_queue_number, 490 mpdu_info->pre_delim_err_warning, 491 mpdu_info->first_delim_err, 492 mpdu_info->pn_31_0, 493 mpdu_info->pn_63_32, 494 mpdu_info->pn_95_64); 495 496 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 497 "rx_mpdu_start tlv (2/5) - " 498 "ast_index:%x " 499 "sw_peer_id:%x " 500 "mpdu_frame_control_valid:%x " 501 "mpdu_duration_valid:%x " 502 "mac_addr_ad1_valid:%x " 503 "mac_addr_ad2_valid:%x " 504 "mac_addr_ad3_valid:%x " 505 "mac_addr_ad4_valid:%x " 506 "mpdu_sequence_control_valid :%x" 507 "mpdu_qos_control_valid:%x " 508 "mpdu_ht_control_valid:%x " 509 "frame_encryption_info_valid :%x", 510 mpdu_info->ast_index, 511 mpdu_info->sw_peer_id, 512 mpdu_info->mpdu_frame_control_valid, 513 mpdu_info->mpdu_duration_valid, 514 mpdu_info->mac_addr_ad1_valid, 515 mpdu_info->mac_addr_ad2_valid, 516 mpdu_info->mac_addr_ad3_valid, 517 mpdu_info->mac_addr_ad4_valid, 518 mpdu_info->mpdu_sequence_control_valid, 519 mpdu_info->mpdu_qos_control_valid, 520 mpdu_info->mpdu_ht_control_valid, 521 mpdu_info->frame_encryption_info_valid); 522 523 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 524 "rx_mpdu_start tlv (3/5) - " 525 "mpdu_fragment_number:%x " 526 "more_fragment_flag:%x " 527 "fr_ds:%x " 528 "to_ds:%x " 529 "encrypted:%x " 530 "mpdu_retry:%x " 531 "mpdu_sequence_number:%x ", 532 mpdu_info->mpdu_fragment_number, 533 mpdu_info->more_fragment_flag, 534 mpdu_info->fr_ds, 535 mpdu_info->to_ds, 536 mpdu_info->encrypted, 537 mpdu_info->mpdu_retry, 538 mpdu_info->mpdu_sequence_number); 539 540 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 541 "rx_mpdu_start tlv (4/5) - " 542 "mpdu_frame_control_field:%x " 543 "mpdu_duration_field:%x ", 544 mpdu_info->mpdu_frame_control_field, 545 mpdu_info->mpdu_duration_field); 546 547 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 548 "rx_mpdu_start tlv (5/5) - " 549 "mac_addr_ad1_31_0:%x " 550 "mac_addr_ad1_47_32:%x " 551 "mac_addr_ad2_15_0:%x " 552 "mac_addr_ad2_47_16:%x " 553 "mac_addr_ad3_31_0:%x " 554 "mac_addr_ad3_47_32:%x " 555 "mpdu_sequence_control_field :%x", 556 mpdu_info->mac_addr_ad1_31_0, 557 mpdu_info->mac_addr_ad1_47_32, 558 mpdu_info->mac_addr_ad2_15_0, 559 mpdu_info->mac_addr_ad2_47_16, 560 mpdu_info->mac_addr_ad3_31_0, 561 mpdu_info->mac_addr_ad3_47_32, 562 mpdu_info->mpdu_sequence_control_field); 563 } 564 565 /** 566 * hal_rx_dump_msdu_end_tlv_9224() - dump RX msdu_end TLV in structured human 567 * readable format. 568 * @msduend: pointer the msdu_end TLV in pkt. 569 * @dbg_level: log level. 570 * 571 * Return: void 572 */ 573 static void hal_rx_dump_msdu_end_tlv_9224(void *msduend, 574 uint8_t dbg_level) 575 { 576 struct rx_msdu_end_compact *msdu_end = 577 (struct rx_msdu_end_compact *)msduend; 578 579 QDF_TRACE(QDF_MODULE_ID_DP, dbg_level, 580 "rx_msdu_end tlv - " 581 "key_id_octet: %d " 582 "tcp_udp_chksum: %d " 583 "sa_idx_timeout: %d " 584 "da_idx_timeout: %d " 585 "msdu_limit_error: %d " 586 "flow_idx_timeout: %d " 587 "flow_idx_invalid: %d " 588 "wifi_parser_error: %d " 589 "sa_is_valid: %d " 590 "da_is_valid: %d " 591 "da_is_mcbc: %d " 592 "tkip_mic_err: %d " 593 "l3_header_padding: %d " 594 "first_msdu: %d " 595 "last_msdu: %d " 596 "sa_idx: %d " 597 "msdu_drop: %d " 598 "reo_destination_indication: %d " 599 "flow_idx: %d " 600 "fse_metadata: %d " 601 "cce_metadata: %d " 602 "sa_sw_peer_id: %d ", 603 msdu_end->key_id_octet, 604 msdu_end->tcp_udp_chksum, 605 msdu_end->sa_idx_timeout, 606 msdu_end->da_idx_timeout, 607 msdu_end->msdu_limit_error, 608 msdu_end->flow_idx_timeout, 609 msdu_end->flow_idx_invalid, 610 msdu_end->wifi_parser_error, 611 msdu_end->sa_is_valid, 612 msdu_end->da_is_valid, 613 msdu_end->da_is_mcbc, 614 msdu_end->tkip_mic_err, 615 msdu_end->l3_header_padding, 616 msdu_end->first_msdu, 617 msdu_end->last_msdu, 618 msdu_end->sa_idx, 619 msdu_end->msdu_drop, 620 msdu_end->reo_destination_indication, 621 msdu_end->flow_idx, 622 msdu_end->fse_metadata, 623 msdu_end->cce_metadata, 624 msdu_end->sa_sw_peer_id); 625 } 626 #else 627 static inline void hal_rx_dump_mpdu_start_tlv_9224(void *mpdustart, 628 uint8_t dbg_level) 629 { 630 struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart; 631 struct rx_mpdu_info *mpdu_info = 632 (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details; 633 634 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 635 "rx_mpdu_start tlv (1/5) - " 636 "rx_reo_queue_desc_addr_31_0 :%x" 637 "rx_reo_queue_desc_addr_39_32 :%x" 638 "receive_queue_number:%x " 639 "pre_delim_err_warning:%x " 640 "first_delim_err:%x " 641 "reserved_2a:%x " 642 "pn_31_0:%x " 643 "pn_63_32:%x " 644 "pn_95_64:%x " 645 "pn_127_96:%x " 646 "epd_en:%x " 647 "all_frames_shall_be_encrypted :%x" 648 "encrypt_type:%x " 649 "wep_key_width_for_variable_key :%x" 650 "mesh_sta:%x " 651 "bssid_hit:%x " 652 "bssid_number:%x " 653 "tid:%x " 654 "reserved_7a:%x ", 655 mpdu_info->rx_reo_queue_desc_addr_31_0, 656 mpdu_info->rx_reo_queue_desc_addr_39_32, 657 mpdu_info->receive_queue_number, 658 mpdu_info->pre_delim_err_warning, 659 mpdu_info->first_delim_err, 660 mpdu_info->reserved_2a, 661 mpdu_info->pn_31_0, 662 mpdu_info->pn_63_32, 663 mpdu_info->pn_95_64, 664 mpdu_info->pn_127_96, 665 mpdu_info->epd_en, 666 mpdu_info->all_frames_shall_be_encrypted, 667 mpdu_info->encrypt_type, 668 mpdu_info->wep_key_width_for_variable_key, 669 mpdu_info->mesh_sta, 670 mpdu_info->bssid_hit, 671 mpdu_info->bssid_number, 672 mpdu_info->tid, 673 mpdu_info->reserved_7a); 674 675 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 676 "rx_mpdu_start tlv (2/5) - " 677 "ast_index:%x " 678 "sw_peer_id:%x " 679 "mpdu_frame_control_valid:%x " 680 "mpdu_duration_valid:%x " 681 "mac_addr_ad1_valid:%x " 682 "mac_addr_ad2_valid:%x " 683 "mac_addr_ad3_valid:%x " 684 "mac_addr_ad4_valid:%x " 685 "mpdu_sequence_control_valid :%x" 686 "mpdu_qos_control_valid:%x " 687 "mpdu_ht_control_valid:%x " 688 "frame_encryption_info_valid :%x", 689 mpdu_info->ast_index, 690 mpdu_info->sw_peer_id, 691 mpdu_info->mpdu_frame_control_valid, 692 mpdu_info->mpdu_duration_valid, 693 mpdu_info->mac_addr_ad1_valid, 694 mpdu_info->mac_addr_ad2_valid, 695 mpdu_info->mac_addr_ad3_valid, 696 mpdu_info->mac_addr_ad4_valid, 697 mpdu_info->mpdu_sequence_control_valid, 698 mpdu_info->mpdu_qos_control_valid, 699 mpdu_info->mpdu_ht_control_valid, 700 mpdu_info->frame_encryption_info_valid); 701 702 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 703 "rx_mpdu_start tlv (3/5) - " 704 "mpdu_fragment_number:%x " 705 "more_fragment_flag:%x " 706 "reserved_11a:%x " 707 "fr_ds:%x " 708 "to_ds:%x " 709 "encrypted:%x " 710 "mpdu_retry:%x " 711 "mpdu_sequence_number:%x ", 712 mpdu_info->mpdu_fragment_number, 713 mpdu_info->more_fragment_flag, 714 mpdu_info->reserved_11a, 715 mpdu_info->fr_ds, 716 mpdu_info->to_ds, 717 mpdu_info->encrypted, 718 mpdu_info->mpdu_retry, 719 mpdu_info->mpdu_sequence_number); 720 721 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 722 "rx_mpdu_start tlv (4/5) - " 723 "mpdu_frame_control_field:%x " 724 "mpdu_duration_field:%x ", 725 mpdu_info->mpdu_frame_control_field, 726 mpdu_info->mpdu_duration_field); 727 728 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 729 "rx_mpdu_start tlv (5/5) - " 730 "mac_addr_ad1_31_0:%x " 731 "mac_addr_ad1_47_32:%x " 732 "mac_addr_ad2_15_0:%x " 733 "mac_addr_ad2_47_16:%x " 734 "mac_addr_ad3_31_0:%x " 735 "mac_addr_ad3_47_32:%x " 736 "mpdu_sequence_control_field :%x" 737 "mac_addr_ad4_31_0:%x " 738 "mac_addr_ad4_47_32:%x " 739 "mpdu_qos_control_field:%x ", 740 mpdu_info->mac_addr_ad1_31_0, 741 mpdu_info->mac_addr_ad1_47_32, 742 mpdu_info->mac_addr_ad2_15_0, 743 mpdu_info->mac_addr_ad2_47_16, 744 mpdu_info->mac_addr_ad3_31_0, 745 mpdu_info->mac_addr_ad3_47_32, 746 mpdu_info->mpdu_sequence_control_field, 747 mpdu_info->mac_addr_ad4_31_0, 748 mpdu_info->mac_addr_ad4_47_32, 749 mpdu_info->mpdu_qos_control_field); 750 } 751 752 static void hal_rx_dump_msdu_end_tlv_9224(void *msduend, 753 uint8_t dbg_level) 754 { 755 struct rx_msdu_end *msdu_end = 756 (struct rx_msdu_end *)msduend; 757 758 QDF_TRACE(QDF_MODULE_ID_DP, dbg_level, 759 "rx_msdu_end tlv - " 760 "key_id_octet: %d " 761 "cce_super_rule: %d " 762 "cce_classify_not_done_truncat: %d " 763 "cce_classify_not_done_cce_dis: %d " 764 "rule_indication_31_0: %d " 765 "tcp_udp_chksum: %d " 766 "sa_idx_timeout: %d " 767 "da_idx_timeout: %d " 768 "msdu_limit_error: %d " 769 "flow_idx_timeout: %d " 770 "flow_idx_invalid: %d " 771 "wifi_parser_error: %d " 772 "sa_is_valid: %d " 773 "da_is_valid: %d " 774 "da_is_mcbc: %d " 775 "tkip_mic_err: %d " 776 "l3_header_padding: %d " 777 "first_msdu: %d " 778 "last_msdu: %d " 779 "sa_idx: %d " 780 "msdu_drop: %d " 781 "reo_destination_indication: %d " 782 "flow_idx: %d " 783 "fse_metadata: %d " 784 "cce_metadata: %d " 785 "sa_sw_peer_id: %d ", 786 msdu_end->key_id_octet, 787 msdu_end->cce_super_rule, 788 msdu_end->cce_classify_not_done_truncate, 789 msdu_end->cce_classify_not_done_cce_dis, 790 msdu_end->rule_indication_31_0, 791 msdu_end->tcp_udp_chksum, 792 msdu_end->sa_idx_timeout, 793 msdu_end->da_idx_timeout, 794 msdu_end->msdu_limit_error, 795 msdu_end->flow_idx_timeout, 796 msdu_end->flow_idx_invalid, 797 msdu_end->wifi_parser_error, 798 msdu_end->sa_is_valid, 799 msdu_end->da_is_valid, 800 msdu_end->da_is_mcbc, 801 msdu_end->tkip_mic_err, 802 msdu_end->l3_header_padding, 803 msdu_end->first_msdu, 804 msdu_end->last_msdu, 805 msdu_end->sa_idx, 806 msdu_end->msdu_drop, 807 msdu_end->reo_destination_indication, 808 msdu_end->flow_idx, 809 msdu_end->fse_metadata, 810 msdu_end->cce_metadata, 811 msdu_end->sa_sw_peer_id); 812 } 813 #endif 814 815 /** 816 * hal_reo_status_get_header_9224() - Process reo desc info 817 * @ring_desc: Pointer to reo descriptor 818 * @b: tlv type info 819 * @h1: Pointer to hal_reo_status_header where info to be stored 820 * 821 * Return: none. 822 * 823 */ 824 static void hal_reo_status_get_header_9224(hal_ring_desc_t ring_desc, 825 int b, void *h1) 826 { 827 uint64_t *d = (uint64_t *)ring_desc; 828 uint64_t val1 = 0; 829 struct hal_reo_status_header *h = 830 (struct hal_reo_status_header *)h1; 831 832 /* Offsets of descriptor fields defined in HW headers start 833 * from the field after TLV header 834 */ 835 d += HAL_GET_NUM_QWORDS(sizeof(struct tlv_32_hdr)); 836 837 switch (b) { 838 case HAL_REO_QUEUE_STATS_STATUS_TLV: 839 val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS, 840 STATUS_HEADER_REO_STATUS_NUMBER)]; 841 break; 842 case HAL_REO_FLUSH_QUEUE_STATUS_TLV: 843 val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS, 844 STATUS_HEADER_REO_STATUS_NUMBER)]; 845 break; 846 case HAL_REO_FLUSH_CACHE_STATUS_TLV: 847 val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS, 848 STATUS_HEADER_REO_STATUS_NUMBER)]; 849 break; 850 case HAL_REO_UNBLK_CACHE_STATUS_TLV: 851 val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS, 852 STATUS_HEADER_REO_STATUS_NUMBER)]; 853 break; 854 case HAL_REO_TIMOUT_LIST_STATUS_TLV: 855 val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS, 856 STATUS_HEADER_REO_STATUS_NUMBER)]; 857 break; 858 case HAL_REO_DESC_THRES_STATUS_TLV: 859 val1 = 860 d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS, 861 STATUS_HEADER_REO_STATUS_NUMBER)]; 862 break; 863 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV: 864 val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS, 865 STATUS_HEADER_REO_STATUS_NUMBER)]; 866 break; 867 default: 868 qdf_nofl_err("ERROR: Unknown tlv\n"); 869 break; 870 } 871 h->cmd_num = 872 HAL_GET_FIELD( 873 UNIFORM_REO_STATUS_HEADER, REO_STATUS_NUMBER, 874 val1); 875 h->exec_time = 876 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, 877 CMD_EXECUTION_TIME, val1); 878 h->status = 879 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, 880 REO_CMD_EXECUTION_STATUS, val1); 881 switch (b) { 882 case HAL_REO_QUEUE_STATS_STATUS_TLV: 883 val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS, 884 STATUS_HEADER_TIMESTAMP)]; 885 break; 886 case HAL_REO_FLUSH_QUEUE_STATUS_TLV: 887 val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS, 888 STATUS_HEADER_TIMESTAMP)]; 889 break; 890 case HAL_REO_FLUSH_CACHE_STATUS_TLV: 891 val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS, 892 STATUS_HEADER_TIMESTAMP)]; 893 break; 894 case HAL_REO_UNBLK_CACHE_STATUS_TLV: 895 val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS, 896 STATUS_HEADER_TIMESTAMP)]; 897 break; 898 case HAL_REO_TIMOUT_LIST_STATUS_TLV: 899 val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS, 900 STATUS_HEADER_TIMESTAMP)]; 901 break; 902 case HAL_REO_DESC_THRES_STATUS_TLV: 903 val1 = 904 d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS, 905 STATUS_HEADER_TIMESTAMP)]; 906 break; 907 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV: 908 val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS, 909 STATUS_HEADER_TIMESTAMP)]; 910 break; 911 default: 912 qdf_nofl_err("ERROR: Unknown tlv\n"); 913 break; 914 } 915 h->tstamp = 916 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, TIMESTAMP, val1); 917 } 918 919 static 920 void *hal_rx_msdu0_buffer_addr_lsb_9224(void *link_desc_va) 921 { 922 return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va); 923 } 924 925 static 926 void *hal_rx_msdu_desc_info_ptr_get_9224(void *msdu0) 927 { 928 return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0); 929 } 930 931 static 932 void *hal_ent_mpdu_desc_info_9224(void *ent_ring_desc) 933 { 934 return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc); 935 } 936 937 static 938 void *hal_dst_mpdu_desc_info_9224(void *dst_ring_desc) 939 { 940 return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc); 941 } 942 943 /** 944 * hal_reo_config_9224() - Set reo config parameters 945 * @soc: hal soc handle 946 * @reg_val: value to be set 947 * @reo_params: reo parameters 948 * 949 * Return: void 950 */ 951 static void 952 hal_reo_config_9224(struct hal_soc *soc, 953 uint32_t reg_val, 954 struct hal_reo_params *reo_params) 955 { 956 HAL_REO_R0_CONFIG(soc, reg_val, reo_params); 957 } 958 959 /** 960 * hal_rx_msdu_desc_info_get_ptr_9224() - Get msdu desc info ptr 961 * @msdu_details_ptr: Pointer to msdu_details_ptr 962 * 963 * Return: Pointer to rx_msdu_desc_info structure. 964 * 965 */ 966 static void *hal_rx_msdu_desc_info_get_ptr_9224(void *msdu_details_ptr) 967 { 968 return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr); 969 } 970 971 /** 972 * hal_rx_link_desc_msdu0_ptr_9224() - Get pointer to rx_msdu details 973 * @link_desc: Pointer to link desc 974 * 975 * Return: Pointer to rx_msdu_details structure 976 * 977 */ 978 static void *hal_rx_link_desc_msdu0_ptr_9224(void *link_desc) 979 { 980 return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc); 981 } 982 983 /** 984 * hal_get_window_address_9224() - Function to get hp/tp address 985 * @hal_soc: Pointer to hal_soc 986 * @addr: address offset of register 987 * 988 * Return: modified address offset of register 989 */ 990 991 static inline qdf_iomem_t hal_get_window_address_9224(struct hal_soc *hal_soc, 992 qdf_iomem_t addr) 993 { 994 uint32_t offset = addr - hal_soc->dev_base_addr; 995 qdf_iomem_t new_offset; 996 997 /* 998 * If offset lies within DP register range, use 3rd window to write 999 * into DP region. 1000 */ 1001 if ((offset ^ UMAC_BASE) < WINDOW_RANGE_MASK) { 1002 new_offset = (hal_soc->dev_base_addr + (3 * WINDOW_START) + 1003 (offset & WINDOW_RANGE_MASK)); 1004 /* 1005 * If offset lies within CE register range, use 2nd window to write 1006 * into CE region. 1007 */ 1008 } else if ((offset ^ CE_WFSS_CE_REG_BASE) < WINDOW_RANGE_MASK) { 1009 new_offset = (hal_soc->dev_base_addr + (2 * WINDOW_START) + 1010 (offset & WINDOW_RANGE_MASK)); 1011 } else { 1012 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1013 "%s: ERROR: Accessing Wrong register\n", __func__); 1014 qdf_assert_always(0); 1015 return 0; 1016 } 1017 return new_offset; 1018 } 1019 1020 static inline void hal_write_window_register(struct hal_soc *hal_soc) 1021 { 1022 /* Write value into window configuration register */ 1023 qdf_iowrite32(hal_soc->dev_base_addr + WINDOW_REG_ADDRESS, 1024 WINDOW_CONFIGURATION_VALUE_9224); 1025 } 1026 1027 static 1028 void hal_compute_reo_remap_ix2_ix3_9224(uint32_t *ring, uint32_t num_rings, 1029 uint32_t *remap1, uint32_t *remap2) 1030 { 1031 switch (num_rings) { 1032 case 1: 1033 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 1034 HAL_REO_REMAP_IX2(ring[0], 17) | 1035 HAL_REO_REMAP_IX2(ring[0], 18) | 1036 HAL_REO_REMAP_IX2(ring[0], 19) | 1037 HAL_REO_REMAP_IX2(ring[0], 20) | 1038 HAL_REO_REMAP_IX2(ring[0], 21) | 1039 HAL_REO_REMAP_IX2(ring[0], 22) | 1040 HAL_REO_REMAP_IX2(ring[0], 23); 1041 1042 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 1043 HAL_REO_REMAP_IX3(ring[0], 25) | 1044 HAL_REO_REMAP_IX3(ring[0], 26) | 1045 HAL_REO_REMAP_IX3(ring[0], 27) | 1046 HAL_REO_REMAP_IX3(ring[0], 28) | 1047 HAL_REO_REMAP_IX3(ring[0], 29) | 1048 HAL_REO_REMAP_IX3(ring[0], 30) | 1049 HAL_REO_REMAP_IX3(ring[0], 31); 1050 break; 1051 case 2: 1052 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 1053 HAL_REO_REMAP_IX2(ring[0], 17) | 1054 HAL_REO_REMAP_IX2(ring[1], 18) | 1055 HAL_REO_REMAP_IX2(ring[1], 19) | 1056 HAL_REO_REMAP_IX2(ring[0], 20) | 1057 HAL_REO_REMAP_IX2(ring[0], 21) | 1058 HAL_REO_REMAP_IX2(ring[1], 22) | 1059 HAL_REO_REMAP_IX2(ring[1], 23); 1060 1061 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 1062 HAL_REO_REMAP_IX3(ring[0], 25) | 1063 HAL_REO_REMAP_IX3(ring[1], 26) | 1064 HAL_REO_REMAP_IX3(ring[1], 27) | 1065 HAL_REO_REMAP_IX3(ring[0], 28) | 1066 HAL_REO_REMAP_IX3(ring[0], 29) | 1067 HAL_REO_REMAP_IX3(ring[1], 30) | 1068 HAL_REO_REMAP_IX3(ring[1], 31); 1069 break; 1070 case 3: 1071 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 1072 HAL_REO_REMAP_IX2(ring[1], 17) | 1073 HAL_REO_REMAP_IX2(ring[2], 18) | 1074 HAL_REO_REMAP_IX2(ring[0], 19) | 1075 HAL_REO_REMAP_IX2(ring[1], 20) | 1076 HAL_REO_REMAP_IX2(ring[2], 21) | 1077 HAL_REO_REMAP_IX2(ring[0], 22) | 1078 HAL_REO_REMAP_IX2(ring[1], 23); 1079 1080 *remap2 = HAL_REO_REMAP_IX3(ring[2], 24) | 1081 HAL_REO_REMAP_IX3(ring[0], 25) | 1082 HAL_REO_REMAP_IX3(ring[1], 26) | 1083 HAL_REO_REMAP_IX3(ring[2], 27) | 1084 HAL_REO_REMAP_IX3(ring[0], 28) | 1085 HAL_REO_REMAP_IX3(ring[1], 29) | 1086 HAL_REO_REMAP_IX3(ring[2], 30) | 1087 HAL_REO_REMAP_IX3(ring[0], 31); 1088 break; 1089 case 4: 1090 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 1091 HAL_REO_REMAP_IX2(ring[1], 17) | 1092 HAL_REO_REMAP_IX2(ring[2], 18) | 1093 HAL_REO_REMAP_IX2(ring[3], 19) | 1094 HAL_REO_REMAP_IX2(ring[0], 20) | 1095 HAL_REO_REMAP_IX2(ring[1], 21) | 1096 HAL_REO_REMAP_IX2(ring[2], 22) | 1097 HAL_REO_REMAP_IX2(ring[3], 23); 1098 1099 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 1100 HAL_REO_REMAP_IX3(ring[1], 25) | 1101 HAL_REO_REMAP_IX3(ring[2], 26) | 1102 HAL_REO_REMAP_IX3(ring[3], 27) | 1103 HAL_REO_REMAP_IX3(ring[0], 28) | 1104 HAL_REO_REMAP_IX3(ring[1], 29) | 1105 HAL_REO_REMAP_IX3(ring[2], 30) | 1106 HAL_REO_REMAP_IX3(ring[3], 31); 1107 break; 1108 } 1109 } 1110 1111 static 1112 void hal_compute_reo_remap_ix0_9224(struct hal_soc *soc) 1113 { 1114 uint32_t remap0; 1115 1116 remap0 = HAL_REG_READ(soc, HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR 1117 (REO_REG_REG_BASE)); 1118 1119 remap0 &= ~(HAL_REO_REMAP_IX0(0xF, 6)); 1120 remap0 |= HAL_REO_REMAP_IX0(REO2PPE_DST_RING, 6); 1121 1122 HAL_REG_WRITE(soc, HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR 1123 (REO_REG_REG_BASE), remap0); 1124 1125 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR 0x%x", 1126 HAL_REG_READ(soc, HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR 1127 (REO_REG_REG_BASE))); 1128 } 1129 1130 /** 1131 * hal_rx_flow_setup_fse_9224() - Setup a flow search entry in HW FST 1132 * @rx_fst: Pointer to the Rx Flow Search Table 1133 * @table_offset: offset into the table where the flow is to be setup 1134 * @rx_flow: Flow Parameters 1135 * 1136 * Return: Success/Failure 1137 */ 1138 static void * 1139 hal_rx_flow_setup_fse_9224(uint8_t *rx_fst, uint32_t table_offset, 1140 uint8_t *rx_flow) 1141 { 1142 struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst; 1143 struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow; 1144 uint8_t *fse; 1145 bool fse_valid; 1146 1147 if (table_offset >= fst->max_entries) { 1148 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, 1149 "HAL FSE table offset %u exceeds max entries %u", 1150 table_offset, fst->max_entries); 1151 return NULL; 1152 } 1153 1154 fse = (uint8_t *)fst->base_vaddr + 1155 (table_offset * HAL_RX_FST_ENTRY_SIZE); 1156 1157 fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID); 1158 1159 if (fse_valid) { 1160 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, 1161 "HAL FSE %pK already valid", fse); 1162 return NULL; 1163 } 1164 1165 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96) = 1166 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96, 1167 qdf_htonl(flow->tuple_info.src_ip_127_96)); 1168 1169 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64) = 1170 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64, 1171 qdf_htonl(flow->tuple_info.src_ip_95_64)); 1172 1173 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32) = 1174 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32, 1175 qdf_htonl(flow->tuple_info.src_ip_63_32)); 1176 1177 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0) = 1178 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0, 1179 qdf_htonl(flow->tuple_info.src_ip_31_0)); 1180 1181 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96) = 1182 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96, 1183 qdf_htonl(flow->tuple_info.dest_ip_127_96)); 1184 1185 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64) = 1186 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64, 1187 qdf_htonl(flow->tuple_info.dest_ip_95_64)); 1188 1189 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32) = 1190 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32, 1191 qdf_htonl(flow->tuple_info.dest_ip_63_32)); 1192 1193 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0) = 1194 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0, 1195 qdf_htonl(flow->tuple_info.dest_ip_31_0)); 1196 1197 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT); 1198 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT) |= 1199 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT, 1200 (flow->tuple_info.dest_port)); 1201 1202 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT); 1203 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT) |= 1204 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT, 1205 (flow->tuple_info.src_port)); 1206 1207 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL); 1208 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL) |= 1209 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL, 1210 flow->tuple_info.l4_protocol); 1211 1212 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, USE_PPE); 1213 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, USE_PPE) |= 1214 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, USE_PPE, flow->use_ppe_ds); 1215 1216 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, PRIORITY_VALID); 1217 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, PRIORITY_VALID) |= 1218 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, PRIORITY_VALID, 1219 flow->priority_vld); 1220 1221 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SERVICE_CODE); 1222 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SERVICE_CODE) |= 1223 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SERVICE_CODE, 1224 flow->service_code); 1225 1226 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER); 1227 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |= 1228 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER, 1229 flow->reo_destination_handler); 1230 1231 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID); 1232 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID) |= 1233 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1); 1234 1235 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA); 1236 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA) = 1237 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA, 1238 flow->fse_metadata); 1239 1240 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION); 1241 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION) |= 1242 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, 1243 REO_DESTINATION_INDICATION, 1244 flow->reo_destination_indication); 1245 1246 /* Reset all the other fields in FSE */ 1247 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, RESERVED_9); 1248 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_DROP); 1249 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_COUNT); 1250 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_BYTE_COUNT); 1251 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, TIMESTAMP); 1252 1253 return fse; 1254 } 1255 1256 /** 1257 * hal_rx_dump_pkt_hdr_tlv_9224() - dump RX pkt header TLV in hex format 1258 * @pkt_tlvs: pointer the pkt_hdr_tlv in pkt. 1259 * @dbg_level: log level. 1260 * 1261 * Return: void 1262 */ 1263 #ifndef NO_RX_PKT_HDR_TLV 1264 static inline void hal_rx_dump_pkt_hdr_tlv_9224(struct rx_pkt_tlvs *pkt_tlvs, 1265 uint8_t dbg_level) 1266 { 1267 struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv; 1268 1269 hal_verbose_debug("\n---------------\n" 1270 "rx_pkt_hdr_tlv\n" 1271 "---------------\n" 1272 "phy_ppdu_id %llu ", 1273 pkt_hdr_tlv->phy_ppdu_id); 1274 1275 hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr, 1276 sizeof(pkt_hdr_tlv->rx_pkt_hdr)); 1277 } 1278 #else 1279 static inline void hal_rx_dump_pkt_hdr_tlv_9224(struct rx_pkt_tlvs *pkt_tlvs, 1280 uint8_t dbg_level) 1281 { 1282 } 1283 #endif 1284 1285 /** 1286 * hal_tx_dump_ppe_vp_entry_9224() - API to print PPE VP entries 1287 * @hal_soc_hdl: HAL SoC handle 1288 * 1289 * Return: void 1290 */ 1291 static inline 1292 void hal_tx_dump_ppe_vp_entry_9224(hal_soc_handle_t hal_soc_hdl) 1293 { 1294 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl; 1295 uint32_t reg_addr, reg_val = 0, i; 1296 1297 for (i = 0; i < HAL_PPE_VP_ENTRIES_MAX; i++) { 1298 reg_addr = 1299 HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR( 1300 MAC_TCL_REG_REG_BASE, 1301 i); 1302 reg_val = HAL_REG_READ(soc, reg_addr); 1303 hal_verbose_debug("%d: 0x%x\n", i, reg_val); 1304 } 1305 } 1306 1307 /** 1308 * hal_rx_dump_pkt_tlvs_9224() - API to print RX Pkt TLVS QCN9224 1309 * @hal_soc_hdl: hal_soc handle 1310 * @buf: pointer the pkt buffer 1311 * @dbg_level: log level 1312 * 1313 * Return: void 1314 */ 1315 #ifdef CONFIG_WORD_BASED_TLV 1316 static void hal_rx_dump_pkt_tlvs_9224(hal_soc_handle_t hal_soc_hdl, 1317 uint8_t *buf, uint8_t dbg_level) 1318 { 1319 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1320 struct rx_msdu_end_compact *msdu_end = 1321 &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 1322 struct rx_mpdu_start_compact *mpdu_start = 1323 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 1324 1325 hal_rx_dump_msdu_end_tlv_9224(msdu_end, dbg_level); 1326 hal_rx_dump_mpdu_start_tlv_9224(mpdu_start, dbg_level); 1327 hal_rx_dump_pkt_hdr_tlv_9224(pkt_tlvs, dbg_level); 1328 } 1329 #else 1330 static void hal_rx_dump_pkt_tlvs_9224(hal_soc_handle_t hal_soc_hdl, 1331 uint8_t *buf, uint8_t dbg_level) 1332 { 1333 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1334 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 1335 struct rx_mpdu_start *mpdu_start = 1336 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 1337 1338 hal_rx_dump_msdu_end_tlv_9224(msdu_end, dbg_level); 1339 hal_rx_dump_mpdu_start_tlv_9224(mpdu_start, dbg_level); 1340 hal_rx_dump_pkt_hdr_tlv_9224(pkt_tlvs, dbg_level); 1341 } 1342 #endif 1343 1344 #define HAL_NUM_TCL_BANKS_9224 48 1345 1346 /** 1347 * hal_cmem_write_9224() - function for CMEM buffer writing 1348 * @hal_soc_hdl: HAL SOC handle 1349 * @offset: CMEM address 1350 * @value: value to write 1351 * 1352 * Return: None. 1353 */ 1354 static void hal_cmem_write_9224(hal_soc_handle_t hal_soc_hdl, 1355 uint32_t offset, 1356 uint32_t value) 1357 { 1358 struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl; 1359 1360 pld_reg_write(hal->qdf_dev->dev, offset, value, NULL); 1361 } 1362 1363 /** 1364 * hal_tx_get_num_tcl_banks_9224() - Get number of banks in target 1365 * 1366 * Return: number of bank 1367 */ 1368 static uint8_t hal_tx_get_num_tcl_banks_9224(void) 1369 { 1370 return HAL_NUM_TCL_BANKS_9224; 1371 } 1372 1373 static void hal_reo_setup_9224(struct hal_soc *soc, void *reoparams, 1374 int qref_reset) 1375 { 1376 uint32_t reg_val; 1377 struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams; 1378 1379 reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR( 1380 REO_REG_REG_BASE)); 1381 1382 hal_reo_config_9224(soc, reg_val, reo_params); 1383 /* Other ring enable bits and REO_ENABLE will be set by FW */ 1384 1385 /* TODO: Setup destination ring mapping if enabled */ 1386 1387 /* TODO: Error destination ring setting is left to default. 1388 * Default setting is to send all errors to release ring. 1389 */ 1390 1391 /* Set the reo descriptor swap bits in case of BIG endian platform */ 1392 hal_setup_reo_swap(soc); 1393 1394 HAL_REG_WRITE(soc, 1395 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(REO_REG_REG_BASE), 1396 HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000); 1397 1398 HAL_REG_WRITE(soc, 1399 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(REO_REG_REG_BASE), 1400 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 1401 1402 HAL_REG_WRITE(soc, 1403 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(REO_REG_REG_BASE), 1404 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 1405 1406 HAL_REG_WRITE(soc, 1407 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(REO_REG_REG_BASE), 1408 (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000)); 1409 1410 /* 1411 * When hash based routing is enabled, routing of the rx packet 1412 * is done based on the following value: 1 _ _ _ _ The last 4 1413 * bits are based on hash[3:0]. This means the possible values 1414 * are 0x10 to 0x1f. This value is used to look-up the 1415 * ring ID configured in Destination_Ring_Ctrl_IX_* register. 1416 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3 1417 * registers need to be configured to set-up the 16 entries to 1418 * map the hash values to a ring number. There are 3 bits per 1419 * hash entry which are mapped as follows: 1420 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI), 1421 * 7: NOT_USED. 1422 */ 1423 if (reo_params->rx_hash_enabled) { 1424 hal_compute_reo_remap_ix0_9224(soc); 1425 1426 HAL_REG_WRITE(soc, 1427 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR 1428 (REO_REG_REG_BASE), reo_params->remap0); 1429 1430 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x", 1431 HAL_REG_READ(soc, 1432 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR( 1433 REO_REG_REG_BASE))); 1434 1435 HAL_REG_WRITE(soc, 1436 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 1437 (REO_REG_REG_BASE), reo_params->remap1); 1438 1439 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x", 1440 HAL_REG_READ(soc, 1441 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR( 1442 REO_REG_REG_BASE))); 1443 1444 HAL_REG_WRITE(soc, 1445 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 1446 (REO_REG_REG_BASE), reo_params->remap2); 1447 1448 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x", 1449 HAL_REG_READ(soc, 1450 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR( 1451 REO_REG_REG_BASE))); 1452 } 1453 1454 /* TODO: Check if the following registers shoould be setup by host: 1455 * AGING_CONTROL 1456 * HIGH_MEMORY_THRESHOLD 1457 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2] 1458 * GLOBAL_LINK_DESC_COUNT_CTRL 1459 */ 1460 1461 soc->reo_qref = *reo_params->reo_qref; 1462 hal_reo_shared_qaddr_init((hal_soc_handle_t)soc, qref_reset); 1463 } 1464 1465 static uint16_t hal_get_rx_max_ba_window_qcn9224(int tid) 1466 { 1467 return HAL_RX_BA_WINDOW_1024; 1468 } 1469 1470 /** 1471 * hal_qcn9224_get_reo_qdesc_size() - Get the reo queue descriptor size from the 1472 * given Block-Ack window size 1473 * @ba_window_size: Block-Ack window size 1474 * @tid: Traffic id 1475 * 1476 * Return: reo queue descriptor size 1477 */ 1478 static uint32_t hal_qcn9224_get_reo_qdesc_size(uint32_t ba_window_size, int tid) 1479 { 1480 /* Hardcode the ba_window_size to HAL_RX_MAX_BA_WINDOW for 1481 * NON_QOS_TID until HW issues are resolved. 1482 */ 1483 if (tid != HAL_NON_QOS_TID) 1484 ba_window_size = hal_get_rx_max_ba_window_qcn9224(tid); 1485 1486 /* Return descriptor size corresponding to window size of 2 since 1487 * we set ba_window_size to 2 while setting up REO descriptors as 1488 * a WAR to get 2k jump exception aggregates are received without 1489 * a BA session. 1490 */ 1491 if (ba_window_size <= 1) { 1492 if (tid != HAL_NON_QOS_TID) 1493 return sizeof(struct rx_reo_queue) + 1494 sizeof(struct rx_reo_queue_ext); 1495 else 1496 return sizeof(struct rx_reo_queue); 1497 } 1498 1499 if (ba_window_size <= 105) 1500 return sizeof(struct rx_reo_queue) + 1501 sizeof(struct rx_reo_queue_ext); 1502 1503 if (ba_window_size <= 210) 1504 return sizeof(struct rx_reo_queue) + 1505 (2 * sizeof(struct rx_reo_queue_ext)); 1506 1507 if (ba_window_size <= 256) 1508 return sizeof(struct rx_reo_queue) + 1509 (3 * sizeof(struct rx_reo_queue_ext)); 1510 1511 return sizeof(struct rx_reo_queue) + 1512 (10 * sizeof(struct rx_reo_queue_ext)) + 1513 sizeof(struct rx_reo_queue_1k); 1514 } 1515 1516 /** 1517 * hal_tx_get_num_ppe_vp_tbl_entries_9224() - get number of PPE VP entries 1518 * @hal_soc_hdl: HAL SoC handle 1519 * 1520 * Return: Number of PPE VP entries 1521 */ 1522 static 1523 uint32_t hal_tx_get_num_ppe_vp_tbl_entries_9224(hal_soc_handle_t hal_soc_hdl) 1524 { 1525 return HAL_PPE_VP_ENTRIES_MAX; 1526 } 1527 1528 /** 1529 * hal_tx_get_num_ppe_vp_search_idx_reg_entries_9224() - get number of PPE VP 1530 * search index registers 1531 * @hal_soc_hdl: HAL SoC handle 1532 * 1533 * Return: Number of PPE VP search index registers 1534 */ 1535 static 1536 uint32_t hal_tx_get_num_ppe_vp_search_idx_reg_entries_9224(hal_soc_handle_t hal_soc_hdl) 1537 { 1538 return HAL_PPE_VP_SEARCH_IDX_REG_MAX; 1539 } 1540 1541 /** 1542 * hal_rx_tlv_msdu_done_copy_get_9224() - Get msdu done copy bit from rx_tlv 1543 * @buf: pointer the RX TLV 1544 * 1545 * Return: msdu done copy bit 1546 */ 1547 static inline uint32_t hal_rx_tlv_msdu_done_copy_get_9224(uint8_t *buf) 1548 { 1549 return HAL_RX_TLV_MSDU_DONE_COPY_GET(buf); 1550 } 1551 1552 static void hal_hw_txrx_ops_attach_qcn9224(struct hal_soc *hal_soc) 1553 { 1554 /* init and setup */ 1555 hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic; 1556 hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic; 1557 hal_soc->ops->hal_srng_hw_disable = hal_srng_hw_disable_generic; 1558 hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic; 1559 hal_soc->ops->hal_get_window_address = hal_get_window_address_9224; 1560 hal_soc->ops->hal_cmem_write = hal_cmem_write_9224; 1561 1562 /* tx */ 1563 hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_9224; 1564 hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_9224; 1565 hal_soc->ops->hal_tx_comp_get_status = 1566 hal_tx_comp_get_status_generic_be; 1567 hal_soc->ops->hal_tx_init_cmd_credit_ring = 1568 hal_tx_init_cmd_credit_ring_9224; 1569 hal_soc->ops->hal_tx_set_ppe_cmn_cfg = 1570 hal_tx_set_ppe_cmn_config_9224; 1571 hal_soc->ops->hal_tx_set_ppe_vp_entry = 1572 hal_tx_set_ppe_vp_entry_9224; 1573 hal_soc->ops->hal_ppeds_cfg_ast_override_map_reg = 1574 hal_ppeds_cfg_ast_override_map_reg_9224; 1575 hal_soc->ops->hal_tx_set_ppe_pri2tid = 1576 hal_tx_set_ppe_pri2tid_map_9224; 1577 hal_soc->ops->hal_tx_update_ppe_pri2tid = 1578 hal_tx_update_ppe_pri2tid_9224; 1579 hal_soc->ops->hal_tx_dump_ppe_vp_entry = 1580 hal_tx_dump_ppe_vp_entry_9224; 1581 hal_soc->ops->hal_tx_get_num_ppe_vp_tbl_entries = 1582 hal_tx_get_num_ppe_vp_tbl_entries_9224; 1583 hal_soc->ops->hal_tx_enable_pri2tid_map = 1584 hal_tx_enable_pri2tid_map_9224; 1585 hal_soc->ops->hal_tx_config_rbm_mapping_be = 1586 hal_tx_config_rbm_mapping_be_9224; 1587 1588 /* rx */ 1589 hal_soc->ops->hal_rx_msdu_start_nss_get = hal_rx_tlv_nss_get_be; 1590 hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status = 1591 hal_rx_mon_hw_desc_get_mpdu_status_be; 1592 hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_9224; 1593 hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv = 1594 hal_rx_proc_phyrx_other_receive_info_tlv_9224; 1595 1596 hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_9224; 1597 hal_soc->ops->hal_rx_dump_mpdu_start_tlv = 1598 hal_rx_dump_mpdu_start_tlv_9224; 1599 hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_9224; 1600 1601 hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_9224; 1602 hal_soc->ops->hal_rx_mpdu_start_tid_get = hal_rx_tlv_tid_get_be; 1603 hal_soc->ops->hal_rx_msdu_start_reception_type_get = 1604 hal_rx_tlv_reception_type_get_be; 1605 hal_soc->ops->hal_rx_msdu_end_da_idx_get = 1606 hal_rx_msdu_end_da_idx_get_be; 1607 hal_soc->ops->hal_rx_msdu_desc_info_get_ptr = 1608 hal_rx_msdu_desc_info_get_ptr_9224; 1609 hal_soc->ops->hal_rx_link_desc_msdu0_ptr = 1610 hal_rx_link_desc_msdu0_ptr_9224; 1611 hal_soc->ops->hal_reo_status_get_header = 1612 hal_reo_status_get_header_9224; 1613 #ifdef WLAN_PKT_CAPTURE_RX_2_0 1614 hal_soc->ops->hal_rx_status_get_tlv_info = 1615 hal_rx_status_get_tlv_info_wrapper_be; 1616 #endif 1617 hal_soc->ops->hal_rx_wbm_err_info_get = 1618 hal_rx_wbm_err_info_get_generic_be; 1619 hal_soc->ops->hal_tx_set_pcp_tid_map = 1620 hal_tx_set_pcp_tid_map_generic_be; 1621 hal_soc->ops->hal_tx_update_pcp_tid_map = 1622 hal_tx_update_pcp_tid_generic_be; 1623 hal_soc->ops->hal_tx_set_tidmap_prty = 1624 hal_tx_update_tidmap_prty_generic_be; 1625 hal_soc->ops->hal_rx_get_rx_fragment_number = 1626 hal_rx_get_rx_fragment_number_be, 1627 hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get = 1628 hal_rx_tlv_da_is_mcbc_get_be; 1629 hal_soc->ops->hal_rx_msdu_end_is_tkip_mic_err = 1630 hal_rx_tlv_is_tkip_mic_err_get_be; 1631 hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get = 1632 hal_rx_tlv_sa_is_valid_get_be; 1633 hal_soc->ops->hal_rx_msdu_end_sa_idx_get = hal_rx_tlv_sa_idx_get_be; 1634 hal_soc->ops->hal_rx_desc_is_first_msdu = hal_rx_desc_is_first_msdu_be; 1635 hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get = 1636 hal_rx_tlv_l3_hdr_padding_get_be; 1637 hal_soc->ops->hal_rx_encryption_info_valid = 1638 hal_rx_encryption_info_valid_be; 1639 hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_be; 1640 hal_soc->ops->hal_rx_msdu_end_first_msdu_get = 1641 hal_rx_tlv_first_msdu_get_be; 1642 hal_soc->ops->hal_rx_msdu_end_da_is_valid_get = 1643 hal_rx_tlv_da_is_valid_get_be; 1644 hal_soc->ops->hal_rx_msdu_end_last_msdu_get = 1645 hal_rx_tlv_last_msdu_get_be; 1646 hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid = 1647 hal_rx_get_mpdu_mac_ad4_valid_be; 1648 hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get = 1649 hal_rx_mpdu_start_sw_peer_id_get_be; 1650 hal_soc->ops->hal_rx_tlv_peer_meta_data_get = 1651 hal_rx_msdu_peer_meta_data_get_be; 1652 hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_be; 1653 hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_be; 1654 hal_soc->ops->hal_rx_get_mpdu_frame_control_valid = 1655 hal_rx_get_mpdu_frame_control_valid_be; 1656 hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_be; 1657 hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_be; 1658 hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_be; 1659 hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid = 1660 hal_rx_get_mpdu_sequence_control_valid_be; 1661 hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_be; 1662 hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_be; 1663 hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get = 1664 hal_rx_mpdu_start_mpdu_qos_control_valid_get_be; 1665 hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get = 1666 hal_rx_msdu_end_sa_sw_peer_id_get_be; 1667 hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb = 1668 hal_rx_msdu0_buffer_addr_lsb_9224; 1669 hal_soc->ops->hal_rx_msdu_desc_info_ptr_get = 1670 hal_rx_msdu_desc_info_ptr_get_9224; 1671 hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_9224; 1672 hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_9224; 1673 hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_be; 1674 hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_be; 1675 hal_soc->ops->hal_rx_get_mac_addr2_valid = 1676 hal_rx_get_mac_addr2_valid_be; 1677 hal_soc->ops->hal_reo_config = hal_reo_config_9224; 1678 hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_be; 1679 hal_soc->ops->hal_rx_msdu_flow_idx_invalid = 1680 hal_rx_msdu_flow_idx_invalid_be; 1681 hal_soc->ops->hal_rx_msdu_flow_idx_timeout = 1682 hal_rx_msdu_flow_idx_timeout_be; 1683 hal_soc->ops->hal_rx_msdu_fse_metadata_get = 1684 hal_rx_msdu_fse_metadata_get_be; 1685 hal_soc->ops->hal_rx_msdu_cce_match_get = 1686 hal_rx_msdu_cce_match_get_be; 1687 hal_soc->ops->hal_rx_msdu_cce_metadata_get = 1688 hal_rx_msdu_cce_metadata_get_be; 1689 hal_soc->ops->hal_rx_msdu_get_flow_params = 1690 hal_rx_msdu_get_flow_params_be; 1691 hal_soc->ops->hal_rx_tlv_get_tcp_chksum = hal_rx_tlv_get_tcp_chksum_be; 1692 hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_be; 1693 1694 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) 1695 hal_soc->ops->hal_rx_get_bb_info = hal_rx_get_bb_info_9224; 1696 hal_soc->ops->hal_rx_get_rtt_info = hal_rx_get_rtt_info_9224; 1697 #else 1698 hal_soc->ops->hal_rx_get_bb_info = NULL; 1699 hal_soc->ops->hal_rx_get_rtt_info = NULL; 1700 #endif 1701 1702 /* rx - msdu fast path info fields */ 1703 hal_soc->ops->hal_rx_msdu_packet_metadata_get = 1704 hal_rx_msdu_packet_metadata_get_generic_be; 1705 hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid = 1706 hal_rx_mpdu_start_tlv_tag_valid_be; 1707 hal_soc->ops->hal_rx_wbm_err_msdu_continuation_get = 1708 hal_rx_wbm_err_msdu_continuation_get_9224; 1709 1710 /* rx - TLV struct offsets */ 1711 hal_soc->ops->hal_rx_msdu_end_offset_get = 1712 hal_rx_msdu_end_offset_get_generic; 1713 hal_soc->ops->hal_rx_mpdu_start_offset_get = 1714 hal_rx_mpdu_start_offset_get_generic; 1715 #ifndef NO_RX_PKT_HDR_TLV 1716 hal_soc->ops->hal_rx_pkt_tlv_offset_get = 1717 hal_rx_pkt_tlv_offset_get_generic; 1718 #endif 1719 hal_soc->ops->hal_rx_flow_setup_fse = hal_rx_flow_setup_fse_9224; 1720 1721 hal_soc->ops->hal_rx_flow_get_tuple_info = 1722 hal_rx_flow_get_tuple_info_be; 1723 hal_soc->ops->hal_rx_flow_delete_entry = 1724 hal_rx_flow_delete_entry_be; 1725 hal_soc->ops->hal_rx_fst_get_fse_size = hal_rx_fst_get_fse_size_be; 1726 hal_soc->ops->hal_compute_reo_remap_ix2_ix3 = 1727 hal_compute_reo_remap_ix2_ix3_9224; 1728 1729 hal_soc->ops->hal_rx_msdu_get_reo_destination_indication = 1730 hal_rx_msdu_get_reo_destination_indication_be; 1731 hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_be; 1732 hal_soc->ops->hal_rx_msdu_is_wlan_mcast = 1733 hal_rx_msdu_is_wlan_mcast_generic_be; 1734 hal_soc->ops->hal_tx_get_num_tcl_banks = hal_tx_get_num_tcl_banks_9224; 1735 hal_soc->ops->hal_rx_tlv_decap_format_get = 1736 hal_rx_tlv_decap_format_get_be; 1737 #ifdef RECEIVE_OFFLOAD 1738 hal_soc->ops->hal_rx_tlv_get_offload_info = 1739 hal_rx_tlv_get_offload_info_be; 1740 hal_soc->ops->hal_rx_get_proto_params = hal_rx_get_proto_params_be; 1741 hal_soc->ops->hal_rx_get_l3_l4_offsets = hal_rx_get_l3_l4_offsets_be; 1742 #endif 1743 hal_soc->ops->hal_rx_tlv_msdu_done_get = 1744 hal_rx_tlv_msdu_done_copy_get_9224; 1745 hal_soc->ops->hal_rx_tlv_msdu_len_get = 1746 hal_rx_msdu_start_msdu_len_get_be; 1747 hal_soc->ops->hal_rx_get_frame_ctrl_field = 1748 hal_rx_get_frame_ctrl_field_be; 1749 hal_soc->ops->hal_rx_tlv_csum_err_get = hal_rx_tlv_csum_err_get_be; 1750 #ifndef CONFIG_WORD_BASED_TLV 1751 hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get = 1752 hal_rx_mpdu_info_ampdu_flag_get_be; 1753 hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_be; 1754 hal_soc->ops->hal_rx_hw_desc_get_ppduid_get = 1755 hal_rx_hw_desc_get_ppduid_get_be; 1756 hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_be; 1757 hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get = 1758 hal_rx_attn_phy_ppdu_id_get_be; 1759 hal_soc->ops->hal_rx_get_filter_category = 1760 hal_rx_get_filter_category_be; 1761 #endif 1762 hal_soc->ops->hal_rx_tlv_msdu_len_set = 1763 hal_rx_msdu_start_msdu_len_set_be; 1764 hal_soc->ops->hal_rx_tlv_sgi_get = hal_rx_tlv_sgi_get_be; 1765 hal_soc->ops->hal_rx_tlv_rate_mcs_get = hal_rx_tlv_rate_mcs_get_be; 1766 hal_soc->ops->hal_rx_tlv_bw_get = hal_rx_tlv_bw_get_be; 1767 hal_soc->ops->hal_rx_tlv_get_pkt_type = hal_rx_tlv_get_pkt_type_be; 1768 hal_soc->ops->hal_rx_tlv_mic_err_get = hal_rx_tlv_mic_err_get_be; 1769 hal_soc->ops->hal_rx_tlv_decrypt_err_get = 1770 hal_rx_tlv_decrypt_err_get_be; 1771 hal_soc->ops->hal_rx_tlv_first_mpdu_get = hal_rx_tlv_first_mpdu_get_be; 1772 hal_soc->ops->hal_rx_tlv_get_is_decrypted = 1773 hal_rx_tlv_get_is_decrypted_be; 1774 hal_soc->ops->hal_rx_msdu_get_keyid = hal_rx_msdu_get_keyid_be; 1775 hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_be; 1776 hal_soc->ops->hal_rx_priv_info_set_in_tlv = 1777 hal_rx_priv_info_set_in_tlv_be; 1778 hal_soc->ops->hal_rx_priv_info_get_from_tlv = 1779 hal_rx_priv_info_get_from_tlv_be; 1780 hal_soc->ops->hal_rx_pkt_hdr_get = hal_rx_pkt_hdr_get_be; 1781 hal_soc->ops->hal_reo_setup = hal_reo_setup_9224; 1782 hal_soc->ops->hal_reo_config_reo2ppe_dest_info = NULL; 1783 #ifdef REO_SHARED_QREF_TABLE_EN 1784 hal_soc->ops->hal_reo_shared_qaddr_setup = hal_reo_shared_qaddr_setup_be; 1785 hal_soc->ops->hal_reo_shared_qaddr_init = hal_reo_shared_qaddr_init_be; 1786 hal_soc->ops->hal_reo_shared_qaddr_detach = hal_reo_shared_qaddr_detach_be; 1787 hal_soc->ops->hal_reo_shared_qaddr_write = hal_reo_shared_qaddr_write_be; 1788 hal_soc->ops->hal_reo_shared_qaddr_cache_clear = hal_reo_shared_qaddr_cache_clear_be; 1789 #endif 1790 /* Overwrite the default BE ops */ 1791 hal_soc->ops->hal_get_rx_max_ba_window = 1792 hal_get_rx_max_ba_window_qcn9224; 1793 hal_soc->ops->hal_get_reo_qdesc_size = hal_qcn9224_get_reo_qdesc_size; 1794 /* TX MONITOR */ 1795 #ifdef WLAN_PKT_CAPTURE_TX_2_0 1796 hal_soc->ops->hal_txmon_is_mon_buf_addr_tlv = 1797 hal_txmon_is_mon_buf_addr_tlv_generic_be; 1798 hal_soc->ops->hal_txmon_populate_packet_info = 1799 hal_txmon_populate_packet_info_generic_be; 1800 hal_soc->ops->hal_txmon_status_parse_tlv = 1801 hal_txmon_status_parse_tlv_generic_be; 1802 hal_soc->ops->hal_txmon_status_get_num_users = 1803 hal_txmon_status_get_num_users_generic_be; 1804 #if defined(TX_MONITOR_WORD_MASK) 1805 hal_soc->ops->hal_txmon_get_word_mask = 1806 hal_txmon_get_word_mask_qcn9224; 1807 #else 1808 hal_soc->ops->hal_txmon_get_word_mask = 1809 hal_txmon_get_word_mask_generic_be; 1810 #endif /* TX_MONITOR_WORD_MASK */ 1811 #endif /* WLAN_PKT_CAPTURE_TX_2_0 */ 1812 hal_soc->ops->hal_compute_reo_remap_ix0 = NULL; 1813 hal_soc->ops->hal_tx_vdev_mismatch_routing_set = 1814 hal_tx_vdev_mismatch_routing_set_generic_be; 1815 hal_soc->ops->hal_tx_mcast_mlo_reinject_routing_set = 1816 hal_tx_mcast_mlo_reinject_routing_set_generic_be; 1817 hal_soc->ops->hal_get_ba_aging_timeout = 1818 hal_get_ba_aging_timeout_be_generic; 1819 hal_soc->ops->hal_setup_link_idle_list = 1820 hal_setup_link_idle_list_generic_be; 1821 hal_soc->ops->hal_cookie_conversion_reg_cfg_be = 1822 hal_cookie_conversion_reg_cfg_generic_be; 1823 hal_soc->ops->hal_set_ba_aging_timeout = 1824 hal_set_ba_aging_timeout_be_generic; 1825 hal_soc->ops->hal_tx_populate_bank_register = 1826 hal_tx_populate_bank_register_be; 1827 hal_soc->ops->hal_tx_vdev_mcast_ctrl_set = 1828 hal_tx_vdev_mcast_ctrl_set_be; 1829 #ifdef CONFIG_WORD_BASED_TLV 1830 hal_soc->ops->hal_rx_mpdu_start_wmask_get = 1831 hal_rx_mpdu_start_wmask_get_be; 1832 hal_soc->ops->hal_rx_msdu_end_wmask_get = 1833 hal_rx_msdu_end_wmask_get_be; 1834 #endif 1835 hal_soc->ops->hal_get_tsf2_scratch_reg = 1836 hal_get_tsf2_scratch_reg_qcn9224; 1837 hal_soc->ops->hal_get_tqm_scratch_reg = 1838 hal_get_tqm_scratch_reg_qcn9224; 1839 hal_soc->ops->hal_tx_ring_halt_set = hal_tx_ppe2tcl_ring_halt_set_9224; 1840 hal_soc->ops->hal_tx_ring_halt_reset = 1841 hal_tx_ppe2tcl_ring_halt_reset_9224; 1842 hal_soc->ops->hal_tx_ring_halt_poll = 1843 hal_tx_ppe2tcl_ring_halt_done_9224; 1844 hal_soc->ops->hal_tx_get_num_ppe_vp_search_idx_tbl_entries = 1845 hal_tx_get_num_ppe_vp_search_idx_reg_entries_9224; 1846 hal_soc->ops->hal_tx_ring_halt_get = hal_tx_ppe2tcl_ring_halt_get_9224; 1847 }; 1848 1849 /** 1850 * hal_srng_hw_reg_offset_init_qcn9224() - Initialize the HW srng reg offset 1851 * applicable only for QCN9224 1852 * @hal_soc: HAL Soc handle 1853 * 1854 * Return: None 1855 */ 1856 static inline void hal_srng_hw_reg_offset_init_qcn9224(struct hal_soc *hal_soc) 1857 { 1858 int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset; 1859 1860 hw_reg_offset[DST_MSI2_BASE_LSB] = REG_OFFSET(DST, MSI2_BASE_LSB), 1861 hw_reg_offset[DST_MSI2_BASE_MSB] = REG_OFFSET(DST, MSI2_BASE_MSB), 1862 hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA), 1863 hw_reg_offset[DST_PRODUCER_INT2_SETUP] = 1864 REG_OFFSET(DST, PRODUCER_INT2_SETUP); 1865 } 1866