From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Mon, 8 Jun 2015 16:11:40 +0200 Subject: [PATCH] brcmfmac: register wiphy(s) during module_init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is needed by OpenWrt which expects all PHYs to be created after module loads successfully. Signed-off-by: Rafał Miłecki --- --- a/drivers/net/wireless/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c @@ -1236,6 +1236,7 @@ static int __init brcmfmac_module_init(v #endif if (!schedule_work(&brcmf_driver_work)) return -EBUSY; + flush_work(&brcmf_driver_work); return 0; } --- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c @@ -422,13 +422,14 @@ struct brcmf_fw { u16 bus_nr; void (*done)(struct device *dev, const struct firmware *fw, void *nvram_image, u32 nvram_len); + struct completion *completion; }; static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) { struct brcmf_fw *fwctx = ctx; #if IS_ENABLED(CONFIG_BCM47XX_NVRAM) - const u8 *bcm47xx_nvram = NULL; + u8 *bcm47xx_nvram = NULL; size_t bcm47xx_nvram_len; #endif const u8 *data = NULL; @@ -468,6 +469,8 @@ static void brcmf_fw_request_nvram_done( } fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); return; @@ -475,6 +478,8 @@ fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); release_firmware(fwctx->code); device_release_driver(fwctx->dev); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); } @@ -490,6 +495,8 @@ static void brcmf_fw_request_code_done(c /* only requested code so done here */ if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { fwctx->done(fwctx->dev, fw, NULL, 0); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); return; } @@ -504,6 +511,8 @@ static void brcmf_fw_request_code_done(c /* when nvram is optional call .done() callback here */ if (fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL) { fwctx->done(fwctx->dev, fw, NULL, 0); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); return; } @@ -513,6 +522,8 @@ static void brcmf_fw_request_code_done(c fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); device_release_driver(fwctx->dev); + if (fwctx->completion) + complete(fwctx->completion); kfree(fwctx); } @@ -524,6 +535,8 @@ int brcmf_fw_get_firmwares_pcie(struct d u16 domain_nr, u16 bus_nr) { struct brcmf_fw *fwctx; + struct completion completion; + int err; brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); if (!fw_cb || !code) @@ -544,9 +557,17 @@ int brcmf_fw_get_firmwares_pcie(struct d fwctx->domain_nr = domain_nr; fwctx->bus_nr = bus_nr; - return request_firmware_nowait(THIS_MODULE, true, code, dev, + init_completion(&completion); + fwctx->completion = &completion; + + err = request_firmware_nowait(THIS_MODULE, true, code, dev, GFP_KERNEL, fwctx, brcmf_fw_request_code_done); + if (!err) + wait_for_completion_timeout(fwctx->completion, + msecs_to_jiffies(5000)); + fwctx->completion = NULL; + return err; } int brcmf_fw_get_firmwares(struct device *dev, u16 flags,