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

Commit 10051580 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cnss2: Reject idle restart if fails to get driver ops lock"

parents 9657f724 d307d6bf
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -628,6 +628,11 @@ int cnss_idle_restart(struct device *dev)
		return -ENODEV;
	}

	if (!mutex_trylock(&plat_priv->driver_ops_lock)) {
		cnss_pr_dbg("Another driver operation is in progress, ignore idle restart\n");
		return -EBUSY;
	}

	cnss_pr_dbg("Doing idle restart\n");

	reinit_completion(&plat_priv->power_up_complete);
@@ -666,9 +671,11 @@ int cnss_idle_restart(struct device *dev)
		goto out;
	}

	mutex_unlock(&plat_priv->driver_ops_lock);
	return 0;

out:
	mutex_unlock(&plat_priv->driver_ops_lock);
	return ret;
}
EXPORT_SYMBOL(cnss_idle_restart);
@@ -2146,6 +2153,7 @@ static int cnss_misc_init(struct cnss_plat_data *plat_priv)
	init_completion(&plat_priv->rddm_complete);
	init_completion(&plat_priv->recovery_complete);
	mutex_init(&plat_priv->dev_lock);
	mutex_init(&plat_priv->driver_ops_lock);

	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -372,6 +372,7 @@ struct cnss_plat_data {
	struct completion power_up_complete;
	struct completion cal_complete;
	struct mutex dev_lock; /* mutex for register access through debugfs */
	struct mutex driver_ops_lock; /* mutex for external driver ops */
	u32 device_freq_hz;
	u32 diag_reg_read_addr;
	u32 diag_reg_read_mem_type;
+10 −5
Original line number Diff line number Diff line
@@ -1458,6 +1458,7 @@ int cnss_pci_call_driver_probe(struct cnss_pci_data *pci_priv)
		clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state);
		clear_bit(CNSS_DRIVER_LOADING, &plat_priv->driver_state);
		set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state);
		complete_all(&plat_priv->power_up_complete);
	} else if (test_bit(CNSS_DRIVER_IDLE_RESTART,
			    &plat_priv->driver_state)) {
		ret = pci_priv->driver_ops->idle_restart(pci_priv->pci_dev,
@@ -2157,6 +2158,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops)
	}

register_driver:
	reinit_completion(&plat_priv->power_up_complete);
	ret = cnss_driver_event_post(plat_priv,
				     CNSS_DRIVER_EVENT_REGISTER_DRIVER,
				     CNSS_EVENT_SYNC_UNKILLABLE,
@@ -2177,20 +2179,21 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops)
		return;
	}

	if (plat_priv->device_id == QCA6174_DEVICE_ID ||
	    !test_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state))
		goto skip_wait_idle_restart;
	mutex_lock(&plat_priv->driver_ops_lock);

	if (plat_priv->device_id == QCA6174_DEVICE_ID)
		goto skip_wait_power_up;

	timeout = cnss_get_qmi_timeout(plat_priv);
	ret = wait_for_completion_timeout(&plat_priv->power_up_complete,
					  msecs_to_jiffies((timeout << 1) +
							   WLAN_WD_TIMEOUT_MS));
	if (!ret) {
		cnss_pr_err("Timeout waiting for idle restart to complete\n");
		cnss_pr_err("Timeout waiting for driver power up to complete\n");
		CNSS_ASSERT(0);
	}

skip_wait_idle_restart:
skip_wait_power_up:
	if (!test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state) &&
	    !test_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state))
		goto skip_wait_recovery;
@@ -2207,6 +2210,8 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops)
	cnss_driver_event_post(plat_priv,
			       CNSS_DRIVER_EVENT_UNREGISTER_DRIVER,
			       CNSS_EVENT_SYNC_UNKILLABLE, NULL);

	mutex_unlock(&plat_priv->driver_ops_lock);
}
EXPORT_SYMBOL(cnss_wlan_unregister_driver);