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