Skip to content

Commit 0fb34d2

Browse files
committed
brcmflac: cfg80211: Use WSEC to set SAE password
Using the WSEC command instead of sae_password seems to be the supported mechanism on newer firmware, and also how the brcmdhd driver does it. Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent 6995e2d commit 0fb34d2

2 files changed

Lines changed: 20 additions & 28 deletions

File tree

drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,52 +1682,44 @@ static u16 brcmf_map_fw_linkdown_reason(const struct brcmf_event_msg *e)
16821682
return reason;
16831683
}
16841684

1685-
static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
1685+
static int brcmf_set_wsec(struct brcmf_if *ifp, const u8 *key, u16 key_len, u16 flags)
16861686
{
16871687
struct brcmf_pub *drvr = ifp->drvr;
16881688
struct brcmf_wsec_pmk_le pmk;
16891689
int err;
16901690

1691+
if (key_len > sizeof(pmk.key)) {
1692+
bphy_err(drvr, "key must be less than %zu bytes\n",
1693+
sizeof(pmk.key));
1694+
return -EINVAL;
1695+
}
1696+
16911697
memset(&pmk, 0, sizeof(pmk));
16921698

1693-
/* pass pmk directly */
1694-
pmk.key_len = cpu_to_le16(pmk_len);
1695-
pmk.flags = cpu_to_le16(0);
1696-
memcpy(pmk.key, pmk_data, pmk_len);
1699+
/* pass key material directly */
1700+
pmk.key_len = cpu_to_le16(key_len);
1701+
pmk.flags = cpu_to_le16(flags);
1702+
memcpy(pmk.key, key, key_len);
16971703

1698-
/* store psk in firmware */
1704+
/* store key material in firmware */
16991705
err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK,
17001706
&pmk, sizeof(pmk));
17011707
if (err < 0)
17021708
bphy_err(drvr, "failed to change PSK in firmware (len=%u)\n",
1703-
pmk_len);
1709+
key_len);
17041710

17051711
return err;
17061712
}
17071713

1714+
static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
1715+
{
1716+
return brcmf_set_wsec(ifp, pmk_data, pmk_len, 0);
1717+
}
1718+
17081719
static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data,
17091720
u16 pwd_len)
17101721
{
1711-
struct brcmf_pub *drvr = ifp->drvr;
1712-
struct brcmf_wsec_sae_pwd_le sae_pwd;
1713-
int err;
1714-
1715-
if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
1716-
bphy_err(drvr, "sae_password must be less than %d\n",
1717-
BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
1718-
return -EINVAL;
1719-
}
1720-
1721-
sae_pwd.key_len = cpu_to_le16(pwd_len);
1722-
memcpy(sae_pwd.key, pwd_data, pwd_len);
1723-
1724-
err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
1725-
sizeof(sae_pwd));
1726-
if (err < 0)
1727-
bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
1728-
pwd_len);
1729-
1730-
return err;
1722+
return brcmf_set_wsec(ifp, pwd_data, pwd_len, BRCMF_WSEC_PASSPHRASE);
17311723
}
17321724

17331725
static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason,

drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ struct brcmf_wsec_key_le {
574574
struct brcmf_wsec_pmk_le {
575575
__le16 key_len;
576576
__le16 flags;
577-
u8 key[2 * BRCMF_WSEC_MAX_PSK_LEN + 1];
577+
u8 key[BRCMF_WSEC_MAX_SAE_PASSWORD_LEN];
578578
};
579579

580580
/**

0 commit comments

Comments
 (0)