blob: c8884dcc8628f45ab8eabcf636d9da58477dbf89 [file] [log] [blame]
/******************************************************************************
*
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
* Copyright(c) 2018 Intel Corporation
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************/
/****************************************************************************
* File Name : API_rates.h
*
*
* Description : uCode\Driver Command & Response API Definitions
****************************************************************************/
#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_MVM_API_RATES_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_MVM_API_RATES_H_
#include "third_party/iwlwifi/platform/compiler.h"
/**
@defgroup GroupRates Rates Masks and Indices
@ingroup GroupDataPath
@{
*/
// *****************************************
// * channel width code/index from 20Mhz ... 160Mhz
// *****************************************
#define CHANNEL_WIDTH20 0
#define CHANNEL_WIDTH40 1
#define CHANNEL_WIDTH80 2
#define CHANNEL_WIDTH160 3
#define MAX_CHANNEL_BW_INDX 4 // used to initialize const arrays
#define MAX_NSS 2 // max number of spatial streams
#define CHANNEL_WIDTH_MSK_API_D_VER_1 1
#define CHANNEL_WIDTH_MSK_API_D_VER_2 3
// *****************************************
// * ofdm & cck rate codes
// *****************************************
/**
@defgroup GroupRatesCodes OFDM and CCK Rate Codes
@ingroup GroupRates
@{
*/
#define R_6M 0xd
#define R_9M 0xf
#define R_12M 0x5
#define R_18M 0x7
#define R_24M 0x9
#define R_36M 0xb
#define R_48M 0x1
#define R_54M 0x3
#define R_1M 0xa
#define R_2M 0x14
#define R_5_5M 0x37
#define R_11M 0x6e
/**@} GroupRatesCodes */
// *****************************************
// * ofdm & cck indices
// *****************************************
/**
@defgroup GroupRatesIndices OFDM and CCK Rate Indices
@ingroup GroupRates
@{
*/
#define R_6M_INDEX 0x6
#define R_9M_INDEX 0x7
#define R_12M_INDEX 0x2
#define R_18M_INDEX 0x3
#define R_24M_INDEX 0x4
#define R_36M_INDEX 0x5
#define R_48M_INDEX 0x0
#define R_54M_INDEX 0x1
#define R_1M_INDEX 0x0
#define R_2M_INDEX 0x1
#define R_5_5M_INDEX 0x3
#define R_11M_INDEX 0x2
/**@} GroupRatesIndices */
// *****************************************
// * OFDM Rate Masks
// *****************************************
/**
@defgroup GroupOfdmRatesMasks OFDM Rate Masks
@ingroup GroupRates
@{
*/
#define R_6M_MSK 0x1
#define R_9M_MSK 0x2
#define R_12M_MSK 0x4
#define R_18M_MSK 0x8
#define R_24M_MSK 0x10
#define R_36M_MSK 0x20
#define R_48M_MSK 0x40
#define R_54M_MSK 0x80
/**@} GroupOfdmRatesMasks */
// *****************************************
// * CCK Rate Masks
// *****************************************
/**
@defgroup GroupCckRatesMasks CCK Rate Masks
@ingroup GroupRates
@{
*/
#define R_1M_MSK 0x1
#define R_2M_MSK 0x2
#define R_5_5M_MSK 0x4
#define R_11M_MSK 0x8
/**@} GroupCckRatesMasks */
// *****************************************
// * OFDM HT rate codes
// *****************************************
#define MCS_6M 0
#define MCS_12M 1
#define MCS_18M 2
#define MCS_24M 3
#define MCS_36M 4
#define MCS_48M 5
#define MCS_54M 6
#define MCS_60M 7
// MIMO 2-spatial streams
#define MCS_MIMO2_6M 0x8
#define MCS_MIMO2_12M 0x9
#define MCS_MIMO2_18M 0xa
#define MCS_MIMO2_24M 0xb
#define MCS_MIMO2_36M 0xc
#define MCS_MIMO2_48M 0xd
#define MCS_MIMO2_54M 0xe
#define MCS_MIMO2_60M 0xf
// MIMO 3-spatial streams
#define MCS_MIMO3_6M 0x10
#define MCS_MIMO3_12M 0x11
#define MCS_MIMO3_18M 0x12
#define MCS_MIMO3_24M 0x13
#define MCS_MIMO3_36M 0x14
#define MCS_MIMO3_48M 0x15
#define MCS_MIMO3_54M 0x16
#define MCS_MIMO3_60M 0x17
#define MCS_DUP_6M 0x20
// for VHT rates (i.e. 256-QAM punc 3/4 and 5/6)
#define VHT_MCS_RATES_NUM (10)
// for HE rates (i.e. 1024-QAM punc 3/4 and 5/6)
#define HE_MCS_RATES_NUM (12)
#define MCS_VHT_6M MCS_6M
#define MCS_VHT_12M MCS_12M
#define MCS_VHT_18M MCS_18M
#define MCS_VHT_24M MCS_24M
#define MCS_VHT_36M MCS_36M
#define MCS_VHT_48M MCS_48M
#define MCS_VHT_54M MCS_54M
#define MCS_VHT_60M MCS_60M
#define MCS_VHT_72M 8
#define MCS_VHT_80M 9
#define MCS_VHT_MIMO2_6M (0x10 | MCS_VHT_6M)
#define MCS_VHT_MIMO2_12M (0x10 | MCS_VHT_12M)
#define MCS_VHT_MIMO2_18M (0x10 | MCS_VHT_18M)
#define MCS_VHT_MIMO2_24M (0x10 | MCS_VHT_24M)
#define MCS_VHT_MIMO2_36M (0x10 | MCS_VHT_36M)
#define MCS_VHT_MIMO2_48M (0x10 | MCS_VHT_48M)
#define MCS_VHT_MIMO2_54M (0x10 | MCS_VHT_54M)
#define MCS_VHT_MIMO2_60M (0x10 | MCS_VHT_60M)
#define MCS_VHT_MIMO2_72M (0x10 | MCS_VHT_72M)
#define MCS_VHT_MIMO2_80M (0x10 | MCS_VHT_80M)
#define MCS_VHT_MIMO3_6M (0x20 | MCS_VHT_6M)
#define MCS_VHT_MIMO3_12M (0x20 | MCS_VHT_12M)
#define MCS_VHT_MIMO3_18M (0x20 | MCS_VHT_18M)
#define MCS_VHT_MIMO3_24M (0x20 | MCS_VHT_24M)
#define MCS_VHT_MIMO3_36M (0x20 | MCS_VHT_36M)
#define MCS_VHT_MIMO3_48M (0x20 | MCS_VHT_48M)
#define MCS_VHT_MIMO3_54M (0x20 | MCS_VHT_54M)
#define MCS_VHT_MIMO3_60M (0x20 | MCS_VHT_60M)
#define MCS_VHT_MIMO3_72M (0x20 | MCS_VHT_72M)
#define MCS_VHT_MIMO3_80M (0x20 | MCS_VHT_80M)
// HT these rates are not used
#define MCS_MIMO2_MIXED_16Q_04Q_39M 0x21
#define MCS_MIMO2_MIXED_64Q_04Q_52M 0x22
#define MCS_MIMO2_MIXED_64Q_16Q_65M 0x23
#define MCS_MIMO2_MIXED_16Q_04Q_58M 0x24
#define MCS_MIMO2_MIXED_64Q_04Q_78M 0x25
#define MCS_MIMO2_MIXED_64Q_16Q_97M 0x26
#define MCS_MIMO3_MIXED_16Q_04Q_04Q_52M 0x27
#define MCS_MIMO3_MIXED_16Q_16Q_04Q_65M 0x28
#define MCS_MIMO3_MIXED_64Q_04Q_04Q_65M 0x29
#define MCS_MIMO3_MIXED_64Q_16Q_04Q_78M 0x2a
#define MCS_MIMO3_MIXED_64Q_16Q_16Q_91M 0x2b
#define MCS_MIMO3_MIXED_64Q_64Q_04Q_91M 0x2c
#define MCS_MIMO3_MIXED_64Q_64Q_16Q_104M 0x2d
#define MCS_MIMO3_MIXED_16Q_04Q_04Q_78M 0x2e
#define MCS_MIMO3_MIXED_16Q_16Q_04Q_97M 0x2f
#define MCS_MIMO3_MIXED_64Q_04Q_04Q_97M 0x30
#define MCS_MIMO3_MIXED_64Q_16Q_04Q_117M 0x31
#define MCS_MIMO3_MIXED_64Q_16Q_16Q_136M 0x32
#define MCS_MIMO3_MIXED_64Q_64Q_04Q_136M 0x33
#define MCS_MIMO3_MIXED_64Q_64Q_16Q_156M 0x34
#define QAM_BPSK 0 // MCS 0
#define QAM_QPSK 1 // MCS 1, 2
#define QAM_16 2 // MCS 3, 4
#define QAM_64 3 // MCS 5, 6, 7
#define QAM_256 4 // MCS 8, 9
#define QAM_1024 5 // MCS 10, 11
// *****************************************
// * OFDM HT Rate Masks
// *****************************************
#define MCS_6M_MSK 0x1
#define MCS_12M_MSK 0x2
#define MCS_18M_MSK 0x4
#define MCS_24M_MSK 0x8
#define MCS_36M_MSK 0x10
#define MCS_48M_MSK 0x20
#define MCS_54M_MSK 0x40
#define MCS_60M_MSK 0x80
#define MCS_12M_DUAL_MSK 0x100
#define MCS_24M_DUAL_MSK 0x200
#define MCS_36M_DUAL_MSK 0x400
#define MCS_48M_DUAL_MSK 0x800
#define MCS_72M_DUAL_MSK 0x1000
#define MCS_96M_DUAL_MSK 0x2000
#define MCS_108M_DUAL_MSK 0x4000
#define MCS_120M_DUAL_MSK 0x8000
#define MCS_18M_TRIPPLE_MSK 0x10000
#define MCS_36M_TRIPPLE_MSK 0x20000
#define MCS_54M_TRIPPLE_MSK 0x40000
#define MCS_72M_TRIPPLE_MSK 0x80000
#define MCS_108M_TRIPPLE_MSK 0x100000
#define MCS_144M_TRIPPLE_MSK 0x200000
#define MCS_162M_TRIPPLE_MSK 0x400000
#define MCS_180M_TRIPPLE_MSK 0x800000
// *****************************************
// * OFDM VHT Rate Masks
// *****************************************
#define MCS_VHT_6M_MSK 0x1
#define MCS_VHT_12M_MSK 0x2
#define MCS_VHT_18M_MSK 0x4
#define MCS_VHT_24M_MSK 0x8
#define MCS_VHT_36M_MSK 0x10
#define MCS_VHT_48M_MSK 0x20
#define MCS_VHT_54M_MSK 0x40
#define MCS_VHT_60M_MSK 0x80
#define MCS_VHT_72M_MSK 0x100
#define MCS_VHT_80M_MSK 0x200
#define MCS_VHT_6M_MIMO2_MSK 0x400
#define MCS_VHT_12M_MIMO2_MSK 0x800
#define MCS_VHT_18M_MIMO2_MSK 0x1000
#define MCS_VHT_24M_MIMO2_MSK 0x2000
#define MCS_VHT_36M_MIMO2_MSK 0x4000
#define MCS_VHT_48M_MIMO2_MSK 0x8000
#define MCS_VHT_54M_MIMO2_MSK 0x10000
#define MCS_VHT_60M_MIMO2_MSK 0x20000
#define MCS_VHT_72M_MIMO2_MSK 0x40000
#define MCS_VHT_80M_MIMO2_MSK 0x80000
#define MCS_VHT_6M_MIMO3_MSK 0x100000
#define MCS_VHT_12M_MIMO3_MSK 0x200000
#define MCS_VHT_18M_MIMO3_MSK 0x400000
#define MCS_VHT_24M_MIMO3_MSK 0x800000
#define MCS_VHT_36M_MIMO3_MSK 0x1000000
#define MCS_VHT_48M_MIMO3_MSK 0x2000000
#define MCS_VHT_54M_MIMO3_MSK 0x4000000
#define MCS_VHT_60M_MIMO3_MSK 0x8000000
#define MCS_VHT_72M_MIMO3_MSK 0x10000000
#define MCS_VHT_80M_MIMO3_MSK 0x20000000
#define MCS_HE_6M MCS_VHT_6M
#define MCS_HE_12M MCS_VHT_12M
#define MCS_HE_18M MCS_VHT_18M
#define MCS_HE_24M MCS_VHT_24M
#define MCS_HE_36M MCS_VHT_36M
#define MCS_HE_48M MCS_VHT_48M
#define MCS_HE_54M MCS_VHT_54M
#define MCS_HE_60M MCS_VHT_60M
#define MCS_HE_72M MCS_VHT_72M
#define MCS_HE_80M MCS_VHT_80M
#define MCS_HE_90M 0xa
#define MCS_HE_100M 0xb
#define MCS_HE_MAX MCS_HE_100M
#define BEACON_TEMPLATE_FLAGS_ANT_A_POS (9)
#define BEACON_TEMPLATE_FLAGS_ANT_B_POS (10)
#define BEACON_TEMPLATE_FLAGS_ANT_C_POS (11)
#define BEACON_TEMPLATE_FLAGS_ANT_ABC_NORM_MSK (BIT_MASK_3BIT)
#define BEACON_TEMPLATE_FLAGS_ANT_ABC_MSK \
(BEACON_TEMPLATE_FLAGS_ANT_ABC_NORM_MSK << BEACON_TEMPLATE_FLAGS_ANT_A_POS)
// Kedron, added rate & MCS struct
// bit 7:0 Rate or MCS
// bit 8 OFDM-HT
// bit 9 CCK
// bit 10 reserved (removed CCK short preamble)
// bit 11 FAT channel
// bit 12 reserved (removed FAT duplicate)
// bit 13 short GI
// bit 14 TX chain A enable
// bit 15 TX chain B enable
// bit 16 TX chain C enable
// HT bit-2:0 give rate code (QAM/puncture) such 0==>6M....7==>63M,
// bit-4:3 spatial streams such 0==>1 SS, 1==>2 SS, 2==>3 SS
// VHT bit-3:0 give rate code (QAM/puncture)
// bit-5:4 spatial streams such 0==>1 SS, 1==>2 SS, 2==>3 SS
// HE
#define RATE_MCS_CODE_MSK 0x7f
typedef enum _MIMO_INDX_E {
SISO_INDX = 0,
MIMO2_INDX = 1,
MIMO3_INDX = 2,
MIMO4_INDX = 3,
MAX_MIMO_INDX
} MIMO_INDX_E;
// this mask will apply to all MCS with the exception of MCS 32 which is not mimo but bit 5 is set
// for all other MCSs bits [6..3] set --> MIMO rate
#define RATE_MCS_HT_RATE_CODE_MSK 0x7
#define RATE_MCS_HT_MIMO_POS 3
#define RATE_MCS_HT_MIMO_MSK (0x3 << RATE_MCS_HT_MIMO_POS)
// bit-3 0==>one spatial stream 1==>two spatial streams
#define RATE_MCS_HT_SISO_MSK (0 << RATE_MCS_HT_MIMO_POS)
#define RATE_MCS_HT_MIMO2_MSK (1 << RATE_MCS_HT_MIMO_POS)
#define RATE_MCS_HT_MIMO3_MSK (2 << RATE_MCS_HT_MIMO_POS)
// bit-3:0 give VHT rate code, QAM and puncturing
// 0==>BPSK 1/2, 1==>QPSK 1/2, 2==>QPSK 2/3, 3==>16QAM 1/2
// 4==>16QAM 3/4, 5==>64QAM 2/3, 6==>64QAM 3/4, 7==>64QAM 5/6
// 8==>256QAM 3/4, 9==>256QAM 5/6
#define RATE_MCS_VHT_RATE_CODE_MSK 0xf
#define RATE_MCS_VHT_MIMO_POS 4
#define RATE_MCS_VHT_MIMO_MSK (3 << RATE_MCS_VHT_MIMO_POS)
#define RATE_MCS_VHT_SISO (0 << RATE_MCS_VHT_MIMO_POS)
#define RATE_MCS_VHT_MIMO2 (1 << RATE_MCS_VHT_MIMO_POS)
#define RATE_MCS_VHT_MIMO3 (2 << RATE_MCS_VHT_MIMO_POS)
#define RATE_MCS_VHT_MIMO4 (3 << RATE_MCS_VHT_MIMO_POS)
// bit-5 HT MCS 0x20, 2x6Mbps, not used
#define RATE_MCS_HT_DUP_POS 5
#define RATE_MCS_HT_DUP_MSK (1 << RATE_MCS_HT_DUP_POS)
// flag field reside at bits 15:8
#define RATE_MCS_FLAGS_POS 8
// bit-8 0==>legacy rate 1==>HT MCS
#define RATE_MCS_HT_POS 8
#define RATE_MCS_HT_MSK (1 << RATE_MCS_HT_POS)
// bit-9 0==>OFDM 1==>CCK
#define RATE_MCS_CCK_POS 9
#define RATE_MCS_CCK_MSK (1 << RATE_MCS_CCK_POS)
// bit-10 mark usage of green-field preamble
//#define RATE_MCS_GF_POS 10
//#define RATE_MCS_GF_MSK (1 << RATE_MCS_GF_POS)
// bit-10 mark modulation is OFDM HE, exact type is given in VHT_HT_TYPE field
#define RATE_MCS_HE_POS 10
// bit-12:11 0==>20MHz, 1==>40MHz, 2==>80MHz, 3==>160MHz
// Note: for duplicate use non-FAT
#define RATE_MCS_FAT_POS 11
#define RATE_MCS_FAT_MSK_API_D_VER_1 (CHANNEL_WIDTH_MSK_API_D_VER_1 << RATE_MCS_FAT_POS)
#define RATE_MCS_FAT_MSK_API_D_VER_2 (CHANNEL_WIDTH_MSK_API_D_VER_2 << RATE_MCS_FAT_POS)
#define RATE_MCS_FAT40 (CHANNEL_WIDTH40 << RATE_MCS_FAT_POS)
#define RATE_MCS_FAT80 (CHANNEL_WIDTH80 << RATE_MCS_FAT_POS)
#define RATE_MCS_FAT160 (CHANNEL_WIDTH160 << RATE_MCS_FAT_POS)
// bit-13 0==>normal guard interval 1==>short guard interval
#define RATE_MCS_SGI_POS 13
#define RATE_MCS_SGI_MSK (1 << RATE_MCS_SGI_POS)
// bit-14 0==>chain A inactive 1==>chain A active
#define RATE_MCS_ANT_A_POS 14
// bit-15 0==>chain B inactive 1==>chain B active
#define RATE_MCS_ANT_B_POS 15
// new flags in shiloh (ext_flags)
// bit-16 0==>chain B inactive 1==>chain B active
#define RATE_MCS_ANT_C_POS 16
// bit-15:14 mask for both ant.
#define RATE_MCS_ANT_AB_MSK (RATE_MCS_ANT_A_MSK | RATE_MCS_ANT_B_MSK)
#define RATE_MCS_ANT_AC_MSK (RATE_MCS_ANT_A_MSK | RATE_MCS_ANT_C_MSK)
#define RATE_MCS_ANT_BC_MSK (RATE_MCS_ANT_B_MSK | RATE_MCS_ANT_C_MSK)
// bit-16:14 mask for all ants.
#define RATE_MCS_3ANT_MSK(rate) ((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_ABC_MSK)
#define RATE_MCS_2ANT_MSK(rate) \
(((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_AB_MSK) || \
((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_AC_MSK) || \
((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_BC_MSK))
#define RATE_MCS_1ANT_MSK(rate) \
(((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_A_MSK) || \
((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_B_MSK) || \
((rate.rate_n_flags & RATE_MCS_ANT_ABC_MSK) == RATE_MCS_ANT_C_MSK))
// rate&flags cleanup - use single bit for STBC
// for HT the number of space-time-streams is SS+STBC, STBC is 0/1/2
// for VHT the number of space-time-streams is: STBC=0 ==> SS, STBC=1 ==> SS*2, STBC is 0/1
// note for HT STBC is writen in TX_VEC0, while for VHT in TX_VEC_VHT1 (0x8051)
#define RATE_MCS_STBC_POS 17
// HE - dual carrier mode
#define RATE_MCS_HE_DCM_POS 18
#define RATE_MCS_HE_DCM_MSK (1 << RATE_MCS_HE_DCM_POS)
// Beam-forming defines
#define RATE_MCS_BF_POS 19
#define RATE_MCS_BF_MSK (1 << RATE_MCS_BF_POS)
// removed - HE rate&flags cleanup
// BFR NDP frame, this is used only for TX NDP.
//#define RATE_MCS_ZLF_POS (20)
//#define RATE_MCS_ZLF_MSK (1 << RATE_MCS_ZLF_POS)
// removed - HE rate&flags cleanup
// sounding packet, used (currently) only for HT BF, (i.e. not VHT)
//#define RATE_MCS_HT_SOUNDING_POS (21)
//#define RATE_MCS_HT_SOUNDING_MSK (1 << RATE_MCS_HT_SOUNDING_POS)
// removed - HE rate&flags cleanup
// extended LTFs used to allow the transmitter to send more LTFs then the MIMO level
// currently used only for HT rates, (for VHT use NDP (i.e. ZLF))
//#define RATE_MCS_HT_NUMBER_EXT_LTF_POS (22)
//#define RATE_MCS_HT_NUMBER_EXT_LTF_MSK (3 << RATE_MCS_HT_NUMBER_EXT_LTF_POS)
// HE guard-interval and LTF size: 0 - 1xLTF+0.8us, 1 - 2xLTF+0.8us, 2 - 2xLTF+1.6us, 3 -
// 4xLTF+3.2us,
// for HE_SU a 4th - 4xLTF+0.8us <- GI_LTF=3 & SGI=1
#define RATE_MCS_HE_GI_LTF_POS 20
// VHT: 0 - SU, 2 - MU, HE: 0 - SU, 1 - SU_EXT, 2 - MU, 3 - trig-base
#define RATE_MCS_VHT_HE_TYPE_POS 22
#define RATE_MCS_VHT_HE_TYPE_MSK (0x3 << RATE_MCS_VHT_HE_TYPE_POS)
#define RATE_MCS_VHT_HE_SU 0
#define RATE_MCS_HE_EXT_RANGE 1
#define RATE_MCS_VHT_HE_MU 2
#define RATE_MCS_HE_TRIG_BASE 3
// VHT rates defines
// VHT frame
// 0==>1x20MHz (i.e. no dup), 1==>2x20MHz, 2==>4x20MHz, 3==>8x20MHz
// note: when using duplicate FAT should be 0, i.e. 20Mhz
#define RATE_MCS_DUP_POS_API_D_VER_1 (12)
#define RATE_MCS_DUP_POS_API_D_VER_2 (24)
#define RATE_MCS_DUP_MSK_API_D_VER_1 (CHANNEL_WIDTH_MSK_API_D_VER_1 << RATE_MCS_DUP_POS_API_D_VER_1)
#define RATE_MCS_DUP_MSK_API_D_VER_2 (CHANNEL_WIDTH_MSK_API_D_VER_2 << RATE_MCS_DUP_POS_API_D_VER_2)
// rate&flags cleanup, moved to VHT_HE_TYPE field
//#define RATE_MCS_MU_POS (28)
//#define RATE_MCS_MU_MSK (1 << RATE_MCS_MU_POS)
// mark HE extended range using 106-tones
#define RATE_MCS_HE_ER_106_POS (28)
#define RATE_MCS_HE_ER_106_MSK (1 << RATE_MCS_HE_ER_106_POS)
#define RATE_MCS_RTS_REQUIRED_POS (30)
#define RATE_MCS_RTS_REQUIRED_MSK (0x1 << RATE_MCS_RTS_REQUIRED_POS)
#define RATE_MCS_CTS_REQUIRED_POS (31)
#define RATE_MCS_CTS_REQUIRED_MSK ((U32)0x1 << RATE_MCS_CTS_REQUIRED_POS)
#define RATE_MCS_PROT_REQUIRED_POS (30)
#define RATE_MCS_PROT_REQUIRED_MSK ((U32)0x3 << RATE_MCS_PROT_REQUIRED_POS)
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// The below defines are obsolete.
// There are still define here since the driver still use it.
// Need to cleanup the driver code and remove it from here.
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define RATE_MCS_GF_POS (10)
#define RATE_MCS_GF_MSK (1 << RATE_MCS_GF_POS)
#define RATE_MCS_ZLF_POS (20)
#define RATE_MCS_ZLF_MSK (1 << RATE_MCS_ZLF_POS)
#define RATE_MCS_HT_SOUNDING_POS (21)
#define RATE_MCS_HT_SOUNDING_MSK (1 << RATE_MCS_HT_SOUNDING_POS)
#define RATE_MCS_HT_NUMBER_EXT_LTF_POS (22)
#define RATE_MCS_HT_NUMBER_EXT_LTF_MSK (3 << RATE_MCS_HT_NUMBER_EXT_LTF_POS)
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define POWER_TABLE_NUM_HT_OFDM_ENTRIES (32) // for Kedron
#define MAX_SUPP_MCS_API_D_VER_1 (15)
// modified the max rate index from 76 which is the spec value to 31 which is the last "normal" rate
// index the next "crazy" rate codes are 32-HT_DUP and 33..76 Nss with different QAM per spatial
// stream. note the bc/rate-->time conversion doesn't handle the crazy rates.
//#define MAX_LEGAL_MCS_API_D_VER_1 (76)
#define MAX_LEGAL_MCS_API_D_VER_1 (31)
#define MAX_TX_MCS_API_D_VER_1 (31)
// two entries: one for 2 chains TX(index 1), one for single chain(index 0)
#define POWER_TABLE_NUM_CCK_ENTRIES_API_D_VER_1 (2)
#define POWER_TABLE_NUM_HT_OFDM_ENTRIES_API_D_VER_1 (24) // MCSs 0-23
#define POWER_TABLE_3_STREAM_HT_OFDM_ENTRIES_API_D_VER_1 (24) // MCSs 0-23
#define POWER_TABLE_2_STREAM_HT_OFDM_ENTRIES_API_D_VER_1 (16) // MCSs 0-15
#define POWER_TABLE_1_STREAM_HT_OFDM_ENTRIES_API_D_VER_1 (8) // MCSs 0-7
#define POWER_TABLE_TOTAL_ENTRIES_API_D_VER_1 \
(POWER_TABLE_NUM_CCK_ENTRIES_API_D_VER_1 + \
POWER_TABLE_3_STREAM_HT_OFDM_ENTRIES_API_D_VER_1) // 3 tx chain
#define POWER_TABLE_TOTAL_ENTRIES_API_D_VER_2 \
(POWER_TABLE_NUM_CCK_ENTRIES_API_D_VER_1 + \
POWER_TABLE_2_STREAM_HT_OFDM_ENTRIES_API_D_VER_1) // 2 tx chain
#define POWER_TABLE_TOTAL_ENTRIES_API_D_VER_3 \
(POWER_TABLE_NUM_CCK_ENTRIES_API_D_VER_1 + \
POWER_TABLE_1_STREAM_HT_OFDM_ENTRIES_API_D_VER_1) // 1 tx chain
/**
* @ingroup apiCmdAllTypes
* \brief rates enum
*
*/
typedef enum _MCS_API_E_VER_1 {
mcs_6m = MCS_6M,
mcs_12m = MCS_12M,
mcs_18m = MCS_18M,
mcs_24m = MCS_24M,
mcs_36m = MCS_36M,
mcs_48m = MCS_48M,
mcs_54m = MCS_54M,
mcs_60m = MCS_60M,
mcs_MIMO2_6m = MCS_MIMO2_6M,
mcs_MIMO2_12m = MCS_MIMO2_12M,
mcs_MIMO2_18m = MCS_MIMO2_18M,
mcs_MIMO2_24m = MCS_MIMO2_24M,
mcs_MIMO2_36m = MCS_MIMO2_36M,
mcs_MIMO2_48m = MCS_MIMO2_48M,
mcs_MIMO2_54m = MCS_MIMO2_54M,
mcs_MIMO2_60m = MCS_MIMO2_60M,
mcs_MIMO3_6m = MCS_MIMO3_6M,
mcs_MIMO3_12m = MCS_MIMO3_12M,
mcs_MIMO3_18m = MCS_MIMO3_18M,
mcs_MIMO3_24m = MCS_MIMO3_24M,
mcs_MIMO3_36m = MCS_MIMO3_36M,
mcs_MIMO3_48m = MCS_MIMO3_48M,
mcs_MIMO3_54m = MCS_MIMO3_54M,
mcs_MIMO3_60m = MCS_MIMO3_60M,
mcs_dup_6m = MCS_DUP_6M,
mcs_MIMO2_mixed_16q_04q_39m = MCS_MIMO2_MIXED_16Q_04Q_39M,
mcs_MIMO2_mixed_64q_04q_52m = MCS_MIMO2_MIXED_64Q_04Q_52M,
mcs_MIMO2_mixed_64q_16q_65m = MCS_MIMO2_MIXED_64Q_16Q_65M,
mcs_MIMO2_mixed_16q_04q_58m = MCS_MIMO2_MIXED_16Q_04Q_58M,
mcs_MIMO2_mixed_64q_04q_78m = MCS_MIMO2_MIXED_64Q_04Q_78M,
mcs_MIMO2_mixed_64q_16q_97m = MCS_MIMO2_MIXED_64Q_16Q_97M,
mcs_MIMO3_mixed_16q_04q_04q_52m = MCS_MIMO3_MIXED_16Q_04Q_04Q_52M,
mcs_MIMO3_mixed_16q_16q_04q_65m = MCS_MIMO3_MIXED_16Q_16Q_04Q_65M,
mcs_MIMO3_mixed_64q_04q_04q_65m = MCS_MIMO3_MIXED_64Q_04Q_04Q_65M,
mcs_MIMO3_mixed_64q_16q_04q_78m = MCS_MIMO3_MIXED_64Q_16Q_04Q_78M,
mcs_MIMO3_mixed_64q_16q_16q_91m = MCS_MIMO3_MIXED_64Q_16Q_16Q_91M,
mcs_MIMO3_mixed_64q_64q_04q_91m = MCS_MIMO3_MIXED_64Q_64Q_04Q_91M,
mcs_MIMO3_mixed_64q_64q_16q_104m = MCS_MIMO3_MIXED_64Q_64Q_16Q_104M,
mcs_MIMO3_mixed_16q_04q_04q_78m = MCS_MIMO3_MIXED_16Q_04Q_04Q_78M,
mcs_MIMO3_mixed_16q_16q_04q_97m = MCS_MIMO3_MIXED_16Q_16Q_04Q_97M,
mcs_MIMO3_mixed_64q_04q_04q_97m = MCS_MIMO3_MIXED_64Q_04Q_04Q_97M,
mcs_MIMO3_mixed_64q_16q_04q_117m = MCS_MIMO3_MIXED_64Q_16Q_04Q_117M,
mcs_MIMO3_mixed_64q_16q_16q_136m = MCS_MIMO3_MIXED_64Q_16Q_16Q_136M,
mcs_MIMO3_mixed_64q_64q_04q_136m = MCS_MIMO3_MIXED_64Q_64Q_04Q_136M,
mcs_MIMO3_mixed_64q_64q_16q_156m = MCS_MIMO3_MIXED_64Q_64Q_16Q_156M,
} MCS_API_E_VER_1;
/**
* @ingroup apiCmdAllTypes
* \brief mcs rates
*
*
*/
typedef struct _RATE_MCS_API_S_VER_1 {
U08 rate;
U08 flags;
U16 ext_flags;
} __attribute__((packed)) RATE_MCS_API_S_VER_1;
/**
* Rate representation, with dissection for individual bits
*/
/**
* @ingroup apiCmdAllTypes
* \brief mcs rate bits
*
*
*/
typedef struct RATE_MCS_BITS_API_S_VER_3 {
unsigned int rate : 7; /**< bit 6:0 Rate or MCS */
unsigned int reserved1 : 1; /**< bit 7 reserved */
unsigned int ofdm_ht : 1; /**< bit 8 OFDM-HT */
unsigned int cck : 1; /**< bit 9 CCK */
unsigned int ofdm_he : 1; /**< bit 10 OFDM-HE */
unsigned int fat_channel : 2; /**< bit 12:11 FAT channel 20Mhz...160Mhz, for OFDMA this gives
the full channel width vs. RU */
unsigned int short_gi : 1; /**< bit 13 short GI, for HT/VHT 0 - 0.8us, 1 - 0.4us, for HE-SU use
for 5th LTF_GI for HE-SU use for 5th LTF_GI=3 -> 4xLTF+0.8 */
unsigned int ant_a : 1; /**< bit 14 chain A active */
unsigned int ant_b : 1; /**< bit 15 chain B active */
unsigned int ant_c : 1; /**< bit 16 chain C active */
unsigned int stbc : 1; /**< bit 17 STBC */
unsigned int he_dcm : 1; /**< bit 18 OFDM-HE dual carrier mode, this reduce the number of data
tones by half (for all RUs) */
unsigned int bf : 1; /**< bit 19 beamforming*/
unsigned int he_gi_ltf : 2; /**< bit 21:20 HE guard-interval and LTF
HE SU : 0 - 1xLTF+0.8, 1 - 2xLTF+0.8, 2 - 2xLTF+1.6,
3 - 4xLTF+3.2, 3+short_gi - 4xLTF+0.8 HE MU : 0 -
4xLTF+0.8, 1 - 2xLTF+0.8, 2
- 2xLTF+1.6, 3 - 4xLTF+3.2 HE TRIG: 0 - 1xLTF+1.6, 1
- 2xLTF+1.6, 2 - 4xLTF+3.2*/
unsigned int vht_he_type : 2; /**< bit 23:22 VHT: 0 - SU, 2 - MU, HE: 0 - SU, 1 - SU_EXT_RANGE,
2 - MU (RU gives data channel width), 3 - trig-base */
unsigned int dup_channel : 2; /**< bit 25:24 duplicate channel x1, x2, x4, x8*/
unsigned int ofdm_vht : 1; /**< bit 26 VHT */
unsigned int ldpc : 1; /**< bit 27 LDPC code */
unsigned int he_er_106 : 1; /**< bit 28 HE extended range use 102 data-tones (or 106 tones)*/
unsigned int reserved3 : 1; /**< bit 29 */
unsigned int rts_required : 1; /**< bit 30 RTS reuired for this rate (uCode decision) */
unsigned int cts_required : 1; /**< bit 31 CTS reuired for this rate (uCode decision) */
// unsigned int gf:1; /**< bit 10 green-field */
// unsigned int stbc:2; /**< bit 18:17 STBC */
// unsigned int zlf:1; /**< bit 20 ZLF (NDP) */
// unsigned int sounding:1; /**< bit 21 sounding packet*/
// unsigned int num_of_ext_ss:2; /**< bit 23:22 number of extended spatial streams for
// sounding*/ unsigned int vht_mu:1; /**< bit 28 VHT/HE Multi-user */
} __attribute__((packed)) RATE_MCS_BITS_API_S_VER_3;
/**
* @ingroup apiCmdAllTypes
* \brief Add group and description ...
*
*
*/
typedef union _RATE_MCS_API_U_VER_1 {
RATE_MCS_API_S_VER_1 s;
#if !defined(SV_TOOL_PRECOMPILE_HEADERS)
RATE_MCS_BITS_API_S_VER_3 bits;
#endif
U32 rate_n_flags;
} __attribute__((packed)) RATE_MCS_API_U_VER_1;
/**
* @ingroup apiCmdAllTypes
* \brief rate struct
*
*
*/
typedef struct _RATE_MCS_API_S_VER_0 {
U08 rate;
U08 flags;
} __attribute__((packed)) RATE_MCS_API_S_VER_0;
#define IS_RATE_OFDM_API_M_VER_2(c_rate) ((((c_rate).rate_n_flags) & RATE_MCS_CCK_MSK) == 0)
#define IS_RATE_OFDM_LEGACY_API_M_VER_2(c_rate) \
((((c_rate).rate_n_flags) & (RATE_MCS_CCK_MSK | RATE_MCS_HT_MSK | RATE_MCS_VHT_MSK)) == 0)
#define IS_RATE_OFDM_HT_API_M_VER_2(c_rate) (((c_rate).rate_n_flags) & RATE_MCS_HT_MSK)
#define IS_RATE_OFDM_VHT_API_M_VER_3(c_rate) (((c_rate).rate_n_flags) & RATE_MCS_VHT_MSK)
#define IS_RATE_OFDM_HT_VHT_API_M_VER_3(c_rate) \
(((c_rate).rate_n_flags) & (RATE_MCS_HT_MSK | RATE_MCS_VHT_MSK))
#define IS_RATE_OFDM_VHT_API_M_VER_2(c_rate) (FALSE)
#define IS_RATE_OFDM_HT_VHT_API_M_VER_2(c_rate) IS_RATE_OFDM_HT_API_M_VER_2(c_rate)
#define IS_RATE_CCK_API_M_VER_3(c_rate) (((c_rate).rate_n_flags) & RATE_MCS_CCK_MSK)
#define GET_ANT_CHAIN_API_M_VER_1(c_rate) \
SHIFT_AND_MASK(c_rate.rate_n_flags, RATE_MCS_ANT_ABC_MSK, RATE_MCS_ANT_A_POS)
#define GET_ANT_CHAIN_NUM_API_M_VER_1(c_rate) \
(g_ChainCfg2ChainNum[GET_ANT_CHAIN_API_M_VER_1(c_rate)])
// don't use for VHT
#define IS_RATE_STBC_PRESENT_API_M_VER_1(c_rate) (((c_rate.rate_n_flags) & RATE_MCS_STBC_MSK))
// don't use for VHT
#define GET_NUM_OF_STBC_SS_API_M_VER_1(c_rate) \
SHIFT_AND_MASK((c_rate.rate_n_flags), RATE_MCS_STBC_MSK, RATE_MCS_STBC_POS)
// 0==>20MHz, 1==>40MHz
#define GET_BW_INDEX_API_M_VER_1(c_rate) \
(((c_rate.rate_n_flags) & RATE_MCS_FAT_MSK_API_D_VER_1) >> RATE_MCS_FAT_POS)
// 0==>20MHz, 1==>40MHz, 2==>80MHz, 3==>160MHz
#define GET_BW_INDEX_API_M_VER_2(c_rate) \
(((c_rate.rate_n_flags) & RATE_MCS_FAT_MSK_API_D_VER_2) >> RATE_MCS_FAT_POS)
// 0==>x1, 1==>x2
#define GET_DUP_INDEX_API_M_VER_1(c_rate) \
(((c_rate.rate_n_flags) & RATE_MCS_DUP_MSK_API_D_VER_1) >> RATE_MCS_DUP_POS_API_D_VER_1)
// 0==>x1, 1==>x2, 2==>x4, 3==>x8
#define GET_DUP_INDEX_API_M_VER_2(c_rate) \
(((c_rate.rate_n_flags) & RATE_MCS_DUP_MSK_API_D_VER_2) >> RATE_MCS_DUP_POS_API_D_VER_2)
// get channel width, either by using true wide channel or by duplicate
#define GET_CHANNEL_WIDTH_INDEX_API_M_VER_1(c_rate) \
(GET_BW_INDEX_API_M_VER_1(c_rate) | GET_DUP_INDEX_API_M_VER_1(c_rate))
#define GET_CHANNEL_WIDTH_INDEX_API_M_VER_2(c_rate) \
(GET_BW_INDEX_API_M_VER_2(c_rate) | GET_DUP_INDEX_API_M_VER_2(c_rate))
// 0==>normal GI, 1==>short GI
#define GET_GI_INDEX_API_M_VER_1(c_rate) \
SHIFT_AND_MASK((c_rate.rate_n_flags), RATE_MCS_SGI_MSK, RATE_MCS_SGI_POS)
#define IS_RATE_OFDM_HT_FAT_API_M_VER_2(c_rate) \
(((c_rate.rate_n_flags) & (RATE_MCS_HT_MSK | RATE_MCS_FAT_MSK_API_D_VER_1)) == \
(RATE_MCS_HT_MSK | RATE_MCS_FAT40))
#define GET_HT_MIMO_INDEX_API_M_VER_1(c_rate) \
SHIFT_AND_MASK((c_rate.rate_n_flags), RATE_MCS_HT_MIMO_MSK, RATE_MCS_HT_MIMO_POS)
#define GET_NUM_OF_HT_SS_API_M_VER_1(c_rate) (GET_HT_MIMO_INDEX_API_M_VER_1(c_rate) + 1)
#define IS_RATE_OFDM_HT_MIMO_API_M_VER_2(c_rate) \
(IS_RATE_OFDM_HT_API_M_VER_2(c_rate) && (GET_NUM_OF_HT_SS_API_M_VER_1(c_rate) > 1))
#define IS_RATE_OFDM_HT2x2MIMO_API_M_VER_1(c_rate) \
(IS_RATE_OFDM_HT_API_M_VER_2(c_rate) && (GET_NUM_OF_HT_SS_API_M_VER_1(c_rate) == 2))
#define IS_RATE_OFDM_HT3x3MIMO_API_M_VER_1(c_rate) \
(IS_RATE_OFDM_HT_API_M_VER_2(c_rate) && (GET_NUM_OF_HT_SS_API_M_VER_1(c_rate) == 3))
#define IS_RATE_OFDM_HT4x4MIMO_API_M_VER_1(c_rate) \
(IS_RATE_OFDM_HT_API_M_VER_2(c_rate) && (GET_NUM_OF_HT_SS_API_M_VER_1(c_rate) == 4))
#define GET_HT_RATE_CODE_API_M_VER_1(c_rate) ((c_rate).rate_n_flags & RATE_MCS_HT_RATE_CODE_MSK)
#define IS_RATE_HT_STBC_SINGLE_SS_API_M_VER_1(c_rate) \
(((c_rate.rate_n_flags) & (RATE_MCS_HT_MSK | RATE_MCS_STBC_MSK)) == \
(RATE_MCS_HT_MSK | RATE_MCS_STBC_MSK))
// rate&flags cleanup, note extended HT-LTF not supported by DSP
#define GET_NUM_OF_HT_EXT_LTF_API_M_VER_1(c_rate) 0
#define GET_NUM_OF_HT_SPACE_TIME_STREAMS_API_M_VER_1(c_rate) \
(GET_NUM_OF_HT_SS_API_M_VER_1(c_rate) + GET_NUM_OF_STBC_SS_API_M_VER_1(c_rate))
// check if supported rate the bad rate conditions are:
// 1. MCS is 32 but FAT is not set
// 2. SGI and GF are set w/o MIMO - removed, as support for GF was removed
// 3. Number of STBC SS is greater than 2
// 4. Number of STBC is 2 and number of SS isn't equals to 2
// 5. Legal MCS
#define IS_BAD_OFDM_HT_RATE_API_M_VER_2(rx_rate) \
((((rx_rate.s.rate) == MCS_DUP_6M) && \
(!((rx_rate.rate_n_flags) & RATE_MCS_FAT_MSK_API_D_VER_1))) || \
(GET_NUM_OF_STBC_SS_API_M_VER_1(rx_rate) > 2) || \
((GET_NUM_OF_STBC_SS_API_M_VER_1(rx_rate) == 2) && \
(!(IS_RATE_OFDM_HT2x2MIMO_API_M_VER_1(rx_rate)))) || \
(IS_RATE_OFDM_HT_API_M_VER_2(rx_rate) && (rx_rate.s.rate > MAX_LEGAL_MCS_API_D_VER_1)))
// removed: GF support:
// ((!(IS_RATE_OFDM_HT_MIMO_API_M_VER_2(rx_rate))) && (((rx_rate.rate_n_flags) & (RATE_MCS_GF_MSK |
// RATE_MCS_SGI_MSK)) == (RATE_MCS_GF_MSK | RATE_MCS_SGI_MSK))) ||
#define IS_BAD_OFDM_HT_RATE_API_M_VER_3(rx_rate) \
((((rx_rate.s.rate) == MCS_DUP_6M) && \
(!((rx_rate.rate_n_flags) & RATE_MCS_FAT_MSK_API_D_VER_2))) || \
(GET_NUM_OF_STBC_SS_API_M_VER_1(rx_rate) > 2) || \
((GET_NUM_OF_STBC_SS_API_M_VER_1(rx_rate) == 2) && \
(!(IS_RATE_OFDM_HT2x2MIMO_API_M_VER_1(rx_rate)))) || \
(IS_RATE_OFDM_HT_API_M_VER_2(rx_rate) && (rx_rate.s.rate > MAX_LEGAL_MCS_API_D_VER_1)))
#define IS_RATE_HT_HIGH_RATE_API_M_VER_1(c_rate) \
(((c_rate.rate_n_flags) & (RATE_MCS_HT_MSK | RATE_MCS_CODE_MSK)) > \
(RATE_MCS_HT_MSK | RATE_MCS_HT_MIMO2_MSK | MCS_24M_MSK))
// 0==>SISO, 1==>MIMO2, 2==>MIMO3, 3==>MIMO4
#define GET_VHT_MIMO_INDX_API_M_VER_1(c_rate) \
SHIFT_AND_MASK(((c_rate).s.rate), RATE_MCS_VHT_MIMO_MSK, RATE_MCS_VHT_MIMO_POS)
// for Single-User number of Spatial-steams in SIG is actual number -1
// for Multi-User number of Spatial-steams in SIG is actual number
#define GET_NUM_OF_VHT_SS_API_M_VER_1(c_rate) (GET_VHT_MIMO_INDX_API_M_VER_1(c_rate) + 1)
#define GET_VHT_RATE_CODE_API_M_VER_1(c_rate) ((c_rate).rate_n_flags & RATE_MCS_VHT_RATE_CODE_MSK)
#define GET_HT_VHT_RATE_CODE_API_M_VER_1(c_rate) \
IS_RATE_OFDM_HT_API_M_VER_2(c_rate) ? GET_HT_RATE_CODE_API_M_VER_1(c_rate) \
: GET_VHT_RATE_CODE_API_M_VER_1(c_rate)
// for VHT (unlike HT) STBC may be turned off/on, thus with STBC on, the number of
// space-time-streams is doubled.
#define IS_VHT_STBC_PRESENT_API_M_VER_1(c_rate) (((c_rate.rate_n_flags) & RATE_MCS_STBC_MSK))
#define GET_NUM_OF_VHT_SPACE_TIME_STREAMS_API_M_VER_1(c_rate) \
(GET_NUM_OF_VHT_SS_API_M_VER_1(c_rate) \
<< (IS_VHT_STBC_PRESENT_API_M_VER_1(c_rate) >> RATE_MCS_STBC_POS))
// get Mimo level for any rate, i.e. note legacy rate is SISO
// vht not supported
#define GET_MIMO_INDEX_API_M_VER_2(c_rate) \
(IS_RATE_OFDM_HT_API_M_VER_2(c_rate) ? GET_HT_MIMO_INDEX_API_M_VER_1(c_rate) : SISO_INDX)
// LDPC rate
#define IS_RATE_OFDM_LDPC_API_M_VER_2(c_rate) ((c_rate).rate_n_flags & RATE_MCS_LDPC_MSK)
// beamformed frame indication
#define GET_BF_INDEX_API_M_VER_1(c_rate) \
(((c_rate.rate_n_flags) & RATE_MCS_BF_MSK) >> RATE_MCS_BF_POS)
// VHT/HE MU
#define IS_RATE_VHT_MU_API_M_VER_1(c_rate) \
(((c_rate.rate_n_flags) & (RATE_MCS_VHT_MSK | RATE_MCS_VHT_HE_TYPE_MSK)) == \
(RATE_MCS_VHT_MSK | (RATE_MCS_VHT_HE_MU << RATE_MCS_VHT_HE_TYPE_POS)))
// *************************************************************************
// * HE definitions (currently w/o version)
// *************************************************************************
// rate is OFDM-HE
#define IS_RATE_OFDM_HE_API_M(c_rate) ((c_rate.rate_n_flags) & RATE_MCS_HE_MSK)
// rate is OFDM VHT/HE
#define IS_RATE_OFDM_VHT_HE_API_M(c_rate) \
(((c_rate).rate_n_flags) & (RATE_MCS_VHT_MSK | RATE_MCS_HE_MSK))
// rate is OFDM HT/VHT/HE
#define IS_RATE_OFDM_HT_VHT_HE_API_M(c_rate) \
((c_rate) & (RATE_MCS_HT_MSK | RATE_MCS_VHT_MSK | RATE_MCS_HE_MSK))
// rate is OFDM HE and STBC (note should check no DCM, as STBC & DCM mark special GI/HE-LTF)
// basically don't support this combo for now.
#define IS_RATE_OFDM_HE_STBC_API_M(c_rate) \
((((c_rate.rate_n_flags) & (RATE_MCS_STBC_MSK | RATE_MCS_HE_MSK | RATE_MCS_HE_DCM_MSK))) == \
(RATE_MCS_STBC_MSK | RATE_MCS_HE_MSK))
// number of space time streams
#define GET_NUM_OF_HE_SPACE_TIME_STREAMS_API_M(c_rate) \
((c_rate.rate_n_flags) & (RATE_MCS_STBC_MSK | RATE_MCS_VHT_MIMO_MSK)) ? 2 : 1
// rate is OFDM-HE w/ DCM (dual carrier mode)
#define IS_RATE_OFDM_HE_DCM_API_M(c_rate) (c_rate.rate_n_flags & RATE_MCS_HE_DCM_MSK)
#define GET_OFDM_HE_DCM_API_M(c_rate) \
SHIFT_AND_MASK(c_rate.rate_n_flags, RATE_MCS_HE_DCM_MSK, RATE_MCS_HE_DCM_POS)
// rate is OFDM-HE ext-range using 106-tones (i.e. same as RU 8MHz 102 data-tones)
#define IS_RATE_OFDM_HE_ER_106_API_M(c_rate) (c_rate.rate_n_flags & RATE_MCS_HE_ER_106_MSK)
#define GET_OFDM_HE_ER_106_API_M(c_rate) \
SHIFT_AND_MASK(c_rate.rate_n_flags, RATE_MCS_HE_ER_106_MSK, RATE_MCS_HE_ER_106_POS)
// get OFDM-HE HE-LTF size / GI size
#define GET_OFDM_HE_GI_LTF_INDX_API_M(c_rate) \
SHIFT_AND_MASK(c_rate.rate_n_flags, RATE_MCS_HE_GI_LTF_MSK, RATE_MCS_HE_GI_LTF_POS)
// get OFDM-HE type: SU, extended-range, MU, TRIG
#define GET_OFDM_VHT_HE_TYPE_API_M(c_rate) \
SHIFT_AND_MASK(c_rate.rate_n_flags, RATE_MCS_VHT_HE_TYPE_MSK, RATE_MCS_VHT_HE_TYPE_POS)
// check if OFDM-VHT/HE single-user
#define IS_RATE_OFDM_VHT_HE_SU_API_M(c_rate) \
(GET_OFDM_VHT_HE_TYPE_API_M(c_rate) == RATE_MCS_VHT_HE_SU)
// check if OFDM-HE single-user extended range
#define IS_RATE_OFDM_HE_EXT_RANGE_API_M(c_rate) \
(GET_OFDM_VHT_HE_TYPE_API_M(c_rate) == RATE_MCS_HE_EXT_RANGE)
// check if OFDM-HE trigger frame based
#define IS_RATE_OFDM_HE_TRIG_BASE_API_M(c_rate) \
(GET_OFDM_VHT_HE_TYPE_API_M(c_rate) == RATE_MCS_HE_TRIG_BASE)
// check if rate is VHT/HE multi-user
#define IS_RATE_OFDM_VHT_HE_MU_API_M(c_rate) \
(GET_OFDM_VHT_HE_TYPE_API_M(c_rate) == RATE_MCS_VHT_HE_MU)
// get the MCS index for HT/VHT/HE
#define GET_HT_VHT_HE_RATE_CODE_API_M(c_rate) GET_HT_VHT_RATE_CODE_API_M_VER_1(c_rate)
// vht supported
#define GET_MIMO_INDEX_API_M_VER_3(c_rate) \
(IS_RATE_OFDM_HT_API_M_VER_2(c_rate) ? GET_HT_MIMO_INDEX_API_M_VER_1(c_rate) \
: IS_RATE_OFDM_VHT_HE_API_M(c_rate) ? GET_VHT_MIMO_INDX_API_M_VER_1(c_rate) \
: SISO_INDX)
/**@} GroupRates */
#endif // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_MVM_API_RATES_H_