1f74f1ec2SArend van Spriel // SPDX-License-Identifier: ISC
2f74f1ec2SArend van Spriel /*
3f74f1ec2SArend van Spriel  * Copyright (c) 2022 Broadcom Corporation
4f74f1ec2SArend van Spriel  */
5f74f1ec2SArend van Spriel #include <linux/errno.h>
6f74f1ec2SArend van Spriel #include <linux/types.h>
7f74f1ec2SArend van Spriel #include <core.h>
8f74f1ec2SArend van Spriel #include <bus.h>
9f74f1ec2SArend van Spriel #include <fwvid.h>
108d59a64cSHector Martin #include <fwil.h>
11f74f1ec2SArend van Spriel 
12f74f1ec2SArend van Spriel #include "vops.h"
13f74f1ec2SArend van Spriel 
brcmf_cyw_set_sae_pwd(struct brcmf_if * ifp,struct cfg80211_crypto_settings * crypto)148d59a64cSHector Martin static int brcmf_cyw_set_sae_pwd(struct brcmf_if *ifp,
158d59a64cSHector Martin 				 struct cfg80211_crypto_settings *crypto)
168d59a64cSHector Martin {
178d59a64cSHector Martin 	struct brcmf_pub *drvr = ifp->drvr;
188d59a64cSHector Martin 	struct brcmf_wsec_sae_pwd_le sae_pwd;
198d59a64cSHector Martin 	u16 pwd_len = crypto->sae_pwd_len;
208d59a64cSHector Martin 	int err;
218d59a64cSHector Martin 
228d59a64cSHector Martin 	if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
238d59a64cSHector Martin 		bphy_err(drvr, "sae_password must be less than %d\n",
248d59a64cSHector Martin 			 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
258d59a64cSHector Martin 		return -EINVAL;
268d59a64cSHector Martin 	}
278d59a64cSHector Martin 
288d59a64cSHector Martin 	sae_pwd.key_len = cpu_to_le16(pwd_len);
298d59a64cSHector Martin 	memcpy(sae_pwd.key, crypto->sae_pwd, pwd_len);
308d59a64cSHector Martin 
318d59a64cSHector Martin 	err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
328d59a64cSHector Martin 				       sizeof(sae_pwd));
338d59a64cSHector Martin 	if (err < 0)
348d59a64cSHector Martin 		bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
358d59a64cSHector Martin 			 pwd_len);
368d59a64cSHector Martin 
378d59a64cSHector Martin 	return err;
388d59a64cSHector Martin }
398d59a64cSHector Martin 
40f74f1ec2SArend van Spriel const struct brcmf_fwvid_ops brcmf_cyw_ops = {
418d59a64cSHector Martin 	.set_sae_password = brcmf_cyw_set_sae_pwd,
42f74f1ec2SArend van Spriel };
43