1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-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: wlan_serialization_api.h
22  * This file provides prototypes of the routines needed for the
23  * external components to utilize the services provided by the
24  * serialization component.
25  */
26 
27 /* Include files */
28 #ifndef __WLAN_SERIALIZATION_API_H
29 #define __WLAN_SERIALIZATION_API_H
30 
31 #include <qdf_status.h>
32 #include <wlan_objmgr_cmn.h>
33 #include "wlan_scan_public_structs.h"
34 
35 /* Preprocessor Definitions and Constants */
36 
37 /**
38  * enum ser_queue_reason- reason for changes to serialization queue
39  * @SER_REQUEST: queue updated for serialization request
40  * @SER_REMOVE: queue updated for serialization remove request
41  * @SER_CANCEL: queue updated for serialization cancel request
42  * @SER_TIMEOUT: queue updated for command timeout
43  * @SER_ACTIVATION_FAILED: queue updated since command activation failed
44  * @SER_PENDING_TO_ACTIVE: queue updated for pending to active movement
45  * @SER_QUEUE_ACTION_MAX: max enumeration
46  */
47 enum ser_queue_reason {
48 	SER_REQUEST,
49 	SER_REMOVE,
50 	SER_CANCEL,
51 	SER_TIMEOUT,
52 	SER_ACTIVATION_FAILED,
53 	SER_PENDING_TO_ACTIVE,
54 	SER_QUEUE_ACTION_MAX,
55 };
56 
57 /*
58  * struct wlan_serialization_queued_cmd_info member queue_type specifies the
59  * below values to cancel the commands in these queues. Setting both the
60  * bits will cancel the commands in both the queues.
61  */
62 #define WLAN_SERIALIZATION_ACTIVE_QUEUE  0x1
63 #define WLAN_SERIALIZATION_PENDING_QUEUE 0x2
64 
65 /**
66  * enum wlan_serialization_cb_reason - reason for calling the callback
67  * @WLAN_SER_CB_ACTIVATE_CMD: activate the cmd by sending it to FW
68  * @WLAN_SER_CB_CANCEL_CMD: Cancel the cmd in the pending list
69  * @WLAN_SER_CB_RELEASE_MEM_CMD:cmd execution complete. Release
70  *                                           the memory allocated while
71  *                                           building the command
72  * @WLAN_SER_CB_ACTIVE_CMD_TIMEOUT: active cmd has been timeout.
73  */
74 enum wlan_serialization_cb_reason {
75 	WLAN_SER_CB_ACTIVATE_CMD,
76 	WLAN_SER_CB_CANCEL_CMD,
77 	WLAN_SER_CB_RELEASE_MEM_CMD,
78 	WLAN_SER_CB_ACTIVE_CMD_TIMEOUT,
79 };
80 
81 /**
82  * struct wlan_serialization_scan_info - Information needed for scan cmd
83  * @is_cac_in_progress: boolean to check the cac status
84  * @is_tdls_in_progress: boolean to check the tdls status
85  * @is_mlme_op_in_progress: boolean to check the mlme op status
86  * @is_scan_for_connect: boolean to check if scan for connect
87  *
88  * This information is needed for scan command from other components
89  * to apply the rules and check whether the cmd is allowed or not
90  */
91 struct wlan_serialization_scan_info {
92 	bool is_cac_in_progress;
93 	bool is_tdls_in_progress;
94 	bool is_mlme_op_in_progress;
95 	bool is_scan_for_connect;
96 };
97 
98 /**
99  * union wlan_serialization_rules_info - union of all rules info structures
100  * @scan_info: information needed to apply rules on scan command
101  */
102 union wlan_serialization_rules_info {
103 	struct wlan_serialization_scan_info scan_info;
104 };
105 
106 struct wlan_serialization_command;
107 
108 /**
109  * typedef wlan_serialization_cmd_callback() - Callback registered by the
110  *                                             component
111  * @wlan_cmd: Command passed by the component for serialization
112  * @reason: Reason code for which the callback is being called
113  *
114  * Reason specifies the reason for which the callback is being called. callback
115  * should return success or failure based up on overall success of callback.
116  * if callback returns failure then serialization will remove the command from
117  * active queue and proceed for next pending command.
118  *
119  * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE
120  */
121 typedef QDF_STATUS
122 (*wlan_serialization_cmd_callback)(struct wlan_serialization_command *wlan_cmd,
123 				   enum wlan_serialization_cb_reason reason);
124 
125 /**
126  * typedef wlan_serialization_comp_info_cb() - callback to fill the rules
127  *                                             information
128  * @vdev: VDEV object for which the command has been received
129  * @comp_info: Information filled by the component
130  * @cmd: Command information
131  *
132  * This callback is registered dynamically by the component with the
133  * serialization component. Serialization component invokes the callback
134  * while applying the rules for a particular command and the component
135  * fills in the required information to apply the rules
136  *
137  * Return: None
138  */
139 typedef void (*wlan_serialization_comp_info_cb)(struct wlan_objmgr_vdev *vdev,
140 		union wlan_serialization_rules_info *comp_info,
141 		struct wlan_serialization_command *cmd);
142 
143 /**
144  * typedef wlan_serialization_apply_rules_cb() - callback per command to apply
145  *                                               rules
146  * @comp_info: information needed to apply the rules
147  * @comp_id: component id
148  *
149  * The rules are applied using this callback and decided whether to
150  * allow or deny the command
151  *
152  * Return: true, if rules are successful and cmd can be queued
153  *         false, if rules failed and cmd should not be queued
154  */
155 typedef bool (*wlan_serialization_apply_rules_cb)(
156 		union wlan_serialization_rules_info *comp_info,
157 		uint8_t comp_id);
158 
159 /**
160  * typedef wlan_ser_umac_cmd_cb() - callback to validate umac_cmd
161  * @umac_cmd: umac data associated with the serialization cmd
162  *
163  * This callback can be called at run time for a command in active queue to
164  * fetch the required information from the umac cmd data stored in serialization
165  * command buffer.
166  *
167  * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE
168  */
169 typedef QDF_STATUS (*wlan_ser_umac_cmd_cb)(void *umac_cmd);
170 
171 /**
172  * enum wlan_serialization_cmd_type - Command Type
173  * @WLAN_SER_CMD_SCAN: Scan command
174  * @WLAN_SER_CMD_NONSCAN: Non-scan command
175  * @WLAN_SER_CMD_FORCE_DISASSOC_STA: Force diassoc for STA vap
176  * @WLAN_SER_CMD_FORCE_DEAUTH_STA: Force deauth for STA vap
177  * @WLAN_SER_CMD_PERFORM_PRE_AUTH: Pre auth ops cmd
178  * @WLAN_SER_CMD_WM_STATUS_CHANGE: WM status modification cmd
179  * @WLAN_SER_CMD_NDP_INIT_REQ: NDP init request cmd
180  * @WLAN_SER_CMD_NDP_RESP_REQ: NDP response to request cmd
181  * @WLAN_SER_CMD_NDP_DATA_END_INIT_REQ: NDP data end init request
182  * @WLAN_SER_CMD_NDP_END_ALL_REQ: NDP close all request
183  * @WLAN_SER_CMD_ADDTS: ADD Ts cmd
184  * @WLAN_SER_CMD_DELTS: Del Ts cmd
185  * @WLAN_SER_CMD_TDLS_SEND_MGMT: TDLS mgmt send cmd
186  * @WLAN_SER_CMD_TDLS_ADD_PEER: TDLS cmd to add peer
187  * @WLAN_SER_CMD_TDLS_DEL_PEER: TDLS cmd to del peer
188  * @WLAN_SER_CMD_SET_HW_MODE: Cmd to set hardware mode change
189  * @WLAN_SER_CMD_NSS_UPDATE: Cmd to update NSS config
190  * @WLAN_SER_CMD_SET_DUAL_MAC_CONFIG: Cmd to set dual mac
191  * @WLAN_SER_CMD_SET_ANTENNA_MODE: Set antenna mode
192  * @WLAN_SER_CMD_VDEV_DELETE: Cmd to del vdev
193  * @WLAN_SER_CMD_VDEV_START_BSS: Cmd to start a AP VDEV
194  * @WLAN_SER_CMD_VDEV_STOP_BSS: Cmd to stop a AP VDEV
195  * @WLAN_SER_CMD_VDEV_CONNECT: Cmd to start a STA VDEV
196  * @WLAN_SER_CMD_VDEV_DISCONNECT: Cmd to stop a STA VDEV
197  * @WLAN_SER_CMD_VDEV_RESTART: Cmd to restart a VDEV
198  * @WLAN_SER_CMD_PDEV_RESTART: Cmd to restart all VDEVs of a PDEV
199  * @WLAN_SER_CMD_PDEV_CSA_RESTART: Cmd to CSA restart all AP VDEVs of a PDEV
200  * @WLAN_SER_CMD_VDEV_ROAM: Cmd to roam a STA VDEV
201  * @WLAN_SER_CMD_SET_MLO_LINK: Cmd to force mlo link active/inactive
202  * @WLAN_SER_CMD_MLO_VDEV_LINK_SWITCH: Cmd to serialize link switch operation
203  * @WLAN_SER_CMD_SAP_BW_UPDATE: Cmd to serialize SAP BW update operation
204  * @WLAN_SER_CMD_MAX: Max enumeration
205  */
206 enum wlan_serialization_cmd_type {
207 	/* all scan command before non-scan */
208 	WLAN_SER_CMD_SCAN,
209 	/* all non-scan command below */
210 	WLAN_SER_CMD_NONSCAN,
211 	WLAN_SER_CMD_FORCE_DISASSOC_STA,
212 	WLAN_SER_CMD_FORCE_DEAUTH_STA,
213 	WLAN_SER_CMD_PERFORM_PRE_AUTH,
214 	WLAN_SER_CMD_WM_STATUS_CHANGE,
215 	WLAN_SER_CMD_NDP_INIT_REQ,
216 	WLAN_SER_CMD_NDP_RESP_REQ,
217 	WLAN_SER_CMD_NDP_DATA_END_INIT_REQ,
218 	WLAN_SER_CMD_NDP_END_ALL_REQ,
219 	WLAN_SER_CMD_ADDTS,
220 	WLAN_SER_CMD_DELTS,
221 	WLAN_SER_CMD_TDLS_SEND_MGMT,
222 	WLAN_SER_CMD_TDLS_ADD_PEER,
223 	WLAN_SER_CMD_TDLS_DEL_PEER,
224 	WLAN_SER_CMD_SET_HW_MODE,
225 	WLAN_SER_CMD_NSS_UPDATE,
226 	WLAN_SER_CMD_SET_DUAL_MAC_CONFIG,
227 	WLAN_SER_CMD_SET_ANTENNA_MODE,
228 	WLAN_SER_CMD_VDEV_DELETE,
229 	WLAN_SER_CMD_VDEV_START_BSS,
230 	WLAN_SER_CMD_VDEV_STOP_BSS,
231 	WLAN_SER_CMD_VDEV_CONNECT,
232 	WLAN_SER_CMD_VDEV_DISCONNECT,
233 	WLAN_SER_CMD_VDEV_RESTART,
234 	WLAN_SER_CMD_PDEV_RESTART,
235 	WLAN_SER_CMD_PDEV_CSA_RESTART,
236 	WLAN_SER_CMD_VDEV_ROAM,
237 	WLAN_SER_CMD_SET_MLO_LINK,
238 	WLAN_SER_CMD_MLO_VDEV_LINK_SWITCH,
239 	WLAN_SER_CMD_SAP_BW_UPDATE,
240 	WLAN_SER_CMD_MAX
241 };
242 
243 /**
244  * enum wlan_serialization_cancel_type - Type of commands to be cancelled
245  * @WLAN_SER_CANCEL_SINGLE_SCAN: Cancel a single scan with a given ID
246  * @WLAN_SER_CANCEL_PDEV_SCANS: Cancel all the scans on a given pdev
247  * @WLAN_SER_CANCEL_VDEV_SCANS: Cancel all the scans on given vdev
248  * @WLAN_SER_CANCEL_VDEV_HOST_SCANS: Cancel all host scans on given vdev
249  * @WLAN_SER_CANCEL_PDEV_NON_SCAN_CMD: Cancel all non scans on a given pdev
250  * @WLAN_SER_CANCEL_VDEV_NON_SCAN_CMD: Cancel all non scans on a given vdev
251  * @WLAN_SER_CANCEL_VDEV_NON_SCAN_CMD_TYPE: Cancel all non scans on a given vdev
252  * and matching cmd type
253  * @WLAN_SER_CANCEL_VDEV_NON_SCAN_NB_CMD: Cancel all non-blocking,
254  * non-scan commands of a given vdev
255  * @WLAN_SER_CANCEL_NON_SCAN_CMD: Cancel the given non scan command
256  * @WLAN_SER_CANCEL_MAX: Max enumeration
257  */
258 enum wlan_serialization_cancel_type {
259 	WLAN_SER_CANCEL_SINGLE_SCAN,
260 	WLAN_SER_CANCEL_PDEV_SCANS,
261 	WLAN_SER_CANCEL_VDEV_SCANS,
262 	WLAN_SER_CANCEL_VDEV_HOST_SCANS,
263 	WLAN_SER_CANCEL_PDEV_NON_SCAN_CMD,
264 	WLAN_SER_CANCEL_VDEV_NON_SCAN_CMD,
265 	WLAN_SER_CANCEL_VDEV_NON_SCAN_CMD_TYPE,
266 	WLAN_SER_CANCEL_VDEV_NON_SCAN_NB_CMD,
267 	WLAN_SER_CANCEL_NON_SCAN_CMD,
268 	WLAN_SER_CANCEL_MAX,
269 };
270 
271 /**
272  * enum wlan_serialization_status - Return status of cmd serialization request
273  * @WLAN_SER_CMD_PENDING: Command is put into the pending queue
274  * @WLAN_SER_CMD_ACTIVE: Command is activated and put in active queue
275  * @WLAN_SER_CMD_DENIED_RULES_FAILED: Command denied as the rules fail
276  * @WLAN_SER_CMD_DENIED_LIST_FULL: Command denied as the pending list is full
277  * @WLAN_SER_CMD_QUEUE_DISABLED: Command denied as the queue is disabled
278  * @WLAN_SER_CMD_ALREADY_EXISTS: Command already exists in the queue
279  * @WLAN_SER_CMD_DENIED_UNSPECIFIED: Command denied due to unknown reason
280  */
281 enum wlan_serialization_status {
282 	WLAN_SER_CMD_PENDING,
283 	WLAN_SER_CMD_ACTIVE,
284 	WLAN_SER_CMD_DENIED_RULES_FAILED,
285 	WLAN_SER_CMD_DENIED_LIST_FULL,
286 	WLAN_SER_CMD_QUEUE_DISABLED,
287 	WLAN_SER_CMD_ALREADY_EXISTS,
288 	WLAN_SER_CMD_DENIED_UNSPECIFIED,
289 };
290 
291 /**
292  * enum wlan_serialization_cmd_status - Return status for a cancel request
293  * @WLAN_SER_CMD_IN_PENDING_LIST: Command cancelled from pending list
294  * @WLAN_SER_CMD_IN_ACTIVE_LIST: Command cancelled from active list
295  * @WLAN_SER_CMDS_IN_ALL_LISTS: Command cancelled from all lists
296  * @WLAN_SER_CMD_MARKED_FOR_ACTIVATION:
297  * @WLAN_SER_CMD_NOT_FOUND: Specified command to be cancelled
298  *                                    not found in the lists
299  */
300 enum wlan_serialization_cmd_status {
301 	WLAN_SER_CMD_IN_PENDING_LIST,
302 	WLAN_SER_CMD_IN_ACTIVE_LIST,
303 	WLAN_SER_CMDS_IN_ALL_LISTS,
304 	WLAN_SER_CMD_MARKED_FOR_ACTIVATION,
305 	WLAN_SER_CMD_NOT_FOUND,
306 };
307 
308 /**
309  * enum wlan_ser_cmd_attr - Serialization cmd attribute
310  * @WLAN_SER_CMD_ATTR_NONE: No attribuate associated
311  * @WLAN_SER_CMD_ATTR_BLOCK: Blocking attribute
312  * @WLAN_SER_CMD_ATTR_NONBLOCK: Non-blocking attribute
313  */
314 enum wlan_ser_cmd_attr {
315 	WLAN_SER_CMD_ATTR_NONE,
316 	WLAN_SER_CMD_ATTR_BLOCK,
317 	WLAN_SER_CMD_ATTR_NONBLOCK,
318 };
319 
320 /**
321  * struct wlan_serialization_command - Command to be serialized
322  * @cmd_type: Type of command
323  * @cmd_id: Command Identifier
324  * @cmd_cb: Command callback
325  * @source: component ID of the source of the command
326  * @is_high_priority: Normal/High Priority at which the cmd has to be queued
327  * @is_blocking: Is the command blocking
328  * @queue_disable: Should the command disable the queues
329  * @activation_reason: reason the activation cb was called
330  * @cmd_timeout_cb: Command timeout callback
331  * @cmd_timeout_duration: Timeout duration in milliseconds
332  * @vdev: VDEV object associated to the command
333  * @umac_cmd: Actual command that needs to be sent to WMI/firmware
334  *
335  * Note: Unnamed union has been used in this structure, so that in future if
336  * somebody wants to add pdev or psoc structure then that person can add without
337  * modifying existing code.
338  */
339 struct wlan_serialization_command {
340 	enum wlan_serialization_cmd_type cmd_type;
341 	uint32_t cmd_id;
342 	wlan_serialization_cmd_callback cmd_cb;
343 	enum wlan_umac_comp_id source;
344 	uint8_t is_high_priority:1,
345 		is_blocking:1,
346 		queue_disable:1,
347 		activation_reason:3;
348 	uint32_t cmd_timeout_duration;
349 	union {
350 		struct wlan_objmgr_vdev *vdev;
351 	};
352 	void *umac_cmd;
353 };
354 
355 /**
356  * struct wlan_serialization_queued_cmd_info  - cmd that has to be cancelled
357  * @requestor: component ID of the source requesting this action
358  * @cmd_type: Command type
359  * @cmd_id: Command ID
360  * @req_type: Commands that need to be cancelled
361  * @vdev: VDEV object associated to the command
362  * @queue_type: Queues from which the command to be cancelled
363  */
364 struct wlan_serialization_queued_cmd_info {
365 	enum wlan_umac_comp_id requestor;
366 	enum wlan_serialization_cmd_type cmd_type;
367 	uint32_t cmd_id;
368 	enum wlan_serialization_cancel_type req_type;
369 	union {
370 		struct wlan_objmgr_vdev *vdev;
371 	};
372 	uint8_t queue_type;
373 };
374 
375 /**
376  * wlan_serialization_cancel_request() - Request to cancel a command
377  * @req: Request information
378  *
379  * This API is used by external components to cancel a command
380  * that is either in the pending or active queue. Based on the
381  * req_type, it is decided whether to use pdev or vdev
382  * object. For all non-scan commands, it will be pdev.
383  *
384  * Return: Status specifying the removal of a command from a certain queue
385  */
386 enum wlan_serialization_cmd_status
387 wlan_serialization_cancel_request(
388 		struct wlan_serialization_queued_cmd_info *req);
389 
390 /**
391  * wlan_serialization_remove_cmd() - Request to release a command
392  * @cmd: Command information
393  *
394  * This API is used to release a command sitting in the active
395  * queue upon successful completion of the command
396  *
397  * Return: None
398  */
399 void wlan_serialization_remove_cmd(
400 		struct wlan_serialization_queued_cmd_info *cmd);
401 
402 /**
403  * wlan_serialization_update_timer() -Update timer for an active command
404  * @cmd: Command information
405  *
406  * Return: Status of the timer update
407  */
408 QDF_STATUS
409 wlan_serialization_update_timer(struct wlan_serialization_command *cmd);
410 
411 /**
412  * wlan_serialization_request() - Request to serialize a command
413  * @cmd: Command information
414  *
415  * Return: Status of the serialization request
416  */
417 enum wlan_serialization_status
418 wlan_serialization_request(struct wlan_serialization_command *cmd);
419 
420 /**
421  * wlan_serialization_register_comp_info_cb() - Register component's info cb
422  * @psoc: PSOC object information
423  * @comp_id: Component ID
424  * @cmd_type: Command Type
425  * @cb: Callback
426  *
427  * This is called from component during its initialization.It initializes
428  * callback handler for given comp_id/cmd_id in a 2-D array.
429  *
430  * Return: QDF Status
431  */
432 QDF_STATUS
433 wlan_serialization_register_comp_info_cb(
434 		struct wlan_objmgr_psoc *psoc,
435 		enum wlan_umac_comp_id comp_id,
436 		enum wlan_serialization_cmd_type cmd_type,
437 		wlan_serialization_comp_info_cb cb);
438 
439 /**
440  * wlan_serialization_deregister_comp_info_cb() - Deregister component's info
441  *						callback
442  * @psoc: PSOC object information
443  * @comp_id: Component ID
444  * @cmd_type: Command Type
445  *
446  * This routine is called from other component during its de-initialization.
447  *
448  * Return: QDF Status
449  */
450 QDF_STATUS
451 wlan_serialization_deregister_comp_info_cb(
452 		struct wlan_objmgr_psoc *psoc,
453 		enum wlan_umac_comp_id comp_id,
454 		enum wlan_serialization_cmd_type cmd_type);
455 
456 /**
457  * wlan_serialization_register_apply_rules_cb() - Register component's rules
458  *						callback
459  * @psoc: PSOC object information
460  * @cmd_type: Command Type
461  * @apply_rules_cb: Callback
462  *
463  * This is called from component during its initialization.It initializes
464  * callback handler for given cmd_type in a 1-D array.
465  *
466  * Return: QDF Status
467  */
468 QDF_STATUS
469 wlan_serialization_register_apply_rules_cb(
470 		struct wlan_objmgr_psoc *psoc,
471 		enum wlan_serialization_cmd_type cmd_type,
472 		wlan_serialization_apply_rules_cb apply_rules_cb);
473 
474 /**
475  * wlan_serialization_deregister_apply_rules_cb() - Deregister component's rules
476  *						callback
477  * @psoc: PSOC object information
478  * @cmd_type: Command Type
479  *
480  * This routine is called from other component during its de-initialization.
481  *
482  * Return: QDF Status
483  */
484 QDF_STATUS
485 wlan_serialization_deregister_apply_rules_cb(
486 		struct wlan_objmgr_psoc *psoc,
487 		enum wlan_serialization_cmd_type cmd_type);
488 
489 /**
490  * wlan_serialization_init() - Serialization component initialization routine
491  *
492  * Return - QDF Status
493  */
494 QDF_STATUS wlan_serialization_init(void);
495 
496 /**
497  * wlan_serialization_deinit() - Serialization component de-init routine
498  *
499  * Return - QDF Status
500  */
501 QDF_STATUS wlan_serialization_deinit(void);
502 
503 /**
504  * wlan_serialization_psoc_enable() - Serialization component enable routine
505  * @psoc: pointer to psoc
506  *
507  * Return - QDF Status
508  */
509 QDF_STATUS wlan_serialization_psoc_enable(struct wlan_objmgr_psoc *psoc);
510 
511 /**
512  * wlan_serialization_psoc_disable() - Serialization component disable routine
513  * @psoc: pointer to psoc
514  *
515  * Return - QDF Status
516  */
517 QDF_STATUS wlan_serialization_psoc_disable(struct wlan_objmgr_psoc *psoc);
518 
519 /**
520  * wlan_serialization_vdev_scan_status() - Return the status of the vdev scan
521  * @vdev: VDEV Object
522  *
523  * Return: Status of the scans for the corresponding vdev
524  */
525 enum wlan_serialization_cmd_status
526 wlan_serialization_vdev_scan_status(struct wlan_objmgr_vdev *vdev);
527 
528 /**
529  * wlan_serialization_pdev_scan_status() - Return the status of the pdev scan
530  * @pdev: PDEV Object
531  *
532  * Return: Status of the scans for the corresponding pdev
533  */
534 enum wlan_serialization_cmd_status
535 wlan_serialization_pdev_scan_status(struct wlan_objmgr_pdev *pdev);
536 
537 /**
538  * wlan_serialization_is_cmd_present_in_pending_queue() - Return if the command
539  *				is already present in pending queue
540  * @psoc: pointer to psoc
541  * @cmd: pointer to serialization command to check
542  *
543  * This API will check if command is present in pending queue. If present
544  * then return true, so use know that it is duplicated command
545  *
546  * Return: true or false
547  */
548 bool wlan_serialization_is_cmd_present_in_pending_queue(
549 		struct wlan_objmgr_psoc *psoc,
550 		struct wlan_serialization_command *cmd);
551 
552 /**
553  * wlan_ser_is_non_scan_cmd_type_in_vdev_queue() - check if a non scan cmd
554  * type is present in pending vdev queue, without checking the cmd id
555  * @vdev: vdev on which cmd need to be check
556  * @cmd_type: command type to check
557  *
558  * Return: true or false
559  */
560 bool wlan_ser_is_non_scan_cmd_type_in_vdev_queue(struct wlan_objmgr_vdev *vdev,
561 				enum wlan_serialization_cmd_type cmd_type);
562 
563 /**
564  * wlan_serialization_is_cmd_present_in_active_queue() - Return if the command
565  *			is already present in active queue
566  * @psoc: pointer to psoc
567  * @cmd: pointer to serialization command to check
568  *
569  * This API will check if command is present in active queue. If present
570  * then return true, so use know that it is duplicated command
571  *
572  * Return: true or false
573  */
574 bool wlan_serialization_is_cmd_present_in_active_queue(
575 		struct wlan_objmgr_psoc *psoc,
576 		struct wlan_serialization_command *cmd);
577 
578 /**
579  * wlan_serialization_get_scan_cmd_using_scan_id() - Return command which
580  *					matches vdev_id and scan_id
581  * @psoc: pointer to soc
582  * @vdev_id: vdev id to pull vdev object
583  * @scan_id: scan id to match
584  * @is_scan_cmd_from_active_queue: to indicate active or pending queue
585  *
586  * This API fetches vdev/pdev object based on vdev_id, loops through scan
587  * command queue and find the command which matches scan id as well as vdev
588  * object.
589  *
590  * Return: pointer to serialization command
591  */
592 struct wlan_serialization_command*
593 wlan_serialization_get_scan_cmd_using_scan_id(
594 		struct wlan_objmgr_psoc *psoc,
595 		uint8_t vdev_id, uint16_t scan_id,
596 		uint8_t is_scan_cmd_from_active_queue);
597 
598 /**
599  * wlan_serialization_get_active_cmd() - Return active umac command which
600  *  matches vdev and cmd type
601  * @psoc: pointer to soc
602  * @vdev_id: vdev id to pull vdev object
603  * @cmd_type: cmd type to match
604  *
605  * This API fetches vdev/pdev object based on vdev_id, loops through active
606  * command queue and find the active command which matches cmd_type as well
607  * as vdev object.
608  *
609  * Return: Pointer to umac command. NULL is returned if active command of given
610  *  type is not found.
611  */
612 void *wlan_serialization_get_active_cmd(
613 		struct wlan_objmgr_psoc *psoc,
614 		uint8_t vdev_id,
615 		enum wlan_serialization_cmd_type cmd_type);
616 
617 /**
618  * wlan_serialization_get_vdev_active_cmd_type() - Return cmd type of the
619  *  active command for the given vdev
620  * @vdev: vdev object
621  *
622  * This API fetches command type of the command in the vdev active queue
623  *
624  * Return: command type of the command in the vdev active queue
625  */
626 
627 enum wlan_serialization_cmd_type
628 wlan_serialization_get_vdev_active_cmd_type(struct wlan_objmgr_vdev *vdev);
629 
630 /**
631  * wlan_ser_get_cmd_activation_status() - Return active command status
632  * @vdev: vdev object
633  *
634  * This API fetches active command state in the vdev active queue
635  *
636  * Return: success if CMD_MARKED_FOR_ACTIVATION bit is set, else fail
637  */
638 
639 QDF_STATUS
640 wlan_ser_get_cmd_activation_status(struct wlan_objmgr_vdev *vdev);
641 
642 /**
643  * wlan_ser_is_vdev_queue_enabled() - Return vdev queue status
644  * @vdev: vdev object
645  *
646  * This API return vdev queue enable status
647  *
648  * Return: true if vdev queue is enabled
649  */
650 bool wlan_ser_is_vdev_queue_enabled(struct wlan_objmgr_vdev *vdev);
651 
652 /**
653  * wlan_ser_validate_umac_cmd() - validate umac cmd data
654  * @vdev: objmgr vdev pointer
655  * @cmd_type: cmd type to match
656  * @umac_cmd_cb: Callback to be called to validate the data
657  *
658  * This API returns the validation status of the umac cmd cb.
659  * The umac_cmd_cb callback is called with serialization lock held, and hence
660  * only atomic operations are allowed in the callback.
661  *
662  * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_FAILURE
663  */
664 QDF_STATUS
665 wlan_ser_validate_umac_cmd(struct wlan_objmgr_vdev *vdev,
666 			   enum wlan_serialization_cmd_type cmd_type,
667 			   wlan_ser_umac_cmd_cb umac_cmd_cb);
668 
669 /**
670  * wlan_serialization_purge_all_pdev_cmd() - purge all command for given pdev
671  * @pdev: objmgr pdev pointer
672  *
673  * Return: void
674  */
675 void wlan_serialization_purge_all_pdev_cmd(struct wlan_objmgr_pdev *pdev);
676 
677 /**
678  * wlan_serialization_purge_all_cmd() - purge all command for psoc
679  * @psoc: objmgr psoc pointer
680  *
681  * Return: void
682  */
683 void wlan_serialization_purge_all_cmd(struct wlan_objmgr_psoc *psoc);
684 
685 /**
686  * wlan_serialization_purge_all_pending_cmd_by_vdev_id() - Purge all pending
687  * scan and non scan commands for vdev id
688  * @pdev: pointer to pdev
689  * @vdev_id: vdev_id variable
690  *
691  * Return: none
692  */
693 void wlan_serialization_purge_all_pending_cmd_by_vdev_id(
694 					struct wlan_objmgr_pdev *pdev,
695 					uint8_t vdev_id);
696 
697 /**
698  * wlan_serialization_purge_all_cmd_by_vdev_id() - Purge all scan and non scan
699  * commands for vdev id
700  * @pdev: pointer to pdev
701  * @vdev_id: vdev_id variable
702  *
703  * Return: none
704  */
705 void wlan_serialization_purge_all_cmd_by_vdev_id(struct wlan_objmgr_pdev *pdev,
706 						 uint8_t vdev_id);
707 
708 /**
709  * wlan_serialization_purge_all_scan_cmd_by_vdev_id() - Purge all pending/active
710  * scan commands for vdev id
711  * @pdev: pointer to pdev
712  * @vdev_id: vdev_id variable
713  *
714  * Return: none
715  */
716 void wlan_serialization_purge_all_scan_cmd_by_vdev_id(
717 					struct wlan_objmgr_pdev *pdev,
718 					uint8_t vdev_id);
719 
720 /**
721  * wlan_ser_vdev_queue_disable -Disable vdev specific serialization queue
722  * @vdev: Vdev Object
723  *
724  * This function disables the serialization for the vdev queue
725  *
726  * Return: QDF_STATUS
727  */
728 QDF_STATUS wlan_ser_vdev_queue_disable(struct wlan_objmgr_vdev *vdev);
729 
730 /**
731  * wlan_get_vdev_status() - API to check vdev scan status
732  * @vdev: vdev object
733  *
734  * Return: enum scm_scan_status
735  */
736 enum scm_scan_status
737 wlan_get_vdev_status(struct wlan_objmgr_vdev *vdev);
738 
739 /**
740  * wlan_get_pdev_status() - API to check pdev scan status
741  * @pdev: pdev object
742  *
743  * Return: enum scm_scan_status
744  */
745 enum scm_scan_status
746 wlan_get_pdev_status(struct wlan_objmgr_pdev *pdev);
747 
748 /**
749  * wlan_serialization_is_blocking_non_scan_cmd_waiting() - find if any
750  *			blocking cmd in active or pending queue
751  * @pdev: Objmgr pdev
752  *
753  * This API will be called to find out if any blocking cmd is present in
754  * active or pending queue
755  *
756  * Return: true or false
757  */
758 bool
759 wlan_serialization_is_blocking_non_scan_cmd_waiting(
760 				struct wlan_objmgr_pdev *pdev);
761 #endif
762