]> git.openfabrics.org - ~emulex/for-vlad/compat-rdma.git/commitdiff
cxgb4: Fix fw flash.
authorHariprasad Shenai <hariprasad@chelsio.com>
Tue, 22 Apr 2014 13:51:36 +0000 (08:51 -0500)
committerSteve Wise <swise@opengridcomputing.com>
Tue, 22 Apr 2014 13:51:36 +0000 (08:51 -0500)
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 <hariprasad@chelsio.com>
Signed-off-by: Steve Wise <swise@opengridcomputing.com>
linux-next-pending/0022-cxgb4-Adds-embedded-FW-support-for-T4-T5.patch

index 146477455e0ce5396067404e294a5ea48c40ca5c..a0891539288617b724edc40c83c305b4cabf2cac 100644 (file)
@@ -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 <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
@@ -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