diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 30ea4703f4aa..92a1025b29ef 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -761,6 +761,14 @@ int cnss_idle_restart(struct device *dev) timeout = cnss_get_timeout(plat_priv, CNSS_TIMEOUT_IDLE_RESTART); ret = wait_for_completion_timeout(&plat_priv->power_up_complete, msecs_to_jiffies(timeout)); + if (plat_priv->power_up_error) { + ret = plat_priv->power_up_error; + clear_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state); + cnss_pr_dbg("Power up error:%d, exiting\n", + plat_priv->power_up_error); + goto out; + } + if (!ret) { /* This exception occurs after attempting retry of FW recovery. * Thus we can safely power off the device. diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index f9feed056d21..a4127bb7b564 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -479,6 +479,7 @@ struct cnss_plat_data { bool fw_pcie_gen_switch; u8 pcie_gen_speed; struct cnss_dms_data dms; + int power_up_error; }; #ifdef CONFIG_ARCH_QCOM diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index e4e12433e4ea..3e0102e14b2c 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -1825,6 +1825,8 @@ int cnss_pci_call_driver_probe(struct cnss_pci_data *pci_priv) if (ret) { cnss_pr_err("Failed to idle restart host driver, err = %d\n", ret); + plat_priv->power_up_error = ret; + complete_all(&plat_priv->power_up_complete); goto out; } clear_bit(CNSS_DRIVER_IDLE_RESTART, &plat_priv->driver_state); @@ -2147,6 +2149,7 @@ static int cnss_qca6290_powerup(struct cnss_pci_data *pci_priv) /* Clear QMI send usage count during every power up */ pci_priv->qmi_send_usage_count = 0; + plat_priv->power_up_error = 0; retry: ret = cnss_power_on_device(plat_priv); if (ret) {