diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2011-09-27 13:30:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-27 13:30:27 -0400 |
commit | 04b71175f340d4081680440e1b9cbffcd3f4a13c (patch) | |
tree | 8b1b7c359a5cbb6537bf125652fde4f8a03a5f01 | |
parent | 8e7d3f681ef462e6aaa151f231310452dac409ca (diff) |
be2net: Show newly flashed FW ver in ethtool
This fix provides a newly flashed FW version (appended, in braces)
along with the currently running FW version via ethtool. The newly
flashed version runs only after a system reset.
Signed-off-by: Suresh Reddy <Suresh.Reddy@emulex.com>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 31 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 5 |
4 files changed, 33 insertions, 20 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 6bc07c7515b3..4b655b854073 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -1444,32 +1444,37 @@ err: | |||
1444 | spin_unlock_bh(&adapter->mcc_lock); | 1444 | spin_unlock_bh(&adapter->mcc_lock); |
1445 | } | 1445 | } |
1446 | 1446 | ||
1447 | /* Uses Mbox */ | 1447 | /* Uses synchronous mcc */ |
1448 | int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver) | 1448 | int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver, |
1449 | char *fw_on_flash) | ||
1449 | { | 1450 | { |
1450 | struct be_mcc_wrb *wrb; | 1451 | struct be_mcc_wrb *wrb; |
1451 | struct be_cmd_req_get_fw_version *req; | 1452 | struct be_cmd_req_get_fw_version *req; |
1452 | int status; | 1453 | int status; |
1453 | 1454 | ||
1454 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | 1455 | spin_lock_bh(&adapter->mcc_lock); |
1455 | return -1; | ||
1456 | 1456 | ||
1457 | wrb = wrb_from_mbox(adapter); | 1457 | wrb = wrb_from_mccq(adapter); |
1458 | req = embedded_payload(wrb); | 1458 | if (!wrb) { |
1459 | status = -EBUSY; | ||
1460 | goto err; | ||
1461 | } | ||
1459 | 1462 | ||
1463 | req = embedded_payload(wrb); | ||
1460 | be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, | 1464 | be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, |
1461 | OPCODE_COMMON_GET_FW_VERSION); | 1465 | OPCODE_COMMON_GET_FW_VERSION); |
1462 | |||
1463 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | 1466 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, |
1464 | OPCODE_COMMON_GET_FW_VERSION, sizeof(*req)); | 1467 | OPCODE_COMMON_GET_FW_VERSION, sizeof(*req)); |
1465 | 1468 | ||
1466 | status = be_mbox_notify_wait(adapter); | 1469 | status = be_mcc_notify_wait(adapter); |
1467 | if (!status) { | 1470 | if (!status) { |
1468 | struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb); | 1471 | struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb); |
1469 | strncpy(fw_ver, resp->firmware_version_string, FW_VER_LEN); | 1472 | strcpy(fw_ver, resp->firmware_version_string); |
1473 | if (fw_on_flash) | ||
1474 | strcpy(fw_on_flash, resp->fw_on_flash_version_string); | ||
1470 | } | 1475 | } |
1471 | 1476 | err: | |
1472 | mutex_unlock(&adapter->mbox_lock); | 1477 | spin_unlock_bh(&adapter->mcc_lock); |
1473 | return status; | 1478 | return status; |
1474 | } | 1479 | } |
1475 | 1480 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h index b61eac7ece35..abaa90cbfea2 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/drivers/net/ethernet/emulex/benet/be_cmds.h | |||
@@ -1444,7 +1444,8 @@ extern int be_cmd_get_stats(struct be_adapter *adapter, | |||
1444 | struct be_dma_mem *nonemb_cmd); | 1444 | struct be_dma_mem *nonemb_cmd); |
1445 | extern int lancer_cmd_get_pport_stats(struct be_adapter *adapter, | 1445 | extern int lancer_cmd_get_pport_stats(struct be_adapter *adapter, |
1446 | struct be_dma_mem *nonemb_cmd); | 1446 | struct be_dma_mem *nonemb_cmd); |
1447 | extern int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver); | 1447 | extern int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver, |
1448 | char *fw_on_flash); | ||
1448 | 1449 | ||
1449 | extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd); | 1450 | extern int be_cmd_modify_eqd(struct be_adapter *adapter, u32 eq_id, u32 eqd); |
1450 | extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, | 1451 | extern int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, |
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c index f144a6f99862..bf8153ea4ed8 100644 --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c | |||
@@ -118,14 +118,24 @@ static const char et_self_tests[][ETH_GSTRING_LEN] = { | |||
118 | #define BE_ONE_PORT_EXT_LOOPBACK 0x2 | 118 | #define BE_ONE_PORT_EXT_LOOPBACK 0x2 |
119 | #define BE_NO_LOOPBACK 0xff | 119 | #define BE_NO_LOOPBACK 0xff |
120 | 120 | ||
121 | static void | 121 | static void be_get_drvinfo(struct net_device *netdev, |
122 | be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) | 122 | struct ethtool_drvinfo *drvinfo) |
123 | { | 123 | { |
124 | struct be_adapter *adapter = netdev_priv(netdev); | 124 | struct be_adapter *adapter = netdev_priv(netdev); |
125 | char fw_on_flash[FW_VER_LEN]; | ||
126 | |||
127 | memset(fw_on_flash, 0 , sizeof(fw_on_flash)); | ||
128 | be_cmd_get_fw_ver(adapter, adapter->fw_ver, fw_on_flash); | ||
125 | 129 | ||
126 | strcpy(drvinfo->driver, DRV_NAME); | 130 | strcpy(drvinfo->driver, DRV_NAME); |
127 | strcpy(drvinfo->version, DRV_VER); | 131 | strcpy(drvinfo->version, DRV_VER); |
128 | strncpy(drvinfo->fw_version, adapter->fw_ver, FW_VER_LEN); | 132 | strncpy(drvinfo->fw_version, adapter->fw_ver, FW_VER_LEN); |
133 | if (memcmp(adapter->fw_ver, fw_on_flash, FW_VER_LEN) != 0) { | ||
134 | strcat(drvinfo->fw_version, " ["); | ||
135 | strcat(drvinfo->fw_version, fw_on_flash); | ||
136 | strcat(drvinfo->fw_version, "]"); | ||
137 | } | ||
138 | |||
129 | strcpy(drvinfo->bus_info, pci_name(adapter->pdev)); | 139 | strcpy(drvinfo->bus_info, pci_name(adapter->pdev)); |
130 | drvinfo->testinfo_len = 0; | 140 | drvinfo->testinfo_len = 0; |
131 | drvinfo->regdump_len = 0; | 141 | drvinfo->regdump_len = 0; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 2b7d1ba1e13b..1a7b24cc5da7 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2528,6 +2528,7 @@ static int be_setup(struct be_adapter *adapter) | |||
2528 | 2528 | ||
2529 | adapter->link_speed = -1; | 2529 | adapter->link_speed = -1; |
2530 | 2530 | ||
2531 | be_cmd_get_fw_ver(adapter, adapter->fw_ver, NULL); | ||
2531 | return 0; | 2532 | return 0; |
2532 | 2533 | ||
2533 | rx_qs_destroy: | 2534 | rx_qs_destroy: |
@@ -3147,10 +3148,6 @@ static int be_get_config(struct be_adapter *adapter) | |||
3147 | int status; | 3148 | int status; |
3148 | u8 mac[ETH_ALEN]; | 3149 | u8 mac[ETH_ALEN]; |
3149 | 3150 | ||
3150 | status = be_cmd_get_fw_ver(adapter, adapter->fw_ver); | ||
3151 | if (status) | ||
3152 | return status; | ||
3153 | |||
3154 | status = be_cmd_query_fw_cfg(adapter, &adapter->port_num, | 3151 | status = be_cmd_query_fw_cfg(adapter, &adapter->port_num, |
3155 | &adapter->function_mode, &adapter->function_caps); | 3152 | &adapter->function_mode, &adapter->function_caps); |
3156 | if (status) | 3153 | if (status) |