Commit cfec0cbc authored by Ron Mercer's avatar Ron Mercer Committed by David S. Miller

qlge: Add support for retrieving firmware version.

This is used by driver banner and ethtool info.
Signed-off-by: default avatarRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0808dc80
...@@ -1430,6 +1430,7 @@ struct ql_adapter { ...@@ -1430,6 +1430,7 @@ struct ql_adapter {
/* Hardware information */ /* Hardware information */
u32 chip_rev_id; u32 chip_rev_id;
u32 fw_rev_id;
u32 func; /* PCI function for this adapter */ u32 func; /* PCI function for this adapter */
spinlock_t adapter_lock; spinlock_t adapter_lock;
...@@ -1580,6 +1581,7 @@ void ql_mpi_idc_work(struct work_struct *work); ...@@ -1580,6 +1581,7 @@ void ql_mpi_idc_work(struct work_struct *work);
void ql_mpi_port_cfg_work(struct work_struct *work); void ql_mpi_port_cfg_work(struct work_struct *work);
int ql_mb_get_fw_state(struct ql_adapter *qdev); int ql_mb_get_fw_state(struct ql_adapter *qdev);
int ql_cam_route_initialize(struct ql_adapter *qdev); int ql_cam_route_initialize(struct ql_adapter *qdev);
int ql_mb_about_fw(struct ql_adapter *qdev);
#if 1 #if 1
#define QL_ALL_DUMP #define QL_ALL_DUMP
......
...@@ -293,7 +293,10 @@ static void ql_get_drvinfo(struct net_device *ndev, ...@@ -293,7 +293,10 @@ static void ql_get_drvinfo(struct net_device *ndev,
struct ql_adapter *qdev = netdev_priv(ndev); struct ql_adapter *qdev = netdev_priv(ndev);
strncpy(drvinfo->driver, qlge_driver_name, 32); strncpy(drvinfo->driver, qlge_driver_name, 32);
strncpy(drvinfo->version, qlge_driver_version, 32); strncpy(drvinfo->version, qlge_driver_version, 32);
strncpy(drvinfo->fw_version, "N/A", 32); snprintf(drvinfo->fw_version, 32, "v%d.%d.%d",
(qdev->fw_rev_id & 0x00ff0000) >> 16,
(qdev->fw_rev_id & 0x0000ff00) >> 8,
(qdev->fw_rev_id & 0x000000ff));
strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32); strncpy(drvinfo->bus_info, pci_name(qdev->pdev), 32);
drvinfo->n_stats = 0; drvinfo->n_stats = 0;
drvinfo->testinfo_len = 0; drvinfo->testinfo_len = 0;
......
...@@ -837,6 +837,13 @@ int ql_read_xgmac_reg64(struct ql_adapter *qdev, u32 reg, u64 *data) ...@@ -837,6 +837,13 @@ int ql_read_xgmac_reg64(struct ql_adapter *qdev, u32 reg, u64 *data)
static int ql_8000_port_initialize(struct ql_adapter *qdev) static int ql_8000_port_initialize(struct ql_adapter *qdev)
{ {
int status; int status;
/*
* Get MPI firmware version for driver banner
* and ethool info.
*/
status = ql_mb_about_fw(qdev);
if (status)
goto exit;
status = ql_mb_get_fw_state(qdev); status = ql_mb_get_fw_state(qdev);
if (status) if (status)
goto exit; goto exit;
......
...@@ -547,6 +547,40 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) ...@@ -547,6 +547,40 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp)
return status; return status;
} }
/* Get MPI firmware version. This will be used for
* driver banner and for ethtool info.
* Returns zero on success.
*/
int ql_mb_about_fw(struct ql_adapter *qdev)
{
struct mbox_params mbc;
struct mbox_params *mbcp = &mbc;
int status = 0;
memset(mbcp, 0, sizeof(struct mbox_params));
mbcp->in_count = 1;
mbcp->out_count = 3;
mbcp->mbox_in[0] = MB_CMD_ABOUT_FW;
status = ql_mailbox_command(qdev, mbcp);
if (status)
return status;
if (mbcp->mbox_out[0] != MB_CMD_STS_GOOD) {
QPRINTK(qdev, DRV, ERR,
"Failed about firmware command\n");
status = -EIO;
}
/* Store the firmware version */
qdev->fw_rev_id = mbcp->mbox_out[1];
return status;
}
/* Get functional state for MPI firmware. /* Get functional state for MPI firmware.
* Returns zero on success. * Returns zero on success.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment