qlge: Add support for retrieving firmware version.
authorRon Mercer <ron.mercer@qlogic.com>
Tue, 9 Jun 2009 05:39:29 +0000 (05:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 10 Jun 2009 08:04:08 +0000 (01:04 -0700)
This is used by driver banner and ethtool info.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge.h
drivers/net/qlge/qlge_ethtool.c
drivers/net/qlge/qlge_main.c
drivers/net/qlge/qlge_mpi.c

index e18607124f41ddafc0fdda8b4f0781d032dee1e3..258ef449ea882a638aff1785cc5e8eb19376bf35 100644 (file)
@@ -1430,6 +1430,7 @@ struct ql_adapter {
 
        /* Hardware information */
        u32 chip_rev_id;
+       u32 fw_rev_id;
        u32 func;               /* PCI function for this adapter */
 
        spinlock_t adapter_lock;
@@ -1580,6 +1581,7 @@ void ql_mpi_idc_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_cam_route_initialize(struct ql_adapter *qdev);
+int ql_mb_about_fw(struct ql_adapter *qdev);
 
 #if 1
 #define QL_ALL_DUMP
index 913b2a5fafc9fea160fb90bf0c18d1fd2f6e4447..ea021636110156545d14885cba8d4e558977f58b 100644 (file)
@@ -293,7 +293,10 @@ static void ql_get_drvinfo(struct net_device *ndev,
        struct ql_adapter *qdev = netdev_priv(ndev);
        strncpy(drvinfo->driver, qlge_driver_name, 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);
        drvinfo->n_stats = 0;
        drvinfo->testinfo_len = 0;
index 0b0778d9919c3e9bfb1a5dee98998344423657d1..5fb875d60d0037af71d8a4184c5f1652d1986269 100644 (file)
@@ -837,6 +837,13 @@ exit:
 static int ql_8000_port_initialize(struct ql_adapter *qdev)
 {
        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);
        if (status)
                goto exit;
index 3bd60a4f5d71dd5507e58ab3135cf304a7723ddc..a67c14a7befd7d1cb0ded74edb51d143827f399e 100644 (file)
@@ -547,6 +547,40 @@ end:
        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.
  * Returns zero on success.
  */