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

Commit b18971d1 authored by Amit Kumar Salecha's avatar Amit Kumar Salecha Committed by David S. Miller
Browse files

qlcnic: fix fw recovery for PF



Privilege function should wait for npar state to be operational
before creating context.

Signed-off-by: default avatarAmit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8cf61f89
Loading
Loading
Loading
Loading
+17 −5
Original line number Original line Diff line number Diff line
@@ -997,11 +997,7 @@ qlcnic_start_firmware(struct qlcnic_adapter *adapter)
set_dev_ready:
set_dev_ready:
	QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY);
	QLCWR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY);
	qlcnic_idc_debug_info(adapter, 1);
	qlcnic_idc_debug_info(adapter, 1);
	err = qlcnic_check_npar_opertional(adapter);

	if (err) {
		qlcnic_release_firmware(adapter);
		return err;
	}
	if (qlcnic_set_default_offload_settings(adapter))
	if (qlcnic_set_default_offload_settings(adapter))
		goto err_out;
		goto err_out;
	if (qlcnic_reset_npar_config(adapter))
	if (qlcnic_reset_npar_config(adapter))
@@ -2602,6 +2598,7 @@ qlcnic_fwinit_work(struct work_struct *work)


		if (!adapter->nic_ops->start_firmware(adapter)) {
		if (!adapter->nic_ops->start_firmware(adapter)) {
			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
			adapter->fw_wait_cnt = 0;
			return;
			return;
		}
		}
		goto err_ret;
		goto err_ret;
@@ -2617,6 +2614,7 @@ qlcnic_fwinit_work(struct work_struct *work)
	case QLCNIC_DEV_READY:
	case QLCNIC_DEV_READY:
		if (!adapter->nic_ops->start_firmware(adapter)) {
		if (!adapter->nic_ops->start_firmware(adapter)) {
			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
			qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
			adapter->fw_wait_cnt = 0;
			return;
			return;
		}
		}
	case QLCNIC_DEV_FAILED:
	case QLCNIC_DEV_FAILED:
@@ -2750,7 +2748,21 @@ qlcnic_attach_work(struct work_struct *work)
	struct qlcnic_adapter *adapter = container_of(work,
	struct qlcnic_adapter *adapter = container_of(work,
				struct qlcnic_adapter, fw_work.work);
				struct qlcnic_adapter, fw_work.work);
	struct net_device *netdev = adapter->netdev;
	struct net_device *netdev = adapter->netdev;
	u32 npar_state;


	if (adapter->op_mode != QLCNIC_MGMT_FUNC) {
		npar_state = QLCRD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
		if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO)
			qlcnic_clr_all_drv_state(adapter, 0);
		else if (npar_state != QLCNIC_DEV_NPAR_OPER)
			qlcnic_schedule_work(adapter, qlcnic_attach_work,
							FW_POLL_DELAY);
		else
			goto attach;
		QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n");
		return;
	}
attach:
	if (netif_running(netdev)) {
	if (netif_running(netdev)) {
		if (qlcnic_up(adapter, netdev))
		if (qlcnic_up(adapter, netdev))
			goto done;
			goto done;