qcacld-3.0: Wait for PM freeze when turning wifi on

Add a wait for PM freeze when wifi is turning on to make sure file system
and QMI are still accessible before attempting to download the FW and
trigger a QMI handshake with FW.

Change-Id: Ia2f3dc28abb9cab4b5dd8038ea02ac016eb74bbb
CRs-Fixed: 2521009
This commit is contained in:
Alan Chen
2019-09-04 12:04:22 -07:00
zatwierdzone przez nshrivas
rodzic f8a46d501f
commit 0f29e974ec
3 zmienionych plików z 45 dodań i 7 usunięć

Wyświetl plik

@@ -124,9 +124,9 @@ int hdd_hif_open(struct device *dev, void *bdev, const struct hif_bus_id *bid,
* *
* This function takes wakelock to prevent suspend during idle restart * This function takes wakelock to prevent suspend during idle restart
* *
* Return: none * Return: 0 for success and non zero for error
*/ */
void hdd_soc_idle_restart_lock(struct device *dev); int hdd_soc_idle_restart_lock(struct device *dev);
/** /**
* hdd_soc_idle_restart_unlock() - Releases wakelock for idle restart * hdd_soc_idle_restart_unlock() - Releases wakelock for idle restart

Wyświetl plik

@@ -42,6 +42,7 @@
#include "wlan_ipa_ucfg_api.h" #include "wlan_ipa_ucfg_api.h"
#include "wlan_hdd_debugfs.h" #include "wlan_hdd_debugfs.h"
#include "cfg_ucfg_api.h" #include "cfg_ucfg_api.h"
#include <linux/suspend.h>
#ifdef MODULE #ifdef MODULE
#define WLAN_MODULE_NAME module_name(THIS_MODULE) #define WLAN_MODULE_NAME module_name(THIS_MODULE)
@@ -386,10 +387,41 @@ static void hdd_abort_system_suspend(struct device *dev)
} }
#endif #endif
void hdd_soc_idle_restart_lock(struct device *dev) /* Total wait time for pm freeze is 10 seconds */
#define HDD_SLEEP_FOR_PM_FREEZE_TIME (500)
#define HDD_MAX_ATTEMPT_SLEEP_FOR_PM_FREEZE_TIME (20)
static int hdd_wait_for_pm_freeze(void)
{
uint8_t count = 0;
while (pm_freezing) {
hdd_info("pm freezing wait for %d ms",
HDD_SLEEP_FOR_PM_FREEZE_TIME);
msleep(HDD_SLEEP_FOR_PM_FREEZE_TIME);
count++;
if (count > HDD_MAX_ATTEMPT_SLEEP_FOR_PM_FREEZE_TIME) {
hdd_err("timeout occurred for pm freezing");
return -EBUSY;
}
}
return 0;
}
int hdd_soc_idle_restart_lock(struct device *dev)
{ {
hdd_abort_system_suspend(dev);
hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_IDLE_RESTART); hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_IDLE_RESTART);
hdd_abort_system_suspend(dev);
if (hdd_wait_for_pm_freeze()) {
hdd_allow_suspend(
WIFI_POWER_EVENT_WAKELOCK_DRIVER_IDLE_RESTART);
return -EBUSY;
}
return 0;
} }
void hdd_soc_idle_restart_unlock(void) void hdd_soc_idle_restart_unlock(void)

Wyświetl plik

@@ -9776,7 +9776,9 @@ static int __hdd_psoc_idle_restart(struct hdd_context *hdd_ctx)
{ {
int ret; int ret;
hdd_soc_idle_restart_lock(hdd_ctx->parent_dev); ret = hdd_soc_idle_restart_lock(hdd_ctx->parent_dev);
if (ret)
return ret;
ret = hdd_wlan_start_modules(hdd_ctx, false); ret = hdd_wlan_start_modules(hdd_ctx, false);
@@ -9809,7 +9811,9 @@ int hdd_trigger_psoc_idle_restart(struct hdd_context *hdd_ctx)
return 0; return 0;
} }
hdd_soc_idle_restart_lock(hdd_ctx->parent_dev); ret = hdd_soc_idle_restart_lock(hdd_ctx->parent_dev);
if (ret)
return ret;
ret = pld_idle_restart(hdd_ctx->parent_dev, hdd_psoc_idle_restart); ret = pld_idle_restart(hdd_ctx->parent_dev, hdd_psoc_idle_restart);
hdd_soc_idle_restart_unlock(); hdd_soc_idle_restart_unlock();
@@ -14111,7 +14115,9 @@ static int hdd_mode_change_psoc_idle_restart(struct device *dev)
if (!hdd_ctx) if (!hdd_ctx)
return -EINVAL; return -EINVAL;
hdd_soc_idle_restart_lock(dev); ret = hdd_soc_idle_restart_lock(dev);
if (ret)
return ret;
ret = hdd_wlan_start_modules(hdd_ctx, false); ret = hdd_wlan_start_modules(hdd_ctx, false);
hdd_soc_idle_restart_unlock(); hdd_soc_idle_restart_unlock();