qlcnic: FW dump related changes
authorAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Fri, 29 Jul 2011 13:30:26 +0000 (13:30 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 1 Aug 2011 07:12:00 +0000 (00:12 -0700)
o Added code to support FW reset without invoking the dump
o Fixed the return value of the dump data size if dump is not available.

Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlcnic/qlcnic.h
drivers/net/qlcnic/qlcnic_ethtool.c

index baf646d98fa07a7e8fdce96ee15ebc9a3a00f0a5..4200ef81ca8eb59ffa683f3ec8b0f0b6492fa1f0 100644 (file)
@@ -1344,6 +1344,7 @@ enum op_codes {
 #define QLCNIC_FORCE_FW_DUMP_KEY       0xdeadfeed
 #define QLCNIC_ENABLE_FW_DUMP          0xaddfeed
 #define QLCNIC_DISABLE_FW_DUMP         0xbadfeed
+#define QLCNIC_FORCE_FW_RESET          0xdeaddead
 
 struct qlcnic_dump_operations {
        enum op_codes opcode;
index 72a723d5c988949f8b6b92462a6207a1529c4974..7c64f2ffc219fa9e1f4bf7290adca8dc23770435 100644 (file)
@@ -1105,7 +1105,10 @@ qlcnic_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump)
        struct qlcnic_adapter *adapter = netdev_priv(netdev);
        struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
 
-       dump->len = fw_dump->tmpl_hdr->size + fw_dump->size;
+       if (fw_dump->clr)
+               dump->len = fw_dump->tmpl_hdr->size + fw_dump->size;
+       else
+               dump->len = 0;
        dump->flag = fw_dump->tmpl_hdr->drv_cap_mask;
        dump->version = adapter->fw_version;
        return 0;
@@ -1152,7 +1155,8 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
        struct qlcnic_adapter *adapter = netdev_priv(netdev);
        struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
 
-       if (val->flag == QLCNIC_FORCE_FW_DUMP_KEY) {
+       switch (val->flag) {
+       case QLCNIC_FORCE_FW_DUMP_KEY:
                if (!fw_dump->enable) {
                        netdev_info(netdev, "FW dump not enabled\n");
                        return ret;
@@ -1164,17 +1168,25 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
                }
                netdev_info(netdev, "Forcing a FW dump\n");
                qlcnic_dev_request_reset(adapter);
-       } else if (val->flag == QLCNIC_DISABLE_FW_DUMP) {
+               break;
+       case QLCNIC_DISABLE_FW_DUMP:
                if (fw_dump->enable) {
                        netdev_info(netdev, "Disabling FW dump\n");
                        fw_dump->enable = 0;
                }
-       } else if (val->flag == QLCNIC_ENABLE_FW_DUMP) {
+               break;
+       case QLCNIC_ENABLE_FW_DUMP:
                if (!fw_dump->enable && fw_dump->tmpl_hdr) {
                        netdev_info(netdev, "Enabling FW dump\n");
                        fw_dump->enable = 1;
                }
-       } else {
+               break;
+       case QLCNIC_FORCE_FW_RESET:
+               netdev_info(netdev, "Forcing a FW reset\n");
+               qlcnic_dev_request_reset(adapter);
+               adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
+               break;
+       default:
                if (val->flag > QLCNIC_DUMP_MASK_MAX ||
                        val->flag < QLCNIC_DUMP_MASK_MIN) {
                                netdev_info(netdev,