1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * IEEE 802.11 VHT definitions 4 * 5 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen 6 * <jkmaline@cc.hut.fi> 7 * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> 8 * Copyright (c) 2005, Devicescape Software, Inc. 9 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> 10 * Copyright (c) 2013 - 2014 Intel Mobile Communications GmbH 11 * Copyright (c) 2016 - 2017 Intel Deutschland GmbH 12 * Copyright (c) 2018 - 2025 Intel Corporation 13 */ 14 15 #ifndef LINUX_IEEE80211_VHT_H 16 #define LINUX_IEEE80211_VHT_H 17 18 #include <linux/types.h> 19 #include <linux/if_ether.h> 20 21 #define IEEE80211_MAX_MPDU_LEN_VHT_3895 3895 22 #define IEEE80211_MAX_MPDU_LEN_VHT_7991 7991 23 #define IEEE80211_MAX_MPDU_LEN_VHT_11454 11454 24 25 /** 26 * enum ieee80211_vht_opmode_bits - VHT operating mode field bits 27 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK: channel width mask 28 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: 20 MHz channel width 29 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ: 40 MHz channel width 30 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ: 80 MHz channel width 31 * @IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ: 160 MHz or 80+80 MHz channel width 32 * @IEEE80211_OPMODE_NOTIF_BW_160_80P80: 160 / 80+80 MHz indicator flag 33 * @IEEE80211_OPMODE_NOTIF_RX_NSS_MASK: number of spatial streams mask 34 * (the NSS value is the value of this field + 1) 35 * @IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT: number of spatial streams shift 36 * @IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF: indicates streams in SU-MIMO PPDU 37 * using a beamforming steering matrix 38 */ 39 enum ieee80211_vht_opmode_bits { 40 IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK = 0x03, 41 IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ = 0, 42 IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ = 1, 43 IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ = 2, 44 IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ = 3, 45 IEEE80211_OPMODE_NOTIF_BW_160_80P80 = 0x04, 46 IEEE80211_OPMODE_NOTIF_RX_NSS_MASK = 0x70, 47 IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT = 4, 48 IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF = 0x80, 49 }; 50 51 /* 52 * Maximum length of AMPDU that the STA can receive in VHT. 53 * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) 54 */ 55 enum ieee80211_vht_max_ampdu_length_exp { 56 IEEE80211_VHT_MAX_AMPDU_8K = 0, 57 IEEE80211_VHT_MAX_AMPDU_16K = 1, 58 IEEE80211_VHT_MAX_AMPDU_32K = 2, 59 IEEE80211_VHT_MAX_AMPDU_64K = 3, 60 IEEE80211_VHT_MAX_AMPDU_128K = 4, 61 IEEE80211_VHT_MAX_AMPDU_256K = 5, 62 IEEE80211_VHT_MAX_AMPDU_512K = 6, 63 IEEE80211_VHT_MAX_AMPDU_1024K = 7 64 }; 65 66 /** 67 * struct ieee80211_vht_mcs_info - VHT MCS information 68 * @rx_mcs_map: RX MCS map 2 bits for each stream, total 8 streams 69 * @rx_highest: Indicates highest long GI VHT PPDU data rate 70 * STA can receive. Rate expressed in units of 1 Mbps. 71 * If this field is 0 this value should not be used to 72 * consider the highest RX data rate supported. 73 * The top 3 bits of this field indicate the Maximum NSTS,total 74 * (a beamformee capability.) 75 * @tx_mcs_map: TX MCS map 2 bits for each stream, total 8 streams 76 * @tx_highest: Indicates highest long GI VHT PPDU data rate 77 * STA can transmit. Rate expressed in units of 1 Mbps. 78 * If this field is 0 this value should not be used to 79 * consider the highest TX data rate supported. 80 * The top 2 bits of this field are reserved, the 81 * 3rd bit from the top indiciates VHT Extended NSS BW 82 * Capability. 83 */ 84 struct ieee80211_vht_mcs_info { 85 __le16 rx_mcs_map; 86 __le16 rx_highest; 87 __le16 tx_mcs_map; 88 __le16 tx_highest; 89 } __packed; 90 91 /* for rx_highest */ 92 #define IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT 13 93 #define IEEE80211_VHT_MAX_NSTS_TOTAL_MASK (7 << IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT) 94 95 /* for tx_highest */ 96 #define IEEE80211_VHT_EXT_NSS_BW_CAPABLE (1 << 13) 97 98 /** 99 * enum ieee80211_vht_mcs_support - VHT MCS support definitions 100 * @IEEE80211_VHT_MCS_SUPPORT_0_7: MCSes 0-7 are supported for the 101 * number of streams 102 * @IEEE80211_VHT_MCS_SUPPORT_0_8: MCSes 0-8 are supported 103 * @IEEE80211_VHT_MCS_SUPPORT_0_9: MCSes 0-9 are supported 104 * @IEEE80211_VHT_MCS_NOT_SUPPORTED: This number of streams isn't supported 105 * 106 * These definitions are used in each 2-bit subfield of the @rx_mcs_map 107 * and @tx_mcs_map fields of &struct ieee80211_vht_mcs_info, which are 108 * both split into 8 subfields by number of streams. These values indicate 109 * which MCSes are supported for the number of streams the value appears 110 * for. 111 */ 112 enum ieee80211_vht_mcs_support { 113 IEEE80211_VHT_MCS_SUPPORT_0_7 = 0, 114 IEEE80211_VHT_MCS_SUPPORT_0_8 = 1, 115 IEEE80211_VHT_MCS_SUPPORT_0_9 = 2, 116 IEEE80211_VHT_MCS_NOT_SUPPORTED = 3, 117 }; 118 119 /** 120 * struct ieee80211_vht_cap - VHT capabilities 121 * 122 * This structure is the "VHT capabilities element" as 123 * described in 802.11ac D3.0 8.4.2.160 124 * @vht_cap_info: VHT capability info 125 * @supp_mcs: VHT MCS supported rates 126 */ 127 struct ieee80211_vht_cap { 128 __le32 vht_cap_info; 129 struct ieee80211_vht_mcs_info supp_mcs; 130 } __packed; 131 132 /** 133 * enum ieee80211_vht_chanwidth - VHT channel width 134 * @IEEE80211_VHT_CHANWIDTH_USE_HT: use the HT operation IE to 135 * determine the channel width (20 or 40 MHz) 136 * @IEEE80211_VHT_CHANWIDTH_80MHZ: 80 MHz bandwidth 137 * @IEEE80211_VHT_CHANWIDTH_160MHZ: 160 MHz bandwidth 138 * @IEEE80211_VHT_CHANWIDTH_80P80MHZ: 80+80 MHz bandwidth 139 */ 140 enum ieee80211_vht_chanwidth { 141 IEEE80211_VHT_CHANWIDTH_USE_HT = 0, 142 IEEE80211_VHT_CHANWIDTH_80MHZ = 1, 143 IEEE80211_VHT_CHANWIDTH_160MHZ = 2, 144 IEEE80211_VHT_CHANWIDTH_80P80MHZ = 3, 145 }; 146 147 /** 148 * struct ieee80211_vht_operation - VHT operation IE 149 * 150 * This structure is the "VHT operation element" as 151 * described in 802.11ac D3.0 8.4.2.161 152 * @chan_width: Operating channel width 153 * @center_freq_seg0_idx: center freq segment 0 index 154 * @center_freq_seg1_idx: center freq segment 1 index 155 * @basic_mcs_set: VHT Basic MCS rate set 156 */ 157 struct ieee80211_vht_operation { 158 u8 chan_width; 159 u8 center_freq_seg0_idx; 160 u8 center_freq_seg1_idx; 161 __le16 basic_mcs_set; 162 } __packed; 163 164 /* 802.11ac VHT Capabilities */ 165 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 0x00000000 166 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 0x00000001 167 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 0x00000002 168 #define IEEE80211_VHT_CAP_MAX_MPDU_MASK 0x00000003 169 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004 170 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008 171 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C 172 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT 2 173 #define IEEE80211_VHT_CAP_RXLDPC 0x00000010 174 #define IEEE80211_VHT_CAP_SHORT_GI_80 0x00000020 175 #define IEEE80211_VHT_CAP_SHORT_GI_160 0x00000040 176 #define IEEE80211_VHT_CAP_TXSTBC 0x00000080 177 #define IEEE80211_VHT_CAP_RXSTBC_1 0x00000100 178 #define IEEE80211_VHT_CAP_RXSTBC_2 0x00000200 179 #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300 180 #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400 181 #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 182 #define IEEE80211_VHT_CAP_RXSTBC_SHIFT 8 183 #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800 184 #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000 185 #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13 186 #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK \ 187 (7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT) 188 #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT 16 189 #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK \ 190 (7 << IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT) 191 #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE 0x00080000 192 #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000 193 #define IEEE80211_VHT_CAP_VHT_TXOP_PS 0x00200000 194 #define IEEE80211_VHT_CAP_HTC_VHT 0x00400000 195 #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT 23 196 #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \ 197 (7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT) 198 #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB 0x08000000 199 #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB 0x0c000000 200 #define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN 0x10000000 201 #define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN 0x20000000 202 #define IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT 30 203 #define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK 0xc0000000 204 205 /** 206 * ieee80211_get_vht_max_nss - return max NSS for a given bandwidth/MCS 207 * @cap: VHT capabilities of the peer 208 * @bw: bandwidth to use 209 * @mcs: MCS index to use 210 * @ext_nss_bw_capable: indicates whether or not the local transmitter 211 * (rate scaling algorithm) can deal with the new logic 212 * (dot11VHTExtendedNSSBWCapable) 213 * @max_vht_nss: current maximum NSS as advertised by the STA in 214 * operating mode notification, can be 0 in which case the 215 * capability data will be used to derive this (from MCS support) 216 * Return: The maximum NSS that can be used for the given bandwidth/MCS 217 * combination 218 * 219 * Due to the VHT Extended NSS Bandwidth Support, the maximum NSS can 220 * vary for a given BW/MCS. This function parses the data. 221 * 222 * Note: This function is exported by cfg80211. 223 */ 224 int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap, 225 enum ieee80211_vht_chanwidth bw, 226 int mcs, bool ext_nss_bw_capable, 227 unsigned int max_vht_nss); 228 229 /* VHT action codes */ 230 enum ieee80211_vht_actioncode { 231 WLAN_VHT_ACTION_COMPRESSED_BF = 0, 232 WLAN_VHT_ACTION_GROUPID_MGMT = 1, 233 WLAN_VHT_ACTION_OPMODE_NOTIF = 2, 234 }; 235 236 #endif /* LINUX_IEEE80211_VHT_H */ 237