/*
 * Copyright (c) 2019 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.
 */

//
// 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_
