mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-07-28 09:36:58 +08:00
139 lines
4.2 KiB
Diff
139 lines
4.2 KiB
Diff
From 219660e563a04cd417b918fcda232433acbea543 Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Mon, 20 Dec 2021 18:15:10 +0900
|
|
Subject: [PATCH 105/171] brcmfmac: feature: Add support for setting feats
|
|
based on WLC version
|
|
|
|
The "wlc_ver" iovar returns information on the WLC and EPI versions.
|
|
This can be used to determine whether the PMKID_V2 and _V3 features are
|
|
supported.
|
|
|
|
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
|
Signed-off-by: Hector Martin <marcan@marcan.st>
|
|
---
|
|
.../broadcom/brcm80211/brcmfmac/feature.c | 48 +++++++++++++++++++
|
|
.../broadcom/brcm80211/brcmfmac/feature.h | 4 +-
|
|
.../broadcom/brcm80211/brcmfmac/fwil_types.h | 25 ++++++++++
|
|
3 files changed, 76 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
|
index 19df83399a45..ac873677343c 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
|
@@ -126,6 +126,53 @@ static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv)
|
|
drv->feat_flags |= feat_flags;
|
|
}
|
|
|
|
+struct brcmf_feat_wlcfeat {
|
|
+ u16 min_ver_major;
|
|
+ u16 min_ver_minor;
|
|
+ u32 feat_flags;
|
|
+};
|
|
+
|
|
+static const struct brcmf_feat_wlcfeat brcmf_feat_wlcfeat_map[] = {
|
|
+ { 12, 0, BIT(BRCMF_FEAT_PMKID_V2) },
|
|
+ { 13, 0, BIT(BRCMF_FEAT_PMKID_V3) },
|
|
+};
|
|
+
|
|
+static void brcmf_feat_wlc_version_overrides(struct brcmf_pub *drv)
|
|
+{
|
|
+ struct brcmf_if *ifp = brcmf_get_ifp(drv, 0);
|
|
+ const struct brcmf_feat_wlcfeat *e;
|
|
+ struct brcmf_wlc_version_le ver;
|
|
+ u32 feat_flags = 0;
|
|
+ int i, err, major, minor;
|
|
+
|
|
+ err = brcmf_fil_iovar_data_get(ifp, "wlc_ver", &ver, sizeof(ver));
|
|
+ if (err)
|
|
+ return;
|
|
+
|
|
+ major = le16_to_cpu(ver.wlc_ver_major);
|
|
+ minor = le16_to_cpu(ver.wlc_ver_minor);
|
|
+
|
|
+ brcmf_dbg(INFO, "WLC version: %d.%d\n", major, minor);
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE(brcmf_feat_wlcfeat_map); i++) {
|
|
+ e = &brcmf_feat_wlcfeat_map[i];
|
|
+ if (major > e->min_ver_major ||
|
|
+ (major == e->min_ver_major &&
|
|
+ minor >= e->min_ver_minor)) {
|
|
+ feat_flags |= e->feat_flags;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!feat_flags)
|
|
+ return;
|
|
+
|
|
+ for (i = 0; i < BRCMF_FEAT_LAST; i++)
|
|
+ if (feat_flags & BIT(i))
|
|
+ brcmf_dbg(INFO, "enabling firmware feature: %s\n",
|
|
+ brcmf_feat_names[i]);
|
|
+ drv->feat_flags |= feat_flags;
|
|
+}
|
|
+
|
|
/**
|
|
* brcmf_feat_iovar_int_get() - determine feature through iovar query.
|
|
*
|
|
@@ -297,6 +344,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
|
|
ifp->drvr->feat_flags &= ~drvr->settings->feature_disable;
|
|
}
|
|
|
|
+ brcmf_feat_wlc_version_overrides(drvr);
|
|
brcmf_feat_firmware_overrides(drvr);
|
|
|
|
/* set chip related quirks */
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
|
index 9d098a068d13..becbcc50d57a 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
|
|
@@ -53,7 +53,9 @@
|
|
BRCMF_FEAT_DEF(DOT11H) \
|
|
BRCMF_FEAT_DEF(SAE) \
|
|
BRCMF_FEAT_DEF(FWAUTH) \
|
|
- BRCMF_FEAT_DEF(SCAN_V2)
|
|
+ BRCMF_FEAT_DEF(SCAN_V2) \
|
|
+ BRCMF_FEAT_DEF(PMKID_V2) \
|
|
+ BRCMF_FEAT_DEF(PMKID_V3)
|
|
|
|
/*
|
|
* Quirks:
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
|
index 648dc302b998..a75aabb0933b 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
|
|
@@ -788,6 +788,31 @@ struct brcmf_rev_info_le {
|
|
__le32 nvramrev;
|
|
};
|
|
|
|
+/**
|
|
+ * struct brcmf_wlc_version_le - firmware revision info.
|
|
+ *
|
|
+ * @version: structure version.
|
|
+ * @length: structure length.
|
|
+ * @epi_ver_major: EPI major version
|
|
+ * @epi_ver_minor: EPI minor version
|
|
+ * @epi_ver_rc: EPI rc version
|
|
+ * @epi_ver_incr: EPI increment version
|
|
+ * @wlc_ver_major: WLC major version
|
|
+ * @wlc_ver_minor: WLC minor version
|
|
+ */
|
|
+struct brcmf_wlc_version_le {
|
|
+ __le16 version;
|
|
+ __le16 length;
|
|
+
|
|
+ __le16 epi_ver_major;
|
|
+ __le16 epi_ver_minor;
|
|
+ __le16 epi_ver_rc;
|
|
+ __le16 epi_ver_incr;
|
|
+
|
|
+ __le16 wlc_ver_major;
|
|
+ __le16 wlc_ver_minor;
|
|
+};
|
|
+
|
|
/**
|
|
* struct brcmf_assoclist_le - request assoc list.
|
|
*
|
|
--
|
|
2.34.1
|
|
|