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