aboutsummaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch')
-rw-r--r--package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch664
1 files changed, 664 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch b/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch
new file mode 100644
index 0000000000..0ec9d10301
--- /dev/null
+++ b/package/kernel/mac80211/patches/376-0009-brcmfmac-Unify-methods-to-define-and-map-firmware-fi.patch
@@ -0,0 +1,664 @@
+From: Hante Meuleman <meuleman@broadcom.com>
+Date: Wed, 25 Nov 2015 11:32:46 +0100
+Subject: [PATCH] brcmfmac: Unify methods to define and map firmware files.
+
+All bus drivers (sdio, usb and pcie) require firmware files which
+needs to be downloaded to the device, The definitions and mapping
+of device id and revision to firmware and nvram file is done by
+each bus driver. This patch creates common functions and defines
+to simplify and unify the definition of these firmware and nvram
+files and mapping.
+
+Reviewed-by: Arend Van Spriel <arend@broadcom.com>
+Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
+Signed-off-by: Hante Meuleman <meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
+@@ -27,9 +27,9 @@
+ #define BRCMF_FW_NVRAM_DEVPATH_LEN 19 /* devpath0=pcie/1/4/ */
+ #define BRCMF_FW_NVRAM_PCIEDEV_LEN 10 /* pcie/1/4/ + \0 */
+
+-char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
++static char brcmf_firmware_path[BRCMF_FW_NAME_LEN];
+ module_param_string(alternative_fw_path, brcmf_firmware_path,
+- BRCMF_FW_PATH_LEN, 0440);
++ BRCMF_FW_NAME_LEN, 0440);
+
+ enum nvram_parser_state {
+ IDLE,
+@@ -531,3 +531,43 @@ int brcmf_fw_get_firmwares(struct device
+ 0);
+ }
+
++int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
++ struct brcmf_firmware_mapping mapping_table[],
++ u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
++ char nvram_name[BRCMF_FW_NAME_LEN])
++{
++ u32 i;
++ char end;
++
++ for (i = 0; i < table_size; i++) {
++ if (mapping_table[i].chipid == chip &&
++ mapping_table[i].revmask & BIT(chiprev))
++ break;
++ }
++
++ if (i == table_size) {
++ brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
++ return -ENODEV;
++ }
++
++ /* check if firmware path is provided by module parameter */
++ if (brcmf_firmware_path[0] != '\0') {
++ strlcpy(fw_name, brcmf_firmware_path, BRCMF_FW_NAME_LEN);
++ if ((nvram_name) && (mapping_table[i].nvram))
++ strlcpy(nvram_name, brcmf_firmware_path,
++ BRCMF_FW_NAME_LEN);
++
++ end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
++ if (end != '/') {
++ strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
++ if ((nvram_name) && (mapping_table[i].nvram))
++ strlcat(nvram_name, "/", BRCMF_FW_NAME_LEN);
++ }
++ }
++ strlcat(fw_name, mapping_table[i].fw, BRCMF_FW_NAME_LEN);
++ if ((nvram_name) && (mapping_table[i].nvram))
++ strlcat(nvram_name, mapping_table[i].nvram, BRCMF_FW_NAME_LEN);
++
++ return 0;
++}
++
+--- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.h
++++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.h
+@@ -21,11 +21,51 @@
+ #define BRCMF_FW_REQ_FLAGS 0x00F0
+ #define BRCMF_FW_REQ_NV_OPTIONAL 0x0010
+
+-#define BRCMF_FW_PATH_LEN 256
+-#define BRCMF_FW_NAME_LEN 32
++#define BRCMF_FW_NAME_LEN 320
+
+-extern char brcmf_firmware_path[];
++#define BRCMF_FW_DEFAULT_PATH "brcm/"
+
++/**
++ * struct brcmf_firmware_mapping - Used to map chipid/revmask to firmware
++ * filename and nvram filename. Each bus type implementation should create
++ * a table of firmware mappings (using the macros defined below).
++ *
++ * @chipid: ID of chip.
++ * @revmask: bitmask of revisions, e.g. 0x10 means rev 4 only, 0xf means rev 0-3
++ * @fw: name of the firmware file.
++ * @nvram: name of nvram file.
++ */
++struct brcmf_firmware_mapping {
++ u32 chipid;
++ u32 revmask;
++ const char *fw;
++ const char *nvram;
++};
++
++#define BRCMF_FW_NVRAM_DEF(fw_nvram_name, fw, nvram) \
++static const char BRCM_ ## fw_nvram_name ## _FIRMWARE_NAME[] = \
++ BRCMF_FW_DEFAULT_PATH fw; \
++static const char BRCM_ ## fw_nvram_name ## _NVRAM_NAME[] = \
++ BRCMF_FW_DEFAULT_PATH nvram; \
++MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw); \
++MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH nvram)
++
++#define BRCMF_FW_DEF(fw_name, fw) \
++static const char BRCM_ ## fw_name ## _FIRMWARE_NAME[] = \
++ BRCMF_FW_DEFAULT_PATH fw; \
++MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw) \
++
++#define BRCMF_FW_NVRAM_ENTRY(chipid, mask, name) \
++ { chipid, mask, \
++ BRCM_ ## name ## _FIRMWARE_NAME, BRCM_ ## name ## _NVRAM_NAME }
++
++#define BRCMF_FW_ENTRY(chipid, mask, name) \
++ { chipid, mask, BRCM_ ## name ## _FIRMWARE_NAME, NULL }
++
++int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
++ struct brcmf_firmware_mapping mapping_table[],
++ u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
++ char nvram_name[BRCMF_FW_NAME_LEN]);
+ void brcmf_fw_nvram_free(void *nvram);
+ /*
+ * Request firmware(s) asynchronously. When the asynchronous request
+--- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
+@@ -44,25 +44,29 @@ enum brcmf_pcie_state {
+ BRCMFMAC_PCIE_STATE_UP
+ };
+
+-
+-#define BRCMF_PCIE_43602_FW_NAME "brcm/brcmfmac43602-pcie.bin"
+-#define BRCMF_PCIE_43602_NVRAM_NAME "brcm/brcmfmac43602-pcie.txt"
+-#define BRCMF_PCIE_4350_FW_NAME "brcm/brcmfmac4350-pcie.bin"
+-#define BRCMF_PCIE_4350_NVRAM_NAME "brcm/brcmfmac4350-pcie.txt"
+-#define BRCMF_PCIE_4356_FW_NAME "brcm/brcmfmac4356-pcie.bin"
+-#define BRCMF_PCIE_4356_NVRAM_NAME "brcm/brcmfmac4356-pcie.txt"
+-#define BRCMF_PCIE_43570_FW_NAME "brcm/brcmfmac43570-pcie.bin"
+-#define BRCMF_PCIE_43570_NVRAM_NAME "brcm/brcmfmac43570-pcie.txt"
+-#define BRCMF_PCIE_4358_FW_NAME "brcm/brcmfmac4358-pcie.bin"
+-#define BRCMF_PCIE_4358_NVRAM_NAME "brcm/brcmfmac4358-pcie.txt"
+-#define BRCMF_PCIE_4359_FW_NAME "brcm/brcmfmac4359-pcie.bin"
+-#define BRCMF_PCIE_4359_NVRAM_NAME "brcm/brcmfmac4359-pcie.txt"
+-#define BRCMF_PCIE_4365_FW_NAME "brcm/brcmfmac4365b-pcie.bin"
+-#define BRCMF_PCIE_4365_NVRAM_NAME "brcm/brcmfmac4365b-pcie.txt"
+-#define BRCMF_PCIE_4366_FW_NAME "brcm/brcmfmac4366b-pcie.bin"
+-#define BRCMF_PCIE_4366_NVRAM_NAME "brcm/brcmfmac4366b-pcie.txt"
+-#define BRCMF_PCIE_4371_FW_NAME "brcm/brcmfmac4371-pcie.bin"
+-#define BRCMF_PCIE_4371_NVRAM_NAME "brcm/brcmfmac4371-pcie.txt"
++BRCMF_FW_NVRAM_DEF(43602, "brcmfmac43602-pcie.bin", "brcmfmac43602-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4350, "brcmfmac4350-pcie.bin", "brcmfmac4350-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-pcie.bin", "brcmfmac4356-pcie.txt");
++BRCMF_FW_NVRAM_DEF(43570, "brcmfmac43570-pcie.bin", "brcmfmac43570-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4358, "brcmfmac4358-pcie.bin", "brcmfmac4358-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4359, "brcmfmac4359-pcie.bin", "brcmfmac4359-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4365B, "brcmfmac4365b-pcie.bin", "brcmfmac4365b-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4366B, "brcmfmac4366b-pcie.bin", "brcmfmac4366b-pcie.txt");
++BRCMF_FW_NVRAM_DEF(4371, "brcmfmac4371-pcie.bin", "brcmfmac4371-pcie.txt");
++
++static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFFFF, 4350),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFFF, 4365B),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFFF, 4366B),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
++};
+
+ #define BRCMF_PCIE_FW_UP_TIMEOUT 2000 /* msec */
+
+@@ -202,26 +206,6 @@ enum brcmf_pcie_state {
+ #define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB 3
+
+
+-MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4350_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4350_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4358_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4358_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4359_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4359_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4365_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4365_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4366_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4366_NVRAM_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4371_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_PCIE_4371_NVRAM_NAME);
+-
+-
+ struct brcmf_pcie_console {
+ u32 base_addr;
+ u32 buf_addr;
+@@ -258,8 +242,8 @@ struct brcmf_pciedev_info {
+ enum brcmf_pcie_state state;
+ bool in_irq;
+ struct pci_dev *pdev;
+- char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
+- char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
++ char fw_name[BRCMF_FW_NAME_LEN];
++ char nvram_name[BRCMF_FW_NAME_LEN];
+ void __iomem *regs;
+ void __iomem *tcm;
+ u32 tcm_size;
+@@ -1478,84 +1462,6 @@ brcmf_pcie_init_share_ram_info(struct br
+ }
+
+
+-static int brcmf_pcie_get_fwnames(struct brcmf_pciedev_info *devinfo)
+-{
+- char *fw_name;
+- char *nvram_name;
+- uint fw_len, nv_len;
+- char end;
+-
+- brcmf_dbg(PCIE, "Enter, chip 0x%04x chiprev %d\n", devinfo->ci->chip,
+- devinfo->ci->chiprev);
+-
+- switch (devinfo->ci->chip) {
+- case BRCM_CC_43602_CHIP_ID:
+- fw_name = BRCMF_PCIE_43602_FW_NAME;
+- nvram_name = BRCMF_PCIE_43602_NVRAM_NAME;
+- break;
+- case BRCM_CC_4350_CHIP_ID:
+- fw_name = BRCMF_PCIE_4350_FW_NAME;
+- nvram_name = BRCMF_PCIE_4350_NVRAM_NAME;
+- break;
+- case BRCM_CC_4356_CHIP_ID:
+- fw_name = BRCMF_PCIE_4356_FW_NAME;
+- nvram_name = BRCMF_PCIE_4356_NVRAM_NAME;
+- break;
+- case BRCM_CC_43567_CHIP_ID:
+- case BRCM_CC_43569_CHIP_ID:
+- case BRCM_CC_43570_CHIP_ID:
+- fw_name = BRCMF_PCIE_43570_FW_NAME;
+- nvram_name = BRCMF_PCIE_43570_NVRAM_NAME;
+- break;
+- case BRCM_CC_4358_CHIP_ID:
+- fw_name = BRCMF_PCIE_4358_FW_NAME;
+- nvram_name = BRCMF_PCIE_4358_NVRAM_NAME;
+- break;
+- case BRCM_CC_4359_CHIP_ID:
+- fw_name = BRCMF_PCIE_4359_FW_NAME;
+- nvram_name = BRCMF_PCIE_4359_NVRAM_NAME;
+- break;
+- case BRCM_CC_4365_CHIP_ID:
+- fw_name = BRCMF_PCIE_4365_FW_NAME;
+- nvram_name = BRCMF_PCIE_4365_NVRAM_NAME;
+- break;
+- case BRCM_CC_4366_CHIP_ID:
+- fw_name = BRCMF_PCIE_4366_FW_NAME;
+- nvram_name = BRCMF_PCIE_4366_NVRAM_NAME;
+- break;
+- case BRCM_CC_4371_CHIP_ID:
+- fw_name = BRCMF_PCIE_4371_FW_NAME;
+- nvram_name = BRCMF_PCIE_4371_NVRAM_NAME;
+- break;
+- default:
+- brcmf_err("Unsupported chip 0x%04x\n", devinfo->ci->chip);
+- return -ENODEV;
+- }
+-
+- fw_len = sizeof(devinfo->fw_name) - 1;
+- nv_len = sizeof(devinfo->nvram_name) - 1;
+- /* check if firmware path is provided by module parameter */
+- if (brcmf_firmware_path[0] != '\0') {
+- strncpy(devinfo->fw_name, brcmf_firmware_path, fw_len);
+- strncpy(devinfo->nvram_name, brcmf_firmware_path, nv_len);
+- fw_len -= strlen(devinfo->fw_name);
+- nv_len -= strlen(devinfo->nvram_name);
+-
+- end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
+- if (end != '/') {
+- strncat(devinfo->fw_name, "/", fw_len);
+- strncat(devinfo->nvram_name, "/", nv_len);
+- fw_len--;
+- nv_len--;
+- }
+- }
+- strncat(devinfo->fw_name, fw_name, fw_len);
+- strncat(devinfo->nvram_name, nvram_name, nv_len);
+-
+- return 0;
+-}
+-
+-
+ static int brcmf_pcie_download_fw_nvram(struct brcmf_pciedev_info *devinfo,
+ const struct firmware *fw, void *nvram,
+ u32 nvram_len)
+@@ -1891,7 +1797,10 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
+ bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
+ dev_set_drvdata(&pdev->dev, bus);
+
+- ret = brcmf_pcie_get_fwnames(devinfo);
++ ret = brcmf_fw_map_chip_to_name(devinfo->ci->chip, devinfo->ci->chiprev,
++ brcmf_pcie_fwnames,
++ ARRAY_SIZE(brcmf_pcie_fwnames),
++ devinfo->fw_name, devinfo->nvram_name);
+ if (ret)
+ goto fail_bus;
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
+@@ -596,136 +596,41 @@ static const struct sdiod_drive_str sdio
+ {4, 0x1}
+ };
+
+-#define BCM43143_FIRMWARE_NAME "brcm/brcmfmac43143-sdio.bin"
+-#define BCM43143_NVRAM_NAME "brcm/brcmfmac43143-sdio.txt"
+-#define BCM43241B0_FIRMWARE_NAME "brcm/brcmfmac43241b0-sdio.bin"
+-#define BCM43241B0_NVRAM_NAME "brcm/brcmfmac43241b0-sdio.txt"
+-#define BCM43241B4_FIRMWARE_NAME "brcm/brcmfmac43241b4-sdio.bin"
+-#define BCM43241B4_NVRAM_NAME "brcm/brcmfmac43241b4-sdio.txt"
+-#define BCM43241B5_FIRMWARE_NAME "brcm/brcmfmac43241b5-sdio.bin"
+-#define BCM43241B5_NVRAM_NAME "brcm/brcmfmac43241b5-sdio.txt"
+-#define BCM4329_FIRMWARE_NAME "brcm/brcmfmac4329-sdio.bin"
+-#define BCM4329_NVRAM_NAME "brcm/brcmfmac4329-sdio.txt"
+-#define BCM4330_FIRMWARE_NAME "brcm/brcmfmac4330-sdio.bin"
+-#define BCM4330_NVRAM_NAME "brcm/brcmfmac4330-sdio.txt"
+-#define BCM4334_FIRMWARE_NAME "brcm/brcmfmac4334-sdio.bin"
+-#define BCM4334_NVRAM_NAME "brcm/brcmfmac4334-sdio.txt"
+-#define BCM43340_FIRMWARE_NAME "brcm/brcmfmac43340-sdio.bin"
+-#define BCM43340_NVRAM_NAME "brcm/brcmfmac43340-sdio.txt"
+-#define BCM4335_FIRMWARE_NAME "brcm/brcmfmac4335-sdio.bin"
+-#define BCM4335_NVRAM_NAME "brcm/brcmfmac4335-sdio.txt"
+-#define BCM43362_FIRMWARE_NAME "brcm/brcmfmac43362-sdio.bin"
+-#define BCM43362_NVRAM_NAME "brcm/brcmfmac43362-sdio.txt"
+-#define BCM4339_FIRMWARE_NAME "brcm/brcmfmac4339-sdio.bin"
+-#define BCM4339_NVRAM_NAME "brcm/brcmfmac4339-sdio.txt"
+-#define BCM43430_FIRMWARE_NAME "brcm/brcmfmac43430-sdio.bin"
+-#define BCM43430_NVRAM_NAME "brcm/brcmfmac43430-sdio.txt"
+-#define BCM43455_FIRMWARE_NAME "brcm/brcmfmac43455-sdio.bin"
+-#define BCM43455_NVRAM_NAME "brcm/brcmfmac43455-sdio.txt"
+-#define BCM4354_FIRMWARE_NAME "brcm/brcmfmac4354-sdio.bin"
+-#define BCM4354_NVRAM_NAME "brcm/brcmfmac4354-sdio.txt"
+-
+-MODULE_FIRMWARE(BCM43143_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43143_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43241B0_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43241B0_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43241B4_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43241B4_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43241B5_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43241B5_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM4329_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM4329_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM4330_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM4330_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM4334_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM4334_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43340_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43340_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM4335_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM4335_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43430_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43430_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM43455_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM43455_NVRAM_NAME);
+-MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME);
+-MODULE_FIRMWARE(BCM4354_NVRAM_NAME);
+-
+-struct brcmf_firmware_names {
+- u32 chipid;
+- u32 revmsk;
+- const char *bin;
+- const char *nv;
++BRCMF_FW_NVRAM_DEF(43143, "brcmfmac43143-sdio.bin", "brcmfmac43143-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43241B0, "brcmfmac43241b0-sdio.bin",
++ "brcmfmac43241b0-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43241B4, "brcmfmac43241b4-sdio.bin",
++ "brcmfmac43241b4-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43241B5, "brcmfmac43241b5-sdio.bin",
++ "brcmfmac43241b5-sdio.txt");
++BRCMF_FW_NVRAM_DEF(4329, "brcmfmac4329-sdio.bin", "brcmfmac4329-sdio.txt");
++BRCMF_FW_NVRAM_DEF(4330, "brcmfmac4330-sdio.bin", "brcmfmac4330-sdio.txt");
++BRCMF_FW_NVRAM_DEF(4334, "brcmfmac4334-sdio.bin", "brcmfmac4334-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43340, "brcmfmac43340-sdio.bin", "brcmfmac43340-sdio.txt");
++BRCMF_FW_NVRAM_DEF(4335, "brcmfmac4335-sdio.bin", "brcmfmac4335-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43362, "brcmfmac43362-sdio.bin", "brcmfmac43362-sdio.txt");
++BRCMF_FW_NVRAM_DEF(4339, "brcmfmac4339-sdio.bin", "brcmfmac4339-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43430, "brcmfmac43430-sdio.bin", "brcmfmac43430-sdio.txt");
++BRCMF_FW_NVRAM_DEF(43455, "brcmfmac43455-sdio.bin", "brcmfmac43455-sdio.txt");
++BRCMF_FW_NVRAM_DEF(4354, "brcmfmac4354-sdio.bin", "brcmfmac4354-sdio.txt");
++
++static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, 43241B5),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, 4329),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, 43430),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
++ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354)
+ };
+
+-enum brcmf_firmware_type {
+- BRCMF_FIRMWARE_BIN,
+- BRCMF_FIRMWARE_NVRAM
+-};
+-
+-#define BRCMF_FIRMWARE_NVRAM(name) \
+- name ## _FIRMWARE_NAME, name ## _NVRAM_NAME
+-
+-static const struct brcmf_firmware_names brcmf_fwname_data[] = {
+- { BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43143) },
+- { BRCM_CC_43241_CHIP_ID, 0x0000001F, BRCMF_FIRMWARE_NVRAM(BCM43241B0) },
+- { BRCM_CC_43241_CHIP_ID, 0x00000020, BRCMF_FIRMWARE_NVRAM(BCM43241B4) },
+- { BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43241B5) },
+- { BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4329) },
+- { BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4330) },
+- { BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4334) },
+- { BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43340) },
+- { BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
+- { BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
+- { BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) },
+- { BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43430) },
+- { BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43455) },
+- { BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) }
+-};
+-
+-static int brcmf_sdio_get_fwnames(struct brcmf_chip *ci,
+- struct brcmf_sdio_dev *sdiodev)
+-{
+- int i;
+- char end;
+-
+- for (i = 0; i < ARRAY_SIZE(brcmf_fwname_data); i++) {
+- if (brcmf_fwname_data[i].chipid == ci->chip &&
+- brcmf_fwname_data[i].revmsk & BIT(ci->chiprev))
+- break;
+- }
+-
+- if (i == ARRAY_SIZE(brcmf_fwname_data)) {
+- brcmf_err("Unknown chipid %d [%d]\n", ci->chip, ci->chiprev);
+- return -ENODEV;
+- }
+-
+- /* check if firmware path is provided by module parameter */
+- if (brcmf_firmware_path[0] != '\0') {
+- strlcpy(sdiodev->fw_name, brcmf_firmware_path,
+- sizeof(sdiodev->fw_name));
+- strlcpy(sdiodev->nvram_name, brcmf_firmware_path,
+- sizeof(sdiodev->nvram_name));
+-
+- end = brcmf_firmware_path[strlen(brcmf_firmware_path) - 1];
+- if (end != '/') {
+- strlcat(sdiodev->fw_name, "/",
+- sizeof(sdiodev->fw_name));
+- strlcat(sdiodev->nvram_name, "/",
+- sizeof(sdiodev->nvram_name));
+- }
+- }
+- strlcat(sdiodev->fw_name, brcmf_fwname_data[i].bin,
+- sizeof(sdiodev->fw_name));
+- strlcat(sdiodev->nvram_name, brcmf_fwname_data[i].nv,
+- sizeof(sdiodev->nvram_name));
+-
+- return 0;
+-}
+-
+ static void pkt_align(struct sk_buff *p, int len, int align)
+ {
+ uint datalign;
+@@ -4252,7 +4157,10 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
+ brcmf_sdio_debugfs_create(bus);
+ brcmf_dbg(INFO, "completed!!\n");
+
+- ret = brcmf_sdio_get_fwnames(bus->ci, sdiodev);
++ ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev,
++ brcmf_sdio_fwnames,
++ ARRAY_SIZE(brcmf_sdio_fwnames),
++ sdiodev->fw_name, sdiodev->nvram_name);
+ if (ret)
+ goto fail;
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
++++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
+@@ -195,8 +195,8 @@ struct brcmf_sdio_dev {
+ uint max_segment_size;
+ uint txglomsz;
+ struct sg_table sgtable;
+- char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
+- char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
++ char fw_name[BRCMF_FW_NAME_LEN];
++ char nvram_name[BRCMF_FW_NAME_LEN];
+ bool wowl_enabled;
+ enum brcmf_sdiod_state state;
+ struct brcmf_sdiod_freezer *freezer;
+--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+@@ -43,10 +43,20 @@
+ #define BRCMF_USB_CBCTL_READ 1
+ #define BRCMF_USB_MAX_PKT_SIZE 1600
+
+-#define BRCMF_USB_43143_FW_NAME "brcm/brcmfmac43143.bin"
+-#define BRCMF_USB_43236_FW_NAME "brcm/brcmfmac43236b.bin"
+-#define BRCMF_USB_43242_FW_NAME "brcm/brcmfmac43242a.bin"
+-#define BRCMF_USB_43569_FW_NAME "brcm/brcmfmac43569.bin"
++BRCMF_FW_DEF(43143, "brcmfmac43143.bin");
++BRCMF_FW_DEF(43236B, "brcmfmac43236b.bin");
++BRCMF_FW_DEF(43242A, "brcmfmac43242a.bin");
++BRCMF_FW_DEF(43569, "brcmfmac43569.bin");
++
++static 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),
++ BRCMF_FW_ENTRY(BRCM_CC_43238_CHIP_ID, 0x00000008, 43236B),
++ BRCMF_FW_ENTRY(BRCM_CC_43242_CHIP_ID, 0xFFFFFFFF, 43242A),
++ BRCMF_FW_ENTRY(BRCM_CC_43566_CHIP_ID, 0xFFFFFFFF, 43569),
++ BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43569)
++};
+
+ #define TRX_MAGIC 0x30524448 /* "HDR0" */
+ #define TRX_MAX_OFFSET 3 /* Max number of file offsets */
+@@ -139,6 +149,7 @@ struct brcmf_usbdev_info {
+ struct brcmf_usbreq *tx_reqs;
+ struct brcmf_usbreq *rx_reqs;
+
++ char fw_name[BRCMF_FW_NAME_LEN];
+ const u8 *image; /* buffer for combine fw and nvram */
+ int image_len;
+
+@@ -983,45 +994,15 @@ static int brcmf_usb_dlrun(struct brcmf_
+ return 0;
+ }
+
+-static bool brcmf_usb_chip_support(int chipid, int chiprev)
+-{
+- switch(chipid) {
+- case BRCM_CC_43143_CHIP_ID:
+- return true;
+- case BRCM_CC_43235_CHIP_ID:
+- case BRCM_CC_43236_CHIP_ID:
+- case BRCM_CC_43238_CHIP_ID:
+- return (chiprev == 3);
+- case BRCM_CC_43242_CHIP_ID:
+- return true;
+- case BRCM_CC_43566_CHIP_ID:
+- case BRCM_CC_43569_CHIP_ID:
+- return true;
+- default:
+- break;
+- }
+- return false;
+-}
+-
+ static int
+ brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
+ {
+- int devid, chiprev;
+ int err;
+
+ brcmf_dbg(USB, "Enter\n");
+ if (devinfo == NULL)
+ return -ENODEV;
+
+- devid = devinfo->bus_pub.devid;
+- chiprev = devinfo->bus_pub.chiprev;
+-
+- if (!brcmf_usb_chip_support(devid, chiprev)) {
+- brcmf_err("unsupported chip %d rev %d\n",
+- devid, chiprev);
+- return -EINVAL;
+- }
+-
+ if (!devinfo->image) {
+ brcmf_err("No firmware!\n");
+ return -ENOENT;
+@@ -1071,25 +1052,6 @@ static int check_file(const u8 *headers)
+ return -1;
+ }
+
+-static const char *brcmf_usb_get_fwname(struct brcmf_usbdev_info *devinfo)
+-{
+- switch (devinfo->bus_pub.devid) {
+- case BRCM_CC_43143_CHIP_ID:
+- return BRCMF_USB_43143_FW_NAME;
+- case BRCM_CC_43235_CHIP_ID:
+- case BRCM_CC_43236_CHIP_ID:
+- case BRCM_CC_43238_CHIP_ID:
+- return BRCMF_USB_43236_FW_NAME;
+- case BRCM_CC_43242_CHIP_ID:
+- return BRCMF_USB_43242_FW_NAME;
+- case BRCM_CC_43566_CHIP_ID:
+- case BRCM_CC_43569_CHIP_ID:
+- return BRCMF_USB_43569_FW_NAME;
+- default:
+- return NULL;
+- }
+-}
+-
+
+ static
+ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
+@@ -1274,9 +1236,16 @@ static int brcmf_usb_probe_cb(struct brc
+ bus->chip = bus_pub->devid;
+ bus->chiprev = bus_pub->chiprev;
+
++ ret = brcmf_fw_map_chip_to_name(bus_pub->devid, bus_pub->chiprev,
++ brcmf_usb_fwnames,
++ ARRAY_SIZE(brcmf_usb_fwnames),
++ devinfo->fw_name, NULL);
++ if (ret)
++ goto fail;
++
+ /* request firmware here */
+- ret = brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo),
+- NULL, brcmf_usb_probe_phase2);
++ ret = brcmf_fw_get_firmwares(dev, 0, devinfo->fw_name, NULL,
++ brcmf_usb_probe_phase2);
+ if (ret) {
+ brcmf_err("firmware request failed: %d\n", ret);
+ goto fail;
+@@ -1472,8 +1441,7 @@ static int brcmf_usb_reset_resume(struct
+
+ brcmf_dbg(USB, "Enter\n");
+
+- return brcmf_fw_get_firmwares(&usb->dev, 0,
+- brcmf_usb_get_fwname(devinfo), NULL,
++ return brcmf_fw_get_firmwares(&usb->dev, 0, devinfo->fw_name, NULL,
+ brcmf_usb_probe_phase2);
+ }
+
+@@ -1491,10 +1459,6 @@ static struct usb_device_id brcmf_usb_de
+ };
+
+ MODULE_DEVICE_TABLE(usb, brcmf_usb_devid_table);
+-MODULE_FIRMWARE(BRCMF_USB_43143_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_USB_43236_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_USB_43242_FW_NAME);
+-MODULE_FIRMWARE(BRCMF_USB_43569_FW_NAME);
+
+ static struct usb_driver brcmf_usbdrvr = {
+ .name = KBUILD_MODNAME,