Merge "icnss2: Add ASSERT if fw ready got timed out"

This commit is contained in:
qctecmdr 2022-06-15 05:54:17 -07:00 committed by Gerrit - the friendly Code Review server
commit 5965553dcf
2 changed files with 38 additions and 2 deletions

View File

@ -85,6 +85,9 @@ module_param(qmi_timeout, ulong, 0600);
#define WLFW_TIMEOUT msecs_to_jiffies(3000)
#endif
#define ICNSS_RECOVERY_TIMEOUT 60000
#define ICNSS_CAL_TIMEOUT 15000
static struct icnss_priv *penv;
static struct work_struct wpss_loader;
uint64_t dynamic_feature_mask = ICNSS_DEFAULT_FEATURE_MASK;
@ -1086,6 +1089,7 @@ static int icnss_driver_event_fw_ready_ind(struct icnss_priv *priv, void *data)
if (!priv)
return -ENODEV;
del_timer(&priv->recovery_timer);
set_bit(ICNSS_FW_READY, &priv->state);
clear_bit(ICNSS_MODE_ON, &priv->state);
atomic_set(&priv->soc_wake_ref_count, 0);
@ -1142,11 +1146,14 @@ static int icnss_driver_event_fw_init_done(struct icnss_priv *priv, void *data)
if (icnss_wlfw_qdss_dnld_send_sync(priv))
icnss_pr_info("Failed to download qdss configuration file");
if (test_bit(ICNSS_COLD_BOOT_CAL, &priv->state))
if (test_bit(ICNSS_COLD_BOOT_CAL, &priv->state)) {
mod_timer(&priv->recovery_timer,
jiffies + msecs_to_jiffies(ICNSS_CAL_TIMEOUT));
ret = wlfw_wlan_mode_send_sync_msg(priv,
(enum wlfw_driver_mode_enum_v01)ICNSS_CALIBRATION);
else
} else {
icnss_driver_event_fw_ready_ind(priv, NULL);
}
return ret;
}
@ -2064,6 +2071,10 @@ static int icnss_wpss_notifier_nb(struct notifier_block *nb,
}
icnss_driver_event_post(priv, ICNSS_DRIVER_EVENT_PD_SERVICE_DOWN,
ICNSS_EVENT_SYNC, event_data);
if (notif->crashed)
mod_timer(&priv->recovery_timer,
jiffies + msecs_to_jiffies(ICNSS_RECOVERY_TIMEOUT));
out:
icnss_pr_vdbg("Exit %s,state: 0x%lx\n", __func__, priv->state);
return NOTIFY_OK;
@ -2141,6 +2152,10 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb,
}
icnss_driver_event_post(priv, ICNSS_DRIVER_EVENT_PD_SERVICE_DOWN,
ICNSS_EVENT_SYNC, event_data);
if (notif->crashed)
mod_timer(&priv->recovery_timer,
jiffies + msecs_to_jiffies(ICNSS_RECOVERY_TIMEOUT));
out:
icnss_pr_vdbg("Exit %s,state: 0x%lx\n", __func__, priv->state);
return NOTIFY_OK;
@ -2297,6 +2312,11 @@ static void icnss_pdr_notifier_cb(int state, char *service_path, void *priv_cb)
clear_bit(ICNSS_HOST_TRIGGERED_PDR, &priv->state);
icnss_driver_event_post(priv, ICNSS_DRIVER_EVENT_PD_SERVICE_DOWN,
ICNSS_EVENT_SYNC, event_data);
if (event_data->crashed)
mod_timer(&priv->recovery_timer,
jiffies +
msecs_to_jiffies(ICNSS_RECOVERY_TIMEOUT));
break;
case SERVREG_SERVICE_STATE_UP:
clear_bit(ICNSS_FW_DOWN, &priv->state);
@ -4391,6 +4411,9 @@ static int icnss_probe(struct platform_device *pdev)
INIT_WORK(&wpss_loader, icnss_wpss_load);
}
timer_setup(&priv->recovery_timer,
icnss_recovery_timeout_hdlr, 0);
INIT_LIST_HEAD(&priv->icnss_tcdev_list);
if (priv->pon_gpio_control) {
@ -4437,6 +4460,8 @@ static int icnss_remove(struct platform_device *pdev)
icnss_pr_info("Removing driver: state: 0x%lx\n", priv->state);
del_timer(&priv->recovery_timer);
device_init_wakeup(&priv->pdev->dev, false);
icnss_debugfs_destroy(priv);
@ -4490,6 +4515,14 @@ static int icnss_remove(struct platform_device *pdev)
return 0;
}
void icnss_recovery_timeout_hdlr(struct timer_list *t)
{
struct icnss_priv *priv = from_timer(priv, t, recovery_timer);
icnss_pr_err("Timeout waiting for FW Ready 0x%lx\n", priv->state);
ICNSS_ASSERT(0);
}
#ifdef CONFIG_PM_SLEEP
static int icnss_pm_suspend(struct device *dev)
{

View File

@ -17,6 +17,7 @@
#include <soc/qcom/icnss2.h>
#include "wlan_firmware_service_v01.h"
#include <linux/mailbox_client.h>
#include <linux/timer.h>
#define WCN6750_DEVICE_ID 0x6750
#define ADRASTEA_DEVICE_ID 0xabcd
@ -499,6 +500,7 @@ struct icnss_priv {
u32 pon_pinctrl_owners;
u32 pof_pinctrl_owners;
bool pon_in_progress;
struct timer_list recovery_timer;
};
struct icnss_reg_info {
@ -528,5 +530,6 @@ void icnss_add_fw_prefix_name(struct icnss_priv *priv, char *prefix_name,
int icnss_aop_mbox_init(struct icnss_priv *priv);
struct icnss_priv *icnss_get_plat_priv(void);
int icnss_get_pinctrl(struct icnss_priv *priv);
void icnss_recovery_timeout_hdlr(struct timer_list *t);
#endif