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 
14f74f1ec2SArend van Spriel static int brcmf_cyw_attach(struct brcmf_pub *drvr)
15f74f1ec2SArend van Spriel {
16f74f1ec2SArend van Spriel 	pr_err("%s: executing\n", __func__);
17f74f1ec2SArend van Spriel 	return 0;
18f74f1ec2SArend van Spriel }
19f74f1ec2SArend van Spriel 
20f74f1ec2SArend van Spriel static void brcmf_cyw_detach(struct brcmf_pub *drvr)
21f74f1ec2SArend van Spriel {
22f74f1ec2SArend van Spriel 	pr_err("%s: executing\n", __func__);
23f74f1ec2SArend van Spriel }
24f74f1ec2SArend van Spriel 
258d59a64cSHector Martin static int brcmf_cyw_set_sae_pwd(struct brcmf_if *ifp,
268d59a64cSHector Martin 				 struct cfg80211_crypto_settings *crypto)
278d59a64cSHector Martin {
288d59a64cSHector Martin 	struct brcmf_pub *drvr = ifp->drvr;
298d59a64cSHector Martin 	struct brcmf_wsec_sae_pwd_le sae_pwd;
308d59a64cSHector Martin 	u16 pwd_len = crypto->sae_pwd_len;
318d59a64cSHector Martin 	int err;
328d59a64cSHector Martin 
338d59a64cSHector Martin 	if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
348d59a64cSHector Martin 		bphy_err(drvr, "sae_password must be less than %d\n",
358d59a64cSHector Martin 			 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
368d59a64cSHector Martin 		return -EINVAL;
378d59a64cSHector Martin 	}
388d59a64cSHector Martin 
398d59a64cSHector Martin 	sae_pwd.key_len = cpu_to_le16(pwd_len);
408d59a64cSHector Martin 	memcpy(sae_pwd.key, crypto->sae_pwd, pwd_len);
418d59a64cSHector Martin 
428d59a64cSHector Martin 	err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
438d59a64cSHector Martin 				       sizeof(sae_pwd));
448d59a64cSHector Martin 	if (err < 0)
458d59a64cSHector Martin 		bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
468d59a64cSHector Martin 			 pwd_len);
478d59a64cSHector Martin 
488d59a64cSHector Martin 	return err;
498d59a64cSHector Martin }
508d59a64cSHector Martin 
51f74f1ec2SArend van Spriel const struct brcmf_fwvid_ops brcmf_cyw_ops = {
52f74f1ec2SArend van Spriel 	.attach = brcmf_cyw_attach,
53f74f1ec2SArend van Spriel 	.detach = brcmf_cyw_detach,
548d59a64cSHector Martin 	.set_sae_password = brcmf_cyw_set_sae_pwd,
55f74f1ec2SArend van Spriel };
56