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