xref: /wlan-driver/qca-wifi-host-cmn/target_if/crypto/src/target_if_crypto.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2019-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
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: offload lmac interface APIs definitions for crypto
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include <qdf_mem.h>
25*5113495bSYour Name #include <qdf_status.h>
26*5113495bSYour Name #include <target_if_crypto.h>
27*5113495bSYour Name #include <wmi_unified_priv.h>
28*5113495bSYour Name #include <wmi_unified_param.h>
29*5113495bSYour Name #include <wlan_objmgr_psoc_obj.h>
30*5113495bSYour Name #include <target_if.h>
31*5113495bSYour Name #include <wlan_crypto_global_def.h>
32*5113495bSYour Name #include <wlan_crypto_global_api.h>
33*5113495bSYour Name #include <wlan_objmgr_vdev_obj.h>
34*5113495bSYour Name #include <cdp_txrx_cmn_struct.h>
35*5113495bSYour Name #include <cds_api.h>
36*5113495bSYour Name #include <cdp_txrx_cmn.h>
37*5113495bSYour Name #include <wmi_unified_api.h>
38*5113495bSYour Name #include <wmi_unified_crypto_api.h>
39*5113495bSYour Name #include <cdp_txrx_peer_ops.h>
40*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
41*5113495bSYour Name #include <wlan_objmgr_peer_obj.h>
42*5113495bSYour Name #include "wlan_crypto_def_i.h"
43*5113495bSYour Name #include "wlan_crypto_obj_mgr_i.h"
44*5113495bSYour Name 
45*5113495bSYour Name #ifdef FEATURE_WLAN_WAPI
46*5113495bSYour Name #ifdef FEATURE_WAPI_BIG_ENDIAN
47*5113495bSYour Name /*
48*5113495bSYour Name  * All lithium firmware expects WAPI in big endian
49*5113495bSYour Name  * format , whereas helium firmware's expect otherwise
50*5113495bSYour Name  */
51*5113495bSYour Name 
wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev * vdev,bool pairwise,enum wlan_crypto_cipher_type cipher_type,struct set_key_params * params)52*5113495bSYour Name static void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
53*5113495bSYour Name 				     bool pairwise,
54*5113495bSYour Name 				     enum wlan_crypto_cipher_type cipher_type,
55*5113495bSYour Name 				     struct set_key_params *params)
56*5113495bSYour Name {
57*5113495bSYour Name 	static const unsigned char tx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
58*5113495bSYour Name 						0x36, 0x5c, 0x36, 0x5c, 0x36,
59*5113495bSYour Name 						0x5c, 0x36, 0x5c, 0x36, 0x5c,
60*5113495bSYour Name 						0x36};
61*5113495bSYour Name 
62*5113495bSYour Name 	static const unsigned char rx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
63*5113495bSYour Name 						0x36, 0x5c, 0x36, 0x5c, 0x36,
64*5113495bSYour Name 						0x5c, 0x36, 0x5c, 0x36, 0x5c,
65*5113495bSYour Name 						0x37};
66*5113495bSYour Name 
67*5113495bSYour Name 	if (cipher_type != WLAN_CRYPTO_CIPHER_WAPI_SMS4 &&
68*5113495bSYour Name 	    cipher_type != WLAN_CRYPTO_CIPHER_WAPI_GCM4)
69*5113495bSYour Name 		return;
70*5113495bSYour Name 
71*5113495bSYour Name 	if (vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE ||
72*5113495bSYour Name 	    vdev->vdev_mlme.vdev_opmode == QDF_P2P_GO_MODE) {
73*5113495bSYour Name 			qdf_mem_copy(&params->rx_iv, &tx_iv,
74*5113495bSYour Name 					 WLAN_CRYPTO_WAPI_IV_SIZE);
75*5113495bSYour Name 			qdf_mem_copy(params->tx_iv, &rx_iv,
76*5113495bSYour Name 					 WLAN_CRYPTO_WAPI_IV_SIZE);
77*5113495bSYour Name 	} else {
78*5113495bSYour Name 			qdf_mem_copy(params->rx_iv, &rx_iv,
79*5113495bSYour Name 					 WLAN_CRYPTO_WAPI_IV_SIZE);
80*5113495bSYour Name 			qdf_mem_copy(params->tx_iv, &tx_iv,
81*5113495bSYour Name 					 WLAN_CRYPTO_WAPI_IV_SIZE);
82*5113495bSYour Name 		}
83*5113495bSYour Name 
84*5113495bSYour Name 	params->key_txmic_len = WLAN_CRYPTO_MIC_LEN;
85*5113495bSYour Name 	params->key_rxmic_len = WLAN_CRYPTO_MIC_LEN;
86*5113495bSYour Name }
87*5113495bSYour Name #else
wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev * vdev,bool pairwise,enum wlan_crypto_cipher_type cipher_type,struct set_key_params * params)88*5113495bSYour Name static void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
89*5113495bSYour Name 				     bool pairwise,
90*5113495bSYour Name 				     enum wlan_crypto_cipher_type cipher_type,
91*5113495bSYour Name 				     struct set_key_params *params)
92*5113495bSYour Name {
93*5113495bSYour Name 	static const unsigned char tx_iv[16] = {0x36, 0x5c, 0x36, 0x5c, 0x36,
94*5113495bSYour Name 						0x5c, 0x36, 0x5c, 0x36, 0x5c,
95*5113495bSYour Name 						0x36, 0x5c, 0x36, 0x5c, 0x36,
96*5113495bSYour Name 						0x5c};
97*5113495bSYour Name 
98*5113495bSYour Name 	static const unsigned char rx_iv[16] = {0x5c, 0x36, 0x5c, 0x36, 0x5c,
99*5113495bSYour Name 						0x36, 0x5c, 0x36, 0x5c, 0x36,
100*5113495bSYour Name 						0x5c, 0x36, 0x5c, 0x36, 0x5c,
101*5113495bSYour Name 						0x37};
102*5113495bSYour Name 
103*5113495bSYour Name 	if (cipher_type != WLAN_CRYPTO_CIPHER_WAPI_SMS4 &&
104*5113495bSYour Name 	    cipher_type != WLAN_CRYPTO_CIPHER_WAPI_GCM4)
105*5113495bSYour Name 		return;
106*5113495bSYour Name 
107*5113495bSYour Name 	qdf_mem_copy(&params->rx_iv, &rx_iv,
108*5113495bSYour Name 		     WLAN_CRYPTO_WAPI_IV_SIZE);
109*5113495bSYour Name 	qdf_mem_copy(&params->tx_iv, &tx_iv,
110*5113495bSYour Name 		     WLAN_CRYPTO_WAPI_IV_SIZE);
111*5113495bSYour Name 
112*5113495bSYour Name 	if (vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE) {
113*5113495bSYour Name 		if (pairwise)
114*5113495bSYour Name 			params->tx_iv[0] = 0x37;
115*5113495bSYour Name 
116*5113495bSYour Name 		params->rx_iv[WLAN_CRYPTO_WAPI_IV_SIZE - 1] = 0x36;
117*5113495bSYour Name 	} else {
118*5113495bSYour Name 		if (!pairwise)
119*5113495bSYour Name 			params->rx_iv[WLAN_CRYPTO_WAPI_IV_SIZE - 1] = 0x36;
120*5113495bSYour Name 	}
121*5113495bSYour Name 
122*5113495bSYour Name 	params->key_txmic_len = WLAN_CRYPTO_MIC_LEN;
123*5113495bSYour Name 	params->key_rxmic_len = WLAN_CRYPTO_MIC_LEN;
124*5113495bSYour Name }
125*5113495bSYour Name #endif /* FEATURE_WAPI_BIG_ENDIAN */
126*5113495bSYour Name #else
wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev * vdev,bool pairwise,enum wlan_crypto_cipher_type cipher,struct set_key_params * params)127*5113495bSYour Name static inline void wlan_crypto_set_wapi_key(struct wlan_objmgr_vdev *vdev,
128*5113495bSYour Name 					    bool pairwise,
129*5113495bSYour Name 					    enum wlan_crypto_cipher_type cipher,
130*5113495bSYour Name 					    struct set_key_params *params)
131*5113495bSYour Name {
132*5113495bSYour Name }
133*5113495bSYour Name #endif /* FEATURE_WLAN_WAPI */
134*5113495bSYour Name 
135*5113495bSYour Name QDF_STATUS
target_if_crypto_vdev_set_param(struct wlan_objmgr_psoc * psoc,uint32_t vdev_id,uint32_t param_id,uint32_t param_value)136*5113495bSYour Name target_if_crypto_vdev_set_param(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id,
137*5113495bSYour Name 				uint32_t param_id, uint32_t param_value)
138*5113495bSYour Name {
139*5113495bSYour Name 	wmi_unified_t wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
140*5113495bSYour Name 	struct vdev_set_params param = {0};
141*5113495bSYour Name 
142*5113495bSYour Name 	if (!wmi_handle) {
143*5113495bSYour Name 		target_if_err("Invalid wmi handle");
144*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
145*5113495bSYour Name 	}
146*5113495bSYour Name 
147*5113495bSYour Name 	if (vdev_id >= WLAN_MAX_VDEVS) {
148*5113495bSYour Name 		target_if_err("vdev_id: %d is invalid, reject the req: param id %d val %d",
149*5113495bSYour Name 			      vdev_id, param_id, param_value);
150*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
151*5113495bSYour Name 	}
152*5113495bSYour Name 
153*5113495bSYour Name 	param.vdev_id = vdev_id;
154*5113495bSYour Name 	param.param_id = param_id;
155*5113495bSYour Name 	param.param_value = param_value;
156*5113495bSYour Name 
157*5113495bSYour Name 	return wmi_unified_vdev_set_param_send(wmi_handle, &param);
158*5113495bSYour Name }
159*5113495bSYour Name 
target_if_crypto_set_key(struct wlan_objmgr_vdev * vdev,struct wlan_crypto_key * req,enum wlan_crypto_key_type key_type)160*5113495bSYour Name QDF_STATUS target_if_crypto_set_key(struct wlan_objmgr_vdev *vdev,
161*5113495bSYour Name 				    struct wlan_crypto_key *req,
162*5113495bSYour Name 				    enum wlan_crypto_key_type key_type)
163*5113495bSYour Name {
164*5113495bSYour Name 	struct set_key_params params = {0};
165*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
166*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
167*5113495bSYour Name 	struct wlan_objmgr_peer *peer;
168*5113495bSYour Name 	enum cdp_sec_type sec_type = cdp_sec_type_none;
169*5113495bSYour Name 	enum wlan_peer_type peer_type = 0;
170*5113495bSYour Name 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
171*5113495bSYour Name 	uint32_t pn[4] = {0, 0, 0, 0};
172*5113495bSYour Name 	bool peer_exist = false;
173*5113495bSYour Name 	uint8_t def_tx_idx;
174*5113495bSYour Name 	wmi_unified_t pdev_wmi_handle;
175*5113495bSYour Name 	bool pairwise;
176*5113495bSYour Name 	QDF_STATUS status;
177*5113495bSYour Name 
178*5113495bSYour Name 	pdev = wlan_vdev_get_pdev(vdev);
179*5113495bSYour Name 	if (!pdev) {
180*5113495bSYour Name 		target_if_err("Invalid PDEV");
181*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
182*5113495bSYour Name 	}
183*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
184*5113495bSYour Name 	if (!psoc) {
185*5113495bSYour Name 		target_if_err("Invalid PSOC");
186*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
187*5113495bSYour Name 	}
188*5113495bSYour Name 	soc = wlan_psoc_get_dp_handle(psoc);
189*5113495bSYour Name 	if (!soc) {
190*5113495bSYour Name 		target_if_err("Invalid DP Handle");
191*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
192*5113495bSYour Name 	}
193*5113495bSYour Name 	params.vdev_id = wlan_vdev_get_id(vdev);
194*5113495bSYour Name 	params.key_idx = req->keyix;
195*5113495bSYour Name 	qdf_mem_copy(params.peer_mac, req->macaddr, QDF_MAC_ADDR_SIZE);
196*5113495bSYour Name 	pdev_wmi_handle = GET_WMI_HDL_FROM_PDEV(pdev);
197*5113495bSYour Name 	if (!pdev_wmi_handle) {
198*5113495bSYour Name 		target_if_err("Invalid PDEV WMI handle");
199*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
200*5113495bSYour Name 	}
201*5113495bSYour Name 
202*5113495bSYour Name 	params.key_flags = req->flags;
203*5113495bSYour Name 	if (key_type != WLAN_CRYPTO_KEY_TYPE_UNICAST) {
204*5113495bSYour Name 		pairwise = false;
205*5113495bSYour Name 		params.key_flags |= GROUP_USAGE;
206*5113495bSYour Name 
207*5113495bSYour Name 	} else {
208*5113495bSYour Name 		pairwise = true;
209*5113495bSYour Name 		params.key_flags |= PAIRWISE_USAGE;
210*5113495bSYour Name 	}
211*5113495bSYour Name 	qdf_mem_copy(&params.key_rsc_counter,
212*5113495bSYour Name 		     &req->keyrsc[0], sizeof(uint64_t));
213*5113495bSYour Name 
214*5113495bSYour Name 	target_if_debug("key_type %d, mac: " QDF_MAC_ADDR_FMT,
215*5113495bSYour Name 			key_type, QDF_MAC_ADDR_REF(req->macaddr));
216*5113495bSYour Name 
217*5113495bSYour Name 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NAN_DISC_MODE) {
218*5113495bSYour Name 		peer_exist = cdp_find_peer_exist(soc,
219*5113495bSYour Name 						 pdev->pdev_objmgr.wlan_pdev_id,
220*5113495bSYour Name 						 req->macaddr);
221*5113495bSYour Name 
222*5113495bSYour Name 		peer = wlan_objmgr_get_peer_by_mac(psoc, req->macaddr,
223*5113495bSYour Name 						   WLAN_CRYPTO_ID);
224*5113495bSYour Name 		if (peer) {
225*5113495bSYour Name 			peer_type = wlan_peer_get_peer_type(peer);
226*5113495bSYour Name 			if (peer_type == WLAN_PEER_RTT_PASN &&
227*5113495bSYour Name 			    key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST)
228*5113495bSYour Name 				peer_exist = true;
229*5113495bSYour Name 
230*5113495bSYour Name 			wlan_objmgr_peer_release_ref(peer, WLAN_CRYPTO_ID);
231*5113495bSYour Name 		}
232*5113495bSYour Name 
233*5113495bSYour Name 		if ((key_type == WLAN_CRYPTO_KEY_TYPE_UNICAST) && !peer_exist) {
234*5113495bSYour Name 			target_if_err("Invalid peer");
235*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
236*5113495bSYour Name 		}
237*5113495bSYour Name 	}
238*5113495bSYour Name 
239*5113495bSYour Name 	params.key_cipher = wlan_crypto_cipher_to_wmi_cipher(req->cipher_type);
240*5113495bSYour Name 	sec_type = wlan_crypto_cipher_to_cdp_sec_type(req->cipher_type);
241*5113495bSYour Name 	wlan_crypto_set_wapi_key(vdev, pairwise, req->cipher_type, &params);
242*5113495bSYour Name 
243*5113495bSYour Name 	switch (req->cipher_type) {
244*5113495bSYour Name 	case WLAN_CRYPTO_CIPHER_WEP:
245*5113495bSYour Name 	case WLAN_CRYPTO_CIPHER_WEP_40:
246*5113495bSYour Name 	case WLAN_CRYPTO_CIPHER_WEP_104:
247*5113495bSYour Name 		def_tx_idx = wlan_crypto_get_default_key_idx(vdev, false);
248*5113495bSYour Name 		if (pairwise && params.key_idx == def_tx_idx)
249*5113495bSYour Name 			params.key_flags |= TX_USAGE;
250*5113495bSYour Name 		else if ((vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE) &&
251*5113495bSYour Name 			 (params.key_idx == def_tx_idx))
252*5113495bSYour Name 			params.key_flags |= TX_USAGE;
253*5113495bSYour Name 		break;
254*5113495bSYour Name 	case WLAN_CRYPTO_CIPHER_TKIP:
255*5113495bSYour Name 		params.key_txmic_len = WLAN_CRYPTO_MIC_LEN;
256*5113495bSYour Name 		params.key_rxmic_len = WLAN_CRYPTO_MIC_LEN;
257*5113495bSYour Name 		break;
258*5113495bSYour Name 	default:
259*5113495bSYour Name 		break;
260*5113495bSYour Name 	}
261*5113495bSYour Name 
262*5113495bSYour Name 	qdf_mem_copy(&params.key_data[0], &req->keyval[0], req->keylen);
263*5113495bSYour Name 	params.key_len = req->keylen;
264*5113495bSYour Name 
265*5113495bSYour Name 	/* Set PN check & security type in data path */
266*5113495bSYour Name 	qdf_mem_copy(&pn[0], &params.key_rsc_counter, sizeof(uint64_t));
267*5113495bSYour Name 
268*5113495bSYour Name 	if (peer_type == WLAN_PEER_RTT_PASN)
269*5113495bSYour Name 		goto send_install_key;
270*5113495bSYour Name 
271*5113495bSYour Name 	cdp_set_pn_check(soc, vdev->vdev_objmgr.vdev_id, req->macaddr,
272*5113495bSYour Name 			 sec_type, pn);
273*5113495bSYour Name 
274*5113495bSYour Name 	cdp_set_key_sec_type(soc, vdev->vdev_objmgr.vdev_id, req->macaddr,
275*5113495bSYour Name 			     sec_type, pairwise);
276*5113495bSYour Name 
277*5113495bSYour Name 	cdp_set_key(soc, vdev->vdev_objmgr.vdev_id, req->macaddr, pairwise,
278*5113495bSYour Name 		    (uint32_t *)(req->keyval + WLAN_CRYPTO_IV_SIZE +
279*5113495bSYour Name 		     WLAN_CRYPTO_MIC_LEN));
280*5113495bSYour Name send_install_key:
281*5113495bSYour Name 	target_if_debug("vdev_id:%d, key: idx:%d,len:%d", params.vdev_id,
282*5113495bSYour Name 			params.key_idx, params.key_len);
283*5113495bSYour Name 	target_if_debug("peer mac "QDF_MAC_ADDR_FMT,
284*5113495bSYour Name 			QDF_MAC_ADDR_REF(params.peer_mac));
285*5113495bSYour Name 	QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_CRYPTO, QDF_TRACE_LEVEL_DEBUG,
286*5113495bSYour Name 			   &params.key_rsc_counter, sizeof(uint64_t));
287*5113495bSYour Name 	status = wmi_unified_setup_install_key_cmd(pdev_wmi_handle, &params);
288*5113495bSYour Name 
289*5113495bSYour Name 	/* Zero-out local key variables */
290*5113495bSYour Name 	qdf_mem_zero(&params, sizeof(struct set_key_params));
291*5113495bSYour Name 
292*5113495bSYour Name 	return status;
293*5113495bSYour Name }
294*5113495bSYour Name 
295*5113495bSYour Name /**
296*5113495bSYour Name  * target_if_crypto_install_key_comp_evt_handler() - install key complete
297*5113495bSYour Name  *   handler
298*5113495bSYour Name  * @handle: wma handle
299*5113495bSYour Name  * @event: event data
300*5113495bSYour Name  * @len: data length
301*5113495bSYour Name  *
302*5113495bSYour Name  * This event is sent by fw once WPA/WPA2 keys are installed in fw.
303*5113495bSYour Name  *
304*5113495bSYour Name  * Return: 0 for success or error code
305*5113495bSYour Name  */
306*5113495bSYour Name static int
target_if_crypto_install_key_comp_evt_handler(void * handle,uint8_t * event,uint32_t len)307*5113495bSYour Name target_if_crypto_install_key_comp_evt_handler(void *handle, uint8_t *event,
308*5113495bSYour Name 					      uint32_t len)
309*5113495bSYour Name {
310*5113495bSYour Name 	struct wlan_crypto_comp_priv *priv_obj;
311*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
312*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
313*5113495bSYour Name 	struct wmi_install_key_comp_event params;
314*5113495bSYour Name 	QDF_STATUS status;
315*5113495bSYour Name 	wmi_unified_t wmi_handle;
316*5113495bSYour Name 	struct crypto_add_key_result result;
317*5113495bSYour Name 
318*5113495bSYour Name 	if (!event || !handle) {
319*5113495bSYour Name 		target_if_err("invalid param");
320*5113495bSYour Name 		return -EINVAL;
321*5113495bSYour Name 	}
322*5113495bSYour Name 
323*5113495bSYour Name 	psoc = target_if_get_psoc_from_scn_hdl(handle);
324*5113495bSYour Name 	if (!psoc) {
325*5113495bSYour Name 		target_if_err("psoc is null");
326*5113495bSYour Name 		return -EINVAL;
327*5113495bSYour Name 	}
328*5113495bSYour Name 
329*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
330*5113495bSYour Name 	if (!wmi_handle) {
331*5113495bSYour Name 		target_if_err("invalid wmi handle");
332*5113495bSYour Name 		return -EINVAL;
333*5113495bSYour Name 	}
334*5113495bSYour Name 
335*5113495bSYour Name 	status = wmi_extract_install_key_comp_event(wmi_handle, event,
336*5113495bSYour Name 						    len, &params);
337*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
338*5113495bSYour Name 		target_if_err("received invalid buf from target");
339*5113495bSYour Name 		return -EINVAL;
340*5113495bSYour Name 	}
341*5113495bSYour Name 
342*5113495bSYour Name 	target_if_debug("vdev %d mac " QDF_MAC_ADDR_FMT " ix %x flags %x status %d",
343*5113495bSYour Name 			params.vdev_id,
344*5113495bSYour Name 			QDF_MAC_ADDR_REF(params.peer_macaddr),
345*5113495bSYour Name 			params.key_ix, params.key_flags, params.status);
346*5113495bSYour Name 
347*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, params.vdev_id,
348*5113495bSYour Name 						    WLAN_CRYPTO_ID);
349*5113495bSYour Name 	if (!vdev) {
350*5113495bSYour Name 		target_if_err("vdev %d is null", params.vdev_id);
351*5113495bSYour Name 		return -EINVAL;
352*5113495bSYour Name 	}
353*5113495bSYour Name 
354*5113495bSYour Name 	priv_obj = wlan_get_vdev_crypto_obj(vdev);
355*5113495bSYour Name 	if (!priv_obj) {
356*5113495bSYour Name 		target_if_err("priv_obj is null");
357*5113495bSYour Name 		wlan_objmgr_vdev_release_ref(vdev, WLAN_CRYPTO_ID);
358*5113495bSYour Name 		return -EINVAL;
359*5113495bSYour Name 	}
360*5113495bSYour Name 
361*5113495bSYour Name 	result.vdev_id = params.vdev_id;
362*5113495bSYour Name 	result.key_ix = params.key_ix;
363*5113495bSYour Name 	result.key_flags = params.key_flags;
364*5113495bSYour Name 	result.status = params.status;
365*5113495bSYour Name 	qdf_mem_copy(result.peer_macaddr, params.peer_macaddr,
366*5113495bSYour Name 		     QDF_MAC_ADDR_SIZE);
367*5113495bSYour Name 
368*5113495bSYour Name 	if (priv_obj->add_key_cb)
369*5113495bSYour Name 		priv_obj->add_key_cb(priv_obj->add_key_ctx, &result);
370*5113495bSYour Name 
371*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_CRYPTO_ID);
372*5113495bSYour Name 
373*5113495bSYour Name 	return 0;
374*5113495bSYour Name }
375*5113495bSYour Name 
376*5113495bSYour Name static QDF_STATUS
target_if_crypto_register_events(struct wlan_objmgr_psoc * psoc)377*5113495bSYour Name target_if_crypto_register_events(struct wlan_objmgr_psoc *psoc)
378*5113495bSYour Name {
379*5113495bSYour Name 	QDF_STATUS status;
380*5113495bSYour Name 
381*5113495bSYour Name 	if (!psoc || !GET_WMI_HDL_FROM_PSOC(psoc)) {
382*5113495bSYour Name 		target_if_err("psoc or psoc->tgt_if_handle is null");
383*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
384*5113495bSYour Name 	}
385*5113495bSYour Name 
386*5113495bSYour Name 	status = wmi_unified_register_event_handler(
387*5113495bSYour Name 			get_wmi_unified_hdl_from_psoc(psoc),
388*5113495bSYour Name 			wmi_vdev_install_key_complete_event_id,
389*5113495bSYour Name 			target_if_crypto_install_key_comp_evt_handler,
390*5113495bSYour Name 			WMI_RX_WORK_CTX);
391*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
392*5113495bSYour Name 		target_if_err("register_event_handler failed: err %d", status);
393*5113495bSYour Name 		return status;
394*5113495bSYour Name 	}
395*5113495bSYour Name 
396*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
397*5113495bSYour Name }
398*5113495bSYour Name 
399*5113495bSYour Name static QDF_STATUS
target_if_crypto_deregister_events(struct wlan_objmgr_psoc * psoc)400*5113495bSYour Name target_if_crypto_deregister_events(struct wlan_objmgr_psoc *psoc)
401*5113495bSYour Name {
402*5113495bSYour Name 	if (!psoc || !GET_WMI_HDL_FROM_PSOC(psoc)) {
403*5113495bSYour Name 		target_if_err("psoc or psoc->tgt_if_handle is null");
404*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
405*5113495bSYour Name 	}
406*5113495bSYour Name 
407*5113495bSYour Name 	wmi_unified_unregister_event_handler(
408*5113495bSYour Name 			get_wmi_unified_hdl_from_psoc(psoc),
409*5113495bSYour Name 			wmi_vdev_install_key_complete_event_id);
410*5113495bSYour Name 
411*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
412*5113495bSYour Name }
413*5113495bSYour Name 
414*5113495bSYour Name static QDF_STATUS
target_if_crypto_set_ltf_keyseed(struct wlan_objmgr_psoc * psoc,struct wlan_crypto_ltf_keyseed_data * data)415*5113495bSYour Name target_if_crypto_set_ltf_keyseed(struct wlan_objmgr_psoc *psoc,
416*5113495bSYour Name 				 struct wlan_crypto_ltf_keyseed_data *data)
417*5113495bSYour Name {
418*5113495bSYour Name 	QDF_STATUS status;
419*5113495bSYour Name 	wmi_unified_t wmi = GET_WMI_HDL_FROM_PSOC(psoc);
420*5113495bSYour Name 
421*5113495bSYour Name 	if (!psoc || !wmi) {
422*5113495bSYour Name 		target_if_err("%s is null", !psoc ? "psoc" : "wmi_handle");
423*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
424*5113495bSYour Name 	}
425*5113495bSYour Name 
426*5113495bSYour Name 	status = wmi_send_vdev_set_ltf_key_seed_cmd(wmi, data);
427*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
428*5113495bSYour Name 		target_if_err("set LTF keyseed failed");
429*5113495bSYour Name 
430*5113495bSYour Name 	return status;
431*5113495bSYour Name }
432*5113495bSYour Name 
target_if_crypto_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)433*5113495bSYour Name QDF_STATUS target_if_crypto_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
434*5113495bSYour Name {
435*5113495bSYour Name 	struct wlan_lmac_if_crypto_tx_ops *crypto;
436*5113495bSYour Name 
437*5113495bSYour Name 	if (!tx_ops) {
438*5113495bSYour Name 		target_if_err("txops NULL");
439*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
440*5113495bSYour Name 	}
441*5113495bSYour Name 	crypto = &tx_ops->crypto_tx_ops;
442*5113495bSYour Name 
443*5113495bSYour Name 	crypto->set_key = target_if_crypto_set_key;
444*5113495bSYour Name 	crypto->set_ltf_keyseed = target_if_crypto_set_ltf_keyseed;
445*5113495bSYour Name 	crypto->set_vdev_param  = target_if_crypto_vdev_set_param;
446*5113495bSYour Name 	crypto->register_events = target_if_crypto_register_events;
447*5113495bSYour Name 	crypto->deregister_events = target_if_crypto_deregister_events;
448*5113495bSYour Name 
449*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
450*5113495bSYour Name }
451*5113495bSYour Name 
452