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