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