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