85 lines
2.8 KiB
Diff
85 lines
2.8 KiB
Diff
|
From 1e591c56a65fbbcd5754a4210a0ef0402d5e5f33 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||
|
Date: Mon, 9 Jul 2018 06:55:43 +0200
|
||
|
Subject: [PATCH] brcmfmac: specify some features per firmware version
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
Some features supported by firmware aren't advertised and there is no
|
||
|
way for a driver to query them. This includes e.g. monitor mode details.
|
||
|
|
||
|
Most firmwares support monitor interface but only the latest ones
|
||
|
/announce/ it with a "monitor" flag in the "cap" iovar. There isn't any
|
||
|
reliable detection method for older firmwares (BRCMF_C_MONITOR was tried
|
||
|
but "it only indicates the core part of the stack supports").
|
||
|
|
||
|
Similarly support for tagging monitor frames and building radiotap
|
||
|
headers can't be reliably detected for all firmwares.
|
||
|
|
||
|
This commit adds table that allows mapping features to firmware version.
|
||
|
It adds mappings for 43602a1 and 4366b1 firmwares from
|
||
|
linux-firmware.git. Both were confirmed to be passing monitor frames.
|
||
|
|
||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||
|
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
.../wireless/broadcom/brcm80211/brcmfmac/feature.c | 38 ++++++++++++++++++++++
|
||
|
1 file changed, 38 insertions(+)
|
||
|
|
||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
|
||
|
@@ -93,6 +93,42 @@ static int brcmf_feat_debugfs_read(struc
|
||
|
}
|
||
|
#endif /* DEBUG */
|
||
|
|
||
|
+struct brcmf_feat_fwfeat {
|
||
|
+ const char * const fwid;
|
||
|
+ u32 feat_flags;
|
||
|
+};
|
||
|
+
|
||
|
+static const struct brcmf_feat_fwfeat brcmf_feat_fwfeat_map[] = {
|
||
|
+ /* brcmfmac43602-pcie.ap.bin from linux-firmware.git commit ea1178515b88 */
|
||
|
+ { "01-6cb8e269", BIT(BRCMF_FEAT_MONITOR) },
|
||
|
+ /* brcmfmac4366b-pcie.bin from linux-firmware.git commit 52442afee990 */
|
||
|
+ { "01-c47a91a4", BIT(BRCMF_FEAT_MONITOR) },
|
||
|
+};
|
||
|
+
|
||
|
+static void brcmf_feat_firmware_overrides(struct brcmf_pub *drv)
|
||
|
+{
|
||
|
+ const struct brcmf_feat_fwfeat *e;
|
||
|
+ u32 feat_flags = 0;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ for (i = 0; i < ARRAY_SIZE(brcmf_feat_fwfeat_map); i++) {
|
||
|
+ e = &brcmf_feat_fwfeat_map[i];
|
||
|
+ if (!strcmp(e->fwid, drv->fwver)) {
|
||
|
+ feat_flags = e->feat_flags;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ 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.
|
||
|
*
|
||
|
@@ -253,6 +289,8 @@ void brcmf_feat_attach(struct brcmf_pub
|
||
|
}
|
||
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_FWSUP, "sup_wpa");
|
||
|
|
||
|
+ brcmf_feat_firmware_overrides(drvr);
|
||
|
+
|
||
|
/* set chip related quirks */
|
||
|
switch (drvr->bus_if->chip) {
|
||
|
case BRCM_CC_43236_CHIP_ID:
|