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  */
wma_is_peer_eht_capable(tpAddStaParams params)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
wma_is_eht_phymode_supported(enum wlan_phymode bss_phymode)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
wma_eht_update_tgt_services(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)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
wma_update_target_ext_eht_cap(struct target_psoc_info * tgt_hdl,struct wma_tgt_cfg * tgt_cfg)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
wma_update_vdev_eht_ops(uint32_t * eht_ops,tDot11fIEeht_op * eht_op)276 void wma_update_vdev_eht_ops(uint32_t *eht_ops, tDot11fIEeht_op *eht_op)
277 {
278 }
279 
280 static inline
wma_print_eht_cap(tDot11fIEeht_cap * eht_cap)281 void wma_print_eht_cap(tDot11fIEeht_cap *eht_cap)
282 {
283 }
284 
285 static inline
wma_print_eht_phy_cap(uint32_t * phy_cap)286 void wma_print_eht_phy_cap(uint32_t *phy_cap)
287 {
288 }
289 
290 static inline
wma_print_eht_mac_cap(uint32_t * mac_cap)291 void wma_print_eht_mac_cap(uint32_t *mac_cap)
292 {
293 }
294 
295 static inline
wma_print_eht_op(tDot11fIEeht_op * eht_ops)296 void wma_print_eht_op(tDot11fIEeht_op *eht_ops)
297 {
298 }
299 
300 static inline
wma_populate_peer_eht_cap(struct peer_assoc_params * peer,tpAddStaParams params)301 void wma_populate_peer_eht_cap(struct peer_assoc_params *peer,
302 			       tpAddStaParams params)
303 {
304 }
305 
wma_is_peer_eht_capable(tpAddStaParams params)306 static inline bool wma_is_peer_eht_capable(tpAddStaParams params)
307 {
308 	return false;
309 }
310 
311 static inline
wma_set_peer_assoc_params_bw_320(struct peer_assoc_params * params,enum phy_ch_width ch_width)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
wma_set_eht_txbf_cfg(struct mac_context * mac,uint8_t vdev_id)318 void wma_set_eht_txbf_cfg(struct mac_context *mac, uint8_t vdev_id)
319 {
320 }
321 
322 static inline
wma_set_eht_txbf_params(uint8_t vdev_id,bool su_bfer,bool su_bfee,bool mu_bfer)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
wma_set_bss_rate_flags_eht(enum tx_rate_info * rate_flags,struct bss_params * add_bss)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
wma_get_eht_rate_flags(enum phy_ch_width ch_width)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
wma_match_eht_rate(uint16_t raw_rate,enum tx_rate_info rate_flags,uint8_t * nss,uint8_t * dcm,enum txrate_gi * guard_interval,enum tx_rate_info * mcs_rate_flag,uint8_t * p_index)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
wma_get_bss_eht_capable(struct bss_params * add_bss)353 bool wma_get_bss_eht_capable(struct bss_params *add_bss)
354 {
355 	return false;
356 }
357 
wma_is_eht_phymode_supported(enum wlan_phymode bss_phymode)358 static inline bool wma_is_eht_phymode_supported(enum wlan_phymode bss_phymode)
359 {
360 	return false;
361 }
362 
363 static inline
wma_set_eht_txbf_vdev_params(struct mac_context * mac,uint32_t * mode)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
wma_vdev_set_listen_interval(uint8_t vdev_id,uint8_t val)374 void wma_vdev_set_listen_interval(uint8_t vdev_id, uint8_t val)
375 {}
376 #endif
377 #endif
378