Skip to content

Commit 87f73cb

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 e9f41e3 commit 87f73cb

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
@@ -1686,52 +1686,44 @@ static u16 brcmf_map_fw_linkdown_reason(const struct brcmf_event_msg *e)
16861686
return reason;
16871687
}
16881688

1689-
static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
1689+
static int brcmf_set_wsec(struct brcmf_if *ifp, const u8 *key, u16 key_len, u16 flags)
16901690
{
16911691
struct brcmf_pub *drvr = ifp->drvr;
16921692
struct brcmf_wsec_pmk_le pmk;
16931693
int err;
16941694

1695+
if (key_len > sizeof(pmk.key)) {
1696+
bphy_err(drvr, "key must be less than %zu bytes\n",
1697+
sizeof(pmk.key));
1698+
return -EINVAL;
1699+
}
1700+
16951701
memset(&pmk, 0, sizeof(pmk));
16961702

1697-
/* pass pmk directly */
1698-
pmk.key_len = cpu_to_le16(pmk_len);
1699-
pmk.flags = cpu_to_le16(0);
1700-
memcpy(pmk.key, pmk_data, pmk_len);
1703+
/* pass key material directly */
1704+
pmk.key_len = cpu_to_le16(key_len);
1705+
pmk.flags = cpu_to_le16(flags);
1706+
memcpy(pmk.key, key, key_len);
17011707

1702-
/* store psk in firmware */
1708+
/* store key material in firmware */
17031709
err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK,
17041710
&pmk, sizeof(pmk));
17051711
if (err < 0)
17061712
bphy_err(drvr, "failed to change PSK in firmware (len=%u)\n",
1707-
pmk_len);
1713+
key_len);
17081714

17091715
return err;
17101716
}
17111717

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

17371729
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)