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);
        vfree(fw_dump->data);
        fw_dump->data = NULL;
        fw_dump->clr = 0;
-       qlcnic_api_unlock(adapter);
 
        return 0;
 }
                                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);
        }
 
                        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;