From 5e131a85b0cfadc6a74d795f52d9c5c6afb1f948 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Thu, 25 Mar 2021 22:27:32 +0530 Subject: [PATCH] cnss2: Log SW_CTRL GPIO value if PCIe link training fails Add change to print SW_CTRL GPIO value when PCIe link training fails during power on. Change-Id: I77bd2db80dad4c56647f52d67acfab0fe7efb7a7 Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/main.h | 3 ++- drivers/net/wireless/cnss2/pci.c | 7 ++++++- drivers/net/wireless/cnss2/power.c | 31 +++++++++++++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index e22439c97416..7da8a0117b51 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -97,6 +97,7 @@ struct cnss_pinctrl_info { struct pinctrl_state *wlan_en_sleep; int bt_en_gpio; int xo_clk_gpio; /*qca6490 only */ + int sw_ctrl_gpio; }; #if IS_ENABLED(CONFIG_MSM_SUBSYSTEM_RESTART) @@ -568,5 +569,5 @@ int cnss_request_firmware_direct(struct cnss_plat_data *plat_priv, const struct firmware **fw_entry, const char *filename); void cnss_disable_redundant_vreg(struct cnss_plat_data *plat_priv); - +int cnss_gpio_get_value(struct cnss_plat_data *plat_priv, int gpio_num); #endif /* _CNSS_MAIN_H */ diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 8d9c5380cc44..9490a2597014 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -2433,7 +2433,7 @@ static int cnss_qca6290_powerup(struct cnss_pci_data *pci_priv) int ret = 0; struct cnss_plat_data *plat_priv = pci_priv->plat_priv; unsigned int timeout; - int retry = 0; + int retry = 0, sw_ctrl_gpio = plat_priv->pinctrl_info.sw_ctrl_gpio; if (plat_priv->ramdump_info_v2.dump_data_valid) { cnss_pci_clear_dump_info(pci_priv); @@ -2454,6 +2454,8 @@ retry: ret = cnss_resume_pci_link(pci_priv); if (ret) { cnss_pr_err("Failed to resume PCI link, err = %d\n", ret); + cnss_pr_dbg("Value of SW_CTRL GPIO: %d\n", + cnss_gpio_get_value(plat_priv, sw_ctrl_gpio)); if (test_bit(IGNORE_PCI_LINK_FAILURE, &plat_priv->ctrl_params.quirks)) { cnss_pr_dbg("Ignore PCI link resume failure\n"); @@ -2463,6 +2465,9 @@ retry: if (ret == -EAGAIN && retry++ < POWER_ON_RETRY_MAX_TIMES) { cnss_power_off_device(plat_priv); cnss_pr_dbg("Retry to resume PCI link #%d\n", retry); + cnss_pr_dbg("Value of SW_CTRL GPIO: %d\n", + cnss_gpio_get_value(plat_priv, + sw_ctrl_gpio)); msleep(POWER_ON_RETRY_DELAY_MS * retry); goto retry; } diff --git a/drivers/net/wireless/cnss2/power.c b/drivers/net/wireless/cnss2/power.c index 2a125caca6c7..b6db72a2baf2 100644 --- a/drivers/net/wireless/cnss2/power.c +++ b/drivers/net/wireless/cnss2/power.c @@ -4,12 +4,12 @@ #include #include #include +#include #include #include #if IS_ENABLED(CONFIG_QCOM_COMMAND_DB) #include #endif -#include #include "main.h" #include "debug.h" @@ -54,6 +54,7 @@ static struct cnss_clk_cfg cnss_clk_list[] = { #define WLAN_EN_GPIO "wlan-en-gpio" #define BT_EN_GPIO "qcom,bt-en-gpio" #define XO_CLK_GPIO "qcom,xo-clk-gpio" +#define SW_CTRL_GPIO "qcom,sw-ctrl-gpio" #define WLAN_EN_ACTIVE "wlan_en_active" #define WLAN_EN_SLEEP "wlan_en_sleep" #define WLAN_VREGS_PROP "wlan_vregs" @@ -786,6 +787,17 @@ int cnss_get_pinctrl(struct cnss_plat_data *plat_priv) } else { pinctrl_info->xo_clk_gpio = -EINVAL; } + + if (of_find_property(dev->of_node, SW_CTRL_GPIO, NULL)) { + pinctrl_info->sw_ctrl_gpio = of_get_named_gpio(dev->of_node, + SW_CTRL_GPIO, + 0); + cnss_pr_dbg("Switch control GPIO: %d\n", + pinctrl_info->sw_ctrl_gpio); + } else { + pinctrl_info->sw_ctrl_gpio = -EINVAL; + } + return 0; out: return ret; @@ -936,6 +948,23 @@ set_wlan_en: return ret; } +int cnss_gpio_get_value(struct cnss_plat_data *plat_priv, int gpio_num) +{ + int ret; + + if (gpio_num < 0) + return -EINVAL; + + ret = gpio_direction_input(gpio_num); + if (ret) { + cnss_pr_err("Failed to set direction of GPIO(%d), err = %d", + gpio_num, ret); + return -EINVAL; + } + + return gpio_get_value(gpio_num); +} + int cnss_power_on_device(struct cnss_plat_data *plat_priv) { int ret = 0;