From 1211c627df6f1c9bdb6482abf6dfaaf571b7381c Mon Sep 17 00:00:00 2001 From: Newbyte Date: Mon, 12 Jul 2021 11:09:00 +0200 Subject: [PATCH] main/linux-postmarketos-stericsson: upgrade to 5.14-rc1 (MR 2340) And also add a patch to fix firmware loading. --- main/linux-postmarketos-stericsson/APKBUILD | 10 +- .../config-postmarketos-stericsson.armv7 | 59 +++++++-- .../firmware.patch | 116 ++++++++++++++++++ 3 files changed, 172 insertions(+), 13 deletions(-) create mode 100644 main/linux-postmarketos-stericsson/firmware.patch diff --git a/main/linux-postmarketos-stericsson/APKBUILD b/main/linux-postmarketos-stericsson/APKBUILD index 42f9599ab..32ff06b9f 100644 --- a/main/linux-postmarketos-stericsson/APKBUILD +++ b/main/linux-postmarketos-stericsson/APKBUILD @@ -4,9 +4,9 @@ _flavor="postmarketos-stericsson" _config="config-$_flavor.armv7" pkgname=linux-$_flavor -pkgver=5.13 +pkgver=5.14_rc1 pkgrel=0 -_tag="5.13" +_tag="5.14-rc1" pkgdesc="Mainline kernel fork for ST-Ericsson NovaThor devices" arch="armv7" _carch="arm" @@ -20,6 +20,7 @@ source=" config-$_flavor.armv7 bl.patch emmc.patch + firmware.patch panel.patch regulators.patch " @@ -50,10 +51,11 @@ package() { } sha512sums=" -6d70f9e4599abde63a5052541e2bd1c483e41be6504f859c26ad398501d82f036191954c1eb06b43b80d3409aeb1bba172d6728901bc72413fe75ea971a541d1 linux-postmarketos-stericsson-5.13.tar.gz -00c384b6c4cc2f7dd586b2c9463e898bf0634510fcc025a7efa3dfd189f75af92b690b022fced5ac40d1dc0e6f083fe037caa5dc5e82476d4e7db9b574818450 config-postmarketos-stericsson.armv7 +5effe0dfa535cd19e5e2519f192801ecc8523c828d8d10035880fd01129fb8dd6354b4a5c4a59aa1cec3333c3717d7492d3b7881c55c8bb6e1f51e9f313c7e58 linux-postmarketos-stericsson-5.14-rc1.tar.gz +8642ccb45d3a76e85873440db3938040ad387dec2ab9e72a28989f4955a2795e5ff42564ffe774fba3a292301f75a0a63cc766ee86ef0f53c4db2850de84d3f3 config-postmarketos-stericsson.armv7 66ec2d3105540e991bccc8cfb0e4212cb40a31a5a35e8cdc084b8bd7ffa016a86b3b340fd57b077b3c95b5bcb1e80cadaa11e71cd1a54a3e0e595024f3f27346 bl.patch 760afb46cf56a97b9a9a61fabd5c686c7b98bd64864774516099ad57a7c34d146a16d7ce4687b6071c3fd2df307e7f184428924569e0e767f3c80b780720d85b emmc.patch +8c12e75094fde3fe50318cc478afdb2ed304ad682172e30b64ac27d536d8ccba2b6a364e62b4028e9c9ea7863e43f36dc6e3d466b29199d260d86a5995d224a1 firmware.patch 1d4d549c5a8c8bda8eec814cd8632626f16d273d775f082028d15db7a330e0c01b2999668b0963eaeb06410de0c14d1d4c3344ac92a228da9392dba33562dcac panel.patch 8206d74c52328827502a32644f70fd149a72a78aaf936cd44f474b9153e8caccf73206df76e24004329edebab90e1a4a0e965630f4817aa5dd642d9ee2729295 regulators.patch " diff --git a/main/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 b/main/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 index 89279022f..854dc48ba 100644 --- a/main/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 +++ b/main/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.13.0 Kernel Configuration +# Linux/arm 5.14.0-rc1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="armv7-alpine-linux-musleabihf-gcc (Alpine 10.3.1_git20210625) 10.3.1 20210625" CONFIG_CC_IS_GCC=y @@ -13,6 +13,7 @@ CONFIG_LD_VERSION=23502 CONFIG_LLD_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y @@ -722,7 +723,6 @@ CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y -CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_ARCH_KEEP_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_SPLIT_PTLOCK_CPUS=4 @@ -740,7 +740,6 @@ CONFIG_CMA=y # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=7 # CONFIG_ZPOOL is not set -# CONFIG_ZBUD is not set # CONFIG_ZSMALLOC is not set CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_IDLE_PAGE_TRACKING is not set @@ -1295,10 +1294,12 @@ CONFIG_FIXED_PHY=y # CONFIG_MARVELL_PHY is not set # CONFIG_MARVELL_10G_PHY is not set # CONFIG_MARVELL_88X2222_PHY is not set +# CONFIG_MEDIATEK_GE_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_MICROCHIP_T1_PHY is not set # CONFIG_MICROSEMI_PHY is not set +# CONFIG_MOTORCOMM_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set @@ -1320,6 +1321,7 @@ CONFIG_SMSC_PHY=y # CONFIG_MICREL_KS8995MA is not set CONFIG_MDIO_DEVICE=y CONFIG_MDIO_BUS=y +CONFIG_FWNODE_MDIO=y CONFIG_OF_MDIO=y CONFIG_MDIO_DEVRES=y # CONFIG_MDIO_BITBANG is not set @@ -1401,7 +1403,13 @@ CONFIG_WLAN_VENDOR_QUANTENNA=y # CONFIG_MAC80211_HWSIM is not set # CONFIG_VIRT_WIFI is not set # CONFIG_WAN is not set + +# +# Wireless WAN +# # CONFIG_WWAN is not set +# end of Wireless WAN + # CONFIG_NETDEVSIM is not set # CONFIG_NET_FAILOVER is not set # CONFIG_ISDN is not set @@ -1644,7 +1652,6 @@ CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_CCTRNG is not set # CONFIG_HW_RANDOM_XIPHERA is not set CONFIG_DEVMEM=y -# CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set # end of Character devices @@ -1902,6 +1909,7 @@ CONFIG_POWER_SUPPLY_HWMON=y # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_AB8500_BM is not set # CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set @@ -2013,6 +2021,7 @@ CONFIG_SENSORS_NTC_THERMISTOR=y # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set @@ -2077,6 +2086,7 @@ CONFIG_WATCHDOG_CORE=y CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y CONFIG_WATCHDOG_OPEN_TIMEOUT=0 # CONFIG_WATCHDOG_SYSFS is not set +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set # # Watchdog Pretimeout Governors @@ -2157,6 +2167,7 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_PM8XXX is not set +# CONFIG_MFD_RT4831 is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RC5T583 is not set # CONFIG_MFD_RK808 is not set @@ -2222,6 +2233,7 @@ CONFIG_MFD_TC3589X=y # CONFIG_MFD_STPMIC1 is not set # CONFIG_MFD_STMFX is not set # CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC is not set # end of Multifunction device drivers @@ -2254,6 +2266,7 @@ CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_MAX1586 is not set # CONFIG_REGULATOR_MAX8649 is not set # CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8893 is not set # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set # CONFIG_REGULATOR_MAX77826 is not set @@ -2271,6 +2284,8 @@ CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_PV88090 is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set # CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTMV20 is not set # CONFIG_REGULATOR_SLG51000 is not set # CONFIG_REGULATOR_SY8106A is not set @@ -2313,6 +2328,7 @@ CONFIG_VIDEO_V4L2_SUBDEV_API=y # CONFIG_VIDEO_ADV_DEBUG is not set # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set CONFIG_V4L2_FLASH_LED_CLASS=y +CONFIG_V4L2_ASYNC=y # end of Video4Linux options # @@ -2347,6 +2363,7 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # Camera sensor devices # # CONFIG_VIDEO_HI556 is not set +# CONFIG_VIDEO_IMX208 is not set # CONFIG_VIDEO_IMX214 is not set # CONFIG_VIDEO_IMX219 is not set # CONFIG_VIDEO_IMX258 is not set @@ -2441,7 +2458,6 @@ CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DEBUG_MM is not set # CONFIG_DRM_DEBUG_SELFTEST is not set CONFIG_DRM_KMS_HELPER=y -CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_FBDEV_OVERALLOC=100 # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set @@ -2559,6 +2575,7 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_LONTIUM_LT8912B is not set # CONFIG_DRM_LONTIUM_LT9611 is not set # CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_ITE_IT66121 is not set # CONFIG_DRM_LVDS_CODEC is not set # CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set # CONFIG_DRM_NWL_MIPI_DSI is not set @@ -2576,6 +2593,7 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_TOSHIBA_TC358768 is not set # CONFIG_DRM_TOSHIBA_TC358775 is not set # CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI83 is not set # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_ANALOGIX_ANX6345 is not set @@ -2589,6 +2607,7 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_ARCPGU is not set +# CONFIG_DRM_SIMPLEDRM is not set # CONFIG_TINYDRM_HX8357D is not set # CONFIG_TINYDRM_ILI9225 is not set # CONFIG_TINYDRM_ILI9341 is not set @@ -2832,6 +2851,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_RK3328 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5640 is not set # CONFIG_SND_SOC_RT5659 is not set # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set @@ -2854,6 +2874,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_TAS6424 is not set # CONFIG_SND_SOC_TDA7419 is not set # CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TFA989X is not set # CONFIG_SND_SOC_TLV320AIC23_I2C is not set # CONFIG_SND_SOC_TLV320AIC23_SPI is not set # CONFIG_SND_SOC_TLV320AIC31XX is not set @@ -3414,9 +3435,17 @@ CONFIG_VHOST_MENU=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_HAVE_CLK=y -CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y + +# +# Clock driver for ARM Reference designs +# +# CONFIG_ICST is not set +# CONFIG_CLK_SP810 is not set +# end of Clock driver for ARM Reference designs + +# CONFIG_LMK04832 is not set # CONFIG_COMMON_CLK_MAX9485 is not set # CONFIG_COMMON_CLK_SI5341 is not set # CONFIG_COMMON_CLK_SI5351 is not set @@ -3584,6 +3613,8 @@ CONFIG_BMC150_ACCEL_SPI=y # CONFIG_DMARD06 is not set # CONFIG_DMARD09 is not set # CONFIG_DMARD10 is not set +# CONFIG_FXLS8962AF_I2C is not set +# CONFIG_FXLS8962AF_SPI is not set CONFIG_IIO_ST_ACCEL_3AXIS=y CONFIG_IIO_ST_ACCEL_I2C_3AXIS=y CONFIG_IIO_ST_ACCEL_SPI_3AXIS=y @@ -3599,6 +3630,7 @@ CONFIG_IIO_ST_ACCEL_SPI_3AXIS=y # CONFIG_MXC4005 is not set # CONFIG_MXC6255 is not set # CONFIG_SCA3000 is not set +# CONFIG_SCA3300 is not set # CONFIG_STK8312 is not set # CONFIG_STK8BA50 is not set # end of Accelerometers @@ -3662,6 +3694,7 @@ CONFIG_AB8500_GPADC=y # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set # CONFIG_TI_TLC4541 is not set +# CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set # CONFIG_XILINX_XADC is not set # end of Analog to digital converters @@ -3696,7 +3729,8 @@ CONFIG_IIO_RESCALE=y # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set # CONFIG_SENSIRION_SGP30 is not set -# CONFIG_SPS30 is not set +# CONFIG_SPS30_I2C is not set +# CONFIG_SPS30_SERIAL is not set # CONFIG_VZ89X is not set # end of Chemical Sensors @@ -3847,6 +3881,7 @@ CONFIG_INV_MPU6050_IIO=y CONFIG_INV_MPU6050_I2C=y # CONFIG_INV_MPU6050_SPI is not set # CONFIG_IIO_ST_LSM6DSX is not set +# CONFIG_IIO_ST_LSM9DS0 is not set # end of Inertial measurement units # @@ -3888,6 +3923,7 @@ CONFIG_GP2AP002=y # CONFIG_TCS3472 is not set # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set +# CONFIG_TSL2591 is not set # CONFIG_TSL2772 is not set # CONFIG_TSL4531 is not set # CONFIG_US5182D is not set @@ -4025,6 +4061,7 @@ CONFIG_IIO_ST_PRESS_SPI=y # CONFIG_MLX90632 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set +# CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX31856 is not set @@ -4048,6 +4085,7 @@ CONFIG_ARM_GIC_MAX_NR=1 # PHY Subsystem # # CONFIG_GENERIC_PHY is not set +# CONFIG_PHY_CAN_TRANSCEIVER is not set # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_CADENCE_TORRENT is not set # CONFIG_PHY_CADENCE_DPHY is not set @@ -4568,6 +4606,8 @@ CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y +CONFIG_STACKDEPOT=y +CONFIG_STACK_HASH_ORDER=20 CONFIG_SBITMAP=y # CONFIG_STRING_SELFTEST is not set # end of Library routines @@ -4583,6 +4623,7 @@ CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y # CONFIG_PRINTK_TIME=y # CONFIG_PRINTK_CALLER is not set +# CONFIG_STACKTRACE_BUILD_ID is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -4705,7 +4746,7 @@ CONFIG_LOCK_DEBUGGING_SUPPORT=y # end of Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_IRQFLAGS is not set -# CONFIG_STACKTRACE is not set +CONFIG_STACKTRACE=y # CONFIG_WARN_ALL_UNSEEDED_RANDOM is not set # CONFIG_DEBUG_KOBJECT is not set @@ -4783,7 +4824,6 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set -# CONFIG_TEST_LIST_SORT is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_SORT is not set # CONFIG_TEST_DIV64 is not set @@ -4798,6 +4838,7 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set +# CONFIG_TEST_SCANF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_XARRAY is not set diff --git a/main/linux-postmarketos-stericsson/firmware.patch b/main/linux-postmarketos-stericsson/firmware.patch new file mode 100644 index 000000000..96379626b --- /dev/null +++ b/main/linux-postmarketos-stericsson/firmware.patch @@ -0,0 +1,116 @@ +After some crashes in the 3D engine (!) on the Samsung GT-I8530 +it turns out that the main firmware file can be device dependent, +something that was previously only handled for the NVRAM +parameter file. + +Rewrite the code a bit so we can a per-board suffixed firmware +binary as well, if this does not exist we fall back to the +canonical firmware name. + +Example: a 4330 device with the OF board compatible is +"samsung,gavini". We will first try +"brcmfmac4330-sdio.samsung,gavini.bin" then "brcmfmac4330-sdio.bin" +if that does not work. + +Cc: phone-devel@vger.kernel.org +Cc: newbyte@disroot.org +Cc: Stephan Gerhold +Signed-off-by: Linus Walleij +--- + .../broadcom/brcm80211/brcmfmac/firmware.c | 53 +++++++++++++++---- + 1 file changed, 42 insertions(+), 11 deletions(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c +index d40104b8df55..adfdfc654b10 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c +@@ -594,28 +594,47 @@ static int brcmf_fw_complete_request(const struct firmware *fw, + return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret; + } + ++static char *brcm_alt_fw_path(const char *path, const char *board_type) ++{ ++ char alt_path[BRCMF_FW_NAME_LEN]; ++ char suffix[5]; ++ ++ strscpy(alt_path, path, BRCMF_FW_NAME_LEN); ++ /* At least one character + suffix */ ++ if (strlen(alt_path) < 5) ++ return NULL; ++ ++ /* strip .txt or .bin at the end */ ++ strscpy(suffix, alt_path + strlen(alt_path) - 4, 5); ++ alt_path[strlen(alt_path) - 4] = 0; ++ strlcat(alt_path, ".", BRCMF_FW_NAME_LEN); ++ strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN); ++ strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN); ++ ++ return kstrdup(alt_path, GFP_KERNEL); ++} ++ + static int brcmf_fw_request_firmware(const struct firmware **fw, + struct brcmf_fw *fwctx) + { + struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos]; + int ret; + +- /* nvram files are board-specific, first try a board-specific path */ ++ /* Files can be board-specific, first try a board-specific path */ + if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) { +- char alt_path[BRCMF_FW_NAME_LEN]; ++ char *alt_path; + +- strlcpy(alt_path, cur->path, BRCMF_FW_NAME_LEN); +- /* strip .txt at the end */ +- alt_path[strlen(alt_path) - 4] = 0; +- strlcat(alt_path, ".", BRCMF_FW_NAME_LEN); +- strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN); +- strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN); ++ alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type); ++ if (!alt_path) ++ goto fallback; + + ret = request_firmware(fw, alt_path, fwctx->dev); ++ kfree(alt_path); + if (ret == 0) + return ret; + } + ++fallback: + return request_firmware(fw, cur->path, fwctx->dev); + } + +@@ -660,6 +679,7 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req, + { + struct brcmf_fw_item *first = &req->items[0]; + struct brcmf_fw *fwctx; ++ char *alt_path; + int ret; + + brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); +@@ -677,9 +697,20 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req, + fwctx->req = req; + fwctx->done = fw_cb; + +- ret = request_firmware_nowait(THIS_MODULE, true, first->path, +- fwctx->dev, GFP_KERNEL, fwctx, +- brcmf_fw_request_done); ++ /* First try alternative board-specific path if any */ ++ alt_path = brcm_alt_fw_path(first->path, fwctx->req->board_type); ++ if (alt_path) { ++ ret = request_firmware_nowait(THIS_MODULE, true, alt_path, ++ fwctx->dev, GFP_KERNEL, fwctx, ++ brcmf_fw_request_done); ++ kfree(alt_path); ++ } ++ /* Else try canonical path */ ++ if (ret) { ++ ret = request_firmware_nowait(THIS_MODULE, true, first->path, ++ fwctx->dev, GFP_KERNEL, fwctx, ++ brcmf_fw_request_done); ++ } + if (ret < 0) + brcmf_fw_request_done(NULL, fwctx); + +-- +2.31.1