123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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
- @@ -92,6 +92,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.
- *
- @@ -219,6 +255,8 @@ void brcmf_feat_attach(struct brcmf_pub
- ifp->drvr->feat_flags &= ~drvr->settings->feature_disable;
- }
-
- + brcmf_feat_firmware_overrides(drvr);
- +
- /* set chip related quirks */
- switch (drvr->bus_if->chip) {
- case BRCM_CC_43236_CHIP_ID:
|