/*
 * 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.
 */

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


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


// ################ START SUMMARY #################
//
//	Dword	Fields
//	0	sta_id[10:0], sta_spatial_config[14:11], sta_mcs[18:15], reserved_set_to_1[19], sta_coding[20], reserved_0a[28:21], nsts[31:29]
//
// ################ END SUMMARY #################

#define NUM_OF_DWORDS_HE_SIG_B2_MU_INFO 1

struct he_sig_b2_mu_info {
             uint32_t sta_id                          : 11, //[10:0]
                      sta_spatial_config              :  4, //[14:11]
                      sta_mcs                         :  4, //[18:15]
                      reserved_set_to_1               :  1, //[19]
                      sta_coding                      :  1, //[20]
                      reserved_0a                     :  8, //[28:21]
                      nsts                            :  3; //[31:29]
};

/*

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

sta_spatial_config
			
			Number of assigned spatial streams and their
			corresponding index. 
			
			Total number of spatial streams assigned for the MU-MIMO
			allocation is also signaled. 

sta_mcs
			
			Indicates the data MCS

reserved_set_to_1
			
			<legal 1>

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

reserved_0a
			
			<legal 0>

nsts
			
			MAC RX side usage only:
			
			Needed by RXPCU. Provided by PHY so that RXPCU does not
			need to have the RU number decoding logic.
			
			
			
			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
*/


/* Description		HE_SIG_B2_MU_INFO_0_STA_ID
			
			Identifies the STA that is addressed. Details of STA ID
			are TBD
*/
#define HE_SIG_B2_MU_INFO_0_STA_ID_OFFSET                            0x00000000
#define HE_SIG_B2_MU_INFO_0_STA_ID_LSB                               0
#define HE_SIG_B2_MU_INFO_0_STA_ID_MASK                              0x000007ff

/* Description		HE_SIG_B2_MU_INFO_0_STA_SPATIAL_CONFIG
			
			Number of assigned spatial streams and their
			corresponding index. 
			
			Total number of spatial streams assigned for the MU-MIMO
			allocation is also signaled. 
*/
#define HE_SIG_B2_MU_INFO_0_STA_SPATIAL_CONFIG_OFFSET                0x00000000
#define HE_SIG_B2_MU_INFO_0_STA_SPATIAL_CONFIG_LSB                   11
#define HE_SIG_B2_MU_INFO_0_STA_SPATIAL_CONFIG_MASK                  0x00007800

/* Description		HE_SIG_B2_MU_INFO_0_STA_MCS
			
			Indicates the data MCS
*/
#define HE_SIG_B2_MU_INFO_0_STA_MCS_OFFSET                           0x00000000
#define HE_SIG_B2_MU_INFO_0_STA_MCS_LSB                              15
#define HE_SIG_B2_MU_INFO_0_STA_MCS_MASK                             0x00078000

/* Description		HE_SIG_B2_MU_INFO_0_RESERVED_SET_TO_1
			
			<legal 1>
*/
#define HE_SIG_B2_MU_INFO_0_RESERVED_SET_TO_1_OFFSET                 0x00000000
#define HE_SIG_B2_MU_INFO_0_RESERVED_SET_TO_1_LSB                    19
#define HE_SIG_B2_MU_INFO_0_RESERVED_SET_TO_1_MASK                   0x00080000

/* Description		HE_SIG_B2_MU_INFO_0_STA_CODING
			
			Distinguishes between BCC/LDPC
			
			
			
			0: BCC
			
			1: LDPC
			
			<legal all>
*/
#define HE_SIG_B2_MU_INFO_0_STA_CODING_OFFSET                        0x00000000
#define HE_SIG_B2_MU_INFO_0_STA_CODING_LSB                           20
#define HE_SIG_B2_MU_INFO_0_STA_CODING_MASK                          0x00100000

/* Description		HE_SIG_B2_MU_INFO_0_RESERVED_0A
			
			<legal 0>
*/
#define HE_SIG_B2_MU_INFO_0_RESERVED_0A_OFFSET                       0x00000000
#define HE_SIG_B2_MU_INFO_0_RESERVED_0A_LSB                          21
#define HE_SIG_B2_MU_INFO_0_RESERVED_0A_MASK                         0x1fe00000

/* Description		HE_SIG_B2_MU_INFO_0_NSTS
			
			MAC RX side usage only:
			
			Needed by RXPCU. Provided by PHY so that RXPCU does not
			need to have the RU number decoding logic.
			
			
			
			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_MU_INFO_0_NSTS_OFFSET                              0x00000000
#define HE_SIG_B2_MU_INFO_0_NSTS_LSB                                 29
#define HE_SIG_B2_MU_INFO_0_NSTS_MASK                                0xe0000000


#endif // _HE_SIG_B2_MU_INFO_H_
