1 /*
2 * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 /*
18 * DOC: contains MLO manager public file containing link switch functionality
19 */
20 #ifndef _WLAN_MLO_MGR_LINK_SWITCH_H_
21 #define _WLAN_MLO_MGR_LINK_SWITCH_H_
22
23 #include <wlan_mlo_mgr_public_structs.h>
24 #include <wlan_cm_public_struct.h>
25
26 struct wlan_channel;
27
28 #define WLAN_MLO_LSWITCH_MAX_HISTORY 5
29 #ifndef WLAN_MAX_ML_BSS_LINKS
30 #define WLAN_MAX_ML_BSS_LINKS 1
31 #endif
32
33 /**
34 * enum wlan_mlo_link_switch_cnf_reason: Link Switch reject reason
35 *
36 * @MLO_LINK_SWITCH_CNF_REASON_BSS_PARAMS_CHANGED: Link's BSS params changed
37 * @MLO_LINK_SWITCH_CNF_REASON_CONCURRECNY_CONFLICT: Rejected because of
38 * Concurrency
39 * @MLO_LINK_SWITCH_CNF_REASON_HOST_INTERNAL_ERROR: Host internal error
40 * @MLO_LINK_SWITCH_CNF_REASON_MAX: Maximum reason for link switch rejection
41 */
42 enum wlan_mlo_link_switch_cnf_reason {
43 MLO_LINK_SWITCH_CNF_REASON_BSS_PARAMS_CHANGED = 1,
44 MLO_LINK_SWITCH_CNF_REASON_CONCURRECNY_CONFLICT = 2,
45 MLO_LINK_SWITCH_CNF_REASON_HOST_INTERNAL_ERROR = 3,
46 MLO_LINK_SWITCH_CNF_REASON_MAX,
47 };
48
49 /**
50 * enum wlan_mlo_link_switch_cnf_status: Link Switch Confirmation status
51 *
52 * @MLO_LINK_SWITCH_CNF_STATUS_ACCEPT: Link switch accepted
53 * @MLO_LINK_SWITCH_CNF_STATUS_REJECT: Rejected because link switch cnf reason
54 * @MLO_LINK_SWITCH_CNF_STATUS_MAX: Maximum reason for link status
55 */
56 enum wlan_mlo_link_switch_cnf_status {
57 MLO_LINK_SWITCH_CNF_STATUS_ACCEPT = 0,
58 MLO_LINK_SWITCH_CNF_STATUS_REJECT = 1,
59 MLO_LINK_SWITCH_CNF_STATUS_MAX,
60 };
61
62 /**
63 * struct wlan_mlo_link_switch_cnf: structure to hold link switch conf info
64 *
65 * @vdev_id: VDEV ID of link switch link
66 * @status: Link Switch Confirmation status
67 * @reason: Link Switch Reject reason
68 */
69 struct wlan_mlo_link_switch_cnf {
70 uint32_t vdev_id;
71 enum wlan_mlo_link_switch_cnf_status status;
72 enum wlan_mlo_link_switch_cnf_reason reason;
73 };
74
75 /**
76 * enum wlan_mlo_link_switch_reason- Reason for link switch
77 *
78 * @MLO_LINK_SWITCH_REASON_RSSI_CHANGE: Link switch reason is because of RSSI
79 * @MLO_LINK_SWITCH_REASON_LOW_QUALITY: Link switch reason is because of low
80 * quality
81 * @MLO_LINK_SWITCH_REASON_C2_CHANGE: Link switch reason is because of C2 Metric
82 * @MLO_LINK_SWITCH_REASON_HOST_FORCE: Link switch reason is because of host
83 * force active/inactive
84 * @MLO_LINK_SWITCH_REASON_T2LM: Link switch reason is because of T2LM
85 * @MLO_LINK_SWITCH_REASON_MAX: Link switch reason max
86 */
87 enum wlan_mlo_link_switch_reason {
88 MLO_LINK_SWITCH_REASON_RSSI_CHANGE = 1,
89 MLO_LINK_SWITCH_REASON_LOW_QUALITY = 2,
90 MLO_LINK_SWITCH_REASON_C2_CHANGE = 3,
91 MLO_LINK_SWITCH_REASON_HOST_FORCE = 4,
92 MLO_LINK_SWITCH_REASON_T2LM = 5,
93 MLO_LINK_SWITCH_REASON_MAX,
94 };
95
96 /*
97 * enum mlo_link_switch_req_state - Enum to maintain the current state of
98 * link switch request.
99 * @MLO_LINK_SWITCH_STATE_IDLE: The last link switch request is inactive
100 * @MLO_LINK_SWITCH_STATE_INIT: Link switch is in pre-start state.
101 * @MLO_LINK_SWITCH_STATE_DISCONNECT_CURR_LINK: Current link disconnect
102 * in progress.
103 * @MLO_LINK_SWITCH_STATE_SET_MAC_ADDR: MAC address update in progress
104 * @MLO_LINK_SWITCH_STATE_CONNECT_NEW_LINK: New link connect in progress.
105 * @MLO_LINK_SWITCH_STATE_COMPLETE_SUCCESS: Link switch completed successfully
106 * @MLO_LINK_SWITCH_STATE_ABORT_TRANS: Do not allow any further state
107 * transition, only allowed to move to
108 * MLO_LINK_SWITCH_STATE_IDLE state.
109 */
110 enum mlo_link_switch_req_state {
111 MLO_LINK_SWITCH_STATE_IDLE,
112 MLO_LINK_SWITCH_STATE_INIT,
113 MLO_LINK_SWITCH_STATE_DISCONNECT_CURR_LINK,
114 MLO_LINK_SWITCH_STATE_SET_MAC_ADDR,
115 MLO_LINK_SWITCH_STATE_CONNECT_NEW_LINK,
116 MLO_LINK_SWITCH_STATE_COMPLETE_SUCCESS,
117 MLO_LINK_SWITCH_STATE_ABORT_TRANS,
118 };
119
120 /**
121 * struct wlan_mlo_link_switch_req - Data Structure because of link switch
122 * request
123 * @vdev_id: VDEV Id of the link which is under link switch
124 * @curr_ieee_link_id: Current link id of the ML link
125 * @new_ieee_link_id: Link id of the link to which going to link switched
126 * @peer_mld_addr: Peer MLD address
127 * @new_primary_freq: primary frequency of link switch link
128 * @new_phymode: Phy mode of link switch link
129 * @state: Current state of link switch
130 * @reason: Link switch reason
131 * @restore_vdev_flag: VDEV Flag to be restored post link switch.
132 * @link_switch_ts: Link switch timestamp
133 */
134 struct wlan_mlo_link_switch_req {
135 uint8_t vdev_id;
136 uint8_t curr_ieee_link_id;
137 uint8_t new_ieee_link_id;
138 struct qdf_mac_addr peer_mld_addr;
139 uint32_t new_primary_freq;
140 uint32_t new_phymode;
141 enum mlo_link_switch_req_state state;
142 enum wlan_mlo_link_switch_reason reason;
143 bool restore_vdev_flag;
144 qdf_time_t link_switch_ts;
145 };
146
147 /**
148 * struct mlo_link_switch_stats - hold information regarding link switch stats
149 * @total_num_link_switch: Total number of link switch
150 * @req_reason: Reason of link switch received from FW
151 * @cnf_reason: Confirm reason sent to FW
152 * @req_ts: Link switch timestamp
153 * @lswitch_status: structure to hold link switch status
154 */
155 struct mlo_link_switch_stats {
156 uint32_t total_num_link_switch;
157 struct {
158 enum wlan_mlo_link_switch_reason req_reason;
159 enum wlan_mlo_link_switch_cnf_reason cnf_reason;
160 qdf_time_t req_ts;
161 } lswitch_status[WLAN_MLO_LSWITCH_MAX_HISTORY];
162 };
163
164 /**
165 * struct mlo_link_switch_context - Link switch data structure.
166 * @links_info: Hold information regarding all the links of ml connection
167 * @last_req: Last link switch request received from FW
168 * @lswitch_stats: History of the link switch stats
169 * Includes both fail and success stats.
170 */
171 struct mlo_link_switch_context {
172 struct mlo_link_info links_info[WLAN_MAX_ML_BSS_LINKS];
173 struct wlan_mlo_link_switch_req last_req;
174 struct mlo_link_switch_stats lswitch_stats[MLO_LINK_SWITCH_CNF_STATUS_MAX];
175 };
176
177 /**
178 * mlo_mgr_update_link_info_mac_addr() - MLO mgr update link info mac address
179 * @vdev: Object manager vdev
180 * @mlo_mac_update: ML link mac addresses update.
181 *
182 * Update link mac addresses for the ML links
183 * Return: none
184 */
185 void
186 mlo_mgr_update_link_info_mac_addr(struct wlan_objmgr_vdev *vdev,
187 struct wlan_mlo_link_mac_update *mlo_mac_update);
188
189 /**
190 * mlo_mgr_update_link_info_reset() - Reset link info of ml dev context
191 * @psoc: psoc pointer
192 * @ml_dev: MLO device context
193 *
194 * Reset link info of ml links
195 * Return: QDF_STATUS
196 */
197 void mlo_mgr_update_link_info_reset(struct wlan_objmgr_psoc *psoc,
198 struct wlan_mlo_dev_context *ml_dev);
199
200 /**
201 * mlo_mgr_update_ap_link_info() - Update AP links information
202 * @vdev: Object Manager vdev
203 * @link_id: Link id of the AP MLD link
204 * @ap_link_addr: AP link addresses
205 * @channel: wlan channel information of the link
206 *
207 * Update AP link information for each link of AP MLD
208 * Return: void
209 */
210 void mlo_mgr_update_ap_link_info(struct wlan_objmgr_vdev *vdev, uint8_t link_id,
211 uint8_t *ap_link_addr,
212 struct wlan_channel channel);
213
214 /**
215 * mlo_mgr_clear_ap_link_info() - Clear AP link information
216 * @vdev: Object Manager vdev
217 * @ap_link_addr: AP link addresses
218 *
219 * Clear AP link info
220 * Return: void
221 */
222 void mlo_mgr_clear_ap_link_info(struct wlan_objmgr_vdev *vdev,
223 uint8_t *ap_link_addr);
224
225 /**
226 * mlo_mgr_reset_ap_link_info() - Reset AP links information
227 * @vdev: Object Manager vdev
228 *
229 * Reset AP links information in MLD
230 */
231 void mlo_mgr_reset_ap_link_info(struct wlan_objmgr_vdev *vdev);
232
233 /**
234 * mlo_mgr_update_ap_channel_info() - Update AP channel information
235 * @vdev: Object Manager vdev
236 * @link_id: Link id of the AP MLD link
237 * @ap_link_addr: AP link addresses
238 * @channel: wlan channel information of the link
239 *
240 * Update AP channel information for each link of AP MLD
241 * Return: void
242 */
243 void mlo_mgr_update_ap_channel_info(struct wlan_objmgr_vdev *vdev,
244 uint8_t link_id,
245 uint8_t *ap_link_addr,
246 struct wlan_channel channel);
247
248 /**
249 * mlo_mgr_get_ap_link() - Assoc mlo link info from link id
250 * @vdev: Object Manager vdev
251 *
252 * Get Assoc link info.
253 *
254 * Return: Pointer of link info
255 */
256 struct mlo_link_info *mlo_mgr_get_ap_link(struct wlan_objmgr_vdev *vdev);
257
258 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
259 /**
260 * mlo_mgr_get_ap_link_by_link_id() - Get mlo link info from link id
261 * @mlo_dev_ctx: mlo context
262 * @link_id: Link id of the AP MLD link
263 *
264 * Search for the @link_id in the array in link_ctx in mlo_dev_ctx.
265 * Returns the pointer of mlo_link_info element matching the @link_id,
266 * or else NULL.
267 *
268 * Return: Pointer of link info
269 */
270 struct mlo_link_info*
271 mlo_mgr_get_ap_link_by_link_id(struct wlan_mlo_dev_context *mlo_dev_ctx,
272 int link_id);
273
274 /**
275 * mlo_mgr_update_csa_link_info - update mlo sta csa params
276 * @pdev: pdev object manager
277 * @mlo_dev_ctx: mlo dev ctx
278 * @csa_param: csa parameters to be updated
279 * @link_id: link id
280 * Return : true if csa parameters are updated
281 */
282 bool mlo_mgr_update_csa_link_info(struct wlan_objmgr_pdev *pdev,
283 struct wlan_mlo_dev_context *mlo_dev_ctx,
284 struct csa_offload_params *csa_param,
285 uint8_t link_id);
286
287 /**
288 * mlo_mgr_osif_update_connect_info() - Update connection info to OSIF
289 * layer on successful connection complete.
290 * @vdev: VDEV object manager.
291 * @link_id: IEEE protocol link id.
292 *
293 * The API will call OSIF connection update callback to update IEEE link id
294 * as part of connection to MLO capable BSS. This is specifically needed to
295 * make OSIF aware of all the links part of connection even about the links
296 * for which VDEV doesn't exist.
297 *
298 * Return: void
299 */
300 void mlo_mgr_osif_update_connect_info(struct wlan_objmgr_vdev *vdev,
301 int32_t link_id);
302
303 /**
304 * mlo_mgr_link_switch_disconnect_done() - Notify MLO manager on link switch
305 * disconnect complete.
306 * @vdev: VDEV object manager
307 * @status: Status of disconnect
308 * @is_link_switch_resp: Set to true is disconnect response is for link switch
309 * disconnect request else false.
310 *
311 * The API to decide on next sequence of tasks based on status on disconnect
312 * request send as part of link switch. If the status is error, then abort
313 * link switch or else continue.
314 *
315 * If API is called with @is_link_switch_resp argument as false, then some
316 * other thread initiated disconnect, in this scenario change the state of
317 * link switch to abort further state transition and return, in actual link
318 * switch flow check this state to abort link switch.
319 *
320 * Return: QDF_STATUS
321 */
322 QDF_STATUS mlo_mgr_link_switch_disconnect_done(struct wlan_objmgr_vdev *vdev,
323 QDF_STATUS status,
324 bool is_link_switch_resp);
325
326 /**
327 * mlo_mgr_link_switch_set_mac_addr_resp() - Handle response of set MAC addr
328 * for VDEV under going link switch.
329 * @vdev: VDEV object manager
330 * @resp_status: Status of MAC address set request.
331 *
332 * The function will handle the response for set MAC address request sent to FW
333 * as part of link switch. If the response is error, then abort the link switch
334 * and send the appropirate status to FW
335 *
336 * Return: QDF_STATUS
337 */
338 QDF_STATUS mlo_mgr_link_switch_set_mac_addr_resp(struct wlan_objmgr_vdev *vdev,
339 uint8_t resp_status);
340
341 /**
342 * mlo_mgr_link_switch_start_connect() - Start link switch connect on new link
343 * @vdev: VDEV pointer.
344 *
345 * Call the API to initiate connection for link switch post successful set mac
346 * address on @vdev.
347 *
348 * Return:QDF_STATUS
349 */
350 QDF_STATUS mlo_mgr_link_switch_start_connect(struct wlan_objmgr_vdev *vdev);
351
352 /**
353 * mlo_mgr_link_switch_connect_done() - Link switch connect done indication.
354 * @vdev: VDEV object manager
355 * @status: Status of connect request.
356 *
357 * The callback from connection manager with connect response.
358 * If the response is failure, don't change the state of link switch.
359 * If the response if success, set link switch state to
360 * MLO_LINK_SWITCH_STATE_COMPLETE_SUCCESS.
361 * Finally call remove link switch cmd from serialization.
362 *
363 * Return: void
364 */
365 void mlo_mgr_link_switch_connect_done(struct wlan_objmgr_vdev *vdev,
366 QDF_STATUS status);
367
368 /**
369 * mlo_mgr_link_switch_init_state() - Set the current state of link switch
370 * to init state.
371 * @mlo_dev_ctx: MLO dev context
372 *
373 * Sets the current state of link switch to MLO_LINK_SWITCH_STATE_IDLE with
374 * MLO dev context lock held.
375 *
376 * Return: void
377 */
378 void mlo_mgr_link_switch_init_state(struct wlan_mlo_dev_context *mlo_dev_ctx);
379
380 /**
381 * mlo_mgr_link_switch_trans_next_state() - Transition to next state based
382 * on current state.
383 * @mlo_dev_ctx: MLO dev context
384 *
385 * Move to next state in link switch process based on current state with
386 * MLO dev context lock held.
387 *
388 * Return: void
389 */
390 QDF_STATUS
391 mlo_mgr_link_switch_trans_next_state(struct wlan_mlo_dev_context *mlo_dev_ctx);
392
393 /**
394 * mlo_mgr_link_switch_trans_abort_state() - Transition to abort trans state.
395 * @mlo_dev_ctx: ML dev context pointer of VDEV
396 *
397 * Transition the current link switch state to MLO_LINK_SWITCH_STATE_ABORT_TRANS
398 * state, no further state transitions are allowed in the ongoing link switch
399 * request.
400 *
401 * Return: void
402 */
403 void
404 mlo_mgr_link_switch_trans_abort_state(struct wlan_mlo_dev_context *mlo_dev_ctx);
405
406 /**
407 * mlo_mgr_link_switch_get_curr_state() - Get the current state of link switch.
408 * @mlo_dev_ctx: MLO dev context.
409 *
410 * Get the current state of link switch with MLO dev context lock held.
411 *
412 * Return: void
413 */
414 enum mlo_link_switch_req_state
415 mlo_mgr_link_switch_get_curr_state(struct wlan_mlo_dev_context *mlo_dev_ctx);
416
417 /**
418 * mlo_mgr_is_link_switch_in_progress() - Check in link ctx in MLO dev context
419 * if the last received link switch is in progress.
420 * @vdev: VDEV object manager
421 *
422 * The API is to be called for VDEV which has MLO dev context and link context
423 * initialized. Returns the value of 'is_in_progress' flag in last received
424 * link switch request.
425 *
426 * Return: bool
427 */
428 bool mlo_mgr_is_link_switch_in_progress(struct wlan_objmgr_vdev *vdev);
429
430 /**
431 * mlo_mgr_link_switch_notification() - Notify MLO manager on start
432 * of link switch
433 * @vdev: VDEV object manager
434 * @lswitch_req: Link switch request params from FW
435 * @notify_reason: Reason for link switch notification
436 *
437 * The link switch notifier callback to MLO manager invoked before starting
438 * link switch disconnect
439 *
440 * Return: QDF_STATUS
441 */
442 QDF_STATUS mlo_mgr_link_switch_notification(struct wlan_objmgr_vdev *vdev,
443 struct wlan_mlo_link_switch_req *lswitch_req,
444 enum wlan_mlo_link_switch_notify_reason notify_reason);
445
446 /**
447 * mlo_mgr_is_link_switch_on_assoc_vdev() - API to query whether link switch
448 * is on-going on assoc VDEV.
449 * @vdev: VDEV object manager
450 *
451 * Return: bool
452 */
453 bool mlo_mgr_is_link_switch_on_assoc_vdev(struct wlan_objmgr_vdev *vdev);
454
455 /**
456 * mlo_mgr_link_switch_get_assoc_vdev() - Get current link switch VDEV
457 * pointer if it is assoc VDEV.
458 * @vdev: VDEV object manager.
459 *
460 * If the current link switch VDEV is assoc VDEV, fetch the pointer of that VDEV
461 *
462 * Return: VDEV object manager pointer
463 */
464 struct wlan_objmgr_vdev *
465 mlo_mgr_link_switch_get_assoc_vdev(struct wlan_objmgr_vdev *vdev);
466
467 /**
468 * mlo_mgr_ser_link_switch_cmd() - The API will serialize link switch
469 * command in serialization queue.
470 * @vdev: VDEV objmgr pointer
471 * @req: Link switch request parameters
472 *
473 * On receiving link switch request with valid parameters from FW, this
474 * API will serialize the link switch command to procced for link switch
475 * on @vdev once the command comes to active queue.
476 *
477 * Return: QDF_STATUS
478 */
479 QDF_STATUS mlo_mgr_ser_link_switch_cmd(struct wlan_objmgr_vdev *vdev,
480 struct wlan_mlo_link_switch_req *req);
481
482 /**
483 * mlo_mgr_remove_link_switch_cmd() - The API will remove the link switch
484 * command from active serialization queue.
485 * @vdev: VDEV object manager
486 *
487 * Once link switch process on @vdev is completed either in success of failure
488 * case, the API removes the link switch command from serialization queue.
489 *
490 * Return: void
491 */
492 void mlo_mgr_remove_link_switch_cmd(struct wlan_objmgr_vdev *vdev);
493
494 /**
495 * mlo_mgr_link_switch_notify() - API to notify registered link switch notify
496 * callbacks.
497 * @vdev: VDEV object manager
498 * @req: Link switch request params from FW.
499 *
500 * The API calls all the registered link switch notifiers with appropriate
501 * reason for notifications. Callback handlers to take necessary action based
502 * on the reason.
503 * If any callback returns error API will return error or else success.
504 *
505 * Return: QDF_STATUS.
506 */
507 QDF_STATUS
508 mlo_mgr_link_switch_notify(struct wlan_objmgr_vdev *vdev,
509 struct wlan_mlo_link_switch_req *req);
510
511 /**
512 * mlo_mgr_link_switch_validate_request() - Validate link switch request
513 * received from FW.
514 * @vdev: VDEV object manager
515 * @req: Request params from FW
516 *
517 * The API performs initial validation of link switch params received from FW
518 * before serializing the link switch cmd. If any of the params is invalid or
519 * the current status of MLO manager can't allow link switch, the API returns
520 * failure and link switch has to be terminated.
521 *
522 * Return: QDF_STATUS
523 */
524 QDF_STATUS
525 mlo_mgr_link_switch_validate_request(struct wlan_objmgr_vdev *vdev,
526 struct wlan_mlo_link_switch_req *req);
527
528 /**
529 * mlo_mgr_link_switch_request_params() - Link switch request params from FW.
530 * @psoc: PSOC object manager
531 * @evt_params: Link switch params received from FW.
532 *
533 * The @params contain link switch request parameters received from FW as
534 * an indication to host to trigger link switch sequence on the specified
535 * VDEV. If the @params are not valid link switch will be terminated.
536 *
537 * Return: QDF_STATUS
538 */
539 QDF_STATUS mlo_mgr_link_switch_request_params(struct wlan_objmgr_psoc *psoc,
540 void *evt_params);
541 /**
542 * mlo_mgr_link_state_switch_info_handler() - Handle Link State change related
543 * information and generate corresponding connectivity logging event
544 * @psoc: Pointer to PSOC object
545 * @info: Source info to be sent for the logging event
546 *
547 * Return: QDF_STATUS
548 */
549 QDF_STATUS
550 mlo_mgr_link_state_switch_info_handler(struct wlan_objmgr_psoc *psoc,
551 struct mlo_link_switch_state_info *info);
552
553 /**
554 * mlo_mgr_link_switch_complete() - Link switch complete notification to FW
555 * @vdev: VDV object manager
556 *
557 * Notify the status of link switch to FW once the link switch sequence is
558 * completed.
559 *
560 * Return: QDF_STATUS;
561 */
562 QDF_STATUS mlo_mgr_link_switch_complete(struct wlan_objmgr_vdev *vdev);
563
564 /**
565 * mlo_mgr_link_switch_send_cnf_cmd() - Send status of link switch request to FW
566 * @psoc: PSOC object manager
567 * @cnf_params: Link switch confirm params to send to FW
568 *
569 * The API sends the link switch confirm params received to FW.
570 * Returns error incase it failed to notify FW.
571 *
572 * Return: QDF_STATUS
573 */
574 QDF_STATUS
575 mlo_mgr_link_switch_send_cnf_cmd(struct wlan_objmgr_psoc *psoc,
576 struct wlan_mlo_link_switch_cnf *cnf_params);
577
578 /**
579 * mlo_mgr_link_switch_defer_disconnect_req() - Defer disconnect request from
580 * source other than link switch
581 * @vdev: VDEV object manager
582 * @source: Disconnect requestor
583 * @reason: Reason for disconnect
584 *
585 * If link switch is in progress for @vdev, then queue to disconnect request
586 * received in the MLO dev context and move link switch state to abort and
587 * on completion of link switch schedule pending disconnect requests.
588 *
589 * If link switch is not in progress or already another disconnect in queued in
590 * MLO dev context then reject the disconnect defer request.
591 *
592 * Return: QDF_STATUS.
593 */
594 QDF_STATUS
595 mlo_mgr_link_switch_defer_disconnect_req(struct wlan_objmgr_vdev *vdev,
596 enum wlan_cm_source source,
597 enum wlan_reason_code reason);
598
599 /**
600 * mlo_mgr_link_switch_init() - API to initialize link switch
601 * @psoc: PSOC object manager
602 * @ml_dev: MLO dev context
603 *
604 * Initializes the MLO link context in @ml_dev and allocates various
605 * buffers needed.
606 *
607 * Return: QDF_STATUS
608 */
609 QDF_STATUS mlo_mgr_link_switch_init(struct wlan_objmgr_psoc *psoc,
610 struct wlan_mlo_dev_context *ml_dev);
611
612 /**
613 * mlo_mgr_link_switch_deinit() - API to de-initialize link switch
614 * @ml_dev: MLO dev context
615 *
616 * De-initialize the MLO link context in @ml_dev on and frees memory
617 * allocated as part of initialization.
618 *
619 * Return: QDF_STATUS
620 */
621 QDF_STATUS mlo_mgr_link_switch_deinit(struct wlan_mlo_dev_context *ml_dev);
622
623 static inline bool
mlo_mgr_is_link_switch_supported(struct wlan_objmgr_vdev * vdev)624 mlo_mgr_is_link_switch_supported(struct wlan_objmgr_vdev *vdev)
625 {
626 return true;
627 }
628
629 #else
630 static inline struct mlo_link_info
mlo_mgr_get_ap_link_by_link_id(struct wlan_mlo_dev_context * mlo_dev_ctx,int link_id)631 *mlo_mgr_get_ap_link_by_link_id(struct wlan_mlo_dev_context *mlo_dev_ctx,
632 int link_id)
633 {
634 return NULL;
635 }
636
637 static inline bool
mlo_mgr_is_link_switch_supported(struct wlan_objmgr_vdev * vdev)638 mlo_mgr_is_link_switch_supported(struct wlan_objmgr_vdev *vdev)
639 {
640 return false;
641 }
642
643 static inline void
mlo_mgr_osif_update_connect_info(struct wlan_objmgr_vdev * vdev,int32_t link_id)644 mlo_mgr_osif_update_connect_info(struct wlan_objmgr_vdev *vdev, int32_t link_id)
645 {
646 }
647
648 static inline QDF_STATUS
mlo_mgr_link_switch_disconnect_done(struct wlan_objmgr_vdev * vdev,QDF_STATUS status,bool is_link_switch_resp)649 mlo_mgr_link_switch_disconnect_done(struct wlan_objmgr_vdev *vdev,
650 QDF_STATUS status,
651 bool is_link_switch_resp)
652 {
653 return QDF_STATUS_SUCCESS;
654 }
655
656 static inline QDF_STATUS
mlo_mgr_link_switch_set_mac_addr_resp(struct wlan_objmgr_vdev * vdev,uint8_t resp_status)657 mlo_mgr_link_switch_set_mac_addr_resp(struct wlan_objmgr_vdev *vdev,
658 uint8_t resp_status)
659 {
660 return QDF_STATUS_E_NOSUPPORT;
661 }
662
663 static inline QDF_STATUS
mlo_mgr_link_switch_start_connect(struct wlan_objmgr_vdev * vdev)664 mlo_mgr_link_switch_start_connect(struct wlan_objmgr_vdev *vdev)
665 {
666 return QDF_STATUS_E_NOSUPPORT;
667 }
668
669 static inline void
mlo_mgr_link_switch_connect_done(struct wlan_objmgr_vdev * vdev,QDF_STATUS status)670 mlo_mgr_link_switch_connect_done(struct wlan_objmgr_vdev *vdev,
671 QDF_STATUS status)
672 {
673 }
674
675 static inline QDF_STATUS
mlo_mgr_link_switch_deinit(struct wlan_mlo_dev_context * ml_dev)676 mlo_mgr_link_switch_deinit(struct wlan_mlo_dev_context *ml_dev)
677 {
678 return QDF_STATUS_SUCCESS;
679 }
680
681 static inline QDF_STATUS
mlo_mgr_link_switch_init(struct wlan_objmgr_psoc * psoc,struct wlan_mlo_dev_context * ml_dev)682 mlo_mgr_link_switch_init(struct wlan_objmgr_psoc *psoc,
683 struct wlan_mlo_dev_context *ml_dev)
684 {
685 return QDF_STATUS_SUCCESS;
686 }
687
688 static inline void
mlo_mgr_link_switch_init_state(struct wlan_mlo_dev_context * mlo_dev_ctx)689 mlo_mgr_link_switch_init_state(struct wlan_mlo_dev_context *mlo_dev_ctx)
690 {
691 }
692
693 static inline QDF_STATUS
mlo_mgr_link_switch_trans_next_state(struct wlan_mlo_dev_context * mlo_dev_ctx)694 mlo_mgr_link_switch_trans_next_state(struct wlan_mlo_dev_context *mlo_dev_ctx)
695 {
696 return QDF_STATUS_E_INVAL;
697 }
698
699 static inline void
mlo_mgr_link_switch_trans_abort_state(struct wlan_mlo_dev_context * mlo_dev_ctx)700 mlo_mgr_link_switch_trans_abort_state(struct wlan_mlo_dev_context *mlo_dev_ctx)
701 {
702 }
703
704 static inline enum mlo_link_switch_req_state
mlo_mgr_link_switch_get_curr_state(struct wlan_mlo_dev_context * mlo_dev_ctx)705 mlo_mgr_link_switch_get_curr_state(struct wlan_mlo_dev_context *mlo_dev_ctx)
706 {
707 return MLO_LINK_SWITCH_STATE_IDLE;
708 }
709
710 static inline bool
mlo_mgr_is_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)711 mlo_mgr_is_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
712 {
713 return false;
714 }
715
716 static inline QDF_STATUS
mlo_mgr_link_switch_notification(struct wlan_objmgr_vdev * vdev,struct wlan_mlo_link_switch_req * lswitch_req,enum wlan_mlo_link_switch_notify_reason notify_reason)717 mlo_mgr_link_switch_notification(struct wlan_objmgr_vdev *vdev,
718 struct wlan_mlo_link_switch_req *lswitch_req,
719 enum wlan_mlo_link_switch_notify_reason notify_reason)
720 {
721 return QDF_STATUS_E_NOSUPPORT;
722 }
723
724 static inline bool
mlo_mgr_is_link_switch_on_assoc_vdev(struct wlan_objmgr_vdev * vdev)725 mlo_mgr_is_link_switch_on_assoc_vdev(struct wlan_objmgr_vdev *vdev)
726 {
727 return false;
728 }
729
730 static inline struct wlan_objmgr_vdev *
mlo_mgr_link_switch_get_assoc_vdev(struct wlan_objmgr_vdev * vdev)731 mlo_mgr_link_switch_get_assoc_vdev(struct wlan_objmgr_vdev *vdev)
732 {
733 return NULL;
734 }
735
736 static inline QDF_STATUS
mlo_mgr_ser_link_switch_cmd(struct wlan_objmgr_vdev * vdev,struct wlan_mlo_link_switch_req * req)737 mlo_mgr_ser_link_switch_cmd(struct wlan_objmgr_vdev *vdev,
738 struct wlan_mlo_link_switch_req *req)
739 {
740 return QDF_STATUS_E_NOSUPPORT;
741 }
742
743 static inline void
mlo_mgr_remove_link_switch_cmd(struct wlan_objmgr_vdev * vdev)744 mlo_mgr_remove_link_switch_cmd(struct wlan_objmgr_vdev *vdev)
745 {
746 }
747
748 static inline QDF_STATUS
mlo_mgr_link_switch_notify(struct wlan_objmgr_vdev * vdev,struct wlan_mlo_link_switch_req * req)749 mlo_mgr_link_switch_notify(struct wlan_objmgr_vdev *vdev,
750 struct wlan_mlo_link_switch_req *req)
751 {
752 return QDF_STATUS_E_NOSUPPORT;
753 }
754
755 static inline QDF_STATUS
mlo_mgr_link_switch_validate_request(struct wlan_objmgr_vdev * vdev,struct wlan_mlo_link_switch_req * req)756 mlo_mgr_link_switch_validate_request(struct wlan_objmgr_vdev *vdev,
757 struct wlan_mlo_link_switch_req *req)
758 {
759 return QDF_STATUS_E_NOSUPPORT;
760 }
761
762 static inline QDF_STATUS
mlo_mgr_link_switch_request_params(struct wlan_objmgr_psoc * psoc,void * evt_params)763 mlo_mgr_link_switch_request_params(struct wlan_objmgr_psoc *psoc,
764 void *evt_params)
765 {
766 return QDF_STATUS_E_NOSUPPORT;
767 }
768
769 static inline QDF_STATUS
mlo_mgr_link_switch_complete(struct wlan_objmgr_vdev * vdev)770 mlo_mgr_link_switch_complete(struct wlan_objmgr_vdev *vdev)
771 {
772 return QDF_STATUS_E_NOSUPPORT;
773 }
774
775 static inline QDF_STATUS
mlo_mgr_link_switch_send_cnf_cmd(struct wlan_objmgr_psoc * psoc,struct wlan_mlo_link_switch_cnf * cnf_params)776 mlo_mgr_link_switch_send_cnf_cmd(struct wlan_objmgr_psoc *psoc,
777 struct wlan_mlo_link_switch_cnf *cnf_params)
778 {
779 return QDF_STATUS_E_NOSUPPORT;
780 }
781
782 static inline QDF_STATUS
mlo_mgr_link_switch_defer_disconnect_req(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,enum wlan_reason_code reason)783 mlo_mgr_link_switch_defer_disconnect_req(struct wlan_objmgr_vdev *vdev,
784 enum wlan_cm_source source,
785 enum wlan_reason_code reason)
786 {
787 return QDF_STATUS_E_NOSUPPORT;
788 }
789
790 static inline bool
mlo_mgr_update_csa_link_info(struct wlan_mlo_dev_context * mlo_dev_ctx,struct csa_offload_params * csa_param,uint8_t link_id)791 mlo_mgr_update_csa_link_info(struct wlan_mlo_dev_context *mlo_dev_ctx,
792 struct csa_offload_params *csa_param,
793 uint8_t link_id)
794 {
795 return false;
796 }
797 #endif
798 #endif
799