xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/mlme/src/osif_cm_util.c (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. 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: osif_cm_util.c
19  *
20  * This file maintains definitaions of connect, disconnect, roam
21  * common apis.
22  */
23 #include <include/wlan_mlme_cmn.h>
24 #include "osif_cm_util.h"
25 #include "wlan_osif_priv.h"
26 #include "wlan_cfg80211.h"
27 #include "osif_cm_rsp.h"
28 #include "wlan_cfg80211_scan.h"
29 
30 enum qca_sta_connect_fail_reason_codes
31 osif_cm_mac_to_qca_connect_fail_reason(enum wlan_status_code internal_reason)
32 {
33 	enum qca_sta_connect_fail_reason_codes reason = 0;
34 
35 	if (internal_reason < STATUS_PROP_START)
36 		return reason;
37 
38 	switch (internal_reason) {
39 	case STATUS_NO_NETWORK_FOUND:
40 		reason = QCA_STA_CONNECT_FAIL_REASON_NO_BSS_FOUND;
41 		break;
42 	case STATUS_AUTH_TX_FAIL:
43 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL;
44 		break;
45 	case STATUS_AUTH_NO_ACK_RECEIVED:
46 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED;
47 		break;
48 	case STATUS_AUTH_NO_RESP_RECEIVED:
49 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED;
50 		break;
51 	case STATUS_ASSOC_TX_FAIL:
52 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL;
53 		break;
54 	case STATUS_ASSOC_NO_ACK_RECEIVED:
55 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED;
56 		break;
57 	case STATUS_ASSOC_NO_RESP_RECEIVED:
58 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED;
59 		break;
60 	default:
61 		osif_debug("QCA code not present for internal status code %d",
62 			   internal_reason);
63 	}
64 
65 	return reason;
66 }
67 
68 const char *
69 osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason)
70 {
71 	switch (reason) {
72 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE);
73 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE);
74 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE);
75 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA);
76 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR);
77 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED);
78 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_DEVICE_RECOVERY);
79 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_KEY_TIMEOUT);
80 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE);
81 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_IFACE_DOWN);
82 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL);
83 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_INACTIVITY);
84 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT);
85 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE);
86 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE);
87 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_USER_TRIGGERED);
88 	case QCA_DISCONNECT_REASON_UNSPECIFIED:
89 		return "";
90 	default:
91 		return "Unknown";
92 	}
93 }
94 
95 enum qca_disconnect_reason_codes
96 osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason)
97 {
98 	enum qca_disconnect_reason_codes reason =
99 					QCA_DISCONNECT_REASON_UNSPECIFIED;
100 
101 	if (internal_reason < REASON_PROP_START)
102 		return reason;
103 
104 	switch (internal_reason) {
105 	case REASON_HOST_TRIGGERED_ROAM_FAILURE:
106 	case REASON_FW_TRIGGERED_ROAM_FAILURE:
107 		reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE;
108 		break;
109 	case REASON_USER_TRIGGERED_ROAM_FAILURE:
110 		reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE;
111 		break;
112 	case REASON_GATEWAY_REACHABILITY_FAILURE:
113 		reason =
114 		QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE;
115 		break;
116 	case REASON_UNSUPPORTED_CHANNEL_CSA:
117 		reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA;
118 		break;
119 	case REASON_OPER_CHANNEL_DISABLED_INDOOR:
120 		reason =
121 		QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR;
122 		break;
123 	case REASON_OPER_CHANNEL_USER_DISABLED:
124 		reason =
125 		QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED;
126 		break;
127 	case REASON_DEVICE_RECOVERY:
128 		reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY;
129 		break;
130 	case REASON_KEY_TIMEOUT:
131 		reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT;
132 		break;
133 	case REASON_OPER_CHANNEL_BAND_CHANGE:
134 		reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE;
135 		break;
136 	case REASON_IFACE_DOWN:
137 		reason = QCA_DISCONNECT_REASON_IFACE_DOWN;
138 		break;
139 	case REASON_PEER_XRETRY_FAIL:
140 		reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL;
141 		break;
142 	case REASON_PEER_INACTIVITY:
143 		reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY;
144 		break;
145 	case REASON_SA_QUERY_TIMEOUT:
146 		reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT;
147 		break;
148 	case REASON_CHANNEL_SWITCH_FAILED:
149 		reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE;
150 		break;
151 	case REASON_BEACON_MISSED:
152 		reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE;
153 		break;
154 	default:
155 		osif_debug("No QCA reason code for mac reason: %u",
156 			   internal_reason);
157 		/* Unspecified reason by default */
158 	}
159 
160 	return reason;
161 }
162 
163 static struct osif_cm_ops *osif_cm_legacy_ops;
164 
165 void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv)
166 {
167 	osif_priv->cm_info.last_id = CM_ID_INVALID;
168 	osif_priv->cm_info.last_source = CM_SOURCE_INVALID;
169 }
170 
171 QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev)
172 {
173 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
174 
175 	if (!osif_priv) {
176 		osif_err("Invalid vdev osif priv");
177 		return QDF_STATUS_E_INVAL;
178 	}
179 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
180 	osif_cm_reset_id_and_src_no_lock(osif_priv);
181 	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
182 
183 	return QDF_STATUS_SUCCESS;
184 }
185 
186 /**
187  * osif_cm_connect_complete_cb() - Connect complete callback
188  * @vdev: vdev pointer
189  * @rsp: connect response
190  *
191  * Return: QDF_STATUS
192  */
193 static QDF_STATUS
194 osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
195 			    struct wlan_cm_connect_resp *rsp)
196 {
197 	return osif_connect_handler(vdev, rsp);
198 }
199 
200 /**
201  * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate
202  * @vdev: vdev pointer
203  * @rsp: connect response
204  *
205  * Return: QDF_STATUS
206  */
207 static QDF_STATUS
208 osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev,
209 			    struct wlan_cm_connect_resp *rsp)
210 {
211 	return osif_failed_candidate_handler(vdev, rsp);
212 }
213 
214 /**
215  * osif_cm_update_id_and_src_cb() - Callback to update id and
216  * source of the connect/disconnect request
217  * @vdev: vdev pointer
218  * @Source: Source of the connect req
219  * @id: Connect/disconnect id
220  *
221  * Context: Any context. Takes and releases cmd id spinlock
222  * Return: QDF_STATUS
223  */
224 static QDF_STATUS
225 osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev *vdev,
226 			     enum wlan_cm_source source, wlan_cm_id cm_id)
227 {
228 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
229 
230 	if (!osif_priv) {
231 		osif_err("Invalid vdev osif priv");
232 		return QDF_STATUS_E_INVAL;
233 	}
234 
235 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
236 	osif_priv->cm_info.last_id = cm_id;
237 	osif_priv->cm_info.last_source = source;
238 	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
239 
240 	return QDF_STATUS_SUCCESS;
241 }
242 
243 /**
244  * osif_cm_disconnect_complete_cb() - Disconnect done callback
245  * @vdev: vdev pointer
246  * @disconnect_rsp: Disconnect response
247  *
248  * Context: Any context
249  * Return: QDF_STATUS
250  */
251 
252 static QDF_STATUS
253 osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev *vdev,
254 			       struct wlan_cm_discon_rsp *rsp)
255 {
256 	return osif_disconnect_handler(vdev, rsp);
257 }
258 
259 #ifdef CONN_MGR_ADV_FEATURE
260 void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
261 			struct vdev_osif_priv *osif_priv,
262 			struct qdf_mac_addr *bssid,
263 			uint8_t *ssid, uint8_t ssid_len)
264 {
265 	struct wiphy *wiphy = osif_priv->wdev->wiphy;
266 	struct scan_filter *filter;
267 	QDF_STATUS status;
268 
269 	status = __wlan_cfg80211_unlink_bss_list(wiphy, wlan_vdev_get_pdev(vdev),
270 					bssid->bytes, ssid_len ? ssid : NULL,
271 					ssid_len);
272 	if (QDF_IS_STATUS_ERROR(status))
273 		return;
274 	filter = qdf_mem_malloc(sizeof(*filter));
275 	if (!filter)
276 		return;
277 
278 	filter->num_of_bssid = 1;
279 	qdf_copy_macaddr(&filter->bssid_list[0], bssid);
280 	ucfg_scan_flush_results(wlan_vdev_get_pdev(vdev), filter);
281 	qdf_mem_free(filter);
282 }
283 
284 static QDF_STATUS
285 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
286 {
287 	return osif_cm_netif_queue_ind(vdev,
288 				       WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER,
289 				       WLAN_CONTROL_PATH);
290 }
291 
292 /**
293  * osif_cm_roam_sync_cb() - Roam sync callback
294  * @vdev: vdev pointer
295  *
296  * This callback indicates os_if that roam sync ind received
297  * so that os_if can stop all the activity on this connection
298  *
299  * Return: QDF_STATUS
300  */
301 static QDF_STATUS
302 osif_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev)
303 {
304 	osif_cm_napi_serialize(true);
305 	return osif_cm_netif_queue_ind(vdev,
306 				       WLAN_STOP_ALL_NETIF_QUEUE,
307 				       WLAN_CONTROL_PATH);
308 }
309 
310 /**
311  * @osif_pmksa_candidate_notify_cb: Roam pmksa candidate notify callback
312  * @vdev: vdev pointer
313  * @bssid: bssid
314  * @index: index
315  * @preauth: preauth flag
316  *
317  * Return: QDF_STATUS
318  */
319 static QDF_STATUS
320 osif_pmksa_candidate_notify_cb(struct wlan_objmgr_vdev *vdev,
321 			       struct qdf_mac_addr *bssid,
322 			       int index, bool preauth)
323 {
324 	return osif_pmksa_candidate_notify(vdev, bssid, index, preauth);
325 }
326 #else
327 static inline QDF_STATUS
328 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
329 {
330 	return QDF_STATUS_SUCCESS;
331 }
332 #endif
333 
334 /**
335  * osif_cm_disconnect_start_cb() - Disconnect start callback
336  * @vdev: vdev pointer
337  *
338  * This callback indicates os_if that disconnection is started
339  * so that os_if can stop all the activity on this connection
340  *
341  * Return: QDF_STATUS
342  */
343 static QDF_STATUS
344 osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev)
345 {
346 	/* Disable netif queue on disconnect start */
347 	return osif_cm_disable_netif_queue(vdev);
348 }
349 
350 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
351 /**
352  * osif_cm_roam_start_cb() - Roam start callback
353  * @vdev: vdev pointer
354  *
355  * This callback indicates os_if that roaming has started
356  * so that os_if can stop all the activity on this connection
357  *
358  * Return: QDF_STATUS
359  */
360 static QDF_STATUS
361 osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev)
362 {
363 	return osif_cm_netif_queue_ind(vdev,
364 				       WLAN_STOP_ALL_NETIF_QUEUE,
365 				       WLAN_CONTROL_PATH);
366 }
367 
368 /**
369  * osif_cm_roam_abort_cb() - Roam abort callback
370  * @vdev: vdev pointer
371  *
372  * This callback indicates os_if that roaming has been aborted
373  * so that os_if can resume all the activity on this connection
374  *
375  * Return: QDF_STATUS
376  */
377 static QDF_STATUS
378 osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev)
379 {
380 	osif_cm_napi_serialize(false);
381 	return osif_cm_netif_queue_ind(vdev,
382 				       WLAN_WAKE_ALL_NETIF_QUEUE,
383 				       WLAN_CONTROL_PATH);
384 }
385 
386 /**
387  * osif_cm_roam_cmpl_cb() - Roam sync complete callback
388  * @vdev: vdev pointer
389  * @rsp: connect rsp
390  *
391  * This callback indicates os_if that roam sync is complete
392  * so that os_if can stop all the activity on this connection
393  *
394  * Return: QDF_STATUS
395  */
396 
397 static QDF_STATUS
398 osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev)
399 {
400 	return osif_cm_napi_serialize(false);
401 }
402 #endif
403 
404 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
405 /**
406  * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback
407  * @vdev: vdev pointer
408  * @rsp: preauth response
409  *
410  * This callback indicates os_if that roam ft preauth is complete
411  * so that os_if can send fast transition event
412  *
413  * Return: QDF_STATUS
414  */
415 
416 static QDF_STATUS
417 osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
418 			   struct wlan_preauth_rsp *rsp)
419 {
420 	osif_cm_ft_preauth_complete_cb cb = NULL;
421 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
422 
423 	if (osif_cm_legacy_ops)
424 		cb = osif_cm_legacy_ops->ft_preauth_complete_cb;
425 	if (cb)
426 		ret = cb(vdev, rsp);
427 
428 	return ret;
429 }
430 
431 #ifdef FEATURE_WLAN_ESE
432 /**
433  * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback
434  * @vdev: vdev pointer
435  * @rsp: preauth response
436  *
437  * This callback indicates os_if that roam cckm preauth is complete
438  * so that os_if can send cckm preauth indication to the supplicant
439  * via wireless custom event.
440  *
441  * Return: QDF_STATUS
442  */
443 
444 static QDF_STATUS
445 osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
446 			     struct wlan_preauth_rsp *rsp)
447 {
448 	osif_cm_cckm_preauth_complete_cb cb = NULL;
449 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
450 
451 	if (osif_cm_legacy_ops)
452 		cb = osif_cm_legacy_ops->cckm_preauth_complete_cb;
453 	if (cb)
454 		ret = cb(vdev, rsp);
455 
456 	return ret;
457 }
458 #endif
459 #endif
460 
461 static struct mlme_cm_ops cm_ops = {
462 	.mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb,
463 	.mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb,
464 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
465 	.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
466 	.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
467 #ifdef CONN_MGR_ADV_FEATURE
468 	.mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb,
469 	.mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb,
470 #endif
471 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
472 	.mlme_cm_roam_start_cb = osif_cm_roam_start_cb,
473 	.mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb,
474 	.mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb,
475 #endif
476 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
477 	.mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb,
478 #ifdef FEATURE_WLAN_ESE
479 	.mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb,
480 #endif
481 #endif
482 };
483 
484 /**
485  * osif_cm_get_global_ops() - Get connection manager global ops
486  *
487  * Return: Connection manager global ops
488  */
489 static struct mlme_cm_ops *osif_cm_get_global_ops(void)
490 {
491 	return &cm_ops;
492 }
493 
494 QDF_STATUS osif_cm_register_cb(void)
495 {
496 	mlme_set_osif_cm_cb(osif_cm_get_global_ops);
497 
498 	return QDF_STATUS_SUCCESS;
499 }
500 
501 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev)
502 {
503 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
504 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
505 
506 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
507 		return QDF_STATUS_SUCCESS;
508 
509 	if (!osif_priv) {
510 		osif_err("Invalid vdev osif priv");
511 		return QDF_STATUS_E_INVAL;
512 	}
513 
514 	qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock);
515 
516 	return QDF_STATUS_SUCCESS;
517 }
518 
519 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
520 {
521 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
522 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
523 
524 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
525 		return QDF_STATUS_SUCCESS;
526 
527 	if (!osif_priv) {
528 		osif_err("Invalid vdev osif priv");
529 		return QDF_STATUS_E_INVAL;
530 	}
531 	qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock);
532 
533 	return QDF_STATUS_SUCCESS;
534 }
535 
536 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
537 				    struct wlan_cm_connect_resp *rsp,
538 				    enum osif_cb_type type)
539 {
540 	osif_cm_connect_comp_cb cb = NULL;
541 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
542 
543 	if (osif_cm_legacy_ops)
544 		cb = osif_cm_legacy_ops->connect_complete_cb;
545 	if (cb)
546 		ret = cb(vdev, rsp, type);
547 
548 	return ret;
549 }
550 
551 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
552 				       struct wlan_cm_discon_rsp *rsp,
553 				       enum osif_cb_type type)
554 {
555 	osif_cm_disconnect_comp_cb cb = NULL;
556 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
557 
558 	if (osif_cm_legacy_ops)
559 		cb = osif_cm_legacy_ops->disconnect_complete_cb;
560 	if (cb)
561 		ret = cb(vdev, rsp, type);
562 
563 	return ret;
564 }
565 
566 #ifdef CONN_MGR_ADV_FEATURE
567 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev,
568 				   enum netif_action_type action,
569 				   enum netif_reason_type reason)
570 {
571 	osif_cm_netif_queue_ctrl_cb cb = NULL;
572 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
573 
574 	if (osif_cm_legacy_ops)
575 		cb = osif_cm_legacy_ops->netif_queue_control_cb;
576 	if (cb)
577 		ret = cb(vdev, action, reason);
578 
579 	return ret;
580 }
581 
582 QDF_STATUS osif_cm_napi_serialize(bool action)
583 {
584 	os_if_cm_napi_serialize_ctrl_cb cb = NULL;
585 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
586 
587 	if (osif_cm_legacy_ops)
588 		cb = osif_cm_legacy_ops->napi_serialize_control_cb;
589 	if (cb)
590 		ret = cb(action);
591 
592 	return ret;
593 }
594 
595 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev,
596 			    struct wlan_cm_connect_resp *rsp)
597 {
598 	osif_cm_save_gtk_cb cb = NULL;
599 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
600 
601 	if (osif_cm_legacy_ops)
602 		cb = osif_cm_legacy_ops->save_gtk_cb;
603 	if (cb)
604 		ret = cb(vdev, rsp);
605 
606 	return ret;
607 }
608 #endif
609 
610 #ifdef WLAN_FEATURE_FILS_SK
611 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev,
612 				struct wlan_objmgr_vdev *vdev,
613 				struct wlan_cm_connect_resp *rsp)
614 {
615 	osif_cm_set_hlp_data_cb cb = NULL;
616 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
617 
618 	if (osif_cm_legacy_ops)
619 		cb = osif_cm_legacy_ops->set_hlp_data_cb;
620 	if (cb)
621 		ret = cb(dev, vdev, rsp);
622 
623 	return ret;
624 }
625 #endif
626 
627 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops)
628 {
629 	osif_cm_legacy_ops = osif_legacy_ops;
630 }
631 
632 void osif_cm_reset_legacy_cb(void)
633 {
634 	osif_cm_legacy_ops = NULL;
635 }
636