From patchwork Sun May 31 22:08:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= X-Patchwork-Id: 478742 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from arrakis.dune.hu (arrakis.dune.hu [78.24.191.176]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3C6FB140F8A for ; Mon, 1 Jun 2015 08:08:43 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=F/L5xC3e; dkim-atps=neutral Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id EA83D281584; Mon, 1 Jun 2015 00:07:01 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on arrakis.dune.hu X-Spam-Level: X-Spam-Status: No, score=-1.2 required=5.0 tests=BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, T_DKIM_INVALID autolearn=no version=3.3.2 Received: from arrakis.dune.hu (localhost [127.0.0.1]) by arrakis.dune.hu (Postfix) with ESMTP id EB4B52800D6 for ; Mon, 1 Jun 2015 00:06:58 +0200 (CEST) X-policyd-weight: using cached result; rate: -8.5 Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by arrakis.dune.hu (Postfix) with ESMTPS for ; Mon, 1 Jun 2015 00:06:58 +0200 (CEST) Received: by wicmx19 with SMTP id mx19so59695993wic.0 for ; Sun, 31 May 2015 15:08:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:mime-version:content-type :content-transfer-encoding; bh=mifPzJHkEsUD0JCDHd+rbH8FwjGlK0jB1Z21qr/DS2U=; b=F/L5xC3eEf4L+AJDYOBfkHJOZzEqOZUaS5POKJChcZUI1uxQ7KvaOdelb4hzERI+EP 4Q9QKcZ7DG3xMHAO+DOWsyZP17BiY8AA+HFRpy3+UxWxUMVcMR+MB1pff3nvD7UoJQ4q uVCoDVJeiBVkFX76uH/SLhfO+aduytJZDDSi639OrjtYzCzYqYEFGIr3V0HsDOxEqfpd 1ODHjYz+V2eCMf0qMqx3CMt0+FPpHDYl4NVPTHevb4ByeHnMvPmskIkpp4HsPpjMS4Of DFx8L9bwQHIdg1j8TnqV265XxVNBGqRKcaYn/PPCfzoT80eFnuzzasFShueiDFAbJR5r VX2w== X-Received: by 10.180.107.38 with SMTP id gz6mr14945853wib.63.1433110109885; Sun, 31 May 2015 15:08:29 -0700 (PDT) Received: from linux-tdhb.lan (ip-194-187-74-233.konfederacka.maverick.com.pl. [194.187.74.233]) by mx.google.com with ESMTPSA id q4sm2777649wju.14.2015.05.31.15.08.28 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 31 May 2015 15:08:28 -0700 (PDT) From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= To: openwrt-devel@lists.openwrt.org, Felix Fietkau Date: Mon, 1 Jun 2015 00:08:21 +0200 Message-Id: <1433110101-21688-1-git-send-email-zajec5@gmail.com> X-Mailer: git-send-email 1.8.4.5 MIME-Version: 1.0 Subject: [OpenWrt-Devel] [PATCH RFC] brcmfmac: register wiphy(s) during module_init X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: openwrt-devel-bounces@lists.openwrt.org Sender: "openwrt-devel" This is needed by OpenWrt which expects all PHYs to be created after module loads successfully. Signed-off-by: Rafał Miłecki --- drivers/net/wireless/brcm80211/brcmfmac/core.c | 1 + drivers/net/wireless/brcm80211/brcmfmac/firmware.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.c b/drivers/net/wireless/brcm80211/brcmfmac/core.c index 538d695..c436cc8 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c @@ -1189,6 +1189,7 @@ static int __init brcmfmac_module_init(void) #endif if (!schedule_work(&brcmf_driver_work)) return -EBUSY; + flush_work(&brcmf_driver_work); return 0; } diff --git a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c index fdafa79..b6de504 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c @@ -419,6 +419,7 @@ 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) @@ -440,6 +441,7 @@ static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) } fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); + complete(&fwctx->completion); kfree(fwctx); return; @@ -462,6 +464,7 @@ static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx) /* only requested code so done here */ if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { fwctx->done(fwctx->dev, fw, NULL, 0); + complete(&fwctx->completion); kfree(fwctx); return; } @@ -476,6 +479,7 @@ static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx) /* when nvram is optional call .done() callback here */ if (fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL) { fwctx->done(fwctx->dev, fw, NULL, 0); + complete(&fwctx->completion); kfree(fwctx); return; } @@ -485,6 +489,7 @@ static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx) fail: brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); device_release_driver(fwctx->dev); + complete(&fwctx->completion); kfree(fwctx); } @@ -496,6 +501,7 @@ int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags, u16 domain_nr, u16 bus_nr) { struct brcmf_fw *fwctx; + int err; brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); if (!fw_cb || !code) @@ -515,10 +521,15 @@ int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags, fwctx->nvram_name = nvram; fwctx->domain_nr = domain_nr; fwctx->bus_nr = bus_nr; + init_completion(&fwctx->completion); - return request_firmware_nowait(THIS_MODULE, true, code, dev, + 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)); + return err; } int brcmf_fw_get_firmwares(struct device *dev, u16 flags,