From 159ba19b2ff229d5b1d8a56556c7ae5b18f7f51a Mon Sep 17 00:00:00 2001 From: Jingxiang Ge Date: Thu, 22 Apr 2021 17:04:06 +0800 Subject: [PATCH] cnss2: Add retry in cnss_probe if bus init fail Sometimes cnss probe fails as pcie link training failure, This change will retry power on + pcie link training. Change-Id: I3eb12efe39b3a34b86e6cc97152d7e1615cc6266 Signed-off-by: Jingxiang Ge --- drivers/net/wireless/cnss2/main.c | 12 +++++++++++- drivers/net/wireless/cnss2/main.h | 2 ++ drivers/net/wireless/cnss2/pci.c | 3 --- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 23ad6b2ee85f..6146d6f7d90b 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -3136,6 +3136,7 @@ static int cnss_probe(struct platform_device *plat_dev) struct cnss_plat_data *plat_priv; const struct of_device_id *of_id; const struct platform_device_id *device_id; + int retry = 0; if (cnss_get_plat_priv(plat_dev)) { cnss_pr_err("Driver is already initialized!\n"); @@ -3218,13 +3219,22 @@ static int cnss_probe(struct platform_device *plat_dev) * device power on and bus init. */ if (!test_bit(SKIP_DEVICE_BOOT, &plat_priv->ctrl_params.quirks)) { +retry: ret = cnss_power_on_device(plat_priv); if (ret) goto deinit_misc; ret = cnss_bus_init(plat_priv); - if (ret) + if (ret) { + if ((ret != -EPROBE_DEFER) && + retry++ < POWER_ON_RETRY_MAX_TIMES) { + cnss_power_off_device(plat_priv); + cnss_pr_dbg("Retry cnss_bus_init #%d\n", retry); + msleep(POWER_ON_RETRY_DELAY_MS * retry); + goto retry; + } goto power_off; + } } cnss_register_coex_service(plat_priv); diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index af4709507c03..8a279b2d406a 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -43,6 +43,8 @@ #define CNSS_RAMDUMP_VERSION 0 #define MAX_FIRMWARE_NAME_LEN 40 #define FW_V2_NUMBER 2 +#define POWER_ON_RETRY_MAX_TIMES 3 +#define POWER_ON_RETRY_DELAY_MS 200 #define CNSS_EVENT_SYNC BIT(0) #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index cec64077784f..1e27d66b5ed3 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -76,9 +76,6 @@ static DEFINE_SPINLOCK(time_sync_lock); #define FORCE_WAKE_DELAY_MAX_US 6000 #define FORCE_WAKE_DELAY_TIMEOUT_US 60000 -#define POWER_ON_RETRY_MAX_TIMES 3 -#define POWER_ON_RETRY_DELAY_MS 200 - #define LINK_TRAINING_RETRY_MAX_TIMES 3 #define LINK_TRAINING_RETRY_DELAY_MS 500