qlcnic: set driver version in firmware
authorSritej Velaga <sritej.velaga@qlogic.com>
Fri, 25 Jan 2013 10:20:34 +0000 (10:20 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 27 Jan 2013 06:00:07 +0000 (01:00 -0500)
Signed-off-by: Sritej Velaga <sritej.velaga@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c

index 893cbe8dd8e2e4e4a776b8538b5d512fa9d4cbd8..86487fb19e70ecae0f9d4362c7598fdb3190a71c 100644 (file)
@@ -798,6 +798,7 @@ struct qlcnic_mac_list_s {
 #define QLCNIC_FW_CAPABILITY_MORE_CAPS         BIT_31
 
 #define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG BIT_2
+#define QLCNIC_FW_CAPABILITY_2_OCBB            BIT_5
 
 /* module types */
 #define LINKEVENT_MODULE_NOT_PRESENT                   1
@@ -1421,6 +1422,7 @@ void qlcnic_set_multi(struct net_device *netdev);
 void qlcnic_free_mac_list(struct qlcnic_adapter *adapter);
 
 int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
+int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *);
 int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
 netdev_features_t qlcnic_fix_features(struct net_device *netdev,
        netdev_features_t features);
index ee68fe35a27e55bdaea6b883c56b15702a229fce..7372964d3a765729c64ec54231d023b7e27aa50f 100644 (file)
@@ -160,6 +160,37 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
        return cmd->rsp.arg[0];
 }
 
+int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter)
+{
+       struct qlcnic_cmd_args cmd;
+       u32 arg1, arg2, arg3;
+       char drv_string[12];
+       int err = 0;
+
+       memset(drv_string, 0, sizeof(drv_string));
+       snprintf(drv_string, sizeof(drv_string), "%d"".""%d"".""%d",
+                _QLCNIC_LINUX_MAJOR, _QLCNIC_LINUX_MINOR,
+                _QLCNIC_LINUX_SUBVERSION);
+
+       qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_DRV_VER);
+       memcpy(&arg1, drv_string, sizeof(u32));
+       memcpy(&arg2, drv_string + 4, sizeof(u32));
+       memcpy(&arg3, drv_string + 8, sizeof(u32));
+
+       cmd.req.arg[1] = arg1;
+       cmd.req.arg[2] = arg2;
+       cmd.req.arg[3] = arg3;
+
+       err = qlcnic_issue_cmd(adapter, &cmd);
+       if (err) {
+               dev_info(&adapter->pdev->dev,
+                        "Failed to set driver version in firmware\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
 int
 qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu)
 {
index fb7ac8ecd45a6302c58949ca8a813579654df954..5f3308a1801ab05493057ff4333c2fdfe411a8dc 100644 (file)
@@ -1724,6 +1724,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct qlcnic_adapter *adapter = NULL;
        struct qlcnic_hardware_context *ahw;
        int err, pci_using_dac = -1;
+       u32 capab2;
        char board_name[QLCNIC_MAX_BOARD_NAME_LEN];
 
        err = pci_enable_device(pdev);
@@ -1849,6 +1850,14 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (err)
                goto err_out_disable_mbx_intr;
 
+       if (qlcnic_82xx_check(adapter)) {
+               if (ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
+                       capab2 = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
+                       if (capab2 & QLCNIC_FW_CAPABILITY_2_OCBB)
+                               qlcnic_fw_cmd_set_drv_version(adapter);
+               }
+       }
+
        pci_set_drvdata(pdev, adapter);
 
        if (qlcnic_82xx_check(adapter))