xref: /wlan-driver/qca-wifi-host-cmn/os_if/linux/mlme/src/osif_cm_util.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2012-2015, 2020-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /**
19*5113495bSYour Name  * DOC: osif_cm_util.c
20*5113495bSYour Name  *
21*5113495bSYour Name  * This file maintains definitaions of connect, disconnect, roam
22*5113495bSYour Name  * common apis.
23*5113495bSYour Name  */
24*5113495bSYour Name #include <include/wlan_mlme_cmn.h>
25*5113495bSYour Name #include "osif_cm_util.h"
26*5113495bSYour Name #include "wlan_osif_priv.h"
27*5113495bSYour Name #include "wlan_cfg80211.h"
28*5113495bSYour Name #include "osif_cm_rsp.h"
29*5113495bSYour Name #include "wlan_cfg80211_scan.h"
30*5113495bSYour Name #include "wlan_mlo_mgr_sta.h"
31*5113495bSYour Name 
32*5113495bSYour Name enum qca_sta_connect_fail_reason_codes
osif_cm_mac_to_qca_connect_fail_reason(enum wlan_status_code internal_reason)33*5113495bSYour Name osif_cm_mac_to_qca_connect_fail_reason(enum wlan_status_code internal_reason)
34*5113495bSYour Name {
35*5113495bSYour Name 	enum qca_sta_connect_fail_reason_codes reason = 0;
36*5113495bSYour Name 
37*5113495bSYour Name 	if (internal_reason < STATUS_PROP_START)
38*5113495bSYour Name 		return reason;
39*5113495bSYour Name 
40*5113495bSYour Name 	switch (internal_reason) {
41*5113495bSYour Name 	case STATUS_NO_NETWORK_FOUND:
42*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_NO_BSS_FOUND;
43*5113495bSYour Name 		break;
44*5113495bSYour Name 	case STATUS_AUTH_TX_FAIL:
45*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_TX_FAIL;
46*5113495bSYour Name 		break;
47*5113495bSYour Name 	case STATUS_AUTH_NO_ACK_RECEIVED:
48*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_ACK_RECEIVED;
49*5113495bSYour Name 		break;
50*5113495bSYour Name 	case STATUS_AUTH_NO_RESP_RECEIVED:
51*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_AUTH_NO_RESP_RECEIVED;
52*5113495bSYour Name 		break;
53*5113495bSYour Name 	case STATUS_ASSOC_TX_FAIL:
54*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_REQ_TX_FAIL;
55*5113495bSYour Name 		break;
56*5113495bSYour Name 	case STATUS_ASSOC_NO_ACK_RECEIVED:
57*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_ACK_RECEIVED;
58*5113495bSYour Name 		break;
59*5113495bSYour Name 	case STATUS_ASSOC_NO_RESP_RECEIVED:
60*5113495bSYour Name 		reason = QCA_STA_CONNECT_FAIL_REASON_ASSOC_NO_RESP_RECEIVED;
61*5113495bSYour Name 		break;
62*5113495bSYour Name 	default:
63*5113495bSYour Name 		osif_debug("QCA code not present for internal status code %d",
64*5113495bSYour Name 			   internal_reason);
65*5113495bSYour Name 	}
66*5113495bSYour Name 
67*5113495bSYour Name 	return reason;
68*5113495bSYour Name }
69*5113495bSYour Name 
70*5113495bSYour Name const char *
osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason)71*5113495bSYour Name osif_cm_qca_reason_to_str(enum qca_disconnect_reason_codes reason)
72*5113495bSYour Name {
73*5113495bSYour Name 	switch (reason) {
74*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE);
75*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE);
76*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE);
77*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA);
78*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR);
79*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED);
80*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_DEVICE_RECOVERY);
81*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_KEY_TIMEOUT);
82*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE);
83*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_IFACE_DOWN);
84*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL);
85*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_PEER_INACTIVITY);
86*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT);
87*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE);
88*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE);
89*5113495bSYour Name 	CASE_RETURN_STRING(QCA_DISCONNECT_REASON_USER_TRIGGERED);
90*5113495bSYour Name 	case QCA_DISCONNECT_REASON_UNSPECIFIED:
91*5113495bSYour Name 		return "";
92*5113495bSYour Name 	default:
93*5113495bSYour Name 		return "Unknown";
94*5113495bSYour Name 	}
95*5113495bSYour Name }
96*5113495bSYour Name 
97*5113495bSYour Name enum qca_disconnect_reason_codes
osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason)98*5113495bSYour Name osif_cm_mac_to_qca_reason(enum wlan_reason_code internal_reason)
99*5113495bSYour Name {
100*5113495bSYour Name 	enum qca_disconnect_reason_codes reason =
101*5113495bSYour Name 					QCA_DISCONNECT_REASON_UNSPECIFIED;
102*5113495bSYour Name 
103*5113495bSYour Name 	if (internal_reason < REASON_PROP_START)
104*5113495bSYour Name 		return reason;
105*5113495bSYour Name 
106*5113495bSYour Name 	switch (internal_reason) {
107*5113495bSYour Name 	case REASON_HOST_TRIGGERED_ROAM_FAILURE:
108*5113495bSYour Name 	case REASON_FW_TRIGGERED_ROAM_FAILURE:
109*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE;
110*5113495bSYour Name 		break;
111*5113495bSYour Name 	case REASON_USER_TRIGGERED_ROAM_FAILURE:
112*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE;
113*5113495bSYour Name 		break;
114*5113495bSYour Name 	case REASON_GATEWAY_REACHABILITY_FAILURE:
115*5113495bSYour Name 		reason =
116*5113495bSYour Name 		QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE;
117*5113495bSYour Name 		break;
118*5113495bSYour Name 	case REASON_UNSUPPORTED_CHANNEL_CSA:
119*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA;
120*5113495bSYour Name 		break;
121*5113495bSYour Name 	case REASON_OPER_CHANNEL_DISABLED_INDOOR:
122*5113495bSYour Name 		reason =
123*5113495bSYour Name 		QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR;
124*5113495bSYour Name 		break;
125*5113495bSYour Name 	case REASON_OPER_CHANNEL_USER_DISABLED:
126*5113495bSYour Name 		reason =
127*5113495bSYour Name 		QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED;
128*5113495bSYour Name 		break;
129*5113495bSYour Name 	case REASON_DEVICE_RECOVERY:
130*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY;
131*5113495bSYour Name 		break;
132*5113495bSYour Name 	case REASON_KEY_TIMEOUT:
133*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT;
134*5113495bSYour Name 		break;
135*5113495bSYour Name 	case REASON_OPER_CHANNEL_BAND_CHANGE:
136*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE;
137*5113495bSYour Name 		break;
138*5113495bSYour Name 	case REASON_IFACE_DOWN:
139*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_IFACE_DOWN;
140*5113495bSYour Name 		break;
141*5113495bSYour Name 	case REASON_PEER_XRETRY_FAIL:
142*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL;
143*5113495bSYour Name 		break;
144*5113495bSYour Name 	case REASON_PEER_INACTIVITY:
145*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY;
146*5113495bSYour Name 		break;
147*5113495bSYour Name 	case REASON_SA_QUERY_TIMEOUT:
148*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT;
149*5113495bSYour Name 		break;
150*5113495bSYour Name 	case REASON_CHANNEL_SWITCH_FAILED:
151*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE;
152*5113495bSYour Name 		break;
153*5113495bSYour Name 	case REASON_BEACON_MISSED:
154*5113495bSYour Name 		reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE;
155*5113495bSYour Name 		break;
156*5113495bSYour Name 	default:
157*5113495bSYour Name 		osif_debug("No QCA reason code for mac reason: %u",
158*5113495bSYour Name 			   internal_reason);
159*5113495bSYour Name 		/* Unspecified reason by default */
160*5113495bSYour Name 	}
161*5113495bSYour Name 
162*5113495bSYour Name 	return reason;
163*5113495bSYour Name }
164*5113495bSYour Name 
165*5113495bSYour Name static struct osif_cm_ops *osif_cm_legacy_ops;
166*5113495bSYour Name 
osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv * osif_priv)167*5113495bSYour Name void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv)
168*5113495bSYour Name {
169*5113495bSYour Name 	osif_priv->cm_info.last_id = CM_ID_INVALID;
170*5113495bSYour Name 	osif_priv->cm_info.last_source = CM_SOURCE_INVALID;
171*5113495bSYour Name }
172*5113495bSYour Name 
osif_cm_reset_id_and_src(struct wlan_objmgr_vdev * vdev)173*5113495bSYour Name QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev)
174*5113495bSYour Name {
175*5113495bSYour Name 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
176*5113495bSYour Name 
177*5113495bSYour Name 	if (!osif_priv) {
178*5113495bSYour Name 		osif_err("Invalid vdev osif priv");
179*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
180*5113495bSYour Name 	}
181*5113495bSYour Name 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
182*5113495bSYour Name 	osif_cm_reset_id_and_src_no_lock(osif_priv);
183*5113495bSYour Name 	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
184*5113495bSYour Name 
185*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
186*5113495bSYour Name }
187*5113495bSYour Name 
188*5113495bSYour Name /**
189*5113495bSYour Name  * osif_cm_connect_complete_cb() - Connect complete callback
190*5113495bSYour Name  * @vdev: vdev pointer
191*5113495bSYour Name  * @rsp: connect response
192*5113495bSYour Name  *
193*5113495bSYour Name  * Return: QDF_STATUS
194*5113495bSYour Name  */
195*5113495bSYour Name static QDF_STATUS
osif_cm_connect_complete_cb(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)196*5113495bSYour Name osif_cm_connect_complete_cb(struct wlan_objmgr_vdev *vdev,
197*5113495bSYour Name 			    struct wlan_cm_connect_resp *rsp)
198*5113495bSYour Name {
199*5113495bSYour Name 	return osif_connect_handler(vdev, rsp);
200*5113495bSYour Name }
201*5113495bSYour Name 
202*5113495bSYour Name /**
203*5113495bSYour Name  * osif_cm_failed_candidate_cb() - Callback to indicate failed candidate
204*5113495bSYour Name  * @vdev: vdev pointer
205*5113495bSYour Name  * @rsp: connect response
206*5113495bSYour Name  *
207*5113495bSYour Name  * Return: QDF_STATUS
208*5113495bSYour Name  */
209*5113495bSYour Name static QDF_STATUS
osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)210*5113495bSYour Name osif_cm_failed_candidate_cb(struct wlan_objmgr_vdev *vdev,
211*5113495bSYour Name 			    struct wlan_cm_connect_resp *rsp)
212*5113495bSYour Name {
213*5113495bSYour Name 	return osif_failed_candidate_handler(vdev, rsp);
214*5113495bSYour Name }
215*5113495bSYour Name 
216*5113495bSYour Name /**
217*5113495bSYour Name  * osif_cm_update_id_and_src_cb() - Callback to update id and
218*5113495bSYour Name  * source of the connect/disconnect request
219*5113495bSYour Name  * @vdev: vdev pointer
220*5113495bSYour Name  * @source: Source of the connect req
221*5113495bSYour Name  * @cm_id: Connect/disconnect id
222*5113495bSYour Name  *
223*5113495bSYour Name  * Context: Any context. Takes and releases cmd id spinlock
224*5113495bSYour Name  * Return: QDF_STATUS
225*5113495bSYour Name  */
226*5113495bSYour Name static QDF_STATUS
osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source,wlan_cm_id cm_id)227*5113495bSYour Name osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev *vdev,
228*5113495bSYour Name 			     enum wlan_cm_source source, wlan_cm_id cm_id)
229*5113495bSYour Name {
230*5113495bSYour Name 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
231*5113495bSYour Name 
232*5113495bSYour Name 	if (!osif_priv) {
233*5113495bSYour Name 		osif_err("Invalid vdev osif priv");
234*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
235*5113495bSYour Name 	}
236*5113495bSYour Name 
237*5113495bSYour Name 	qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock);
238*5113495bSYour Name 	osif_priv->cm_info.last_id = cm_id;
239*5113495bSYour Name 	osif_priv->cm_info.last_source = source;
240*5113495bSYour Name 	qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock);
241*5113495bSYour Name 
242*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
243*5113495bSYour Name }
244*5113495bSYour Name 
245*5113495bSYour Name /**
246*5113495bSYour Name  * osif_cm_disconnect_complete_cb() - Disconnect done callback
247*5113495bSYour Name  * @vdev: vdev pointer
248*5113495bSYour Name  * @rsp: Disconnect response
249*5113495bSYour Name  *
250*5113495bSYour Name  * Context: Any context
251*5113495bSYour Name  * Return: QDF_STATUS
252*5113495bSYour Name  */
253*5113495bSYour Name 
254*5113495bSYour Name static QDF_STATUS
osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev * vdev,struct wlan_cm_discon_rsp * rsp)255*5113495bSYour Name osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev *vdev,
256*5113495bSYour Name 			       struct wlan_cm_discon_rsp *rsp)
257*5113495bSYour Name {
258*5113495bSYour Name 	return osif_disconnect_handler(vdev, rsp);
259*5113495bSYour Name }
260*5113495bSYour Name 
261*5113495bSYour Name #ifdef CONN_MGR_ADV_FEATURE
osif_cm_unlink_bss(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * bssid)262*5113495bSYour Name void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
263*5113495bSYour Name 			struct qdf_mac_addr *bssid)
264*5113495bSYour Name {
265*5113495bSYour Name 	struct scan_filter *filter;
266*5113495bSYour Name 
267*5113495bSYour Name 	filter = qdf_mem_malloc(sizeof(*filter));
268*5113495bSYour Name 	if (!filter)
269*5113495bSYour Name 		return;
270*5113495bSYour Name 
271*5113495bSYour Name 	filter->num_of_bssid = 1;
272*5113495bSYour Name 	qdf_copy_macaddr(&filter->bssid_list[0], bssid);
273*5113495bSYour Name 	ucfg_scan_flush_results(wlan_vdev_get_pdev(vdev), filter);
274*5113495bSYour Name 	qdf_mem_free(filter);
275*5113495bSYour Name }
276*5113495bSYour Name 
277*5113495bSYour Name static QDF_STATUS
osif_cm_disable_netif_queue(struct wlan_objmgr_vdev * vdev)278*5113495bSYour Name osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
279*5113495bSYour Name {
280*5113495bSYour Name 	return osif_cm_netif_queue_ind(vdev,
281*5113495bSYour Name 				       WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER,
282*5113495bSYour Name 				       WLAN_CONTROL_PATH);
283*5113495bSYour Name }
284*5113495bSYour Name 
285*5113495bSYour Name /**
286*5113495bSYour Name  * osif_cm_roam_sync_cb() - Roam sync callback
287*5113495bSYour Name  * @vdev: vdev pointer
288*5113495bSYour Name  *
289*5113495bSYour Name  * This callback indicates os_if that roam sync ind received
290*5113495bSYour Name  * so that os_if can stop all the activity on this connection
291*5113495bSYour Name  *
292*5113495bSYour Name  * Return: QDF_STATUS
293*5113495bSYour Name  */
294*5113495bSYour Name static QDF_STATUS
osif_cm_roam_sync_cb(struct wlan_objmgr_vdev * vdev)295*5113495bSYour Name osif_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev)
296*5113495bSYour Name {
297*5113495bSYour Name 	osif_cm_napi_serialize(true);
298*5113495bSYour Name 	return osif_cm_netif_queue_ind(vdev,
299*5113495bSYour Name 				       WLAN_STOP_ALL_NETIF_QUEUE,
300*5113495bSYour Name 				       WLAN_CONTROL_PATH);
301*5113495bSYour Name }
302*5113495bSYour Name 
303*5113495bSYour Name /**
304*5113495bSYour Name  * osif_pmksa_candidate_notify_cb() - Roam pmksa candidate notify callback
305*5113495bSYour Name  * @vdev: vdev pointer
306*5113495bSYour Name  * @bssid: bssid
307*5113495bSYour Name  * @index: index
308*5113495bSYour Name  * @preauth: preauth flag
309*5113495bSYour Name  *
310*5113495bSYour Name  * Return: QDF_STATUS
311*5113495bSYour Name  */
312*5113495bSYour Name static QDF_STATUS
osif_pmksa_candidate_notify_cb(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * bssid,int index,bool preauth)313*5113495bSYour Name osif_pmksa_candidate_notify_cb(struct wlan_objmgr_vdev *vdev,
314*5113495bSYour Name 			       struct qdf_mac_addr *bssid,
315*5113495bSYour Name 			       int index, bool preauth)
316*5113495bSYour Name {
317*5113495bSYour Name 	return osif_pmksa_candidate_notify(vdev, bssid, index, preauth);
318*5113495bSYour Name }
319*5113495bSYour Name 
320*5113495bSYour Name /**
321*5113495bSYour Name  * osif_cm_send_keys_cb() - Send keys callback
322*5113495bSYour Name  * @vdev: vdev pointer
323*5113495bSYour Name  * @key_index: key index
324*5113495bSYour Name  * @pairwise: true if pairwise
325*5113495bSYour Name  * @cipher_type: cipher type
326*5113495bSYour Name  *
327*5113495bSYour Name  * This callback indicates os_if that
328*5113495bSYour Name  * so that os_if can stop all the activity on this connection
329*5113495bSYour Name  *
330*5113495bSYour Name  * Return: QDF_STATUS
331*5113495bSYour Name  */
332*5113495bSYour Name static QDF_STATUS
osif_cm_send_keys_cb(struct wlan_objmgr_vdev * vdev,uint8_t key_index,bool pairwise,enum wlan_crypto_cipher_type cipher_type)333*5113495bSYour Name osif_cm_send_keys_cb(struct wlan_objmgr_vdev *vdev, uint8_t key_index,
334*5113495bSYour Name 		     bool pairwise, enum wlan_crypto_cipher_type cipher_type)
335*5113495bSYour Name {
336*5113495bSYour Name 	return osif_cm_send_vdev_keys(vdev,
337*5113495bSYour Name 				       key_index,
338*5113495bSYour Name 				       pairwise,
339*5113495bSYour Name 				       cipher_type);
340*5113495bSYour Name }
341*5113495bSYour Name #else
342*5113495bSYour Name static inline QDF_STATUS
osif_cm_disable_netif_queue(struct wlan_objmgr_vdev * vdev)343*5113495bSYour Name osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
344*5113495bSYour Name {
345*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
346*5113495bSYour Name }
347*5113495bSYour Name #endif
348*5113495bSYour Name 
349*5113495bSYour Name #if defined(CONN_MGR_ADV_FEATURE) && defined(WLAN_FEATURE_11BE_MLO)
350*5113495bSYour Name /**
351*5113495bSYour Name  * osif_link_reconfig_notify_cb() - Link reconfig notify callback
352*5113495bSYour Name  * @vdev: vdev pointer
353*5113495bSYour Name  *
354*5113495bSYour Name  * Return: QDF_STATUS
355*5113495bSYour Name  */
356*5113495bSYour Name static QDF_STATUS
osif_link_reconfig_notify_cb(struct wlan_objmgr_vdev * vdev)357*5113495bSYour Name osif_link_reconfig_notify_cb(struct wlan_objmgr_vdev *vdev)
358*5113495bSYour Name {
359*5113495bSYour Name 	struct vdev_osif_priv *osif_priv;
360*5113495bSYour Name 	struct wlan_objmgr_vdev *assoc_vdev;
361*5113495bSYour Name 	struct wireless_dev *wdev;
362*5113495bSYour Name 	uint8_t link_id;
363*5113495bSYour Name 	uint16_t link_mask;
364*5113495bSYour Name 	struct pdev_osif_priv *pdev_osif_priv;
365*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
366*5113495bSYour Name 	uint32_t data_len;
367*5113495bSYour Name 	struct sk_buff *vendor_event;
368*5113495bSYour Name 	struct qdf_mac_addr ap_mld_mac;
369*5113495bSYour Name 	QDF_STATUS status;
370*5113495bSYour Name 
371*5113495bSYour Name 	assoc_vdev = ucfg_mlo_get_assoc_link_vdev(vdev);
372*5113495bSYour Name 	if (!assoc_vdev) {
373*5113495bSYour Name 		osif_err("Failed to get assoc vdev");
374*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
375*5113495bSYour Name 	}
376*5113495bSYour Name 
377*5113495bSYour Name 	osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
378*5113495bSYour Name 	if (!osif_priv) {
379*5113495bSYour Name 		osif_err("Invalid vdev osif priv");
380*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
381*5113495bSYour Name 	}
382*5113495bSYour Name 
383*5113495bSYour Name 	wdev = osif_priv->wdev;
384*5113495bSYour Name 	if (!wdev) {
385*5113495bSYour Name 		osif_err("wdev is null");
386*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
387*5113495bSYour Name 	}
388*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(assoc_vdev);
389*5113495bSYour Name 	if (!pdev) {
390*5113495bSYour Name 		osif_debug("null pdev");
391*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
392*5113495bSYour Name 	}
393*5113495bSYour Name 	pdev_osif_priv = wlan_pdev_get_ospriv(pdev);
394*5113495bSYour Name 	if (!pdev_osif_priv || !pdev_osif_priv->wiphy) {
395*5113495bSYour Name 		osif_debug("null wiphy");
396*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
397*5113495bSYour Name 	}
398*5113495bSYour Name 
399*5113495bSYour Name 	link_id = wlan_vdev_get_link_id(vdev);
400*5113495bSYour Name 	link_mask = 1 << link_id;
401*5113495bSYour Name 	osif_debug("link reconfig on vdev %d with link id %d mask 0x%x",
402*5113495bSYour Name 		   wlan_vdev_get_id(vdev), link_id, link_mask);
403*5113495bSYour Name 
404*5113495bSYour Name 	status = wlan_vdev_get_bss_peer_mld_mac(vdev, &ap_mld_mac);
405*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
406*5113495bSYour Name 		osif_debug("get peer mld failed, vdev %d",
407*5113495bSYour Name 			   wlan_vdev_get_id(vdev));
408*5113495bSYour Name 		return status;
409*5113495bSYour Name 	}
410*5113495bSYour Name 	osif_debug("ap mld addr: "QDF_MAC_ADDR_FMT,
411*5113495bSYour Name 		   QDF_MAC_ADDR_REF(ap_mld_mac.bytes));
412*5113495bSYour Name 
413*5113495bSYour Name 	data_len = nla_total_size(QDF_MAC_ADDR_SIZE) +
414*5113495bSYour Name 		   nla_total_size(sizeof(uint16_t)) +
415*5113495bSYour Name 		   NLMSG_HDRLEN;
416*5113495bSYour Name 
417*5113495bSYour Name 	vendor_event =
418*5113495bSYour Name 	wlan_cfg80211_vendor_event_alloc(pdev_osif_priv->wiphy,
419*5113495bSYour Name 					 wdev, data_len,
420*5113495bSYour Name 					 QCA_NL80211_VENDOR_SUBCMD_LINK_RECONFIG_INDEX,
421*5113495bSYour Name 					 GFP_KERNEL);
422*5113495bSYour Name 	if (!vendor_event) {
423*5113495bSYour Name 		osif_debug("wlan_cfg80211_vendor_event_alloc failed");
424*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
425*5113495bSYour Name 	}
426*5113495bSYour Name 
427*5113495bSYour Name 	if (nla_put(vendor_event,
428*5113495bSYour Name 		    QCA_WLAN_VENDOR_ATTR_LINK_RECONFIG_AP_MLD_ADDR,
429*5113495bSYour Name 		    QDF_MAC_ADDR_SIZE, &ap_mld_mac.bytes[0]) ||
430*5113495bSYour Name 	    nla_put_u16(vendor_event,
431*5113495bSYour Name 			QCA_WLAN_VENDOR_ATTR_LINK_RECONFIG_REMOVED_LINKS,
432*5113495bSYour Name 			link_mask)) {
433*5113495bSYour Name 		osif_debug("QCA_WLAN_VENDOR_ATTR put fail");
434*5113495bSYour Name 		wlan_cfg80211_vendor_free_skb(vendor_event);
435*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
436*5113495bSYour Name 	}
437*5113495bSYour Name 
438*5113495bSYour Name 	wlan_cfg80211_vendor_event(vendor_event, GFP_KERNEL);
439*5113495bSYour Name 
440*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
441*5113495bSYour Name }
442*5113495bSYour Name #else
443*5113495bSYour Name static inline QDF_STATUS
osif_link_reconfig_notify_cb(struct wlan_objmgr_vdev * vdev)444*5113495bSYour Name osif_link_reconfig_notify_cb(struct wlan_objmgr_vdev *vdev)
445*5113495bSYour Name {
446*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
447*5113495bSYour Name }
448*5113495bSYour Name #endif
449*5113495bSYour Name 
450*5113495bSYour Name /**
451*5113495bSYour Name  * osif_cm_disconnect_start_cb() - Disconnect start callback
452*5113495bSYour Name  * @vdev: vdev pointer
453*5113495bSYour Name  * @source: Disconnect source
454*5113495bSYour Name  *
455*5113495bSYour Name  * This callback indicates os_if that disconnection is started
456*5113495bSYour Name  * so that os_if can stop all the activity on this connection
457*5113495bSYour Name  *
458*5113495bSYour Name  * Return: QDF_STATUS
459*5113495bSYour Name  */
osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev * vdev,enum wlan_cm_source source)460*5113495bSYour Name static QDF_STATUS osif_cm_disconnect_start_cb(struct wlan_objmgr_vdev *vdev,
461*5113495bSYour Name 					      enum wlan_cm_source source)
462*5113495bSYour Name {
463*5113495bSYour Name 	/* Don't stop netif queues for link switch disconnect */
464*5113495bSYour Name 	if (source == CM_MLO_LINK_SWITCH_DISCONNECT ||
465*5113495bSYour Name 	    source == CM_MLO_ROAM_INTERNAL_DISCONNECT)
466*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
467*5113495bSYour Name 
468*5113495bSYour Name 	/* Disable netif queue on disconnect start */
469*5113495bSYour Name 	return osif_cm_disable_netif_queue(vdev);
470*5113495bSYour Name }
471*5113495bSYour Name 
472*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
473*5113495bSYour Name /**
474*5113495bSYour Name  * osif_cm_roam_start_cb() - Roam start callback
475*5113495bSYour Name  * @vdev: vdev pointer
476*5113495bSYour Name  *
477*5113495bSYour Name  * This callback indicates os_if that roaming has started
478*5113495bSYour Name  * so that os_if can stop all the activity on this connection
479*5113495bSYour Name  *
480*5113495bSYour Name  * Return: QDF_STATUS
481*5113495bSYour Name  */
482*5113495bSYour Name static QDF_STATUS
osif_cm_roam_start_cb(struct wlan_objmgr_vdev * vdev)483*5113495bSYour Name osif_cm_roam_start_cb(struct wlan_objmgr_vdev *vdev)
484*5113495bSYour Name {
485*5113495bSYour Name 	osif_cm_perfd_set_cpufreq(true);
486*5113495bSYour Name 	return osif_cm_netif_queue_ind(vdev,
487*5113495bSYour Name 				       WLAN_STOP_ALL_NETIF_QUEUE,
488*5113495bSYour Name 				       WLAN_CONTROL_PATH);
489*5113495bSYour Name }
490*5113495bSYour Name 
491*5113495bSYour Name /**
492*5113495bSYour Name  * osif_cm_roam_abort_cb() - Roam abort callback
493*5113495bSYour Name  * @vdev: vdev pointer
494*5113495bSYour Name  *
495*5113495bSYour Name  * This callback indicates os_if that roaming has been aborted
496*5113495bSYour Name  * so that os_if can resume all the activity on this connection
497*5113495bSYour Name  *
498*5113495bSYour Name  * Return: QDF_STATUS
499*5113495bSYour Name  */
500*5113495bSYour Name static QDF_STATUS
osif_cm_roam_abort_cb(struct wlan_objmgr_vdev * vdev)501*5113495bSYour Name osif_cm_roam_abort_cb(struct wlan_objmgr_vdev *vdev)
502*5113495bSYour Name {
503*5113495bSYour Name 	osif_cm_perfd_set_cpufreq(false);
504*5113495bSYour Name 	osif_cm_napi_serialize(false);
505*5113495bSYour Name 	return osif_cm_netif_queue_ind(vdev,
506*5113495bSYour Name 				       WLAN_WAKE_ALL_NETIF_QUEUE,
507*5113495bSYour Name 				       WLAN_CONTROL_PATH);
508*5113495bSYour Name }
509*5113495bSYour Name 
510*5113495bSYour Name /**
511*5113495bSYour Name  * osif_cm_roam_cmpl_cb() - Roam sync complete callback
512*5113495bSYour Name  * @vdev: vdev pointer
513*5113495bSYour Name  *
514*5113495bSYour Name  * This callback indicates os_if that roam sync is complete
515*5113495bSYour Name  * so that os_if can stop all the activity on this connection
516*5113495bSYour Name  *
517*5113495bSYour Name  * Return: QDF_STATUS
518*5113495bSYour Name  */
519*5113495bSYour Name 
520*5113495bSYour Name static QDF_STATUS
osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev * vdev)521*5113495bSYour Name osif_cm_roam_cmpl_cb(struct wlan_objmgr_vdev *vdev)
522*5113495bSYour Name {
523*5113495bSYour Name 	osif_cm_perfd_set_cpufreq(false);
524*5113495bSYour Name 	return osif_cm_napi_serialize(false);
525*5113495bSYour Name }
526*5113495bSYour Name 
527*5113495bSYour Name /**
528*5113495bSYour Name  * osif_cm_get_scan_ie_params() - Function to get scan ie params
529*5113495bSYour Name  * @vdev: vdev pointer
530*5113495bSYour Name  * @scan_ie: Pointer to scan_ie
531*5113495bSYour Name  * @dot11mode_filter: Pointer to dot11mode_filter
532*5113495bSYour Name  *
533*5113495bSYour Name  * Get scan IE params from adapter corresponds to given vdev
534*5113495bSYour Name  *
535*5113495bSYour Name  * Return: QDF_STATUS
536*5113495bSYour Name  */
537*5113495bSYour Name static QDF_STATUS
osif_cm_get_scan_ie_params(struct wlan_objmgr_vdev * vdev,struct element_info * scan_ie,enum dot11_mode_filter * dot11mode_filter)538*5113495bSYour Name osif_cm_get_scan_ie_params(struct wlan_objmgr_vdev *vdev,
539*5113495bSYour Name 			   struct element_info *scan_ie,
540*5113495bSYour Name 			   enum dot11_mode_filter *dot11mode_filter)
541*5113495bSYour Name {
542*5113495bSYour Name 	osif_cm_get_scan_ie_params_cb cb = NULL;
543*5113495bSYour Name 
544*5113495bSYour Name 	if (osif_cm_legacy_ops)
545*5113495bSYour Name 		cb = osif_cm_legacy_ops->get_scan_ie_params_cb;
546*5113495bSYour Name 	if (cb)
547*5113495bSYour Name 		return cb(vdev, scan_ie, dot11mode_filter);
548*5113495bSYour Name 
549*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
550*5113495bSYour Name }
551*5113495bSYour Name 
552*5113495bSYour Name /**
553*5113495bSYour Name  * osif_cm_get_scan_ie_info_cb() - Roam get scan ie params callback
554*5113495bSYour Name  * @vdev: vdev pointer
555*5113495bSYour Name  * @scan_ie: pointer to scan ie
556*5113495bSYour Name  * @dot11mode_filter: pointer to dot11 mode filter
557*5113495bSYour Name  *
558*5113495bSYour Name  * This callback gets scan ie params from os_if
559*5113495bSYour Name  *
560*5113495bSYour Name  * Return: QDF_STATUS
561*5113495bSYour Name  */
562*5113495bSYour Name 
563*5113495bSYour Name static QDF_STATUS
osif_cm_get_scan_ie_info_cb(struct wlan_objmgr_vdev * vdev,struct element_info * scan_ie,enum dot11_mode_filter * dot11mode_filter)564*5113495bSYour Name osif_cm_get_scan_ie_info_cb(struct wlan_objmgr_vdev *vdev,
565*5113495bSYour Name 			    struct element_info *scan_ie,
566*5113495bSYour Name 			    enum dot11_mode_filter *dot11mode_filter)
567*5113495bSYour Name {
568*5113495bSYour Name 	return osif_cm_get_scan_ie_params(vdev, scan_ie, dot11mode_filter);
569*5113495bSYour Name }
570*5113495bSYour Name 
571*5113495bSYour Name /**
572*5113495bSYour Name  * osif_cm_roam_rt_stats_evt_cb() - Roam stats callback
573*5113495bSYour Name  * @roam_stats: roam_stats_event pointer
574*5113495bSYour Name  * @idx: TLV idx for roam_stats_event
575*5113495bSYour Name  *
576*5113495bSYour Name  * This callback indicates os_if that roam stats event is received
577*5113495bSYour Name  * so that os_if can send the event
578*5113495bSYour Name  *
579*5113495bSYour Name  * Return: void
580*5113495bSYour Name  */
581*5113495bSYour Name 
582*5113495bSYour Name static void
osif_cm_roam_rt_stats_evt_cb(struct roam_stats_event * roam_stats,uint8_t idx)583*5113495bSYour Name osif_cm_roam_rt_stats_evt_cb(struct roam_stats_event *roam_stats,
584*5113495bSYour Name 		      uint8_t idx)
585*5113495bSYour Name {
586*5113495bSYour Name 	if (osif_cm_legacy_ops &&
587*5113495bSYour Name 	    osif_cm_legacy_ops->roam_rt_stats_event_cb)
588*5113495bSYour Name 		osif_cm_legacy_ops->roam_rt_stats_event_cb(roam_stats, idx);
589*5113495bSYour Name }
590*5113495bSYour Name 
591*5113495bSYour Name #endif
592*5113495bSYour Name 
593*5113495bSYour Name #ifdef WLAN_FEATURE_PREAUTH_ENABLE
594*5113495bSYour Name /**
595*5113495bSYour Name  * osif_cm_ft_preauth_cmpl_cb() - Roam ft preauth complete callback
596*5113495bSYour Name  * @vdev: vdev pointer
597*5113495bSYour Name  * @rsp: preauth response
598*5113495bSYour Name  *
599*5113495bSYour Name  * This callback indicates os_if that roam ft preauth is complete
600*5113495bSYour Name  * so that os_if can send fast transition event
601*5113495bSYour Name  *
602*5113495bSYour Name  * Return: QDF_STATUS
603*5113495bSYour Name  */
604*5113495bSYour Name 
605*5113495bSYour Name static QDF_STATUS
osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev * vdev,struct wlan_preauth_rsp * rsp)606*5113495bSYour Name osif_cm_ft_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
607*5113495bSYour Name 			   struct wlan_preauth_rsp *rsp)
608*5113495bSYour Name {
609*5113495bSYour Name 	osif_cm_ft_preauth_complete_cb cb = NULL;
610*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
611*5113495bSYour Name 
612*5113495bSYour Name 	if (osif_cm_legacy_ops)
613*5113495bSYour Name 		cb = osif_cm_legacy_ops->ft_preauth_complete_cb;
614*5113495bSYour Name 	if (cb)
615*5113495bSYour Name 		ret = cb(vdev, rsp);
616*5113495bSYour Name 
617*5113495bSYour Name 	return ret;
618*5113495bSYour Name }
619*5113495bSYour Name 
620*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
621*5113495bSYour Name /**
622*5113495bSYour Name  * osif_cm_cckm_preauth_cmpl_cb() - Roam cckm preauth complete callback
623*5113495bSYour Name  * @vdev: vdev pointer
624*5113495bSYour Name  * @rsp: preauth response
625*5113495bSYour Name  *
626*5113495bSYour Name  * This callback indicates os_if that roam cckm preauth is complete
627*5113495bSYour Name  * so that os_if can send cckm preauth indication to the supplicant
628*5113495bSYour Name  * via wireless custom event.
629*5113495bSYour Name  *
630*5113495bSYour Name  * Return: QDF_STATUS
631*5113495bSYour Name  */
632*5113495bSYour Name 
633*5113495bSYour Name static QDF_STATUS
osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev * vdev,struct wlan_preauth_rsp * rsp)634*5113495bSYour Name osif_cm_cckm_preauth_cmpl_cb(struct wlan_objmgr_vdev *vdev,
635*5113495bSYour Name 			     struct wlan_preauth_rsp *rsp)
636*5113495bSYour Name {
637*5113495bSYour Name 	osif_cm_cckm_preauth_complete_cb cb = NULL;
638*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
639*5113495bSYour Name 
640*5113495bSYour Name 	if (osif_cm_legacy_ops)
641*5113495bSYour Name 		cb = osif_cm_legacy_ops->cckm_preauth_complete_cb;
642*5113495bSYour Name 	if (cb)
643*5113495bSYour Name 		ret = cb(vdev, rsp);
644*5113495bSYour Name 
645*5113495bSYour Name 	return ret;
646*5113495bSYour Name }
647*5113495bSYour Name #endif
648*5113495bSYour Name #endif
649*5113495bSYour Name 
650*5113495bSYour Name #ifdef WLAN_BOOST_CPU_FREQ_IN_ROAM
651*5113495bSYour Name /**
652*5113495bSYour Name  * osif_cm_perfd_reset_cpufreq_ctrl_cb() - Callback to reset CPU freq
653*5113495bSYour Name  *
654*5113495bSYour Name  * This callback indicates os_if to reset the request to boost CPU freq
655*5113495bSYour Name  *
656*5113495bSYour Name  * Return: None
657*5113495bSYour Name  */
osif_cm_perfd_reset_cpufreq_ctrl_cb(void)658*5113495bSYour Name static void osif_cm_perfd_reset_cpufreq_ctrl_cb(void)
659*5113495bSYour Name {
660*5113495bSYour Name 	osif_cm_perfd_set_cpufreq(false);
661*5113495bSYour Name }
662*5113495bSYour Name #endif
663*5113495bSYour Name 
664*5113495bSYour Name static struct mlme_cm_ops cm_ops = {
665*5113495bSYour Name #ifdef CONN_MGR_ADV_FEATURE
666*5113495bSYour Name 	.mlme_cm_connect_active_notify_cb = osif_cm_connect_active_notify,
667*5113495bSYour Name #endif
668*5113495bSYour Name 	.mlme_cm_connect_complete_cb = osif_cm_connect_complete_cb,
669*5113495bSYour Name 	.mlme_cm_failed_candidate_cb = osif_cm_failed_candidate_cb,
670*5113495bSYour Name 	.mlme_cm_update_id_and_src_cb = osif_cm_update_id_and_src_cb,
671*5113495bSYour Name 	.mlme_cm_disconnect_complete_cb = osif_cm_disconnect_complete_cb,
672*5113495bSYour Name 	.mlme_cm_disconnect_start_cb = osif_cm_disconnect_start_cb,
673*5113495bSYour Name #ifdef CONN_MGR_ADV_FEATURE
674*5113495bSYour Name 	.mlme_cm_roam_sync_cb = osif_cm_roam_sync_cb,
675*5113495bSYour Name 	.mlme_cm_pmksa_candidate_notify_cb = osif_pmksa_candidate_notify_cb,
676*5113495bSYour Name 	.mlme_cm_send_keys_cb = osif_cm_send_keys_cb,
677*5113495bSYour Name 	.mlme_cm_link_reconfig_notify_cb = osif_link_reconfig_notify_cb,
678*5113495bSYour Name #endif
679*5113495bSYour Name #ifdef WLAN_FEATURE_ROAM_OFFLOAD
680*5113495bSYour Name 	.mlme_cm_roam_start_cb = osif_cm_roam_start_cb,
681*5113495bSYour Name 	.mlme_cm_roam_abort_cb = osif_cm_roam_abort_cb,
682*5113495bSYour Name 	.mlme_cm_roam_cmpl_cb = osif_cm_roam_cmpl_cb,
683*5113495bSYour Name 	.mlme_cm_roam_get_scan_ie_cb = osif_cm_get_scan_ie_info_cb,
684*5113495bSYour Name 	.mlme_cm_roam_rt_stats_cb = osif_cm_roam_rt_stats_evt_cb,
685*5113495bSYour Name #endif
686*5113495bSYour Name #ifdef WLAN_FEATURE_PREAUTH_ENABLE
687*5113495bSYour Name 	.mlme_cm_ft_preauth_cmpl_cb = osif_cm_ft_preauth_cmpl_cb,
688*5113495bSYour Name #ifdef FEATURE_WLAN_ESE
689*5113495bSYour Name 	.mlme_cm_cckm_preauth_cmpl_cb = osif_cm_cckm_preauth_cmpl_cb,
690*5113495bSYour Name #endif
691*5113495bSYour Name #endif
692*5113495bSYour Name #ifdef WLAN_VENDOR_HANDOFF_CONTROL
693*5113495bSYour Name 	.mlme_cm_get_vendor_handoff_params_cb =
694*5113495bSYour Name 					osif_cm_vendor_handoff_params_cb,
695*5113495bSYour Name #endif
696*5113495bSYour Name #ifdef WLAN_BOOST_CPU_FREQ_IN_ROAM
697*5113495bSYour Name 	.mlme_cm_perfd_reset_cpufreq_ctrl_cb =
698*5113495bSYour Name 				osif_cm_perfd_reset_cpufreq_ctrl_cb,
699*5113495bSYour Name #endif
700*5113495bSYour Name };
701*5113495bSYour Name 
702*5113495bSYour Name /**
703*5113495bSYour Name  * osif_cm_get_global_ops() - Get connection manager global ops
704*5113495bSYour Name  *
705*5113495bSYour Name  * Return: Connection manager global ops
706*5113495bSYour Name  */
osif_cm_get_global_ops(void)707*5113495bSYour Name static struct mlme_cm_ops *osif_cm_get_global_ops(void)
708*5113495bSYour Name {
709*5113495bSYour Name 	return &cm_ops;
710*5113495bSYour Name }
711*5113495bSYour Name 
osif_cm_register_cb(void)712*5113495bSYour Name QDF_STATUS osif_cm_register_cb(void)
713*5113495bSYour Name {
714*5113495bSYour Name 	mlme_set_osif_cm_cb(osif_cm_get_global_ops);
715*5113495bSYour Name 
716*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
717*5113495bSYour Name }
718*5113495bSYour Name 
osif_cm_osif_priv_init(struct wlan_objmgr_vdev * vdev)719*5113495bSYour Name QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev)
720*5113495bSYour Name {
721*5113495bSYour Name 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
722*5113495bSYour Name 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
723*5113495bSYour Name 
724*5113495bSYour Name 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
725*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
726*5113495bSYour Name 
727*5113495bSYour Name 	if (!osif_priv) {
728*5113495bSYour Name 		osif_err("Invalid vdev osif priv");
729*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
730*5113495bSYour Name 	}
731*5113495bSYour Name 
732*5113495bSYour Name 	qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock);
733*5113495bSYour Name 
734*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
735*5113495bSYour Name }
736*5113495bSYour Name 
osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev * vdev)737*5113495bSYour Name QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev)
738*5113495bSYour Name {
739*5113495bSYour Name 	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
740*5113495bSYour Name 	enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev);
741*5113495bSYour Name 
742*5113495bSYour Name 	if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE)
743*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
744*5113495bSYour Name 
745*5113495bSYour Name 	if (!osif_priv) {
746*5113495bSYour Name 		osif_err("Invalid vdev osif priv");
747*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
748*5113495bSYour Name 	}
749*5113495bSYour Name 	qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock);
750*5113495bSYour Name 
751*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
752*5113495bSYour Name }
753*5113495bSYour Name 
754*5113495bSYour Name #ifdef CONN_MGR_ADV_FEATURE
osif_cm_connect_active_notify(uint8_t vdev_id)755*5113495bSYour Name void osif_cm_connect_active_notify(uint8_t vdev_id)
756*5113495bSYour Name {
757*5113495bSYour Name 	if (osif_cm_legacy_ops && osif_cm_legacy_ops->connect_active_notify_cb)
758*5113495bSYour Name 		osif_cm_legacy_ops->connect_active_notify_cb(vdev_id);
759*5113495bSYour Name }
760*5113495bSYour Name #endif
761*5113495bSYour Name 
osif_cm_connect_comp_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp,enum osif_cb_type type)762*5113495bSYour Name QDF_STATUS osif_cm_connect_comp_ind(struct wlan_objmgr_vdev *vdev,
763*5113495bSYour Name 				    struct wlan_cm_connect_resp *rsp,
764*5113495bSYour Name 				    enum osif_cb_type type)
765*5113495bSYour Name {
766*5113495bSYour Name 	osif_cm_connect_comp_cb cb = NULL;
767*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
768*5113495bSYour Name 
769*5113495bSYour Name 	if (osif_cm_legacy_ops)
770*5113495bSYour Name 		cb = osif_cm_legacy_ops->connect_complete_cb;
771*5113495bSYour Name 	if (cb)
772*5113495bSYour Name 		ret = cb(vdev, rsp, type);
773*5113495bSYour Name 
774*5113495bSYour Name 	return ret;
775*5113495bSYour Name }
776*5113495bSYour Name 
777*5113495bSYour Name #ifdef WLAN_VENDOR_HANDOFF_CONTROL
osif_cm_vendor_handoff_params_cb(struct wlan_objmgr_psoc * psoc,void * vendor_handoff_context)778*5113495bSYour Name QDF_STATUS osif_cm_vendor_handoff_params_cb(struct wlan_objmgr_psoc *psoc,
779*5113495bSYour Name 					    void *vendor_handoff_context)
780*5113495bSYour Name {
781*5113495bSYour Name 	osif_cm_get_vendor_handoff_params_cb cb = NULL;
782*5113495bSYour Name 
783*5113495bSYour Name 	if (osif_cm_legacy_ops)
784*5113495bSYour Name 		cb = osif_cm_legacy_ops->vendor_handoff_params_cb;
785*5113495bSYour Name 	if (cb)
786*5113495bSYour Name 		return cb(psoc, vendor_handoff_context);
787*5113495bSYour Name 
788*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
789*5113495bSYour Name }
790*5113495bSYour Name #endif
791*5113495bSYour Name 
osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev * vdev,struct wlan_cm_discon_rsp * rsp,enum osif_cb_type type)792*5113495bSYour Name QDF_STATUS osif_cm_disconnect_comp_ind(struct wlan_objmgr_vdev *vdev,
793*5113495bSYour Name 				       struct wlan_cm_discon_rsp *rsp,
794*5113495bSYour Name 				       enum osif_cb_type type)
795*5113495bSYour Name {
796*5113495bSYour Name 	osif_cm_disconnect_comp_cb cb = NULL;
797*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
798*5113495bSYour Name 
799*5113495bSYour Name 	if (osif_cm_legacy_ops)
800*5113495bSYour Name 		cb = osif_cm_legacy_ops->disconnect_complete_cb;
801*5113495bSYour Name 	if (cb)
802*5113495bSYour Name 		ret = cb(vdev, rsp, type);
803*5113495bSYour Name 
804*5113495bSYour Name 	return ret;
805*5113495bSYour Name }
806*5113495bSYour Name 
807*5113495bSYour Name #ifdef CONN_MGR_ADV_FEATURE
osif_cm_netif_queue_ind(struct wlan_objmgr_vdev * vdev,enum netif_action_type action,enum netif_reason_type reason)808*5113495bSYour Name QDF_STATUS osif_cm_netif_queue_ind(struct wlan_objmgr_vdev *vdev,
809*5113495bSYour Name 				   enum netif_action_type action,
810*5113495bSYour Name 				   enum netif_reason_type reason)
811*5113495bSYour Name {
812*5113495bSYour Name 	osif_cm_netif_queue_ctrl_cb cb = NULL;
813*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
814*5113495bSYour Name 
815*5113495bSYour Name 	if (osif_cm_legacy_ops)
816*5113495bSYour Name 		cb = osif_cm_legacy_ops->netif_queue_control_cb;
817*5113495bSYour Name 	if (cb)
818*5113495bSYour Name 		ret = cb(vdev, action, reason);
819*5113495bSYour Name 
820*5113495bSYour Name 	return ret;
821*5113495bSYour Name }
822*5113495bSYour Name 
osif_cm_napi_serialize(bool action)823*5113495bSYour Name QDF_STATUS osif_cm_napi_serialize(bool action)
824*5113495bSYour Name {
825*5113495bSYour Name 	os_if_cm_napi_serialize_ctrl_cb cb = NULL;
826*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
827*5113495bSYour Name 
828*5113495bSYour Name 	if (osif_cm_legacy_ops)
829*5113495bSYour Name 		cb = osif_cm_legacy_ops->napi_serialize_control_cb;
830*5113495bSYour Name 	if (cb)
831*5113495bSYour Name 		ret = cb(action);
832*5113495bSYour Name 
833*5113495bSYour Name 	return ret;
834*5113495bSYour Name }
835*5113495bSYour Name 
osif_cm_save_gtk(struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)836*5113495bSYour Name QDF_STATUS osif_cm_save_gtk(struct wlan_objmgr_vdev *vdev,
837*5113495bSYour Name 			    struct wlan_cm_connect_resp *rsp)
838*5113495bSYour Name {
839*5113495bSYour Name 	osif_cm_save_gtk_cb cb = NULL;
840*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
841*5113495bSYour Name 
842*5113495bSYour Name 	if (osif_cm_legacy_ops)
843*5113495bSYour Name 		cb = osif_cm_legacy_ops->save_gtk_cb;
844*5113495bSYour Name 	if (cb)
845*5113495bSYour Name 		ret = cb(vdev, rsp);
846*5113495bSYour Name 
847*5113495bSYour Name 	return ret;
848*5113495bSYour Name }
849*5113495bSYour Name 
850*5113495bSYour Name QDF_STATUS
osif_cm_send_vdev_keys(struct wlan_objmgr_vdev * vdev,uint8_t key_index,bool pairwise,enum wlan_crypto_cipher_type cipher_type)851*5113495bSYour Name osif_cm_send_vdev_keys(struct wlan_objmgr_vdev *vdev,
852*5113495bSYour Name 		       uint8_t key_index,
853*5113495bSYour Name 		       bool pairwise,
854*5113495bSYour Name 		       enum wlan_crypto_cipher_type cipher_type)
855*5113495bSYour Name {
856*5113495bSYour Name 	osif_cm_send_vdev_keys_cb cb = NULL;
857*5113495bSYour Name 
858*5113495bSYour Name 	if (osif_cm_legacy_ops)
859*5113495bSYour Name 		cb = osif_cm_legacy_ops->send_vdev_keys_cb;
860*5113495bSYour Name 	if (cb)
861*5113495bSYour Name 		return cb(vdev, key_index, pairwise, cipher_type);
862*5113495bSYour Name 
863*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
864*5113495bSYour Name }
865*5113495bSYour Name #endif
866*5113495bSYour Name 
867*5113495bSYour Name #ifdef WLAN_FEATURE_FILS_SK
osif_cm_set_hlp_data(struct net_device * dev,struct wlan_objmgr_vdev * vdev,struct wlan_cm_connect_resp * rsp)868*5113495bSYour Name QDF_STATUS osif_cm_set_hlp_data(struct net_device *dev,
869*5113495bSYour Name 				struct wlan_objmgr_vdev *vdev,
870*5113495bSYour Name 				struct wlan_cm_connect_resp *rsp)
871*5113495bSYour Name {
872*5113495bSYour Name 	osif_cm_set_hlp_data_cb cb = NULL;
873*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
874*5113495bSYour Name 
875*5113495bSYour Name 	if (osif_cm_legacy_ops)
876*5113495bSYour Name 		cb = osif_cm_legacy_ops->set_hlp_data_cb;
877*5113495bSYour Name 	if (cb)
878*5113495bSYour Name 		ret = cb(dev, vdev, rsp);
879*5113495bSYour Name 
880*5113495bSYour Name 	return ret;
881*5113495bSYour Name }
882*5113495bSYour Name #endif
883*5113495bSYour Name 
osif_cm_set_legacy_cb(struct osif_cm_ops * osif_legacy_ops)884*5113495bSYour Name void osif_cm_set_legacy_cb(struct osif_cm_ops *osif_legacy_ops)
885*5113495bSYour Name {
886*5113495bSYour Name 	osif_cm_legacy_ops = osif_legacy_ops;
887*5113495bSYour Name }
888*5113495bSYour Name 
osif_cm_reset_legacy_cb(void)889*5113495bSYour Name void osif_cm_reset_legacy_cb(void)
890*5113495bSYour Name {
891*5113495bSYour Name 	osif_cm_legacy_ops = NULL;
892*5113495bSYour Name }
893*5113495bSYour Name 
894*5113495bSYour Name #ifdef WLAN_BOOST_CPU_FREQ_IN_ROAM
osif_cm_perfd_set_cpufreq(bool action)895*5113495bSYour Name QDF_STATUS osif_cm_perfd_set_cpufreq(bool action)
896*5113495bSYour Name {
897*5113495bSYour Name 	os_if_cm_perfd_set_cpufreq_ctrl_cb cb = NULL;
898*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
899*5113495bSYour Name 
900*5113495bSYour Name 	if (osif_cm_legacy_ops)
901*5113495bSYour Name 		cb = osif_cm_legacy_ops->perfd_set_cpufreq_cb;
902*5113495bSYour Name 	if (cb)
903*5113495bSYour Name 		ret = cb(action);
904*5113495bSYour Name 
905*5113495bSYour Name 	return ret;
906*5113495bSYour Name }
907*5113495bSYour Name #endif
908