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

Commit 7b749ff4 authored by Sritej Velaga's avatar Sritej Velaga Committed by David S. Miller
Browse files

qlcnic: fix chip reset logic



Chip reset logic (IDC logic) has changed with fw dump support.
This broked compatibility with driver using older IDC logic.
Changes to make it compatible with drivers using older IDC logic.

Signed-off-by: default avatarSritej Velaga <sritej.velaga@qlogic.com>
Signed-off-by: default avatarAmit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 41c2178a
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -2811,6 +2811,7 @@ qlcnic_fwinit_work(struct work_struct *work)
	struct qlcnic_adapter *adapter = container_of(work,
			struct qlcnic_adapter, fw_work.work);
	u32 dev_state = 0xf;
	u32 val;

	if (qlcnic_api_lock(adapter))
		goto err_ret;
@@ -2837,11 +2838,6 @@ qlcnic_fwinit_work(struct work_struct *work)

	if (!qlcnic_check_drv_state(adapter)) {
skip_ack_check:
		if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) {
			qlcnic_api_unlock(adapter);
			goto wait_npar;
		}

		dev_state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);

		if (dev_state == QLCNIC_DEV_NEED_RESET) {
@@ -2850,17 +2846,22 @@ 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);
			val = QLCRD32(adapter, QLCNIC_CRB_DRV_STATE);
			QLC_DEV_SET_RST_RDY(val, adapter->portnum);
			QLCWR32(adapter, QLCNIC_CRB_DRV_STATE, val);
		}

		qlcnic_api_unlock(adapter);

		rtnl_lock();
		if (adapter->ahw->fw_dump.enable) {
		if (adapter->ahw->fw_dump.enable &&
		    (adapter->flags & QLCNIC_FW_RESET_OWNER)) {
			QLCDB(adapter, DRV, "Take FW dump\n");
			qlcnic_dump_fw(adapter);
			adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
		}
		rtnl_unlock();

		adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
		if (!adapter->nic_ops->start_firmware(adapter)) {
			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
			adapter->fw_wait_cnt = 0;