1 /* 2 * Copyright (c) 2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #ifndef __WMA_EHT_H 19 #define __WMA_EHT_H 20 21 #include "wma.h" 22 23 enum EHT_TXRX_MCS_NSS_IDX { 24 EHTCAP_TXRX_MCS_NSS_IDX0, 25 EHTCAP_TXRX_MCS_NSS_IDX1, 26 EHTCAP_TXRX_MCS_NSS_IDX2, 27 EHTCAP_TXRX_MCS_NSS_IDXMAX, 28 }; 29 30 #if defined(WLAN_FEATURE_11BE) 31 #define MAX_EHT_DCM_INDEX 2 32 /* valid only for mcs-15 */ 33 #define IS_EHT_ MCS_HAS_DCM_RATE(val) ((val) == 15) 34 /** 35 * struct index_eht_data_rate_type - eht data rate type 36 * @beacon_rate_index: Beacon rate index 37 * @supported_eht20_rate: eht20 rate 38 * @supported_eht40_rate: eht40 rate 39 * @supported_eht80_rate: eht80 rate 40 * @supported_eht160_rate: eht160 rate 41 */ 42 struct index_eht_data_rate_type { 43 uint8_t beacon_rate_index; 44 uint16_t supported_eht20_rate[MAX_EHT_DCM_INDEX][3]; 45 uint16_t supported_eht40_rate[MAX_EHT_DCM_INDEX][3]; 46 uint16_t supported_eht80_rate[MAX_EHT_DCM_INDEX][3]; 47 uint16_t supported_eht160_rate[MAX_EHT_DCM_INDEX][3]; 48 uint16_t supported_eht320_rate[MAX_EHT_DCM_INDEX][3]; 49 }; 50 51 /* 52 * wma_eht_update_tgt_services() - update tgt cfg to indicate 11be support 53 * @wmi_handle: pointer to WMI handle 54 * @cfg: pointer to WMA target services 55 * 56 * Based on WMI SERVICES information, enable 11be support and set DOT11BE 57 * bit in feature caps bitmap. 58 * 59 * Return: None 60 */ 61 void wma_eht_update_tgt_services(struct wmi_unified *wmi_handle, 62 struct wma_tgt_services *cfg); 63 /** 64 * wma_update_target_ext_eht_cap() - Update EHT caps with given extended cap 65 * @tgt_hdl: target psoc information 66 * @tgt_cfg: Target config 67 * 68 * This function loop through each hardware mode and for each hardware mode 69 * again it loop through each MAC/PHY and pull the caps 2G and 5G specific 70 * EHT caps and derives the final cap. 71 * 72 * Return: None 73 */ 74 void wma_update_target_ext_eht_cap(struct target_psoc_info *tgt_hdl, 75 struct wma_tgt_cfg *tgt_cfg); 76 77 void wma_update_vdev_eht_ops(uint32_t *eht_ops, tDot11fIEeht_op *eht_op); 78 79 /** 80 * wma_print_eht_cap() - Print EHT capabilities 81 * @eht_cap: pointer to EHT Capability 82 * 83 * Received EHT capabilities are converted into dot11f structure. 84 * This function will print all the EHT capabilities as stored 85 * in the dot11f structure. 86 * 87 * Return: None 88 */ 89 void wma_print_eht_cap(tDot11fIEeht_cap *eht_cap); 90 91 /** 92 * wma_print_eht_phy_cap() - Print EHT PHY Capability 93 * @phy_cap: pointer to PHY Capability 94 * 95 * This function prints EHT PHY Capability received from FW. 96 * 97 * Return: none 98 */ 99 void wma_print_eht_phy_cap(uint32_t *phy_cap); 100 101 /** 102 * wma_print_eht_mac_cap() - Print EHT MAC Capability 103 * @mac_cap: pointer to MAC Capability 104 * 105 * This function prints EHT MAC Capability received from FW. 106 * 107 * Return: none 108 */ 109 void wma_print_eht_mac_cap(uint32_t *mac_cap); 110 111 /** 112 * wma_print_eht_op() - Print EHT Operation 113 * @eht_cap: pointer to EHT Operation 114 * 115 * Print EHT operation stored as dot11f structure 116 * 117 * Return: None 118 */ 119 void wma_print_eht_op(tDot11fIEeht_op *eht_ops); 120 121 /** 122 * wma_populate_peer_eht_cap() - populate peer EHT capabilities in 123 * peer assoc cmd 124 * @peer: pointer to peer assoc params 125 * @params: pointer to ADD STA params 126 * 127 * Return: None 128 */ 129 void wma_populate_peer_eht_cap(struct peer_assoc_params *peer, 130 tpAddStaParams params); 131 132 /** 133 * wma_vdev_set_eht_bss_params() - set EHT OPs in vdev start 134 * @wma: pointer to wma handle 135 * @vdev_id: VDEV id 136 * @eht_info: pointer to eht info 137 * 138 * Return: None 139 */ 140 void wma_vdev_set_eht_bss_params(tp_wma_handle wma, uint8_t vdev_id, 141 struct vdev_mlme_eht_ops_info *eht_info); 142 143 /** 144 * wma_is_peer_eht_capable() - whether peer is eht capable or not 145 * @params: add sta params 146 * 147 * Return: true if eht capable is present 148 */ 149 static inline bool wma_is_peer_eht_capable(tpAddStaParams params) 150 { 151 return params->eht_capable; 152 } 153 154 /** 155 * wma_get_eht_capabilities() - Get EHT capabilities from WMA 156 * @eht_cap: Pointer to EHT capabilities 157 * 158 * Currently EHT capabilities are not updated in wma_handle. This 159 * is an interface for upper layer to query capabilities from WMA. 160 * When the real use case arise, update wma_handle with EHT capabilities 161 * as required. 162 * 163 * Return: QDF_STATUS 164 */ 165 QDF_STATUS wma_get_eht_capabilities(struct eht_capability *eht_cap); 166 167 /** 168 * wma_set_peer_assoc_params_bw_320() - Set bw_320 based on ch_width 169 * @params: pointer to peer assoc params 170 * @ch_width: enum phy_ch_width 171 * 172 * If ch_width is CH_WIDTH_320MHZ, set params->bw_320 to 1 173 * 174 * Return: None 175 */ 176 void wma_set_peer_assoc_params_bw_320(struct peer_assoc_params *params, 177 enum phy_ch_width ch_width); 178 179 /** 180 * wma_set_eht_txbf_cfg() - set EHT Tx beamforming mlme cfg to FW 181 * @mac: Global MAC context 182 * @vdev_id: VDEV id 183 * 184 * Return: None 185 */ 186 void wma_set_eht_txbf_cfg(struct mac_context *mac, uint8_t vdev_id); 187 188 /** 189 * wma_set_eht_txbf_params() - set EHT Tx beamforming params to FW 190 * @vdev_id: VDEV id 191 * @su bfer: SU beamformer capability 192 * @su bfee: SU beamformee capability 193 * @mu bfer: MU beamformer capability 194 * 195 * Return: None 196 */ 197 void wma_set_eht_txbf_params(uint8_t vdev_id, bool su_bfer, 198 bool su_bfee, bool mu_bfer); 199 200 /** 201 * wma_get_eht_rate_flags() - Return the EHT rate flags corresponding to the BW 202 * @ch_width: BW for which rate flags is required 203 * 204 * Return: Rate flags corresponding to ch_width 205 */ 206 enum tx_rate_info wma_get_eht_rate_flags(enum phy_ch_width ch_width); 207 208 /** 209 * wma_match_eht_rate() - get eht rate matching with nss 210 * @raw_rate: raw rate from fw 211 * @rate_flags: rate flags 212 * @nss: nss 213 * @dcm: dcm 214 * @guard_interval: guard interval 215 * @mcs_rate_flag: mcs rate flags 216 * @p_index: index for matched rate 217 * 218 * Return: return match rate if found, else 0 219 */ 220 uint16_t wma_match_eht_rate(uint16_t raw_rate, 221 enum tx_rate_info rate_flags, 222 uint8_t *nss, uint8_t *dcm, 223 enum txrate_gi *guard_interval, 224 enum tx_rate_info *mcs_rate_flag, 225 uint8_t *p_index); 226 227 /** 228 * wma_set_bss_rate_flags_eht() - set rate flags based on BSS capability 229 * @rate_flags: rate_flags pointer 230 * @add_bss: add_bss params 231 * 232 * Return: QDF_STATUS 233 */ 234 QDF_STATUS wma_set_bss_rate_flags_eht(enum tx_rate_info *rate_flags, 235 struct bss_params *add_bss); 236 237 /** 238 * wma_get_bss_eht_capable() - whether bss is eht capable or not 239 * @add_bss: add_bss params 240 * 241 * Return: true if eht capable is present 242 */ 243 bool wma_get_bss_eht_capable(struct bss_params *add_bss); 244 245 static 246 inline bool wma_is_eht_phymode_supported(enum wlan_phymode bss_phymode) 247 { 248 return IS_WLAN_PHYMODE_EHT(bss_phymode); 249 } 250 251 /** 252 * wma_set_eht_txbf_vdev_params() - set EHT Tx beamforming params to FW 253 * @mac: mac context 254 * @mode: mode address to access mode value 255 * 256 * Return: success 257 */ 258 QDF_STATUS 259 wma_set_eht_txbf_vdev_params(struct mac_context *mac, uint32_t *mode); 260 261 #else 262 static inline void wma_eht_update_tgt_services(struct wmi_unified *wmi_handle, 263 struct wma_tgt_services *cfg) 264 { 265 cfg->en_11be = false; 266 return; 267 } 268 269 static inline 270 void wma_update_target_ext_eht_cap(struct target_psoc_info *tgt_hdl, 271 struct wma_tgt_cfg *tgt_cfg) 272 { 273 } 274 275 static inline 276 void wma_update_vdev_eht_ops(uint32_t *eht_ops, tDot11fIEeht_op *eht_op) 277 { 278 } 279 280 static inline 281 void wma_print_eht_cap(tDot11fIEeht_cap *eht_cap) 282 { 283 } 284 285 static inline 286 void wma_print_eht_phy_cap(uint32_t *phy_cap) 287 { 288 } 289 290 static inline 291 void wma_print_eht_mac_cap(uint32_t *mac_cap) 292 { 293 } 294 295 static inline 296 void wma_print_eht_op(tDot11fIEeht_op *eht_ops) 297 { 298 } 299 300 static inline 301 void wma_populate_peer_eht_cap(struct peer_assoc_params *peer, 302 tpAddStaParams params) 303 { 304 } 305 306 static inline bool wma_is_peer_eht_capable(tpAddStaParams params) 307 { 308 return false; 309 } 310 311 static inline 312 void wma_set_peer_assoc_params_bw_320(struct peer_assoc_params *params, 313 enum phy_ch_width ch_width) 314 { 315 } 316 317 static inline 318 void wma_set_eht_txbf_cfg(struct mac_context *mac, uint8_t vdev_id) 319 { 320 } 321 322 static inline 323 void wma_set_eht_txbf_params(uint8_t vdev_id, bool su_bfer, 324 bool su_bfee, bool mu_bfer) 325 { 326 } 327 328 static inline 329 QDF_STATUS wma_set_bss_rate_flags_eht(enum tx_rate_info *rate_flags, 330 struct bss_params *add_bss) 331 { 332 return QDF_STATUS_E_INVAL; 333 } 334 335 static inline 336 enum tx_rate_info wma_get_eht_rate_flags(enum phy_ch_width ch_width) 337 { 338 return TX_RATE_EHT20; 339 } 340 341 static inline 342 uint16_t wma_match_eht_rate(uint16_t raw_rate, 343 enum tx_rate_info rate_flags, 344 uint8_t *nss, uint8_t *dcm, 345 enum txrate_gi *guard_interval, 346 enum tx_rate_info *mcs_rate_flag, 347 uint8_t *p_index) 348 { 349 return 0; 350 } 351 352 static inline 353 bool wma_get_bss_eht_capable(struct bss_params *add_bss) 354 { 355 return false; 356 } 357 358 static inline bool wma_is_eht_phymode_supported(enum wlan_phymode bss_phymode) 359 { 360 return false; 361 } 362 363 static inline 364 QDF_STATUS wma_set_eht_txbf_vdev_params(struct mac_context *mac, uint32_t *mode) 365 { 366 return QDF_STATUS_E_NOSUPPORT; 367 } 368 #endif 369 370 #ifdef WLAN_FEATURE_11BE_MLO 371 void wma_vdev_set_listen_interval(uint8_t vdev_id, uint8_t val); 372 #else 373 static inline 374 void wma_vdev_set_listen_interval(uint8_t vdev_id, uint8_t val) 375 {} 376 #endif 377 #endif 378