From: Rafał Miłecki Date: Mon, 18 Jun 2018 05:32:34 +0000 (+0200) Subject: mac80211: backport brcmfmac changes from kernel 4.18 X-Git-Tag: v18.06.0-rc2~44 X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=commitdiff_plain;h=c437adb02473accadeec252e9d87d58ce44cd6ed mac80211: backport brcmfmac changes from kernel 4.18 Signed-off-by: Rafał Miłecki (cherry picked from commit c446e38c862201dd4d6a4fb8ea6e49172980952d) --- diff --git a/package/kernel/mac80211/patches/329-v4.18-0001-brcmfmac-add-support-for-BCM4366E-chipset.patch b/package/kernel/mac80211/patches/329-v4.18-0001-brcmfmac-add-support-for-BCM4366E-chipset.patch new file mode 100644 index 0000000000..e31d69826d --- /dev/null +++ b/package/kernel/mac80211/patches/329-v4.18-0001-brcmfmac-add-support-for-BCM4366E-chipset.patch @@ -0,0 +1,48 @@ +From 1f589e2510d5df1192dca7c089103a2cbd028101 Mon Sep 17 00:00:00 2001 +From: Dan Haab +Date: Tue, 3 Apr 2018 10:21:56 +0200 +Subject: [PATCH] brcmfmac: add support for BCM4366E chipset + +BCM4366E is a wireless chipset with a BCM43664 ChipCommon. It's +supported by the same firmware as 4366c0. + +Signed-off-by: Dan Haab +[arend: rebase patch and remove unnecessary definition] +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 + + drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 1 + + drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 + + 3 files changed, 3 insertions(+) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c +@@ -689,6 +689,7 @@ static u32 brcmf_chip_tcm_rambase(struct + case BRCM_CC_43525_CHIP_ID: + case BRCM_CC_4365_CHIP_ID: + case BRCM_CC_4366_CHIP_ID: ++ case BRCM_CC_43664_CHIP_ID: + return 0x200000; + case CY_CC_4373_CHIP_ID: + return 0x160000; +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -75,6 +75,7 @@ static struct brcmf_firmware_mapping brc + BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C), + BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B), + BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C), ++ BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C), + BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), + }; + +--- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h ++++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h +@@ -57,6 +57,7 @@ + #define BRCM_CC_43602_CHIP_ID 43602 + #define BRCM_CC_4365_CHIP_ID 0x4365 + #define BRCM_CC_4366_CHIP_ID 0x4366 ++#define BRCM_CC_43664_CHIP_ID 43664 + #define BRCM_CC_4371_CHIP_ID 0x4371 + #define CY_CC_4373_CHIP_ID 0x4373 + diff --git a/package/kernel/mac80211/patches/330-v4.18-0001-brcmfmac-check-p2pdev-mac-address-uniqueness.patch b/package/kernel/mac80211/patches/330-v4.18-0001-brcmfmac-check-p2pdev-mac-address-uniqueness.patch new file mode 100644 index 0000000000..909000cc59 --- /dev/null +++ b/package/kernel/mac80211/patches/330-v4.18-0001-brcmfmac-check-p2pdev-mac-address-uniqueness.patch @@ -0,0 +1,34 @@ +From cb746e47837ad0f35c8ae28e9aacc8eb07916d2a Mon Sep 17 00:00:00 2001 +From: Arend Van Spriel +Date: Thu, 26 Apr 2018 12:16:47 +0200 +Subject: [PATCH] brcmfmac: check p2pdev mac address uniqueness + +The mac address for p2pdev must be different from the primary interface +due to firmware requirement. Add an explicit check for this requirement +if user-space provides a mac address. + +Reviewed-by: Hante Meuleman +Reviewed-by: Pieter-Paul Giesberts +Reviewed-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +@@ -2073,6 +2073,13 @@ static struct wireless_dev *brcmf_p2p_cr + } + + pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; ++ ++ /* firmware requires unique mac address for p2pdev interface */ ++ if (addr && ether_addr_equal(addr, pri_ifp->mac_addr)) { ++ brcmf_err("discovery vif must be different from primary interface\n"); ++ return ERR_PTR(-EINVAL); ++ } ++ + brcmf_p2p_generate_bss_mac(p2p, addr); + brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr); + diff --git a/package/kernel/mac80211/patches/330-v4.18-0002-brcmfmac-reports-boottime_ns-while-informing-bss.patch b/package/kernel/mac80211/patches/330-v4.18-0002-brcmfmac-reports-boottime_ns-while-informing-bss.patch new file mode 100644 index 0000000000..4f59507cab --- /dev/null +++ b/package/kernel/mac80211/patches/330-v4.18-0002-brcmfmac-reports-boottime_ns-while-informing-bss.patch @@ -0,0 +1,76 @@ +From 7742fce4c007141617dab9bcb90034b3c0fe2347 Mon Sep 17 00:00:00 2001 +From: Franky Lin +Date: Thu, 26 Apr 2018 12:18:35 +0200 +Subject: [PATCH] brcmfmac: reports boottime_ns while informing bss + +Provides a timestamp in bss information so user space can see when the +bss info was updated. Since tsf is not available from the dongle events +boottime is reported instead. + +Reported-by: Dmitry Shmidt +Reviewed-by: Arend van Spriel +Signed-off-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 26 +++++++++++----------- + 1 file changed, 13 insertions(+), 13 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -2728,7 +2728,6 @@ static s32 brcmf_inform_single_bss(struc + struct brcmf_bss_info_le *bi) + { + struct wiphy *wiphy = cfg_to_wiphy(cfg); +- struct ieee80211_channel *notify_channel; + struct cfg80211_bss *bss; + struct ieee80211_supported_band *band; + struct brcmu_chan ch; +@@ -2738,7 +2737,7 @@ static s32 brcmf_inform_single_bss(struc + u16 notify_interval; + u8 *notify_ie; + size_t notify_ielen; +- s32 notify_signal; ++ struct cfg80211_inform_bss bss_data = { 0 }; + + if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) { + brcmf_err("Bss info is larger than buffer. Discarding\n"); +@@ -2758,27 +2757,28 @@ static s32 brcmf_inform_single_bss(struc + band = wiphy->bands[NL80211_BAND_5GHZ]; + + freq = ieee80211_channel_to_frequency(channel, band->band); +- notify_channel = ieee80211_get_channel(wiphy, freq); ++ bss_data.chan = ieee80211_get_channel(wiphy, freq); ++ bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20; ++ bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime()); + + notify_capability = le16_to_cpu(bi->capability); + notify_interval = le16_to_cpu(bi->beacon_period); + notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); + notify_ielen = le32_to_cpu(bi->ie_length); +- notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100; ++ bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100; + + brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID); + brcmf_dbg(CONN, "Channel: %d(%d)\n", channel, freq); + brcmf_dbg(CONN, "Capability: %X\n", notify_capability); + brcmf_dbg(CONN, "Beacon interval: %d\n", notify_interval); +- brcmf_dbg(CONN, "Signal: %d\n", notify_signal); ++ brcmf_dbg(CONN, "Signal: %d\n", bss_data.signal); + +- bss = cfg80211_inform_bss(wiphy, notify_channel, +- CFG80211_BSS_FTYPE_UNKNOWN, +- (const u8 *)bi->BSSID, +- 0, notify_capability, +- notify_interval, notify_ie, +- notify_ielen, notify_signal, +- GFP_KERNEL); ++ bss = cfg80211_inform_bss_data(wiphy, &bss_data, ++ CFG80211_BSS_FTYPE_UNKNOWN, ++ (const u8 *)bi->BSSID, ++ 0, notify_capability, ++ notify_interval, notify_ie, ++ notify_ielen, GFP_KERNEL); + + if (!bss) + return -ENOMEM; diff --git a/package/kernel/mac80211/patches/330-v4.18-0003-brcmfmac-use-nl80211_band-directly-to-get-ieee80211-.patch b/package/kernel/mac80211/patches/330-v4.18-0003-brcmfmac-use-nl80211_band-directly-to-get-ieee80211-.patch new file mode 100644 index 0000000000..2d60c0d9ee --- /dev/null +++ b/package/kernel/mac80211/patches/330-v4.18-0003-brcmfmac-use-nl80211_band-directly-to-get-ieee80211-.patch @@ -0,0 +1,43 @@ +From aed14219067ab96e5eeb7730e9bceed10d9be989 Mon Sep 17 00:00:00 2001 +From: Franky Lin +Date: Thu, 26 Apr 2018 12:16:48 +0200 +Subject: [PATCH] brcmfmac: use nl80211_band directly to get ieee80211 channel + +The enum nl80211_band used to retrieve wiphy->bands is the same as +wiphy->bands->band which is checked by wiphy_register(). So it can be used +directly as parameter of ieee80211_channel_to_frequency(). + +Reviewed-by: Arend van Spriel +Signed-off-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -2729,7 +2729,7 @@ static s32 brcmf_inform_single_bss(struc + { + struct wiphy *wiphy = cfg_to_wiphy(cfg); + struct cfg80211_bss *bss; +- struct ieee80211_supported_band *band; ++ enum nl80211_band band; + struct brcmu_chan ch; + u16 channel; + u32 freq; +@@ -2752,11 +2752,11 @@ static s32 brcmf_inform_single_bss(struc + channel = bi->ctl_ch; + + if (channel <= CH_MAX_2G_CHANNEL) +- band = wiphy->bands[NL80211_BAND_2GHZ]; ++ band = NL80211_BAND_2GHZ; + else +- band = wiphy->bands[NL80211_BAND_5GHZ]; ++ band = NL80211_BAND_5GHZ; + +- freq = ieee80211_channel_to_frequency(channel, band->band); ++ freq = ieee80211_channel_to_frequency(channel, band); + bss_data.chan = ieee80211_get_channel(wiphy, freq); + bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20; + bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime()); diff --git a/package/kernel/mac80211/patches/330-v4.18-0004-brcmfmac-constify-firmware-mapping-tables.patch b/package/kernel/mac80211/patches/330-v4.18-0004-brcmfmac-constify-firmware-mapping-tables.patch new file mode 100644 index 0000000000..df2648374a --- /dev/null +++ b/package/kernel/mac80211/patches/330-v4.18-0004-brcmfmac-constify-firmware-mapping-tables.patch @@ -0,0 +1,76 @@ +From ff68c9f9c06d1fd437c8f90fc05ca28c47f7d85e Mon Sep 17 00:00:00 2001 +From: Arend Van Spriel +Date: Thu, 26 Apr 2018 12:16:49 +0200 +Subject: [PATCH] brcmfmac: constify firmware mapping tables + +The information in the firmware mapping does not need to be modified +so it can be static const. + +Reviewed-by: Hante Meuleman +Reviewed-by: Pieter-Paul Giesberts +Reviewed-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 2 +- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h | 2 +- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 2 +- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c +@@ -634,7 +634,7 @@ int brcmf_fw_get_firmwares(struct device + + struct brcmf_fw_request * + brcmf_fw_alloc_request(u32 chip, u32 chiprev, +- struct brcmf_firmware_mapping mapping_table[], ++ const struct brcmf_firmware_mapping mapping_table[], + u32 table_size, struct brcmf_fw_name *fwnames, + u32 n_fwnames) + { +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h +@@ -80,7 +80,7 @@ struct brcmf_fw_name { + + struct brcmf_fw_request * + brcmf_fw_alloc_request(u32 chip, u32 chiprev, +- struct brcmf_firmware_mapping mapping_table[], ++ const struct brcmf_firmware_mapping mapping_table[], + u32 table_size, struct brcmf_fw_name *fwnames, + u32 n_fwnames); + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -59,7 +59,7 @@ BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie" + BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); + BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); + +-static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { ++static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { + BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602), + BRCMF_FW_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C), + BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C), +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +@@ -619,7 +619,7 @@ BRCMF_FW_DEF(4354, "brcmfmac4354-sdio"); + BRCMF_FW_DEF(4356, "brcmfmac4356-sdio"); + BRCMF_FW_DEF(4373, "brcmfmac4373-sdio"); + +-static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = { ++static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = { + BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143), + BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0), + BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4), +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +@@ -52,7 +52,7 @@ BRCMF_FW_DEF(43242A, "brcmfmac43242a"); + BRCMF_FW_DEF(43569, "brcmfmac43569"); + BRCMF_FW_DEF(4373, "brcmfmac4373"); + +-static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = { ++static const struct brcmf_firmware_mapping brcmf_usb_fwnames[] = { + BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143), + BRCMF_FW_ENTRY(BRCM_CC_43235_CHIP_ID, 0x00000008, 43236B), + BRCMF_FW_ENTRY(BRCM_CC_43236_CHIP_ID, 0x00000008, 43236B), diff --git a/package/kernel/mac80211/patches/330-v4.18-0005-brcmfmac-add-hostready-indication.patch b/package/kernel/mac80211/patches/330-v4.18-0005-brcmfmac-add-hostready-indication.patch new file mode 100644 index 0000000000..e3d4441f7f --- /dev/null +++ b/package/kernel/mac80211/patches/330-v4.18-0005-brcmfmac-add-hostready-indication.patch @@ -0,0 +1,74 @@ +From 84ad327d18debe19b8d509059b61db445d048b02 Mon Sep 17 00:00:00 2001 +From: Franky Lin +Date: Thu, 26 Apr 2018 12:16:50 +0200 +Subject: [PATCH] brcmfmac: add hostready indication + +A hostready signal is introduced to inform firmware through mailbox +doorbell1 when common ring initialized or D3 exited. + +Reviewed-by: Arend van Spriel +Signed-off-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 14 ++++++++++++-- + 1 file changed, 12 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -105,7 +105,8 @@ static const struct brcmf_firmware_mappi + #define BRCMF_PCIE_PCIE2REG_MAILBOXMASK 0x4C + #define BRCMF_PCIE_PCIE2REG_CONFIGADDR 0x120 + #define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124 +-#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX 0x140 ++#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0 0x140 ++#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1 0x144 + + #define BRCMF_PCIE2_INTA 0x01 + #define BRCMF_PCIE2_INTB 0x02 +@@ -140,6 +141,7 @@ static const struct brcmf_firmware_mappi + #define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF + #define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000 + #define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000 ++#define BRCMF_PCIE_SHARED_HOSTRDY_DB1 0x10000000 + + #define BRCMF_PCIE_FLAGS_HTOD_SPLIT 0x4000 + #define BRCMF_PCIE_FLAGS_DTOH_SPLIT 0x8000 +@@ -782,6 +784,12 @@ static void brcmf_pcie_intr_enable(struc + BRCMF_PCIE_MB_INT_FN0_1); + } + ++static void brcmf_pcie_hostready(struct brcmf_pciedev_info *devinfo) ++{ ++ if (devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1) ++ brcmf_pcie_write_reg32(devinfo, ++ BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, 1); ++} + + static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) + { +@@ -924,7 +932,7 @@ static int brcmf_pcie_ring_mb_ring_bell( + + brcmf_dbg(PCIE, "RING !\n"); + /* Any arbitrary value will do, lets use 1 */ +- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1); ++ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, 1); + + return 0; + } +@@ -1728,6 +1736,7 @@ static void brcmf_pcie_setup(struct devi + init_waitqueue_head(&devinfo->mbdata_resp_wait); + + brcmf_pcie_intr_enable(devinfo); ++ brcmf_pcie_hostready(devinfo); + if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0) + return; + +@@ -1950,6 +1959,7 @@ static int brcmf_pcie_pm_leave_D3(struct + brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2); + brcmf_bus_change_state(bus, BRCMF_BUS_UP); + brcmf_pcie_intr_enable(devinfo); ++ brcmf_pcie_hostready(devinfo); + return 0; + } + diff --git a/package/kernel/mac80211/patches/330-v4.18-0006-brcmfmac-coarse-support-for-PCIe-shared-structure-re.patch b/package/kernel/mac80211/patches/330-v4.18-0006-brcmfmac-coarse-support-for-PCIe-shared-structure-re.patch new file mode 100644 index 0000000000..8750037d85 --- /dev/null +++ b/package/kernel/mac80211/patches/330-v4.18-0006-brcmfmac-coarse-support-for-PCIe-shared-structure-re.patch @@ -0,0 +1,97 @@ +From f56324baf329bc9362a52ad77a4a1a0f3356d1bc Mon Sep 17 00:00:00 2001 +From: Franky Lin +Date: Thu, 26 Apr 2018 12:16:51 +0200 +Subject: [PATCH] brcmfmac: coarse support for PCIe shared structure rev7 + +Revision 7 of PCIe dongle interface increases the item size of tx and rx +complete rings to accommodate extra payload for new feature. This patch +simply bump up the size of these two rings without adding the support +for utilizing the new space. This makes brcmfmac compatible with rev7 +firmware. + +Reviewed-by: Arend van Spriel +Signed-off-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | 6 ++++-- + .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 23 ++++++++++++++++++---- + 2 files changed, 23 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h +@@ -27,8 +27,10 @@ + #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40 + #define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE 32 + #define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_ITEMSIZE 24 +-#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE 16 +-#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE 32 ++#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE_PRE_V7 16 ++#define BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE 24 ++#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE_PRE_V7 32 ++#define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE 40 + #define BRCMF_H2D_TXFLOWRING_ITEMSIZE 48 + + struct msgbuf_buf_addr { +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -136,8 +136,9 @@ static const struct brcmf_firmware_mappi + BRCMF_PCIE_MB_INT_D2H3_DB0 | \ + BRCMF_PCIE_MB_INT_D2H3_DB1) + ++#define BRCMF_PCIE_SHARED_VERSION_7 7 + #define BRCMF_PCIE_MIN_SHARED_VERSION 5 +-#define BRCMF_PCIE_MAX_SHARED_VERSION 6 ++#define BRCMF_PCIE_MAX_SHARED_VERSION BRCMF_PCIE_SHARED_VERSION_7 + #define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF + #define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000 + #define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000 +@@ -318,6 +319,14 @@ static const u32 brcmf_ring_max_item[BRC + BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM + }; + ++static const u32 brcmf_ring_itemsize_pre_v7[BRCMF_NROF_COMMON_MSGRINGS] = { ++ BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE, ++ BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE, ++ BRCMF_D2H_MSGRING_CONTROL_COMPLETE_ITEMSIZE, ++ BRCMF_D2H_MSGRING_TX_COMPLETE_ITEMSIZE_PRE_V7, ++ BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE_PRE_V7 ++}; ++ + static const u32 brcmf_ring_itemsize[BRCMF_NROF_COMMON_MSGRINGS] = { + BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE, + BRCMF_H2D_MSGRING_RXPOST_SUBMIT_ITEMSIZE, +@@ -1007,8 +1016,14 @@ brcmf_pcie_alloc_dma_and_ring(struct brc + struct brcmf_pcie_ringbuf *ring; + u32 size; + u32 addr; ++ const u32 *ring_itemsize_array; ++ ++ if (devinfo->shared.version < BRCMF_PCIE_SHARED_VERSION_7) ++ ring_itemsize_array = brcmf_ring_itemsize_pre_v7; ++ else ++ ring_itemsize_array = brcmf_ring_itemsize; + +- size = brcmf_ring_max_item[ring_id] * brcmf_ring_itemsize[ring_id]; ++ size = brcmf_ring_max_item[ring_id] * ring_itemsize_array[ring_id]; + dma_buf = brcmf_pcie_init_dmabuffer_for_device(devinfo, size, + tcm_ring_phys_addr + BRCMF_RING_MEM_BASE_ADDR_OFFSET, + &dma_handle); +@@ -1018,7 +1033,7 @@ brcmf_pcie_alloc_dma_and_ring(struct brc + addr = tcm_ring_phys_addr + BRCMF_RING_MAX_ITEM_OFFSET; + brcmf_pcie_write_tcm16(devinfo, addr, brcmf_ring_max_item[ring_id]); + addr = tcm_ring_phys_addr + BRCMF_RING_LEN_ITEMS_OFFSET; +- brcmf_pcie_write_tcm16(devinfo, addr, brcmf_ring_itemsize[ring_id]); ++ brcmf_pcie_write_tcm16(devinfo, addr, ring_itemsize_array[ring_id]); + + ring = kzalloc(sizeof(*ring), GFP_KERNEL); + if (!ring) { +@@ -1027,7 +1042,7 @@ brcmf_pcie_alloc_dma_and_ring(struct brc + return NULL; + } + brcmf_commonring_config(&ring->commonring, brcmf_ring_max_item[ring_id], +- brcmf_ring_itemsize[ring_id], dma_buf); ++ ring_itemsize_array[ring_id], dma_buf); + ring->dma_handle = dma_handle; + ring->devinfo = devinfo; + brcmf_commonring_register_cb(&ring->commonring, diff --git a/package/kernel/mac80211/patches/331-v4.18-0001-brcmfmac-Add-support-for-bcm43364-wireless-chipset.patch b/package/kernel/mac80211/patches/331-v4.18-0001-brcmfmac-Add-support-for-bcm43364-wireless-chipset.patch new file mode 100644 index 0000000000..13f169be9f --- /dev/null +++ b/package/kernel/mac80211/patches/331-v4.18-0001-brcmfmac-Add-support-for-bcm43364-wireless-chipset.patch @@ -0,0 +1,45 @@ +From 9c4a121e82634aa000a702c98cd6f05b27d6e186 Mon Sep 17 00:00:00 2001 +From: Sean Lanigan +Date: Fri, 4 May 2018 16:48:23 +1000 +Subject: [PATCH] brcmfmac: Add support for bcm43364 wireless chipset + +Add support for the BCM43364 chipset via an SDIO interface, as used in +e.g. the Murata 1FX module. + +The BCM43364 uses the same firmware as the BCM43430 (which is already +included), the only difference is the omission of Bluetooth. + +However, the SDIO_ID for the BCM43364 is 02D0:A9A4, giving it a MODALIAS +of sdio:c00v02D0dA9A4, which doesn't get recognised and hence doesn't +load the brcmfmac module. Adding the 'A9A4' ID in the appropriate place +triggers the brcmfmac driver to load, and then correctly use the +firmware file 'brcmfmac43430-sdio.bin'. + +Signed-off-by: Sean Lanigan +Acked-by: Ulf Hansson +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 + + include/linux/mmc/sdio_ids.h | 1 + + 2 files changed, 2 insertions(+) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +@@ -963,6 +963,7 @@ static const struct sdio_device_id brcmf + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43340), + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341), + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362), ++ BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43364), + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339), + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339), + BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430), +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h +@@ -34,6 +34,7 @@ + #define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335 + #define SDIO_DEVICE_ID_BROADCOM_4339 0x4339 + #define SDIO_DEVICE_ID_BROADCOM_43362 0xa962 ++#define SDIO_DEVICE_ID_BROADCOM_43364 0xa9a4 + #define SDIO_DEVICE_ID_BROADCOM_43430 0xa9a6 + #define SDIO_DEVICE_ID_BROADCOM_4345 0x4345 + #define SDIO_DEVICE_ID_BROADCOM_43455 0xa9bf diff --git a/package/kernel/mac80211/patches/332-v4.18-0001-brcmfmac-set-WIPHY_FLAG_HAVE_AP_SME-flag.patch b/package/kernel/mac80211/patches/332-v4.18-0001-brcmfmac-set-WIPHY_FLAG_HAVE_AP_SME-flag.patch new file mode 100644 index 0000000000..de41e1c453 --- /dev/null +++ b/package/kernel/mac80211/patches/332-v4.18-0001-brcmfmac-set-WIPHY_FLAG_HAVE_AP_SME-flag.patch @@ -0,0 +1,34 @@ +From 1204aa17f3b4f63e67ac9b7c9afa9496485969c5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 10 May 2018 15:21:39 +0200 +Subject: [PATCH] brcmfmac: set WIPHY_FLAG_HAVE_AP_SME flag +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +brcmfmac is a FullMAC driver and it implements/uses cfg80211 interface +for stations management. At the same time it doesn't receive or pass up +management frames. + +This flag indicates that authenticator doesn't have to subscribe to or +handle management frames. Some authenticators (e.g. hostapd) were +working with brcmfmac thanks to some extra assumptions. This commit +clears up the situation. + +Signed-off-by: Rafał Miłecki +Acked-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -6513,6 +6513,7 @@ static int brcmf_setup_wiphy(struct wiph + + wiphy->flags |= WIPHY_FLAG_NETNS_OK | + WIPHY_FLAG_PS_ON_BY_DEFAULT | ++ WIPHY_FLAG_HAVE_AP_SME | + WIPHY_FLAG_OFFCHAN_TX | + WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; + if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS)) diff --git a/package/kernel/mac80211/patches/333-v4.18-0001-brcmfmac-fix-initialization-of-struct-cfg80211_infor.patch b/package/kernel/mac80211/patches/333-v4.18-0001-brcmfmac-fix-initialization-of-struct-cfg80211_infor.patch new file mode 100644 index 0000000000..2436bb8a8a --- /dev/null +++ b/package/kernel/mac80211/patches/333-v4.18-0001-brcmfmac-fix-initialization-of-struct-cfg80211_infor.patch @@ -0,0 +1,29 @@ +From 763ece85f45a6b93268e25a0abf02922f911dab4 Mon Sep 17 00:00:00 2001 +From: Franky Lin +Date: Tue, 15 May 2018 11:14:44 +0200 +Subject: [PATCH] brcmfmac: fix initialization of struct cfg80211_inform_bss + variable + +This patch fixes a sparse warning "Using plain integer as NULL pointer" +about cfg80211_inform_bss structure initialization. + +Reported-by: kbuild test robot +Reviewed-by: Arend van Spriel +Signed-off-by: Franky Lin +Signed-off-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -2737,7 +2737,7 @@ static s32 brcmf_inform_single_bss(struc + u16 notify_interval; + u8 *notify_ie; + size_t notify_ielen; +- struct cfg80211_inform_bss bss_data = { 0 }; ++ struct cfg80211_inform_bss bss_data = {}; + + if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) { + brcmf_err("Bss info is larger than buffer. Discarding\n"); diff --git a/package/kernel/mac80211/patches/334-v4.18-0001-brcmfmac-add-debugfs-entry-for-reading-firmware-capa.patch b/package/kernel/mac80211/patches/334-v4.18-0001-brcmfmac-add-debugfs-entry-for-reading-firmware-capa.patch new file mode 100644 index 0000000000..f350d1e819 --- /dev/null +++ b/package/kernel/mac80211/patches/334-v4.18-0001-brcmfmac-add-debugfs-entry-for-reading-firmware-capa.patch @@ -0,0 +1,75 @@ +From 88001968245c42c26416476bf0ef960442371605 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Mon, 14 May 2018 08:48:20 +0200 +Subject: [PATCH] brcmfmac: add debugfs entry for reading firmware capabilities +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This allows reading all capabilities as reported by a firmware. They are +printed using native (raw) names, just like developers like it the most. +It's how firmware reports support for various features, e.g. supported +modes, supported standards, power saving details, max BSS-es. + +Access to all that info is useful for trying new firmwares, comparing +them and debugging features AKA bugs. + +Signed-off-by: Rafał Miłecki +Reviewed-by: Arend van Spriel +Signed-off-by: Kalle Valo +--- + .../wireless/broadcom/brcm80211/brcmfmac/feature.c | 36 ++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +@@ -165,6 +165,41 @@ static void brcmf_feat_firmware_capabili + } + } + ++/** ++ * brcmf_feat_fwcap_debugfs_read() - expose firmware capabilities to debugfs. ++ * ++ * @seq: sequence for debugfs entry. ++ * @data: raw data pointer. ++ */ ++static int brcmf_feat_fwcap_debugfs_read(struct seq_file *seq, void *data) ++{ ++ struct brcmf_bus *bus_if = dev_get_drvdata(seq->private); ++ struct brcmf_if *ifp = brcmf_get_ifp(bus_if->drvr, 0); ++ char caps[MAX_CAPS_BUFFER_SIZE + 1] = { }; ++ char *tmp; ++ int err; ++ ++ err = brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps)); ++ if (err) { ++ brcmf_err("could not get firmware cap (%d)\n", err); ++ return err; ++ } ++ ++ /* Put every capability in a new line */ ++ for (tmp = caps; *tmp; tmp++) { ++ if (*tmp == ' ') ++ *tmp = '\n'; ++ } ++ ++ /* Usually there is a space at the end of capabilities string */ ++ seq_printf(seq, "%s", caps); ++ /* So make sure we don't print two line breaks */ ++ if (tmp > caps && *(tmp - 1) != '\n') ++ seq_printf(seq, "\n"); ++ ++ return 0; ++} ++ + void brcmf_feat_attach(struct brcmf_pub *drvr) + { + struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0); +@@ -233,6 +268,7 @@ void brcmf_feat_attach(struct brcmf_pub + void brcmf_feat_debugfs_create(struct brcmf_pub *drvr) + { + brcmf_debugfs_add_entry(drvr, "features", brcmf_feat_debugfs_read); ++ brcmf_debugfs_add_entry(drvr, "fwcap", brcmf_feat_fwcap_debugfs_read); + } + + bool brcmf_feat_is_enabled(struct brcmf_if *ifp, enum brcmf_feat_id id)