drivers: wifi: Add RPU recovery info

Add RPU recovery information in wifi utils.
It helps to debug watchdog recovery.

Signed-off-by: Kapil Bhatt <kapil.bhatt@nordicsemi.no>
This commit is contained in:
Kapil Bhatt 2024-11-19 16:24:41 +05:30 committed by Benjamin Cabé
commit 9a6fea353c
3 changed files with 60 additions and 0 deletions

View file

@ -113,6 +113,8 @@ struct nrf_wifi_ctx_zep {
bool rpu_recovery_in_progress;
unsigned long last_rpu_recovery_time_ms;
unsigned int rpu_recovery_retries;
int rpu_recovery_success;
int rpu_recovery_failure;
#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */
};

View file

@ -74,6 +74,7 @@ static void nrf_wifi_rpu_recovery_work_handler(struct k_work *work)
nrf_wifi_rpu_recovery_work);
struct nrf_wifi_ctx_zep *rpu_ctx_zep = NULL;
int ret;
bool recovery_fail = false;
if (!vif_ctx_zep) {
LOG_ERR("%s: vif_ctx_zep is NULL", __func__);
@ -143,6 +144,8 @@ static void nrf_wifi_rpu_recovery_work_handler(struct k_work *work)
/* This indirectly does a cold-boot of RPU */
ret = net_if_down(vif_ctx_zep->zep_net_if_ctx);
if (ret) {
rpu_ctx_zep->rpu_recovery_failure++;
recovery_fail = true;
LOG_ERR("%s: net_if_down failed: %d", __func__, ret);
/* Continue with the recovery */
}
@ -158,6 +161,9 @@ static void nrf_wifi_rpu_recovery_work_handler(struct k_work *work)
}
rpu_ctx_zep->rpu_recovery_in_progress = false;
rpu_ctx_zep->last_rpu_recovery_time_ms = k_uptime_get();
if (!recovery_fail) {
rpu_ctx_zep->rpu_recovery_success++;
}
k_mutex_unlock(&rpu_ctx_zep->rpu_lock);
#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG
LOG_ERR("%s: RPU recovery done", __func__);

View file

@ -915,6 +915,52 @@ unlock:
k_mutex_unlock(&ctx->rpu_lock);
return ret;
}
static int nrf_wifi_util_rpu_recovery_info(const struct shell *sh,
size_t argc,
const char *argv[])
{
struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx = NULL;
struct nrf_wifi_hal_dev_ctx *hal_dev_ctx = NULL;
unsigned long current_time_ms = nrf_wifi_osal_time_get_curr_ms();
int ret;
k_mutex_lock(&ctx->rpu_lock, K_FOREVER);
if (!ctx || !ctx->rpu_ctx) {
shell_fprintf(sh,
SHELL_ERROR,
"RPU context not initialized\n");
ret = -ENOEXEC;
goto unlock;
}
fmac_dev_ctx = ctx->rpu_ctx;
hal_dev_ctx = fmac_dev_ctx->hal_dev_ctx;
shell_fprintf(sh,
SHELL_INFO,
"wdt_irq_received: %d\n"
"wdt_irq_ignored: %d\n"
"last_wakeup_now_asserted_time_ms: %lu milliseconds\n"
"last_wakeup_now_deasserted_time_ms: %lu milliseconds\n"
"last_rpu_sleep_opp_time_ms: %lu milliseconds\n"
"current time: %lu milliseconds\n"
"rpu_recovery_success: %d\n"
"rpu_recovery_failure: %d\n\n",
hal_dev_ctx->wdt_irq_received,
hal_dev_ctx->wdt_irq_ignored,
hal_dev_ctx->last_wakeup_now_asserted_time_ms,
hal_dev_ctx->last_wakeup_now_deasserted_time_ms,
hal_dev_ctx->last_rpu_sleep_opp_time_ms,
current_time_ms,
ctx->rpu_recovery_success,
ctx->rpu_recovery_failure);
ret = 0;
unlock:
k_mutex_unlock(&ctx->rpu_lock);
return ret;
}
#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */
SHELL_STATIC_SUBCMD_SET_CREATE(
@ -1013,6 +1059,12 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
nrf_wifi_util_trigger_rpu_recovery,
1,
0),
SHELL_CMD_ARG(rpu_recovery_info,
NULL,
"Dump RPU recovery information",
nrf_wifi_util_rpu_recovery_info,
1,
0),
#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */
SHELL_SUBCMD_SET_END);