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