| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| /* | |
| * IEEE 802.11 VHT definitions | |
| * | |
| * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen | |
| * <jkmaline@cc.hut.fi> | |
| * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> | |
| * Copyright (c) 2005, Devicescape Software, Inc. | |
| * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> | |
| * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH | |
| * Copyright (c) 2016 - 2017 Intel Deutschland GmbH | |
| * Copyright (c) 2018 - 2025 Intel Corporation | |
| */ | |
| #ifndef LINUX_IEEE80211_VHT_H | |
| #define LINUX_IEEE80211_VHT_H | |
| #include <linux/types.h> | |
| #include <linux/if_ether.h> | |
| #define IEEE80211_MAX_MPDU_LEN_VHT_3895 3895 | |
| #define IEEE80211_MAX_MPDU_LEN_VHT_7991 7991 | |
| #define IEEE80211_MAX_MPDU_LEN_VHT_11454 11454 | |
| /** | |
| * enum ieee80211_vht_opmode_bits - VHT operating mode field bits | |
| * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask | |
| * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width | |
| * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width | |
| * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ: 80 MHz channel width | |
| * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ: 160 MHz or 80+80 MHz channel width | |
| * @IEEE80211_OPMODE_NOTIF_BW_160_80P80: 160 / 80+80 MHz indicator flag | |
| * @IEEE80211_OPMODE_NOTIF_RX_NSS_MASK: number of spatial streams mask | |
| * (the NSS value is the value of this field + 1) | |
| * @IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT: number of spatial streams shift | |
| * @IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF: indicates streams in SU-MIMO PPDU | |
| * using a beamforming steering matrix | |
| */ | |
| enum ieee80211_vht_opmode_bits { | |
| IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK = 0x03, | |
| IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ = 0, | |
| IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ = 1, | |
| IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ = 2, | |
| IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ = 3, | |
| IEEE80211_OPMODE_NOTIF_BW_160_80P80 = 0x04, | |
| IEEE80211_OPMODE_NOTIF_RX_NSS_MASK = 0x70, | |
| IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT = 4, | |
| IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF = 0x80, | |
| }; | |
| /* | |
| * Maximum length of AMPDU that the STA can receive in VHT. | |
| * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) | |
| */ | |
| enum ieee80211_vht_max_ampdu_length_exp { | |
| IEEE80211_VHT_MAX_AMPDU_8K = 0, | |
| IEEE80211_VHT_MAX_AMPDU_16K = 1, | |
| IEEE80211_VHT_MAX_AMPDU_32K = 2, | |
| IEEE80211_VHT_MAX_AMPDU_64K = 3, | |
| IEEE80211_VHT_MAX_AMPDU_128K = 4, | |
| IEEE80211_VHT_MAX_AMPDU_256K = 5, | |
| IEEE80211_VHT_MAX_AMPDU_512K = 6, | |
| IEEE80211_VHT_MAX_AMPDU_1024K = 7 | |
| }; | |
| /** | |
| * struct ieee80211_vht_mcs_info - VHT MCS information | |
| * @rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams | |
| * @rx_highest: Indicates highest long GI VHT PPDU data rate | |
| * STA can receive. Rate expressed in units of 1 Mbps. | |
| * If this field is 0 this value should not be used to | |
| * consider the highest RX data rate supported. | |
| * The top 3 bits of this field indicate the Maximum NSTS,total | |
| * (a beamformee capability.) | |
| * @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams | |
| * @tx_highest: Indicates highest long GI VHT PPDU data rate | |
| * STA can transmit. Rate expressed in units of 1 Mbps. | |
| * If this field is 0 this value should not be used to | |
| * consider the highest TX data rate supported. | |
| * The top 2 bits of this field are reserved, the | |
| * 3rd bit from the top indiciates VHT Extended NSS BW | |
| * Capability. | |
| */ | |
| struct ieee80211_vht_mcs_info { | |
| __le16 rx_mcs_map; | |
| __le16 rx_highest; | |
| __le16 tx_mcs_map; | |
| __le16 tx_highest; | |
| } __packed; | |
| /* for rx_highest */ | |
| #define IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT 13 | |
| #define IEEE80211_VHT_MAX_NSTS_TOTAL_MASK (7 << IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT) | |
| /* for tx_highest */ | |
| #define IEEE80211_VHT_EXT_NSS_BW_CAPABLE (1 << 13) | |
| /** | |
| * enum ieee80211_vht_mcs_support - VHT MCS support definitions | |
| * @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the | |
| * number of streams | |
| * @IEEE80211_VHT_MCS_SUPPORT_0_8: MCSes 0-8 are supported | |
| * @IEEE80211_VHT_MCS_SUPPORT_0_9: MCSes 0-9 are supported | |
| * @IEEE80211_VHT_MCS_NOT_SUPPORTED: This number of streams isn't supported | |
| * | |
| * These definitions are used in each 2-bit subfield of the @rx_mcs_map | |
| * and @tx_mcs_map fields of &struct ieee80211_vht_mcs_info, which are | |
| * both split into 8 subfields by number of streams. These values indicate | |
| * which MCSes are supported for the number of streams the value appears | |
| * for. | |
| */ | |
| enum ieee80211_vht_mcs_support { | |
| IEEE80211_VHT_MCS_SUPPORT_0_7 = 0, | |
| IEEE80211_VHT_MCS_SUPPORT_0_8 = 1, | |
| IEEE80211_VHT_MCS_SUPPORT_0_9 = 2, | |
| IEEE80211_VHT_MCS_NOT_SUPPORTED = 3, | |
| }; | |
| /** | |
| * struct ieee80211_vht_cap - VHT capabilities | |
| * | |
| * This structure is the "VHT capabilities element" as | |
| * described in 802.11ac D3.0 8.4.2.160 | |
| * @vht_cap_info: VHT capability info | |
| * @supp_mcs: VHT MCS supported rates | |
| */ | |
| struct ieee80211_vht_cap { | |
| __le32 vht_cap_info; | |
| struct ieee80211_vht_mcs_info supp_mcs; | |
| } __packed; | |
| /** | |
| * enum ieee80211_vht_chanwidth - VHT channel width | |
| * @IEEE80211_VHT_CHANWIDTH_USE_HT: use the HT operation IE to | |
| * determine the channel width (20 or 40 MHz) | |
| * @IEEE80211_VHT_CHANWIDTH_80MHZ: 80 MHz bandwidth | |
| * @IEEE80211_VHT_CHANWIDTH_160MHZ: 160 MHz bandwidth | |
| * @IEEE80211_VHT_CHANWIDTH_80P80MHZ: 80+80 MHz bandwidth | |
| */ | |
| enum ieee80211_vht_chanwidth { | |
| IEEE80211_VHT_CHANWIDTH_USE_HT = 0, | |
| IEEE80211_VHT_CHANWIDTH_80MHZ = 1, | |
| IEEE80211_VHT_CHANWIDTH_160MHZ = 2, | |
| IEEE80211_VHT_CHANWIDTH_80P80MHZ = 3, | |
| }; | |
| /** | |
| * struct ieee80211_vht_operation - VHT operation IE | |
| * | |
| * This structure is the "VHT operation element" as | |
| * described in 802.11ac D3.0 8.4.2.161 | |
| * @chan_width: Operating channel width | |
| * @center_freq_seg0_idx: center freq segment 0 index | |
| * @center_freq_seg1_idx: center freq segment 1 index | |
| * @basic_mcs_set: VHT Basic MCS rate set | |
| */ | |
| struct ieee80211_vht_operation { | |
| u8 chan_width; | |
| u8 center_freq_seg0_idx; | |
| u8 center_freq_seg1_idx; | |
| __le16 basic_mcs_set; | |
| } __packed; | |
| /* 802.11ac VHT Capabilities */ | |
| #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 0x00000000 | |
| #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 0x00000001 | |
| #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 0x00000002 | |
| #define IEEE80211_VHT_CAP_MAX_MPDU_MASK 0x00000003 | |
| #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004 | |
| #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008 | |
| #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C | |
| #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT 2 | |
| #define IEEE80211_VHT_CAP_RXLDPC 0x00000010 | |
| #define IEEE80211_VHT_CAP_SHORT_GI_80 0x00000020 | |
| #define IEEE80211_VHT_CAP_SHORT_GI_160 0x00000040 | |
| #define IEEE80211_VHT_CAP_TXSTBC 0x00000080 | |
| #define IEEE80211_VHT_CAP_RXSTBC_1 0x00000100 | |
| #define IEEE80211_VHT_CAP_RXSTBC_2 0x00000200 | |
| #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300 | |
| #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400 | |
| #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 | |
| #define IEEE80211_VHT_CAP_RXSTBC_SHIFT 8 | |
| #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800 | |
| #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000 | |
| #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13 | |
| #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK \ | |
| (7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT) | |
| #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT 16 | |
| #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK \ | |
| (7 << IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT) | |
| #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE 0x00080000 | |
| #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000 | |
| #define IEEE80211_VHT_CAP_VHT_TXOP_PS 0x00200000 | |
| #define IEEE80211_VHT_CAP_HTC_VHT 0x00400000 | |
| #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT 23 | |
| #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \ | |
| (7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT) | |
| #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB 0x08000000 | |
| #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB 0x0c000000 | |
| #define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN 0x10000000 | |
| #define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN 0x20000000 | |
| #define IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT 30 | |
| #define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK 0xc0000000 | |
| /** | |
| * ieee80211_get_vht_max_nss - return max NSS for a given bandwidth/MCS | |
| * @cap: VHT capabilities of the peer | |
| * @bw: bandwidth to use | |
| * @mcs: MCS index to use | |
| * @ext_nss_bw_capable: indicates whether or not the local transmitter | |
| * (rate scaling algorithm) can deal with the new logic | |
| * (dot11VHTExtendedNSSBWCapable) | |
| * @max_vht_nss: current maximum NSS as advertised by the STA in | |
| * operating mode notification, can be 0 in which case the | |
| * capability data will be used to derive this (from MCS support) | |
| * Return: The maximum NSS that can be used for the given bandwidth/MCS | |
| * combination | |
| * | |
| * Due to the VHT Extended NSS Bandwidth Support, the maximum NSS can | |
| * vary for a given BW/MCS. This function parses the data. | |
| * | |
| * Note: This function is exported by cfg80211. | |
| */ | |
| int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap, | |
| enum ieee80211_vht_chanwidth bw, | |
| int mcs, bool ext_nss_bw_capable, | |
| unsigned int max_vht_nss); | |
| /* VHT action codes */ | |
| enum ieee80211_vht_actioncode { | |
| WLAN_VHT_ACTION_COMPRESSED_BF = 0, | |
| WLAN_VHT_ACTION_GROUPID_MGMT = 1, | |
| WLAN_VHT_ACTION_OPMODE_NOTIF = 2, | |
| }; | |
| #endif /* LINUX_IEEE80211_VHT_H */ |