1 /*
2  * Copyright (c) 2017-2020 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
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef __WMA_HE_H
21 #define __WMA_HE_H
22 
23 #include "wma.h"
24 #include "sir_api.h"
25 #include "target_if.h"
26 
27 /* Number of bits to shift on HE MCS 12 13 MAP to get the desired map */
28 #define WMA_MCS_12_13_MAP_L80 16
29 #define WMA_MCS_12_13_MAP_G80 8
30 
31 /* Mask to fill tx and rx mcs rate maps to be sent to the FW */
32 #define WMA_MCS_12_13_PEER_RATE_MAP 0x00ff0000
33 
34 #ifdef WLAN_FEATURE_11AX
35 /**
36  * wma_print_he_cap() - Print HE capabilities
37  * @he_cap: pointer to HE Capability
38  *
39  * Received HE capabilities are converted into dot11f structure.
40  * This function will print all the HE capabilities as stored
41  * in the dot11f structure.
42  *
43  * Return: None
44  */
45 void wma_print_he_cap(tDot11fIEhe_cap *he_cap);
46 
47 /**
48  * wma_print_he_ppet() - Prints HE PPE Threshold
49  * @he_ppet: PPE Threshold
50  *
51  * This function prints HE PPE Threshold as received from FW.
52  * Refer to the definition of wmi_ppe_threshold to understand
53  * how PPE thresholds are packed by FW for a given NSS and RU.
54  *
55  * Return: none
56  */
57 void wma_print_he_ppet(void *ppet);
58 
59 /**
60  * wma_print_he_phy_cap() - Print HE PHY Capability
61  * @phy_cap: pointer to PHY Capability
62  *
63  * This function prints HE PHY Capability received from FW.
64  *
65  * Return: none
66  */
67 void wma_print_he_phy_cap(uint32_t *phy_cap);
68 
69 /**
70  * wma_print_he_mac_cap_w1() - Print HE MAC Capability
71  * @mac_cap: MAC Capability
72  *
73  * This function prints HE MAC Capability received from FW.
74  *
75  * Return: none
76  */
77 void wma_print_he_mac_cap_w1(uint32_t mac_cap);
78 
79 /**
80  * wma_print_he_mac_cap_w2() - Print HE MAC Capability
81  * @mac_cap: MAC Capability
82  *
83  * This function prints HE MAC Capability received from FW.
84  *
85  * Return: none
86  */
87 void wma_print_he_mac_cap_w2(uint32_t mac_cap);
88 
89 /**
90  * wma_print_he_op() - Print HE Operation
91  * @he_cap: pointer to HE Operation
92  *
93  * Print HE operation stored as dot11f structure
94  *
95  * Return: None
96  */
97 void wma_print_he_op(tDot11fIEhe_op *he_ops);
98 
99 /**
100  * wma_update_target_ext_he_cap() - Update HE caps with given extended cap
101  * @tgt_hdl: target psoc information
102  * @tgt_cfg: Target config
103  *
104  * This function loop through each hardware mode and for each hardware mode
105  * again it loop through each MAC/PHY and pull the caps 2G and 5G specific
106  * HE caps and derives the final cap.
107  *
108  * Return: None
109  */
110 void wma_update_target_ext_he_cap(struct target_psoc_info *tgt_hdl,
111 				  struct wma_tgt_cfg *tgt_cfg);
112 
113 /*
114  * wma_he_update_tgt_services() - update tgt cfg to indicate 11ax support
115  * @wmi_handle: pointer to WMI handle
116  * @cfg: pointer to WMA target services
117  *
118  * Based on WMI SERVICES information, enable 11ax support and set DOT11AX bit
119  * in feature caps bitmap.
120  *
121  * Return: None
122  */
123 void wma_he_update_tgt_services(struct wmi_unified *wmi_handle,
124 				struct wma_tgt_services *cfg);
125 
126 /**
127  * wma_populate_peer_he_cap() - populate peer HE capabilities in peer assoc cmd
128  * @peer: pointer to peer assoc params
129  * @params: pointer to ADD STA params
130  *
131  * Return: None
132  */
133 void wma_populate_peer_he_cap(struct peer_assoc_params *peer,
134 			      tpAddStaParams params);
135 
136 /**
137  * wma_update_vdev_he_ops() - update he ops in vdev start request
138  * @he_ops: target he ops
139  * @he_op: source he ops
140  *
141  * Return: None
142  */
143 void wma_update_vdev_he_ops(uint32_t *he_ops, tDot11fIEhe_op *he_op);
144 
145 #define DOT11AX_HEMU_MODE 0x30
146 #define HE_SUBFEE 0
147 #define HE_SUBFER 1
148 #define HE_MUBFEE 2
149 #define HE_MUBFER 3
150 
151 /**
152  * wma_get_hemu_mode() - get hemu mode
153  * @hemumode: pointer to have hemumode
154  * @mac: pointer to mac context
155  *
156  * Return: Success on proper hemumode else failure
157  */
158 QDF_STATUS wma_get_hemu_mode(uint32_t *hemumode, struct mac_context *mac);
159 
160 /**
161  * wma_set_he_txbf_params() - set HE Tx beamforming params to FW
162  * @vdev_id: VDEV id
163  * @su bfer: SU beamformer capability
164  * @su bfee: SU beamformee capability
165  * @mu bfer: MU beamformer capability
166  *
167  * Return: None
168  */
169 void wma_set_he_txbf_params(uint8_t vdev_id, bool su_bfer,
170 			    bool su_bfee, bool mu_bfer);
171 
172 
173 /**
174  * wma_set_he_txbf_cfg() - set HE Tx beamforming mlme cfg to FW
175  * @mac: Global MAC context
176  * @vdev_id: VDEV id
177  *
178  * Return: None
179  */
180 void wma_set_he_txbf_cfg(struct mac_context *mac, uint8_t vdev_id);
181 /**
182  * wma_vdev_set_he_bss_params() - set HE OPs in vdev start
183  * @wma: pointer to wma handle
184  * @vdev_id: VDEV id
185  * @he_info: pointer to he info
186  *
187  * Return: None
188  */
189 void wma_vdev_set_he_bss_params(tp_wma_handle wma, uint8_t vdev_id,
190 				struct vdev_mlme_he_ops_info *he_info);
191 
192 /**
193  * wma_vdev_set_he_config() - set HE Config in vdev start
194  * @wma: pointer to wma handle
195  * @vdev_id: VDEV id
196  * @add_bss: BSS params
197  *
198  * Return: None
199  */
200 void wma_vdev_set_he_config(tp_wma_handle wma, uint8_t vdev_id,
201 				struct bss_params *add_bss);
202 
wma_is_peer_he_capable(tpAddStaParams params)203 static inline bool wma_is_peer_he_capable(tpAddStaParams params)
204 {
205 	return params->he_capable;
206 }
207 
208 /**
209  * wma_update_he_ops_ie() - update the HE OPS IE to firmware
210  * @wma: pointer to wma context
211  * @vdev_id: vdev id
212  * @he_ops: 32bit value of HE ops
213  *
214  * This API is used to send updated HE operational IE to firmware, so that
215  * firmware can be in sync with host
216  *
217  * Return: QDF_STATUS
218  */
219 QDF_STATUS wma_update_he_ops_ie(tp_wma_handle wma, uint8_t vdev_id,
220 				tDot11fIEhe_op *he_ops);
221 
222 /**
223  * wma_get_he_capabilities() - Get HE capabilities from WMA
224  * @he_cap: Pointer to HE capabilities
225  *
226  * Currently HE capabilities are not updated in wma_handle. This
227  * is an interface for upper layer to query capabilities from WMA.
228  * When the real use case arise, update wma_handle with HE capabilities
229  * as required.
230  *
231  * Return: QDF_STATUS
232  */
233 QDF_STATUS wma_get_he_capabilities(struct he_capability *he_cap);
234 
235 /**
236  * wma_set_he_vdev_param() - update he vdev param in wma
237  * @intr: pointer to wma_txrx_node
238  * @param_id: vdev param id
239  * @value: value of vdev param
240  *
241  * Result: None
242  */
243 void wma_set_he_vdev_param(struct wma_txrx_node *intr,
244 			   wmi_conv_vdev_param_id param_id,
245 			   uint32_t value);
246 
247 /**
248  * wma_get_he_vdev_param() - retrieve he vdev param from wma
249  * @intr: pointer to wma_txrx_node
250  * @param_id: vdev param id
251  *
252  * Result: param value
253  */
254 uint32_t wma_get_he_vdev_param(struct wma_txrx_node *intr,
255 			       wmi_conv_vdev_param_id param_id);
256 
257 /**
258  * wma_prevent_suspend_on_obss_color_collision() - prevent suspend on obss color
259  *						collision
260  * @vdev: pointer to vdev object
261  *
262  * Return: none
263  */
264 void wma_prevent_suspend_on_obss_color_collision(struct wlan_objmgr_vdev *vdev);
265 
266 /**
267  * wma_allow_suspend_after_obss_color_change() - allow suspend on obss color
268  *						change
269  * @vdev: pointer to vdev object
270  *
271  * Return: none
272  */
273 void wma_allow_suspend_after_obss_color_change(struct wlan_objmgr_vdev *vdev);
274 #else
wma_print_he_cap(tDot11fIEhe_cap * he_cap)275 static inline void wma_print_he_cap(tDot11fIEhe_cap *he_cap)
276 {
277 }
278 
wma_print_he_ppet(void * ppet)279 static inline void wma_print_he_ppet(void *ppet)
280 {
281 }
282 
wma_print_he_phy_cap(uint32_t * phy_cap)283 static inline void wma_print_he_phy_cap(uint32_t *phy_cap)
284 {
285 }
286 
wma_print_he_mac_cap_w1(uint32_t mac_cap)287 static inline void wma_print_he_mac_cap_w1(uint32_t mac_cap)
288 {
289 }
290 
wma_print_he_mac_cap_w2(uint32_t mac_cap)291 static inline void wma_print_he_mac_cap_w2(uint32_t mac_cap)
292 {
293 }
294 
wma_print_he_op(tDot11fIEhe_op * he_ops)295 static inline void wma_print_he_op(tDot11fIEhe_op *he_ops)
296 {
297 }
298 
wma_update_target_ext_he_cap(struct target_psoc_info * tgt_hdl,struct wma_tgt_cfg * tgt_cfg)299 static inline void wma_update_target_ext_he_cap(struct
300 						target_psoc_info *tgt_hdl,
301 						struct wma_tgt_cfg *tgt_cfg)
302 {
303 }
304 
wma_he_update_tgt_services(struct wmi_unified * wmi_handle,struct wma_tgt_services * cfg)305 static inline void wma_he_update_tgt_services(struct wmi_unified *wmi_handle,
306 					      struct wma_tgt_services *cfg)
307 {
308 	cfg->en_11ax = false;
309 	return;
310 }
311 
wma_populate_peer_he_cap(struct peer_assoc_params * peer,tpAddStaParams params)312 static inline void wma_populate_peer_he_cap(struct peer_assoc_params *peer,
313 					    tpAddStaParams params)
314 {
315 }
316 
317 static inline
wma_update_vdev_he_ops(uint32_t * he_ops,tDot11fIEhe_op * he_op)318 void wma_update_vdev_he_ops(uint32_t *he_ops, tDot11fIEhe_op *he_op)
319 {
320 }
321 
wma_get_hemu_mode(uint32_t * hemumode,struct mac_context * mac)322 static inline QDF_STATUS wma_get_hemu_mode(uint32_t *hemumode,
323 					   struct mac_context *mac)
324 {
325 	return QDF_STATUS_E_FAILURE;
326 }
327 
wma_set_he_txbf_params(uint8_t vdev_id,bool su_bfer,bool su_bfee,bool mu_bfer)328 static inline void wma_set_he_txbf_params(uint8_t vdev_id, bool su_bfer,
329 					  bool su_bfee, bool mu_bfer)
330 {
331 }
332 
wma_set_he_txbf_cfg(struct mac_context * mac,uint8_t vdev_id)333 static inline void wma_set_he_txbf_cfg(struct mac_context *mac, uint8_t vdev_id)
334 {
335 }
336 
wma_update_he_ops_ie(tp_wma_handle wma,uint8_t vdev_id,tDot11fIEhe_op * he_ops)337 static inline  QDF_STATUS wma_update_he_ops_ie(tp_wma_handle wma,
338 			uint8_t vdev_id, tDot11fIEhe_op *he_ops)
339 {
340 	return QDF_STATUS_SUCCESS;
341 }
342 
343 static inline
wma_vdev_set_he_bss_params(tp_wma_handle wma,uint8_t vdev_id,struct vdev_mlme_he_ops_info * he_info)344 void wma_vdev_set_he_bss_params(tp_wma_handle wma, uint8_t vdev_id,
345 				struct vdev_mlme_he_ops_info *he_info)
346 {
347 }
348 
wma_vdev_set_he_config(tp_wma_handle wma,uint8_t vdev_id,struct bss_params * add_bss)349 static inline void wma_vdev_set_he_config(tp_wma_handle wma, uint8_t vdev_id,
350 					struct bss_params *add_bss)
351 {
352 }
353 
wma_is_peer_he_capable(tpAddStaParams params)354 static inline bool wma_is_peer_he_capable(tpAddStaParams params)
355 {
356 	return false;
357 }
358 
wma_set_he_vdev_param(struct wma_txrx_node * intr,wmi_conv_vdev_param_id param_id,uint32_t value)359 static inline void wma_set_he_vdev_param(struct wma_txrx_node *intr,
360 			wmi_conv_vdev_param_id param_id, uint32_t value)
361 {
362 }
363 
wma_get_he_vdev_param(struct wma_txrx_node * intr,wmi_conv_vdev_param_id param_id)364 static inline uint32_t wma_get_he_vdev_param(struct wma_txrx_node *intr,
365 					     wmi_conv_vdev_param_id param_id)
366 {
367 	return 0;
368 }
369 
wma_prevent_suspend_on_obss_color_collision(struct wlan_objmgr_vdev * vdev)370 static inline void wma_prevent_suspend_on_obss_color_collision(
371 						struct wlan_objmgr_vdev *vdev)
372 {
373 }
374 
wma_allow_suspend_after_obss_color_change(struct wlan_objmgr_vdev * vdev)375 static inline void wma_allow_suspend_after_obss_color_change(
376 						struct wlan_objmgr_vdev *vdev)
377 {
378 }
379 #endif
380 
381 #endif /* __WMA_HE_H */
382