qlcnic: Remove holding api lock while taking the dump
authorAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Wed, 22 Jun 2011 02:52:18 +0000 (02:52 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Jun 2011 08:17:06 +0000 (01:17 -0700)
With the change in logic for taking FW dump across multiple drivers,
there is no need to hold onto the api lock anymore in the fw dump path.
Instead use rtnl_lock() to synchronize the access to FW dump data structs.

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

index 8ea800192d5d1535fa3ff1c68e7ccfaefe87e565..e183ed2271b282729721d8c70e8124a68cb7028a 100644 (file)
@@ -986,8 +986,6 @@ qlcnic_get_dump_data(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;
 
-       if (qlcnic_api_lock(adapter))
-               return -EIO;
        if (!fw_dump->clr) {
                netdev_info(netdev, "Dump not available\n");
                qlcnic_api_unlock(adapter);
@@ -1009,7 +1007,6 @@ qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump,
        vfree(fw_dump->data);
        fw_dump->data = NULL;
        fw_dump->clr = 0;
-       qlcnic_api_unlock(adapter);
 
        return 0;
 }
@@ -1032,10 +1029,7 @@ qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val)
                                ret = -EINVAL;
                                goto out;
                }
-               if (qlcnic_api_lock(adapter))
-                       return -EIO;
                fw_dump->tmpl_hdr->drv_cap_mask = val->flag & 0xff;
-               qlcnic_api_unlock(adapter);
                netdev_info(netdev, "Driver mask changed to: 0x%x\n",
                        fw_dump->tmpl_hdr->drv_cap_mask);
        }
index 0ddbb80eefc750ab0e6964e02b349a9edb68eb59..a656a12e24d1dfd0afcbdc6c182523cbe83bcd6e 100644 (file)
@@ -2846,13 +2846,15 @@ skip_ack_check:
                        set_bit(__QLCNIC_START_FW, &adapter->state);
                        QLCDB(adapter, DRV, "Restarting fw\n");
                        qlcnic_idc_debug_info(adapter, 0);
-                       QLCDB(adapter, DRV, "Take FW dump\n");
-                       qlcnic_dump_fw(adapter);
-                       adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
                }
 
                qlcnic_api_unlock(adapter);
 
+               rtnl_lock();
+               QLCDB(adapter, DRV, "Take FW dump\n");
+               qlcnic_dump_fw(adapter);
+               adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
+               rtnl_unlock();
                if (!adapter->nic_ops->start_firmware(adapter)) {
                        qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
                        adapter->fw_wait_cnt = 0;