xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/mlme/src/osif_cm_util.c (revision d0c05845839e5f2ba5a8dcebe0cd3e4cd4e8dfcf)
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 #else
328 static inline QDF_STATUS
329 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
330 {
331 	return QDF_STATUS_SUCCESS;
332 }
333 #endif
334 
335 /**
336  * osif_cm_disconnect_start_cb() - Disconnect start callback
337  * @vdev: vdev pointer
338  *
339  * This callback indicates os_if that disconnection is started
340  * so that os_if can stop all the activity on this connection
341  *
342  * Return: QDF_STATUS
343  */
344 static QDF_STATUS
345 osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev)
346 {
347 	/* Disable netif queue on disconnect start */
348 	return osif_cm_disable_netif_queue(vdev);
349 }
350 
351 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
352 /**
353  * osif_cm_roam_start_cb() - Roam start callback
354  * @vdev: vdev pointer
355  *
356  * This callback indicates os_if that roaming has started
357  * so that os_if can stop all the activity on this connection
358  *
359  * Return: QDF_STATUS
360  */
361 static QDF_STATUS
362 osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev)
363 {
364 	return osif_cm_netif_queue_ind(vdev,
365 				       WLAN_STOP_ALL_NETIF_QUEUE,
366 				       WLAN_CONTROL_PATH);
367 }
368 
369 /**
370  * osif_cm_roam_abort_cb() - Roam abort callback
371  * @vdev: vdev pointer
372  *
373  * This callback indicates os_if that roaming has been aborted
374  * so that os_if can resume all the activity on this connection
375  *
376  * Return: QDF_STATUS
377  */
378 static QDF_STATUS
379 osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev)
380 {
381 	osif_cm_napi_serialize(false);
382 	return osif_cm_netif_queue_ind(vdev,
383 				       WLAN_WAKE_ALL_NETIF_QUEUE,
384 				       WLAN_CONTROL_PATH);
385 }
386 
387 /**
388  * osif_cm_roam_cmpl_cb() - Roam sync complete callback
389  * @vdev: vdev pointer
390  * @rsp: connect rsp
391  *
392  * This callback indicates os_if that roam sync is complete
393  * so that os_if can stop all the activity on this connection
394  *
395  * Return: QDF_STATUS
396  */
397 
398 static QDF_STATUS
399 osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev)
400 {
401 	return osif_cm_napi_serialize(false);
402 }
403 #endif
404 
405 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
406 /**
407  * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback
408  * @vdev: vdev pointer
409  * @rsp: preauth response
410  *
411  * This callback indicates os_if that roam ft preauth is complete
412  * so that os_if can send fast transition event
413  *
414  * Return: QDF_STATUS
415  */
416 
417 static QDF_STATUS
418 osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
419 			   struct wlan_preauth_rsp *rsp)
420 {
421 	osif_cm_ft_preauth_complete_cb cb = NULL;
422 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
423 
424 	if (osif_cm_legacy_ops)
425 		cb = osif_cm_legacy_ops->ft_preauth_complete_cb;
426 	if (cb)
427 		ret = cb(vdev, rsp);
428 
429 	return ret;
430 }
431 
432 #ifdef FEATURE_WLAN_ESE
433 /**
434  * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback
435  * @vdev: vdev pointer
436  * @rsp: preauth response
437  *
438  * This callback indicates os_if that roam cckm preauth is complete
439  * so that os_if can send cckm preauth indication to the supplicant
440  * via wireless custom event.
441  *
442  * Return: QDF_STATUS
443  */
444 
445 static QDF_STATUS
446 osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
447 			     struct wlan_preauth_rsp *rsp)
448 {
449 	osif_cm_cckm_preauth_complete_cb cb = NULL;
450 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
451 
452 	if (osif_cm_legacy_ops)
453 		cb = osif_cm_legacy_ops->cckm_preauth_complete_cb;
454 	if (cb)
455 		ret = cb(vdev, rsp);
456 
457 	return ret;
458 }
459 #endif
460 #endif
461 
462 static struct mlme_cm_ops cm_ops = {
463 	.mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb,
464 	.mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb,
465 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
466 	.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
467 	.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
468 #ifdef CONN_MGR_ADV_FEATURE
469 	.mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb,
470 	.mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb,
471 #endif
472 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
473 	.mlme_cm_roam_start_cb = osif_cm_roam_start_cb,
474 	.mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb,
475 	.mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb,
476 #endif
477 #ifdef WLAN_FEATURE_PREAUTH_ENABLE
478 	.mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb,
479 #ifdef FEATURE_WLAN_ESE
480 	.mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb,
481 #endif
482 #endif
483 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
484 	.mlme_cm_get_vendor_handoff_params_cb =
485 					osif_cm_vendor_handoff_params_cb,
486 #endif
487 };
488 
489 /**
490  * osif_cm_get_global_ops() - Get connection manager global ops
491  *
492  * Return: Connection manager global ops
493  */
494 static struct mlme_cm_ops *osif_cm_get_global_ops(void)
495 {
496 	return &cm_ops;
497 }
498 
499 QDF_STATUS osif_cm_register_cb(void)
500 {
501 	mlme_set_osif_cm_cb(osif_cm_get_global_ops);
502 
503 	return QDF_STATUS_SUCCESS;
504 }
505 
506 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev)
507 {
508 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
509 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
510 
511 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
512 		return QDF_STATUS_SUCCESS;
513 
514 	if (!osif_priv) {
515 		osif_err("Invalid vdev osif priv");
516 		return QDF_STATUS_E_INVAL;
517 	}
518 
519 	qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock);
520 
521 	return QDF_STATUS_SUCCESS;
522 }
523 
524 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
525 {
526 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
527 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
528 
529 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
530 		return QDF_STATUS_SUCCESS;
531 
532 	if (!osif_priv) {
533 		osif_err("Invalid vdev osif priv");
534 		return QDF_STATUS_E_INVAL;
535 	}
536 	qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock);
537 
538 	return QDF_STATUS_SUCCESS;
539 }
540 
541 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
542 				    struct wlan_cm_connect_resp *rsp,
543 				    enum osif_cb_type type)
544 {
545 	osif_cm_connect_comp_cb cb = NULL;
546 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
547 
548 	if (osif_cm_legacy_ops)
549 		cb = osif_cm_legacy_ops->connect_complete_cb;
550 	if (cb)
551 		ret = cb(vdev, rsp, type);
552 
553 	return ret;
554 }
555 
556 #ifdef WLAN_VENDOR_HANDOFF_CONTROL
557 QDF_STATUS osif_cm_vendor_handoff_params_cb(struct wlan_objmgr_psoc *psoc,
558 					    void *vendor_handoff_context)
559 {
560 	osif_cm_get_vendor_handoff_params_cb cb = NULL;
561 
562 	if (osif_cm_legacy_ops)
563 		cb = osif_cm_legacy_ops->vendor_handoff_params_cb;
564 	if (cb)
565 		return cb(psoc, vendor_handoff_context);
566 
567 	return QDF_STATUS_E_FAILURE;
568 }
569 #endif
570 
571 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
572 				       struct wlan_cm_discon_rsp *rsp,
573 				       enum osif_cb_type type)
574 {
575 	osif_cm_disconnect_comp_cb cb = NULL;
576 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
577 
578 	if (osif_cm_legacy_ops)
579 		cb = osif_cm_legacy_ops->disconnect_complete_cb;
580 	if (cb)
581 		ret = cb(vdev, rsp, type);
582 
583 	return ret;
584 }
585 
586 #ifdef CONN_MGR_ADV_FEATURE
587 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev,
588 				   enum netif_action_type action,
589 				   enum netif_reason_type reason)
590 {
591 	osif_cm_netif_queue_ctrl_cb cb = NULL;
592 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
593 
594 	if (osif_cm_legacy_ops)
595 		cb = osif_cm_legacy_ops->netif_queue_control_cb;
596 	if (cb)
597 		ret = cb(vdev, action, reason);
598 
599 	return ret;
600 }
601 
602 QDF_STATUS osif_cm_napi_serialize(bool action)
603 {
604 	os_if_cm_napi_serialize_ctrl_cb cb = NULL;
605 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
606 
607 	if (osif_cm_legacy_ops)
608 		cb = osif_cm_legacy_ops->napi_serialize_control_cb;
609 	if (cb)
610 		ret = cb(action);
611 
612 	return ret;
613 }
614 
615 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev,
616 			    struct wlan_cm_connect_resp *rsp)
617 {
618 	osif_cm_save_gtk_cb cb = NULL;
619 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
620 
621 	if (osif_cm_legacy_ops)
622 		cb = osif_cm_legacy_ops->save_gtk_cb;
623 	if (cb)
624 		ret = cb(vdev, rsp);
625 
626 	return ret;
627 }
628 #endif
629 
630 #ifdef WLAN_FEATURE_FILS_SK
631 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev,
632 				struct wlan_objmgr_vdev *vdev,
633 				struct wlan_cm_connect_resp *rsp)
634 {
635 	osif_cm_set_hlp_data_cb cb = NULL;
636 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
637 
638 	if (osif_cm_legacy_ops)
639 		cb = osif_cm_legacy_ops->set_hlp_data_cb;
640 	if (cb)
641 		ret = cb(dev, vdev, rsp);
642 
643 	return ret;
644 }
645 #endif
646 
647 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops)
648 {
649 	osif_cm_legacy_ops = osif_legacy_ops;
650 }
651 
652 void osif_cm_reset_legacy_cb(void)
653 {
654 	osif_cm_legacy_ops = NULL;
655 }
656