1// SPDX-License-Identifier: ISC 2/* 3 * Copyright (c) 2022 Broadcom Corporation 4 */ 5#include <linux/errno.h> 6#include <linux/types.h> 7#include <core.h> 8#include <bus.h> 9#include <fwvid.h> 10#include <fwil.h> 11 12#include "vops.h" 13 14#define BRCMF_CYW_E_LAST 197 15 16static int brcmf_cyw_set_sae_pwd(struct brcmf_if *ifp, 17 struct cfg80211_crypto_settings *crypto) 18{ 19 struct brcmf_pub *drvr = ifp->drvr; 20 struct brcmf_wsec_sae_pwd_le sae_pwd; 21 u16 pwd_len = crypto->sae_pwd_len; 22 int err; 23 24 if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) { 25 bphy_err(drvr, "sae_password must be less than %d\n", 26 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN); 27 return -EINVAL; 28 } 29 30 sae_pwd.key_len = cpu_to_le16(pwd_len); 31 memcpy(sae_pwd.key, crypto->sae_pwd, pwd_len); 32 33 err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd, 34 sizeof(sae_pwd)); 35 if (err < 0) 36 bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n", 37 pwd_len); 38 39 return err; 40} 41 42static int brcmf_cyw_alloc_fweh_info(struct brcmf_pub *drvr) 43{ 44 struct brcmf_fweh_info *fweh; 45 46 fweh = kzalloc(struct_size(fweh, evt_handler, BRCMF_CYW_E_LAST), 47 GFP_KERNEL); 48 if (!fweh) 49 return -ENOMEM; 50 51 fweh->num_event_codes = BRCMF_CYW_E_LAST; 52 drvr->fweh = fweh; 53 return 0; 54} 55 56const struct brcmf_fwvid_ops brcmf_cyw_ops = { 57 .set_sae_password = brcmf_cyw_set_sae_pwd, 58 .alloc_fweh_info = brcmf_cyw_alloc_fweh_info, 59}; 60