aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorHariprasad Shenai <hariprasad@chelsio.com>2014-10-14 16:24:14 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-14 16:55:06 -0400
commit22c0b963d7400971f4c5a1a67b083e3742996640 (patch)
treefe295e10c677b0a2d51afd4ceaef3c042fae45ab /drivers/net
parent6e36145d4ec754f4a8ce9d6912ca4d82ffb6ae3f (diff)
cxgb4: Fix FW flash logic using ethtool
Use t4_fw_upgrade instead of t4_load_fw to write firmware into FLASH, since t4_load_fw doesn't co-ordinate with the firmware and the adapter can get hosed enough to require a power cycle of the system. Based on original work by Casey Leedom <leedom@chelsio.com> Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4.h2
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c14
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_hw.c6
3 files changed, 16 insertions, 6 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 410ed5805a9a..3c481b260745 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -986,6 +986,8 @@ static inline int t4_memory_write(struct adapter *adap, int mtype, u32 addr,
986int t4_seeprom_wp(struct adapter *adapter, bool enable); 986int t4_seeprom_wp(struct adapter *adapter, bool enable);
987int get_vpd_params(struct adapter *adapter, struct vpd_params *p); 987int get_vpd_params(struct adapter *adapter, struct vpd_params *p);
988int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size); 988int t4_load_fw(struct adapter *adapter, const u8 *fw_data, unsigned int size);
989int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
990 const u8 *fw_data, unsigned int size, int force);
989unsigned int t4_flash_cfg_addr(struct adapter *adapter); 991unsigned int t4_flash_cfg_addr(struct adapter *adapter);
990int t4_get_fw_version(struct adapter *adapter, u32 *vers); 992int t4_get_fw_version(struct adapter *adapter, u32 *vers);
991int t4_get_tp_version(struct adapter *adapter, u32 *vers); 993int t4_get_tp_version(struct adapter *adapter, u32 *vers);
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 5b38e955af6e..fed8f26ee67b 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -2929,16 +2929,26 @@ static int set_flash(struct net_device *netdev, struct ethtool_flash *ef)
2929 int ret; 2929 int ret;
2930 const struct firmware *fw; 2930 const struct firmware *fw;
2931 struct adapter *adap = netdev2adap(netdev); 2931 struct adapter *adap = netdev2adap(netdev);
2932 unsigned int mbox = FW_PCIE_FW_MASTER_MASK + 1;
2932 2933
2933 ef->data[sizeof(ef->data) - 1] = '\0'; 2934 ef->data[sizeof(ef->data) - 1] = '\0';
2934 ret = request_firmware(&fw, ef->data, adap->pdev_dev); 2935 ret = request_firmware(&fw, ef->data, adap->pdev_dev);
2935 if (ret < 0) 2936 if (ret < 0)
2936 return ret; 2937 return ret;
2937 2938
2938 ret = t4_load_fw(adap, fw->data, fw->size); 2939 /* If the adapter has been fully initialized then we'll go ahead and
2940 * try to get the firmware's cooperation in upgrading to the new
2941 * firmware image otherwise we'll try to do the entire job from the
2942 * host ... and we always "force" the operation in this path.
2943 */
2944 if (adap->flags & FULL_INIT_DONE)
2945 mbox = adap->mbox;
2946
2947 ret = t4_fw_upgrade(adap, mbox, fw->data, fw->size, 1);
2939 release_firmware(fw); 2948 release_firmware(fw);
2940 if (!ret) 2949 if (!ret)
2941 dev_info(adap->pdev_dev, "loaded firmware %s\n", ef->data); 2950 dev_info(adap->pdev_dev, "loaded firmware %s,"
2951 " reload cxgb4 driver\n", ef->data);
2942 return ret; 2952 return ret;
2943} 2953}
2944 2954
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
index 1fff1495fe31..a9d9d74e4f09 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
@@ -37,8 +37,6 @@
37#include "t4_regs.h" 37#include "t4_regs.h"
38#include "t4fw_api.h" 38#include "t4fw_api.h"
39 39
40static int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
41 const u8 *fw_data, unsigned int size, int force);
42/** 40/**
43 * t4_wait_op_done_val - wait until an operation is completed 41 * t4_wait_op_done_val - wait until an operation is completed
44 * @adapter: the adapter performing the operation 42 * @adapter: the adapter performing the operation
@@ -3076,8 +3074,8 @@ static int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
3076 * positive errno indicates that the adapter is ~probably~ intact, a 3074 * positive errno indicates that the adapter is ~probably~ intact, a
3077 * negative errno indicates that things are looking bad ... 3075 * negative errno indicates that things are looking bad ...
3078 */ 3076 */
3079static int t4_fw_upgrade(struct adapter *adap, unsigned int mbox, 3077int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
3080 const u8 *fw_data, unsigned int size, int force) 3078 const u8 *fw_data, unsigned int size, int force)
3081{ 3079{
3082 const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data; 3080 const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
3083 int reset, ret; 3081 int reset, ret;