1  /*
2   * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  
20  /**
21   * DOC: Declares VDEV MLME SM APIs and structures
22   */
23  
24  #ifndef _VDEV_MLME_SM_H_
25  #define _VDEV_MLME_SM_H_
26  
27  #ifdef WLAN_FEATURE_11BE_MLO
28  #include <wlan_mlo_mgr_ap.h>
29  #include <wlan_mlo_mgr_sta.h>
30  #endif
31  #include <wlan_dfs_utils_api.h>
32  
33  /**
34   * mlme_vdev_sm_deliver_event() - Delivers event to VDEV MLME SM
35   * @vdev_mlme: MLME VDEV comp object
36   * @event: MLME event
37   * @event_data_len: data size
38   * @event_data: event data
39   *
40   * API to dispatch event to VDEV MLME SM
41   *
42   * Return: SUCCESS: on handling event
43   *         FAILURE: on ignoring the event
44   */
45  QDF_STATUS mlme_vdev_sm_deliver_event(struct vdev_mlme_obj *vdev_mlme,
46  				      enum wlan_vdev_sm_evt event,
47  				      uint16_t event_data_len,
48  				      void *event_data);
49  
50  /**
51   * mlme_vdev_sm_print_state_event() - Prints the state/substate, event
52   * @vdev_mlme: MLME VDEV comp object
53   * @event: MLME event
54   *
55   * API to print current state/substate, events in readable format
56   *
57   * Return: void
58   */
59  void mlme_vdev_sm_print_state_event(struct vdev_mlme_obj *vdev_mlme,
60  				    enum wlan_vdev_sm_evt event);
61  
62  /**
63   * mlme_vdev_sm_print_state() - Prints the state/substate
64   * @vdev_mlme: MLME VDEV comp object
65   *
66   * API to print current state/substate
67   *
68   * Return: void
69   */
70  void mlme_vdev_sm_print_state(struct vdev_mlme_obj *vdev_mlme);
71  #ifdef SM_ENG_HIST_ENABLE
72  /**
73   * mlme_vdev_sm_history_print() - Prints SM history
74   * @vdev_mlme: MLME VDEV comp object
75   *
76   * API to print SM history
77   *
78   * Return: void
79   */
80  void mlme_vdev_sm_history_print(struct vdev_mlme_obj *vdev_mlme);
81  #endif
82  
83  #endif
84  
85  /**
86   * mlme_vdev_sm_create() - Invoke SME creation for VDEV
87   * @vdev_mlme:  VDEV MLME comp object
88   *
89   * API allocates VDEV MLME SM and initializes SM lock
90   *
91   * Return: SUCCESS on successful allocation
92   *         FAILURE, if registration fails
93   */
94  QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme);
95  
96  /**
97   * mlme_vdev_sm_destroy() - Invoke SME destroy for VDEV
98   * @vdev_mlme:  VDEV MLME comp object
99   *
100   * API frees VDEV MLME SM and destroys the SM lock
101   *
102   * Return: SUCCESS on successful destroy
103   *         FAILURE, if registration fails
104   */
105  QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme);
106  
107  /**
108   * mlme_vdev_validate_basic_params() - Validate basic params
109   * @vdev_mlme:  VDEV MLME comp object
110   * @event_data_len: data size
111   * @event_data: event data
112   *
113   * API validate MLME VDEV basic parameters
114   *
115   * Return: SUCCESS on successful validation
116   *         FAILURE, if any parameter is not initialized
117   */
mlme_vdev_validate_basic_params(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)118  static inline QDF_STATUS mlme_vdev_validate_basic_params(
119  				struct vdev_mlme_obj *vdev_mlme,
120  				uint16_t event_data_len, void *event_data)
121  {
122  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
123  
124  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_validate_basic_params)
125  		ret = vdev_mlme->ops->mlme_vdev_validate_basic_params(
126  					vdev_mlme, event_data_len, event_data);
127  
128  	return ret;
129  }
130  
131  /**
132   * mlme_vdev_reset_proto_params() - Reset VDEV protocol params
133   * @vdev_mlme:  VDEV MLME comp object
134   * @event_data_len: data size
135   * @event_data: event data
136   *
137   * API resets the protocol params of vdev
138   *
139   * Return: SUCCESS on successful reset
140   *         FAILURE, if it fails due to any
141   */
mlme_vdev_reset_proto_params(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)142  static inline QDF_STATUS mlme_vdev_reset_proto_params(
143  				struct vdev_mlme_obj *vdev_mlme,
144  				uint16_t event_data_len, void *event_data)
145  {
146  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
147  
148  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_reset_proto_params)
149  		ret = vdev_mlme->ops->mlme_vdev_reset_proto_params(
150  					vdev_mlme, event_data_len, event_data);
151  
152  	return ret;
153  }
154  
155  /**
156   * mlme_vdev_start_send() - Invokes VDEV start operation
157   * @vdev_mlme:  VDEV MLME comp object
158   * @event_data_len: data size
159   * @event_data: event data
160   *
161   * API invokes VDEV start operation
162   *
163   * Return: SUCCESS on successful completion of start operation
164   *         FAILURE, if it fails due to any
165   */
mlme_vdev_start_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)166  static inline QDF_STATUS mlme_vdev_start_send(
167  				struct vdev_mlme_obj *vdev_mlme,
168  				uint16_t event_data_len, void *event_data)
169  {
170  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
171  
172  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_send)
173  		ret = vdev_mlme->ops->mlme_vdev_start_send(
174  					vdev_mlme, event_data_len, event_data);
175  
176  	return ret;
177  }
178  
179  /**
180   * mlme_vdev_restart_send() - Invokes VDEV restart operation
181   * @vdev_mlme:  VDEV MLME comp object
182   * @event_data_len: data size
183   * @event_data: event data
184   *
185   * API invokes VDEV restart operation
186   *
187   * Return: SUCCESS on successful completion of restart operation
188   *         FAILURE, if it fails due to any
189   */
mlme_vdev_restart_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)190  static inline QDF_STATUS mlme_vdev_restart_send(
191  				struct vdev_mlme_obj *vdev_mlme,
192  				uint16_t event_data_len, void *event_data)
193  {
194  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
195  
196  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_restart_send)
197  		ret = vdev_mlme->ops->mlme_vdev_restart_send(
198  					vdev_mlme, event_data_len, event_data);
199  
200  	return ret;
201  }
202  
203  /**
204   * mlme_vdev_stop_start_send() - Invoke block VDEV restart operation
205   * @vdev_mlme:  VDEV MLME comp object
206   * @restart: restart req/start req
207   * @event_data_len: data size
208   * @event_data: event data
209   *
210   * API invokes stops pending VDEV restart operation
211   *
212   * Return: SUCCESS alsways
213   */
mlme_vdev_stop_start_send(struct vdev_mlme_obj * vdev_mlme,uint8_t restart,uint16_t event_data_len,void * event_data)214  static inline QDF_STATUS mlme_vdev_stop_start_send(
215  				struct vdev_mlme_obj *vdev_mlme,
216  				uint8_t restart,
217  				uint16_t event_data_len, void *event_data)
218  {
219  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
220  
221  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_start_send)
222  		ret = vdev_mlme->ops->mlme_vdev_stop_start_send(
223  				vdev_mlme, restart, event_data_len, event_data);
224  
225  	return ret;
226  }
227  
228  /**
229   * mlme_vdev_start_continue() - VDEV start response handling
230   * @vdev_mlme:  VDEV MLME comp object
231   * @event_data_len: data size
232   * @event_data: event data
233   *
234   * API invokes VDEV start response actions
235   *
236   * Return: SUCCESS on successful completion of start response operation
237   *         FAILURE, if it fails due to any
238   */
mlme_vdev_start_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)239  static inline QDF_STATUS mlme_vdev_start_continue(
240  				struct vdev_mlme_obj *vdev_mlme,
241  				uint16_t event_data_len, void *event_data)
242  {
243  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
244  
245  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_continue)
246  		ret = vdev_mlme->ops->mlme_vdev_start_continue(
247  					vdev_mlme, event_data_len, event_data);
248  
249  	return ret;
250  }
251  
252  /**
253   * mlme_vdev_start_req_failed() - Invoke Station VDEV connection, if it pause
254   * @vdev_mlme:  VDEV MLME comp object
255   * @event_data_len: data size
256   * @event_data: event data
257   *
258   * API invokes on START fail response
259   *
260   * Return: SUCCESS on successful invocation of callback
261   *         FAILURE, if it fails due to any
262   */
mlme_vdev_start_req_failed(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)263  static inline QDF_STATUS mlme_vdev_start_req_failed(
264  				struct vdev_mlme_obj *vdev_mlme,
265  				uint16_t event_data_len, void *event_data)
266  {
267  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
268  
269  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_req_failed)
270  		ret = vdev_mlme->ops->mlme_vdev_start_req_failed(
271  					vdev_mlme, event_data_len, event_data);
272  
273  	return ret;
274  }
275  
276  /**
277   * mlme_vdev_sta_conn_start() - Invoke Station VDEV connection, if it pause
278   * @vdev_mlme:  VDEV MLME comp object
279   * @event_data_len: data size
280   * @event_data: event data
281   *
282   * API invokes connection SM to start station connection
283   *
284   * Return: SUCCESS on successful invocation of connection sm
285   *         FAILURE, if it fails due to any
286   */
mlme_vdev_sta_conn_start(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)287  static inline QDF_STATUS mlme_vdev_sta_conn_start(
288  				struct vdev_mlme_obj *vdev_mlme,
289  				uint16_t event_data_len, void *event_data)
290  {
291  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
292  
293  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_sta_conn_start)
294  		ret = vdev_mlme->ops->mlme_vdev_sta_conn_start(
295  					vdev_mlme, event_data_len, event_data);
296  
297  	return ret;
298  }
299  
300  /**
301   * mlme_vdev_sta_disconn_start() - Invoke Station VDEV disconnection
302   * @vdev_mlme:  VDEV MLME comp object
303   * @event_data_len: data size
304   * @event_data: event data
305   *
306   * API invokes connection SM to start station disconnection
307   *
308   * Return: SUCCESS on successful invocation of disconnection sm
309   *         FAILURE, if it fails due to any
310   */
mlme_vdev_sta_disconn_start(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)311  static inline QDF_STATUS mlme_vdev_sta_disconn_start(
312  				struct vdev_mlme_obj *vdev_mlme,
313  				uint16_t event_data_len, void *event_data)
314  {
315  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
316  
317  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_sta_disconn_start)
318  		ret = vdev_mlme->ops->mlme_vdev_sta_disconn_start(
319  					vdev_mlme, event_data_len, event_data);
320  
321  	return ret;
322  }
323  
324  /**
325   * mlme_vdev_up_send() - VDEV up operation
326   * @vdev_mlme:  VDEV MLME comp object
327   * @event_data_len: data size
328   * @event_data: event data
329   *
330   * API invokes VDEV up operations
331   *
332   * Return: SUCCESS on successful completion of up operation
333   *         FAILURE, if it fails due to any
334   */
mlme_vdev_up_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)335  static inline QDF_STATUS mlme_vdev_up_send(
336  				struct vdev_mlme_obj *vdev_mlme,
337  				uint16_t event_data_len, void *event_data)
338  {
339  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
340  
341  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_up_send)
342  		ret = vdev_mlme->ops->mlme_vdev_up_send(
343  					vdev_mlme, event_data_len, event_data);
344  
345  	return ret;
346  }
347  
348  /**
349   * mlme_vdev_notify_up_complete() - VDEV up state transition notification
350   * @vdev_mlme:  VDEV MLME comp object
351   * @event_data_len: data size
352   * @event_data: event data
353   *
354   * API notifies MLME on moving to UP state
355   *
356   * Return: SUCCESS on successful completion of up notification
357   *         FAILURE, if it fails due to any
358   */
359  static inline
mlme_vdev_notify_up_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)360  QDF_STATUS mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme,
361  					uint16_t event_data_len,
362  					void *event_data)
363  {
364  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
365  
366  	if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_notify_up_complete)
367  		ret = vdev_mlme->ops->mlme_vdev_notify_up_complete(
368  					vdev_mlme, event_data_len, event_data);
369  
370  	return ret;
371  }
372  
373  /**
374   * mlme_vdev_notify_roam_start() - VDEV Roaming notification
375   * @vdev_mlme:  VDEV MLME comp object
376   * @event_len: data size
377   * @event_data: event data
378   *
379   * API notifies MLME on roaming
380   *
381   * Return: SUCCESS on successful completion of up notification
382   *         FAILURE, if it fails due to any
383   */
384  static inline
mlme_vdev_notify_roam_start(struct vdev_mlme_obj * vdev_mlme,uint16_t event_len,void * event_data)385  QDF_STATUS mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme,
386  				       uint16_t event_len, void *event_data)
387  {
388  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
389  
390  	if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_notify_roam_start)
391  		ret = vdev_mlme->ops->mlme_vdev_notify_roam_start(vdev_mlme,
392  								  event_len,
393  								  event_data);
394  
395  	return ret;
396  }
397  
398  /**
399   * mlme_vdev_update_beacon() - Updates beacon
400   * @vdev_mlme:  VDEV MLME comp object
401   * @op: beacon update type
402   * @event_data_len: data size
403   * @event_data: event data
404   *
405   * API updates/allocates/frees the beacon
406   *
407   * Return: SUCCESS on successful update of beacon
408   *         FAILURE, if it fails due to any
409   */
410  static inline
mlme_vdev_update_beacon(struct vdev_mlme_obj * vdev_mlme,enum beacon_update_op op,uint16_t event_data_len,void * event_data)411  QDF_STATUS mlme_vdev_update_beacon(struct vdev_mlme_obj *vdev_mlme,
412  				   enum beacon_update_op op,
413  				   uint16_t event_data_len, void *event_data)
414  {
415  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
416  
417  	if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_update_beacon)
418  		ret = vdev_mlme->ops->mlme_vdev_update_beacon(vdev_mlme, op,
419  						event_data_len, event_data);
420  
421  	return ret;
422  }
423  
424  /**
425   * mlme_vdev_disconnect_peers() - Disconnect peers
426   * @vdev_mlme:  VDEV MLME comp object
427   * @event_data_len: data size
428   * @event_data: event data
429   * @discon_legacy_only: flag indicating that only legacy peer to be
430   * disconnected
431   *
432   * API trigger stations disconnection with AP VDEV or AP disconnection with STA
433   * VDEV
434   *
435   * Return: SUCCESS on successful invocation of station disconnection
436   *         FAILURE, if it fails due to any
437   */
mlme_vdev_disconnect_peers(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data,bool discon_legacy_only)438  static inline QDF_STATUS mlme_vdev_disconnect_peers(
439  				struct vdev_mlme_obj *vdev_mlme,
440  				uint16_t event_data_len, void *event_data,
441  				bool discon_legacy_only)
442  {
443  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
444  
445  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_disconnect_peers)
446  		ret = vdev_mlme->ops->mlme_vdev_disconnect_peers(
447  					vdev_mlme, event_data_len, event_data,
448  					discon_legacy_only);
449  
450  	return ret;
451  }
452  
453  /**
454   * mlme_vdev_dfs_cac_timer_stop() - Stop CAC timer
455   * @vdev_mlme:  VDEV MLME comp object
456   * @event_data_len: data size
457   * @event_data: event data
458   *
459   * API stops the CAC timer through DFS API
460   *
461   * Return: SUCCESS on successful CAC timer stop
462   *         FAILURE, if it fails due to any
463   */
mlme_vdev_dfs_cac_timer_stop(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)464  static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop(
465  				struct vdev_mlme_obj *vdev_mlme,
466  				uint16_t event_data_len, void *event_data)
467  {
468  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
469  
470  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop)
471  		ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop(
472  					vdev_mlme, event_data_len, event_data);
473  
474  	return ret;
475  }
476  
477  /**
478   * mlme_vdev_stop_send() - Invokes VDEV stop operation
479   * @vdev_mlme:  VDEV MLME comp object
480   * @event_data_len: data size
481   * @event_data: event data
482   *
483   * API invokes VDEV stop operation
484   *
485   * Return: SUCCESS on successful completion of stop operation
486   *         FAILURE, if it fails due to any
487   */
mlme_vdev_stop_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)488  static inline QDF_STATUS mlme_vdev_stop_send(
489  				struct vdev_mlme_obj *vdev_mlme,
490  				uint16_t event_data_len, void *event_data)
491  {
492  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
493  
494  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_send)
495  		ret = vdev_mlme->ops->mlme_vdev_stop_send(
496  					vdev_mlme, event_data_len, event_data);
497  
498  	return ret;
499  }
500  
501  /**
502   * mlme_vdev_stop_continue() - VDEV stop response handling
503   * @vdev_mlme:  VDEV MLME comp object
504   * @event_data_len: data size
505   * @event_data: event data
506   *
507   * API invokes VDEV stop response actions
508   *
509   * Return: SUCCESS on successful completion of stop response operation
510   *         FAILURE, if it fails due to any
511   */
mlme_vdev_stop_continue(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)512  static inline QDF_STATUS mlme_vdev_stop_continue(
513  				struct vdev_mlme_obj *vdev_mlme,
514  				uint16_t event_data_len, void *event_data)
515  {
516  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
517  
518  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_continue)
519  		ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme,
520  							      event_data_len,
521  							      event_data);
522  
523  	return ret;
524  }
525  
526  /**
527   * mlme_vdev_down_send() - VDEV down operation
528   * @vdev_mlme:  VDEV MLME comp object
529   * @event_data_len: data size
530   * @event_data: event data
531   *
532   * API invokes VDEV down operation
533   *
534   * Return: SUCCESS on successful completion of VDEV down operation
535   *         FAILURE, if it fails due to any
536   */
mlme_vdev_down_send(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)537  static inline QDF_STATUS mlme_vdev_down_send(
538  				struct vdev_mlme_obj *vdev_mlme,
539  				uint16_t event_data_len, void *event_data)
540  {
541  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
542  
543  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_down_send)
544  		ret = vdev_mlme->ops->mlme_vdev_down_send(
545  					vdev_mlme, event_data_len, event_data);
546  
547  	return ret;
548  }
549  
550  /**
551   * mlme_vdev_notify_down_complete() - VDEV init state transition notification
552   * @vdev_mlme:  VDEV MLME comp object
553   * @event_data_len: data size
554   * @event_data: event data
555   *
556   * API notifies MLME on moving to INIT state
557   *
558   * Return: SUCCESS on successful completion of down notification
559   *         FAILURE, if it fails due to any
560   */
mlme_vdev_notify_down_complete(struct vdev_mlme_obj * vdev_mlme,uint16_t event_data_len,void * event_data)561  static inline QDF_STATUS mlme_vdev_notify_down_complete(
562  				struct vdev_mlme_obj *vdev_mlme,
563  				uint16_t event_data_len, void *event_data)
564  {
565  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
566  
567  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_down_complete)
568  		ret = vdev_mlme->ops->mlme_vdev_notify_down_complete(
569  					vdev_mlme, event_data_len, event_data);
570  
571  	return ret;
572  }
573  
574  /**
575   * mlme_vdev_notify_start_state_exit() - VDEV SM start state exit notification
576   * @vdev_mlme:  VDEV MLME comp object
577   *
578   * API notifies on start state exit
579   *
580   * Return: SUCCESS on successful completion of notification
581   *         FAILURE, if it fails due to any
582   */
mlme_vdev_notify_start_state_exit(struct vdev_mlme_obj * vdev_mlme)583  static inline QDF_STATUS mlme_vdev_notify_start_state_exit(
584  				struct vdev_mlme_obj *vdev_mlme)
585  {
586  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
587  
588  	if ((vdev_mlme->ops) &&
589  	    vdev_mlme->ops->mlme_vdev_notify_start_state_exit)
590  		ret = vdev_mlme->ops->mlme_vdev_notify_start_state_exit(
591  								vdev_mlme);
592  
593  	return ret;
594  }
595  
596  /**
597   * mlme_vdev_is_newchan_no_cac() - Checks new channel requires CAC
598   * @vdev_mlme:  VDEV MLME comp object
599   *
600   * API checks whether Channel needs CAC period,
601   * if yes, it moves to SUSPEND_RESTART to disconnect stations before
602   * sending RESTART to FW, otherwise, it moves to RESTART_PROGRESS substate
603   *
604   * Return: SUCCESS to move to RESTART_PROGRESS substate
605   *         FAILURE, move to SUSPEND_RESTART state
606   */
mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj * vdev_mlme)607  static inline QDF_STATUS mlme_vdev_is_newchan_no_cac(
608  				struct vdev_mlme_obj *vdev_mlme)
609  {
610  	QDF_STATUS ret = QDF_STATUS_SUCCESS;
611  
612  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_is_newchan_no_cac)
613  		ret = vdev_mlme->ops->mlme_vdev_is_newchan_no_cac(vdev_mlme);
614  
615  	return ret;
616  }
617  
618  /**
619   * mlme_vdev_dfs_cac_wait_notify() - Notifies DFS CAC wait state
620   * @vdev_mlme:  VDEV MLME comp object
621   *
622   * Return: NO_SUPPORT if the callback is not supported.
623   *         SUCCESS if DFS CAC Wait notification handled by caller
624   */
mlme_vdev_dfs_cac_wait_notify(struct vdev_mlme_obj * vdev_mlme)625  static inline QDF_STATUS mlme_vdev_dfs_cac_wait_notify(
626  				struct vdev_mlme_obj *vdev_mlme)
627  {
628  	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
629  
630  	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_wait_notify)
631  		ret = vdev_mlme->ops->mlme_vdev_dfs_cac_wait_notify(vdev_mlme);
632  
633  	return ret;
634  }
635  
636  /**
637   * mlme_vdev_chan_switch_disable_notify_dfs() - Notifies DFS when channel
638   * switch is disabled
639   * @vdev_mlme: VDEV MLME comp object
640   *
641   * Return: QDF_STATUS.
642   */
mlme_vdev_chan_switch_disable_notify_dfs(struct vdev_mlme_obj * vdev_mlme)643  static inline QDF_STATUS mlme_vdev_chan_switch_disable_notify_dfs(
644  					struct vdev_mlme_obj *vdev_mlme)
645  {
646  	return utils_dfs_radar_enable(wlan_vdev_get_pdev(vdev_mlme->vdev));
647  }
648  #ifdef WLAN_FEATURE_11BE_MLO
649  /**
650   * mlme_vdev_up_notify_mlo_mgr() - notify mlo link is ready to up
651   * @vdev_mlme:  VDEV MLME comp object
652   *
653   * Return: true if MLO_SYNC_COMPLETE is posted, else false
654   */
mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)655  static inline bool mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj *vdev_mlme)
656  {
657  	if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev))
658  		return mlo_ap_link_sync_wait_notify(vdev_mlme->vdev);
659  
660  	return true;
661  }
662  
663  /**
664   * mlme_vdev_start_rsp_notify_mlo_mgr() - notify mlo link is started
665   * @vdev_mlme:  VDEV MLME comp object
666   *
667   * Return: VOID.
668   */
mlme_vdev_start_rsp_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)669  static inline void mlme_vdev_start_rsp_notify_mlo_mgr(
670  					struct vdev_mlme_obj *vdev_mlme)
671  {
672  	if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev))
673  		mlo_ap_link_start_rsp_notify(vdev_mlme->vdev);
674  }
675  
676  /**
677   * mlme_vdev_down_cmpl_notify_mlo_mgr() - notify mlo link is down complete
678   * @vdev_mlme:  VDEV MLME comp object
679   *
680   * Return: VOID.
681   */
mlme_vdev_down_cmpl_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)682  static inline void mlme_vdev_down_cmpl_notify_mlo_mgr(
683  					struct vdev_mlme_obj *vdev_mlme)
684  {
685  	if (wlan_vdev_mlme_is_mlo_ap(vdev_mlme->vdev))
686  		mlo_ap_link_down_cmpl_notify(vdev_mlme->vdev);
687  }
688  
689  /**
690   * mlme_vdev_up_active_notify_mlo_mgr() - notify mlo link is up active
691   * @vdev_mlme:  VDEV MLME comp object
692   *
693   * Return: VOID.
694   */
mlme_vdev_up_active_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)695  static inline void mlme_vdev_up_active_notify_mlo_mgr(
696  					struct vdev_mlme_obj *vdev_mlme)
697  {
698  	if ((wlan_vdev_mlme_get_opmode(vdev_mlme->vdev) == QDF_STA_MODE) &&
699  	    wlan_vdev_mlme_is_mlo_vdev(vdev_mlme->vdev))
700  		mlo_sta_up_active_notify(vdev_mlme->vdev);
701  }
702  
703  /**
704   * mlme_vdev_notify_mlo_sync_wait_entry() - Notifies mlo sync wait state
705   * @vdev_mlme:  VDEV MLME comp object
706   *
707   * Return: NO_SUPPORT if the callback is not supported.
708   *         SUCCESS if notification is handled by caller
709   */
mlme_vdev_notify_mlo_sync_wait_entry(struct vdev_mlme_obj * vdev_mlme)710  static inline QDF_STATUS mlme_vdev_notify_mlo_sync_wait_entry(
711  				struct vdev_mlme_obj *vdev_mlme)
712  {
713  	QDF_STATUS ret = QDF_STATUS_E_NOSUPPORT;
714  
715  	if (vdev_mlme->ops &&
716  	    vdev_mlme->ops->mlme_vdev_notify_mlo_sync_wait_entry)
717  		ret = vdev_mlme->ops->mlme_vdev_notify_mlo_sync_wait_entry(
718  				vdev_mlme);
719  	return ret;
720  }
721  #else
mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)722  static inline bool mlme_vdev_up_notify_mlo_mgr(struct vdev_mlme_obj *vdev_mlme)
723  {
724  	return true;
725  }
726  
mlme_vdev_start_rsp_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)727  static inline void mlme_vdev_start_rsp_notify_mlo_mgr(
728  					struct vdev_mlme_obj *vdev_mlme)
729  {
730  }
731  
mlme_vdev_down_cmpl_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)732  static inline void mlme_vdev_down_cmpl_notify_mlo_mgr(
733  					struct vdev_mlme_obj *vdev_mlme)
734  {
735  }
736  
mlme_vdev_up_active_notify_mlo_mgr(struct vdev_mlme_obj * vdev_mlme)737  static inline void mlme_vdev_up_active_notify_mlo_mgr(
738  					struct vdev_mlme_obj *vdev_mlme)
739  {
740  }
741  
mlme_vdev_notify_mlo_sync_wait_entry(struct vdev_mlme_obj * vdev_mlme)742  static inline QDF_STATUS mlme_vdev_notify_mlo_sync_wait_entry(
743  				struct vdev_mlme_obj *vdev_mlme)
744  {
745  	return QDF_STATUS_SUCCESS;
746  }
747  #endif
748  
749  #ifdef VDEV_SM_LOCK_SUPPORT
750  /**
751   * mlme_vdev_sm_spinlock_create() - Create VDEV MLME spinlock
752   * @vdev_mlme:  VDEV MLME comp object
753   *
754   * Creates VDEV MLME spinlock
755   *
756   * Return: void
757   */
mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj * vdev_mlme)758  static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme)
759  {
760  	qdf_spinlock_create(&vdev_mlme->sm_lock);
761  }
762  
763  /**
764   * mlme_vdev_sm_spinlock_destroy() - Destroy VDEV MLME spinlock
765   * @vdev_mlme:  VDEV MLME comp object
766   *
767   * Destroy VDEV MLME spinlock
768   *
769   * Return: void
770   */
mlme_vdev_sm_spinlock_destroy(struct vdev_mlme_obj * vdev_mlme)771  static inline void mlme_vdev_sm_spinlock_destroy(
772  						struct vdev_mlme_obj *vdev_mlme)
773  {
774  	qdf_spinlock_destroy(&vdev_mlme->sm_lock);
775  }
776  
777  /**
778   * mlme_vdev_sm_spin_lock() - acquire spinlock
779   * @vdev_mlme:  vdev mlme comp object
780   *
781   * acquire vdev mlme spinlock
782   *
783   * return: void
784   */
mlme_vdev_sm_spin_lock(struct vdev_mlme_obj * vdev_mlme)785  static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme)
786  {
787  	qdf_spin_lock_bh(&vdev_mlme->sm_lock);
788  }
789  
790  /**
791   * mlme_vdev_sm_spin_unlock() - release spinlock
792   * @vdev_mlme:  vdev mlme comp object
793   *
794   * release vdev mlme spinlock
795   *
796   * return: void
797   */
mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj * vdev_mlme)798  static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme)
799  {
800  	qdf_spin_unlock_bh(&vdev_mlme->sm_lock);
801  }
802  
803  /**
804   * mlme_vdev_cmd_mutex_create() - Create VDEV MLME cmd mutex
805   * @vdev_mlme:  VDEV MLME comp object
806   *
807   * Creates VDEV MLME cmd mutex
808   *
809   * Return: void
810   */
811  static inline void
mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj * vdev_mlme)812  mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj *vdev_mlme)
813  {
814  	qdf_mutex_create(&vdev_mlme->vdev_cmd_lock);
815  }
816  
817  /**
818   * mlme_vdev_cmd_mutex_destroy() - Destroy VDEV MLME cmd mutex
819   * @vdev_mlme:  VDEV MLME comp object
820   *
821   * Destroy VDEV MLME cmd mutex
822   *
823   * Return: void
824   */
825  static inline void
mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj * vdev_mlme)826  mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj *vdev_mlme)
827  {
828  	qdf_mutex_destroy(&vdev_mlme->vdev_cmd_lock);
829  }
830  
831  /**
832   * mlme_vdev_cmd_mutex_acquire() - acquire mutex
833   * @vdev_mlme:  vdev mlme comp object
834   *
835   * acquire vdev mlme cmd mutex
836   *
837   * return: void
838   */
mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj * vdev_mlme)839  static inline void mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj *vdev_mlme)
840  {
841  	qdf_mutex_acquire(&vdev_mlme->vdev_cmd_lock);
842  }
843  
844  /**
845   * mlme_vdev_cmd_mutex_release() - release mutex
846   * @vdev_mlme:  vdev mlme comp object
847   *
848   * release vdev mlme cmd mutex
849   *
850   * return: void
851   */
mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj * vdev_mlme)852  static inline void mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj *vdev_mlme)
853  {
854  	qdf_mutex_release(&vdev_mlme->vdev_cmd_lock);
855  }
856  
857  #else
mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj * vdev_mlme)858  static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme)
859  {
860  	mlme_debug("VDEV SM lock is disabled!!!");
861  }
862  
mlme_vdev_sm_spinlock_destroy(struct vdev_mlme_obj * vdev_mlme)863  static inline void mlme_vdev_sm_spinlock_destroy(
864  						struct vdev_mlme_obj *vdev_mlme)
865  {
866  	mlme_debug("VDEV SM lock is disabled!!!");
867  }
868  
mlme_vdev_sm_spin_lock(struct vdev_mlme_obj * vdev_mlme)869  static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme)
870  {
871  }
872  
mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj * vdev_mlme)873  static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme)
874  {
875  }
876  
877  static inline void
mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj * vdev_mlme)878  mlme_vdev_cmd_mutex_create(struct vdev_mlme_obj *vdev_mlme)
879  {
880  	mlme_debug("VDEV CMD lock is disabled!!!");
881  }
882  
883  static inline void
mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj * vdev_mlme)884  mlme_vdev_cmd_mutex_destroy(struct vdev_mlme_obj *vdev_mlme)
885  {
886  	mlme_debug("VDEV CMD lock is disabled!!!");
887  }
888  
mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj * vdev_mlme)889  static inline void mlme_vdev_cmd_mutex_acquire(struct vdev_mlme_obj *vdev_mlme)
890  {
891  }
892  
mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj * vdev_mlme)893  static inline void mlme_vdev_cmd_mutex_release(struct vdev_mlme_obj *vdev_mlme)
894  {
895  }
896  #endif
897