Message ID | 20180709045543.15031-1-zajec5@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 1e591c56a65fbbcd5754a4210a0ef0402d5e5f33 |
Delegated to: | Kalle Valo |
Headers | show |
Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > 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> Patch applied to wireless-drivers-next.git, thanks. 1e591c56a65f brcmfmac: specify some features per firmware version
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c index 4db4d444407a..8347da632a5b 100644 --- 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(struct seq_file *seq, void *data) } #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 *drvr) } 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: