Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 287e38aa authored by Anirban Chakraborty's avatar Anirban Chakraborty Committed by David S. Miller
Browse files

qlcnic: Remove holding api lock while taking the dump



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: default avatarAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 602ca6f0
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -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);
	}
+5 −3
Original line number Diff line number Diff line
@@ -2846,13 +2846,15 @@ qlcnic_fwinit_work(struct work_struct *work)
			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;