From patchwork Sat Jun 21 00:39:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Luis R. Rodriguez" X-Patchwork-Id: 362389 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 68C1B14008B for ; Sat, 21 Jun 2014 10:40:49 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758034AbaFUAj6 (ORCPT ); Fri, 20 Jun 2014 20:39:58 -0400 Received: from mail-pa0-f43.google.com ([209.85.220.43]:54526 "EHLO mail-pa0-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757980AbaFUAj5 (ORCPT ); Fri, 20 Jun 2014 20:39:57 -0400 Received: by mail-pa0-f43.google.com with SMTP id lf10so3664078pab.16 for ; Fri, 20 Jun 2014 17:39:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=cUJIPFo/9Q3J4ve85g3RXRtVU6uDvosAGjf2eG7OztE=; b=n7SKsDJ/2ZVs69f7TIGY6AE4J+ixxlkKQ1mSo+04KIG6zFE29uBnZv6mdhaMysMnUT ArBDvPnBEIfIDT/TCpK7e/lbmEdohCFst+dZZ9ywdFSG+NyuxYxvbyAn2rqA7yQeiYjS FMKk1OeecJsbdaNM1kv9cbV3axXxXoXvDndEtNqHVuy/W7d/ONm+r1EJFU0Jyhpcp0YW ItdaIMRyDHhgLn7MU+mvVlCZ6ovlAUnRs/A/NdVagMAKllWocMqkKMsIKNPjvrFq+zN/ AbCoi91myX22H1SY3jrXrZ/mlI+fVx3jP2wD7PzmTxQ90EUvyPPf+urlnfF0UASH2Q+o lhhw== X-Received: by 10.66.231.237 with SMTP id tj13mr9094541pac.136.1403311196607; Fri, 20 Jun 2014 17:39:56 -0700 (PDT) Received: from mcgrof@gmail.com (c-98-234-145-61.hsd1.ca.comcast.net. [98.234.145.61]) by mx.google.com with ESMTPSA id jt7sm15363715pbc.46.2014.06.20.17.39.53 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Fri, 20 Jun 2014 17:39:55 -0700 (PDT) Received: by mcgrof@gmail.com (sSMTP sendmail emulation); Fri, 20 Jun 2014 17:39:51 -0700 From: "Luis R. Rodriguez" To: hariprasad@chelsio.com, leedom@chelsio.com Cc: poswald@suse.com, santosh@chelsio.com, jcheung@suse.com, dchang@suse.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, mcgrof@suse.com Subject: [RFT 2/3] cxgb4: make configuration load use request_firmware_nowait() Date: Fri, 20 Jun 2014 17:39:40 -0700 Message-Id: <1403311181-9328-3-git-send-email-mcgrof@do-not-panic.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1403311181-9328-1-git-send-email-mcgrof@do-not-panic.com> References: <1403311181-9328-1-git-send-email-mcgrof@do-not-panic.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: "Luis R. Rodriguez" cxgb4 loading can take a while, this is part of the crusade to change it to be asynchronous. One more to go. Cc: Philip Oswald Cc: Santosh Rastapur Cc: Jeffrey Cheung Cc: David Chang Cc: Casey Leedom Cc: Hariprasad Shenai Signed-off-by: Luis R. Rodriguez --- drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | 4 + drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 113 +++++++++++++++--------- 2 files changed, 73 insertions(+), 44 deletions(-) diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index bcf9acf..1507dc2 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h @@ -650,6 +650,10 @@ struct adapter { struct completion flash_comp; int flash_comp_status; + + char fw_config_file[32]; + struct completion config_comp; + int config_comp_status; }; /* Defined bit width of user definable filter tuples diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 9cf6f3e..65e4124 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c @@ -4827,51 +4827,18 @@ static int adap_init0_tweaks(struct adapter *adapter) return 0; } -/* - * Attempt to initialize the adapter via a Firmware Configuration File. - */ -static int adap_init0_config(struct adapter *adapter, int reset) +static void cxgb4_config_complete(const struct firmware *cf, void *context) { - struct fw_caps_config_cmd caps_cmd; - const struct firmware *cf; + struct adapter *adapter = context; unsigned long mtype = 0, maddr = 0; u32 finiver, finicsum, cfcsum; - int ret; - int config_issued = 0; - char *fw_config_file, fw_config_file_path[256]; char *config_name = NULL; + struct fw_caps_config_cmd caps_cmd; + int config_issued = 0; + int ret = 0; + char fw_config_file_path[256]; - /* - * Reset device if necessary. - */ - if (reset) { - ret = t4_fw_reset(adapter, adapter->mbox, - PIORSTMODE | PIORST); - if (ret < 0) - goto bye; - } - - /* - * If we have a T4 configuration file under /lib/firmware/cxgb4/, - * then use that. Otherwise, use the configuration file stored - * in the adapter flash ... - */ - switch (CHELSIO_CHIP_VERSION(adapter->params.chip)) { - case CHELSIO_T4: - fw_config_file = FW4_CFNAME; - break; - case CHELSIO_T5: - fw_config_file = FW5_CFNAME; - break; - default: - dev_err(adapter->pdev_dev, "Device %d is not supported\n", - adapter->pdev->device); - ret = -EINVAL; - goto bye; - } - - ret = request_firmware(&cf, fw_config_file, adapter->pdev_dev); - if (ret < 0) { + if (!cf) { config_name = "On FLASH"; mtype = FW_MEMTYPE_CF_FLASH; maddr = t4_flash_cfg_addr(adapter); @@ -4879,7 +4846,7 @@ static int adap_init0_config(struct adapter *adapter, int reset) u32 params[7], val[7]; sprintf(fw_config_file_path, - "/lib/firmware/%s", fw_config_file); + "/lib/firmware/%s", adapter->fw_config_file); config_name = fw_config_file_path; if (cf->size >= FLASH_CFG_MAX_SIZE) @@ -4898,7 +4865,7 @@ static int adap_init0_config(struct adapter *adapter, int reset) * to write that out separately since we can't * guarantee that the bytes following the * residual byte in the buffer returned by - * request_firmware() are zeroed out ... + * request_firmware_nowait() are zeroed out ... */ size_t resid = cf->size & 0x3; size_t size = cf->size & ~0x3; @@ -5018,7 +4985,8 @@ static int adap_init0_config(struct adapter *adapter, int reset) dev_info(adapter->pdev_dev, "Successfully configured using Firmware "\ "Configuration File \"%s\", version %#x, computed checksum %#x\n", config_name, finiver, cfcsum); - return 0; + complete(&adapter->config_comp); + return; /* * Something bad happened. Return the error ... (If the "error" @@ -5026,10 +4994,67 @@ static int adap_init0_config(struct adapter *adapter, int reset) * want to issue a warning since this is fairly common.) */ bye: + adapter->flash_comp_status = ret; if (config_issued && ret != -ENOENT) dev_warn(adapter->pdev_dev, "\"%s\" configuration file error %d\n", config_name, -ret); - return ret; + complete(&adapter->config_comp); +} + +/* + * Attempt to initialize the adapter via a Firmware Configuration File. + */ +static int adap_init0_config(struct adapter *adapter, int reset) +{ + int ret; + + /* + * Reset device if necessary. + */ + if (reset) { + ret = t4_fw_reset(adapter, adapter->mbox, + PIORSTMODE | PIORST); + if (ret < 0) + return ret; + } + + /* + * If we have a T4 configuration file under /lib/firmware/cxgb4/, + * then use that. Otherwise, use the configuration file stored + * in the adapter flash ... + */ + switch (CHELSIO_CHIP_VERSION(adapter->params.chip)) { + case CHELSIO_T4: + snprintf(adapter->fw_config_file, + sizeof(adapter->fw_config_file), + "%s", FW4_CFNAME); + break; + case CHELSIO_T5: + snprintf(adapter->fw_config_file, + sizeof(adapter->fw_config_file), + "%s", FW5_CFNAME); + break; + default: + dev_err(adapter->pdev_dev, "Device %d is not supported\n", + adapter->pdev->device); + ret = -EINVAL; + return ret; + } + + init_completion(&adapter->config_comp); + adapter->config_comp_status = 0; + + ret = request_firmware_nowait(THIS_MODULE, 1, adapter->fw_config_file, + adapter->pdev_dev, GFP_KERNEL, + adapter, cxgb4_config_complete); + if (ret < 0) + return ret; + + wait_for_completion(&adapter->flash_comp); + if (adapter->config_comp_status != 0) + return adapter->config_comp_status; + + return 0; } /*