From cae33eaa2edb22252ccd33ff7cc92442c1693a9b Mon Sep 17 00:00:00 2001 From: Hariprasad Shenai Date: Tue, 22 Apr 2014 08:51:36 -0500 Subject: [PATCH] cxgb4: Fix fw flash. Fixed the flash patch to always load the latest FW, be it from /lib/firmware -or- that which is bound into the driver. Signed-off-by: Hariprasad Shenai Signed-off-by: Steve Wise --- ...4-Adds-embedded-FW-support-for-T4-T5.patch | 110 +++++++++++------- 1 file changed, 67 insertions(+), 43 deletions(-) diff --git a/linux-next-pending/0022-cxgb4-Adds-embedded-FW-support-for-T4-T5.patch b/linux-next-pending/0022-cxgb4-Adds-embedded-FW-support-for-T4-T5.patch index 1464774..a089153 100644 --- a/linux-next-pending/0022-cxgb4-Adds-embedded-FW-support-for-T4-T5.patch +++ b/linux-next-pending/0022-cxgb4-Adds-embedded-FW-support-for-T4-T5.patch @@ -1,50 +1,38 @@ -From 2339b9e476bfacce2621aa4949e082afa5b9bfa2 Mon Sep 17 00:00:00 2001 +From ab2ae6a53a33704e576384fd1d150a91561ea7d6 Mon Sep 17 00:00:00 2001 From: Hariprasad Shenai -Date: Fri, 21 Feb 2014 12:31:00 +0530 -Subject: [PATCH] cxgb4:Adds embedded FW support for T4/T5 +Date: Fri, 18 Apr 2014 07:52:31 +0530 +Subject: [PATCH] patches: Adds support for embedded FW Signed-off-by: Hariprasad Shenai --- - drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 28 +- - drivers/net/ethernet/chelsio/cxgb4/t4_firmware.h | 82 + + drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 43 +- + drivers/net/ethernet/chelsio/cxgb4/t4_firmware.h | 76 + drivers/net/ethernet/chelsio/cxgb4/t4fw.txt | 30432 +++++++++++++++++++++ drivers/net/ethernet/chelsio/cxgb4/t5fw.txt | 30080 ++++++++++++++++++++ - 4 files changed, 60619 insertions(+), 3 deletions(-) + 4 files changed, 60626 insertions(+), 5 deletions(-) create mode 100644 drivers/net/ethernet/chelsio/cxgb4/t4_firmware.h create mode 100644 drivers/net/ethernet/chelsio/cxgb4/t4fw.txt create mode 100644 drivers/net/ethernet/chelsio/cxgb4/t5fw.txt diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c -index 4660f55..dae1959 100644 +index 6b90eae..13152b5 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c -@@ -68,6 +68,7 @@ +@@ -69,6 +69,7 @@ #include "t4_msg.h" #include "t4fw_api.h" #include "l2t.h" +#include "t4_firmware.h" - #include <../drivers/net/bonding/bonding.h> - -@@ -5135,6 +5136,27 @@ static struct fw_info *find_fw_info(int chip) + #ifdef DRV_VERSION + #undef DRV_VERSION +@@ -5260,12 +5261,21 @@ static struct fw_info *find_fw_info(int chip) return NULL; } -+static void t4_release_firmware(const struct firmware *fw) -+{ -+ if (!t4_local_firmware_free(fw)) -+ return; -+ release_firmware(fw); -+} -+ +static int t4_request_firmware(const struct firmware **firmware, -+ const char *name, enum chip_type chip, -+ struct device *dev) ++ enum chip_type chip) +{ -+ /* first check if there is firmware on the filesystem */ -+ if (!request_firmware(firmware, name, dev)) -+ return 0; -+ + if (is_t4(chip)) + return t4_local_firmware_load(firmware); + else @@ -54,32 +42,74 @@ index 4660f55..dae1959 100644 /* * Phase 0 of initialization: contact FW, obtain config, perform basic init. */ -@@ -5198,8 +5220,8 @@ static int adap_init0(struct adapter *adap) - card_fw = t4_alloc_mem(sizeof(*card_fw)); + static int adap_init0(struct adapter *adap) + { +- int ret; ++ int ret, rc; + u32 v, port_vec; + enum dev_state state; + u32 params[7], val[7]; +@@ -5302,7 +5312,7 @@ static int adap_init0(struct adapter *adap) + if ((adap->flags & MASTER_PF) && state != DEV_STATE_INIT) { + struct fw_info *fw_info; + struct fw_hdr *card_fw; +- const struct firmware *fw; ++ const struct firmware *fw, *bfw; + const u8 *fw_data = NULL; + unsigned int fw_size = 0; +@@ -5325,13 +5335,34 @@ static int adap_init0(struct adapter *adap) /* Get FW from from /lib/firmware/ */ -- ret = request_firmware(&fw, fw_info->fw_mod_name, -- adap->pdev_dev); -+ ret = t4_request_firmware(&fw, fw_info->fw_mod_name, -+ adap->params.chip, adap->pdev_dev); - if (ret < 0) { + ret = request_firmware(&fw, fw_info->fw_mod_name, + adap->pdev_dev); +- if (ret < 0) { ++ ret = t4_request_firmware(&bfw, adap->params.chip); ++ if (ret < 0 && rc < 0) { dev_err(adap->pdev_dev, "unable to load firmware image %s, error %d\n", -@@ -5215,7 +5237,7 @@ static int adap_init0(struct adapter *adap) + fw_info->fw_mod_name, ret); +- } else { ++ } else if (ret < 0) { ++ fw_data = bfw->data; ++ fw_size = bfw->size; ++ } else if (rc < 0) { + fw_data = fw->data; + fw_size = fw->size; ++ } else { ++ const struct fw_hdr *fs_fw; ++ const struct fw_hdr *bnd_fw; ++ int f, b; ++ ++ fs_fw = (const void *)fw->data; ++ bnd_fw = (const void *)bfw->data; ++ f = be32_to_cpu(fs_fw->fw_ver); ++ b = be32_to_cpu(bnd_fw->fw_ver); ++ ++ if (f > b) { ++ fw_data = fw->data; ++ fw_size = fw->size; ++ } else { ++ fw_data = bfw->data; ++ fw_size = bfw->size; ++ } + } + /* upgrade FW logic */ +@@ -5340,6 +5371,8 @@ static int adap_init0(struct adapter *adap) /* Cleaning up */ if (fw != NULL) -- release_firmware(fw); -+ t4_release_firmware(fw); + release_firmware(fw); ++ if (bfw != NULL) ++ kfree(bfw); t4_free_mem(card_fw); if (ret < 0) diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_firmware.h b/drivers/net/ethernet/chelsio/cxgb4/t4_firmware.h new file mode 100644 -index 0000000..d9969cf +index 0000000..4b51301 --- /dev/null +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_firmware.h -@@ -0,0 +1,82 @@ +@@ -0,0 +1,76 @@ +/* + * Copyright (c) 2013-2014 Chelsio, Inc. All rights reserved. + * @@ -125,12 +155,6 @@ index 0000000..d9969cf +# include "./t5fw.txt" +}; + -+static inline int t4_local_firmware_free(const struct firmware *firmware) -+{ -+ kfree(firmware); -+ return 0; -+} -+ +static inline int t4_local_firmware_load(const struct firmware **firmware) +{ + struct firmware *fw; @@ -60687,5 +60711,5 @@ index 0000000..a886e89 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -- -1.8.0 +1.8.4 -- 2.41.0