Skip to content

Commit 42e5117

Browse files
committed
wifi: brcmfmac: Support v6+ flags and set host_cap properly
Interface versions 6 and above support having the host tell the dongle about what it supports via a host_cap field (it seems that if it is set to zero, some kind of unknown defaults are used). Explicitly support and set this. This also disables OOB deep sleep support; it doesn't look like deep sleep is properly supported yet at all (it needs more logic than merely acking requests, which is all pcie.c does right now). Signed-off-by: Hector Martin <[email protected]>
1 parent 7780337 commit 42e5117

1 file changed

Lines changed: 34 additions & 1 deletion

File tree

  • drivers/net/wireless/broadcom/brcm80211/brcmfmac

drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,8 @@ struct brcmf_pcie_console {
353353
struct brcmf_pcie_shared_info {
354354
u32 tcm_base_address;
355355
u32 flags;
356+
u32 flags2;
357+
u32 flags3;
356358
struct brcmf_pcie_ringbuf *commonrings[BRCMF_NROF_COMMON_MSGRINGS];
357359
struct brcmf_pcie_ringbuf *flowrings;
358360
u16 max_rxbufpost;
@@ -1685,12 +1687,16 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
16851687
{
16861688
struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
16871689
struct brcmf_pcie_shared_info *shared;
1690+
u32 host_cap;
1691+
u32 host_cap2;
16881692
u32 addr;
16891693

16901694
shared = &devinfo->shared;
16911695
shared->tcm_base_address = sharedram_addr;
16921696

1693-
shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr);
1697+
shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr +
1698+
BRCMF_SHARED_FLAGS_OFFSET);
1699+
16941700
shared->version = (u8)(shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK);
16951701
brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version);
16961702
if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
@@ -1731,6 +1737,33 @@ brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
17311737
brcmf_pcie_bus_console_init(devinfo);
17321738
brcmf_pcie_bus_console_read(devinfo, false);
17331739

1740+
/* Features added in revision 6 follow */
1741+
if (shared->version < 6)
1742+
return 0;
1743+
1744+
shared->flags2 = brcmf_pcie_read_tcm32(devinfo, sharedram_addr +
1745+
BRCMF_SHARED_FLAGS2_OFFSET);
1746+
shared->flags3 = brcmf_pcie_read_tcm32(devinfo, sharedram_addr +
1747+
BRCMF_SHARED_FLAGS3_OFFSET);
1748+
1749+
/* Update host support flags */
1750+
host_cap = shared->version;
1751+
host_cap2 = 0;
1752+
1753+
if (shared->flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1)
1754+
host_cap |= BRCMF_HOSTCAP_H2D_ENABLE_HOSTRDY;
1755+
1756+
if (shared->flags & BRCMF_PCIE_SHARED_DAR)
1757+
host_cap |= BRCMF_HOSTCAP_H2D_DAR;
1758+
1759+
/* Disable DS: this is not currently properly supported */
1760+
host_cap |= BRCMF_HOSTCAP_DS_NO_OOB_DW;
1761+
1762+
brcmf_pcie_write_tcm32(devinfo, sharedram_addr +
1763+
BRCMF_SHARED_HOST_CAP_OFFSET, host_cap);
1764+
brcmf_pcie_write_tcm32(devinfo, sharedram_addr +
1765+
BRCMF_SHARED_HOST_CAP2_OFFSET, host_cap2);
1766+
17341767
return 0;
17351768
}
17361769

0 commit comments

Comments
 (0)