mirror of https://gitee.com/openkylin/linux.git
brcmfmac: obtain feature info using 'cap' firmware command
Several features in the driver directly map to a firmware feature listed in response of the 'cap' firmware command. For those features this response will be examined instead of attempting individual firmware commands. Reviewed-by: Hante Meuleman <meuleman@broadcom.com> Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Reviewed-by: Mathy Vanhoef <vanhoefm@gmail.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
48ed16e86b
commit
ec64241c9f
|
@ -42,6 +42,17 @@ static const char *brcmf_feat_names[] = {
|
||||||
};
|
};
|
||||||
#undef BRCMF_FEAT_DEF
|
#undef BRCMF_FEAT_DEF
|
||||||
|
|
||||||
|
struct brcmf_feat_fwcap {
|
||||||
|
enum brcmf_feat_id feature;
|
||||||
|
const char * const fwcap_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct brcmf_feat_fwcap brcmf_fwcap_map[] = {
|
||||||
|
{ BRCMF_FEAT_MBSS, "mbss" },
|
||||||
|
{ BRCMF_FEAT_MCHAN, "mchan" },
|
||||||
|
{ BRCMF_FEAT_P2P, "p2p" },
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
/*
|
/*
|
||||||
* expand quirk list to array of quirk strings.
|
* expand quirk list to array of quirk strings.
|
||||||
|
@ -106,25 +117,22 @@ static void brcmf_feat_iovar_int_get(struct brcmf_if *ifp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp)
|
||||||
* brcmf_feat_iovar_int_set() - determine feature through iovar set.
|
|
||||||
*
|
|
||||||
* @ifp: interface to query.
|
|
||||||
* @id: feature id.
|
|
||||||
* @name: iovar name.
|
|
||||||
*/
|
|
||||||
static void brcmf_feat_iovar_int_set(struct brcmf_if *ifp,
|
|
||||||
enum brcmf_feat_id id, char *name, u32 val)
|
|
||||||
{
|
{
|
||||||
int err;
|
char caps[256];
|
||||||
|
enum brcmf_feat_id id;
|
||||||
|
int i;
|
||||||
|
|
||||||
err = brcmf_fil_iovar_int_set(ifp, name, val);
|
brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
|
||||||
if (err == 0) {
|
brcmf_dbg(INFO, "[ %s]\n", caps);
|
||||||
brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]);
|
|
||||||
ifp->drvr->feat_flags |= BIT(id);
|
for (i = 0; i < ARRAY_SIZE(brcmf_fwcap_map); i++) {
|
||||||
} else {
|
if (strnstr(caps, brcmf_fwcap_map[i].fwcap_id, sizeof(caps))) {
|
||||||
brcmf_dbg(TRACE, "%s feature check failed: %d\n",
|
id = brcmf_fwcap_map[i].feature;
|
||||||
brcmf_feat_names[id], err);
|
brcmf_dbg(INFO, "enabling feature: %s\n",
|
||||||
|
brcmf_feat_names[id]);
|
||||||
|
ifp->drvr->feat_flags |= BIT(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,13 +142,14 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
|
||||||
struct brcmf_pno_macaddr_le pfn_mac;
|
struct brcmf_pno_macaddr_le pfn_mac;
|
||||||
s32 err;
|
s32 err;
|
||||||
|
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MCHAN, "mchan");
|
brcmf_feat_firmware_capabilities(ifp);
|
||||||
|
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn");
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn");
|
||||||
if (drvr->bus_if->wowl_supported)
|
if (drvr->bus_if->wowl_supported)
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
|
||||||
if (drvr->bus_if->chip != BRCM_CC_43362_CHIP_ID)
|
/* MBSS does not work for 43362 */
|
||||||
brcmf_feat_iovar_int_set(ifp, BRCMF_FEAT_MBSS, "mbss", 0);
|
if (drvr->bus_if->chip == BRCM_CC_43362_CHIP_ID)
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_P2P, "p2p");
|
ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_MBSS);
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode");
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue