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