-From 2339b9e476bfacce2621aa4949e082afa5b9bfa2 Mon Sep 17 00:00:00 2001
+From ab2ae6a53a33704e576384fd1d150a91561ea7d6 Mon Sep 17 00:00:00 2001
From: Hariprasad Shenai <hariprasad@chelsio.com>
-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 <hariprasad@chelsio.com>
---
- 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
/*
* 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.
+ *
+# 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;
+ 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