1 /*
2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2024 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 /**
19 * DOC: Define VDEV MLME structure and APIs
20 */
21 #ifndef _WLAN_VDEV_MLME_H_
22 #define _WLAN_VDEV_MLME_H_
23
24 #include <wlan_vdev_mgr_tgt_if_rx_defs.h>
25 #include <wlan_objmgr_vdev_obj.h>
26 #include <wlan_vdev_mlme_api.h>
27 #include <wlan_ext_mlme_obj_types.h>
28
29 struct vdev_mlme_obj;
30 struct cnx_mgr;
31 struct ml_rv_info;
32
33 /* Requestor ID for multiple vdev restart */
34 #define MULTIPLE_VDEV_RESTART_REQ_ID 0x1234
35
36 /* values for vdev_type */
37 #define WLAN_VDEV_MLME_TYPE_UNKNOWN 0x0
38 #define WLAN_VDEV_MLME_TYPE_AP 0x1
39 #define WLAN_VDEV_MLME_TYPE_STA 0x2
40 #define WLAN_VDEV_MLME_TYPE_IBSS 0x3
41 #define WLAN_VDEV_MLME_TYPE_MONITOR 0x4
42 #define WLAN_VDEV_MLME_TYPE_NAN 0x5
43 #define WLAN_VDEV_MLME_TYPE_OCB 0x6
44 #define WLAN_VDEV_MLME_TYPE_NDI 0x7
45
46 /* values for vdev_subtype */
47 #define WLAN_VDEV_MLME_SUBTYPE_UNKNOWN 0x0
48 #define WLAN_VDEV_MLME_SUBTYPE_P2P_DEVICE 0x1
49 #define WLAN_VDEV_MLME_SUBTYPE_P2P_CLIENT 0x2
50 #define WLAN_VDEV_MLME_SUBTYPE_P2P_GO 0x3
51 #define WLAN_VDEV_MLME_SUBTYPE_PROXY_STA 0x4
52 #define WLAN_VDEV_MLME_SUBTYPE_MESH 0x5
53 #define WLAN_VDEV_MLME_SUBTYPE_MESH_11S 0x6
54 #define WLAN_VDEV_MLME_SUBTYPE_SMART_MONITOR 0x7
55 #define WLAN_VDEV_MLME_SUBTYPE_MLO_BRIDGE 0x8
56
57 /* vdev control flags (per bits) */
58 #define WLAN_VDEV_MLME_FLAGS_NON_MBSSID_AP 0x00000001
59 #define WLAN_VDEV_MLME_FLAGS_TRANSMIT_AP 0x00000002
60 #define WLAN_VDEV_MLME_FLAGS_NON_TRANSMIT_AP 0x00000004
61 #define WLAN_VDEV_MLME_FLAGS_EMA_MODE 0x00000008
62 #define WLAN_VDEV_MLME_FLAGS_MBSS_CMN_PARAM 0x00000010
63
64 /**
65 * struct vdev_mlme_proto_generic - generic mlme proto structure
66 * sent in frames
67 * @dtim_period: frequency of data transmissions per beacon 1-255
68 * @slot_time: slot time
69 * @protection_mode: rts cts protection mode
70 * @beacon_interval: beacon interval
71 * @ldpc: low density parity check value
72 * @nss: number of spatial stream
73 * @nss_2g: 2.4GHz number of spatial stream
74 * @nss_5g: 5GHz number of spatial stream
75 * @tsfadjust: adjusted timer sync value
76 */
77 struct vdev_mlme_proto_generic {
78 uint8_t dtim_period;
79 uint32_t slot_time;
80 uint32_t protection_mode;
81 uint16_t beacon_interval;
82 uint8_t ldpc;
83 uint8_t nss;
84 uint8_t nss_2g;
85 uint8_t nss_5g;
86 uint64_t tsfadjust;
87 };
88
89 /**
90 * struct vdev_mlme_proto_ap - ap specific mlme protocol
91 * @mapping_switch_time: Mapping switch time of T2LM
92 */
93 struct vdev_mlme_proto_ap {
94 uint16_t mapping_switch_time;
95 };
96
97 /**
98 * struct vdev_mlme_proto_sta - sta specific mlme protocol
99 * @assoc_id: association id of station
100 * @uapsd_cfg: uapsd configuration
101 */
102 struct vdev_mlme_proto_sta {
103 uint16_t assoc_id;
104 uint16_t uapsd_cfg;
105 };
106
107 /**
108 * struct vdev_mlme_proto_bss_color - bss color cfg
109 * @flags: proposed for future use cases, currently not used.
110 * @evt_type: bss color collision event.
111 * @current_bss_color: current bss color.
112 * @detection_period_ms: scan interval for both AP and STA mode.
113 * @scan_period_ms: scan period for passive scan to detect collision.
114 * @free_slot_expiry_time_ms: FW to notify host at timer expiry after
115 * which Host will disable the bss color.
116 */
117 struct vdev_mlme_proto_bss_color {
118 uint32_t flags;
119 uint8_t evt_type;
120 uint32_t current_bss_color;
121 uint32_t detection_period_ms;
122 uint32_t scan_period_ms;
123 uint32_t free_slot_expiry_time_ms;
124 };
125
126 /**
127 * struct vdev_mlme_vht_info - vdev VHT information
128 * @caps: vht capabilities
129 * @subfer: su beam former capability
130 * @subfee: su beam formee capability
131 * @mubfer: mu beam former capability
132 * @mubfee: mu beam formee capability
133 * @implicit_bf: Implicit BF support
134 * @sounding_dimension: Beamformer number of sounding dimension
135 * @bfee_sts_cap: beam formee STA capability
136 * @allow_vht: vht capability status
137 */
138 struct vdev_mlme_vht_info {
139 uint32_t caps;
140 uint8_t subfer;
141 uint8_t mubfer;
142 uint8_t subfee;
143 uint8_t mubfee;
144 uint8_t implicit_bf;
145 uint8_t sounding_dimension;
146 uint8_t bfee_sts_cap;
147 bool allow_vht;
148 };
149
150 /**
151 * struct vdev_mlme_ht_info - vdev HT information
152 * @ht_caps: HT capabilities
153 * @allow_ht: HT capability status
154 */
155 struct vdev_mlme_ht_info {
156 uint32_t ht_caps;
157 bool allow_ht;
158 };
159
160 /**
161 * struct vdev_mlme_he_ops_info - vdev mlme HEOPS information
162 * @he_ops: he ops
163 */
164 struct vdev_mlme_he_ops_info {
165 uint32_t he_ops;
166 };
167
168 #ifdef WLAN_FEATURE_11BE
169
170 /**
171 * struct vdev_mlme_eht_caps_info - vdev mlme EHT capability information
172 * @eht_maccap_epcspriaccess_support : EPCS Priority Access Supported
173 * @eht_maccap_ehtomctrl_support : EHT OM Control Support
174 * @eht_maccap_trigtxop_sharing_mode1: Triggered TXOP Sharing mode1 Support
175 * @eht_maccap_trigtxop_sharing_mode2: Triggered TXOP Sharing mode2 Support
176 * @eht_maccap_rtwt_support : Restricted TWT Support
177 * @eht_maccap_scs_traffic_description : SCS Traffic Description Support
178 * @eht_maccap_max_mpdu_len : Maximum MPDU Length
179 * @eht_maccap_max_ampdu_len_exp_etn : Maximum A-MPDU Length Exponent Extension
180 * @eht_maccap_trs_support : EHT TRS Support
181 * @eht_maccap_txop_ret_supp_in_txop_mode2: TXOP Return Support In TXOP
182 * Sharing Mode 2
183 * @eht_phycap_reserved : Reserved
184 * @eht_phycap_320mhzin6ghz : Support For 320 MHz In 6 GHz
185 * @eht_phycap_242tonerubwlt20mhz : Support for 242-tone RU In BW Wider Than
186 * 20 MHz
187 * @eht_phycap_ndp4xehtltfand320nsgi : NDP With 4. EHT-LTF And 3.2 .s GI
188 * @eht_phycap_partialbwulmu : Partial Bandwidth UL MU-MIMO
189 * @eht_phycap_subfmr : SU Beamformer
190 * @eht_phycap_subfme : SU Beamformee
191 * @eht_phycap_bfmesslt80mhz : Beamformee SS (<= 80 MHz)
192 * @eht_phycap_bfmess160mhz : Beamformee SS (= 160 MHz)
193 * @eht_phycap_bfmess320mhz : Beamformee SS (= 320 MHz)
194 * @eht_phycap_numsoundlt80mhz : Number Of Sounding Dimensions (<=80 MHz)
195 * @eht_phycap_numsound160mhz : Number Of Sounding Dimensions (=160 MHz)
196 * @eht_phycap_numsound320mhz : Number Of Sounding Dimensions (=320 MHz)
197 * @eht_phycap_ng16sufb : Ng = 16 SU Feedback
198 * @eht_phycap_ng16mufb : Ng = 16 MU Feedback
199 * @eht_phycap_codbk42sufb : Codebook Size {4,2} SU Feedback
200 * @eht_phycap_codbk75mufb : Codebook Size {4,2} MU Feedback
201 * @eht_phycap_trigsubffb : Triggered SU Beamforming Feedback
202 * @eht_phycap_trigmubfpartbwfb : Triggered MU Beamforming Partial B
203 * Feedback
204 * @eht_phycap_trigcqifb : Triggered CQI Feedback
205 * @eht_phycap_partbwdlmumimo : Partial Bandwidth DL MU-MIMO
206 * @eht_phycap_psrsr : PSR-Based SR Support
207 * @eht_phycap_pwrbstfactor : Power Boost Factor Support
208 * @eht_phycap_4xehtltfand800nsgi : EHT MU PPDU With 4xEHT-LTF And 0.8 .s GI
209 * @eht_phycap_maxnc : Max Nc
210 * @eht_phycap_nontrigcqifb : Non-Triggered CQI Feedback
211 * @eht_phycap_tx1024and4096qamls242toneru : Tx 1024-QAM And 4096-QAM <
212 * 242-tone RU Support
213 * @eht_phycap_rx1024and4096qamls242toneru : Rx 1024-QAM And 4096-QAM <
214 * 242-tone RU Support
215 * @eht_phycap_ppethrespresent : PPE Thresholds Present
216 * @eht_phycap_cmnnompktpad : Common Nominal Packet Padding
217 * @eht_phycap_maxnumehtltf : Maximum Number Of Supported EHT-LTFs
218 * @eht_phycap_supmcs15 : Support of MCS 15
219 * @eht_phycap_ehtdupin6ghz : Support Of EHT DUP In 6 GHz
220 * @eht_phycap_20mhzopstarxndpwiderbw : Support For 20 MHz Operating STA
221 * Receiving NDP With Wider Bandwidth
222 * @eht_phycap_nonofdmaulmumimolt80mhz : Non-OFDMA UL MU-MIMO (BW <= 80 MHz)
223 * @eht_phycap_nonofdmaulmumimo160mhz : Non-OFDMA UL MU-MIMO (BW = 160 MHz)
224 * @eht_phycap_nonofdmaulmumimo320mhz : Non-OFDMA UL MU-MIMO (BW = 320 MHz)
225 * @eht_phycap_mubfmrlt80mhz : MU Beamformer (BW <= 80 MHz)
226 * @eht_phycap_mubfmr160mhz : MU Beamformer (BW = 160 MHz)
227 * @eht_phycap_mubfmr320mhz : MU Beamformer (BW = 320 MHz)
228 * @eht_phycap_tb_sounding_feedback_rl:
229 * @eht_phycap_rx1024qamwiderbwdlofdma:
230 * @eht_phycap_rx4096qamwiderbwdlofdma:
231 */
232 struct vdev_mlme_eht_caps_info {
233 uint32_t eht_maccap_epcspriaccess_support :1,
234 eht_maccap_ehtomctrl_support :1,
235 eht_maccap_trigtxop_sharing_mode1 :1,
236 eht_maccap_trigtxop_sharing_mode2 :1,
237 eht_maccap_rtwt_support :1,
238 eht_maccap_scs_traffic_description :1,
239 eht_maccap_max_mpdu_len :2,
240 eht_maccap_max_ampdu_len_exp_etn :1,
241 eht_maccap_trs_support :1,
242 eht_maccap_txop_ret_supp_in_txop_mode2 :1;
243 uint32_t eht_phycap_reserved :1,
244 eht_phycap_320mhzin6ghz :1,
245 eht_phycap_242tonerubwlt20mhz :1,
246 eht_phycap_ndp4xehtltfand320nsgi :1,
247 eht_phycap_partialbwulmu :1,
248 eht_phycap_subfmr :1,
249 eht_phycap_subfme :1,
250 eht_phycap_bfmesslt80mhz :3,
251 eht_phycap_bfmess160mhz :3,
252 eht_phycap_bfmess320mhz :3,
253 eht_phycap_numsoundlt80mhz :3,
254 eht_phycap_numsound160mhz :3,
255 eht_phycap_numsound320mhz :3,
256 eht_phycap_ng16sufb :1,
257 eht_phycap_ng16mufb :1,
258 eht_phycap_codbk42sufb :1,
259 eht_phycap_codbk75mufb :1,
260 eht_phycap_trigsubffb :1,
261 eht_phycap_trigmubfpartbwfb :1,
262 eht_phycap_trigcqifb :1;
263 uint32_t eht_phycap_partbwdlmumimo :1,
264 eht_phycap_psrsr :1,
265 eht_phycap_pwrbstfactor :1,
266 eht_phycap_4xehtltfand800nsgi :1,
267 eht_phycap_maxnc :4,
268 eht_phycap_nontrigcqifb :1,
269 eht_phycap_tx1024and4096qamls242toneru :1,
270 eht_phycap_rx1024and4096qamls242toneru :1,
271 eht_phycap_ppethrespresent :1,
272 eht_phycap_cmnnompktpad :2,
273 eht_phycap_maxnumehtltf :5,
274 eht_phycap_supmcs15 :4,
275 eht_phycap_ehtdupin6ghz :1,
276 eht_phycap_20mhzopstarxndpwiderbw :1,
277 eht_phycap_nonofdmaulmumimolt80mhz :1,
278 eht_phycap_nonofdmaulmumimo160mhz :1,
279 eht_phycap_nonofdmaulmumimo320mhz :1,
280 eht_phycap_mubfmrlt80mhz :1,
281 eht_phycap_mubfmr160mhz :1,
282 eht_phycap_mubfmr320mhz :1,
283 eht_phycap_tb_sounding_feedback_rl :1;
284 uint32_t eht_phycap_rx1024qamwiderbwdlofdma :1,
285 eht_phycap_rx4096qamwiderbwdlofdma :1;
286 };
287
288 /**
289 * struct vdev_mlme_eht_ops_info - vdev mlme EHTOPS information
290 * @eht_ops: eht ops
291 */
292 struct vdev_mlme_eht_ops_info {
293 uint32_t eht_ops;
294 };
295 #endif
296
297 /**
298 * enum mlme_vdev_dot11_mode - Dot11 mode of the vdev
299 * @MLME_VDEV_DOT11_MODE_AUTO: vdev uses mlme_dot11_mode
300 * @MLME_VDEV_DOT11_MODE_11N: vdev supports 11N mode
301 * @MLME_VDEV_DOT11_MODE_11AC: vdev supports 11AC mode
302 * @MLME_VDEV_DOT11_MODE_11AX: vdev supports 11AX mode
303 * @MLME_VDEV_DOT11_MODE_11BE: vdev supports 11BE mode
304 */
305 enum mlme_vdev_dot11_mode {
306 MLME_VDEV_DOT11_MODE_AUTO,
307 MLME_VDEV_DOT11_MODE_11N,
308 MLME_VDEV_DOT11_MODE_11AC,
309 MLME_VDEV_DOT11_MODE_11AX,
310 MLME_VDEV_DOT11_MODE_11BE,
311 };
312
313 /**
314 * struct vdev_mlme_proto - vdev protocol structure holding information
315 * that is used in frames
316 * @vdev_dot11_mode: supported dot11 mode
317 * @generic: generic protocol information
318 * @ap: ap specific protocol information
319 * @sta: sta specific protocol information
320 * @vht_info: vht information
321 * @ht_info: ht capabilities information
322 * @he_ops_info: he ops information
323 * @eht_cap_info: EHT capability information
324 * @eht_ops_info: EHT operation information
325 * @bss_color: 11ax HE BSS Color information
326 */
327 struct vdev_mlme_proto {
328 enum mlme_vdev_dot11_mode vdev_dot11_mode;
329 struct vdev_mlme_proto_generic generic;
330 struct vdev_mlme_proto_ap ap;
331 struct vdev_mlme_proto_sta sta;
332 struct vdev_mlme_vht_info vht_info;
333 struct vdev_mlme_ht_info ht_info;
334 struct vdev_mlme_he_ops_info he_ops_info;
335 #ifdef WLAN_FEATURE_11BE
336 struct vdev_mlme_eht_caps_info eht_cap_info;
337 struct vdev_mlme_eht_ops_info eht_ops_info;
338 #endif
339 struct vdev_mlme_proto_bss_color bss_color;
340 };
341
342 /**
343 * struct vdev_mlme_mgmt_generic - generic vdev mlme mgmt cfg
344 * @rts_threshold: RTS threshold
345 * @frag_threshold: Fragmentation threshold
346 * @probe_delay: time in msec for delaying to send first probe request
347 * @repeat_probe_time: probe request transmission time
348 * @drop_unencry: drop unencrypted status
349 * @tx_pwrlimit: Tx power limit
350 * @tx_power: Tx power
351 * @minpower: Min power
352 * @maxpower: Max power
353 * @maxregpower: max regulatory power
354 * @antennamax: max antenna
355 * @reg_class_id: reg domain class id
356 * @ampdu: ampdu limit
357 * @amsdu: amsdu limit
358 * @ssid: service set identifier
359 * @ssid_len: ssid length
360 * @type: vdev type
361 * @subtype: vdev subtype
362 * @rx_decap_type: rx decap type
363 * @tx_encap_type: tx encap type
364 * @disable_hw_ack: disable ha ack flag
365 * @bssid: bssid
366 * @phy_mode: phy mode
367 * @special_vdev_mode: indicates special vdev mode
368 * @is_sap_go_moved_1st_on_csa: Indicates if STA receives
369 * CSA to a DFS channel
370 * @he_spr_sr_ctrl: Spatial reuse SR control
371 * @he_spr_non_srg_pd_max_offset: Non-SRG PD max offset
372 * @he_spr_srg_max_pd_offset: SRG PD max offset
373 * @he_spr_srg_min_pd_offset: SRG PD min offset
374 * @he_spr_enabled: Spatial reuse enabled or not
375 * @he_spr_disabled_due_conc: spr disabled due to concurrency
376 * @sr_prohibit_enabled:
377 * @srg_bss_color: srg bss color
378 * @srg_partial_bssid: srg partial bssid
379 * @he_curr_non_srg_pd_threshold: current configured NON-SRG PD threshold
380 * @he_curr_srg_pd_threshold: current configured SRG PD threshold
381 * @is_pd_threshold_present: PD threshold is present in SR enable command or not
382 * @disable_fd_in_6ghz_band: Disable FD in 6 GHz if OOB discovery is enabled
383 */
384 struct vdev_mlme_mgmt_generic {
385 uint32_t rts_threshold;
386 uint32_t frag_threshold;
387 uint32_t probe_delay;
388 uint32_t repeat_probe_time;
389 uint32_t drop_unencry;
390 uint32_t tx_pwrlimit;
391 uint8_t tx_power;
392 uint8_t minpower;
393 uint8_t maxpower;
394 uint8_t maxregpower;
395 uint8_t antennamax;
396 uint8_t reg_class_id;
397 uint16_t ampdu;
398 uint8_t amsdu;
399 char ssid[WLAN_SSID_MAX_LEN + 1];
400 uint8_t ssid_len;
401 uint8_t type;
402 uint8_t subtype;
403 uint8_t rx_decap_type;
404 uint8_t tx_encap_type;
405 bool disable_hw_ack;
406 uint8_t bssid[QDF_MAC_ADDR_SIZE];
407 uint32_t phy_mode;
408 bool special_vdev_mode;
409 bool is_sap_go_moved_1st_on_csa;
410 #ifdef WLAN_FEATURE_SR
411 uint8_t he_spr_sr_ctrl;
412 uint8_t he_spr_non_srg_pd_max_offset;
413 uint8_t he_spr_srg_max_pd_offset;
414 uint8_t he_spr_srg_min_pd_offset;
415 bool he_spr_enabled;
416 bool he_spr_disabled_due_conc;
417 bool sr_prohibit_enabled;
418 uint64_t srg_bss_color;
419 uint64_t srg_partial_bssid;
420 int32_t he_curr_non_srg_pd_threshold;
421 int32_t he_curr_srg_pd_threshold;
422 bool is_pd_threshold_present;
423 #endif
424 bool disable_fd_in_6ghz_band;
425 };
426
427 /**
428 * struct wlan_vdev_aid_mgr - AID manager
429 * @aid_bitmap: AID bitmap array
430 * @start_aid: start of AID index
431 * @max_aid: Max allowed AID
432 * @ref_cnt: to share AID across VDEVs for MBSSID
433 */
434 struct wlan_vdev_aid_mgr {
435 qdf_bitmap(aid_bitmap, WLAN_UMAC_MAX_AID);
436 uint16_t start_aid;
437 uint16_t max_aid;
438 qdf_atomic_t ref_cnt;
439 };
440
441 /**
442 * struct vdev_mlme_mgmt_ap - ap specific vdev mlme mgmt cfg
443 * @hidden_ssid: flag to indicate whether it is hidden ssid
444 * @cac_duration_ms: cac duration in milliseconds
445 * @aid_mgr: AID bitmap mgr
446 * @max_chan_switch_time: Max channel switch time in milliseconds.
447 * @last_bcn_ts_ms: Timestamp (in milliseconds) of the last beacon sent on the
448 * CSA triggered channel.
449 * @is_acs_mode: True if SAP is started in ACS mode
450 */
451 struct vdev_mlme_mgmt_ap {
452 bool hidden_ssid;
453 uint32_t cac_duration_ms;
454 struct wlan_vdev_aid_mgr *aid_mgr;
455 uint32_t max_chan_switch_time;
456 unsigned long last_bcn_ts_ms;
457 bool is_acs_mode;
458 };
459
460 /**
461 * struct vdev_mlme_mgmt_sta - sta specific vdev mlme mgmt cfg
462 * @he_mcs_12_13_map: map to indicate mcs12/13 caps of peer&dut
463 */
464 struct vdev_mlme_mgmt_sta {
465 uint16_t he_mcs_12_13_map;
466 };
467
468 /**
469 * struct vdev_mlme_inactivity_params - vdev mlme inactivity parameters
470 * @bmiss_first_bcnt: bmiss first time
471 * @bmiss_final_bcnt: bmiss final time
472 * @keepalive_min_idle_inactive_time_secs: min time AP consider STA to be
473 * inactive
474 * @keepalive_max_idle_inactive_time_secs: max inactive idle time for AP to send
475 * data-null
476 * @keepalive_max_unresponsive_time_secs: max time to send WMI_STA_KICKOUT
477 */
478 struct vdev_mlme_inactivity_params {
479 uint32_t bmiss_first_bcnt;
480 uint32_t bmiss_final_bcnt;
481 uint32_t keepalive_min_idle_inactive_time_secs;
482 uint32_t keepalive_max_idle_inactive_time_secs;
483 uint32_t keepalive_max_unresponsive_time_secs;
484 };
485
486 /**
487 * enum vdev_ratemask_type - ratemask phy type
488 * @WLAN_VDEV_RATEMASK_TYPE_CCK: phy type CCK
489 * @WLAN_VDEV_RATEMASK_TYPE_HT: phy type ht
490 * @WLAN_VDEV_RATEMASK_TYPE_VHT: phy type vht
491 * @WLAN_VDEV_RATEMASK_TYPE_HE: phy type he
492 * @WLAN_VDEV_RATEMASK_TYPE_EHT: phy type eht
493 * @WLAN_VDEV_RATEMASK_TYPE_MAX: Maximum enumeration
494 */
495 enum vdev_ratemask_type {
496 WLAN_VDEV_RATEMASK_TYPE_CCK,
497 WLAN_VDEV_RATEMASK_TYPE_HT,
498 WLAN_VDEV_RATEMASK_TYPE_VHT,
499 WLAN_VDEV_RATEMASK_TYPE_HE,
500 WLAN_VDEV_RATEMASK_TYPE_EHT,
501 WLAN_VDEV_RATEMASK_TYPE_MAX,
502 };
503
504 /**
505 * struct vdev_ratemask_params - vdev ratemask parameters
506 * @type: ratemask phy type
507 * @lower32: ratemask lower32 bitmask
508 * @higher32: ratemask higher32 bitmask
509 * @lower32_2: ratemask lower32_2 bitmask
510 * @higher32_2: rtaemask higher32_2 bitmask
511 */
512 struct vdev_ratemask_params {
513 uint32_t lower32;
514 uint32_t higher32;
515 uint32_t lower32_2;
516 uint32_t higher32_2;
517 };
518
519 /**
520 * struct vdev_mlme_rate_info - vdev mlme rate information
521 * @rate_flags: dynamic bandwidth info
522 * @per_band_tx_mgmt_rate: per band Tx mgmt rate
523 * @max_rate: max bandwidth rate
524 * @tx_mgmt_rate: Tx Mgmt rate
525 * @bcn_tx_rate: beacon Tx rate
526 * @bcn_tx_rate_code: beacon Tx rate code
527 * @rtscts_tx_rate: RTS/CTS Tx rate
528 * @ratemask_params: vdev ratemask params per phy type
529 * @half_rate: Half rate
530 * @quarter_rate: quarter rate
531 */
532 struct vdev_mlme_rate_info {
533 uint32_t rate_flags;
534 uint32_t per_band_tx_mgmt_rate;
535 uint32_t max_rate;
536 uint32_t tx_mgmt_rate;
537 uint32_t bcn_tx_rate;
538 #ifdef WLAN_BCN_RATECODE_ENABLE
539 uint32_t bcn_tx_rate_code;
540 #endif
541 uint32_t rtscts_tx_rate;
542 struct vdev_ratemask_params ratemask_params[
543 WLAN_VDEV_RATEMASK_TYPE_MAX];
544 bool half_rate;
545 bool quarter_rate;
546 };
547
548 /**
549 * struct vdev_mlme_chainmask_info - vdev mlme chainmask information
550 * @tx_chainmask: Tx chainmask
551 * @rx_chainmask: Rx Chainmask
552 * @num_rx_chain: Num of bits set in Rx chain
553 * @num_tx_chain: Num of bits set in Tx chain
554 */
555 struct vdev_mlme_chainmask_info {
556 uint8_t tx_chainmask;
557 uint8_t rx_chainmask;
558 uint8_t num_rx_chain;
559 uint8_t num_tx_chain;
560 };
561
562 /**
563 * struct vdev_mlme_powersave_info - vdev mlme powersave information
564 * @packet_powersave: packet powersave
565 * @max_li_of_moddtim: max mod dtim
566 * @dyndtim_cnt: dynamic dtim count
567 * @listen_interval: listen interval
568 * @moddtim_cnt: mod dtim count
569 */
570 struct vdev_mlme_powersave_info {
571 uint32_t packet_powersave;
572 uint32_t max_li_of_moddtim;
573 uint32_t dyndtim_cnt;
574 uint32_t listen_interval;
575 uint32_t moddtim_cnt;
576 };
577
578 /**
579 * struct vdev_mlme_beacon_info - vdev mlme beacon information
580 * @beacon_buffer: buffer allocated for beacon frame
581 * @beacon_offsets: beacon IE's offsets
582 */
583 struct vdev_mlme_beacon_info {
584 qdf_nbuf_t beacon_buffer;
585 void *beacon_offsets;
586 };
587
588 /**
589 * struct vdev_mlme_mbss_11ax - mbss 11ax fields required for up cmd
590 * @profile_idx: profile index of the connected non-trans ap (mbssid case).
591 * 0 means invalid.
592 * @profile_num: the total profile numbers of non-trans aps (mbssid case).
593 * 0 means non-MBSS AP.
594 * @mbssid_flags: MBSS IE flags indicating vdev type
595 * @vdevid_trans: id of transmitting vdev for MBSS IE
596 * @vdev_bmap: vdev bitmap of VAPs in MBSS group
597 * @is_cmn_param: flag to check mbss common param
598 * @trans_bssid: bssid of transmitted AP (MBSS IE case)
599 * @non_trans_bssid: bssid of non transmitted AP (MBSS IE case)
600 * @is_multi_mbssid: Flag to identify multi group mbssid support
601 * @grp_id: Group id of current vdev
602 */
603 struct vdev_mlme_mbss_11ax {
604 uint32_t profile_idx;
605 uint32_t profile_num;
606 uint32_t mbssid_flags;
607 uint8_t vdevid_trans;
608 unsigned long vdev_bmap;
609 bool is_cmn_param;
610 uint8_t trans_bssid[QDF_MAC_ADDR_SIZE];
611 uint8_t non_trans_bssid[QDF_MAC_ADDR_SIZE];
612 bool is_multi_mbssid;
613 uint32_t grp_id;
614 };
615
616 /**
617 * struct vdev_mlme_mgmt - vdev mlme mgmt related cfg
618 * @generic: generic mgmt information
619 * @ap: ap specific mgmt information
620 * @sta: sta specific mgmt information
621 * @inactivity_params: inactivity parameters
622 * @rate_info: bandwidth rate information
623 * @chainmask_info: Chainmask information
624 * @powersave_info: Power save parameters
625 * @beacon_info: beacon buffer information
626 * @mbss_11ax: MBSS 11ax information
627 */
628 struct vdev_mlme_mgmt {
629 struct vdev_mlme_mgmt_generic generic;
630 struct vdev_mlme_mgmt_ap ap;
631 struct vdev_mlme_mgmt_sta sta;
632 struct vdev_mlme_inactivity_params inactivity_params;
633 struct vdev_mlme_rate_info rate_info;
634 struct vdev_mlme_chainmask_info chainmask_info;
635 struct vdev_mlme_powersave_info powersave_info;
636 struct vdev_mlme_beacon_info beacon_info;
637 struct vdev_mlme_mbss_11ax mbss_11ax;
638 };
639
640 /**
641 * enum beacon_update_op - Beacon update op type
642 * @BEACON_INIT: Initialize beacon
643 * @BEACON_REINIT: Re-initialize beacon
644 * @BEACON_UPDATE: Update dynamic fields of beacon
645 * @BEACON_CSA: Enable CSA IE
646 * @BEACON_FREE: Beacon buffer free
647 */
648 enum beacon_update_op {
649 BEACON_INIT,
650 BEACON_REINIT,
651 BEACON_UPDATE,
652 BEACON_CSA,
653 BEACON_FREE,
654 };
655
656 /**
657 * enum vdev_cmd_type - Command type
658 * @START_REQ: Start request
659 * @RESTART_REQ: Restart request
660 * @STOP_REQ: STOP request
661 * @DELETE_REQ: DELETE request
662 */
663 enum vdev_cmd_type {
664 START_REQ,
665 RESTART_REQ,
666 STOP_REQ,
667 DELETE_REQ,
668 };
669
670 /**
671 * enum vdev_start_resp_type - start respone type
672 * @START_RESPONSE: Start response
673 * @RESTART_RESPONSE: Restart response
674 */
675 enum vdev_start_resp_type {
676 START_RESPONSE = 0,
677 RESTART_RESPONSE,
678 };
679
680 /**
681 * struct vdev_mlme_ops - VDEV MLME operation callbacks structure
682 * @mlme_vdev_validate_basic_params: callback to validate VDEV basic params
683 * @mlme_vdev_reset_proto_params: callback to Reset protocol params
684 * @mlme_vdev_start_send: callback to initiate actions of VDEV
685 * MLME start operation
686 * @mlme_vdev_restart_send: callback to initiate actions of VDEV
687 * MLME restart operation
688 * @mlme_vdev_stop_start_send: callback to block start/restart VDEV
689 * request command
690 * @mlme_vdev_start_continue: callback to initiate operations on
691 * LMAC/FW start response
692 * @mlme_vdev_sta_conn_start: callback to initiate STA connection
693 * @mlme_vdev_start_req_failed:
694 * @mlme_vdev_up_send: callback to initiate actions of VDEV
695 * MLME up operation
696 * @mlme_vdev_notify_up_complete: callback to notify VDEV MLME on moving
697 * to UP state
698 * @mlme_vdev_notify_roam_start: callback to initiate roaming
699 * @mlme_vdev_update_beacon: callback to initiate beacon update
700 * @mlme_vdev_disconnect_peers: callback to initiate disconnection of
701 * peers
702 * @mlme_vdev_dfs_cac_timer_stop: callback to stop the DFS CAC timer
703 * @mlme_vdev_stop_send: callback to initiate actions of VDEV
704 * MLME stop operation
705 * @mlme_vdev_stop_continue: callback to initiate operations on
706 * LMAC/FW stop response
707 * @mlme_vdev_bss_peer_delete_continue: callback to initiate operations on BSS
708 * peer delete completion
709 * @mlme_vdev_down_send: callback to initiate actions of VDEV
710 * MLME down operation
711 * @mlme_vdev_notify_down_complete:
712 * @mlme_vdev_ext_stop_rsp:
713 * @mlme_vdev_ext_start_rsp:
714 * @mlme_vdev_notify_start_state_exit: callback to notify on vdev start
715 * start state exit
716 * @mlme_vdev_is_newchan_no_cac: callback to check CAC is required
717 * @mlme_vdev_ext_peer_delete_all_rsp: callback to initiate actions for
718 * vdev mlme peer delete all response
719 * @mlme_vdev_dfs_cac_wait_notify: callback to notify about CAC state
720 * @mlme_vdev_csa_complete: callback to indicate CSA complete
721 * @mlme_vdev_sta_disconn_start: callback to initiate STA disconnection
722 * @mlme_vdev_reconfig_notify: callback to notify ml reconfing link
723 * delete start operation after receive
724 * the first ml reconfig IE
725 * @mlme_vdev_reconfig_timer_complete: callback to process ml reconfing
726 * operation
727 * @mlme_vdev_reconfig_notify_standby: callback to notify to process standby
728 * link removal
729 * @mlme_vdev_notify_mlo_sync_wait_entry:
730 */
731 struct vdev_mlme_ops {
732 QDF_STATUS (*mlme_vdev_validate_basic_params)(
733 struct vdev_mlme_obj *vdev_mlme,
734 uint16_t event_data_len, void *event_data);
735 QDF_STATUS (*mlme_vdev_reset_proto_params)(
736 struct vdev_mlme_obj *vdev_mlme,
737 uint16_t event_data_len, void *event_data);
738 QDF_STATUS (*mlme_vdev_start_send)(
739 struct vdev_mlme_obj *vdev_mlme,
740 uint16_t event_data_len, void *event_data);
741 QDF_STATUS (*mlme_vdev_restart_send)(
742 struct vdev_mlme_obj *vdev_mlme,
743 uint16_t event_data_len, void *event_data);
744 QDF_STATUS (*mlme_vdev_stop_start_send)(
745 struct vdev_mlme_obj *vdev_mlme,
746 enum vdev_cmd_type type,
747 uint16_t event_data_len, void *event_data);
748 QDF_STATUS (*mlme_vdev_start_continue)(
749 struct vdev_mlme_obj *vdev_mlme,
750 uint16_t event_data_len, void *event_data);
751 QDF_STATUS (*mlme_vdev_sta_conn_start)(
752 struct vdev_mlme_obj *vdev_mlme,
753 uint16_t event_data_len, void *event_data);
754 QDF_STATUS (*mlme_vdev_start_req_failed)(
755 struct vdev_mlme_obj *vdev_mlme,
756 uint16_t event_data_len, void *event_data);
757 QDF_STATUS (*mlme_vdev_up_send)(
758 struct vdev_mlme_obj *vdev_mlme,
759 uint16_t event_data_len, void *event_data);
760 QDF_STATUS (*mlme_vdev_notify_up_complete)(
761 struct vdev_mlme_obj *vdev_mlme,
762 uint16_t event_data_len, void *event_data);
763 QDF_STATUS (*mlme_vdev_notify_roam_start)(
764 struct vdev_mlme_obj *vdev_mlme,
765 uint16_t event_data_len, void *event_data);
766 QDF_STATUS (*mlme_vdev_update_beacon)(
767 struct vdev_mlme_obj *vdev_mlme,
768 enum beacon_update_op op,
769 uint16_t event_data_len, void *event_data);
770 QDF_STATUS (*mlme_vdev_disconnect_peers)(
771 struct vdev_mlme_obj *vdev_mlme,
772 uint16_t event_data_len, void *event_data,
773 bool discon_legacy_only);
774 QDF_STATUS (*mlme_vdev_dfs_cac_timer_stop)(
775 struct vdev_mlme_obj *vdev_mlme,
776 uint16_t event_data_len, void *event_data);
777 QDF_STATUS (*mlme_vdev_stop_send)(
778 struct vdev_mlme_obj *vdev_mlme,
779 uint16_t event_data_len, void *event_data);
780 QDF_STATUS (*mlme_vdev_stop_continue)(
781 struct vdev_mlme_obj *vdev_mlme,
782 uint16_t event_data_len, void *event_data);
783 QDF_STATUS (*mlme_vdev_down_send)(
784 struct vdev_mlme_obj *vdev_mlme,
785 uint16_t event_data_len, void *event_data);
786 QDF_STATUS (*mlme_vdev_notify_down_complete)(
787 struct vdev_mlme_obj *vdev_mlme,
788 uint16_t event_data_len, void *event_data);
789 QDF_STATUS (*mlme_vdev_ext_stop_rsp)(
790 struct vdev_mlme_obj *vdev_mlme,
791 struct vdev_stop_response *rsp);
792 QDF_STATUS (*mlme_vdev_ext_start_rsp)(
793 struct vdev_mlme_obj *vdev_mlme,
794 struct vdev_start_response *rsp);
795 QDF_STATUS (*mlme_vdev_notify_start_state_exit)(
796 struct vdev_mlme_obj *vdev_mlme);
797 QDF_STATUS (*mlme_vdev_is_newchan_no_cac)(
798 struct vdev_mlme_obj *vdev_mlme);
799 QDF_STATUS (*mlme_vdev_ext_peer_delete_all_rsp)(
800 struct vdev_mlme_obj *vdev_mlme,
801 struct peer_delete_all_response *rsp);
802 QDF_STATUS (*mlme_vdev_dfs_cac_wait_notify)(
803 struct vdev_mlme_obj *vdev_mlme);
804 QDF_STATUS (*mlme_vdev_csa_complete)(
805 struct vdev_mlme_obj *vdev_mlme);
806 QDF_STATUS (*mlme_vdev_sta_disconn_start)(
807 struct vdev_mlme_obj *vdev_mlme,
808 uint16_t event_data_len, void *event_data);
809 QDF_STATUS (*mlme_vdev_reconfig_notify)(
810 struct vdev_mlme_obj *vdev_mlme,
811 uint16_t *tbtt_count, uint16_t bcn_int);
812 void (*mlme_vdev_reconfig_timer_complete)(
813 struct vdev_mlme_obj *vdev_mlme);
814 QDF_STATUS (*mlme_vdev_reconfig_notify_standby)(
815 struct vdev_mlme_obj *vdev_mlme,
816 struct ml_rv_info *reconfig_info);
817 QDF_STATUS (*mlme_vdev_notify_mlo_sync_wait_entry)(
818 struct vdev_mlme_obj *vdev_mlme);
819 };
820
821 /**
822 * struct vdev_mlme_obj - VDEV MLME component object
823 * @proto: VDEV MLME proto substructure
824 * @mgmt: VDEV MLME mgmt substructure
825 * @sm_lock: VDEV SM lock
826 * @vdev_cmd_lock: VDEV MLME command atomicity
827 * @sm_hdl: VDEV SM handle
828 * @cnx_mgr_ctx: connection manager context, valid for STA and P2P-CLI mode only
829 * @vdev: Pointer to vdev objmgr
830 * @ops: VDEV MLME callback table
831 * @ext_vdev_ptr: VDEV MLME legacy pointer
832 * @reg_tpc_obj: Regulatory transmit power info
833 * @ml_reconfig_timer: VDEV ml reconfig timer
834 * @ml_reconfig_started: Flag to indicate reconfig status for vdev
835 */
836 struct vdev_mlme_obj {
837 struct vdev_mlme_proto proto;
838 struct vdev_mlme_mgmt mgmt;
839 #ifdef VDEV_SM_LOCK_SUPPORT
840 qdf_spinlock_t sm_lock;
841 qdf_mutex_t vdev_cmd_lock;
842 #endif
843 struct wlan_sm *sm_hdl;
844 union {
845 struct cnx_mgr *cnx_mgr_ctx;
846 };
847 struct wlan_objmgr_vdev *vdev;
848 struct vdev_mlme_ops *ops;
849 mlme_vdev_ext_t *ext_vdev_ptr;
850 struct reg_tpc_power_info reg_tpc_obj;
851 qdf_timer_t ml_reconfig_timer;
852 bool ml_reconfig_started;
853 };
854
855 /**
856 * wlan_vdev_mlme_set_ssid() - set ssid
857 * @vdev: VDEV object
858 * @ssid: SSID (input)
859 * @ssid_len: Length of SSID
860 *
861 * API to set the SSID of VDEV
862 *
863 * Caller need to acquire lock with wlan_vdev_obj_lock()
864 *
865 * Return: QDF_STATUS_SUCCESS, if update is done
866 * QDF_STATUS error, if ssid length is > max ssid len
867 */
wlan_vdev_mlme_set_ssid(struct wlan_objmgr_vdev * vdev,const uint8_t * ssid,uint8_t ssid_len)868 static inline QDF_STATUS wlan_vdev_mlme_set_ssid(
869 struct wlan_objmgr_vdev *vdev,
870 const uint8_t *ssid, uint8_t ssid_len)
871 {
872 struct vdev_mlme_obj *vdev_mlme;
873
874 /* This API is invoked with lock acquired, do not add log prints */
875 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
876 if (!vdev_mlme)
877 return QDF_STATUS_E_FAILURE;
878
879 if (ssid_len <= WLAN_SSID_MAX_LEN) {
880 qdf_mem_copy(vdev_mlme->mgmt.generic.ssid, ssid, ssid_len);
881 vdev_mlme->mgmt.generic.ssid_len = ssid_len;
882 } else {
883 vdev_mlme->mgmt.generic.ssid_len = 0;
884 return QDF_STATUS_E_FAILURE;
885 }
886 return QDF_STATUS_SUCCESS;
887 }
888
889 /**
890 * wlan_vdev_mlme_get_ssid() - get ssid
891 * @vdev: VDEV object
892 * @ssid: SSID
893 * @ssid_len: Length of SSID
894 *
895 * API to get the SSID of VDEV, it updates the SSID and its length
896 * in @ssid, @ssid_len respectively
897 *
898 * Caller need to acquire lock with wlan_vdev_obj_lock()
899 *
900 * Return: SUCCESS, if update is done
901 * FAILURE, if ssid length is > max ssid len
902 */
wlan_vdev_mlme_get_ssid(struct wlan_objmgr_vdev * vdev,uint8_t * ssid,uint8_t * ssid_len)903 static inline QDF_STATUS wlan_vdev_mlme_get_ssid(
904 struct wlan_objmgr_vdev *vdev,
905 uint8_t *ssid, uint8_t *ssid_len)
906 {
907 struct vdev_mlme_obj *vdev_mlme;
908
909 /* This API is invoked with lock acquired, do not add log prints */
910 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
911 if (!vdev_mlme)
912 return QDF_STATUS_E_FAILURE;
913
914 if (vdev_mlme->mgmt.generic.ssid_len > 0) {
915 *ssid_len = vdev_mlme->mgmt.generic.ssid_len;
916 qdf_mem_copy(ssid, vdev_mlme->mgmt.generic.ssid, *ssid_len);
917 } else {
918 *ssid_len = 0;
919 return QDF_STATUS_E_FAILURE;
920 }
921 return QDF_STATUS_SUCCESS;
922 }
923
924 /**
925 * wlan_vdev_mlme_set_nss() - set NSS
926 * @vdev: VDEV object
927 * @nss: nss configured by user
928 *
929 * API to set the Number of Spatial streams
930 *
931 * Return: void
932 */
wlan_vdev_mlme_set_nss(struct wlan_objmgr_vdev * vdev,uint8_t nss)933 static inline void wlan_vdev_mlme_set_nss(
934 struct wlan_objmgr_vdev *vdev,
935 uint8_t nss)
936 {
937 struct vdev_mlme_obj *vdev_mlme;
938
939 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
940 if (!vdev_mlme)
941 return;
942
943 vdev_mlme->proto.generic.nss = nss;
944 }
945
946 /**
947 * wlan_vdev_mlme_get_nss() - get NSS
948 * @vdev: VDEV object
949 *
950 * API to get the Number of Spatial Streams
951 *
952 * Return: nss value
953 */
wlan_vdev_mlme_get_nss(struct wlan_objmgr_vdev * vdev)954 static inline uint8_t wlan_vdev_mlme_get_nss(
955 struct wlan_objmgr_vdev *vdev)
956 {
957 struct vdev_mlme_obj *vdev_mlme;
958
959 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
960 if (!vdev_mlme)
961 return 0;
962
963 return vdev_mlme->proto.generic.nss;
964 }
965
966 /**
967 * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask
968 * @vdev: VDEV object
969 * @chainmask : chainmask either configured by user or max supported
970 *
971 * API to set the Tx chainmask
972 *
973 * Return: void
974 */
wlan_vdev_mlme_set_txchainmask(struct wlan_objmgr_vdev * vdev,uint8_t chainmask)975 static inline void wlan_vdev_mlme_set_txchainmask(
976 struct wlan_objmgr_vdev *vdev,
977 uint8_t chainmask)
978 {
979 struct vdev_mlme_obj *vdev_mlme;
980
981 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
982
983 if (!vdev_mlme)
984 return;
985
986 vdev_mlme->mgmt.chainmask_info.tx_chainmask = chainmask;
987 }
988
989 /**
990 * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask
991 * @vdev: VDEV object
992 *
993 * API to get the Tx chainmask
994 *
995 * Return: Tx chainmask either configured by user or max supported
996 */
wlan_vdev_mlme_get_txchainmask(struct wlan_objmgr_vdev * vdev)997 static inline uint8_t wlan_vdev_mlme_get_txchainmask(
998 struct wlan_objmgr_vdev *vdev)
999 {
1000 struct vdev_mlme_obj *vdev_mlme;
1001
1002 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1003 if (!vdev_mlme)
1004 return 0;
1005
1006 return vdev_mlme->mgmt.chainmask_info.tx_chainmask;
1007 }
1008
1009 /**
1010 * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask
1011 * @vdev: VDEV object
1012 * @chainmask : Rx chainmask either configured by user or max supported
1013 *
1014 * API to set the Rx chainmask
1015 *
1016 * Return: void
1017 */
wlan_vdev_mlme_set_rxchainmask(struct wlan_objmgr_vdev * vdev,uint8_t chainmask)1018 static inline void wlan_vdev_mlme_set_rxchainmask(
1019 struct wlan_objmgr_vdev *vdev,
1020 uint8_t chainmask)
1021 {
1022 struct vdev_mlme_obj *vdev_mlme;
1023
1024 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1025 if (!vdev_mlme)
1026 return;
1027
1028 vdev_mlme->mgmt.chainmask_info.rx_chainmask = chainmask;
1029 }
1030
1031 /**
1032 * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask
1033 * @vdev: VDEV object
1034 *
1035 * API to get the Rx chainmask
1036 *
1037 * Return: Rx chainmask either configured by user or max supported
1038 */
wlan_vdev_mlme_get_rxchainmask(struct wlan_objmgr_vdev * vdev)1039 static inline uint8_t wlan_vdev_mlme_get_rxchainmask(
1040 struct wlan_objmgr_vdev *vdev)
1041 {
1042 struct vdev_mlme_obj *vdev_mlme;
1043
1044 /* This API is invoked with lock acquired, do not add log prints */
1045 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1046 if (!vdev_mlme)
1047 return 0;
1048
1049 return vdev_mlme->mgmt.chainmask_info.rx_chainmask;
1050 }
1051
1052 /**
1053 * wlan_vdev_mlme_set_txpower() - set tx power
1054 * @vdev: VDEV object
1055 * @txpow: tx power either configured by used or max allowed
1056 *
1057 * API to set the tx power
1058 *
1059 * Return: void
1060 */
wlan_vdev_mlme_set_txpower(struct wlan_objmgr_vdev * vdev,uint8_t txpow)1061 static inline void wlan_vdev_mlme_set_txpower(
1062 struct wlan_objmgr_vdev *vdev,
1063 uint8_t txpow)
1064 {
1065 struct vdev_mlme_obj *vdev_mlme;
1066
1067 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1068 if (!vdev_mlme)
1069 return;
1070
1071 vdev_mlme->mgmt.generic.tx_power = txpow;
1072 }
1073
1074 /**
1075 * wlan_vdev_mlme_get_txpower() - get tx power
1076 * @vdev: VDEV object
1077 *
1078 * API to get the tx power
1079 *
1080 * Return: tx power either configured by used or max allowed
1081 */
wlan_vdev_mlme_get_txpower(struct wlan_objmgr_vdev * vdev)1082 static inline uint8_t wlan_vdev_mlme_get_txpower(
1083 struct wlan_objmgr_vdev *vdev)
1084 {
1085 struct vdev_mlme_obj *vdev_mlme;
1086
1087 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1088 if (!vdev_mlme)
1089 return 0;
1090
1091 return vdev_mlme->mgmt.generic.tx_power;
1092 }
1093
1094 /**
1095 * wlan_vdev_mlme_set_maxrate() - set max rate
1096 * @vdev: VDEV object
1097 * @maxrate: configured by used or based on configured mode
1098 *
1099 * API to set the max rate the vdev supports
1100 *
1101 * Return: void
1102 */
wlan_vdev_mlme_set_maxrate(struct wlan_objmgr_vdev * vdev,uint32_t maxrate)1103 static inline void wlan_vdev_mlme_set_maxrate(
1104 struct wlan_objmgr_vdev *vdev,
1105 uint32_t maxrate)
1106 {
1107 struct vdev_mlme_obj *vdev_mlme;
1108
1109 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1110 if (!vdev_mlme)
1111 return;
1112
1113 vdev_mlme->mgmt.rate_info.max_rate = maxrate;
1114 }
1115
1116 /**
1117 * wlan_vdev_mlme_get_maxrate() - get max rate
1118 * @vdev: VDEV object
1119 *
1120 * API to get the max rate the vdev supports
1121 *
1122 * Return: configured by used or based on configured mode
1123 */
wlan_vdev_mlme_get_maxrate(struct wlan_objmgr_vdev * vdev)1124 static inline uint32_t wlan_vdev_mlme_get_maxrate(
1125 struct wlan_objmgr_vdev *vdev)
1126 {
1127 struct vdev_mlme_obj *vdev_mlme;
1128
1129 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1130 if (!vdev_mlme)
1131 return 0;
1132
1133 return vdev_mlme->mgmt.rate_info.max_rate;
1134 }
1135
1136 /**
1137 * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate
1138 * @vdev: VDEV object
1139 * @txmgmtrate: Tx Mgmt rate
1140 *
1141 * API to set Mgmt Tx rate
1142 *
1143 * Return: void
1144 */
wlan_vdev_mlme_set_txmgmtrate(struct wlan_objmgr_vdev * vdev,uint32_t txmgmtrate)1145 static inline void wlan_vdev_mlme_set_txmgmtrate(
1146 struct wlan_objmgr_vdev *vdev,
1147 uint32_t txmgmtrate)
1148 {
1149 struct vdev_mlme_obj *vdev_mlme;
1150
1151 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1152 if (!vdev_mlme)
1153 return;
1154
1155 vdev_mlme->mgmt.rate_info.tx_mgmt_rate = txmgmtrate;
1156 }
1157
1158 /**
1159 * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate
1160 * @vdev: VDEV object
1161 *
1162 * API to get Mgmt Tx rate
1163 *
1164 * Return: Tx Mgmt rate
1165 */
wlan_vdev_mlme_get_txmgmtrate(struct wlan_objmgr_vdev * vdev)1166 static inline uint32_t wlan_vdev_mlme_get_txmgmtrate(
1167 struct wlan_objmgr_vdev *vdev)
1168 {
1169 struct vdev_mlme_obj *vdev_mlme;
1170
1171 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1172 if (!vdev_mlme)
1173 return 0;
1174
1175 return vdev_mlme->mgmt.rate_info.tx_mgmt_rate;
1176 }
1177
1178 /**
1179 * wlan_vdev_mlme_is_special_vdev() - check given vdev is a special vdev
1180 * @vdev: VDEV object
1181 *
1182 * API to check given vdev is a special vdev.
1183 *
1184 * Return: true if given vdev is special vdev, else false
1185 */
wlan_vdev_mlme_is_special_vdev(struct wlan_objmgr_vdev * vdev)1186 static inline bool wlan_vdev_mlme_is_special_vdev(
1187 struct wlan_objmgr_vdev *vdev)
1188 {
1189 struct vdev_mlme_obj *vdev_mlme;
1190
1191 if (!vdev)
1192 return false;
1193
1194 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1195 if (!vdev_mlme)
1196 return false;
1197
1198 return vdev_mlme->mgmt.generic.special_vdev_mode;
1199 }
1200
1201 /**
1202 * wlan_vdev_mlme_is_sap_go_move_before_sta() - check if SAP / GO
1203 * moved to new channel before STA's movement upon receiving CSA
1204 *
1205 * @vdev: VDEV object
1206 *
1207 * API to check in STA+SAP/GO SCC concurrency, whether SAP / GO moved before
1208 * STA's movement on receiving CSA from peer AP to connected STA.
1209 *
1210 * Return: true if SAP / GO moved before STA else false
1211 */
1212 static inline
wlan_vdev_mlme_is_sap_go_move_before_sta(struct wlan_objmgr_vdev * vdev)1213 bool wlan_vdev_mlme_is_sap_go_move_before_sta(struct wlan_objmgr_vdev *vdev)
1214 {
1215 struct vdev_mlme_obj *vdev_mlme;
1216
1217 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1218 if (!vdev_mlme)
1219 return false;
1220
1221 return vdev_mlme->mgmt.generic.is_sap_go_moved_1st_on_csa;
1222 }
1223
1224 /**
1225 * wlan_vdev_mlme_set_sap_go_move_before_sta() - Set flag if SAP / GO
1226 * moves to new channel before STA's movement upon receiving CSA
1227 *
1228 * @vdev: VDEV object
1229 * @sap_go_moved_before_sta: Flag to indicate True when SAP / GO
1230 * moves before STA
1231 *
1232 * API to set True in STA+SAP/GO SCC concurrency, when SAP / GO moves before
1233 * STA's movement on receiving CSA from peer AP to connected STA.
1234 *
1235 * Return: void
1236 */
1237 static inline
wlan_vdev_mlme_set_sap_go_move_before_sta(struct wlan_objmgr_vdev * vdev,bool sap_go_moved_before_sta)1238 void wlan_vdev_mlme_set_sap_go_move_before_sta(struct wlan_objmgr_vdev *vdev,
1239 bool sap_go_moved_before_sta)
1240 {
1241 struct vdev_mlme_obj *vdev_mlme;
1242
1243 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1244 if (!vdev_mlme)
1245 return;
1246
1247 vdev_mlme->mgmt.generic.is_sap_go_moved_1st_on_csa =
1248 sap_go_moved_before_sta;
1249 }
1250
1251 #ifdef WLAN_FEATURE_11AX
1252 /**
1253 * wlan_vdev_mlme_set_he_mcs_12_13_map() - set he mcs12/13 map
1254 * @vdev: VDEV object
1255 * @he_mcs_12_13_map: he mcs12/13 map from self&peer
1256 *
1257 * API to set he mcs 12/13 map
1258 *
1259 * Return: void
1260 */
wlan_vdev_mlme_set_he_mcs_12_13_map(struct wlan_objmgr_vdev * vdev,uint16_t he_mcs_12_13_map)1261 static inline void wlan_vdev_mlme_set_he_mcs_12_13_map(
1262 struct wlan_objmgr_vdev *vdev,
1263 uint16_t he_mcs_12_13_map)
1264 {
1265 struct vdev_mlme_obj *vdev_mlme;
1266
1267 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1268 if (!vdev_mlme)
1269 return;
1270
1271 vdev_mlme->mgmt.sta.he_mcs_12_13_map = he_mcs_12_13_map;
1272 }
1273
1274 /**
1275 * wlan_vdev_mlme_get_he_mcs_12_13_map() - get he mcs12/13 map
1276 * @vdev: VDEV object
1277 *
1278 * API to get he mcs12/13 support capability
1279 *
1280 * Return: he mcs12/13 map
1281 */
wlan_vdev_mlme_get_he_mcs_12_13_map(struct wlan_objmgr_vdev * vdev)1282 static inline uint16_t wlan_vdev_mlme_get_he_mcs_12_13_map(
1283 struct wlan_objmgr_vdev *vdev)
1284 {
1285 struct vdev_mlme_obj *vdev_mlme;
1286
1287 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1288 if (!vdev_mlme)
1289 return 0;
1290
1291 return vdev_mlme->mgmt.sta.he_mcs_12_13_map;
1292 }
1293
1294 #ifdef WLAN_FEATURE_SR
1295 /**
1296 * wlan_vdev_mlme_get_sr_ctrl() - get spatial reuse SR control
1297 * @vdev: VDEV object
1298 *
1299 * API to retrieve the spatial reuse SR control from VDEV
1300 *
1301 * Caller need to acquire lock with wlan_vdev_obj_lock()
1302 *
1303 * Return: SR control
1304 */
wlan_vdev_mlme_get_sr_ctrl(struct wlan_objmgr_vdev * vdev)1305 static inline uint8_t wlan_vdev_mlme_get_sr_ctrl(struct wlan_objmgr_vdev *vdev)
1306 {
1307 struct vdev_mlme_obj *vdev_mlme;
1308
1309 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1310 if (!vdev_mlme)
1311 return 0;
1312
1313 return vdev_mlme->mgmt.generic.he_spr_sr_ctrl;
1314 }
1315
1316 /**
1317 * wlan_vdev_mlme_get_non_srg_pd_offset() - get spatial reuse non srg pd offset
1318 * @vdev: VDEV object
1319 *
1320 * API to retrieve the spatial reuse pd offset from VDEV
1321 *
1322 * Return: max non srg pd offset
1323 */
wlan_vdev_mlme_get_non_srg_pd_offset(struct wlan_objmgr_vdev * vdev)1324 static inline uint8_t wlan_vdev_mlme_get_non_srg_pd_offset(
1325 struct wlan_objmgr_vdev *vdev)
1326 {
1327 struct vdev_mlme_obj *vdev_mlme;
1328
1329 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1330 if (!vdev_mlme)
1331 return 0;
1332
1333 return vdev_mlme->mgmt.generic.he_spr_non_srg_pd_max_offset;
1334 }
1335
1336 /**
1337 * wlan_vdev_mlme_get_he_spr_enabled() - spatial reuse enabled or not
1338 * @vdev: VDEV object
1339 *
1340 * API to check whether the spatial reuse enabled or not
1341 *
1342 * Return: true if Spatial reuse enabled, false if not
1343 */
wlan_vdev_mlme_get_he_spr_enabled(struct wlan_objmgr_vdev * vdev)1344 static inline bool wlan_vdev_mlme_get_he_spr_enabled(
1345 struct wlan_objmgr_vdev *vdev)
1346 {
1347 struct vdev_mlme_obj *vdev_mlme;
1348
1349 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1350 if (!vdev_mlme)
1351 return false;
1352
1353 return vdev_mlme->mgmt.generic.he_spr_enabled;
1354 }
1355
1356 /**
1357 * wlan_vdev_mlme_is_sr_disable_due_conc() - spatial reuse disabled due
1358 * to concurrency
1359 * @vdev: VDEV object
1360 *
1361 * API to check whether the spatial reuse disabled due to concurrency or not
1362 *
1363 * Caller need to acquire lock with wlan_vdev_obj_lock()
1364 *
1365 * Return:
1366 * true/false: true if spatial reuse disabled due to concurrency else false
1367 */
1368 static inline
wlan_vdev_mlme_is_sr_disable_due_conc(struct wlan_objmgr_vdev * vdev)1369 bool wlan_vdev_mlme_is_sr_disable_due_conc(struct wlan_objmgr_vdev *vdev)
1370 {
1371 struct vdev_mlme_obj *vdev_mlme;
1372
1373 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1374 if (!vdev_mlme)
1375 return false;
1376
1377 return vdev_mlme->mgmt.generic.he_spr_disabled_due_conc;
1378 }
1379
1380 /**
1381 * wlan_vdev_mlme_is_sr_prohibit_en() - spatial reuse PD prohibit enabled
1382 * / disabled (HE_SIGA_Val15_Allowed)
1383 * @vdev: VDEV object
1384 *
1385 * API to check whether the spatial reuse PD prohibit is enabled / disabled
1386 *
1387 * Caller need to acquire lock with wlan_vdev_obj_lock()
1388 *
1389 * Return: true/false: Spatial reuse PD prohibit enabled / disabled
1390 */
1391 static inline
wlan_vdev_mlme_is_sr_prohibit_en(struct wlan_objmgr_vdev * vdev)1392 bool wlan_vdev_mlme_is_sr_prohibit_en(struct wlan_objmgr_vdev *vdev)
1393 {
1394 struct vdev_mlme_obj *vdev_mlme;
1395
1396 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1397 if (!vdev_mlme)
1398 return false;
1399
1400 return vdev_mlme->mgmt.generic.sr_prohibit_enabled;
1401 }
1402
1403 /**
1404 * wlan_vdev_mlme_set_sr_ctrl() - set spatial reuse SR control
1405 * @vdev: VDEV object
1406 * @sr_ctrl: value to set
1407 *
1408 * API to set the spatial reuse SR control
1409 *
1410 * Caller need to acquire lock with wlan_vdev_obj_lock()
1411 *
1412 * Return: void
1413 */
wlan_vdev_mlme_set_sr_ctrl(struct wlan_objmgr_vdev * vdev,uint8_t sr_ctrl)1414 static inline void wlan_vdev_mlme_set_sr_ctrl(struct wlan_objmgr_vdev *vdev,
1415 uint8_t sr_ctrl)
1416 {
1417 struct vdev_mlme_obj *vdev_mlme;
1418
1419 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1420 if (!vdev_mlme)
1421 return;
1422
1423 vdev_mlme->mgmt.generic.he_spr_sr_ctrl = sr_ctrl;
1424 }
1425
1426 /**
1427 * wlan_vdev_mlme_set_non_srg_pd_offset() - set spatial reuse non srg
1428 * pd max offset
1429 * @vdev: VDEV object
1430 * @non_srg_pd_max_offset: value to set
1431 *
1432 * API to set the spatial reuse pd max offset
1433 *
1434 * Return: void
1435 */
1436 static inline void
wlan_vdev_mlme_set_non_srg_pd_offset(struct wlan_objmgr_vdev * vdev,uint8_t non_srg_pd_max_offset)1437 wlan_vdev_mlme_set_non_srg_pd_offset(struct wlan_objmgr_vdev *vdev,
1438 uint8_t non_srg_pd_max_offset)
1439 {
1440 struct vdev_mlme_obj *vdev_mlme;
1441
1442 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1443 if (!vdev_mlme)
1444 return;
1445
1446 vdev_mlme->mgmt.generic.he_spr_non_srg_pd_max_offset =
1447 non_srg_pd_max_offset;
1448 }
1449
1450 /**
1451 * wlan_vdev_mlme_set_he_spr_enabled() - set spatial reuse enabled
1452 * @vdev: VDEV object
1453 * @enable_he_spr: value to set
1454 *
1455 * API to set the spatial reuse enabled
1456 *
1457 * Return: void
1458 */
wlan_vdev_mlme_set_he_spr_enabled(struct wlan_objmgr_vdev * vdev,bool enable_he_spr)1459 static inline void wlan_vdev_mlme_set_he_spr_enabled(
1460 struct wlan_objmgr_vdev *vdev,
1461 bool enable_he_spr)
1462 {
1463 struct vdev_mlme_obj *vdev_mlme;
1464
1465 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1466 if (!vdev_mlme)
1467 return;
1468
1469 vdev_mlme->mgmt.generic.he_spr_enabled = enable_he_spr;
1470 }
1471
1472 /**
1473 * wlan_vdev_mlme_set_sr_disable_due_conc() - set spatial reuse disabled due
1474 * to concurrency
1475 * @vdev: VDEV object
1476 * @he_spr_disabled_due_conc: value to set
1477 *
1478 * API to set the spatial reuse disabled due to concurrency
1479 *
1480 * Caller need to acquire lock with wlan_vdev_obj_lock()
1481 *
1482 * Return: void
1483 */
1484 static inline
wlan_vdev_mlme_set_sr_disable_due_conc(struct wlan_objmgr_vdev * vdev,bool he_spr_disabled_due_conc)1485 void wlan_vdev_mlme_set_sr_disable_due_conc(struct wlan_objmgr_vdev *vdev,
1486 bool he_spr_disabled_due_conc)
1487 {
1488 struct vdev_mlme_obj *vdev_mlme;
1489
1490 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1491 if (!vdev_mlme)
1492 return;
1493
1494 vdev_mlme->mgmt.generic.he_spr_disabled_due_conc =
1495 he_spr_disabled_due_conc;
1496 }
1497
1498 /**
1499 * wlan_vdev_mlme_set_sr_prohibit_en() - set spatial reuse PD prohibit enabled
1500 * / disabled (HE_SIGA_Val15_Allowed)
1501 * @vdev: VDEV object
1502 * @sr_prohibit_enabled: True / False - PD Prohibit enabled / disabled
1503 *
1504 * API to set spatial reuse PD prohibit enabled / disabled
1505 *
1506 * Caller need to acquire lock with wlan_vdev_obj_lock()
1507 *
1508 * Return: void
1509 */
1510 static inline
wlan_vdev_mlme_set_sr_prohibit_en(struct wlan_objmgr_vdev * vdev,bool sr_prohibit_enabled)1511 void wlan_vdev_mlme_set_sr_prohibit_en(struct wlan_objmgr_vdev *vdev,
1512 bool sr_prohibit_enabled)
1513 {
1514 struct vdev_mlme_obj *vdev_mlme;
1515
1516 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1517 if (!vdev_mlme)
1518 return;
1519
1520 vdev_mlme->mgmt.generic.sr_prohibit_enabled = sr_prohibit_enabled;
1521 }
1522
1523 /**
1524 * wlan_vdev_mlme_set_srg_pd_offset() - set spatial reuse SRG pd max/min offset
1525 * @vdev: VDEV object
1526 * @srg_max_pd_offset: SRG max pd offset
1527 * @srg_min_pd_offset: SRG min pd offset
1528 *
1529 * API to set the spatial reuse SRG pd min max offset
1530 *
1531 * Return: void
1532 */
1533 static inline
wlan_vdev_mlme_set_srg_pd_offset(struct wlan_objmgr_vdev * vdev,uint8_t srg_max_pd_offset,uint8_t srg_min_pd_offset)1534 void wlan_vdev_mlme_set_srg_pd_offset(struct wlan_objmgr_vdev *vdev,
1535 uint8_t srg_max_pd_offset,
1536 uint8_t srg_min_pd_offset)
1537 {
1538 struct vdev_mlme_obj *vdev_mlme;
1539
1540 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1541 if (!vdev_mlme)
1542 return;
1543
1544 vdev_mlme->mgmt.generic.he_spr_srg_max_pd_offset = srg_max_pd_offset;
1545 vdev_mlme->mgmt.generic.he_spr_srg_min_pd_offset = srg_min_pd_offset;
1546 }
1547
1548 /**
1549 * wlan_vdev_mlme_get_srg_pd_offset() - get spatial reuse SRG pd min/max offset
1550 * @vdev: VDEV object
1551 * @srg_max_pd_offset: SRG max pd offset
1552 * @srg_min_pd_offset: SRG min pd offset
1553 *
1554 * API to set the spatial reuse SRG pd min max offset
1555 *
1556 * Return: void
1557 */
1558 static inline
wlan_vdev_mlme_get_srg_pd_offset(struct wlan_objmgr_vdev * vdev,uint8_t * srg_max_pd_offset,uint8_t * srg_min_pd_offset)1559 void wlan_vdev_mlme_get_srg_pd_offset(struct wlan_objmgr_vdev *vdev,
1560 uint8_t *srg_max_pd_offset,
1561 uint8_t *srg_min_pd_offset)
1562 {
1563 struct vdev_mlme_obj *vdev_mlme;
1564
1565 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1566 if (!vdev_mlme)
1567 return;
1568
1569 *srg_max_pd_offset = vdev_mlme->mgmt.generic.he_spr_srg_max_pd_offset;
1570 *srg_min_pd_offset = vdev_mlme->mgmt.generic.he_spr_srg_min_pd_offset;
1571 }
1572
1573 /**
1574 * wlan_vdev_mlme_set_srg_bss_color_bit_map() - set spatial reuse bss
1575 * color bitmap
1576 * @vdev: VDEV object
1577 * @srg_bss_color: SRG BSS color bitmap
1578 *
1579 * API to set the spatial reuse bss color bit map
1580 *
1581 * Return: void
1582 */
1583 static inline
wlan_vdev_mlme_set_srg_bss_color_bit_map(struct wlan_objmgr_vdev * vdev,uint64_t srg_bss_color)1584 void wlan_vdev_mlme_set_srg_bss_color_bit_map(struct wlan_objmgr_vdev *vdev,
1585 uint64_t srg_bss_color)
1586 {
1587 struct vdev_mlme_obj *vdev_mlme;
1588
1589 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1590 if (!vdev_mlme)
1591 return;
1592
1593 vdev_mlme->mgmt.generic.srg_bss_color = srg_bss_color;
1594 }
1595
1596 /**
1597 * wlan_vdev_mlme_set_srg_partial_bssid_bit_map() - set spatial reuse
1598 * srg partial bitmap
1599 * @vdev: VDEV object
1600 * @srg_partial_bssid: SRG partial BSSID bitmap
1601 *
1602 * API to set the spatial reuse partial bssid bitmap
1603 *
1604 * Return: void
1605 */
1606 static inline
wlan_vdev_mlme_set_srg_partial_bssid_bit_map(struct wlan_objmgr_vdev * vdev,uint64_t srg_partial_bssid)1607 void wlan_vdev_mlme_set_srg_partial_bssid_bit_map(struct wlan_objmgr_vdev *vdev,
1608 uint64_t srg_partial_bssid)
1609 {
1610 struct vdev_mlme_obj *vdev_mlme;
1611
1612 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1613 if (!vdev_mlme)
1614 return;
1615
1616 vdev_mlme->mgmt.generic.srg_partial_bssid = srg_partial_bssid;
1617 }
1618
1619 /**
1620 * wlan_vdev_mlme_get_srg_bss_color_bit_map() - get spatial reuse bss
1621 * colorbitmap
1622 * @vdev: VDEV object
1623 * @srg_bss_color: SRG BSS color bitmap
1624 *
1625 * API to get the spatial reuse bss color bit map
1626 *
1627 * Return: void
1628 */
1629 static inline
wlan_vdev_mlme_get_srg_bss_color_bit_map(struct wlan_objmgr_vdev * vdev,uint64_t * srg_bss_color)1630 void wlan_vdev_mlme_get_srg_bss_color_bit_map(struct wlan_objmgr_vdev *vdev,
1631 uint64_t *srg_bss_color)
1632 {
1633 struct vdev_mlme_obj *vdev_mlme;
1634
1635 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1636 if (!vdev_mlme)
1637 return;
1638
1639 *srg_bss_color = vdev_mlme->mgmt.generic.srg_bss_color;
1640 }
1641
1642 /**
1643 * wlan_vdev_mlme_get_srg_partial_bssid_bit_map() - get spatial reuse
1644 * srg partial bitmap
1645 * @vdev: VDEV object
1646 * @srg_partial_bssid: SRG partial BSSID bitmap
1647 *
1648 * API to get the spatial reuse partial bssid bitmap
1649 *
1650 * Return: void
1651 */
1652 static inline void
wlan_vdev_mlme_get_srg_partial_bssid_bit_map(struct wlan_objmgr_vdev * vdev,uint64_t * srg_partial_bssid)1653 wlan_vdev_mlme_get_srg_partial_bssid_bit_map(struct wlan_objmgr_vdev *vdev,
1654 uint64_t *srg_partial_bssid)
1655 {
1656 struct vdev_mlme_obj *vdev_mlme;
1657
1658 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1659 if (!vdev_mlme)
1660 return;
1661
1662 *srg_partial_bssid = vdev_mlme->mgmt.generic.srg_partial_bssid;
1663 }
1664
1665 /**
1666 * wlan_vdev_mlme_get_current_non_srg_pd_threshold() - get current non srg pd
1667 * threshold
1668 * @vdev: VDEV object
1669 * @non_srg_pd_threshold: NON-SRG pd threshold
1670 *
1671 * API to get non srg pd threshold
1672 *
1673 * Return: void
1674 */
1675 static inline void
wlan_vdev_mlme_get_current_non_srg_pd_threshold(struct wlan_objmgr_vdev * vdev,int32_t * non_srg_pd_threshold)1676 wlan_vdev_mlme_get_current_non_srg_pd_threshold(struct wlan_objmgr_vdev *vdev,
1677 int32_t *non_srg_pd_threshold)
1678 {
1679 struct vdev_mlme_obj *vdev_mlme;
1680
1681 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1682 if (!vdev_mlme)
1683 return;
1684
1685 *non_srg_pd_threshold =
1686 vdev_mlme->mgmt.generic.he_curr_non_srg_pd_threshold;
1687 }
1688
1689 /**
1690 * wlan_vdev_mlme_get_current_srg_pd_threshold() - get current srg pd threshold
1691 * @vdev: VDEV object
1692 * @srg_pd_threshold: SRG pd threshold
1693 *
1694 * API to get srg pd threshold
1695 *
1696 * Return: void
1697 */
1698 static inline void
wlan_vdev_mlme_get_current_srg_pd_threshold(struct wlan_objmgr_vdev * vdev,int32_t * srg_pd_threshold)1699 wlan_vdev_mlme_get_current_srg_pd_threshold(struct wlan_objmgr_vdev *vdev,
1700 int32_t *srg_pd_threshold)
1701 {
1702 struct vdev_mlme_obj *vdev_mlme;
1703
1704 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1705 if (!vdev_mlme)
1706 return;
1707
1708 *srg_pd_threshold =
1709 vdev_mlme->mgmt.generic.he_curr_srg_pd_threshold;
1710 }
1711
1712 /**
1713 * wlan_vdev_mlme_set_current_non_srg_pd_threshold() - set current non srg pd
1714 * threshold
1715 * @vdev: VDEV object
1716 * @non_srg_pd_threshold: NON-SRG pd threshold
1717 *
1718 * API to set non srg pd threshold
1719 *
1720 * Return: void
1721 */
1722 static inline void
wlan_vdev_mlme_set_current_non_srg_pd_threshold(struct wlan_objmgr_vdev * vdev,int32_t non_srg_pd_threshold)1723 wlan_vdev_mlme_set_current_non_srg_pd_threshold(struct wlan_objmgr_vdev *vdev,
1724 int32_t non_srg_pd_threshold)
1725 {
1726 struct vdev_mlme_obj *vdev_mlme;
1727
1728 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1729 if (!vdev_mlme)
1730 return;
1731
1732 vdev_mlme->mgmt.generic.he_curr_non_srg_pd_threshold =
1733 non_srg_pd_threshold;
1734 }
1735
1736 /**
1737 * wlan_vdev_mlme_set_current_srg_pd_threshold() - set current srg pd threshold
1738 * @vdev: VDEV object
1739 * @srg_pd_threshold: SRG pd threshold
1740 *
1741 * API to set srg pd threshold
1742 *
1743 * Return: void
1744 */
1745 static inline void
wlan_vdev_mlme_set_current_srg_pd_threshold(struct wlan_objmgr_vdev * vdev,int32_t srg_pd_threshold)1746 wlan_vdev_mlme_set_current_srg_pd_threshold(struct wlan_objmgr_vdev *vdev,
1747 int32_t srg_pd_threshold)
1748 {
1749 struct vdev_mlme_obj *vdev_mlme;
1750
1751 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1752 if (!vdev_mlme)
1753 return;
1754 vdev_mlme->mgmt.generic.he_curr_srg_pd_threshold =
1755 srg_pd_threshold;
1756 }
1757
1758 /**
1759 * wlan_vdev_mlme_set_pd_threshold_present() - set is PD threshold
1760 * present or not.
1761 * @vdev: VDEV object
1762 * @is_pd_threshold_present: is PD threshold present
1763 *
1764 * API to set pd threshold present flag
1765 *
1766 * Return: void
1767 */
1768 static inline void
wlan_vdev_mlme_set_pd_threshold_present(struct wlan_objmgr_vdev * vdev,bool is_pd_threshold_present)1769 wlan_vdev_mlme_set_pd_threshold_present(struct wlan_objmgr_vdev *vdev,
1770 bool is_pd_threshold_present)
1771 {
1772 struct vdev_mlme_obj *vdev_mlme;
1773
1774 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1775 if (!vdev_mlme)
1776 return;
1777 vdev_mlme->mgmt.generic.is_pd_threshold_present =
1778 is_pd_threshold_present;
1779 }
1780
1781 /**
1782 * wlan_vdev_mlme_get_pd_threshold_present() - get is PD threshold
1783 * present or not.
1784 * @vdev: VDEV object
1785 * @is_pd_threshold_present: is PD threshold present
1786 *
1787 * API to get pd threshold present flag
1788 *
1789 * Return: void
1790 */
1791 static inline void
wlan_vdev_mlme_get_pd_threshold_present(struct wlan_objmgr_vdev * vdev,bool * is_pd_threshold_present)1792 wlan_vdev_mlme_get_pd_threshold_present(struct wlan_objmgr_vdev *vdev,
1793 bool *is_pd_threshold_present)
1794 {
1795 struct vdev_mlme_obj *vdev_mlme;
1796
1797 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1798 if (!vdev_mlme) {
1799 *is_pd_threshold_present = false;
1800 return;
1801 }
1802 *is_pd_threshold_present =
1803 vdev_mlme->mgmt.generic.is_pd_threshold_present;
1804 }
1805 #else
wlan_vdev_mlme_get_sr_ctrl(struct wlan_objmgr_vdev * vdev)1806 static inline uint8_t wlan_vdev_mlme_get_sr_ctrl(struct wlan_objmgr_vdev *vdev)
1807 {
1808 return 0;
1809 }
1810
wlan_vdev_mlme_get_non_srg_pd_offset(struct wlan_objmgr_vdev * vdev)1811 static inline uint8_t wlan_vdev_mlme_get_non_srg_pd_offset(
1812 struct wlan_objmgr_vdev *vdev)
1813 {
1814 return 0;
1815 }
1816
wlan_vdev_mlme_get_he_spr_enabled(struct wlan_objmgr_vdev * vdev)1817 static inline bool wlan_vdev_mlme_get_he_spr_enabled(
1818 struct wlan_objmgr_vdev *vdev)
1819 {
1820 return 0;
1821 }
1822
1823 static inline
wlan_vdev_mlme_is_sr_disable_due_conc(struct wlan_objmgr_vdev * vdev)1824 bool wlan_vdev_mlme_is_sr_disable_due_conc(struct wlan_objmgr_vdev *vdev)
1825 {
1826 return false;
1827 }
1828
1829 static inline
wlan_vdev_mlme_is_sr_prohibit_en(struct wlan_objmgr_vdev * vdev)1830 bool wlan_vdev_mlme_is_sr_prohibit_en(struct wlan_objmgr_vdev *vdev)
1831 {
1832 return false;
1833 }
1834
wlan_vdev_mlme_set_sr_ctrl(struct wlan_objmgr_vdev * vdev,uint8_t sr_ctrl)1835 static inline void wlan_vdev_mlme_set_sr_ctrl(struct wlan_objmgr_vdev *vdev,
1836 uint8_t sr_ctrl)
1837 {
1838 }
1839
1840 static inline void
wlan_vdev_mlme_set_non_srg_pd_offset(struct wlan_objmgr_vdev * vdev,uint8_t non_srg_pd_max_offset)1841 wlan_vdev_mlme_set_non_srg_pd_offset(struct wlan_objmgr_vdev *vdev,
1842 uint8_t non_srg_pd_max_offset)
1843 {
1844 }
1845
wlan_vdev_mlme_set_he_spr_enabled(struct wlan_objmgr_vdev * vdev,bool enable_he_spr)1846 static inline void wlan_vdev_mlme_set_he_spr_enabled(
1847 struct wlan_objmgr_vdev *vdev,
1848 bool enable_he_spr)
1849 {
1850 }
1851
1852 static inline
wlan_vdev_mlme_set_sr_disable_due_conc(struct wlan_objmgr_vdev * vdev,bool he_spr_disabled_due_conc)1853 void wlan_vdev_mlme_set_sr_disable_due_conc(struct wlan_objmgr_vdev *vdev,
1854 bool he_spr_disabled_due_conc)
1855 {
1856 }
1857
1858 static inline
wlan_vdev_mlme_set_sr_prohibit_en(struct wlan_objmgr_vdev * vdev,bool sr_prohibit_enabled)1859 void wlan_vdev_mlme_set_sr_prohibit_en(struct wlan_objmgr_vdev *vdev,
1860 bool sr_prohibit_enabled)
1861 {
1862 }
1863 #endif
1864 #else
wlan_vdev_mlme_set_he_mcs_12_13_map(struct wlan_objmgr_vdev * vdev,uint16_t he_mcs_12_13_map)1865 static inline void wlan_vdev_mlme_set_he_mcs_12_13_map(
1866 struct wlan_objmgr_vdev *vdev,
1867 uint16_t he_mcs_12_13_map)
1868 {
1869 }
1870
wlan_vdev_mlme_get_he_mcs_12_13_map(struct wlan_objmgr_vdev * vdev)1871 static inline uint16_t wlan_vdev_mlme_get_he_mcs_12_13_map(
1872 struct wlan_objmgr_vdev *vdev)
1873 {
1874 return 0;
1875 }
1876
1877 #endif
1878
1879 /**
1880 * wlan_vdev_mlme_set_aid_mgr() - set aid mgr
1881 * @vdev: VDEV object
1882 * @aid_mgr: AID mgr
1883 *
1884 * API to set AID mgr in VDEV MLME cmpt object
1885 *
1886 * Return: void
1887 */
wlan_vdev_mlme_set_aid_mgr(struct wlan_objmgr_vdev * vdev,struct wlan_vdev_aid_mgr * aid_mgr)1888 static inline void wlan_vdev_mlme_set_aid_mgr(
1889 struct wlan_objmgr_vdev *vdev,
1890 struct wlan_vdev_aid_mgr *aid_mgr)
1891 {
1892 struct vdev_mlme_obj *vdev_mlme;
1893
1894 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1895 if (!vdev_mlme)
1896 return;
1897
1898 vdev_mlme->mgmt.ap.aid_mgr = aid_mgr;
1899 }
1900
1901 /**
1902 * wlan_vdev_mlme_get_aid_mgr() - get aid mgr
1903 * @vdev: VDEV object
1904 *
1905 * API to get AID mgr in VDEV MLME cmpt object
1906 *
1907 * Return: aid_mgr
1908 */
wlan_vdev_mlme_get_aid_mgr(struct wlan_objmgr_vdev * vdev)1909 static inline struct wlan_vdev_aid_mgr *wlan_vdev_mlme_get_aid_mgr(
1910 struct wlan_objmgr_vdev *vdev)
1911 {
1912 struct vdev_mlme_obj *vdev_mlme;
1913
1914 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1915 if (!vdev_mlme)
1916 return NULL;
1917
1918 return vdev_mlme->mgmt.ap.aid_mgr;
1919 }
1920
1921 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
1922 /**
1923 * vdev_mgr_cdp_vdev_attach() - MLME API to attach CDP vdev
1924 * @mlme_obj: pointer to vdev_mlme_obj
1925 *
1926 * Return: QDF_STATUS - Success or Failure
1927 */
1928 QDF_STATUS vdev_mgr_cdp_vdev_attach(struct vdev_mlme_obj *mlme_obj);
1929
1930 /**
1931 * vdev_mgr_cdp_vdev_detach() - MLME API to detach CDP vdev
1932 * @mlme_obj: pointer to vdev_mlme_obj
1933 *
1934 * Return: QDF_STATUS - Success or Failure
1935 */
1936 QDF_STATUS vdev_mgr_cdp_vdev_detach(struct vdev_mlme_obj *mlme_obj);
1937 #endif
1938 #endif
1939