1 /* 2 * Copyright (c) 2016-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 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _HAL_BE_RX_TLV_H_ 21 #define _HAL_BE_RX_TLV_H_ 22 23 #include "hal_api_mon.h" 24 25 /* 26 * Structures & Macros to obtain fields from the TLV's in the Rx packet 27 * pre-header. 28 */ 29 30 #define HAL_RX_BE_PKT_HDR_TLV_LEN 112 31 32 struct rx_pkt_hdr_tlv { 33 uint64_t tag; /* 8 B */ 34 uint64_t phy_ppdu_id; /* 8 B */ 35 char rx_pkt_hdr[HAL_RX_BE_PKT_HDR_TLV_LEN]; /* 112 B */ 36 }; 37 38 #ifdef CONFIG_WORD_BASED_TLV 39 #ifndef BIG_ENDIAN_HOST 40 struct rx_msdu_end_compact { 41 uint32_t sa_sw_peer_id : 16, 42 sa_idx_timeout : 1, 43 da_idx_timeout : 1, 44 to_ds : 1, 45 tid : 4, 46 sa_is_valid : 1, 47 da_is_valid : 1, 48 da_is_mcbc : 1, 49 l3_header_padding : 2, 50 first_msdu : 1, 51 last_msdu : 1, 52 fr_ds : 1, 53 ip_chksum_fail_copy : 1; 54 uint32_t sa_idx : 16, 55 da_idx_or_sw_peer_id : 16; 56 uint32_t msdu_drop : 1, 57 reo_destination_indication : 5, 58 flow_idx : 20, 59 use_ppe : 1, 60 mesh_sta : 2, 61 vlan_ctag_stripped : 1, 62 vlan_stag_stripped : 1, 63 fragment_flag : 1; 64 uint32_t fse_metadata : 32; 65 uint32_t cce_metadata : 16, 66 tcp_udp_chksum : 16; 67 uint32_t aggregation_count : 8, 68 flow_aggregation_continuation : 1, 69 fisa_timeout : 1, 70 tcp_udp_chksum_fail_copy : 1, 71 msdu_limit_error : 1, 72 flow_idx_timeout : 1, 73 flow_idx_invalid : 1, 74 cce_match : 1, 75 amsdu_parser_error : 1, 76 cumulative_ip_length : 16; 77 uint32_t key_id_octet : 8, 78 reserved_8a : 24; 79 uint32_t reserved_9a : 6, 80 service_code : 9, 81 priority_valid : 1, 82 intra_bss : 1, 83 dest_chip_id : 2, 84 multicast_echo : 1, 85 wds_learning_event : 1, 86 wds_roaming_event : 1, 87 wds_keep_alive_event : 1, 88 reserved_9b : 9; 89 uint32_t msdu_length : 14, 90 stbc : 1, 91 ipsec_esp : 1, 92 l3_offset : 7, 93 ipsec_ah : 1, 94 l4_offset : 8; 95 uint32_t msdu_number : 8, 96 decap_format : 2, 97 ipv4_proto : 1, 98 ipv6_proto : 1, 99 tcp_proto : 1, 100 udp_proto : 1, 101 ip_frag : 1, 102 tcp_only_ack : 1, 103 da_is_bcast_mcast : 1, 104 toeplitz_hash_sel : 2, 105 ip_fixed_header_valid : 1, 106 ip_extn_header_valid : 1, 107 tcp_udp_header_valid : 1, 108 mesh_control_present : 1, 109 ldpc : 1, 110 ip4_protocol_ip6_next_header : 8; 111 uint32_t vlan_ctag_ci : 16, 112 vlan_stag_ci : 16; 113 uint32_t peer_meta_data : 32; 114 uint32_t user_rssi : 8, 115 pkt_type : 4, 116 sgi : 2, 117 rate_mcs : 4, 118 receive_bandwidth : 3, 119 reception_type : 3, 120 mimo_ss_bitmap : 7, 121 msdu_done_copy : 1; 122 uint32_t flow_id_toeplitz : 32; 123 uint32_t ppdu_start_timestamp_63_32; 124 uint32_t sw_phy_meta_data : 32; 125 uint32_t first_mpdu : 1, 126 reserved_16a : 1, 127 mcast_bcast : 1, 128 ast_index_not_found : 1, 129 ast_index_timeout : 1, 130 power_mgmt : 1, 131 non_qos : 1, 132 null_data : 1, 133 mgmt_type : 1, 134 ctrl_type : 1, 135 more_data : 1, 136 eosp : 1, 137 a_msdu_error : 1, 138 reserved_16b : 1, 139 order : 1, 140 wifi_parser_error : 1, 141 overflow_err : 1, 142 msdu_length_err : 1, 143 tcp_udp_chksum_fail : 1, 144 ip_chksum_fail : 1, 145 sa_idx_invalid : 1, 146 da_idx_invalid : 1, 147 amsdu_addr_mismatch : 1, 148 rx_in_tx_decrypt_byp : 1, 149 encrypt_required : 1, 150 directed : 1, 151 buffer_fragment : 1, 152 mpdu_length_err : 1, 153 tkip_mic_err : 1, 154 decrypt_err : 1, 155 unencrypted_frame_err : 1, 156 fcs_err : 1; 157 uint32_t reserved_17a : 10, 158 decrypt_status_code : 3, 159 rx_bitmap_not_updated : 1, 160 reserved_17b : 17, 161 msdu_done : 1; 162 }; 163 164 struct rx_mpdu_start_compact { 165 uint32_t rx_reo_queue_desc_addr_39_32 : 8, 166 receive_queue_number : 16, 167 pre_delim_err_warning : 1, 168 first_delim_err : 1, 169 reserved_0 : 6; 170 uint32_t pn_31_0 : 32; 171 uint32_t pn_63_32 : 32; 172 uint32_t pn_95_64 : 32; 173 uint32_t ast_index : 16, 174 sw_peer_id : 16; 175 uint32_t mpdu_frame_control_valid : 1, 176 mpdu_duration_valid : 1, 177 mac_addr_ad1_valid : 1, 178 mac_addr_ad2_valid : 1, 179 mac_addr_ad3_valid : 1, 180 mac_addr_ad4_valid : 1, 181 mpdu_sequence_control_valid : 1, 182 mpdu_qos_control_valid : 1, 183 mpdu_ht_control_valid : 1, 184 frame_encryption_info_valid : 1, 185 mpdu_fragment_number : 4, 186 more_fragment_flag : 1, 187 reserved_7a : 1, 188 fr_ds : 1, 189 to_ds : 1, 190 encrypted : 1, 191 mpdu_retry : 1, 192 mpdu_sequence_number : 12; 193 uint32_t mpdu_frame_control_field : 16, 194 mpdu_duration_field : 16; 195 uint32_t mac_addr_ad1_31_0 : 32; 196 uint32_t mac_addr_ad1_47_32 : 16, 197 mac_addr_ad2_15_0 : 16; 198 uint32_t mac_addr_ad2_47_16 : 32; 199 uint32_t mac_addr_ad3_31_0 : 32; 200 uint32_t mac_addr_ad3_47_32 : 16, 201 mpdu_sequence_control_field : 16; 202 }; 203 #else 204 struct rx_msdu_end_compact { 205 uint32_t ip_chksum_fail_copy : 1, 206 fr_ds : 1, 207 last_msdu : 1, 208 first_msdu : 1, 209 l3_header_padding : 2, 210 da_is_mcbc : 1, 211 da_is_valid : 1, 212 sa_is_valid : 1, 213 tid : 4, 214 to_ds : 1, 215 da_idx_timeout : 1, 216 sa_idx_timeout : 1, 217 sa_sw_peer_id : 16; 218 uint32_t da_idx_or_sw_peer_id : 16, 219 sa_idx : 16; 220 uint32_t fragment_flag : 1, 221 vlan_stag_stripped : 1, 222 vlan_ctag_stripped : 1, 223 mesh_sta : 2, 224 use_ppe : 1, 225 flow_idx : 20, 226 reo_destination_indication : 5, 227 msdu_drop : 1; 228 uint32_t fse_metadata : 32; 229 uint32_t tcp_udp_chksum : 16, 230 cce_metadata : 16; 231 uint32_t cumulative_ip_length : 16, 232 amsdu_parser_error : 1, 233 cce_match : 1, 234 flow_idx_invalid : 1, 235 flow_idx_timeout : 1, 236 msdu_limit_error : 1, 237 tcp_udp_chksum_fail_copy : 1, 238 fisa_timeout : 1, 239 flow_aggregation_continuation : 1, 240 aggregation_count : 8; 241 uint32_t reserved_8a : 24, 242 key_id_octet : 8; 243 uint32_t reserved_9b : 9, 244 wds_keep_alive_event : 1, 245 wds_roaming_event : 1, 246 wds_learning_event : 1, 247 multicast_echo : 1, 248 dest_chip_id : 2, 249 intra_bss : 1, 250 priority_valid : 1, 251 service_code : 9, 252 reserved_9a : 6; 253 uint32_t l4_offset : 8, 254 ipsec_ah : 1, 255 l3_offset : 7, 256 ipsec_esp : 1, 257 stbc : 1, 258 msdu_length : 14; 259 uint32_t ip4_protocol_ip6_next_header : 8, 260 ldpc : 1, 261 mesh_control_present : 1, 262 tcp_udp_header_valid : 1, 263 ip_extn_header_valid : 1, 264 ip_fixed_header_valid : 1, 265 toeplitz_hash_sel : 2, 266 da_is_bcast_mcast : 1, 267 tcp_only_ack : 1, 268 ip_frag : 1, 269 udp_proto : 1, 270 tcp_proto : 1, 271 ipv6_proto : 1, 272 ipv4_proto : 1, 273 decap_format : 2, 274 msdu_number : 8; 275 uint32_t vlan_stag_ci : 16, 276 vlan_ctag_ci : 16; 277 uint32_t peer_meta_data : 32; 278 uint32_t msdu_done_copy : 1, 279 mimo_ss_bitmap : 7, 280 reception_type : 3, 281 receive_bandwidth : 3, 282 rate_mcs : 4, 283 sgi : 2, 284 pkt_type : 4, 285 user_rssi : 8; 286 uint32_t flow_id_toeplitz : 32; 287 uint32_t ppdu_start_timestamp_63_32; 288 uint32_t sw_phy_meta_data : 32; 289 uint32_t fcs_err : 1, 290 unencrypted_frame_err : 1, 291 decrypt_err : 1, 292 tkip_mic_err : 1, 293 mpdu_length_err : 1, 294 buffer_fragment : 1, 295 directed : 1, 296 encrypt_required : 1, 297 rx_in_tx_decrypt_byp : 1, 298 amsdu_addr_mismatch : 1, 299 da_idx_invalid : 1, 300 sa_idx_invalid : 1, 301 ip_chksum_fail : 1, 302 tcp_udp_chksum_fail : 1, 303 msdu_length_err : 1, 304 overflow_err : 1, 305 wifi_parser_error : 1, 306 order : 1, 307 reserved_16b : 1, 308 a_msdu_error : 1, 309 eosp : 1, 310 more_data : 1, 311 ctrl_type : 1, 312 mgmt_type : 1, 313 null_data : 1, 314 non_qos : 1, 315 power_mgmt : 1, 316 ast_index_timeout : 1, 317 ast_index_not_found : 1, 318 mcast_bcast : 1, 319 reserved_16a : 1, 320 first_mpdu : 1; 321 uint32_t msdu_done : 1, 322 reserved_17b : 17, 323 rx_bitmap_not_updated : 1, 324 decrypt_status_code : 3, 325 reserved_17a : 10; 326 }; 327 328 struct rx_mpdu_start_compact { 329 uint32_t reserved_0 : 6, 330 first_delim_err : 1, 331 pre_delim_err_warning : 1, 332 receive_queue_number : 16, 333 rx_reo_queue_desc_addr_39_32 : 8; 334 uint32_t pn_31_0 : 32; 335 uint32_t pn_63_32 : 32; 336 uint32_t pn_95_64 : 32; 337 uint32_t sw_peer_id : 16, 338 ast_index : 16; 339 uint32_t mpdu_sequence_number : 12, 340 mpdu_retry : 1, 341 encrypted : 1, 342 to_ds : 1, 343 fr_ds : 1, 344 reserved_7a : 1, 345 more_fragment_flag : 1, 346 mpdu_fragment_number : 4, 347 frame_encryption_info_valid : 1, 348 mpdu_ht_control_valid : 1, 349 mpdu_qos_control_valid : 1, 350 mpdu_sequence_control_valid : 1, 351 mac_addr_ad4_valid : 1, 352 mac_addr_ad3_valid : 1, 353 mac_addr_ad2_valid : 1, 354 mac_addr_ad1_valid : 1, 355 mpdu_duration_valid : 1, 356 mpdu_frame_control_valid : 1; 357 uint32_t mpdu_duration_field : 16, 358 mpdu_frame_control_field : 16, 359 uint32_t mac_addr_ad1_31_0 : 32; 360 uint32_t mac_addr_ad2_15_0 : 16, 361 mac_addr_ad1_47_32 : 16; 362 uint32_t mac_addr_ad2_47_16 : 32; 363 uint32_t mac_addr_ad3_31_0 : 32; 364 uint32_t mpdu_sequence_control_field : 16, 365 mac_addr_ad3_47_32 : 16; 366 }; 367 #endif 368 #define RX_BE_PADDING0_BYTES 4 369 370 typedef struct rx_mpdu_start_compact hal_rx_mpdu_start_t; 371 typedef struct rx_msdu_end_compact hal_rx_msdu_end_t; 372 373 struct rx_mpdu_start_tlv { 374 hal_rx_mpdu_start_t rx_mpdu_start; 375 }; 376 377 struct rx_msdu_end_tlv { 378 uint64_t tag; /* 8 B */ 379 hal_rx_msdu_end_t rx_msdu_end; 380 }; 381 382 struct rx_pkt_tlvs { 383 struct rx_msdu_end_tlv msdu_end_tlv; /* 80 bytes */ 384 struct rx_mpdu_start_tlv mpdu_start_tlv; /* 48 bytes */ 385 }; 386 387 #define HAL_RX_MSDU_END(_rx_pkt_tlv) \ 388 (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->msdu_end_tlv.rx_msdu_end) 389 390 #define HAL_RX_MPDU_START(_rx_pkt_tlv) \ 391 (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->mpdu_start_tlv. \ 392 rx_mpdu_start) 393 394 #define HAL_RX_TLV_TID_GET(_rx_pkt_tlv) \ 395 HAL_RX_MSDU_END(_rx_pkt_tlv).tid 396 397 #define HAL_RX_TLV_FIRST_MPDU_GET(_rx_pkt_tlv) \ 398 HAL_RX_MSDU_END(_rx_pkt_tlv).first_mpdu 399 #else /* CONFIG_WORD_BASED_TLV */ 400 typedef struct rx_mpdu_start hal_rx_mpdu_start_t; 401 typedef struct rx_msdu_end hal_rx_msdu_end_t; 402 403 #define RX_BE_PADDING0_BYTES 8 404 /* 405 * Each RX descriptor TLV is preceded by 1 QWORD "tag" 406 */ 407 408 #ifndef CONFIG_NO_TLV_TAGS 409 struct rx_mpdu_start_tlv { 410 uint64_t tag; /* 8 B */ 411 hal_rx_mpdu_start_t rx_mpdu_start; 412 }; 413 414 struct rx_msdu_end_tlv { 415 uint64_t tag; /* 8 B */ 416 hal_rx_msdu_end_t rx_msdu_end; 417 }; 418 419 struct rx_pkt_tlvs { 420 struct rx_msdu_end_tlv msdu_end_tlv; /* 120 bytes */ 421 uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; /* 8 bytes */ 422 struct rx_mpdu_start_tlv mpdu_start_tlv; /* 120 bytes */ 423 #ifndef NO_RX_PKT_HDR_TLV 424 struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */ 425 #endif 426 }; 427 428 #else 429 struct rx_mpdu_start_tlv { 430 hal_rx_mpdu_start_t rx_mpdu_start; 431 }; 432 433 struct rx_msdu_end_tlv { 434 hal_rx_msdu_end_t rx_msdu_end; 435 }; 436 437 struct rx_pkt_tlvs { 438 struct rx_msdu_end_tlv msdu_end_tlv; /* 128 bytes */ 439 struct rx_mpdu_start_tlv mpdu_start_tlv; /* 120 bytes */ 440 uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; /* 8 bytes */ 441 #ifndef NO_RX_PKT_HDR_TLV 442 struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 128 bytes */ 443 #endif 444 }; 445 #endif /*CONFIG_NO_TLV_TAGS */ 446 447 #define HAL_RX_MSDU_END(_rx_pkt_tlv) \ 448 (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->msdu_end_tlv.rx_msdu_end) 449 450 #define HAL_RX_MPDU_START(_rx_pkt_tlv) \ 451 (((struct rx_pkt_tlvs *)_rx_pkt_tlv)->mpdu_start_tlv. \ 452 rx_mpdu_start.rx_mpdu_info_details) 453 454 #define HAL_RX_REO_QUEUE_DESC_ADDR_31_0_GET(_rx_pkt_tlv) \ 455 HAL_RX_MPDU_START(_rx_pkt_tlv).rx_reo_queue_desc_addr_31_0 456 457 #define HAL_RX_TLV_AMPDU_FLAG_GET(_rx_pkt_tlv) \ 458 HAL_RX_MPDU_START(_rx_pkt_tlv).ampdu_flag 459 460 #define HAL_RX_TLV_MPDU_PN_127_96_GET(_rx_pkt_tlv) \ 461 HAL_RX_MPDU_START(_rx_pkt_tlv).pn_127_96 462 463 #define HAL_RX_TLV_TID_GET(_rx_pkt_tlv) \ 464 HAL_RX_MPDU_START(_rx_pkt_tlv).tid 465 466 #define HAL_RX_TLV_FIRST_MPDU_GET(_rx_pkt_tlv) \ 467 HAL_RX_MPDU_START(_rx_pkt_tlv).first_mpdu 468 469 #define HAL_RX_TLV_L3_TYPE_GET(_rx_pkt_tlv) \ 470 HAL_RX_MSDU_END(_rx_pkt_tlv).l3_type 471 472 #define HAL_RX_GET_PPDU_ID(_rx_pkt_tlv) \ 473 HAL_RX_MPDU_START(_rx_pkt_tlv).phy_ppdu_id 474 475 #define HAL_RX_TLV_PHY_PPDU_ID_GET(_rx_pkt_tlv) \ 476 HAL_RX_MSDU_END(_rx_pkt_tlv).phy_ppdu_id 477 478 #define HAL_RX_GET_FILTER_CATEGORY(_rx_pkt_tlv) \ 479 HAL_RX_MPDU_START(_rx_pkt_tlv).rxpcu_mpdu_filter_in_category 480 481 #define HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(_rx_pkt_tlv) \ 482 HAL_RX_MPDU_START(_rx_pkt_tlv).sw_frame_group_id 483 484 #endif /* CONFIG_WORD_BASED_TLV */ 485 486 /** 487 * struct rx_mon_pkt_tlvs - RX packet data structure for DEST ring in the 488 * monitor mode. 489 * @msdu_end_tlv: MSDU end TLV 490 * @rx_padding0: Padding bytes 491 * @mpdu_start_tlv: MPDU start TLV 492 * @pkt_hdr_tlv: 802.11 packet header TLV 493 */ 494 struct rx_mon_pkt_tlvs { 495 struct rx_msdu_end_tlv msdu_end_tlv; /* 128B + sizeof(tag) */ 496 uint8_t rx_padding0[RX_BE_PADDING0_BYTES]; /* 8B */ 497 struct rx_mpdu_start_tlv mpdu_start_tlv; /* 120B + sizeof(tag) */ 498 struct rx_pkt_hdr_tlv pkt_hdr_tlv; /* 120B + sizeof(tag) */ 499 }; 500 501 #define SIZE_OF_DATA_RX_TLV sizeof(struct rx_pkt_tlvs) 502 #define SIZE_OF_MON_DATA_RX_TLV sizeof(struct rx_mon_pkt_tlvs) 503 504 #define RX_PKT_TLVS_LEN SIZE_OF_DATA_RX_TLV 505 #define MON_RX_PKT_TLVS_LEN SIZE_OF_MON_DATA_RX_TLV 506 507 #define RX_PKT_TLV_OFFSET(field) qdf_offsetof(struct rx_pkt_tlvs, field) 508 509 #define HAL_RX_TLV_MSDU_DONE_GET(_rx_pkt_tlv) \ 510 HAL_RX_MSDU_END(_rx_pkt_tlv).msdu_done 511 512 #define HAL_RX_TLV_DECAP_FORMAT_GET(_rx_pkt_tlv) \ 513 HAL_RX_MSDU_END(_rx_pkt_tlv).decap_format 514 515 #ifdef RECEIVE_OFFLOAD 516 #define HAL_RX_TLV_GET_TCP_PURE_ACK(_rx_pkt_tlv) \ 517 HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_only_ack 518 519 #define HAL_RX_TLV_GET_TCP_PROTO(_rx_pkt_tlv) \ 520 HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_proto 521 522 #define HAL_RX_TLV_GET_UDP_PROTO(_rx_pkt_tlv) \ 523 HAL_RX_MSDU_END(_rx_pkt_tlv).udp_proto 524 525 #define HAL_RX_TLV_GET_IPV6(_rx_pkt_tlv) \ 526 HAL_RX_MSDU_END(_rx_pkt_tlv).ipv6_proto 527 528 #define HAL_RX_TLV_GET_IP_OFFSET(_rx_pkt_tlv) \ 529 HAL_RX_MSDU_END(_rx_pkt_tlv).l3_offset 530 531 #define HAL_RX_TLV_GET_TCP_OFFSET(_rx_pkt_tlv) \ 532 HAL_RX_MSDU_END(_rx_pkt_tlv).l4_offset 533 #endif /* RECEIVE_OFFLOAD */ 534 535 #define HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(_rx_pkt_tlv) \ 536 HAL_RX_MSDU_END(_rx_pkt_tlv).flow_id_toeplitz 537 538 #define HAL_RX_TLV_MSDU_LEN_GET(_rx_pkt_tlv) \ 539 HAL_RX_MSDU_END(_rx_pkt_tlv).msdu_length 540 541 #define HAL_RX_TLV_CCE_MATCH_GET(_rx_pkt_tlv) \ 542 HAL_RX_MSDU_END(_rx_pkt_tlv).cce_match 543 544 #define HAL_RX_TLV_BW_GET(_rx_pkt_tlv) \ 545 HAL_RX_MSDU_END(_rx_pkt_tlv).receive_bandwidth 546 547 #define HAL_RX_TLV_FLOWID_TOEPLITZ_GET(_rx_pkt_tlv) \ 548 HAL_RX_MSDU_END(_rx_pkt_tlv).flow_id_toeplitz 549 550 #define HAL_RX_TLV_SGI_GET(_rx_pkt_tlv) \ 551 HAL_RX_MSDU_END(_rx_pkt_tlv).sgi 552 553 #define HAL_RX_TLV_RATE_MCS_GET(_rx_pkt_tlv) \ 554 HAL_RX_MSDU_END(_rx_pkt_tlv).rate_mcs 555 556 #define HAL_RX_TLV_DECRYPT_STATUS_GET(_rx_pkt_tlv) \ 557 HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_status_code 558 559 #define HAL_RX_TLV_RSSI_GET(_rx_pkt_tlv) \ 560 HAL_RX_MSDU_END(_rx_pkt_tlv).user_rssi 561 562 #define HAL_RX_TLV_FREQ_GET(_rx_pkt_tlv) \ 563 HAL_RX_MSDU_END(_rx_pkt_tlv).sw_phy_meta_data 564 565 #define HAL_RX_TLV_PKT_TYPE_GET(_rx_pkt_tlv) \ 566 HAL_RX_MSDU_END(_rx_pkt_tlv).pkt_type 567 568 #define HAL_RX_TLV_DECRYPT_ERR_GET(_rx_pkt_tlv) \ 569 HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_err 570 571 #define HAL_RX_TLV_MIC_ERR_GET(_rx_pkt_tlv) \ 572 HAL_RX_MSDU_END(_rx_pkt_tlv).tkip_mic_err 573 574 #define HAL_RX_TLV_MIMO_SS_BITMAP(_rx_pkt_tlv)\ 575 HAL_RX_MSDU_END(_rx_pkt_tlv).mimo_ss_bitmap 576 577 #define HAL_RX_TLV_ANT_SIGNAL_DB_GET(_rx_pkt_tlv) \ 578 HAL_RX_MSDU_END(_rx_pkt_tlv).user_rssi 579 580 #define HAL_RX_TLV_STBC_GET(_rx_pkt_tlv) \ 581 HAL_RX_MSDU_END(_rx_pkt_tlv).stbc 582 583 #define HAL_RX_TLV_RECEPTION_TYPE_GET(_rx_pkt_tlv) \ 584 HAL_RX_MSDU_END(_rx_pkt_tlv).reception_type 585 586 #define HAL_RX_TLV_IP_CSUM_FAIL_GET(_rx_pkt_tlv) \ 587 HAL_RX_MSDU_END(_rx_pkt_tlv).ip_chksum_fail 588 589 #define HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(_rx_pkt_tlv) \ 590 HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_udp_chksum_fail 591 592 #define HAL_RX_TLV_MPDU_LEN_ERR_GET(_rx_pkt_tlv) \ 593 HAL_RX_MSDU_END(_rx_pkt_tlv).mpdu_length_err 594 595 #define HAL_RX_TLV_MPDU_FCS_ERR_GET(_rx_pkt_tlv) \ 596 HAL_RX_MSDU_END(_rx_pkt_tlv).fcs_err 597 598 #define HAL_RX_TLV_IS_MCAST_GET(_rx_pkt_tlv) \ 599 HAL_RX_MSDU_END(_rx_pkt_tlv).mcast_bcast 600 601 #ifdef RECEIVE_OFFLOAD 602 /** 603 * LRO information needed from the TLVs 604 */ 605 #define HAL_RX_TLV_GET_LRO_ELIGIBLE(_rx_pkt_tlv) \ 606 HAL_RX_MSDU_END(_rx_pkt_tlv).lro_eligible 607 608 #define HAL_RX_TLV_GET_TCP_ACK(_rx_pkt_tlv) \ 609 HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_ack_number 610 611 #define HAL_RX_TLV_GET_TCP_SEQ(_rx_pkt_tlv) \ 612 HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_seq_number 613 614 #define HAL_RX_TLV_GET_TCP_WIN(_rx_pkt_tlv) \ 615 HAL_RX_MSDU_END(_rx_pkt_tlv).window_size 616 #endif 617 618 #define HAL_RX_TLV_L3_TYPE_GET(_rx_pkt_tlv) \ 619 HAL_RX_MSDU_END(_rx_pkt_tlv).l3_type 620 621 #ifdef RX_MSDU_END_PEER_META_DATA_OFFSET 622 #define HAL_RX_TLV_MSDU_PEER_META_DATA_GET(_rx_pkt_tlv) \ 623 HAL_RX_MSDU_END(_rx_pkt_tlv).peer_meta_data 624 #endif 625 626 #define HAL_RX_TLV_PEER_META_DATA_GET(_rx_pkt_tlv) \ 627 HAL_RX_MPDU_START(_rx_pkt_tlv).peer_meta_data 628 629 #define HAL_RX_TLV_KEYID_OCTET_GET(_rx_pkt_tlv) \ 630 HAL_RX_MSDU_END(_rx_pkt_tlv).key_id_octet 631 632 #define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(_rx_pkt_tlv) \ 633 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_sequence_number 634 635 #define HAL_RX_TLV_SA_SW_PEER_ID_GET(_rx_pkt_tlv) \ 636 HAL_RX_MSDU_END(_rx_pkt_tlv).sa_sw_peer_id 637 638 #define HAL_RX_TLV_L3_HEADER_PADDING_GET(_rx_pkt_tlv) \ 639 HAL_RX_MSDU_END(_rx_pkt_tlv).l3_header_padding 640 641 #define HAL_RX_TLV_SA_IDX_GET(_rx_pkt_tlv) \ 642 HAL_RX_MSDU_END(_rx_pkt_tlv).sa_idx 643 644 #define HAL_RX_TLV_DA_IDX_GET(_rx_pkt_tlv) \ 645 HAL_RX_MSDU_END(_rx_pkt_tlv).da_idx_or_sw_peer_id 646 647 #define HAL_RX_TLV_FIRST_MSDU_GET(_rx_pkt_tlv) \ 648 HAL_RX_MSDU_END(_rx_pkt_tlv).first_msdu 649 650 #define HAL_RX_TLV_LAST_MSDU_GET(_rx_pkt_tlv) \ 651 HAL_RX_MSDU_END(_rx_pkt_tlv).last_msdu 652 653 #define HAL_RX_TLV_DA_IS_MCBC_GET(_rx_pkt_tlv) \ 654 HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_mcbc 655 656 #define HAL_RX_TLV_IS_TKIP_MIC_ERR_GET(_rx_pkt_tlv) \ 657 HAL_RX_MSDU_END(_rx_pkt_tlv).tkip_mic_err 658 659 #define HAL_RX_TLV_SA_IS_VALID_GET(_rx_pkt_tlv) \ 660 HAL_RX_MSDU_END(_rx_pkt_tlv).sa_is_valid 661 662 #define HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(_rx_pkt_tlv) \ 663 HAL_RX_MPDU_START(_rx_pkt_tlv).frame_encryption_info_valid 664 665 #define HAL_RX_TLV_MPDU_PN_31_0_GET(_rx_pkt_tlv) \ 666 HAL_RX_MPDU_START(_rx_pkt_tlv).pn_31_0 667 668 #define HAL_RX_TLV_MPDU_PN_63_32_GET(_rx_pkt_tlv) \ 669 HAL_RX_MPDU_START(_rx_pkt_tlv).pn_63_32 670 671 #define HAL_RX_TLV_MPDU_PN_95_64_GET(_rx_pkt_tlv) \ 672 HAL_RX_MPDU_START(_rx_pkt_tlv).pn_95_64 673 674 #define HAL_RX_TLV_DA_IS_VALID_GET(_rx_pkt_tlv) \ 675 HAL_RX_MSDU_END(_rx_pkt_tlv).da_is_valid 676 677 #define HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(_rx_pkt_tlv) \ 678 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_valid 679 680 #define HAL_RX_TLV_SW_PEER_ID_GET(_rx_pkt_tlv) \ 681 HAL_RX_MPDU_START(_rx_pkt_tlv).sw_peer_id 682 683 #define HAL_RX_TLV_MPDU_GET_TODS(_rx_pkt_tlv) \ 684 HAL_RX_MPDU_START(_rx_pkt_tlv).to_ds 685 686 #define HAL_RX_TLV_MPDU_GET_FROMDS(_rx_pkt_tlv) \ 687 HAL_RX_MPDU_START(_rx_pkt_tlv).fr_ds 688 689 #define HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(_rx_pkt_tlv) \ 690 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_valid 691 692 #define HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET(_rx_pkt_tlv) \ 693 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_valid 694 695 #define HAL_RX_TLV_MPDU_AD1_31_0_GET(_rx_pkt_tlv) \ 696 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_31_0 697 698 #define HAL_RX_TLV_MPDU_AD1_47_32_GET(_rx_pkt_tlv) \ 699 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad1_47_32 700 701 #define HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(_rx_pkt_tlv) \ 702 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_valid 703 704 #define HAL_RX_TLV_MPDU_AD2_15_0_GET(_rx_pkt_tlv) \ 705 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_15_0 706 707 #define HAL_RX_TLV_MPDU_AD2_47_16_GET(_rx_pkt_tlv) \ 708 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad2_47_16 709 710 #define HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(_rx_pkt_tlv) \ 711 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_valid 712 713 #define HAL_RX_TLV_MPDU_AD3_31_0_GET(_rx_pkt_tlv) \ 714 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_31_0 715 716 #define HAL_RX_TLV_MPDU_AD3_47_32_GET(_rx_pkt_tlv) \ 717 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad3_47_32 718 719 #define HAL_RX_TLV_MPDU_AD4_31_0_GET(_rx_pkt_tlv) \ 720 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_31_0 721 722 #define HAL_RX_TLV_MPDU_AD4_47_32_GET(_rx_pkt_tlv) \ 723 HAL_RX_MPDU_START(_rx_pkt_tlv).mac_addr_ad4_47_32 724 725 #define HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(_rx_pkt_tlv) \ 726 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_sequence_control_valid 727 728 #define HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(_rx_pkt_tlv) \ 729 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_qos_control_valid 730 731 #define HAL_RX_TLV_GET_FC_VALID(_rx_pkt_tlv) \ 732 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_valid 733 734 #define HAL_RX_TLV_GET_TO_DS_FLAG(_rx_pkt_tlv) \ 735 HAL_RX_MPDU_START(_rx_pkt_tlv).to_ds 736 737 #define HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(_rx_pkt_tlv) \ 738 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_frame_control_field 739 740 #define HAL_RX_TLV_FLOW_IDX_GET(_rx_pkt_tlv) \ 741 HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx 742 743 #define HAL_RX_TLV_REO_DEST_IND_GET(_rx_pkt_tlv) \ 744 HAL_RX_MSDU_END(_rx_pkt_tlv).reo_destination_indication 745 746 #define HAL_RX_TLV_FLOW_IDX_INVALID_GET(_rx_pkt_tlv) \ 747 HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx_invalid 748 749 #define HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(_rx_pkt_tlv) \ 750 HAL_RX_MSDU_END(_rx_pkt_tlv).flow_idx_timeout 751 752 #define HAL_RX_TLV_FSE_METADATA_GET(_rx_pkt_tlv) \ 753 HAL_RX_MSDU_END(_rx_pkt_tlv).fse_metadata 754 755 #define HAL_RX_TLV_CCE_METADATA_GET(_rx_pkt_tlv) \ 756 HAL_RX_MSDU_END(_rx_pkt_tlv).cce_metadata 757 758 #define HAL_RX_TLV_DECRYPT_STATUS_GET(_rx_pkt_tlv) \ 759 HAL_RX_MSDU_END(_rx_pkt_tlv).decrypt_status_code 760 761 #define HAL_RX_TLV_GET_TCP_CHKSUM(_rx_pkt_tlv) \ 762 HAL_RX_MSDU_END(_rx_pkt_tlv).tcp_udp_chksum 763 764 #define HAL_RX_TLV_GET_FLOW_AGGR_CONT(_rx_pkt_tlv) \ 765 HAL_RX_MSDU_END(_rx_pkt_tlv).flow_aggregation_continuation 766 767 #define HAL_RX_TLV_GET_FLOW_AGGR_COUNT(_rx_pkt_tlv) \ 768 HAL_RX_MSDU_END(_rx_pkt_tlv).aggregation_count 769 770 #define HAL_RX_TLV_GET_FISA_TIMEOUT(_rx_pkt_tlv) \ 771 HAL_RX_MSDU_END(_rx_pkt_tlv).fisa_timeout 772 773 #define HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(_rx_pkt_tlv) \ 774 HAL_RX_MSDU_END(_rx_pkt_tlv).cumulative_l4_checksum 775 776 #define HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(_rx_pkt_tlv) \ 777 HAL_RX_MSDU_END(_rx_pkt_tlv).cumulative_ip_length 778 779 #define HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(_rx_pkt_tlv) \ 780 HAL_RX_MPDU_START(_rx_pkt_tlv).mpdu_qos_control_valid 781 782 #define HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(_rx_pkt_tlv) \ 783 HAL_RX_MSDU_END(_rx_pkt_tlv).sa_sw_peer_id 784 785 #define HAL_RX_REO_QUEUE_DESC_ADDR_39_32_GET(_rx_pkt_tlv) \ 786 HAL_RX_MPDU_START(_rx_pkt_tlv).rx_reo_queue_desc_addr_39_32 787 788 /* used by monitor mode for parsing from full TLV */ 789 #define HAL_RX_MON_GET_FC_VALID(_rx_mpdu_start) \ 790 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, MPDU_FRAME_CONTROL_VALID) 791 792 #define HAL_RX_MON_GET_TO_DS_FLAG(_rx_mpdu_start) \ 793 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, TO_DS) 794 795 #define HAL_RX_MON_GET_MAC_ADDR2_VALID(_rx_mpdu_start) \ 796 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, MAC_ADDR_AD2_VALID) 797 798 static inline 799 uint32_t hal_rx_tlv_decap_format_get_be(void *hw_desc_addr) 800 { 801 struct rx_pkt_tlvs *rx_pkt_tlvs = 802 (struct rx_pkt_tlvs *)hw_desc_addr; 803 804 return HAL_RX_TLV_DECAP_FORMAT_GET(rx_pkt_tlvs); 805 } 806 807 static inline uint32_t hal_rx_tlv_msdu_done_get_be(uint8_t *buf) 808 { 809 return HAL_RX_TLV_MSDU_DONE_GET(buf); 810 } 811 812 /* 813 * hal_rx_attn_first_mpdu_get(): get fist_mpdu bit from rx attention 814 * @buf: pointer to rx_pkt_tlvs 815 * 816 * return: uint32_t(first_msdu) 817 */ 818 static inline uint32_t hal_rx_tlv_first_mpdu_get_be(uint8_t *buf) 819 { 820 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 821 822 return HAL_RX_TLV_FIRST_MPDU_GET(rx_pkt_tlvs); 823 } 824 825 /* 826 * hal_rx_msdu_cce_match_get(): get CCE match bit 827 * from rx attention 828 * @buf: pointer to rx_pkt_tlvs 829 * Return: CCE match value 830 */ 831 static inline bool hal_rx_msdu_cce_match_get_be(uint8_t *buf) 832 { 833 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 834 835 return HAL_RX_TLV_CCE_MATCH_GET(rx_pkt_tlvs); 836 } 837 838 #ifdef RX_MSDU_END_PEER_META_DATA_OFFSET 839 /* 840 * Get peer_meta_data from RX_MSDU_END 841 */ 842 843 static inline uint32_t hal_rx_msdu_peer_meta_data_get_be(uint8_t *buf) 844 { 845 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 846 847 return HAL_RX_TLV_MSDU_PEER_META_DATA_GET(rx_pkt_tlvs); 848 } 849 #endif 850 851 /* 852 * hal_rx_mpdu_get_addr1_be(): API to check get address1 of the mpdu 853 * 854 * @buf: pointer to the start of RX PKT TLV headera 855 * @mac_addr: pointer to mac address 856 * Return: success/failure 857 */ 858 static inline QDF_STATUS hal_rx_mpdu_get_addr1_be(uint8_t *buf, 859 uint8_t *mac_addr) 860 { 861 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 862 struct __attribute__((__packed__)) hal_addr1 { 863 uint32_t ad1_31_0; 864 uint16_t ad1_47_32; 865 }; 866 struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr; 867 uint32_t mac_addr_ad1_valid; 868 869 mac_addr_ad1_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD1_VALID_GET( 870 rx_pkt_tlvs); 871 872 if (mac_addr_ad1_valid) { 873 addr->ad1_31_0 = HAL_RX_TLV_MPDU_AD1_31_0_GET(rx_pkt_tlvs); 874 addr->ad1_47_32 = HAL_RX_TLV_MPDU_AD1_47_32_GET(rx_pkt_tlvs); 875 return QDF_STATUS_SUCCESS; 876 } 877 878 return QDF_STATUS_E_FAILURE; 879 } 880 881 #ifndef CONFIG_WORD_BASED_TLV 882 /** 883 * hal_rx_mpdu_info_ampdu_flag_get_be(): get ampdu flag bit 884 * from rx mpdu info 885 * @buf: pointer to rx_pkt_tlvs 886 * 887 * Return: ampdu flag 888 */ 889 static inline bool hal_rx_mpdu_info_ampdu_flag_get_be(uint8_t *buf) 890 { 891 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 892 893 return !!HAL_RX_TLV_AMPDU_FLAG_GET(rx_pkt_tlvs); 894 } 895 896 /** 897 * hal_rx_get_qdesc_addr_be(): API to get qdesc address of reo 898 * entrance ring desc 899 * 900 * @dst_ring_desc: reo dest ring descriptor (used for Lithium DP) 901 * @buf: pointer to the start of RX PKT TLV headers 902 * Return: qdesc adrress in reo destination ring buffer 903 */ 904 static inline uint64_t hal_rx_get_qdesc_addr_be(uint8_t *dst_ring_desc, 905 uint8_t *buf) 906 { 907 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 908 909 return (uint64_t)HAL_RX_REO_QUEUE_DESC_ADDR_31_0_GET(rx_pkt_tlvs); 910 } 911 912 /* 913 * @ hal_rx_print_pn_be: Prints the PN of rx packet. 914 * 915 * @ buf: rx_tlv_hdr of the received packet 916 * @ Return: void 917 */ 918 static inline void hal_rx_print_pn_be(uint8_t *buf) 919 { 920 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 921 922 uint32_t pn_31_0 = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs); 923 uint32_t pn_63_32 = HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs); 924 uint32_t pn_95_64 = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs); 925 uint32_t pn_127_96 = HAL_RX_TLV_MPDU_PN_127_96_GET(rx_pkt_tlvs); 926 927 hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ", 928 pn_127_96, pn_95_64, pn_63_32, pn_31_0); 929 } 930 931 static inline void hal_rx_tlv_get_pn_num_be(uint8_t *buf, uint64_t *pn_num) 932 { 933 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 934 935 pn_num[0] = HAL_RX_TLV_MPDU_PN_31_0_GET(pkt_tlvs); 936 pn_num[0] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_63_32_GET(pkt_tlvs) << 32); 937 938 pn_num[1] = HAL_RX_TLV_MPDU_PN_95_64_GET(pkt_tlvs); 939 pn_num[1] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_127_96_GET(pkt_tlvs) << 32); 940 } 941 942 /* 943 * hal_rx_mpdu_get_addr4_be(): API to get address4 of the mpdu 944 * in the packet 945 * 946 * @buf: pointer to the start of RX PKT TLV header 947 * @mac_addr: pointer to mac address 948 * Return: success/failure 949 */ 950 static inline QDF_STATUS hal_rx_mpdu_get_addr4_be(uint8_t *buf, 951 uint8_t *mac_addr) 952 { 953 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 954 struct __attribute__((__packed__)) hal_addr4 { 955 uint32_t ad4_31_0; 956 uint16_t ad4_47_32; 957 }; 958 struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr; 959 uint32_t mac_addr_ad4_valid; 960 961 mac_addr_ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(pkt_tlvs); 962 963 if (mac_addr_ad4_valid) { 964 addr->ad4_31_0 = HAL_RX_TLV_MPDU_AD4_31_0_GET(pkt_tlvs); 965 addr->ad4_47_32 = HAL_RX_TLV_MPDU_AD4_47_32_GET(pkt_tlvs); 966 return QDF_STATUS_SUCCESS; 967 } 968 969 return QDF_STATUS_E_FAILURE; 970 } 971 972 /** 973 * hal_rx_priv_info_set_in_tlv_be(): Save the private info to 974 * the reserved bytes of rx_tlv_hdr 975 * @buf: start of rx_tlv_hdr 976 * @priv_data: hal_wbm_err_desc_info structure 977 * @len: length of the private data 978 * Return: void 979 */ 980 static inline void hal_rx_priv_info_set_in_tlv_be(uint8_t *buf, 981 uint8_t *priv_data, 982 uint32_t len) 983 { 984 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 985 uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ? 986 RX_BE_PADDING0_BYTES : len; 987 988 qdf_mem_copy(pkt_tlvs->rx_padding0, priv_data, copy_len); 989 } 990 991 /** 992 * hal_rx_priv_info_get_from_tlv_be(): retrieve the private data from 993 * the reserved bytes of rx_tlv_hdr. 994 * @buf: start of rx_tlv_hdr 995 * @priv_data: Handle to get the private data, output parameter. 996 * @len: length of the private data 997 * Return: void 998 */ 999 static inline void hal_rx_priv_info_get_from_tlv_be(uint8_t *buf, 1000 uint8_t *priv_data, 1001 uint32_t len) 1002 { 1003 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1004 uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ? 1005 RX_BE_PADDING0_BYTES : len; 1006 1007 qdf_mem_copy(priv_data, pkt_tlvs->rx_padding0, copy_len); 1008 } 1009 1010 /** 1011 * hal_rx_tlv_l3_type_get_be(): API to get the l3 type 1012 * from rx_msdu_start TLV 1013 * 1014 * @buf: pointer to the start of RX PKT TLV headers 1015 * Return: uint32_t(l3 type) 1016 */ 1017 static inline uint32_t hal_rx_tlv_l3_type_get_be(uint8_t *buf) 1018 { 1019 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1020 1021 return HAL_RX_TLV_L3_TYPE_GET(rx_pkt_tlvs); 1022 } 1023 1024 /** 1025 * hal_rx_hw_desc_get_ppduid_get_be(): retrieve ppdu id 1026 * @rx_tlv_hdr: start address of rx_pkt_tlvs 1027 * @rxdma_dst_ring_desc: Rx HW descriptor 1028 * 1029 * Return: ppdu id 1030 */ 1031 static inline uint32_t 1032 hal_rx_hw_desc_get_ppduid_get_be(void *rx_tlv_hdr, void *rxdma_dst_ring_desc) 1033 { 1034 struct rx_pkt_tlvs *rx_pkt_tlvs = 1035 (struct rx_pkt_tlvs *)rx_tlv_hdr; 1036 1037 return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs); 1038 } 1039 1040 /* 1041 * hal_rx_tlv_phy_ppdu_id_get(): get phy_ppdu_id value 1042 * from rx attention 1043 * @buf: pointer to rx_pkt_tlvs 1044 * 1045 * Return: phy_ppdu_id 1046 */ 1047 static inline uint16_t hal_rx_tlv_phy_ppdu_id_get_be(uint8_t *buf) 1048 { 1049 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1050 1051 return HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs); 1052 } 1053 1054 /* 1055 * hal_rx_attn_phy_ppdu_id_get(): get phy_ppdu_id value 1056 * from rx attention 1057 * @buf: pointer to rx_pkt_tlvs 1058 * 1059 * Return: phy_ppdu_id 1060 */ 1061 static inline uint16_t hal_rx_attn_phy_ppdu_id_get_be(uint8_t *buf) 1062 { 1063 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1064 uint16_t phy_ppdu_id; 1065 1066 phy_ppdu_id = HAL_RX_TLV_PHY_PPDU_ID_GET(rx_pkt_tlvs); 1067 1068 return phy_ppdu_id; 1069 } 1070 1071 static inline uint32_t 1072 hal_rx_get_ppdu_id_be(uint8_t *buf) 1073 { 1074 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1075 1076 return HAL_RX_GET_PPDU_ID(rx_pkt_tlvs); 1077 } 1078 1079 /* 1080 * hal_rx_mpdu_peer_meta_data_set: set peer meta data in RX mpdu start tlv 1081 * 1082 * @buf: rx_tlv_hdr of the received packet 1083 * @peer_mdata: peer meta data to be set. 1084 * Return: void 1085 */ 1086 static inline void 1087 hal_rx_mpdu_peer_meta_data_set_be(uint8_t *buf, uint32_t peer_mdata) 1088 { 1089 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1090 1091 HAL_RX_TLV_PEER_META_DATA_GET(rx_pkt_tlvs) = peer_mdata; 1092 } 1093 1094 /* 1095 * Get peer_meta_data from RX_MPDU_INFO within RX_MPDU_START 1096 */ 1097 1098 static inline uint32_t hal_rx_mpdu_peer_meta_data_get_be(uint8_t *buf) 1099 { 1100 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1101 1102 return HAL_RX_TLV_PEER_META_DATA_GET(rx_pkt_tlvs); 1103 } 1104 1105 static inline uint8_t hal_rx_get_filter_category_be(uint8_t *buf) 1106 { 1107 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1108 1109 return HAL_RX_GET_FILTER_CATEGORY(rx_pkt_tlvs); 1110 } 1111 1112 /** 1113 * hal_rx_is_unicast_be: check packet is unicast frame or not. 1114 * 1115 * @ buf: pointer to rx pkt TLV. 1116 * Return: true on unicast. 1117 */ 1118 static inline bool hal_rx_is_unicast_be(uint8_t *buf) 1119 { 1120 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1121 uint32_t grp_id; 1122 1123 grp_id = HAL_RX_TLV_SW_FRAME_GROUP_ID_GET(rx_pkt_tlvs); 1124 1125 return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false; 1126 } 1127 1128 #else 1129 #define IS_ADDR_MULTICAST(_a) (*(_a) & 0x01) 1130 /** 1131 * hal_rx_is_unicast_be: check packet is unicast frame or not. 1132 * 1133 * @ buf: pointer to rx pkt TLV. 1134 * Return: true on unicast. 1135 */ 1136 static inline bool hal_rx_is_unicast_be(uint8_t *buf) 1137 { 1138 uint8_t mac[QDF_MAC_ADDR_SIZE] = {0}; 1139 1140 hal_rx_mpdu_get_addr1_be(buf, &mac[0]); 1141 1142 return !IS_ADDR_MULTICAST(mac); 1143 } 1144 1145 /** 1146 * hal_rx_priv_info_set_in_tlv_be(): Save the private info to 1147 * the reserved bytes of rx_tlv_hdr 1148 * @buf: start of rx_tlv_hdr 1149 * @priv_data: hal_wbm_err_desc_info structure 1150 * @len: length of the private data 1151 * Return: void 1152 */ 1153 static inline void hal_rx_priv_info_set_in_tlv_be(uint8_t *buf, 1154 uint8_t *priv_data, 1155 uint32_t len) 1156 { 1157 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1158 uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ? 1159 RX_BE_PADDING0_BYTES : len; 1160 1161 qdf_mem_copy(&(HAL_RX_MSDU_END(pkt_tlvs).ppdu_start_timestamp_63_32), 1162 priv_data, copy_len); 1163 } 1164 1165 /** 1166 * hal_rx_priv_info_get_from_tlv_be(): retrieve the private data from 1167 * the reserved bytes of rx_tlv_hdr. 1168 * @buf: start of rx_tlv_hdr 1169 * @priv_data: Handle to get the private data, output parameter. 1170 * @len: length of the private data 1171 * Return: void 1172 */ 1173 static inline void hal_rx_priv_info_get_from_tlv_be(uint8_t *buf, 1174 uint8_t *priv_data, 1175 uint32_t len) 1176 { 1177 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1178 uint32_t copy_len = (len > RX_BE_PADDING0_BYTES) ? 1179 RX_BE_PADDING0_BYTES : len; 1180 1181 qdf_mem_copy(priv_data, 1182 &(HAL_RX_MSDU_END(pkt_tlvs).ppdu_start_timestamp_63_32), 1183 copy_len); 1184 } 1185 1186 /* 1187 * @ hal_rx_print_pn_be: Prints the PN of rx packet. 1188 * 1189 * @ buf: rx_tlv_hdr of the received packet 1190 * @ Return: void 1191 */ 1192 static inline void hal_rx_print_pn_be(uint8_t *buf) 1193 { 1194 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1195 1196 uint32_t pn_31_0 = HAL_RX_TLV_MPDU_PN_31_0_GET(rx_pkt_tlvs); 1197 uint32_t pn_63_32 = HAL_RX_TLV_MPDU_PN_63_32_GET(rx_pkt_tlvs); 1198 uint32_t pn_95_64 = HAL_RX_TLV_MPDU_PN_95_64_GET(rx_pkt_tlvs); 1199 1200 hal_debug("PN number pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ", 1201 pn_95_64, pn_63_32, pn_31_0); 1202 } 1203 1204 static inline void hal_rx_tlv_get_pn_num_be(uint8_t *buf, uint64_t *pn_num) 1205 { 1206 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1207 1208 pn_num[0] = HAL_RX_TLV_MPDU_PN_31_0_GET(pkt_tlvs); 1209 pn_num[0] |= ((uint64_t)HAL_RX_TLV_MPDU_PN_63_32_GET(pkt_tlvs) << 32); 1210 1211 pn_num[1] = HAL_RX_TLV_MPDU_PN_95_64_GET(pkt_tlvs); 1212 } 1213 #endif 1214 1215 /** 1216 * hal_rx_tlv_msdu_len_get(): API to get the MSDU length 1217 * from rx_msdu_start TLV 1218 * 1219 * @ buf: pointer to the start of RX PKT TLV headers 1220 * Return: msdu length 1221 */ 1222 static inline uint32_t hal_rx_tlv_msdu_len_get_be(uint8_t *buf) 1223 { 1224 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1225 1226 return HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs); 1227 } 1228 1229 /** 1230 * hal_rx_tlv_msdu_len_set(): API to set the MSDU length 1231 * from rx_msdu_start TLV 1232 * 1233 * @buf: pointer to the start of RX PKT TLV headers 1234 * @len: msdu length 1235 * 1236 * Return: none 1237 */ 1238 static inline void hal_rx_tlv_msdu_len_set_be(uint8_t *buf, uint32_t len) 1239 { 1240 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1241 1242 HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs) = len; 1243 } 1244 1245 /* 1246 * hal_rx_tlv_bw_get(): API to get the Bandwidth 1247 * Interval from rx_msdu_start 1248 * 1249 * @buf: pointer to the start of RX PKT TLV header 1250 * Return: uint32_t(bw) 1251 */ 1252 static inline uint32_t hal_rx_tlv_bw_get_be(uint8_t *buf) 1253 { 1254 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1255 1256 return HAL_RX_TLV_BW_GET(rx_pkt_tlvs); 1257 } 1258 1259 /** 1260 * hal_rx_tlv_toeplitz_get: API to get the toeplitz hash 1261 * from rx_msdu_start TLV 1262 * 1263 * @ buf: pointer to the start of RX PKT TLV headers 1264 * Return: toeplitz hash 1265 */ 1266 static inline uint32_t hal_rx_tlv_toeplitz_get_be(uint8_t *buf) 1267 { 1268 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1269 1270 return HAL_RX_TLV_FLOWID_TOEPLITZ_GET(rx_pkt_tlvs); 1271 } 1272 1273 /** 1274 * hal_rx_tlv_msdu_sgi_get(): API to get the Short Guard 1275 * Interval from rx_msdu_start TLV 1276 * 1277 * @buf: pointer to the start of RX PKT TLV headers 1278 * Return: uint32_t(sgi) 1279 */ 1280 static inline uint32_t hal_rx_tlv_sgi_get_be(uint8_t *buf) 1281 { 1282 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1283 1284 return HAL_RX_TLV_SGI_GET(rx_pkt_tlvs); 1285 } 1286 1287 /** 1288 * hal_rx_tlv_msdu_rate_mcs_get(): API to get the MCS rate 1289 * from rx_msdu_start TLV 1290 * 1291 * @buf: pointer to the start of RX PKT TLV headers 1292 * Return: uint32_t(rate_mcs) 1293 */ 1294 static inline uint32_t hal_rx_tlv_rate_mcs_get_be(uint8_t *buf) 1295 { 1296 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1297 uint32_t rate_mcs; 1298 1299 rate_mcs = HAL_RX_TLV_RATE_MCS_GET(rx_pkt_tlvs); 1300 1301 return rate_mcs; 1302 } 1303 1304 /* 1305 * Get key index from RX_MSDU_END 1306 */ 1307 /* 1308 * hal_rx_msdu_get_keyid(): API to get the key id if the decrypted packet 1309 * from rx_msdu_end 1310 * 1311 * @buf: pointer to the start of RX PKT TLV header 1312 * Return: uint32_t(key id) 1313 */ 1314 1315 static inline uint8_t hal_rx_msdu_get_keyid_be(uint8_t *buf) 1316 { 1317 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1318 uint32_t keyid_octet; 1319 1320 keyid_octet = HAL_RX_TLV_KEYID_OCTET_GET(rx_pkt_tlvs); 1321 1322 return keyid_octet & 0x3; 1323 } 1324 1325 /* 1326 * hal_rx_tlv_get_rssi(): API to get the rssi of received pkt 1327 * from rx_msdu_start 1328 * 1329 * @buf: pointer to the start of RX PKT TLV header 1330 * Return: uint32_t(rssi) 1331 */ 1332 1333 static inline uint32_t hal_rx_tlv_get_rssi_be(uint8_t *buf) 1334 { 1335 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1336 uint32_t rssi; 1337 1338 rssi = HAL_RX_TLV_RSSI_GET(rx_pkt_tlvs); 1339 1340 return rssi; 1341 } 1342 1343 /* 1344 * hal_rx_tlv_get_freq(): API to get the frequency of operating channel 1345 * from rx_msdu_start 1346 * 1347 * @buf: pointer to the start of RX PKT TLV header 1348 * Return: uint32_t(frequency) 1349 */ 1350 1351 static inline uint32_t hal_rx_tlv_get_freq_be(uint8_t *buf) 1352 { 1353 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1354 uint32_t freq; 1355 1356 freq = HAL_RX_TLV_FREQ_GET(rx_pkt_tlvs); 1357 1358 return freq; 1359 } 1360 1361 1362 /* 1363 * hal_rx_tlv_get_pkt_type(): API to get the pkt type 1364 * from rx_msdu_start 1365 * 1366 * @buf: pointer to the start of RX PKT TLV header 1367 * Return: uint32_t(pkt type) 1368 */ 1369 1370 static inline uint32_t hal_rx_tlv_get_pkt_type_be(uint8_t *buf) 1371 { 1372 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1373 uint32_t pkt_type; 1374 1375 pkt_type = HAL_RX_TLV_PKT_TYPE_GET(rx_pkt_tlvs); 1376 1377 return pkt_type; 1378 } 1379 1380 /******************************************************************************* 1381 * RX ERROR APIS 1382 ******************************************************************************/ 1383 1384 /** 1385 * hal_rx_tlv_decrypt_err_get(): API to get the Decrypt ERR 1386 * from rx_mpdu_end TLV 1387 * 1388 * @buf: pointer to the start of RX PKT TLV headers 1389 * Return: uint32_t(decrypt_err) 1390 */ 1391 static inline uint32_t hal_rx_tlv_decrypt_err_get_be(uint8_t *buf) 1392 { 1393 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1394 uint32_t decrypt_err; 1395 1396 decrypt_err = HAL_RX_TLV_DECRYPT_ERR_GET(rx_pkt_tlvs); 1397 1398 return decrypt_err; 1399 } 1400 1401 /** 1402 * hal_rx_tlv_mic_err_get(): API to get the MIC ERR 1403 * from rx_tlv TLV 1404 * 1405 * @buf: pointer to the start of RX PKT TLV headers 1406 * Return: uint32_t(mic_err) 1407 */ 1408 static inline uint32_t hal_rx_tlv_mic_err_get_be(uint8_t *buf) 1409 { 1410 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1411 uint32_t mic_err; 1412 1413 mic_err = HAL_RX_TLV_MIC_ERR_GET(rx_pkt_tlvs); 1414 1415 return mic_err; 1416 } 1417 1418 /** 1419 * hal_get_reo_ent_desc_qdesc_addr_be(): API to get qdesc address of reo 1420 * entrance ring desc 1421 * 1422 * @desc: reo entrance ring descriptor 1423 * Return: qdesc address 1424 */ 1425 static inline uint8_t *hal_get_reo_ent_desc_qdesc_addr_be(uint8_t *desc) 1426 { 1427 return desc + REO_ENTRANCE_RING_RX_REO_QUEUE_DESC_ADDR_31_0_OFFSET; 1428 } 1429 1430 /** 1431 * hal_set_reo_ent_desc_reo_dest_ind_be(): API to set reo destination 1432 * indication of reo entrance ring desc 1433 * 1434 * @desc: reo ent ring descriptor 1435 * @dst_ind: reo destination indication value 1436 * Return: None 1437 */ 1438 static inline void 1439 hal_set_reo_ent_desc_reo_dest_ind_be(uint8_t *desc, uint32_t dst_ind) 1440 { 1441 HAL_RX_FLD_SET(desc, REO_ENTRANCE_RING, 1442 REO_DESTINATION_INDICATION, dst_ind); 1443 } 1444 1445 /** 1446 * hal_rx_mpdu_sequence_number_get() - Get mpdu sequence number 1447 * @buf: pointer to packet buffer 1448 * 1449 * Return: mpdu sequence 1450 */ 1451 static inline int hal_rx_mpdu_sequence_number_get_be(uint8_t *buf) 1452 { 1453 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1454 1455 return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs); 1456 } 1457 1458 /** 1459 * hal_rx_msdu_packet_metadata_get(): API to get the 1460 * msdu information from rx_msdu_end TLV 1461 * 1462 * @ buf: pointer to the start of RX PKT TLV headers 1463 * @ hal_rx_msdu_metadata: pointer to the msdu info structure 1464 */ 1465 static inline void 1466 hal_rx_msdu_packet_metadata_get_generic_be(uint8_t *buf, 1467 void *pkt_msdu_metadata) 1468 { 1469 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1470 struct hal_rx_msdu_metadata *msdu_metadata = 1471 (struct hal_rx_msdu_metadata *)pkt_msdu_metadata; 1472 1473 msdu_metadata->l3_hdr_pad = 1474 HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs); 1475 msdu_metadata->sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs); 1476 msdu_metadata->da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs); 1477 msdu_metadata->sa_sw_peer_id = 1478 HAL_RX_TLV_SA_SW_PEER_ID_GET(rx_pkt_tlvs); 1479 } 1480 1481 /* 1482 * hal_rx_msdu_start_nss_get_kiwi(): API to get the NSS 1483 * Interval from rx_msdu_start 1484 * 1485 * @buf: pointer to the start of RX PKT TLV header 1486 * Return: uint32_t(nss) 1487 */ 1488 static inline uint32_t hal_rx_tlv_nss_get_be(uint8_t *buf) 1489 { 1490 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1491 uint8_t mimo_ss_bitmap; 1492 1493 mimo_ss_bitmap = HAL_RX_TLV_MIMO_SS_BITMAP(rx_pkt_tlvs); 1494 1495 return qdf_get_hweight8(mimo_ss_bitmap); 1496 } 1497 1498 #ifdef GET_MSDU_AGGREGATION 1499 #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs)\ 1500 {\ 1501 bool first_msdu, last_msdu; \ 1502 first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_desc);\ 1503 last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_desc);\ 1504 if (first_msdu && last_msdu)\ 1505 rs->rs_flags &= (~IEEE80211_AMSDU_FLAG);\ 1506 else\ 1507 rs->rs_flags |= (IEEE80211_AMSDU_FLAG); \ 1508 } \ 1509 1510 #define HAL_RX_SET_MSDU_AGGREGATION((rs_mpdu), (rs_ppdu))\ 1511 {\ 1512 if (rs_mpdu->rs_flags & IEEE80211_AMSDU_FLAG)\ 1513 rs_ppdu->rs_flags |= IEEE80211_AMSDU_FLAG;\ 1514 } \ 1515 1516 #else 1517 #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs) 1518 #define HAL_RX_SET_MSDU_AGGREGATION(rs_mpdu, rs_ppdu) 1519 #endif 1520 1521 /** 1522 * hal_rx_mon_hw_desc_get_mpdu_status_be(): Retrieve MPDU status 1523 * 1524 * @ hw_desc_addr: Start address of Rx HW TLVs 1525 * @ rs: Status for monitor mode 1526 * 1527 * Return: void 1528 */ 1529 static inline void 1530 hal_rx_mon_hw_desc_get_mpdu_status_be(void *hw_desc_addr, 1531 struct mon_rx_status *rs) 1532 { 1533 uint32_t reg_value; 1534 struct rx_pkt_tlvs *rx_desc = 1535 (struct rx_pkt_tlvs *)hw_desc_addr; 1536 const uint32_t sgi_hw_to_cdp[] = { 1537 CDP_SGI_0_8_US, 1538 CDP_SGI_0_4_US, 1539 CDP_SGI_1_6_US, 1540 CDP_SGI_3_2_US, 1541 }; 1542 1543 HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs); 1544 1545 rs->ant_signal_db = HAL_RX_TLV_ANT_SIGNAL_DB_GET(rx_desc); 1546 rs->is_stbc = HAL_RX_TLV_STBC_GET(rx_desc); 1547 1548 reg_value = HAL_RX_TLV_SGI_GET(rx_desc); 1549 rs->sgi = sgi_hw_to_cdp[reg_value]; 1550 1551 reg_value = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_desc); 1552 rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0; 1553 /* TODO: rs->beamformed should be set for SU beamforming also */ 1554 } 1555 1556 static inline uint32_t hal_rx_tlv_tid_get_be(uint8_t *buf) 1557 { 1558 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1559 uint32_t tid; 1560 1561 tid = HAL_RX_TLV_TID_GET(rx_pkt_tlvs); 1562 1563 return tid; 1564 } 1565 1566 /* 1567 * hal_rx_tlv_reception_type_get(): API to get the reception type 1568 * Interval from rx_msdu_start 1569 * 1570 * @buf: pointer to the start of RX PKT TLV header 1571 * Return: uint32_t(reception_type) 1572 */ 1573 static inline 1574 uint32_t hal_rx_tlv_reception_type_get_be(uint8_t *buf) 1575 { 1576 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1577 uint32_t reception_type; 1578 1579 reception_type = HAL_RX_TLV_RECEPTION_TYPE_GET(rx_pkt_tlvs); 1580 1581 return reception_type; 1582 } 1583 1584 /** 1585 * hal_rx_msdu_end_da_idx_get_be: API to get da_idx 1586 * from rx_msdu_end TLV 1587 * 1588 * @ buf: pointer to the start of RX PKT TLV headers 1589 * Return: da index 1590 */ 1591 static inline uint16_t hal_rx_msdu_end_da_idx_get_be(uint8_t *buf) 1592 { 1593 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1594 uint16_t da_idx; 1595 1596 da_idx = HAL_RX_TLV_DA_IDX_GET(rx_pkt_tlvs); 1597 1598 return da_idx; 1599 } 1600 1601 /** 1602 * hal_rx_get_rx_fragment_number_be(): Function to retrieve rx fragment number 1603 * 1604 * @nbuf: Network buffer 1605 * Returns: rx fragment number 1606 */ 1607 static inline 1608 uint8_t hal_rx_get_rx_fragment_number_be(uint8_t *buf) 1609 { 1610 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1611 1612 /* Return first 4 bits as fragment number */ 1613 return (HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs) & 1614 DOT11_SEQ_FRAG_MASK); 1615 } 1616 1617 /** 1618 * hal_rx_msdu_end_da_is_mcbc_get_be(): API to check if pkt is MCBC 1619 * from rx_msdu_end TLV 1620 * 1621 * @ buf: pointer to the start of RX PKT TLV headers 1622 * Return: da_is_mcbc 1623 */ 1624 static inline uint8_t 1625 hal_rx_tlv_da_is_mcbc_get_be(uint8_t *buf) 1626 { 1627 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1628 1629 return HAL_RX_TLV_DA_IS_MCBC_GET(rx_pkt_tlvs); 1630 } 1631 1632 /** 1633 * hal_rx_tlv_is_tkip_mic_err_get_be(): API to get tkip Mic error 1634 * from rx_msdu_end TLV 1635 * 1636 * @ buf: pointer to the start of RX PKT TLV headers 1637 * Return: tkip_mic_err 1638 */ 1639 static inline uint8_t 1640 hal_rx_tlv_is_tkip_mic_err_get_be(uint8_t *buf) 1641 { 1642 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1643 1644 return HAL_RX_TLV_IS_TKIP_MIC_ERR_GET(rx_pkt_tlvs); 1645 } 1646 1647 /** 1648 * hal_rx_tlvd_sa_is_valid_get_be(): API to get the sa_is_valid bit from 1649 * rx_msdu_end TLV 1650 * 1651 * @ buf: pointer to the start of RX PKT TLV headers 1652 * Return: sa_is_valid bit 1653 */ 1654 static inline uint8_t 1655 hal_rx_tlv_sa_is_valid_get_be(uint8_t *buf) 1656 { 1657 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1658 uint8_t sa_is_valid; 1659 1660 sa_is_valid = HAL_RX_TLV_SA_IS_VALID_GET(rx_pkt_tlvs); 1661 1662 return sa_is_valid; 1663 } 1664 1665 /** 1666 * hal_rx_tlv_sa_idx_get_be(): API to get the sa_idx from rx_msdu_end TLV 1667 * 1668 * @ buf: pointer to the start of RX PKT TLV headers 1669 * Return: sa_idx (SA AST index) 1670 */ 1671 static inline 1672 uint16_t hal_rx_tlv_sa_idx_get_be(uint8_t *buf) 1673 { 1674 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1675 uint16_t sa_idx; 1676 1677 sa_idx = HAL_RX_TLV_SA_IDX_GET(rx_pkt_tlvs); 1678 1679 return sa_idx; 1680 } 1681 1682 /** 1683 * hal_rx_desc_is_first_msdu_be() - Check if first msdu 1684 * 1685 * @hal_soc_hdl: hal_soc handle 1686 * @hw_desc_addr: hardware descriptor address 1687 * 1688 * Return: 0 - success/ non-zero failure 1689 */ 1690 static inline uint32_t hal_rx_desc_is_first_msdu_be(void *hw_desc_addr) 1691 { 1692 struct rx_pkt_tlvs *rx_pkt_tlvs = 1693 (struct rx_pkt_tlvs *)hw_desc_addr; 1694 1695 return HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs); 1696 } 1697 1698 /** 1699 * hal_rx_tlv_l3_hdr_padding_get_be(): API to get the l3_header padding 1700 * from rx_msdu_end TLV 1701 * 1702 * @ buf: pointer to the start of RX PKT TLV headers 1703 * Return: number of l3 header padding bytes 1704 */ 1705 static inline uint32_t hal_rx_tlv_l3_hdr_padding_get_be(uint8_t *buf) 1706 { 1707 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1708 uint32_t l3_header_padding; 1709 1710 l3_header_padding = HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_pkt_tlvs); 1711 1712 return l3_header_padding; 1713 } 1714 1715 /* 1716 * @ hal_rx_encryption_info_valid_be: Returns encryption type. 1717 * 1718 * @ buf: rx_tlv_hdr of the received packet 1719 * @ Return: encryption type 1720 */ 1721 static inline uint32_t hal_rx_encryption_info_valid_be(uint8_t *buf) 1722 { 1723 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1724 uint32_t encryption_info = 1725 HAL_RX_TLV_MPDU_ENCRYPTION_INFO_VALID(rx_pkt_tlvs); 1726 1727 return encryption_info; 1728 } 1729 1730 /** 1731 * hal_rx_tlv_first_msdu_get_be: API to get first msdu status 1732 * from rx_msdu_end TLV 1733 * 1734 * @ buf: pointer to the start of RX PKT TLV headers 1735 * Return: first_msdu 1736 */ 1737 static inline uint8_t hal_rx_tlv_first_msdu_get_be(uint8_t *buf) 1738 { 1739 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1740 uint8_t first_msdu; 1741 1742 first_msdu = HAL_RX_TLV_FIRST_MSDU_GET(rx_pkt_tlvs); 1743 1744 return first_msdu; 1745 } 1746 1747 /** 1748 * hal_rx_tlv_da_is_valid_get_be: API to check if da is valid 1749 * from rx_msdu_end TLV 1750 * 1751 * @ buf: pointer to the start of RX PKT TLV headers 1752 * Return: da_is_valid 1753 */ 1754 static inline uint8_t hal_rx_tlv_da_is_valid_get_be(uint8_t *buf) 1755 { 1756 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1757 uint8_t da_is_valid; 1758 1759 da_is_valid = HAL_RX_TLV_DA_IS_VALID_GET(rx_pkt_tlvs); 1760 1761 return da_is_valid; 1762 } 1763 1764 /** 1765 * hal_rx_tlv_last_msdu_get_be: API to get last msdu status 1766 * from rx_msdu_end TLV 1767 * 1768 * @ buf: pointer to the start of RX PKT TLV headers 1769 * Return: last_msdu 1770 */ 1771 static inline uint8_t hal_rx_tlv_last_msdu_get_be(uint8_t *buf) 1772 { 1773 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1774 uint8_t last_msdu; 1775 1776 last_msdu = HAL_RX_TLV_LAST_MSDU_GET(rx_pkt_tlvs); 1777 1778 return last_msdu; 1779 } 1780 1781 /* 1782 * hal_rx_get_mpdu_mac_ad4_valid_be(): Retrieves if mpdu 4th addr is valid 1783 * 1784 * @nbuf: Network buffer 1785 * Returns: value of mpdu 4th address valid field 1786 */ 1787 static inline bool hal_rx_get_mpdu_mac_ad4_valid_be(uint8_t *buf) 1788 { 1789 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1790 bool ad4_valid = 0; 1791 1792 ad4_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD4_VALID_GET(rx_pkt_tlvs); 1793 1794 return ad4_valid; 1795 } 1796 1797 /** 1798 * hal_rx_mpdu_start_sw_peer_id_get_be: Retrieve sw peer_id 1799 * @buf: network buffer 1800 * 1801 * Return: sw peer_id 1802 */ 1803 static inline uint32_t hal_rx_mpdu_start_sw_peer_id_get_be(uint8_t *buf) 1804 { 1805 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1806 1807 return HAL_RX_TLV_SW_PEER_ID_GET(rx_pkt_tlvs); 1808 } 1809 1810 /** 1811 * hal_rx_mpdu_get_to_ds_be(): API to get the tods info 1812 * from rx_mpdu_start 1813 * 1814 * @buf: pointer to the start of RX PKT TLV header 1815 * Return: uint32_t(to_ds) 1816 */ 1817 static inline uint32_t hal_rx_mpdu_get_to_ds_be(uint8_t *buf) 1818 { 1819 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1820 1821 return HAL_RX_TLV_MPDU_GET_TODS(rx_pkt_tlvs); 1822 } 1823 1824 /* 1825 * hal_rx_mpdu_get_fr_ds_be(): API to get the from ds info 1826 * from rx_mpdu_start 1827 * 1828 * @buf: pointer to the start of RX PKT TLV header 1829 * Return: uint32_t(fr_ds) 1830 */ 1831 static inline uint32_t hal_rx_mpdu_get_fr_ds_be(uint8_t *buf) 1832 { 1833 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1834 1835 return HAL_RX_TLV_MPDU_GET_FROMDS(rx_pkt_tlvs); 1836 } 1837 1838 /* 1839 * hal_rx_get_mpdu_frame_control_valid_be(): Retrieves mpdu 1840 * frame control valid 1841 * 1842 * @nbuf: Network buffer 1843 * Returns: value of frame control valid field 1844 */ 1845 static inline uint8_t hal_rx_get_mpdu_frame_control_valid_be(uint8_t *buf) 1846 { 1847 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1848 1849 return HAL_RX_TLV_MPDU_GET_FRAME_CONTROL_VALID(rx_pkt_tlvs); 1850 } 1851 1852 /* 1853 * hal_rx_mpdu_get_addr2_be(): API to check get address2 of the mpdu 1854 * in the packet 1855 * 1856 * @buf: pointer to the start of RX PKT TLV header 1857 * @mac_addr: pointer to mac address 1858 * Return: success/failure 1859 */ 1860 static inline QDF_STATUS hal_rx_mpdu_get_addr2_be(uint8_t *buf, 1861 uint8_t *mac_addr) 1862 { 1863 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1864 struct __attribute__((__packed__)) hal_addr2 { 1865 uint16_t ad2_15_0; 1866 uint32_t ad2_47_16; 1867 }; 1868 struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr; 1869 uint32_t mac_addr_ad2_valid; 1870 1871 mac_addr_ad2_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs); 1872 1873 if (mac_addr_ad2_valid) { 1874 addr->ad2_15_0 = HAL_RX_TLV_MPDU_AD2_15_0_GET(rx_pkt_tlvs); 1875 addr->ad2_47_16 = HAL_RX_TLV_MPDU_AD2_47_16_GET(rx_pkt_tlvs); 1876 return QDF_STATUS_SUCCESS; 1877 } 1878 1879 return QDF_STATUS_E_FAILURE; 1880 } 1881 1882 /* 1883 * hal_rx_mpdu_get_addr3_be(): API to get address3 of the mpdu 1884 * in the packet 1885 * 1886 * @buf: pointer to the start of RX PKT TLV header 1887 * @mac_addr: pointer to mac address 1888 * Return: success/failure 1889 */ 1890 static inline QDF_STATUS hal_rx_mpdu_get_addr3_be(uint8_t *buf, 1891 uint8_t *mac_addr) 1892 { 1893 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1894 struct __attribute__((__packed__)) hal_addr3 { 1895 uint32_t ad3_31_0; 1896 uint16_t ad3_47_32; 1897 }; 1898 struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr; 1899 uint32_t mac_addr_ad3_valid; 1900 1901 mac_addr_ad3_valid = HAL_RX_TLV_MPDU_MAC_ADDR_AD3_VALID_GET(rx_pkt_tlvs); 1902 1903 if (mac_addr_ad3_valid) { 1904 addr->ad3_31_0 = HAL_RX_TLV_MPDU_AD3_31_0_GET(rx_pkt_tlvs); 1905 addr->ad3_47_32 = HAL_RX_TLV_MPDU_AD3_47_32_GET(rx_pkt_tlvs); 1906 return QDF_STATUS_SUCCESS; 1907 } 1908 1909 return QDF_STATUS_E_FAILURE; 1910 } 1911 1912 /* 1913 * hal_rx_get_mpdu_sequence_control_valid_be(): Get mpdu 1914 * sequence control valid 1915 * 1916 * @nbuf: Network buffer 1917 * Returns: value of sequence control valid field 1918 */ 1919 static inline uint8_t hal_rx_get_mpdu_sequence_control_valid_be(uint8_t *buf) 1920 { 1921 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1922 1923 return HAL_RX_TLV_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_pkt_tlvs); 1924 } 1925 1926 /** 1927 * hal_rx_tid_get_be: get tid based on qos control valid. 1928 * @hal_soc_hdl: hal_soc handle 1929 * @ buf: pointer to rx pkt TLV. 1930 * 1931 * Return: tid 1932 */ 1933 static inline uint32_t hal_rx_tid_get_be(hal_soc_handle_t hal_soc_hdl, 1934 uint8_t *buf) 1935 { 1936 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1937 uint8_t qos_control_valid = 1938 HAL_RX_TLV_MPDU_QOS_CONTROL_VALID_GET(rx_pkt_tlvs); 1939 1940 if (qos_control_valid) 1941 return hal_rx_tlv_tid_get_be(buf); 1942 1943 return HAL_RX_NON_QOS_TID; 1944 } 1945 1946 static inline 1947 uint8_t hal_rx_get_fc_valid_be(uint8_t *buf) 1948 { 1949 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1950 1951 return HAL_RX_TLV_GET_FC_VALID(rx_pkt_tlvs); 1952 } 1953 1954 static inline uint8_t hal_rx_get_to_ds_flag_be(uint8_t *buf) 1955 { 1956 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1957 1958 return HAL_RX_TLV_GET_TO_DS_FLAG(rx_pkt_tlvs); 1959 } 1960 1961 static inline uint8_t hal_rx_get_mac_addr2_valid_be(uint8_t *buf) 1962 { 1963 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1964 1965 return HAL_RX_TLV_MPDU_MAC_ADDR_AD2_VALID_GET(rx_pkt_tlvs); 1966 } 1967 1968 /** 1969 * hal_rx_msdu_flow_idx_get_be: API to get flow index 1970 * from rx_msdu_end TLV 1971 * @buf: pointer to the start of RX PKT TLV headers 1972 * 1973 * Return: flow index value from MSDU END TLV 1974 */ 1975 static inline uint32_t hal_rx_msdu_flow_idx_get_be(uint8_t *buf) 1976 { 1977 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1978 1979 return HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs); 1980 } 1981 1982 /** 1983 * hal_rx_msdu_get_reo_destination_indication_be: API to get 1984 * reo_destination_indication from rx_msdu_end TLV 1985 * @buf: pointer to the start of RX PKT TLV headers 1986 * @reo_destination_indication: pointer to return value of 1987 * reo_destination_indication 1988 * 1989 * Return: none 1990 */ 1991 static inline void 1992 hal_rx_msdu_get_reo_destination_indication_be(uint8_t *buf, 1993 uint32_t *reo_destination_indication) 1994 { 1995 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 1996 1997 *reo_destination_indication = HAL_RX_TLV_REO_DEST_IND_GET(pkt_tlvs); 1998 } 1999 2000 /** 2001 * hal_rx_msdu_flow_idx_invalid_be: API to get flow index invalid 2002 * from rx_msdu_end TLV 2003 * @buf: pointer to the start of RX PKT TLV headers 2004 * 2005 * Return: flow index invalid value from MSDU END TLV 2006 */ 2007 static inline bool hal_rx_msdu_flow_idx_invalid_be(uint8_t *buf) 2008 { 2009 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2010 2011 return HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs); 2012 } 2013 2014 /** 2015 * hal_rx_msdu_flow_idx_timeout_be: API to get flow index timeout 2016 * from rx_msdu_end TLV 2017 * @buf: pointer to the start of RX PKT TLV headers 2018 * 2019 * Return: flow index timeout value from MSDU END TLV 2020 */ 2021 static inline bool hal_rx_msdu_flow_idx_timeout_be(uint8_t *buf) 2022 { 2023 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2024 2025 return HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs); 2026 } 2027 2028 /** 2029 * hal_rx_msdu_fse_metadata_get_be: API to get FSE metadata 2030 * from rx_msdu_end TLV 2031 * @buf: pointer to the start of RX PKT TLV headers 2032 * 2033 * Return: fse metadata value from MSDU END TLV 2034 */ 2035 static inline uint32_t hal_rx_msdu_fse_metadata_get_be(uint8_t *buf) 2036 { 2037 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2038 2039 return HAL_RX_TLV_FSE_METADATA_GET(pkt_tlvs); 2040 } 2041 2042 /** 2043 * hal_rx_msdu_cce_metadata_get_be: API to get CCE metadata 2044 * from rx_msdu_end TLV 2045 * @buf: pointer to the start of RX PKT TLV headers 2046 * 2047 * Return: cce_metadata 2048 */ 2049 static inline uint16_t 2050 hal_rx_msdu_cce_metadata_get_be(uint8_t *buf) 2051 { 2052 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2053 2054 return HAL_RX_TLV_CCE_METADATA_GET(pkt_tlvs); 2055 } 2056 2057 /** 2058 * hal_rx_msdu_get_flow_params_be: API to get flow index, flow index invalid 2059 * and flow index timeout from rx_msdu_end TLV 2060 * @buf: pointer to the start of RX PKT TLV headers 2061 * @flow_invalid: pointer to return value of flow_idx_valid 2062 * @flow_timeout: pointer to return value of flow_idx_timeout 2063 * @flow_index: pointer to return value of flow_idx 2064 * 2065 * Return: none 2066 */ 2067 static inline void 2068 hal_rx_msdu_get_flow_params_be(uint8_t *buf, 2069 bool *flow_invalid, 2070 bool *flow_timeout, 2071 uint32_t *flow_index) 2072 { 2073 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2074 2075 *flow_invalid = HAL_RX_TLV_FLOW_IDX_INVALID_GET(pkt_tlvs); 2076 *flow_timeout = HAL_RX_TLV_FLOW_IDX_TIMEOUT_GET(pkt_tlvs); 2077 *flow_index = HAL_RX_TLV_FLOW_IDX_GET(pkt_tlvs); 2078 } 2079 2080 /** 2081 * hal_rx_tlv_get_tcp_chksum_be() - API to get tcp checksum 2082 * @buf: rx_tlv_hdr 2083 * 2084 * Return: tcp checksum 2085 */ 2086 static inline uint16_t 2087 hal_rx_tlv_get_tcp_chksum_be(uint8_t *buf) 2088 { 2089 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2090 2091 return HAL_RX_TLV_GET_TCP_CHKSUM(rx_pkt_tlvs); 2092 } 2093 2094 /** 2095 * hal_rx_get_rx_sequence_be(): Function to retrieve rx sequence number 2096 * 2097 * @nbuf: Network buffer 2098 * Returns: rx sequence number 2099 */ 2100 static inline 2101 uint16_t hal_rx_get_rx_sequence_be(uint8_t *buf) 2102 { 2103 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2104 2105 return HAL_RX_MPDU_SEQUENCE_NUMBER_GET(rx_pkt_tlvs); 2106 } 2107 2108 #ifdef RECEIVE_OFFLOAD 2109 #ifdef QCA_WIFI_KIWI_V2 2110 static inline 2111 uint16_t hal_rx_get_fisa_cumulative_l4_checksum_be(uint8_t *buf) 2112 { 2113 /* 2114 * cumulative l4 checksum is not supported in V2 and 2115 * cumulative_l4_checksum field is not present 2116 */ 2117 return 0; 2118 } 2119 #else 2120 /** 2121 * hal_rx_get_fisa_cumulative_l4_checksum_be() - Retrieve cumulative 2122 * checksum 2123 * @buf: buffer pointer 2124 * 2125 * Return: cumulative checksum 2126 */ 2127 static inline 2128 uint16_t hal_rx_get_fisa_cumulative_l4_checksum_be(uint8_t *buf) 2129 { 2130 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2131 2132 return HAL_RX_TLV_GET_FISA_CUMULATIVE_L4_CHECKSUM(rx_pkt_tlvs); 2133 } 2134 #endif 2135 2136 /** 2137 * hal_rx_get_fisa_cumulative_ip_length_be() - Retrieve cumulative 2138 * ip length 2139 * @buf: buffer pointer 2140 * 2141 * Return: cumulative length 2142 */ 2143 static inline 2144 uint16_t hal_rx_get_fisa_cumulative_ip_length_be(uint8_t *buf) 2145 { 2146 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2147 2148 return HAL_RX_TLV_GET_FISA_CUMULATIVE_IP_LENGTH(rx_pkt_tlvs); 2149 } 2150 2151 /** 2152 * hal_rx_get_udp_proto_be() - Retrieve udp proto value 2153 * @buf: buffer 2154 * 2155 * Return: udp proto bit 2156 */ 2157 static inline 2158 bool hal_rx_get_udp_proto_be(uint8_t *buf) 2159 { 2160 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2161 2162 return HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs); 2163 } 2164 #endif 2165 2166 /** 2167 * hal_rx_get_flow_agg_continuation_be() - retrieve flow agg 2168 * continuation 2169 * @buf: buffer 2170 * 2171 * Return: flow agg 2172 */ 2173 static inline 2174 bool hal_rx_get_flow_agg_continuation_be(uint8_t *buf) 2175 { 2176 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2177 2178 return HAL_RX_TLV_GET_FLOW_AGGR_CONT(rx_pkt_tlvs); 2179 } 2180 2181 /** 2182 * hal_rx_get_flow_agg_count_be()- Retrieve flow agg count 2183 * @buf: buffer 2184 * 2185 * Return: flow agg count 2186 */ 2187 static inline 2188 uint8_t hal_rx_get_flow_agg_count_be(uint8_t *buf) 2189 { 2190 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2191 2192 return HAL_RX_TLV_GET_FLOW_AGGR_COUNT(rx_pkt_tlvs); 2193 } 2194 2195 /** 2196 * hal_rx_get_fisa_timeout_be() - Retrieve fisa timeout 2197 * @buf: buffer 2198 * 2199 * Return: fisa timeout 2200 */ 2201 static inline 2202 bool hal_rx_get_fisa_timeout_be(uint8_t *buf) 2203 { 2204 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2205 2206 return HAL_RX_TLV_GET_FISA_TIMEOUT(rx_pkt_tlvs); 2207 } 2208 2209 /** 2210 * hal_rx_mpdu_start_tlv_tag_valid_be () - API to check if RX_MPDU_START 2211 * tlv tag is valid 2212 * 2213 *@rx_tlv_hdr: start address of rx_pkt_tlvs 2214 * 2215 * Return: true if RX_MPDU_START is valid, else false. 2216 */ 2217 static inline uint8_t hal_rx_mpdu_start_tlv_tag_valid_be(void *rx_tlv_hdr) 2218 { 2219 struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; 2220 uint32_t tlv_tag; 2221 2222 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv); 2223 2224 return tlv_tag == WIFIRX_MPDU_START_E ? true : false; 2225 } 2226 2227 /** 2228 * hal_rx_msdu_end_offset_get_generic(): API to get the 2229 * msdu_end structure offset rx_pkt_tlv structure 2230 * 2231 * NOTE: API returns offset of msdu_end TLV from structure 2232 * rx_pkt_tlvs 2233 */ 2234 static inline uint32_t hal_rx_msdu_end_offset_get_generic(void) 2235 { 2236 return RX_PKT_TLV_OFFSET(msdu_end_tlv); 2237 } 2238 2239 /** 2240 * hal_rx_mpdu_start_offset_get_generic(): API to get the 2241 * mpdu_start structure offset rx_pkt_tlv structure 2242 * 2243 * NOTE: API returns offset of attn TLV from structure 2244 * rx_pkt_tlvs 2245 */ 2246 static inline uint32_t hal_rx_mpdu_start_offset_get_generic(void) 2247 { 2248 return RX_PKT_TLV_OFFSET(mpdu_start_tlv); 2249 } 2250 2251 #ifndef NO_RX_PKT_HDR_TLV 2252 static inline uint32_t hal_rx_pkt_tlv_offset_get_generic(void) 2253 { 2254 return RX_PKT_TLV_OFFSET(pkt_hdr_tlv); 2255 } 2256 #endif 2257 2258 #ifdef CONFIG_WORD_BASED_TLV 2259 #define MPDU_START_WMASK 0x074C 2260 #define MSDU_END_WMASK 0x13FC1 2261 2262 /** 2263 * hal_rx_mpdu_start_wmask_get_be(): API to get the mpdu_start_tlv word mask 2264 * 2265 * return: Word mask for MPDU start tlv 2266 */ 2267 static inline uint32_t hal_rx_mpdu_start_wmask_get_be(void) 2268 { 2269 return MPDU_START_WMASK; 2270 } 2271 2272 /** 2273 * hal_rx_msdu_end_wmask_get_be(): API to get the msdu_end_tlv word mask 2274 * 2275 * return: Word mask for MSDU end tlv 2276 */ 2277 static inline uint32_t hal_rx_msdu_end_wmask_get_be(void) 2278 { 2279 return MSDU_END_WMASK; 2280 } 2281 #endif 2282 2283 #ifdef RECEIVE_OFFLOAD 2284 static inline int 2285 hal_rx_tlv_get_offload_info_be(uint8_t *rx_tlv, 2286 struct hal_offload_info *offload_info) 2287 { 2288 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)rx_tlv; 2289 2290 offload_info->lro_eligible = HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_pkt_tlvs); 2291 offload_info->flow_id = HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(rx_pkt_tlvs); 2292 offload_info->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs); 2293 offload_info->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_pkt_tlvs); 2294 2295 if (offload_info->tcp_proto) { 2296 offload_info->tcp_pure_ack = 2297 HAL_RX_TLV_GET_TCP_PURE_ACK(rx_pkt_tlvs); 2298 offload_info->tcp_offset = 2299 HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs); 2300 offload_info->tcp_win = HAL_RX_TLV_GET_TCP_WIN(rx_pkt_tlvs); 2301 offload_info->tcp_seq_num = HAL_RX_TLV_GET_TCP_SEQ(rx_pkt_tlvs); 2302 offload_info->tcp_ack_num = HAL_RX_TLV_GET_TCP_ACK(rx_pkt_tlvs); 2303 } 2304 return 0; 2305 } 2306 2307 static inline int hal_rx_get_proto_params_be(uint8_t *buf, void *proto_params) 2308 { 2309 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2310 struct hal_proto_params *param = 2311 (struct hal_proto_params *)proto_params; 2312 2313 param->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_pkt_tlvs); 2314 param->udp_proto = HAL_RX_TLV_GET_UDP_PROTO(rx_pkt_tlvs); 2315 param->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_pkt_tlvs); 2316 2317 return 0; 2318 } 2319 2320 static inline int hal_rx_get_l3_l4_offsets_be(uint8_t *buf, 2321 uint32_t *l3_hdr_offset, 2322 uint32_t *l4_hdr_offset) 2323 { 2324 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2325 2326 *l3_hdr_offset = HAL_RX_TLV_GET_IP_OFFSET(rx_pkt_tlvs); 2327 *l4_hdr_offset = HAL_RX_TLV_GET_TCP_OFFSET(rx_pkt_tlvs); 2328 2329 return 0; 2330 } 2331 #endif 2332 2333 /** 2334 * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length 2335 * from rx_msdu_start TLV 2336 * 2337 * @ buf: pointer to the start of RX PKT TLV headers 2338 * Return: msdu length 2339 */ 2340 static inline uint32_t hal_rx_msdu_start_msdu_len_get_be(uint8_t *buf) 2341 { 2342 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2343 uint32_t msdu_len; 2344 2345 msdu_len = HAL_RX_TLV_MSDU_LEN_GET(rx_pkt_tlvs); 2346 2347 return msdu_len; 2348 } 2349 2350 /** 2351 * hal_rx_get_frame_ctrl_field(): Function to retrieve frame control field 2352 * 2353 * @nbuf: Network buffer 2354 * Returns: rx more fragment bit 2355 * 2356 */ 2357 static inline uint16_t hal_rx_get_frame_ctrl_field_be(uint8_t *buf) 2358 { 2359 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2360 uint16_t frame_ctrl = 0; 2361 2362 frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_pkt_tlvs); 2363 2364 return frame_ctrl; 2365 } 2366 2367 /* 2368 * hal_rx_tlv_get_is_decrypted_be(): API to get the decrypt status of the 2369 * packet from msdu_end 2370 * 2371 * @buf: pointer to the start of RX PKT TLV header 2372 * Return: uint32_t(decryt status) 2373 */ 2374 static inline uint32_t hal_rx_tlv_get_is_decrypted_be(uint8_t *buf) 2375 { 2376 struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2377 uint32_t is_decrypt = 0; 2378 uint32_t decrypt_status; 2379 2380 decrypt_status = HAL_RX_TLV_DECRYPT_STATUS_GET(rx_pkt_tlvs); 2381 2382 if (!decrypt_status) 2383 is_decrypt = 1; 2384 2385 return is_decrypt; 2386 } 2387 2388 #ifdef NO_RX_PKT_HDR_TLV 2389 /** 2390 * hal_rx_pkt_hdr_get_be(): API to get 80211 header 2391 * @buf: start of rx_pkt_tlv 2392 * 2393 * If NO_RX_PKT_HDR_TLV is enabled, then this API assume caller gives a raw 2394 * data, get 80211 header from packet data directly. 2395 * If NO_RX_PKT_HDR_TLV is disabled, then get it from rx_pkt_hdr_tlv in 2396 * rx_pkt_tlvs. 2397 * 2398 * Return: pointer to start of 80211 header 2399 */ 2400 static inline uint8_t *hal_rx_pkt_hdr_get_be(uint8_t *buf) 2401 { 2402 return buf + RX_PKT_TLVS_LEN; 2403 } 2404 #else 2405 static inline uint8_t *hal_rx_pkt_hdr_get_be(uint8_t *buf) 2406 { 2407 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2408 2409 return pkt_tlvs->pkt_hdr_tlv.rx_pkt_hdr; 2410 } 2411 #endif 2412 2413 /** 2414 * hal_rx_tlv_csum_err_get_be() - Get IP and tcp-udp checksum fail flag 2415 * @rx_tlv_hdr: start address of rx_tlv_hdr 2416 * @ip_csum_err: buffer to return ip_csum_fail flag 2417 * @tcp_udp_csum_fail: placeholder to return tcp-udp checksum fail flag 2418 * 2419 * Return: None 2420 */ 2421 static inline void 2422 hal_rx_tlv_csum_err_get_be(uint8_t *rx_tlv_hdr, uint32_t *ip_csum_err, 2423 uint32_t *tcp_udp_csum_err) 2424 { 2425 struct rx_pkt_tlvs *rx_pkt_tlvs = 2426 (struct rx_pkt_tlvs *)rx_tlv_hdr; 2427 2428 *ip_csum_err = HAL_RX_TLV_IP_CSUM_FAIL_GET(rx_pkt_tlvs); 2429 *tcp_udp_csum_err = HAL_RX_TLV_TCP_UDP_CSUM_FAIL_GET(rx_pkt_tlvs); 2430 } 2431 2432 static inline 2433 uint32_t hal_rx_tlv_mpdu_len_err_get_be(void *hw_desc_addr) 2434 { 2435 struct rx_pkt_tlvs *rx_pkt_tlvs = 2436 (struct rx_pkt_tlvs *)hw_desc_addr; 2437 2438 return HAL_RX_TLV_MPDU_LEN_ERR_GET(rx_pkt_tlvs); 2439 } 2440 2441 static inline 2442 uint32_t hal_rx_tlv_mpdu_fcs_err_get_be(void *hw_desc_addr) 2443 { 2444 struct rx_pkt_tlvs *rx_pkt_tlvs = 2445 (struct rx_pkt_tlvs *)hw_desc_addr; 2446 2447 return HAL_RX_TLV_MPDU_FCS_ERR_GET(rx_pkt_tlvs); 2448 } 2449 2450 /** 2451 * hal_rx_get_rx_more_frag_bit(): Function to retrieve more fragment bit 2452 * 2453 * @nbuf: Network buffer 2454 * Returns: rx more fragment bit 2455 */ 2456 static inline 2457 uint8_t hal_rx_get_rx_more_frag_bit(uint8_t *buf) 2458 { 2459 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2460 uint16_t frame_ctrl = 0; 2461 2462 frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(pkt_tlvs) >> 2463 DOT11_FC1_MORE_FRAG_OFFSET; 2464 2465 /* more fragment bit if at offset bit 4 */ 2466 return frame_ctrl; 2467 } 2468 2469 /* 2470 * hal_rx_msdu_is_wlan_mcast_generic_be(): Check if the buffer is for multicast 2471 * address 2472 * @nbuf: Network buffer 2473 * 2474 * Returns: flag to indicate whether the nbuf has MC/BC address 2475 */ 2476 static inline uint32_t hal_rx_msdu_is_wlan_mcast_generic_be(qdf_nbuf_t nbuf) 2477 { 2478 uint8_t *buf = qdf_nbuf_data(nbuf); 2479 2480 return HAL_RX_TLV_IS_MCAST_GET(buf);; 2481 } 2482 2483 /** 2484 * hal_rx_msdu_start_msdu_len_set_be(): API to set the MSDU length 2485 * from rx_msdu_start TLV 2486 * 2487 * @buf: pointer to the start of RX PKT TLV headers 2488 * @len: msdu length 2489 * 2490 * Return: none 2491 */ 2492 static inline void 2493 hal_rx_msdu_start_msdu_len_set_be(uint8_t *buf, uint32_t len) 2494 { 2495 HAL_RX_TLV_MSDU_LEN_GET(buf) = len; 2496 } 2497 2498 /** 2499 * hal_rx_mpdu_start_mpdu_qos_control_valid_get_be(): 2500 * Retrieve qos control valid bit from the tlv. 2501 * @buf: pointer to rx pkt TLV. 2502 * 2503 * Return: qos control value. 2504 */ 2505 static inline uint32_t 2506 hal_rx_mpdu_start_mpdu_qos_control_valid_get_be(uint8_t *buf) 2507 { 2508 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2509 2510 return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET(pkt_tlvs); 2511 } 2512 2513 /** 2514 * hal_rx_msdu_end_sa_sw_peer_id_get_be(): API to get the 2515 * sa_sw_peer_id from rx_msdu_end TLV 2516 * @buf: pointer to the start of RX PKT TLV headers 2517 * 2518 * Return: sa_sw_peer_id index 2519 */ 2520 static inline uint32_t 2521 hal_rx_msdu_end_sa_sw_peer_id_get_be(uint8_t *buf) 2522 { 2523 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2524 2525 hal_rx_msdu_end_t *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 2526 2527 return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end); 2528 } 2529 #endif /* _HAL_BE_RX_TLV_H_ */ 2530