/* Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef _RX_MSDU_DESC_INFO_H_ #define _RX_MSDU_DESC_INFO_H_ #if !defined(__ASSEMBLER__) #endif #define NUM_OF_DWORDS_RX_MSDU_DESC_INFO 1 struct rx_msdu_desc_info { #ifndef WIFI_BIT_ORDER_BIG_ENDIAN uint32_t first_msdu_in_mpdu_flag : 1, // [0:0] last_msdu_in_mpdu_flag : 1, // [1:1] msdu_continuation : 1, // [2:2] msdu_length : 14, // [16:3] msdu_drop : 1, // [17:17] sa_is_valid : 1, // [18:18] da_is_valid : 1, // [19:19] da_is_mcbc : 1, // [20:20] l3_header_padding_msb : 1, // [21:21] tcp_udp_chksum_fail : 1, // [22:22] ip_chksum_fail : 1, // [23:23] fr_ds : 1, // [24:24] to_ds : 1, // [25:25] intra_bss : 1, // [26:26] dest_chip_id : 2, // [28:27] decap_format : 2, // [30:29] dest_chip_pmac_id : 1; // [31:31] #else uint32_t dest_chip_pmac_id : 1, // [31:31] decap_format : 2, // [30:29] dest_chip_id : 2, // [28:27] intra_bss : 1, // [26:26] to_ds : 1, // [25:25] fr_ds : 1, // [24:24] ip_chksum_fail : 1, // [23:23] tcp_udp_chksum_fail : 1, // [22:22] l3_header_padding_msb : 1, // [21:21] da_is_mcbc : 1, // [20:20] da_is_valid : 1, // [19:19] sa_is_valid : 1, // [18:18] msdu_drop : 1, // [17:17] msdu_length : 14, // [16:3] msdu_continuation : 1, // [2:2] last_msdu_in_mpdu_flag : 1, // [1:1] first_msdu_in_mpdu_flag : 1; // [0:0] #endif }; /* Description FIRST_MSDU_IN_MPDU_FLAG Parsed from RX_MSDU_END TLV . In the case MSDU spans over multiple buffers, this field will be valid in the Last buffer used by the MSDU This is not the first MSDU in the MPDU. This MSDU is the first one in the MPDU. */ #define RX_MSDU_DESC_INFO_FIRST_MSDU_IN_MPDU_FLAG_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_FIRST_MSDU_IN_MPDU_FLAG_LSB 0 #define RX_MSDU_DESC_INFO_FIRST_MSDU_IN_MPDU_FLAG_MSB 0 #define RX_MSDU_DESC_INFO_FIRST_MSDU_IN_MPDU_FLAG_MASK 0x00000001 /* Description LAST_MSDU_IN_MPDU_FLAG Consumer: WBM/REO/SW/FW Producer: RXDMA Parsed from RX_MSDU_END TLV . In the case MSDU spans over multiple buffers, this field will be valid in the Last buffer used by the MSDU There are more MSDUs linked to this MSDU that belongs to this MPDU this MSDU is the last one in the MPDU. This setting is only allowed in combination with 'Msdu_continuation' set to 0. This implies that when an msdu is spread out over multiple buffers and thus msdu_continuation is set, only for the very last buffer of the msdu, can the 'last_msdu_in_mpdu_flag' be set. When both first_msdu_in_mpdu_flag and last_msdu_in_mpdu_flag are set, the MPDU that this MSDU belongs to only contains a single MSDU. */ #define RX_MSDU_DESC_INFO_LAST_MSDU_IN_MPDU_FLAG_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_LAST_MSDU_IN_MPDU_FLAG_LSB 1 #define RX_MSDU_DESC_INFO_LAST_MSDU_IN_MPDU_FLAG_MSB 1 #define RX_MSDU_DESC_INFO_LAST_MSDU_IN_MPDU_FLAG_MASK 0x00000002 /* Description MSDU_CONTINUATION When set, this MSDU buffer was not able to hold the entire MSDU. The next buffer will therefor contain additional information related to this MSDU. */ #define RX_MSDU_DESC_INFO_MSDU_CONTINUATION_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_MSDU_CONTINUATION_LSB 2 #define RX_MSDU_DESC_INFO_MSDU_CONTINUATION_MSB 2 #define RX_MSDU_DESC_INFO_MSDU_CONTINUATION_MASK 0x00000004 /* Description MSDU_LENGTH Parsed from RX_MSDU_START TLV . In the case MSDU spans over multiple buffers, this field will be valid in the First buffer used by MSDU. Full MSDU length in bytes after decapsulation. This field is still valid for MPDU frames without A-MSDU. It still represents MSDU length after decapsulation Or in case of RAW MPDUs, it indicates the length of the entire MPDU (without FCS field) */ #define RX_MSDU_DESC_INFO_MSDU_LENGTH_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_MSDU_LENGTH_LSB 3 #define RX_MSDU_DESC_INFO_MSDU_LENGTH_MSB 16 #define RX_MSDU_DESC_INFO_MSDU_LENGTH_MASK 0x0001fff8 /* Description MSDU_DROP Parsed from RX_MSDU_END TLV . In the case MSDU spans over multiple buffers, this field will be valid in the Last buffer used by the MSDU When set, REO shall drop this MSDU and not forward it to any other ring... */ #define RX_MSDU_DESC_INFO_MSDU_DROP_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_MSDU_DROP_LSB 17 #define RX_MSDU_DESC_INFO_MSDU_DROP_MSB 17 #define RX_MSDU_DESC_INFO_MSDU_DROP_MASK 0x00020000 /* Description SA_IS_VALID Parsed from RX_MSDU_END TLV . In the case MSDU spans over multiple buffers, this field will be valid in the Last buffer used by the MSDU Indicates that OLE found a valid SA entry for this MSDU */ #define RX_MSDU_DESC_INFO_SA_IS_VALID_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_SA_IS_VALID_LSB 18 #define RX_MSDU_DESC_INFO_SA_IS_VALID_MSB 18 #define RX_MSDU_DESC_INFO_SA_IS_VALID_MASK 0x00040000 /* Description DA_IS_VALID Parsed from RX_MSDU_END TLV . In the case MSDU spans over multiple buffers, this field will be valid in the Last buffer used by the MSDU Indicates that OLE found a valid DA entry for this MSDU */ #define RX_MSDU_DESC_INFO_DA_IS_VALID_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_DA_IS_VALID_LSB 19 #define RX_MSDU_DESC_INFO_DA_IS_VALID_MSB 19 #define RX_MSDU_DESC_INFO_DA_IS_VALID_MASK 0x00080000 /* Description DA_IS_MCBC Field Only valid if "da_is_valid" is set Indicates the DA address was a Multicast of Broadcast address for this MSDU */ #define RX_MSDU_DESC_INFO_DA_IS_MCBC_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_DA_IS_MCBC_LSB 20 #define RX_MSDU_DESC_INFO_DA_IS_MCBC_MSB 20 #define RX_MSDU_DESC_INFO_DA_IS_MCBC_MASK 0x00100000 /* Description L3_HEADER_PADDING_MSB Passed on from 'RX_MSDU_END' TLV (only the MSB is reported as the LSB is always zero) Number of bytes padded to make sure that the L3 header will always start of a Dword boundary */ #define RX_MSDU_DESC_INFO_L3_HEADER_PADDING_MSB_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_L3_HEADER_PADDING_MSB_LSB 21 #define RX_MSDU_DESC_INFO_L3_HEADER_PADDING_MSB_MSB 21 #define RX_MSDU_DESC_INFO_L3_HEADER_PADDING_MSB_MASK 0x00200000 /* Description TCP_UDP_CHKSUM_FAIL Passed on from 'RX_ATTENTION' TLV Indicates that the computed checksum did not match the checksum in the TCP/UDP header. */ #define RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_LSB 22 #define RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_MSB 22 #define RX_MSDU_DESC_INFO_TCP_UDP_CHKSUM_FAIL_MASK 0x00400000 /* Description IP_CHKSUM_FAIL Passed on from 'RX_ATTENTION' TLV Indicates that the computed checksum did not match the checksum in the IP header. */ #define RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_LSB 23 #define RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_MSB 23 #define RX_MSDU_DESC_INFO_IP_CHKSUM_FAIL_MASK 0x00800000 /* Description FR_DS Passed on from 'RX_MPDU_INFO' structure in 'RX_MPDU_START' TLV Set if the 'from DS' bit is set in the frame control. */ #define RX_MSDU_DESC_INFO_FR_DS_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_FR_DS_LSB 24 #define RX_MSDU_DESC_INFO_FR_DS_MSB 24 #define RX_MSDU_DESC_INFO_FR_DS_MASK 0x01000000 /* Description TO_DS Passed on from 'RX_MPDU_INFO' structure in 'RX_MPDU_START' TLV Set if the 'to DS' bit is set in the frame control. */ #define RX_MSDU_DESC_INFO_TO_DS_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_TO_DS_LSB 25 #define RX_MSDU_DESC_INFO_TO_DS_MSB 25 #define RX_MSDU_DESC_INFO_TO_DS_MASK 0x02000000 /* Description INTRA_BSS This packet needs intra-BSS routing by SW as the 'vdev_id' for the destination is the same as the 'vdev_id' (from 'RX_MPDU_PCU_START') that this MSDU was got in. */ #define RX_MSDU_DESC_INFO_INTRA_BSS_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_INTRA_BSS_LSB 26 #define RX_MSDU_DESC_INFO_INTRA_BSS_MSB 26 #define RX_MSDU_DESC_INFO_INTRA_BSS_MASK 0x04000000 /* Description DEST_CHIP_ID If intra_bss is set, copied by RXOLE/RXDMA from 'ADDR_SEARCH_ENTRY' to support intra-BSS routing with multi-chip multi-link operation. This indicates into which chip's TCL the packet should be queued. */ #define RX_MSDU_DESC_INFO_DEST_CHIP_ID_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_DEST_CHIP_ID_LSB 27 #define RX_MSDU_DESC_INFO_DEST_CHIP_ID_MSB 28 #define RX_MSDU_DESC_INFO_DEST_CHIP_ID_MASK 0x18000000 /* Description DECAP_FORMAT Indicates the format after decapsulation: No encapsulation Ethernet 2 (DIX) or 802.3 (uses SNAP/LLC) Indicate Ethernet */ #define RX_MSDU_DESC_INFO_DECAP_FORMAT_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_DECAP_FORMAT_LSB 29 #define RX_MSDU_DESC_INFO_DECAP_FORMAT_MSB 30 #define RX_MSDU_DESC_INFO_DECAP_FORMAT_MASK 0x60000000 /* Description DEST_CHIP_PMAC_ID If intra_bss is set, copied by RXOLE/RXDMA from 'ADDR_SEARCH_ENTRY' to support intra-BSS routing with multi-chip multi-link operation. This indicates into which link/'vdev' the packet should be queued in TCL. */ #define RX_MSDU_DESC_INFO_DEST_CHIP_PMAC_ID_OFFSET 0x00000000 #define RX_MSDU_DESC_INFO_DEST_CHIP_PMAC_ID_LSB 31 #define RX_MSDU_DESC_INFO_DEST_CHIP_PMAC_ID_MSB 31 #define RX_MSDU_DESC_INFO_DEST_CHIP_PMAC_ID_MASK 0x80000000 #endif // RX_MSDU_DESC_INFO