diff options
author | Anirban Chakraborty <anirban.chakraborty@qlogic.com> | 2011-07-29 13:30:26 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-01 00:12:00 -0700 |
commit | 3d46512c642248fcb33f3b3ee2b2a80e2b09cd9c (patch) | |
tree | 327dca93129889ebd0329ced5f548fae5adfd483 | |
parent | 51f675fd236a41e3fdb18f6e24fbaeaac4802a9b (diff) | |
download | linux-3d46512c642248fcb33f3b3ee2b2a80e2b09cd9c.tar.bz2 |
qlcnic: FW dump related changes
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>
-rw-r--r-- | drivers/net/qlcnic/qlcnic.h | 1 | ||||
-rw-r--r-- | drivers/net/qlcnic/qlcnic_ethtool.c | 22 |
2 files changed, 18 insertions, 5 deletions
diff --git a/drivers/net/qlcnic/qlcnic.h b/drivers/net/qlcnic/qlcnic.h index baf646d98fa0..4200ef81ca8e 100644 --- a/drivers/net/qlcnic/qlcnic.h +++ b/drivers/net/qlcnic/qlcnic.h @@ -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; diff --git a/drivers/net/qlcnic/qlcnic_ethtool.c b/drivers/net/qlcnic/qlcnic_ethtool.c index 72a723d5c988..7c64f2ffc219 100644 --- a/drivers/net/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/qlcnic/qlcnic_ethtool.c @@ -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, |