xref: /wlan-dirver/qca-wifi-host-cmn/os_if/linux/mlme/src/osif_cm_util.c (revision ffc4a9de53c8817b86d03f8fb3c9a829bfec09d5)
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 #ifdef FEATURE_CM_ENABLE
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 };
484 
485 /**
486  * osif_cm_get_global_ops() - Get connection manager global ops
487  *
488  * Return: Connection manager global ops
489  */
490 static struct mlme_cm_ops *osif_cm_get_global_ops(void)
491 {
492 	return &cm_ops;
493 }
494 
495 QDF_STATUS osif_cm_register_cb(void)
496 {
497 	mlme_set_osif_cm_cb(osif_cm_get_global_ops);
498 
499 	return QDF_STATUS_SUCCESS;
500 }
501 
502 QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev)
503 {
504 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
505 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
506 
507 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
508 		return QDF_STATUS_SUCCESS;
509 
510 	if (!osif_priv) {
511 		osif_err("Invalid vdev osif priv");
512 		return QDF_STATUS_E_INVAL;
513 	}
514 
515 	qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock);
516 
517 	return QDF_STATUS_SUCCESS;
518 }
519 
520 QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
521 {
522 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
523 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
524 
525 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
526 		return QDF_STATUS_SUCCESS;
527 
528 	if (!osif_priv) {
529 		osif_err("Invalid vdev osif priv");
530 		return QDF_STATUS_E_INVAL;
531 	}
532 	qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock);
533 
534 	return QDF_STATUS_SUCCESS;
535 }
536 
537 QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
538 				    struct wlan_cm_connect_resp *rsp,
539 				    enum osif_cb_type type)
540 {
541 	osif_cm_connect_comp_cb cb = NULL;
542 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
543 
544 	if (osif_cm_legacy_ops)
545 		cb = osif_cm_legacy_ops->connect_complete_cb;
546 	if (cb)
547 		ret = cb(vdev, rsp, type);
548 
549 	return ret;
550 }
551 
552 QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
553 				       struct wlan_cm_discon_rsp *rsp,
554 				       enum osif_cb_type type)
555 {
556 	osif_cm_disconnect_comp_cb cb = NULL;
557 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
558 
559 	if (osif_cm_legacy_ops)
560 		cb = osif_cm_legacy_ops->disconnect_complete_cb;
561 	if (cb)
562 		ret = cb(vdev, rsp, type);
563 
564 	return ret;
565 }
566 
567 #ifdef CONN_MGR_ADV_FEATURE
568 QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev,
569 				   enum netif_action_type action,
570 				   enum netif_reason_type reason)
571 {
572 	osif_cm_netif_queue_ctrl_cb cb = NULL;
573 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
574 
575 	if (osif_cm_legacy_ops)
576 		cb = osif_cm_legacy_ops->netif_queue_control_cb;
577 	if (cb)
578 		ret = cb(vdev, action, reason);
579 
580 	return ret;
581 }
582 
583 QDF_STATUS osif_cm_napi_serialize(bool action)
584 {
585 	os_if_cm_napi_serialize_ctrl_cb cb = NULL;
586 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
587 
588 	if (osif_cm_legacy_ops)
589 		cb = osif_cm_legacy_ops->napi_serialize_control_cb;
590 	if (cb)
591 		ret = cb(action);
592 
593 	return ret;
594 }
595 
596 QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev,
597 			    struct wlan_cm_connect_resp *rsp)
598 {
599 	osif_cm_save_gtk_cb cb = NULL;
600 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
601 
602 	if (osif_cm_legacy_ops)
603 		cb = osif_cm_legacy_ops->save_gtk_cb;
604 	if (cb)
605 		ret = cb(vdev, rsp);
606 
607 	return ret;
608 }
609 #endif
610 
611 #ifdef WLAN_FEATURE_FILS_SK
612 QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev,
613 				struct wlan_objmgr_vdev *vdev,
614 				struct wlan_cm_connect_resp *rsp)
615 {
616 	osif_cm_set_hlp_data_cb cb = NULL;
617 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
618 
619 	if (osif_cm_legacy_ops)
620 		cb = osif_cm_legacy_ops->set_hlp_data_cb;
621 	if (cb)
622 		ret = cb(dev, vdev, rsp);
623 
624 	return ret;
625 }
626 #endif
627 
628 void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops)
629 {
630 	osif_cm_legacy_ops = osif_legacy_ops;
631 }
632 
633 void osif_cm_reset_legacy_cb(void)
634 {
635 	osif_cm_legacy_ops = NULL;
636 }
637 #endif
638