/*
 * Copyright (c) 2020 The Linux Foundation. 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.
 */

// $ATH_LICENSE_HW_HDR_C$
//
// DO NOT EDIT!  This file is automatically generated
//               These definitions are tied to a particular hardware layout


#ifndef _HE_SIG_B2_OFDMA_INFO_H_
#define _HE_SIG_B2_OFDMA_INFO_H_
#if !defined(__ASSEMBLER__)
#endif


// ################ START SUMMARY #################
//
//	Dword	Fields
//	0	sta_id[10:0], nsts[13:11], txbf[14], sta_mcs[18:15], sta_dcm[19], sta_coding[20], reserved_0[31:21]
//
// ################ END SUMMARY #################

#define NUM_OF_DWORDS_HE_SIG_B2_OFDMA_INFO 1

struct he_sig_b2_ofdma_info {
             uint32_t sta_id                          : 11, //[10:0]
                      nsts                            :  3, //[13:11]
                      txbf                            :  1, //[14]
                      sta_mcs                         :  4, //[18:15]
                      sta_dcm                         :  1, //[19]
                      sta_coding                      :  1, //[20]
                      reserved_0                      : 11; //[31:21]
};

/*

sta_id
			
			Identifies the STA that is addressed. Details of STA ID
			are TBD

nsts
			
			MAC RX side usage only:
			
			
			
			Number of spatial streams for this user
			
			
			
			<enum 0 1_spatial_stream>Single spatial stream
			
			<enum 1 2_spatial_streams>2 spatial streams
			
			<enum 2 3_spatial_streams>3 spatial streams
			
			<enum 3 4_spatial_streams>4 spatial streams
			
			<enum 4 5_spatial_streams>5 spatial streams
			
			<enum 5 6_spatial_streams>6 spatial streams
			
			<enum 6 7_spatial_streams>7 spatial streams
			
			<enum 7 8_spatial_streams>8 spatial streams

txbf
			
			Indicates whether beamforming is applied
			
			0: No beamforming
			
			1: beamforming
			
			<legal all>

sta_mcs
			
			Indicates the data MCS

sta_dcm
			
			
			0: No DCM
			
			1:DCM
			
			<legal all>

sta_coding
			
			Distinguishes between BCC/LDPC
			
			
			
			0: BCC
			
			1: LDPC
			
			<legal all>

reserved_0
			
			<legal 0>
*/


/* Description		HE_SIG_B2_OFDMA_INFO_0_STA_ID
			
			Identifies the STA that is addressed. Details of STA ID
			are TBD
*/
#define HE_SIG_B2_OFDMA_INFO_0_STA_ID_OFFSET                         0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_STA_ID_LSB                            0
#define HE_SIG_B2_OFDMA_INFO_0_STA_ID_MASK                           0x000007ff

/* Description		HE_SIG_B2_OFDMA_INFO_0_NSTS
			
			MAC RX side usage only:
			
			
			
			Number of spatial streams for this user
			
			
			
			<enum 0 1_spatial_stream>Single spatial stream
			
			<enum 1 2_spatial_streams>2 spatial streams
			
			<enum 2 3_spatial_streams>3 spatial streams
			
			<enum 3 4_spatial_streams>4 spatial streams
			
			<enum 4 5_spatial_streams>5 spatial streams
			
			<enum 5 6_spatial_streams>6 spatial streams
			
			<enum 6 7_spatial_streams>7 spatial streams
			
			<enum 7 8_spatial_streams>8 spatial streams
*/
#define HE_SIG_B2_OFDMA_INFO_0_NSTS_OFFSET                           0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_NSTS_LSB                              11
#define HE_SIG_B2_OFDMA_INFO_0_NSTS_MASK                             0x00003800

/* Description		HE_SIG_B2_OFDMA_INFO_0_TXBF
			
			Indicates whether beamforming is applied
			
			0: No beamforming
			
			1: beamforming
			
			<legal all>
*/
#define HE_SIG_B2_OFDMA_INFO_0_TXBF_OFFSET                           0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_TXBF_LSB                              14
#define HE_SIG_B2_OFDMA_INFO_0_TXBF_MASK                             0x00004000

/* Description		HE_SIG_B2_OFDMA_INFO_0_STA_MCS
			
			Indicates the data MCS
*/
#define HE_SIG_B2_OFDMA_INFO_0_STA_MCS_OFFSET                        0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_STA_MCS_LSB                           15
#define HE_SIG_B2_OFDMA_INFO_0_STA_MCS_MASK                          0x00078000

/* Description		HE_SIG_B2_OFDMA_INFO_0_STA_DCM
			
			
			0: No DCM
			
			1:DCM
			
			<legal all>
*/
#define HE_SIG_B2_OFDMA_INFO_0_STA_DCM_OFFSET                        0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_STA_DCM_LSB                           19
#define HE_SIG_B2_OFDMA_INFO_0_STA_DCM_MASK                          0x00080000

/* Description		HE_SIG_B2_OFDMA_INFO_0_STA_CODING
			
			Distinguishes between BCC/LDPC
			
			
			
			0: BCC
			
			1: LDPC
			
			<legal all>
*/
#define HE_SIG_B2_OFDMA_INFO_0_STA_CODING_OFFSET                     0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_STA_CODING_LSB                        20
#define HE_SIG_B2_OFDMA_INFO_0_STA_CODING_MASK                       0x00100000

/* Description		HE_SIG_B2_OFDMA_INFO_0_RESERVED_0
			
			<legal 0>
*/
#define HE_SIG_B2_OFDMA_INFO_0_RESERVED_0_OFFSET                     0x00000000
#define HE_SIG_B2_OFDMA_INFO_0_RESERVED_0_LSB                        21
#define HE_SIG_B2_OFDMA_INFO_0_RESERVED_0_MASK                       0xffe00000


#endif // _HE_SIG_B2_OFDMA_INFO_H_
