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 any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE 16 */ 17 #include "qdf_types.h" 18 #include "qdf_util.h" 19 #include "qdf_mem.h" 20 #include "qdf_nbuf.h" 21 #include "qdf_module.h" 22 23 #include "target_type.h" 24 #include "wcss_version.h" 25 26 #include "hal_be_hw_headers.h" 27 #include "hal_internal.h" 28 #include "hal_api.h" 29 #include "hal_flow.h" 30 #include "rx_flow_search_entry.h" 31 #include "hal_rx_flow_info.h" 32 #include "hal_be_api.h" 33 #include "tcl_entrance_from_ppe_ring.h" 34 #include "sw_monitor_ring.h" 35 #include "wcss_seq_hwioreg_umac.h" 36 #include "wfss_ce_reg_seq_hwioreg.h" 37 #include <uniform_reo_status_header.h> 38 #include <wbm_release_ring_tx.h> 39 #include <phyrx_location.h> 40 #ifdef QCA_MONITOR_2_0_SUPPORT 41 #include <mon_ingress_ring.h> 42 #include <mon_destination_ring.h> 43 #endif 44 #include "rx_reo_queue_1k.h" 45 46 #include <hal_be_rx.h> 47 48 #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \ 49 RX_MPDU_START_RX_MPDU_INFO_DETAILS_RXPCU_MPDU_FILTER_IN_CATEGORY_OFFSET 50 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \ 51 RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET 52 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \ 53 RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET 54 #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \ 55 RX_MPDU_DETAILS_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET 56 #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \ 57 REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET 58 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER \ 59 STATUS_HEADER_REO_STATUS_NUMBER 60 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \ 61 STATUS_HEADER_TIMESTAMP 62 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \ 63 RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET 64 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \ 65 RX_MSDU_LINK_MSDU_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET 66 #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \ 67 TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_31_0_OFFSET 68 #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \ 69 TCL_DATA_CMD_BUF_ADDR_INFO_BUFFER_ADDR_39_32_OFFSET 70 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \ 71 TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_OFFSET 72 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \ 73 BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_LSB 74 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \ 75 BUFFER_ADDR_INFO_BUFFER_ADDR_31_0_MASK 76 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \ 77 BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_LSB 78 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \ 79 BUFFER_ADDR_INFO_BUFFER_ADDR_39_32_MASK 80 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \ 81 BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_LSB 82 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \ 83 BUFFER_ADDR_INFO_RETURN_BUFFER_MANAGER_MASK 84 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \ 85 BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_LSB 86 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \ 87 BUFFER_ADDR_INFO_SW_BUFFER_COOKIE_MASK 88 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \ 89 TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_LSB 90 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \ 91 TCL_DATA_CMD_BUF_OR_EXT_DESC_TYPE_MASK 92 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \ 93 WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_MASK 94 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \ 95 WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_OFFSET 96 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \ 97 WBM_RELEASE_RING_TX_TX_RATE_STATS_PPDU_TRANSMISSION_TSF_LSB 98 99 #ifdef QCA_MONITOR_2_0_SUPPORT 100 #include "hal_be_api_mon.h" 101 #endif 102 103 #define CMEM_REG_BASE 0x00100000 104 105 /* For Berryllium sw2rxdma ring size increased to 20 bits */ 106 #define HAL_RXDMA_MAX_RING_SIZE_BE 0xFFFFF 107 108 #include "hal_5332_rx.h" 109 #include "hal_5332_tx.h" 110 #include "hal_be_rx_tlv.h" 111 #include <hal_be_generic_api.h> 112 113 114 /** 115 * hal_read_pmm_scratch_reg_5332(): API to read PMM Scratch register 116 * 117 * @soc: HAL soc 118 * @reg_enum: Enum of the scratch register 119 * 120 * Return: uint32_t 121 */ 122 static inline 123 uint32_t hal_read_pmm_scratch_reg_5332(struct hal_soc *soc, 124 enum hal_scratch_reg_enum reg_enum) 125 { 126 uint32_t val = 0; 127 128 pld_reg_read(soc->qdf_dev->dev, (reg_enum * 4), &val, 129 soc->dev_base_addr_pmm); 130 return val; 131 } 132 133 /** 134 * hal_get_tsf2_scratch_reg_qca5332(): API to read tsf2 scratch register 135 * 136 * @hal_soc_hdl: HAL soc context 137 * @mac_id: mac id 138 * @value: Pointer to update tsf2 value 139 * 140 * Return: void 141 */ 142 static void hal_get_tsf2_scratch_reg_qca5332(hal_soc_handle_t hal_soc_hdl, 143 uint8_t mac_id, uint64_t *value) 144 { 145 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl; 146 uint32_t offset_lo, offset_hi; 147 enum hal_scratch_reg_enum enum_lo, enum_hi; 148 149 hal_get_tsf_enum(DEFAULT_TSF_ID, mac_id, &enum_lo, &enum_hi); 150 151 offset_lo = hal_read_pmm_scratch_reg_5332(soc, 152 enum_lo); 153 154 offset_hi = hal_read_pmm_scratch_reg_5332(soc, 155 enum_hi); 156 157 *value = ((uint64_t)(offset_hi) << 32 | offset_lo); 158 } 159 160 /** 161 * hal_get_tqm_scratch_reg_qca5332(): API to read tqm scratch register 162 * 163 * @hal_soc_hdl: HAL soc context 164 * @value: Pointer to update tqm value 165 * 166 * Return: void 167 */ 168 static void hal_get_tqm_scratch_reg_qca5332(hal_soc_handle_t hal_soc_hdl, 169 uint64_t *value) 170 { 171 struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl; 172 uint32_t offset_lo, offset_hi; 173 174 offset_lo = hal_read_pmm_scratch_reg_5332(soc, 175 PMM_TQM_CLOCK_OFFSET_LO_US); 176 177 offset_hi = hal_read_pmm_scratch_reg_5332(soc, 178 PMM_TQM_CLOCK_OFFSET_HI_US); 179 180 *value = ((uint64_t)(offset_hi) << 32 | offset_lo); 181 } 182 183 #define LINK_DESC_SIZE (NUM_OF_DWORDS_RX_MSDU_LINK << 2) 184 #define HAL_PPE_VP_ENTRIES_MAX 32 185 /** 186 * hal_get_link_desc_size_5332(): API to get the link desc size 187 * 188 * Return: uint32_t 189 */ 190 static uint32_t hal_get_link_desc_size_5332(void) 191 { 192 return LINK_DESC_SIZE; 193 } 194 195 /** 196 * hal_rx_get_tlv_5332(): API to get the tlv 197 * 198 * @rx_tlv: TLV data extracted from the rx packet 199 * Return: uint8_t 200 */ 201 static uint8_t hal_rx_get_tlv_5332(void *rx_tlv) 202 { 203 return HAL_RX_GET(rx_tlv, PHYRX_RSSI_LEGACY, RECEIVE_BANDWIDTH); 204 } 205 206 /** 207 * hal_rx_wbm_err_msdu_continuation_get_5332 () - API to check if WBM 208 * msdu continuation bit is set 209 * 210 *@wbm_desc: wbm release ring descriptor 211 * 212 * Return: true if msdu continuation bit is set. 213 */ 214 uint8_t hal_rx_wbm_err_msdu_continuation_get_5332(void *wbm_desc) 215 { 216 uint32_t comp_desc = *(uint32_t *)(((uint8_t *)wbm_desc) + 217 WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_OFFSET); 218 219 return (comp_desc & 220 WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_MASK) >> 221 WBM_RELEASE_RING_RX_RX_MSDU_DESC_INFO_DETAILS_MSDU_CONTINUATION_LSB; 222 } 223 224 /** 225 * hal_rx_proc_phyrx_other_receive_info_tlv_5332(): API to get tlv info 226 * 227 * Return: uint32_t 228 */ 229 static inline 230 void hal_rx_proc_phyrx_other_receive_info_tlv_5332(void *rx_tlv_hdr, 231 void *ppdu_info_hdl) 232 { 233 uint32_t tlv_tag, tlv_len; 234 uint32_t temp_len, other_tlv_len, other_tlv_tag; 235 void *rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE; 236 void *other_tlv_hdr = NULL; 237 void *other_tlv = NULL; 238 239 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr); 240 tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr); 241 temp_len = 0; 242 243 other_tlv_hdr = rx_tlv + HAL_RX_TLV32_HDR_SIZE; 244 other_tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(other_tlv_hdr); 245 other_tlv_len = HAL_RX_GET_USER_TLV32_LEN(other_tlv_hdr); 246 247 temp_len += other_tlv_len; 248 other_tlv = other_tlv_hdr + HAL_RX_TLV32_HDR_SIZE; 249 250 switch (other_tlv_tag) { 251 default: 252 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 253 "%s unhandled TLV type: %d, TLV len:%d", 254 __func__, other_tlv_tag, other_tlv_len); 255 break; 256 } 257 } 258 259 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) 260 static inline 261 void hal_rx_get_bb_info_5332(void *rx_tlv, void *ppdu_info_hdl) 262 { 263 struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl; 264 265 ppdu_info->cfr_info.bb_captured_channel = 266 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_CHANNEL); 267 268 ppdu_info->cfr_info.bb_captured_timeout = 269 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_TIMEOUT); 270 271 ppdu_info->cfr_info.bb_captured_reason = 272 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_REASON); 273 } 274 275 static inline 276 void hal_rx_get_rtt_info_5332(void *rx_tlv, void *ppdu_info_hdl) 277 { 278 struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl; 279 280 ppdu_info->cfr_info.rx_location_info_valid = 281 HAL_RX_GET(rx_tlv, PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 282 RX_LOCATION_INFO_VALID); 283 284 ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 = 285 HAL_RX_GET(rx_tlv, 286 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 287 RTT_CHE_BUFFER_POINTER_LOW32); 288 289 ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 = 290 HAL_RX_GET(rx_tlv, 291 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 292 RTT_CHE_BUFFER_POINTER_HIGH8); 293 294 ppdu_info->cfr_info.chan_capture_status = 295 HAL_GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv); 296 297 ppdu_info->cfr_info.rx_start_ts = 298 HAL_RX_GET(rx_tlv, 299 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 300 RX_START_TS); 301 302 ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t) 303 HAL_RX_GET(rx_tlv, 304 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 305 RTT_CFO_MEASUREMENT); 306 307 ppdu_info->cfr_info.agc_gain_info0 = 308 HAL_RX_GET(rx_tlv, 309 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 310 GAIN_CHAIN0); 311 312 ppdu_info->cfr_info.agc_gain_info0 |= 313 (((uint32_t)HAL_RX_GET(rx_tlv, 314 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 315 GAIN_CHAIN1)) << 16); 316 317 ppdu_info->cfr_info.agc_gain_info1 = 318 HAL_RX_GET(rx_tlv, 319 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 320 GAIN_CHAIN2); 321 322 ppdu_info->cfr_info.agc_gain_info1 |= 323 (((uint32_t)HAL_RX_GET(rx_tlv, 324 PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, 325 GAIN_CHAIN3)) << 16); 326 327 ppdu_info->cfr_info.agc_gain_info2 = 0; 328 329 ppdu_info->cfr_info.agc_gain_info3 = 0; 330 } 331 #endif 332 #ifdef CONFIG_WORD_BASED_TLV 333 /** 334 * hal_rx_dump_mpdu_start_tlv_5332: dump RX mpdu_start TLV in structured 335 * human readable format. 336 * @mpdu_start: pointer the rx_attention TLV in pkt. 337 * @dbg_level: log level. 338 * 339 * Return: void 340 */ 341 static inline void hal_rx_dump_mpdu_start_tlv_5332(void *mpdustart, 342 uint8_t dbg_level) 343 { 344 struct rx_mpdu_start_compact *mpdu_info = 345 (struct rx_mpdu_start_compact *)mpdustart; 346 347 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 348 "rx_mpdu_start tlv (1/5) - " 349 "rx_reo_queue_desc_addr_39_32 :%x" 350 "receive_queue_number:%x " 351 "pre_delim_err_warning:%x " 352 "first_delim_err:%x " 353 "pn_31_0:%x " 354 "pn_63_32:%x " 355 "pn_95_64:%x ", 356 mpdu_info->rx_reo_queue_desc_addr_39_32, 357 mpdu_info->receive_queue_number, 358 mpdu_info->pre_delim_err_warning, 359 mpdu_info->first_delim_err, 360 mpdu_info->pn_31_0, 361 mpdu_info->pn_63_32, 362 mpdu_info->pn_95_64); 363 364 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 365 "rx_mpdu_start tlv (2/5) - " 366 "ast_index:%x " 367 "sw_peer_id:%x " 368 "mpdu_frame_control_valid:%x " 369 "mpdu_duration_valid:%x " 370 "mac_addr_ad1_valid:%x " 371 "mac_addr_ad2_valid:%x " 372 "mac_addr_ad3_valid:%x " 373 "mac_addr_ad4_valid:%x " 374 "mpdu_sequence_control_valid :%x" 375 "mpdu_qos_control_valid:%x " 376 "mpdu_ht_control_valid:%x " 377 "frame_encryption_info_valid :%x", 378 mpdu_info->ast_index, 379 mpdu_info->sw_peer_id, 380 mpdu_info->mpdu_frame_control_valid, 381 mpdu_info->mpdu_duration_valid, 382 mpdu_info->mac_addr_ad1_valid, 383 mpdu_info->mac_addr_ad2_valid, 384 mpdu_info->mac_addr_ad3_valid, 385 mpdu_info->mac_addr_ad4_valid, 386 mpdu_info->mpdu_sequence_control_valid, 387 mpdu_info->mpdu_qos_control_valid, 388 mpdu_info->mpdu_ht_control_valid, 389 mpdu_info->frame_encryption_info_valid); 390 391 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 392 "rx_mpdu_start tlv (3/5) - " 393 "mpdu_fragment_number:%x " 394 "more_fragment_flag:%x " 395 "fr_ds:%x " 396 "to_ds:%x " 397 "encrypted:%x " 398 "mpdu_retry:%x " 399 "mpdu_sequence_number:%x ", 400 mpdu_info->mpdu_fragment_number, 401 mpdu_info->more_fragment_flag, 402 mpdu_info->fr_ds, 403 mpdu_info->to_ds, 404 mpdu_info->encrypted, 405 mpdu_info->mpdu_retry, 406 mpdu_info->mpdu_sequence_number); 407 408 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 409 "rx_mpdu_start tlv (4/5) - " 410 "mpdu_frame_control_field:%x " 411 "mpdu_duration_field:%x ", 412 mpdu_info->mpdu_frame_control_field, 413 mpdu_info->mpdu_duration_field); 414 415 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 416 "rx_mpdu_start tlv (5/5) - " 417 "mac_addr_ad1_31_0:%x " 418 "mac_addr_ad1_47_32:%x " 419 "mac_addr_ad2_15_0:%x " 420 "mac_addr_ad2_47_16:%x " 421 "mac_addr_ad3_31_0:%x " 422 "mac_addr_ad3_47_32:%x " 423 "mpdu_sequence_control_field :%x", 424 mpdu_info->mac_addr_ad1_31_0, 425 mpdu_info->mac_addr_ad1_47_32, 426 mpdu_info->mac_addr_ad2_15_0, 427 mpdu_info->mac_addr_ad2_47_16, 428 mpdu_info->mac_addr_ad3_31_0, 429 mpdu_info->mac_addr_ad3_47_32, 430 mpdu_info->mpdu_sequence_control_field); 431 } 432 433 /** 434 * hal_rx_dump_msdu_end_tlv_5332: dump RX msdu_end TLV in structured 435 * human readable format. 436 * @ msdu_end: pointer the msdu_end TLV in pkt. 437 * @ dbg_level: log level. 438 * 439 * Return: void 440 */ 441 static void hal_rx_dump_msdu_end_tlv_5332(void *msduend, 442 uint8_t dbg_level) 443 { 444 struct rx_msdu_end_compact *msdu_end = 445 (struct rx_msdu_end_compact *)msduend; 446 447 QDF_TRACE(QDF_MODULE_ID_DP, dbg_level, 448 "rx_msdu_end tlv - " 449 "key_id_octet: %d " 450 "tcp_udp_chksum: %d " 451 "sa_idx_timeout: %d " 452 "da_idx_timeout: %d " 453 "msdu_limit_error: %d " 454 "flow_idx_timeout: %d " 455 "flow_idx_invalid: %d " 456 "wifi_parser_error: %d " 457 "sa_is_valid: %d " 458 "da_is_valid: %d " 459 "da_is_mcbc: %d " 460 "tkip_mic_err: %d " 461 "l3_header_padding: %d " 462 "first_msdu: %d " 463 "last_msdu: %d " 464 "sa_idx: %d " 465 "msdu_drop: %d " 466 "reo_destination_indication: %d " 467 "flow_idx: %d " 468 "fse_metadata: %d " 469 "cce_metadata: %d " 470 "sa_sw_peer_id: %d ", 471 msdu_end->key_id_octet, 472 msdu_end->tcp_udp_chksum, 473 msdu_end->sa_idx_timeout, 474 msdu_end->da_idx_timeout, 475 msdu_end->msdu_limit_error, 476 msdu_end->flow_idx_timeout, 477 msdu_end->flow_idx_invalid, 478 msdu_end->wifi_parser_error, 479 msdu_end->sa_is_valid, 480 msdu_end->da_is_valid, 481 msdu_end->da_is_mcbc, 482 msdu_end->tkip_mic_err, 483 msdu_end->l3_header_padding, 484 msdu_end->first_msdu, 485 msdu_end->last_msdu, 486 msdu_end->sa_idx, 487 msdu_end->msdu_drop, 488 msdu_end->reo_destination_indication, 489 msdu_end->flow_idx, 490 msdu_end->fse_metadata, 491 msdu_end->cce_metadata, 492 msdu_end->sa_sw_peer_id); 493 } 494 #else 495 static inline void hal_rx_dump_mpdu_start_tlv_5332(void *mpdustart, 496 uint8_t dbg_level) 497 { 498 struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart; 499 struct rx_mpdu_info *mpdu_info = 500 (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details; 501 502 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 503 "rx_mpdu_start tlv (1/5) - " 504 "rx_reo_queue_desc_addr_31_0 :%x" 505 "rx_reo_queue_desc_addr_39_32 :%x" 506 "receive_queue_number:%x " 507 "pre_delim_err_warning:%x " 508 "first_delim_err:%x " 509 "reserved_2a:%x " 510 "pn_31_0:%x " 511 "pn_63_32:%x " 512 "pn_95_64:%x " 513 "pn_127_96:%x " 514 "epd_en:%x " 515 "all_frames_shall_be_encrypted :%x" 516 "encrypt_type:%x " 517 "wep_key_width_for_variable_key :%x" 518 "mesh_sta:%x " 519 "bssid_hit:%x " 520 "bssid_number:%x " 521 "tid:%x " 522 "reserved_7a:%x ", 523 mpdu_info->rx_reo_queue_desc_addr_31_0, 524 mpdu_info->rx_reo_queue_desc_addr_39_32, 525 mpdu_info->receive_queue_number, 526 mpdu_info->pre_delim_err_warning, 527 mpdu_info->first_delim_err, 528 mpdu_info->reserved_2a, 529 mpdu_info->pn_31_0, 530 mpdu_info->pn_63_32, 531 mpdu_info->pn_95_64, 532 mpdu_info->pn_127_96, 533 mpdu_info->epd_en, 534 mpdu_info->all_frames_shall_be_encrypted, 535 mpdu_info->encrypt_type, 536 mpdu_info->wep_key_width_for_variable_key, 537 mpdu_info->mesh_sta, 538 mpdu_info->bssid_hit, 539 mpdu_info->bssid_number, 540 mpdu_info->tid, 541 mpdu_info->reserved_7a); 542 543 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 544 "rx_mpdu_start tlv (2/5) - " 545 "ast_index:%x " 546 "sw_peer_id:%x " 547 "mpdu_frame_control_valid:%x " 548 "mpdu_duration_valid:%x " 549 "mac_addr_ad1_valid:%x " 550 "mac_addr_ad2_valid:%x " 551 "mac_addr_ad3_valid:%x " 552 "mac_addr_ad4_valid:%x " 553 "mpdu_sequence_control_valid :%x" 554 "mpdu_qos_control_valid:%x " 555 "mpdu_ht_control_valid:%x " 556 "frame_encryption_info_valid :%x", 557 mpdu_info->ast_index, 558 mpdu_info->sw_peer_id, 559 mpdu_info->mpdu_frame_control_valid, 560 mpdu_info->mpdu_duration_valid, 561 mpdu_info->mac_addr_ad1_valid, 562 mpdu_info->mac_addr_ad2_valid, 563 mpdu_info->mac_addr_ad3_valid, 564 mpdu_info->mac_addr_ad4_valid, 565 mpdu_info->mpdu_sequence_control_valid, 566 mpdu_info->mpdu_qos_control_valid, 567 mpdu_info->mpdu_ht_control_valid, 568 mpdu_info->frame_encryption_info_valid); 569 570 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 571 "rx_mpdu_start tlv (3/5) - " 572 "mpdu_fragment_number:%x " 573 "more_fragment_flag:%x " 574 "reserved_11a:%x " 575 "fr_ds:%x " 576 "to_ds:%x " 577 "encrypted:%x " 578 "mpdu_retry:%x " 579 "mpdu_sequence_number:%x ", 580 mpdu_info->mpdu_fragment_number, 581 mpdu_info->more_fragment_flag, 582 mpdu_info->reserved_11a, 583 mpdu_info->fr_ds, 584 mpdu_info->to_ds, 585 mpdu_info->encrypted, 586 mpdu_info->mpdu_retry, 587 mpdu_info->mpdu_sequence_number); 588 589 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 590 "rx_mpdu_start tlv (4/5) - " 591 "mpdu_frame_control_field:%x " 592 "mpdu_duration_field:%x ", 593 mpdu_info->mpdu_frame_control_field, 594 mpdu_info->mpdu_duration_field); 595 596 QDF_TRACE(QDF_MODULE_ID_HAL, dbg_level, 597 "rx_mpdu_start tlv (5/5) - " 598 "mac_addr_ad1_31_0:%x " 599 "mac_addr_ad1_47_32:%x " 600 "mac_addr_ad2_15_0:%x " 601 "mac_addr_ad2_47_16:%x " 602 "mac_addr_ad3_31_0:%x " 603 "mac_addr_ad3_47_32:%x " 604 "mpdu_sequence_control_field :%x" 605 "mac_addr_ad4_31_0:%x " 606 "mac_addr_ad4_47_32:%x " 607 "mpdu_qos_control_field:%x ", 608 mpdu_info->mac_addr_ad1_31_0, 609 mpdu_info->mac_addr_ad1_47_32, 610 mpdu_info->mac_addr_ad2_15_0, 611 mpdu_info->mac_addr_ad2_47_16, 612 mpdu_info->mac_addr_ad3_31_0, 613 mpdu_info->mac_addr_ad3_47_32, 614 mpdu_info->mpdu_sequence_control_field, 615 mpdu_info->mac_addr_ad4_31_0, 616 mpdu_info->mac_addr_ad4_47_32, 617 mpdu_info->mpdu_qos_control_field); 618 } 619 620 static void hal_rx_dump_msdu_end_tlv_5332(void *msduend, 621 uint8_t dbg_level) 622 { 623 struct rx_msdu_end *msdu_end = 624 (struct rx_msdu_end *)msduend; 625 626 QDF_TRACE(QDF_MODULE_ID_DP, dbg_level, 627 "rx_msdu_end tlv - " 628 "key_id_octet: %d " 629 "cce_super_rule: %d " 630 "cce_classify_not_done_truncat: %d " 631 "cce_classify_not_done_cce_dis: %d " 632 "rule_indication_31_0: %d " 633 "tcp_udp_chksum: %d " 634 "sa_idx_timeout: %d " 635 "da_idx_timeout: %d " 636 "msdu_limit_error: %d " 637 "flow_idx_timeout: %d " 638 "flow_idx_invalid: %d " 639 "wifi_parser_error: %d " 640 "sa_is_valid: %d " 641 "da_is_valid: %d " 642 "da_is_mcbc: %d " 643 "tkip_mic_err: %d " 644 "l3_header_padding: %d " 645 "first_msdu: %d " 646 "last_msdu: %d " 647 "sa_idx: %d " 648 "msdu_drop: %d " 649 "reo_destination_indication: %d " 650 "flow_idx: %d " 651 "fse_metadata: %d " 652 "cce_metadata: %d " 653 "sa_sw_peer_id: %d ", 654 msdu_end->key_id_octet, 655 msdu_end->cce_super_rule, 656 msdu_end->cce_classify_not_done_truncate, 657 msdu_end->cce_classify_not_done_cce_dis, 658 msdu_end->rule_indication_31_0, 659 msdu_end->tcp_udp_chksum, 660 msdu_end->sa_idx_timeout, 661 msdu_end->da_idx_timeout, 662 msdu_end->msdu_limit_error, 663 msdu_end->flow_idx_timeout, 664 msdu_end->flow_idx_invalid, 665 msdu_end->wifi_parser_error, 666 msdu_end->sa_is_valid, 667 msdu_end->da_is_valid, 668 msdu_end->da_is_mcbc, 669 msdu_end->tkip_mic_err, 670 msdu_end->l3_header_padding, 671 msdu_end->first_msdu, 672 msdu_end->last_msdu, 673 msdu_end->sa_idx, 674 msdu_end->msdu_drop, 675 msdu_end->reo_destination_indication, 676 msdu_end->flow_idx, 677 msdu_end->fse_metadata, 678 msdu_end->cce_metadata, 679 msdu_end->sa_sw_peer_id); 680 } 681 #endif 682 683 /** 684 * hal_reo_status_get_header_5332 - Process reo desc info 685 * @d - Pointer to reo descriptor 686 * @b - tlv type info 687 * @h1 - Pointer to hal_reo_status_header where info to be stored 688 * 689 * Return - none. 690 * 691 */ 692 static void hal_reo_status_get_header_5332(hal_ring_desc_t ring_desc, 693 int b, void *h1) 694 { 695 uint64_t *d = (uint64_t *)ring_desc; 696 uint64_t val1 = 0; 697 struct hal_reo_status_header *h = 698 (struct hal_reo_status_header *)h1; 699 700 /* Offsets of descriptor fields defined in HW headers start 701 * from the field after TLV header 702 */ 703 d += HAL_GET_NUM_QWORDS(sizeof(struct tlv_32_hdr)); 704 705 switch (b) { 706 case HAL_REO_QUEUE_STATS_STATUS_TLV: 707 val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS, 708 STATUS_HEADER_REO_STATUS_NUMBER)]; 709 break; 710 case HAL_REO_FLUSH_QUEUE_STATUS_TLV: 711 val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS, 712 STATUS_HEADER_REO_STATUS_NUMBER)]; 713 break; 714 case HAL_REO_FLUSH_CACHE_STATUS_TLV: 715 val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS, 716 STATUS_HEADER_REO_STATUS_NUMBER)]; 717 break; 718 case HAL_REO_UNBLK_CACHE_STATUS_TLV: 719 val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS, 720 STATUS_HEADER_REO_STATUS_NUMBER)]; 721 break; 722 case HAL_REO_TIMOUT_LIST_STATUS_TLV: 723 val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS, 724 STATUS_HEADER_REO_STATUS_NUMBER)]; 725 break; 726 case HAL_REO_DESC_THRES_STATUS_TLV: 727 val1 = 728 d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS, 729 STATUS_HEADER_REO_STATUS_NUMBER)]; 730 break; 731 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV: 732 val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS, 733 STATUS_HEADER_REO_STATUS_NUMBER)]; 734 break; 735 default: 736 qdf_nofl_err("ERROR: Unknown tlv\n"); 737 break; 738 } 739 h->cmd_num = 740 HAL_GET_FIELD( 741 UNIFORM_REO_STATUS_HEADER, REO_STATUS_NUMBER, 742 val1); 743 h->exec_time = 744 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, 745 CMD_EXECUTION_TIME, val1); 746 h->status = 747 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, 748 REO_CMD_EXECUTION_STATUS, val1); 749 switch (b) { 750 case HAL_REO_QUEUE_STATS_STATUS_TLV: 751 val1 = d[HAL_OFFSET_QW(REO_GET_QUEUE_STATS_STATUS, 752 STATUS_HEADER_TIMESTAMP)]; 753 break; 754 case HAL_REO_FLUSH_QUEUE_STATUS_TLV: 755 val1 = d[HAL_OFFSET_QW(REO_FLUSH_QUEUE_STATUS, 756 STATUS_HEADER_TIMESTAMP)]; 757 break; 758 case HAL_REO_FLUSH_CACHE_STATUS_TLV: 759 val1 = d[HAL_OFFSET_QW(REO_FLUSH_CACHE_STATUS, 760 STATUS_HEADER_TIMESTAMP)]; 761 break; 762 case HAL_REO_UNBLK_CACHE_STATUS_TLV: 763 val1 = d[HAL_OFFSET_QW(REO_UNBLOCK_CACHE_STATUS, 764 STATUS_HEADER_TIMESTAMP)]; 765 break; 766 case HAL_REO_TIMOUT_LIST_STATUS_TLV: 767 val1 = d[HAL_OFFSET_QW(REO_FLUSH_TIMEOUT_LIST_STATUS, 768 STATUS_HEADER_TIMESTAMP)]; 769 break; 770 case HAL_REO_DESC_THRES_STATUS_TLV: 771 val1 = 772 d[HAL_OFFSET_QW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS, 773 STATUS_HEADER_TIMESTAMP)]; 774 break; 775 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV: 776 val1 = d[HAL_OFFSET_QW(REO_UPDATE_RX_REO_QUEUE_STATUS, 777 STATUS_HEADER_TIMESTAMP)]; 778 break; 779 default: 780 qdf_nofl_err("ERROR: Unknown tlv\n"); 781 break; 782 } 783 h->tstamp = 784 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER, TIMESTAMP, val1); 785 } 786 787 static 788 void *hal_rx_msdu0_buffer_addr_lsb_5332(void *link_desc_va) 789 { 790 return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va); 791 } 792 793 static 794 void *hal_rx_msdu_desc_info_ptr_get_5332(void *msdu0) 795 { 796 return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0); 797 } 798 799 static 800 void *hal_ent_mpdu_desc_info_5332(void *ent_ring_desc) 801 { 802 return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc); 803 } 804 805 static 806 void *hal_dst_mpdu_desc_info_5332(void *dst_ring_desc) 807 { 808 return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc); 809 } 810 811 /** 812 * hal_reo_config_5332(): Set reo config parameters 813 * @soc: hal soc handle 814 * @reg_val: value to be set 815 * @reo_params: reo parameters 816 * 817 * Return: void 818 */ 819 static void 820 hal_reo_config_5332(struct hal_soc *soc, 821 uint32_t reg_val, 822 struct hal_reo_params *reo_params) 823 { 824 HAL_REO_R0_CONFIG(soc, reg_val, reo_params); 825 } 826 827 /** 828 * hal_rx_msdu_desc_info_get_ptr_5332() - Get msdu desc info ptr 829 * @msdu_details_ptr - Pointer to msdu_details_ptr 830 * 831 * Return - Pointer to rx_msdu_desc_info structure. 832 * 833 */ 834 static void *hal_rx_msdu_desc_info_get_ptr_5332(void *msdu_details_ptr) 835 { 836 return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr); 837 } 838 839 /** 840 * hal_rx_link_desc_msdu0_ptr_5332 - Get pointer to rx_msdu details 841 * @link_desc - Pointer to link desc 842 * 843 * Return - Pointer to rx_msdu_details structure 844 * 845 */ 846 static void *hal_rx_link_desc_msdu0_ptr_5332(void *link_desc) 847 { 848 return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc); 849 } 850 851 /** 852 * hal_get_window_address_5332(): Function to get hp/tp address 853 * @hal_soc: Pointer to hal_soc 854 * @addr: address offset of register 855 * 856 * Return: modified address offset of register 857 */ 858 859 static inline qdf_iomem_t hal_get_window_address_5332(struct hal_soc *hal_soc, 860 qdf_iomem_t addr) 861 { 862 uint32_t offset = addr - hal_soc->dev_base_addr; 863 qdf_iomem_t new_offset; 864 865 /* 866 * Check if offset lies within CE register range(0x740000) 867 * or UMAC/DP register range (0x00A00000). 868 * If offset lies within CE register range, map it 869 * into CE region. 870 */ 871 if (offset < 0xA00000) { 872 offset = offset - CE_CFG_WFSS_CE_REG_BASE; 873 new_offset = (hal_soc->dev_base_addr_ce + offset); 874 875 return new_offset; 876 } else { 877 /* 878 * If offset lies within DP register range, 879 * return the address as such 880 */ 881 return addr; 882 } 883 } 884 885 static 886 void hal_compute_reo_remap_ix2_ix3_5332(uint32_t *ring, uint32_t num_rings, 887 uint32_t *remap1, uint32_t *remap2) 888 { 889 switch (num_rings) { 890 case 1: 891 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 892 HAL_REO_REMAP_IX2(ring[0], 17) | 893 HAL_REO_REMAP_IX2(ring[0], 18) | 894 HAL_REO_REMAP_IX2(ring[0], 19) | 895 HAL_REO_REMAP_IX2(ring[0], 20) | 896 HAL_REO_REMAP_IX2(ring[0], 21) | 897 HAL_REO_REMAP_IX2(ring[0], 22) | 898 HAL_REO_REMAP_IX2(ring[0], 23); 899 900 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 901 HAL_REO_REMAP_IX3(ring[0], 25) | 902 HAL_REO_REMAP_IX3(ring[0], 26) | 903 HAL_REO_REMAP_IX3(ring[0], 27) | 904 HAL_REO_REMAP_IX3(ring[0], 28) | 905 HAL_REO_REMAP_IX3(ring[0], 29) | 906 HAL_REO_REMAP_IX3(ring[0], 30) | 907 HAL_REO_REMAP_IX3(ring[0], 31); 908 break; 909 case 2: 910 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 911 HAL_REO_REMAP_IX2(ring[0], 17) | 912 HAL_REO_REMAP_IX2(ring[1], 18) | 913 HAL_REO_REMAP_IX2(ring[1], 19) | 914 HAL_REO_REMAP_IX2(ring[0], 20) | 915 HAL_REO_REMAP_IX2(ring[0], 21) | 916 HAL_REO_REMAP_IX2(ring[1], 22) | 917 HAL_REO_REMAP_IX2(ring[1], 23); 918 919 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 920 HAL_REO_REMAP_IX3(ring[0], 25) | 921 HAL_REO_REMAP_IX3(ring[1], 26) | 922 HAL_REO_REMAP_IX3(ring[1], 27) | 923 HAL_REO_REMAP_IX3(ring[0], 28) | 924 HAL_REO_REMAP_IX3(ring[0], 29) | 925 HAL_REO_REMAP_IX3(ring[1], 30) | 926 HAL_REO_REMAP_IX3(ring[1], 31); 927 break; 928 case 3: 929 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 930 HAL_REO_REMAP_IX2(ring[1], 17) | 931 HAL_REO_REMAP_IX2(ring[2], 18) | 932 HAL_REO_REMAP_IX2(ring[0], 19) | 933 HAL_REO_REMAP_IX2(ring[1], 20) | 934 HAL_REO_REMAP_IX2(ring[2], 21) | 935 HAL_REO_REMAP_IX2(ring[0], 22) | 936 HAL_REO_REMAP_IX2(ring[1], 23); 937 938 *remap2 = HAL_REO_REMAP_IX3(ring[2], 24) | 939 HAL_REO_REMAP_IX3(ring[0], 25) | 940 HAL_REO_REMAP_IX3(ring[1], 26) | 941 HAL_REO_REMAP_IX3(ring[2], 27) | 942 HAL_REO_REMAP_IX3(ring[0], 28) | 943 HAL_REO_REMAP_IX3(ring[1], 29) | 944 HAL_REO_REMAP_IX3(ring[2], 30) | 945 HAL_REO_REMAP_IX3(ring[0], 31); 946 break; 947 case 4: 948 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 949 HAL_REO_REMAP_IX2(ring[1], 17) | 950 HAL_REO_REMAP_IX2(ring[2], 18) | 951 HAL_REO_REMAP_IX2(ring[3], 19) | 952 HAL_REO_REMAP_IX2(ring[0], 20) | 953 HAL_REO_REMAP_IX2(ring[1], 21) | 954 HAL_REO_REMAP_IX2(ring[2], 22) | 955 HAL_REO_REMAP_IX2(ring[3], 23); 956 957 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 958 HAL_REO_REMAP_IX3(ring[1], 25) | 959 HAL_REO_REMAP_IX3(ring[2], 26) | 960 HAL_REO_REMAP_IX3(ring[3], 27) | 961 HAL_REO_REMAP_IX3(ring[0], 28) | 962 HAL_REO_REMAP_IX3(ring[1], 29) | 963 HAL_REO_REMAP_IX3(ring[2], 30) | 964 HAL_REO_REMAP_IX3(ring[3], 31); 965 break; 966 } 967 } 968 969 /** 970 * hal_rx_flow_setup_fse_5332() - Setup a flow search entry in HW FST 971 * @fst: Pointer to the Rx Flow Search Table 972 * @table_offset: offset into the table where the flow is to be setup 973 * @flow: Flow Parameters 974 * 975 * Return: Success/Failure 976 */ 977 static void * 978 hal_rx_flow_setup_fse_5332(uint8_t *rx_fst, uint32_t table_offset, 979 uint8_t *rx_flow) 980 { 981 struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst; 982 struct hal_rx_flow *flow = (struct hal_rx_flow *)rx_flow; 983 uint8_t *fse; 984 bool fse_valid; 985 986 if (table_offset >= fst->max_entries) { 987 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, 988 "HAL FSE table offset %u exceeds max entries %u", 989 table_offset, fst->max_entries); 990 return NULL; 991 } 992 993 fse = (uint8_t *)fst->base_vaddr + 994 (table_offset * HAL_RX_FST_ENTRY_SIZE); 995 996 fse_valid = HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID); 997 998 if (fse_valid) { 999 QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, 1000 "HAL FSE %pK already valid", fse); 1001 return NULL; 1002 } 1003 1004 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96) = 1005 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_127_96, 1006 qdf_htonl(flow->tuple_info.src_ip_127_96)); 1007 1008 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64) = 1009 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_95_64, 1010 qdf_htonl(flow->tuple_info.src_ip_95_64)); 1011 1012 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32) = 1013 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_63_32, 1014 qdf_htonl(flow->tuple_info.src_ip_63_32)); 1015 1016 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0) = 1017 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_IP_31_0, 1018 qdf_htonl(flow->tuple_info.src_ip_31_0)); 1019 1020 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96) = 1021 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_127_96, 1022 qdf_htonl(flow->tuple_info.dest_ip_127_96)); 1023 1024 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64) = 1025 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_95_64, 1026 qdf_htonl(flow->tuple_info.dest_ip_95_64)); 1027 1028 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32) = 1029 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_63_32, 1030 qdf_htonl(flow->tuple_info.dest_ip_63_32)); 1031 1032 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0) = 1033 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_IP_31_0, 1034 qdf_htonl(flow->tuple_info.dest_ip_31_0)); 1035 1036 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT); 1037 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, DEST_PORT) |= 1038 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, DEST_PORT, 1039 (flow->tuple_info.dest_port)); 1040 1041 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT); 1042 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, SRC_PORT) |= 1043 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, SRC_PORT, 1044 (flow->tuple_info.src_port)); 1045 1046 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL); 1047 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL) |= 1048 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, L4_PROTOCOL, 1049 flow->tuple_info.l4_protocol); 1050 1051 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER); 1052 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER) |= 1053 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_HANDLER, 1054 flow->reo_destination_handler); 1055 1056 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID); 1057 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID) |= 1058 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, VALID, 1); 1059 1060 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA); 1061 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, METADATA) = 1062 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, METADATA, 1063 flow->fse_metadata); 1064 1065 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION); 1066 HAL_SET_FLD(fse, RX_FLOW_SEARCH_ENTRY, REO_DESTINATION_INDICATION) |= 1067 HAL_SET_FLD_SM(RX_FLOW_SEARCH_ENTRY, 1068 REO_DESTINATION_INDICATION, 1069 flow->reo_destination_indication); 1070 1071 /* Reset all the other fields in FSE */ 1072 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, RESERVED_9); 1073 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_DROP); 1074 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_COUNT); 1075 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, MSDU_BYTE_COUNT); 1076 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, TIMESTAMP); 1077 1078 return fse; 1079 } 1080 1081 #ifndef NO_RX_PKT_HDR_TLV 1082 /** 1083 * hal_rx_dump_pkt_hdr_tlv: dump RX pkt header TLV in hex format 1084 * @ pkt_hdr_tlv: pointer the pkt_hdr_tlv in pkt. 1085 * @ dbg_level: log level. 1086 * 1087 * Return: void 1088 */ 1089 static inline void hal_rx_dump_pkt_hdr_tlv_5332(struct rx_pkt_tlvs *pkt_tlvs, 1090 uint8_t dbg_level) 1091 { 1092 struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv; 1093 1094 hal_verbose_debug("\n---------------\n" 1095 "rx_pkt_hdr_tlv\n" 1096 "---------------\n" 1097 "phy_ppdu_id %llu ", 1098 pkt_hdr_tlv->phy_ppdu_id); 1099 1100 hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr, 1101 sizeof(pkt_hdr_tlv->rx_pkt_hdr)); 1102 } 1103 #else 1104 /** 1105 * hal_rx_dump_pkt_hdr_tlv: dump RX pkt header TLV in hex format 1106 * @ pkt_hdr_tlv: pointer the pkt_hdr_tlv in pkt. 1107 * @ dbg_level: log level. 1108 * 1109 * Return: void 1110 */ 1111 static inline void hal_rx_dump_pkt_hdr_tlv_5332(struct rx_pkt_tlvs *pkt_tlvs, 1112 uint8_t dbg_level) 1113 { 1114 } 1115 #endif 1116 1117 /** 1118 * hal_rx_dump_pkt_tlvs_5332(): API to print RX Pkt TLVS qca5332 1119 * @hal_soc_hdl: hal_soc handle 1120 * @buf: pointer the pkt buffer 1121 * @dbg_level: log level 1122 * 1123 * Return: void 1124 */ 1125 #ifdef CONFIG_WORD_BASED_TLV 1126 static void hal_rx_dump_pkt_tlvs_5332(hal_soc_handle_t hal_soc_hdl, 1127 uint8_t *buf, uint8_t dbg_level) 1128 { 1129 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1130 struct rx_msdu_end_compact *msdu_end = 1131 &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 1132 struct rx_mpdu_start_compact *mpdu_start = 1133 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 1134 1135 hal_rx_dump_msdu_end_tlv_5332(msdu_end, dbg_level); 1136 hal_rx_dump_mpdu_start_tlv_5332(mpdu_start, dbg_level); 1137 hal_rx_dump_pkt_hdr_tlv_5332(pkt_tlvs, dbg_level); 1138 } 1139 #else 1140 static void hal_rx_dump_pkt_tlvs_5332(hal_soc_handle_t hal_soc_hdl, 1141 uint8_t *buf, uint8_t dbg_level) 1142 { 1143 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1144 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 1145 struct rx_mpdu_start *mpdu_start = 1146 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 1147 1148 hal_rx_dump_msdu_end_tlv_5332(msdu_end, dbg_level); 1149 hal_rx_dump_mpdu_start_tlv_5332(mpdu_start, dbg_level); 1150 hal_rx_dump_pkt_hdr_tlv_5332(pkt_tlvs, dbg_level); 1151 } 1152 #endif 1153 1154 #define HAL_NUM_TCL_BANKS_5332 24 1155 1156 /** 1157 * hal_cmem_write_5332() - function for CMEM buffer writing 1158 * @hal_soc_hdl: HAL SOC handle 1159 * @offset: CMEM address 1160 * @value: value to write 1161 * 1162 * Return: None. 1163 */ 1164 static void hal_cmem_write_5332(hal_soc_handle_t hal_soc_hdl, 1165 uint32_t offset, 1166 uint32_t value) 1167 { 1168 struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl; 1169 1170 /* cmem region is ioremapped from CMEM_REG_BASE, hence subtracting 1171 * that from offset. 1172 */ 1173 offset = offset - CMEM_REG_BASE; 1174 pld_reg_write(hal->qdf_dev->dev, offset, value, 1175 hal->dev_base_addr_cmem); 1176 } 1177 1178 /** 1179 * hal_tx_get_num_tcl_banks_5332() - Get number of banks in target 1180 * 1181 * Returns: number of bank 1182 */ 1183 static uint8_t hal_tx_get_num_tcl_banks_5332(void) 1184 { 1185 return HAL_NUM_TCL_BANKS_5332; 1186 } 1187 1188 static void hal_reo_setup_5332(struct hal_soc *soc, void *reoparams, 1189 int qref_reset) 1190 { 1191 uint32_t reg_val; 1192 struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams; 1193 1194 reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR( 1195 REO_REG_REG_BASE)); 1196 1197 hal_reo_config_5332(soc, reg_val, reo_params); 1198 /* Other ring enable bits and REO_ENABLE will be set by FW */ 1199 1200 /* TODO: Setup destination ring mapping if enabled */ 1201 1202 /* TODO: Error destination ring setting is left to default. 1203 * Default setting is to send all errors to release ring. 1204 */ 1205 1206 /* Set the reo descriptor swap bits in case of BIG endian platform */ 1207 hal_setup_reo_swap(soc); 1208 1209 HAL_REG_WRITE(soc, 1210 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(REO_REG_REG_BASE), 1211 HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000); 1212 1213 HAL_REG_WRITE(soc, 1214 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(REO_REG_REG_BASE), 1215 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 1216 1217 HAL_REG_WRITE(soc, 1218 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(REO_REG_REG_BASE), 1219 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 1220 1221 HAL_REG_WRITE(soc, 1222 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(REO_REG_REG_BASE), 1223 (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000)); 1224 1225 /* 1226 * When hash based routing is enabled, routing of the rx packet 1227 * is done based on the following value: 1 _ _ _ _ The last 4 1228 * bits are based on hash[3:0]. This means the possible values 1229 * are 0x10 to 0x1f. This value is used to look-up the 1230 * ring ID configured in Destination_Ring_Ctrl_IX_* register. 1231 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3 1232 * registers need to be configured to set-up the 16 entries to 1233 * map the hash values to a ring number. There are 3 bits per 1234 * hash entry which are mapped as follows: 1235 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI), 1236 * 7: NOT_USED. 1237 */ 1238 if (reo_params->rx_hash_enabled) { 1239 HAL_REG_WRITE(soc, 1240 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR 1241 (REO_REG_REG_BASE), reo_params->remap0); 1242 1243 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x", 1244 HAL_REG_READ(soc, 1245 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_1_ADDR( 1246 REO_REG_REG_BASE))); 1247 1248 HAL_REG_WRITE(soc, 1249 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 1250 (REO_REG_REG_BASE), reo_params->remap1); 1251 1252 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x", 1253 HAL_REG_READ(soc, 1254 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR( 1255 REO_REG_REG_BASE))); 1256 1257 HAL_REG_WRITE(soc, 1258 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 1259 (REO_REG_REG_BASE), reo_params->remap2); 1260 1261 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x", 1262 HAL_REG_READ(soc, 1263 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR( 1264 REO_REG_REG_BASE))); 1265 } 1266 1267 /* TODO: Check if the following registers shoould be setup by host: 1268 * AGING_CONTROL 1269 * HIGH_MEMORY_THRESHOLD 1270 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2] 1271 * GLOBAL_LINK_DESC_COUNT_CTRL 1272 */ 1273 1274 hal_reo_shared_qaddr_init((hal_soc_handle_t)soc, qref_reset); 1275 } 1276 1277 static uint16_t hal_get_rx_max_ba_window_qca5332(int tid) 1278 { 1279 return HAL_RX_BA_WINDOW_1024; 1280 } 1281 1282 /** 1283 * hal_qca5332_get_reo_qdesc_size()- Get the reo queue descriptor size 1284 * from the give Block-Ack window size 1285 * Return: reo queue descriptor size 1286 */ 1287 static uint32_t hal_qca5332_get_reo_qdesc_size(uint32_t ba_window_size, int tid) 1288 { 1289 /* Hardcode the ba_window_size to HAL_RX_MAX_BA_WINDOW for 1290 * NON_QOS_TID until HW issues are resolved. 1291 */ 1292 if (tid != HAL_NON_QOS_TID) 1293 ba_window_size = hal_get_rx_max_ba_window_qca5332(tid); 1294 1295 /* Return descriptor size corresponding to window size of 2 since 1296 * we set ba_window_size to 2 while setting up REO descriptors as 1297 * a WAR to get 2k jump exception aggregates are received without 1298 * a BA session. 1299 */ 1300 if (ba_window_size <= 1) { 1301 if (tid != HAL_NON_QOS_TID) 1302 return sizeof(struct rx_reo_queue) + 1303 sizeof(struct rx_reo_queue_ext); 1304 else 1305 return sizeof(struct rx_reo_queue); 1306 } 1307 1308 if (ba_window_size <= 105) 1309 return sizeof(struct rx_reo_queue) + 1310 sizeof(struct rx_reo_queue_ext); 1311 1312 if (ba_window_size <= 210) 1313 return sizeof(struct rx_reo_queue) + 1314 (2 * sizeof(struct rx_reo_queue_ext)); 1315 1316 if (ba_window_size <= 256) 1317 return sizeof(struct rx_reo_queue) + 1318 (3 * sizeof(struct rx_reo_queue_ext)); 1319 1320 return sizeof(struct rx_reo_queue) + 1321 (10 * sizeof(struct rx_reo_queue_ext)) + 1322 sizeof(struct rx_reo_queue_1k); 1323 } 1324 /** 1325 * hal_rx_tlv_msdu_done_copy_get_5332() - Get msdu done copy bit from rx_tlv 1326 * 1327 * Returns: msdu done copy bit 1328 */ 1329 static inline uint32_t hal_rx_tlv_msdu_done_copy_get_5332(uint8_t *buf) 1330 { 1331 return HAL_RX_TLV_MSDU_DONE_COPY_GET(buf); 1332 } 1333 1334 static void hal_hw_txrx_ops_attach_qca5332(struct hal_soc *hal_soc) 1335 { 1336 /* init and setup */ 1337 hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic; 1338 hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic; 1339 hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic; 1340 hal_soc->ops->hal_get_window_address = hal_get_window_address_5332; 1341 hal_soc->ops->hal_cmem_write = hal_cmem_write_5332; 1342 1343 /* tx */ 1344 hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_5332; 1345 hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_5332; 1346 hal_soc->ops->hal_tx_comp_get_status = 1347 hal_tx_comp_get_status_generic_be; 1348 hal_soc->ops->hal_tx_init_cmd_credit_ring = 1349 hal_tx_init_cmd_credit_ring_5332; 1350 hal_soc->ops->hal_tx_set_ppe_cmn_cfg = NULL; 1351 hal_soc->ops->hal_tx_set_ppe_vp_entry = NULL; 1352 hal_soc->ops->hal_tx_set_ppe_pri2tid = NULL; 1353 hal_soc->ops->hal_tx_update_ppe_pri2tid = NULL; 1354 hal_soc->ops->hal_tx_dump_ppe_vp_entry = NULL; 1355 hal_soc->ops->hal_tx_get_num_ppe_vp_tbl_entries = NULL; 1356 hal_soc->ops->hal_tx_enable_pri2tid_map = NULL; 1357 hal_soc->ops->hal_ppeds_cfg_ast_override_map_reg = NULL; 1358 hal_soc->ops->hal_tx_config_rbm_mapping_be = 1359 hal_tx_config_rbm_mapping_be_5332; 1360 1361 /* rx */ 1362 hal_soc->ops->hal_rx_msdu_start_nss_get = hal_rx_tlv_nss_get_be; 1363 hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status = 1364 hal_rx_mon_hw_desc_get_mpdu_status_be; 1365 hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_5332; 1366 hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv = 1367 hal_rx_proc_phyrx_other_receive_info_tlv_5332; 1368 1369 hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_5332; 1370 hal_soc->ops->hal_rx_dump_mpdu_start_tlv = 1371 hal_rx_dump_mpdu_start_tlv_5332; 1372 hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_5332; 1373 1374 hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_5332; 1375 hal_soc->ops->hal_rx_mpdu_start_tid_get = hal_rx_tlv_tid_get_be; 1376 hal_soc->ops->hal_rx_msdu_start_reception_type_get = 1377 hal_rx_tlv_reception_type_get_be; 1378 hal_soc->ops->hal_rx_msdu_end_da_idx_get = 1379 hal_rx_msdu_end_da_idx_get_be; 1380 hal_soc->ops->hal_rx_msdu_desc_info_get_ptr = 1381 hal_rx_msdu_desc_info_get_ptr_5332; 1382 hal_soc->ops->hal_rx_link_desc_msdu0_ptr = 1383 hal_rx_link_desc_msdu0_ptr_5332; 1384 hal_soc->ops->hal_reo_status_get_header = 1385 hal_reo_status_get_header_5332; 1386 #ifdef QCA_MONITOR_2_0_SUPPORT 1387 hal_soc->ops->hal_rx_status_get_tlv_info = 1388 hal_rx_status_get_tlv_info_wrapper_be; 1389 #endif 1390 hal_soc->ops->hal_rx_wbm_err_info_get = 1391 hal_rx_wbm_err_info_get_generic_be; 1392 hal_soc->ops->hal_tx_set_pcp_tid_map = 1393 hal_tx_set_pcp_tid_map_generic_be; 1394 hal_soc->ops->hal_tx_update_pcp_tid_map = 1395 hal_tx_update_pcp_tid_generic_be; 1396 hal_soc->ops->hal_tx_set_tidmap_prty = 1397 hal_tx_update_tidmap_prty_generic_be; 1398 hal_soc->ops->hal_rx_get_rx_fragment_number = 1399 hal_rx_get_rx_fragment_number_be, 1400 hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get = 1401 hal_rx_tlv_da_is_mcbc_get_be; 1402 hal_soc->ops->hal_rx_msdu_end_is_tkip_mic_err = 1403 hal_rx_tlv_is_tkip_mic_err_get_be; 1404 hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get = 1405 hal_rx_tlv_sa_is_valid_get_be; 1406 hal_soc->ops->hal_rx_msdu_end_sa_idx_get = hal_rx_tlv_sa_idx_get_be; 1407 hal_soc->ops->hal_rx_desc_is_first_msdu = hal_rx_desc_is_first_msdu_be; 1408 hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get = 1409 hal_rx_tlv_l3_hdr_padding_get_be; 1410 hal_soc->ops->hal_rx_encryption_info_valid = 1411 hal_rx_encryption_info_valid_be; 1412 hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_be; 1413 hal_soc->ops->hal_rx_msdu_end_first_msdu_get = 1414 hal_rx_tlv_first_msdu_get_be; 1415 hal_soc->ops->hal_rx_msdu_end_da_is_valid_get = 1416 hal_rx_tlv_da_is_valid_get_be; 1417 hal_soc->ops->hal_rx_msdu_end_last_msdu_get = 1418 hal_rx_tlv_last_msdu_get_be; 1419 hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid = 1420 hal_rx_get_mpdu_mac_ad4_valid_be; 1421 hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get = 1422 hal_rx_mpdu_start_sw_peer_id_get_be; 1423 hal_soc->ops->hal_rx_tlv_peer_meta_data_get = 1424 hal_rx_msdu_peer_meta_data_get_be; 1425 #ifndef CONFIG_WORD_BASED_TLV 1426 hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_be; 1427 hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get = 1428 hal_rx_mpdu_info_ampdu_flag_get_be; 1429 hal_soc->ops->hal_rx_hw_desc_get_ppduid_get = 1430 hal_rx_hw_desc_get_ppduid_get_be; 1431 hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_be; 1432 hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get = 1433 hal_rx_attn_phy_ppdu_id_get_be; 1434 hal_soc->ops->hal_rx_get_filter_category = 1435 hal_rx_get_filter_category_be; 1436 #endif 1437 hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_be; 1438 hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_be; 1439 hal_soc->ops->hal_rx_get_mpdu_frame_control_valid = 1440 hal_rx_get_mpdu_frame_control_valid_be; 1441 hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_be; 1442 hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_be; 1443 hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_be; 1444 hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid = 1445 hal_rx_get_mpdu_sequence_control_valid_be; 1446 hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_be; 1447 hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_be; 1448 hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get = 1449 hal_rx_mpdu_start_mpdu_qos_control_valid_get_be; 1450 hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get = 1451 hal_rx_msdu_end_sa_sw_peer_id_get_be; 1452 hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb = 1453 hal_rx_msdu0_buffer_addr_lsb_5332; 1454 hal_soc->ops->hal_rx_msdu_desc_info_ptr_get = 1455 hal_rx_msdu_desc_info_ptr_get_5332; 1456 hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_5332; 1457 hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_5332; 1458 hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_be; 1459 hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_be; 1460 hal_soc->ops->hal_rx_get_mac_addr2_valid = 1461 hal_rx_get_mac_addr2_valid_be; 1462 hal_soc->ops->hal_reo_config = hal_reo_config_5332; 1463 hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_be; 1464 hal_soc->ops->hal_rx_msdu_flow_idx_invalid = 1465 hal_rx_msdu_flow_idx_invalid_be; 1466 hal_soc->ops->hal_rx_msdu_flow_idx_timeout = 1467 hal_rx_msdu_flow_idx_timeout_be; 1468 hal_soc->ops->hal_rx_msdu_fse_metadata_get = 1469 hal_rx_msdu_fse_metadata_get_be; 1470 hal_soc->ops->hal_rx_msdu_cce_match_get = 1471 hal_rx_msdu_cce_match_get_be; 1472 hal_soc->ops->hal_rx_msdu_cce_metadata_get = 1473 hal_rx_msdu_cce_metadata_get_be; 1474 hal_soc->ops->hal_rx_msdu_get_flow_params = 1475 hal_rx_msdu_get_flow_params_be; 1476 hal_soc->ops->hal_rx_tlv_get_tcp_chksum = hal_rx_tlv_get_tcp_chksum_be; 1477 hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_be; 1478 #if defined(QCA_WIFI_QCA5332) && defined(WLAN_CFR_ENABLE) && \ 1479 defined(WLAN_ENH_CFR_ENABLE) 1480 hal_soc->ops->hal_rx_get_bb_info = hal_rx_get_bb_info_5332; 1481 hal_soc->ops->hal_rx_get_rtt_info = hal_rx_get_rtt_info_5332; 1482 #else 1483 hal_soc->ops->hal_rx_get_bb_info = NULL; 1484 hal_soc->ops->hal_rx_get_rtt_info = NULL; 1485 #endif 1486 /* rx - msdu fast path info fields */ 1487 hal_soc->ops->hal_rx_msdu_packet_metadata_get = 1488 hal_rx_msdu_packet_metadata_get_generic_be; 1489 hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid = 1490 hal_rx_mpdu_start_tlv_tag_valid_be; 1491 hal_soc->ops->hal_rx_wbm_err_msdu_continuation_get = 1492 hal_rx_wbm_err_msdu_continuation_get_5332; 1493 1494 /* rx - TLV struct offsets */ 1495 hal_soc->ops->hal_rx_msdu_end_offset_get = 1496 hal_rx_msdu_end_offset_get_generic; 1497 hal_soc->ops->hal_rx_mpdu_start_offset_get = 1498 hal_rx_mpdu_start_offset_get_generic; 1499 #ifndef NO_RX_PKT_HDR_TLV 1500 hal_soc->ops->hal_rx_pkt_tlv_offset_get = 1501 hal_rx_pkt_tlv_offset_get_generic; 1502 #endif 1503 hal_soc->ops->hal_rx_flow_setup_fse = hal_rx_flow_setup_fse_5332; 1504 1505 hal_soc->ops->hal_rx_flow_get_tuple_info = 1506 hal_rx_flow_get_tuple_info_be; 1507 hal_soc->ops->hal_rx_flow_delete_entry = 1508 hal_rx_flow_delete_entry_be; 1509 hal_soc->ops->hal_rx_fst_get_fse_size = hal_rx_fst_get_fse_size_be; 1510 hal_soc->ops->hal_compute_reo_remap_ix2_ix3 = 1511 hal_compute_reo_remap_ix2_ix3_5332; 1512 1513 hal_soc->ops->hal_rx_msdu_get_reo_destination_indication = 1514 hal_rx_msdu_get_reo_destination_indication_be; 1515 hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_be; 1516 hal_soc->ops->hal_rx_msdu_is_wlan_mcast = 1517 hal_rx_msdu_is_wlan_mcast_generic_be; 1518 hal_soc->ops->hal_tx_get_num_tcl_banks = hal_tx_get_num_tcl_banks_5332; 1519 hal_soc->ops->hal_rx_tlv_decap_format_get = 1520 hal_rx_tlv_decap_format_get_be; 1521 #ifdef RECEIVE_OFFLOAD 1522 hal_soc->ops->hal_rx_tlv_get_offload_info = 1523 hal_rx_tlv_get_offload_info_be; 1524 hal_soc->ops->hal_rx_get_proto_params = hal_rx_get_proto_params_be; 1525 hal_soc->ops->hal_rx_get_l3_l4_offsets = hal_rx_get_l3_l4_offsets_be; 1526 #endif 1527 hal_soc->ops->hal_rx_tlv_msdu_done_get = 1528 hal_rx_tlv_msdu_done_copy_get_5332; 1529 hal_soc->ops->hal_rx_tlv_msdu_len_get = 1530 hal_rx_msdu_start_msdu_len_get_be; 1531 hal_soc->ops->hal_rx_get_frame_ctrl_field = 1532 hal_rx_get_frame_ctrl_field_be; 1533 hal_soc->ops->hal_rx_tlv_csum_err_get = hal_rx_tlv_csum_err_get_be; 1534 hal_soc->ops->hal_rx_tlv_msdu_len_set = 1535 hal_rx_msdu_start_msdu_len_set_be; 1536 hal_soc->ops->hal_rx_tlv_sgi_get = hal_rx_tlv_sgi_get_be; 1537 hal_soc->ops->hal_rx_tlv_rate_mcs_get = hal_rx_tlv_rate_mcs_get_be; 1538 hal_soc->ops->hal_rx_tlv_bw_get = hal_rx_tlv_bw_get_be; 1539 hal_soc->ops->hal_rx_tlv_get_pkt_type = hal_rx_tlv_get_pkt_type_be; 1540 hal_soc->ops->hal_rx_tlv_mic_err_get = hal_rx_tlv_mic_err_get_be; 1541 hal_soc->ops->hal_rx_tlv_decrypt_err_get = 1542 hal_rx_tlv_decrypt_err_get_be; 1543 hal_soc->ops->hal_rx_tlv_first_mpdu_get = hal_rx_tlv_first_mpdu_get_be; 1544 hal_soc->ops->hal_rx_tlv_get_is_decrypted = 1545 hal_rx_tlv_get_is_decrypted_be; 1546 hal_soc->ops->hal_rx_msdu_get_keyid = hal_rx_msdu_get_keyid_be; 1547 hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_be; 1548 hal_soc->ops->hal_rx_priv_info_set_in_tlv = 1549 hal_rx_priv_info_set_in_tlv_be; 1550 hal_soc->ops->hal_rx_priv_info_get_from_tlv = 1551 hal_rx_priv_info_get_from_tlv_be; 1552 hal_soc->ops->hal_rx_pkt_hdr_get = hal_rx_pkt_hdr_get_be; 1553 hal_soc->ops->hal_reo_setup = hal_reo_setup_5332; 1554 #ifdef REO_SHARED_QREF_TABLE_EN 1555 hal_soc->ops->hal_reo_shared_qaddr_setup = hal_reo_shared_qaddr_setup_be; 1556 hal_soc->ops->hal_reo_shared_qaddr_init = hal_reo_shared_qaddr_init_be; 1557 hal_soc->ops->hal_reo_shared_qaddr_detach = hal_reo_shared_qaddr_detach_be; 1558 hal_soc->ops->hal_reo_shared_qaddr_write = hal_reo_shared_qaddr_write_be; 1559 hal_soc->ops->hal_reo_shared_qaddr_cache_clear = hal_reo_shared_qaddr_cache_clear_be; 1560 #endif 1561 /* Overwrite the default BE ops */ 1562 hal_soc->ops->hal_get_rx_max_ba_window = 1563 hal_get_rx_max_ba_window_qca5332; 1564 hal_soc->ops->hal_get_reo_qdesc_size = hal_qca5332_get_reo_qdesc_size; 1565 /* TX MONITOR */ 1566 #ifdef QCA_MONITOR_2_0_SUPPORT 1567 hal_soc->ops->hal_txmon_is_mon_buf_addr_tlv = 1568 hal_txmon_is_mon_buf_addr_tlv_generic_be; 1569 hal_soc->ops->hal_txmon_populate_packet_info = 1570 hal_txmon_populate_packet_info_generic_be; 1571 hal_soc->ops->hal_txmon_status_parse_tlv = 1572 hal_txmon_status_parse_tlv_generic_be; 1573 hal_soc->ops->hal_txmon_status_get_num_users = 1574 hal_txmon_status_get_num_users_generic_be; 1575 #endif /* QCA_MONITOR_2_0_SUPPORT */ 1576 hal_soc->ops->hal_compute_reo_remap_ix0 = NULL; 1577 hal_soc->ops->hal_tx_vdev_mismatch_routing_set = 1578 hal_tx_vdev_mismatch_routing_set_generic_be; 1579 hal_soc->ops->hal_tx_mcast_mlo_reinject_routing_set = 1580 hal_tx_mcast_mlo_reinject_routing_set_generic_be; 1581 hal_soc->ops->hal_get_ba_aging_timeout = 1582 hal_get_ba_aging_timeout_be_generic; 1583 hal_soc->ops->hal_setup_link_idle_list = 1584 hal_setup_link_idle_list_generic_be; 1585 hal_soc->ops->hal_cookie_conversion_reg_cfg_be = 1586 hal_cookie_conversion_reg_cfg_generic_be; 1587 hal_soc->ops->hal_set_ba_aging_timeout = 1588 hal_set_ba_aging_timeout_be_generic; 1589 hal_soc->ops->hal_tx_populate_bank_register = 1590 hal_tx_populate_bank_register_be; 1591 hal_soc->ops->hal_tx_vdev_mcast_ctrl_set = 1592 hal_tx_vdev_mcast_ctrl_set_be; 1593 hal_soc->ops->hal_get_tsf2_scratch_reg = 1594 hal_get_tsf2_scratch_reg_qca5332; 1595 hal_soc->ops->hal_get_tqm_scratch_reg = 1596 hal_get_tqm_scratch_reg_qca5332; 1597 #ifdef CONFIG_WORD_BASED_TLV 1598 hal_soc->ops->hal_rx_mpdu_start_wmask_get = 1599 hal_rx_mpdu_start_wmask_get_be; 1600 hal_soc->ops->hal_rx_msdu_end_wmask_get = 1601 hal_rx_msdu_end_wmask_get_be; 1602 #endif 1603 }; 1604 1605 struct hal_hw_srng_config hw_srng_table_5332[] = { 1606 /* TODO: max_rings can populated by querying HW capabilities */ 1607 { /* REO_DST */ 1608 .start_ring_id = HAL_SRNG_REO2SW1, 1609 .max_rings = 8, 1610 .entry_size = sizeof(struct reo_destination_ring) >> 2, 1611 .lmac_ring = FALSE, 1612 .ring_dir = HAL_SRNG_DST_RING, 1613 .reg_start = { 1614 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR( 1615 REO_REG_REG_BASE), 1616 HWIO_REO_R2_REO2SW1_RING_HP_ADDR( 1617 REO_REG_REG_BASE) 1618 }, 1619 .reg_size = { 1620 HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) - 1621 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0), 1622 HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) - 1623 HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0), 1624 }, 1625 .max_size = 1626 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >> 1627 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT, 1628 }, 1629 { /* REO_EXCEPTION */ 1630 /* Designating REO2SW0 ring as exception ring. This ring is 1631 * similar to other REO2SW rings though it is named as REO2SW0. 1632 * Any of theREO2SW rings can be used as exception ring. 1633 */ 1634 .start_ring_id = HAL_SRNG_REO2SW0, 1635 .max_rings = 1, 1636 .entry_size = sizeof(struct reo_destination_ring) >> 2, 1637 .lmac_ring = FALSE, 1638 .ring_dir = HAL_SRNG_DST_RING, 1639 .reg_start = { 1640 HWIO_REO_R0_REO2SW0_RING_BASE_LSB_ADDR( 1641 REO_REG_REG_BASE), 1642 HWIO_REO_R2_REO2SW0_RING_HP_ADDR( 1643 REO_REG_REG_BASE) 1644 }, 1645 /* Single ring - provide ring size if multiple rings of this 1646 * type are supported 1647 */ 1648 .reg_size = {}, 1649 .max_size = 1650 HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_BMSK >> 1651 HWIO_REO_R0_REO2SW0_RING_BASE_MSB_RING_SIZE_SHFT, 1652 }, 1653 { /* REO_REINJECT */ 1654 .start_ring_id = HAL_SRNG_SW2REO, 1655 .max_rings = 4, 1656 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 1657 .lmac_ring = FALSE, 1658 .ring_dir = HAL_SRNG_SRC_RING, 1659 .reg_start = { 1660 HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR( 1661 REO_REG_REG_BASE), 1662 HWIO_REO_R2_SW2REO_RING_HP_ADDR( 1663 REO_REG_REG_BASE) 1664 }, 1665 /* Single ring - provide ring size if multiple rings of this 1666 * type are supported 1667 */ 1668 .reg_size = { 1669 HWIO_REO_R0_SW2REO1_RING_BASE_LSB_ADDR(0) - 1670 HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR(0), 1671 HWIO_REO_R2_SW2REO1_RING_HP_ADDR(0) - 1672 HWIO_REO_R2_SW2REO_RING_HP_ADDR(0) 1673 }, 1674 .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >> 1675 HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT, 1676 }, 1677 { /* REO_CMD */ 1678 .start_ring_id = HAL_SRNG_REO_CMD, 1679 .max_rings = 1, 1680 .entry_size = (sizeof(struct tlv_32_hdr) + 1681 sizeof(struct reo_get_queue_stats)) >> 2, 1682 .lmac_ring = FALSE, 1683 .ring_dir = HAL_SRNG_SRC_RING, 1684 .reg_start = { 1685 HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR( 1686 REO_REG_REG_BASE), 1687 HWIO_REO_R2_REO_CMD_RING_HP_ADDR( 1688 REO_REG_REG_BASE), 1689 }, 1690 /* Single ring - provide ring size if multiple rings of this 1691 * type are supported 1692 */ 1693 .reg_size = {}, 1694 .max_size = HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >> 1695 HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT, 1696 }, 1697 { /* REO_STATUS */ 1698 .start_ring_id = HAL_SRNG_REO_STATUS, 1699 .max_rings = 1, 1700 .entry_size = (sizeof(struct tlv_32_hdr) + 1701 sizeof(struct reo_get_queue_stats_status)) >> 2, 1702 .lmac_ring = FALSE, 1703 .ring_dir = HAL_SRNG_DST_RING, 1704 .reg_start = { 1705 HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR( 1706 REO_REG_REG_BASE), 1707 HWIO_REO_R2_REO_STATUS_RING_HP_ADDR( 1708 REO_REG_REG_BASE), 1709 }, 1710 /* Single ring - provide ring size if multiple rings of this 1711 * type are supported 1712 */ 1713 .reg_size = {}, 1714 .max_size = 1715 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> 1716 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, 1717 }, 1718 { /* TCL_DATA */ 1719 .start_ring_id = HAL_SRNG_SW2TCL1, 1720 .max_rings = 6, 1721 .entry_size = sizeof(struct tcl_data_cmd) >> 2, 1722 .lmac_ring = FALSE, 1723 .ring_dir = HAL_SRNG_SRC_RING, 1724 .reg_start = { 1725 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR( 1726 MAC_TCL_REG_REG_BASE), 1727 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR( 1728 MAC_TCL_REG_REG_BASE), 1729 }, 1730 .reg_size = { 1731 HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) - 1732 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0), 1733 HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) - 1734 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0), 1735 }, 1736 .max_size = 1737 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >> 1738 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT, 1739 }, 1740 { /* TCL_CMD/CREDIT */ 1741 /* qca8074v2 and qca5332 uses this ring for data commands */ 1742 .start_ring_id = HAL_SRNG_SW2TCL_CMD, 1743 .max_rings = 1, 1744 .entry_size = sizeof(struct tcl_data_cmd) >> 2, 1745 .lmac_ring = FALSE, 1746 .ring_dir = HAL_SRNG_SRC_RING, 1747 .reg_start = { 1748 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_LSB_ADDR( 1749 MAC_TCL_REG_REG_BASE), 1750 HWIO_TCL_R2_SW2TCL_CREDIT_RING_HP_ADDR( 1751 MAC_TCL_REG_REG_BASE), 1752 }, 1753 /* Single ring - provide ring size if multiple rings of this 1754 * type are supported 1755 */ 1756 .reg_size = {}, 1757 .max_size = 1758 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_BMSK >> 1759 HWIO_TCL_R0_SW2TCL_CREDIT_RING_BASE_MSB_RING_SIZE_SHFT, 1760 }, 1761 { /* TCL_STATUS */ 1762 .start_ring_id = HAL_SRNG_TCL_STATUS, 1763 .max_rings = 1, 1764 .entry_size = (sizeof(struct tlv_32_hdr) + 1765 sizeof(struct tcl_status_ring)) >> 2, 1766 .lmac_ring = FALSE, 1767 .ring_dir = HAL_SRNG_DST_RING, 1768 .reg_start = { 1769 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR( 1770 MAC_TCL_REG_REG_BASE), 1771 HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR( 1772 MAC_TCL_REG_REG_BASE), 1773 }, 1774 /* Single ring - provide ring size if multiple rings of this 1775 * type are supported 1776 */ 1777 .reg_size = {}, 1778 .max_size = 1779 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >> 1780 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT, 1781 }, 1782 { /* CE_SRC */ 1783 .start_ring_id = HAL_SRNG_CE_0_SRC, 1784 .max_rings = 16, 1785 .entry_size = sizeof(struct ce_src_desc) >> 2, 1786 .lmac_ring = FALSE, 1787 .ring_dir = HAL_SRNG_SRC_RING, 1788 .reg_start = { 1789 HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_LSB_ADDR( 1790 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE), 1791 HWIO_WFSS_CE_CHANNEL_SRC_R2_SRC_RING_HP_ADDR( 1792 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE), 1793 }, 1794 .reg_size = { 1795 WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE - 1796 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE, 1797 WFSS_CE_1_CHANNEL_SRC_REG_REG_BASE - 1798 WFSS_CE_0_CHANNEL_SRC_REG_REG_BASE, 1799 }, 1800 .max_size = 1801 HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_BMSK >> 1802 HWIO_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_BASE_MSB_RING_SIZE_SHFT, 1803 }, 1804 { /* CE_DST */ 1805 .start_ring_id = HAL_SRNG_CE_0_DST, 1806 .max_rings = 16, 1807 .entry_size = 8 >> 2, 1808 /*TODO: entry_size above should actually be 1809 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition 1810 * of struct ce_dst_desc in HW header files 1811 */ 1812 .lmac_ring = FALSE, 1813 .ring_dir = HAL_SRNG_SRC_RING, 1814 .reg_start = { 1815 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR( 1816 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 1817 HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR( 1818 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 1819 }, 1820 .reg_size = { 1821 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 1822 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 1823 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 1824 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 1825 }, 1826 .max_size = 1827 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> 1828 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT, 1829 }, 1830 { /* CE_DST_STATUS */ 1831 .start_ring_id = HAL_SRNG_CE_0_DST_STATUS, 1832 .max_rings = 16, 1833 .entry_size = sizeof(struct ce_stat_desc) >> 2, 1834 .lmac_ring = FALSE, 1835 .ring_dir = HAL_SRNG_DST_RING, 1836 .reg_start = { 1837 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR( 1838 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 1839 HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR( 1840 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE), 1841 }, 1842 /* TODO: check destination status ring registers */ 1843 .reg_size = { 1844 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 1845 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 1846 WFSS_CE_1_CHANNEL_DST_REG_REG_BASE - 1847 WFSS_CE_0_CHANNEL_DST_REG_REG_BASE, 1848 }, 1849 .max_size = 1850 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> 1851 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, 1852 }, 1853 { /* WBM_IDLE_LINK */ 1854 .start_ring_id = HAL_SRNG_WBM_IDLE_LINK, 1855 .max_rings = 1, 1856 .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2, 1857 .lmac_ring = FALSE, 1858 .ring_dir = HAL_SRNG_SRC_RING, 1859 .reg_start = { 1860 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE), 1861 HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(WBM_REG_REG_BASE), 1862 }, 1863 /* Single ring - provide ring size if multiple rings of this 1864 * type are supported 1865 */ 1866 .reg_size = {}, 1867 .max_size = 1868 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >> 1869 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT, 1870 }, 1871 { /* SW2WBM_RELEASE */ 1872 .start_ring_id = HAL_SRNG_WBM_SW_RELEASE, 1873 .max_rings = 1, 1874 .entry_size = sizeof(struct wbm_release_ring) >> 2, 1875 .lmac_ring = FALSE, 1876 .ring_dir = HAL_SRNG_SRC_RING, 1877 .reg_start = { 1878 HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(WBM_REG_REG_BASE), 1879 HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(WBM_REG_REG_BASE), 1880 }, 1881 /* Single ring - provide ring size if multiple rings of this 1882 * type are supported 1883 */ 1884 .reg_size = {}, 1885 .max_size = 1886 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 1887 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 1888 }, 1889 { /* WBM2SW_RELEASE */ 1890 .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE, 1891 .max_rings = 8, 1892 .entry_size = sizeof(struct wbm_release_ring) >> 2, 1893 .lmac_ring = FALSE, 1894 .ring_dir = HAL_SRNG_DST_RING, 1895 .reg_start = { 1896 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR( 1897 WBM_REG_REG_BASE), 1898 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR( 1899 WBM_REG_REG_BASE), 1900 }, 1901 .reg_size = { 1902 HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR( 1903 WBM_REG_REG_BASE) - 1904 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR( 1905 WBM_REG_REG_BASE), 1906 HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR( 1907 WBM_REG_REG_BASE) - 1908 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR( 1909 WBM_REG_REG_BASE), 1910 }, 1911 .max_size = 1912 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 1913 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 1914 }, 1915 { /* RXDMA_BUF */ 1916 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0, 1917 #ifdef IPA_OFFLOAD 1918 .max_rings = 3, 1919 #else 1920 .max_rings = 3, 1921 #endif 1922 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 1923 .lmac_ring = TRUE, 1924 .ring_dir = HAL_SRNG_SRC_RING, 1925 /* reg_start is not set because LMAC rings are not accessed 1926 * from host 1927 */ 1928 .reg_start = {}, 1929 .reg_size = {}, 1930 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1931 }, 1932 { /* RXDMA_DST */ 1933 .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0, 1934 .max_rings = 0, 1935 .entry_size = 0/*sizeof(struct reo_entrance_ring) >> 2*/, 1936 .lmac_ring = TRUE, 1937 .ring_dir = HAL_SRNG_DST_RING, 1938 /* reg_start is not set because LMAC rings are not accessed 1939 * from host 1940 */ 1941 .reg_start = {}, 1942 .reg_size = {}, 1943 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1944 }, 1945 #ifdef QCA_MONITOR_2_0_SUPPORT 1946 { /* RXDMA_MONITOR_BUF */ 1947 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF, 1948 .max_rings = 1, 1949 .entry_size = sizeof(struct mon_ingress_ring) >> 2, 1950 .lmac_ring = TRUE, 1951 .ring_dir = HAL_SRNG_SRC_RING, 1952 /* reg_start is not set because LMAC rings are not accessed 1953 * from host 1954 */ 1955 .reg_start = {}, 1956 .reg_size = {}, 1957 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 1958 }, 1959 #else 1960 {}, 1961 #endif 1962 { /* RXDMA_MONITOR_STATUS */ 1963 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF, 1964 .max_rings = 0, 1965 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 1966 .lmac_ring = TRUE, 1967 .ring_dir = HAL_SRNG_SRC_RING, 1968 /* reg_start is not set because LMAC rings are not accessed 1969 * from host 1970 */ 1971 .reg_start = {}, 1972 .reg_size = {}, 1973 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1974 }, 1975 #ifdef QCA_MONITOR_2_0_SUPPORT 1976 { /* RXDMA_MONITOR_DST */ 1977 .start_ring_id = HAL_SRNG_WMAC1_RXMON2SW0, 1978 .max_rings = 2, 1979 .entry_size = sizeof(struct mon_destination_ring) >> 2, 1980 .lmac_ring = TRUE, 1981 .ring_dir = HAL_SRNG_DST_RING, 1982 /* reg_start is not set because LMAC rings are not accessed 1983 * from host 1984 */ 1985 .reg_start = {}, 1986 .reg_size = {}, 1987 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 1988 }, 1989 #else 1990 {}, 1991 #endif 1992 { /* RXDMA_MONITOR_DESC */ 1993 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC, 1994 .max_rings = 0, 1995 .entry_size = 0/*sizeof(struct sw_monitor_ring) >> 2*/, 1996 .lmac_ring = TRUE, 1997 .ring_dir = HAL_SRNG_DST_RING, 1998 /* reg_start is not set because LMAC rings are not accessed 1999 * from host 2000 */ 2001 .reg_start = {}, 2002 .reg_size = {}, 2003 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 2004 }, 2005 2006 { /* DIR_BUF_RX_DMA_SRC */ 2007 .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, 2008 /* one ring for spectral and one ring for cfr */ 2009 .max_rings = 2, 2010 .entry_size = 2, 2011 .lmac_ring = TRUE, 2012 .ring_dir = HAL_SRNG_SRC_RING, 2013 /* reg_start is not set because LMAC rings are not accessed 2014 * from host 2015 */ 2016 .reg_start = {}, 2017 .reg_size = {}, 2018 .max_size = HAL_RXDMA_MAX_RING_SIZE, 2019 }, 2020 #ifdef WLAN_FEATURE_CIF_CFR 2021 { /* WIFI_POS_SRC */ 2022 .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING, 2023 .max_rings = 1, 2024 .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2, 2025 .lmac_ring = TRUE, 2026 .ring_dir = HAL_SRNG_SRC_RING, 2027 /* reg_start is not set because LMAC rings are not accessed 2028 * from host 2029 */ 2030 .reg_start = {}, 2031 .reg_size = {}, 2032 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 2033 }, 2034 #endif 2035 /* PPE rings are not present in Miami. Added dummy entries to preserve 2036 * Array Index 2037 */ 2038 /* REO2PPE */ 2039 {}, 2040 /* PPE2TCL */ 2041 {}, 2042 /* PPE_RELEASE */ 2043 {}, 2044 #ifdef QCA_MONITOR_2_0_SUPPORT 2045 { /* TX_MONITOR_BUF */ 2046 .start_ring_id = HAL_SRNG_SW2TXMON_BUF0, 2047 .max_rings = 1, 2048 .entry_size = sizeof(struct mon_ingress_ring) >> 2, 2049 .lmac_ring = TRUE, 2050 .ring_dir = HAL_SRNG_SRC_RING, 2051 /* reg_start is not set because LMAC rings are not accessed 2052 * from host 2053 */ 2054 .reg_start = {}, 2055 .reg_size = {}, 2056 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 2057 }, 2058 { /* TX_MONITOR_DST */ 2059 .start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0, 2060 .max_rings = 2, 2061 .entry_size = sizeof(struct mon_destination_ring) >> 2, 2062 .lmac_ring = TRUE, 2063 .ring_dir = HAL_SRNG_DST_RING, 2064 /* reg_start is not set because LMAC rings are not accessed 2065 * from host 2066 */ 2067 .reg_start = {}, 2068 .reg_size = {}, 2069 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 2070 }, 2071 #else 2072 {}, 2073 {}, 2074 #endif 2075 { /* SW2RXDMA */ 2076 .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0, 2077 .max_rings = 3, 2078 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 2079 .lmac_ring = TRUE, 2080 .ring_dir = HAL_SRNG_SRC_RING, 2081 /* reg_start is not set because LMAC rings are not accessed 2082 * from host 2083 */ 2084 .reg_start = {}, 2085 .reg_size = {}, 2086 .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, 2087 .dmac_cmn_ring = TRUE, 2088 }, 2089 }; 2090 2091 /** 2092 * hal_srng_hw_reg_offset_init_qca5332() - Initialize the HW srng reg offset 2093 * applicable only for qca5332 2094 * @hal_soc: HAL Soc handle 2095 * 2096 * Return: None 2097 */ 2098 static inline void hal_srng_hw_reg_offset_init_qca5332(struct hal_soc *hal_soc) 2099 { 2100 int32_t *hw_reg_offset = hal_soc->hal_hw_reg_offset; 2101 2102 hw_reg_offset[DST_MSI2_BASE_LSB] = REG_OFFSET(DST, MSI2_BASE_LSB), 2103 hw_reg_offset[DST_MSI2_BASE_MSB] = REG_OFFSET(DST, MSI2_BASE_MSB), 2104 hw_reg_offset[DST_MSI2_DATA] = REG_OFFSET(DST, MSI2_DATA), 2105 hw_reg_offset[DST_PRODUCER_INT2_SETUP] = 2106 REG_OFFSET(DST, PRODUCER_INT2_SETUP); 2107 } 2108 2109 /** 2110 * hal_qca5332_attach()- Attach 5332 target specific hal_soc ops, 2111 * offset and srng table 2112 * Return: void 2113 */ 2114 void hal_qca5332_attach(struct hal_soc *hal_soc) 2115 { 2116 hal_soc->hw_srng_table = hw_srng_table_5332; 2117 2118 hal_srng_hw_reg_offset_init_generic(hal_soc); 2119 hal_srng_hw_reg_offset_init_qca5332(hal_soc); 2120 2121 hal_hw_txrx_default_ops_attach_be(hal_soc); 2122 hal_hw_txrx_ops_attach_qca5332(hal_soc); 2123 hal_soc->dmac_cmn_src_rxbuf_ring = true; 2124 } 2125