From f5ea4da4a13c7188b662b5218bd756f00f0dc482 Mon Sep 17 00:00:00 2001 From: Ajay Parida Date: Mon, 15 Jul 2024 14:57:08 +0530 Subject: [PATCH 01/25] drivers: wifi: Option for Qos NULL frame based power save [SHEL-2947] QoS null frame based legacy power save support. Signed-off-by: Ajay Parida --- nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h | 16 +++++++++++++++- nrf_wifi/fw_if/umac_if/src/cmd.c | 8 +++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h b/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h index f3c8b0c508..970e6abee0 100644 --- a/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h +++ b/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h @@ -828,6 +828,19 @@ enum op_band { BAND_24G }; +/** + * @brief This enum specifies the type of frames used to retrieve buffered data + * from the AP in power save mode. + */ +enum data_retrieve_frame { + /** Retrieves data from the AP using a PS-Poll frame */ + PS_POLL_FRAME, + /** Retrieves data from the AP using a QoS Null frame */ + QOS_NULL_FRAME, + /** For future implementation. The RPU will decide which frame to use */ + AUTOMATIC +}; + #define TWT_EXTEND_SP_EDCA 0x1 #define DISABLE_DFS_CHANNELS 0x2 @@ -872,9 +885,10 @@ struct nrf_wifi_cmd_sys_init { * without receiving beacons before disconnection. */ unsigned int discon_timeout; + /** RPU uses QoS null frame or PS-Poll frame to retrieve buffered frames */ + unsigned char ps_data_retrieval_mode; } __NRF_WIFI_PKD; -/** * @brief This structure defines the command used to de-initialize the RPU. * */ diff --git a/nrf_wifi/fw_if/umac_if/src/cmd.c b/nrf_wifi/fw_if/umac_if/src/cmd.c index cb4847be75..e248f7f677 100644 --- a/nrf_wifi/fw_if/umac_if/src/cmd.c +++ b/nrf_wifi/fw_if/umac_if/src/cmd.c @@ -202,7 +202,13 @@ enum nrf_wifi_status umac_cmd_init(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx, umac_cmd_data->disable_beamforming = 1; } - status = nrf_wifi_hal_ctrl_cmd_send(fmac_dev_ctx->hal_dev_ctx, +#if defined(CONFIG_NRF_WIFI_QOS_NULL_BASED_RETRIEVAL) + umac_cmd_data->ps_data_retrieval_mode = QOS_NULL_FRAME; +#else + umac_cmd_data->ps_data_retrieval_mode = PS_POLL_FRAME; +#endif /* CONFIG_NRF_WIFI_QOS_NULL_BASED_RETRIEVAL */ + + status = nrf_wifi_hal_ctrl_cmd_send(fmac_dev_ctx->hal_dev_ctx, umac_cmd, (sizeof(*umac_cmd) + len)); From eef6574a2ffb02d8d30ac47d004996d2f9395455 Mon Sep 17 00:00:00 2001 From: Ajay Parida Date: Mon, 29 Jul 2024 15:21:21 +0530 Subject: [PATCH 02/25] drivers: wifi: Change mode to mechanism [SHEL-2947] Changing naming of power save mode to mechanism(Text change). Signed-off-by: Ajay Parida --- nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h | 8 +++++--- nrf_wifi/fw_if/umac_if/src/cmd.c | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h b/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h index 970e6abee0..9ac470b198 100644 --- a/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h +++ b/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h @@ -832,7 +832,7 @@ enum op_band { * @brief This enum specifies the type of frames used to retrieve buffered data * from the AP in power save mode. */ -enum data_retrieve_frame { +enum data_retrieve_mechanism { /** Retrieves data from the AP using a PS-Poll frame */ PS_POLL_FRAME, /** Retrieves data from the AP using a QoS Null frame */ @@ -885,8 +885,10 @@ struct nrf_wifi_cmd_sys_init { * without receiving beacons before disconnection. */ unsigned int discon_timeout; - /** RPU uses QoS null frame or PS-Poll frame to retrieve buffered frames */ - unsigned char ps_data_retrieval_mode; + /** RPU uses QoS null frame or PS-Poll frame to retrieve buffered frames + * from the AP in power save @ref data_retrieve_mechanism. + */ + unsigned char ps_data_retrieval_mech; } __NRF_WIFI_PKD; * @brief This structure defines the command used to de-initialize the RPU. diff --git a/nrf_wifi/fw_if/umac_if/src/cmd.c b/nrf_wifi/fw_if/umac_if/src/cmd.c index e248f7f677..c28aa4f700 100644 --- a/nrf_wifi/fw_if/umac_if/src/cmd.c +++ b/nrf_wifi/fw_if/umac_if/src/cmd.c @@ -203,9 +203,9 @@ enum nrf_wifi_status umac_cmd_init(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx, } #if defined(CONFIG_NRF_WIFI_QOS_NULL_BASED_RETRIEVAL) - umac_cmd_data->ps_data_retrieval_mode = QOS_NULL_FRAME; + umac_cmd_data->ps_data_retrieval_mech = QOS_NULL_FRAME; #else - umac_cmd_data->ps_data_retrieval_mode = PS_POLL_FRAME; + umac_cmd_data->ps_data_retrieval_mech = PS_POLL_FRAME; #endif /* CONFIG_NRF_WIFI_QOS_NULL_BASED_RETRIEVAL */ status = nrf_wifi_hal_ctrl_cmd_send(fmac_dev_ctx->hal_dev_ctx, From d21b5fb14a006d9ea713efa83b60b5d3138c0294 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Wed, 15 May 2024 23:51:29 +0530 Subject: [PATCH 03/25] drivers: wifi: Implement RPU recovery callbacks FMAC relies on these callbacks to perform a RPU recovery i.e., coldboot the device in a clean way, this is achieved by performing an interface down and then up, this properly cleans up the driver, performs a cold boot and either through NET_IF events (for scan only) or WPA_S events (for full Wi-Fi) notifies the applications. Implements SHEL-2726. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/inc/default/fmac_api.h | 7 ++ .../fw_if/umac_if/inc/default/fmac_structs.h | 5 ++ .../fw_if/umac_if/inc/fw/host_rpu_sys_if.h | 1 + nrf_wifi/fw_if/umac_if/src/default/fmac_api.c | 45 +++++++++- .../fw_if/umac_if/src/radio_test/fmac_api.c | 3 +- nrf_wifi/hw_if/hal/inc/fw/rpu_if.h | 6 ++ nrf_wifi/hw_if/hal/inc/hal_api.h | 7 +- nrf_wifi/hw_if/hal/inc/hal_interrupt.h | 5 +- nrf_wifi/hw_if/hal/inc/hal_structs.h | 3 + nrf_wifi/hw_if/hal/src/hal_api.c | 43 +++++++++- nrf_wifi/hw_if/hal/src/hal_interrupt.c | 82 +++++++++++++++++-- 11 files changed, 195 insertions(+), 12 deletions(-) diff --git a/nrf_wifi/fw_if/umac_if/inc/default/fmac_api.h b/nrf_wifi/fw_if/umac_if/inc/default/fmac_api.h index f483fbc584..34eb6a4f37 100644 --- a/nrf_wifi/fw_if/umac_if/inc/default/fmac_api.h +++ b/nrf_wifi/fw_if/umac_if/inc/default/fmac_api.h @@ -1036,6 +1036,13 @@ bool nrf_wifi_util_is_rawpktmode_enabled(struct nrf_wifi_fmac_vif_ctx *vif); *@retval WIFI_NRF_STATUS_FAIL On failure */ enum nrf_wifi_status nrf_wifi_check_mode_validity(unsigned char mode); +#if defined(CONFIG_NRF_WIFI_RPU_RECOVERY) || defined(__DOXYGEN__) +/** @cond INTERNAL_HIDDEN */ +enum nrf_wifi_status nrf_wifi_fmac_rpu_recovery_callback(void *mac_dev_ctx, + void *event_data, + unsigned int len); +/** @endcond */ +#endif /* CONFIG_NRF_RPU_RECOVERY */ /** * @} */ diff --git a/nrf_wifi/fw_if/umac_if/inc/default/fmac_structs.h b/nrf_wifi/fw_if/umac_if/inc/default/fmac_structs.h index 1c42e55ea1..7e3a1e01f8 100644 --- a/nrf_wifi/fw_if/umac_if/inc/default/fmac_structs.h +++ b/nrf_wifi/fw_if/umac_if/inc/default/fmac_structs.h @@ -99,6 +99,11 @@ struct raw_rx_pkt_header { * the UMAC IF layer needs to invoke for various events. */ struct nrf_wifi_fmac_callbk_fns { + /** Callback function to be called when RPU recovery is required. */ + void (*rpu_recovery_callbk_fn)(void *os_vif_ctx, + void *event_data, + unsigned int event_len); + /** Callback function to be called when a scan is started. */ void (*scan_start_callbk_fn)(void *os_vif_ctx, struct nrf_wifi_umac_event_trigger_scan *scan_start_event, diff --git a/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h b/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h index 9ac470b198..a474f3b919 100644 --- a/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h +++ b/nrf_wifi/fw_if/umac_if/inc/fw/host_rpu_sys_if.h @@ -891,6 +891,7 @@ struct nrf_wifi_cmd_sys_init { unsigned char ps_data_retrieval_mech; } __NRF_WIFI_PKD; +/** * @brief This structure defines the command used to de-initialize the RPU. * */ diff --git a/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c b/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c index 40a34134d0..82f1b8437c 100644 --- a/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c +++ b/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c @@ -440,6 +440,44 @@ void nrf_wifi_fmac_dev_deinit(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx) nrf_wifi_hal_unlock_rx(fmac_dev_ctx->hal_dev_ctx); } +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY +enum nrf_wifi_status nrf_wifi_fmac_rpu_recovery_callback(void *mac_dev_ctx, + void *event_data, + unsigned int len) +{ + enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; + struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx = NULL; + struct nrf_wifi_fmac_dev_ctx_def *def_dev_ctx = NULL; + struct nrf_wifi_fmac_priv *fpriv = NULL; + struct nrf_wifi_fmac_priv_def *def_priv = NULL; + + fmac_dev_ctx = mac_dev_ctx; + if (!fmac_dev_ctx) { + nrf_wifi_osal_log_err(fpriv->opriv, + "%s: Invalid device context", + __func__); + goto out; + } + def_dev_ctx = wifi_dev_priv(fmac_dev_ctx); + if (!def_dev_ctx) { + nrf_wifi_osal_log_err(fpriv->opriv, + "%s: Invalid device context", + __func__); + goto out; + } + fpriv = fmac_dev_ctx->fpriv; + def_priv = wifi_fmac_priv(fpriv); + + /* Here we only care about FMAC, so, just use VIF0 */ + def_priv->callbk_fns.rpu_recovery_callbk_fn(def_dev_ctx->vif_ctx[0], + event_data, len); + + status = NRF_WIFI_STATUS_SUCCESS; +out: + return status; +} +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ + struct nrf_wifi_fmac_priv *nrf_wifi_fmac_init(struct nrf_wifi_data_config_params *data_config, struct rx_buf_pool_params *rx_buf_pools, struct nrf_wifi_fmac_callbk_fns *callbk_fns) @@ -525,7 +563,12 @@ struct nrf_wifi_fmac_priv *nrf_wifi_fmac_init(struct nrf_wifi_data_config_params fpriv->hpriv = nrf_wifi_hal_init(opriv, &hal_cfg_params, - &nrf_wifi_fmac_event_callback); + &nrf_wifi_fmac_event_callback, +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY + &nrf_wifi_fmac_rpu_recovery_callback); +#else + NULL); +#endif if (!fpriv->hpriv) { nrf_wifi_osal_log_err(opriv, diff --git a/nrf_wifi/fw_if/umac_if/src/radio_test/fmac_api.c b/nrf_wifi/fw_if/umac_if/src/radio_test/fmac_api.c index 6579460892..0c616b15b4 100644 --- a/nrf_wifi/fw_if/umac_if/src/radio_test/fmac_api.c +++ b/nrf_wifi/fw_if/umac_if/src/radio_test/fmac_api.c @@ -229,7 +229,8 @@ struct nrf_wifi_fmac_priv *nrf_wifi_fmac_init_rt(void) fpriv->hpriv = nrf_wifi_hal_init(opriv, &hal_cfg_params, - &nrf_wifi_fmac_event_callback); + &nrf_wifi_fmac_event_callback, + NULL); if (!fpriv->hpriv) { nrf_wifi_osal_log_err(opriv, diff --git a/nrf_wifi/hw_if/hal/inc/fw/rpu_if.h b/nrf_wifi/hw_if/hal/inc/fw/rpu_if.h index 88e3ea83cf..0fa1dc69bf 100644 --- a/nrf_wifi/hw_if/hal/inc/fw/rpu_if.h +++ b/nrf_wifi/hw_if/hal/inc/fw/rpu_if.h @@ -101,6 +101,12 @@ struct rpu_mcu_boot_vectors { #define RPU_REG_BIT_MIPS_WATCHDOG_INT_STATUS 1 #define RPU_REG_MIPS_MCU_TIMER_CONTROL 0xA4000048 +#define RPU_REG_MIPS_MCU_TIMER 0xA400004C /* 24 bit timer@core clock ticks*/ +#define RPU_REG_MIPS_MCU_TIMER_RESET_VAL 0xFFFFFF + +#define RPU_REG_MIPS_MCU_UCCP_INT_CLEAR 0xA400000C +#define RPU_REG_BIT_MIPS_UCCP_INT_CLEAR 0 +#define RPU_REG_BIT_MIPS_WATCHDOG_INT_CLEAR 1 #define RPU_REG_MIPS_MCU_SYS_CORE_MEM_CTRL 0xA4000030 /* 13.1.10 */ #define RPU_REG_MIPS_MCU_SYS_CORE_MEM_WDATA 0xA4000034 /* 13.1.11 */ diff --git a/nrf_wifi/hw_if/hal/inc/hal_api.h b/nrf_wifi/hw_if/hal/inc/hal_api.h index 0604a3ec46..0fa58fc1e5 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_api.h +++ b/nrf_wifi/hw_if/hal/inc/hal_api.h @@ -36,6 +36,8 @@ extern const struct nrf70_fw_addr_info nrf70_fw_addr_info[]; * @cfg_params: Parameters needed to configure the HAL for WLAN operation. * @intr_callbk_fn: Pointer to the callback function which the user of this * layer needs to implement to handle events from the RPU. + * @rpu_recovery_callbk_fn: Pointer to the callback function which the user of + * this layer needs to implement to handle RPU recovery. * * This API is used to initialize the HAL layer and is expected to be called * before using the HAL layer. This API returns a pointer to the HAL context @@ -48,7 +50,10 @@ nrf_wifi_hal_init(struct nrf_wifi_osal_priv *opriv, struct nrf_wifi_hal_cfg_params *cfg_params, enum nrf_wifi_status (*intr_callbk_fn)(void *mac_ctx, void *event_data, - unsigned int len)); + unsigned int len), + enum nrf_wifi_status (*rpu_recovery_callbk_fn)(void *mac_ctx, + void *event_data, + unsigned int len)); /** * nrf_wifi_hal_deinit() - Deinitialize the HAL layer. diff --git a/nrf_wifi/hw_if/hal/inc/hal_interrupt.h b/nrf_wifi/hw_if/hal/inc/hal_interrupt.h index c21e0e6781..849eef3617 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_interrupt.h +++ b/nrf_wifi/hw_if/hal/inc/hal_interrupt.h @@ -43,6 +43,8 @@ enum nrf_wifi_status hal_rpu_irq_disable(struct nrf_wifi_hal_dev_ctx *hal_dev_ct /** * hal_rpu_irq_process() - Processes an interrupt from the RPU. * @hal_dev_ctx: Pointer to HAL context. + * @do_rpu_recovery: Pointer to a boolean variable that indicates if the RPU recovery + * is required. * * This function is an interrupt handler for the interrupts generated by the * RPU. This function does the following: @@ -57,5 +59,6 @@ enum nrf_wifi_status hal_rpu_irq_disable(struct nrf_wifi_hal_dev_ctx *hal_dev_ct * Pass : %NRF_WIFI_STATUS_SUCCESS * Error: %NRF_WIFI_STATUS_FAIL */ -enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx); +enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, + bool *do_rpu_recovery); #endif /* __HAL_INTERRUPT_H__ */ diff --git a/nrf_wifi/hw_if/hal/inc/hal_structs.h b/nrf_wifi/hw_if/hal/inc/hal_structs.h index ba5076d680..f376ed5e77 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_structs.h +++ b/nrf_wifi/hw_if/hal/inc/hal_structs.h @@ -126,6 +126,9 @@ struct nrf_wifi_hal_priv { enum nrf_wifi_status (*intr_callbk_fn)(void *mac_ctx, void *event_data, unsigned int len); + enum nrf_wifi_status (*rpu_recovery_callbk_fn)(void *mac_ctx, + void *event_data, + unsigned int len); struct nrf_wifi_hal_cfg_params cfg_params; unsigned long addr_pktram_base; }; diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index ae44a90fd2..a5ed73b1e3 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -1398,6 +1398,28 @@ void nrf_wifi_hal_dev_deinit(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) nrf_wifi_bal_dev_deinit(hal_dev_ctx->bal_dev_ctx); } +enum nrf_wifi_status hal_rpu_recovery(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) +{ + enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; + + if (!hal_dev_ctx->hpriv->rpu_recovery_callbk_fn) { + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "%s: RPU recovery callback not registered", + __func__); + goto out; + } + + status = hal_dev_ctx->hpriv->rpu_recovery_callbk_fn(hal_dev_ctx->mac_dev_ctx, NULL, 0); + if (status != NRF_WIFI_STATUS_SUCCESS) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: RPU recovery failed", + __func__); + goto out; + } + +out: + return status; +} void nrf_wifi_hal_lock_rx(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { @@ -1425,6 +1447,7 @@ enum nrf_wifi_status nrf_wifi_hal_irq_handler(void *data) #ifdef CONFIG_NRF_WIFI_LOW_POWER enum RPU_PS_STATE ps_state = RPU_PS_STATE_ASLEEP; #endif /* CONFIG_NRF_WIFI_LOW_POWER */ + bool do_rpu_recovery = false; hal_dev_ctx = (struct nrf_wifi_hal_dev_ctx *)data; @@ -1447,7 +1470,7 @@ enum nrf_wifi_status nrf_wifi_hal_irq_handler(void *data) #endif /* CONFIG_NRF_WIFI_LOW_POWER_DBG */ #endif /* CONFIG_NRF_WIFI_LOW_POWER */ - status = hal_rpu_irq_process(hal_dev_ctx); + status = hal_rpu_irq_process(hal_dev_ctx, &do_rpu_recovery); #ifdef CONFIG_NRF_WIFI_LOW_POWER hal_rpu_ps_set_state(hal_dev_ctx, @@ -1461,6 +1484,18 @@ enum nrf_wifi_status nrf_wifi_hal_irq_handler(void *data) goto out; } + if (do_rpu_recovery) { + status = hal_rpu_recovery(hal_dev_ctx); + + if (status != NRF_WIFI_STATUS_SUCCESS) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: RPU recovery failed", + __func__); + } + /* RPU recovery is done, so ignore the rest of the processing */ + goto out; + } + nrf_wifi_osal_tasklet_schedule(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->event_tasklet); @@ -1671,7 +1706,10 @@ nrf_wifi_hal_init(struct nrf_wifi_osal_priv *opriv, struct nrf_wifi_hal_cfg_params *cfg_params, enum nrf_wifi_status (*intr_callbk_fn)(void *dev_ctx, void *event_data, - unsigned int len)) + unsigned int len), + enum nrf_wifi_status (*rpu_recovery_callbk_fn)(void *mac_ctx, + void *event_data, + unsigned int len)) { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; struct nrf_wifi_hal_priv *hpriv = NULL; @@ -1695,6 +1733,7 @@ nrf_wifi_hal_init(struct nrf_wifi_osal_priv *opriv, sizeof(hpriv->cfg_params)); hpriv->intr_callbk_fn = intr_callbk_fn; + hpriv->rpu_recovery_callbk_fn = rpu_recovery_callbk_fn; status = pal_rpu_addr_offset_get(opriv, RPU_ADDR_PKTRAM_START, diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index 91771a5b0e..bda94099c1 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -158,11 +158,10 @@ static bool hal_rpu_irq_wdog_chk(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) static enum nrf_wifi_status hal_rpu_irq_wdog_ack(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; - unsigned int val = 0; status = hal_rpu_reg_write(hal_dev_ctx, - RPU_REG_MIPS_MCU_TIMER_CONTROL, - val); + RPU_REG_MIPS_MCU_UCCP_INT_CLEAR, + 1 << RPU_REG_BIT_MIPS_WATCHDOG_INT_CLEAR); if (status != NRF_WIFI_STATUS_SUCCESS) { nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, @@ -176,6 +175,24 @@ static enum nrf_wifi_status hal_rpu_irq_wdog_ack(struct nrf_wifi_hal_dev_ctx *ha } +static enum nrf_wifi_status hal_rpu_irq_wdog_rearm(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) +{ + enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; + + status = hal_rpu_reg_write(hal_dev_ctx, + RPU_REG_MIPS_MCU_TIMER, + RPU_REG_MIPS_MCU_TIMER_RESET_VAL); + + if (status != NRF_WIFI_STATUS_SUCCESS) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: Rearming watchdog interrupt failed", + __func__); + goto out; + } +out: + return status; +} + static enum nrf_wifi_status hal_rpu_event_free(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, unsigned int event_addr) @@ -480,8 +497,55 @@ static unsigned int hal_rpu_event_get_all(struct nrf_wifi_hal_dev_ctx *hal_dev_c return num_events; } +static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, + bool *do_rpu_recovery) +{ + enum nrf_wifi_status nrf_wifi_status = NRF_WIFI_STATUS_FAIL; + bool rpu_recovery = false; +#ifdef CONFIG_NRF_WIFI_LOW_POWER + unsigned long flags = 0; +#endif + + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "Processing watchdog interrupt"); + + /* Check if host has asserted WAKEUP_NOW */ +#ifdef CONFIG_NRF_WIFI_LOW_POWER + nrf_wifi_osal_spinlock_irq_take(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->rpu_ps_lock, + &flags); + + if (hal_dev_ctx->rpu_ps_state == RPU_PS_STATE_AWAKE) { + nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->rpu_ps_lock, + &flags); + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "Host has asserted WAKEUP_NOW, ignoring watchdog interrupt"); + goto out; + } + + rpu_recovery = true; + nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->rpu_ps_lock, + &flags); +#endif /* CONFIG_NRF_WIFI_LOW_POWER */ -enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) + if (!rpu_recovery) { + hal_rpu_irq_wdog_rearm(hal_dev_ctx); + goto out; + } + + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "Host has not asserted WAKEUP_NOW, start RPU recovery"); +out: + nrf_wifi_status = NRF_WIFI_STATUS_SUCCESS; + *do_rpu_recovery = rpu_recovery; + + return nrf_wifi_status; +} + +enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, + bool *do_rpu_recovery) { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; unsigned int num_events = 0; @@ -509,12 +573,18 @@ enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ct * RPU watchdog */ if (hal_rpu_irq_wdog_chk(hal_dev_ctx)) { - /* TODO: Perform RPU recovery */ nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "Received watchdog interrupt"); - status = hal_rpu_irq_wdog_ack(hal_dev_ctx); + status = hal_rpu_process_wdog(hal_dev_ctx, do_rpu_recovery); + if (status == NRF_WIFI_STATUS_FAIL) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: hal_rpu_process_wdog failed", + __func__); + goto out; + } + status = hal_rpu_irq_wdog_ack(hal_dev_ctx); if (status == NRF_WIFI_STATUS_FAIL) { nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, "%s: hal_rpu_irq_wdog_ack failed", From e9f422bde32d2f16cdae0fa2a73b889faa2f1eee Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Mon, 27 May 2024 17:24:43 +0530 Subject: [PATCH 04/25] drivers: wifi: nrf700x: Fix crash in TX done during de-init Backport ae1309009050152319fed37ac6e3ae28b3844d97. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/tx.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nrf_wifi/fw_if/umac_if/src/tx.c b/nrf_wifi/fw_if/umac_if/src/tx.c index b0bf63b753..509584c46e 100644 --- a/nrf_wifi/fw_if/umac_if/src/tx.c +++ b/nrf_wifi/fw_if/umac_if/src/tx.c @@ -1452,6 +1452,14 @@ enum nrf_wifi_status nrf_wifi_fmac_rawtx_done_event_process( goto out; } + def_dev_ctx = wifi_dev_priv(fmac_dev_ctx); + if (!def_dev_ctx || !def_dev_ctx->tx_config.tx_lock) { + /* This is a valid case when the TX_DONE event is received + * during the driver deinit, so, silently ignore the failure. + */ + return NRF_WIFI_STATUS_SUCCESS; + } + nrf_wifi_osal_spinlock_take(fmac_dev_ctx->fpriv->opriv, def_dev_ctx->tx_config.tx_lock); From 02751df20892b6392634cfaa9ac8153147b9ee7a Mon Sep 17 00:00:00 2001 From: srinivasa raju chintalapati Date: Tue, 28 May 2024 13:12:24 +0530 Subject: [PATCH 05/25] drivers: wifi: Always check for watchdog IRQ RPU hostport uses OR logic to manage both normal event IRQ line and watchdog IRQ line, so, for every IRQ check for both sources independently. Signed-off-by: Chaitanya Tata Signed-off-by: srinivasa raju chintalapati --- nrf_wifi/hw_if/hal/src/hal_interrupt.c | 46 +++++++++++--------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index bda94099c1..d2224ee5be 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -548,8 +548,6 @@ enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ct bool *do_rpu_recovery) { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; - unsigned int num_events = 0; - /* Get all the events in the queue. It is possible that there are no * events in the queue. This is a valid scenario as per our present @@ -562,35 +560,29 @@ enum nrf_wifi_status hal_rpu_irq_process(struct nrf_wifi_hal_dev_ctx *hal_dev_ct * the interrupt source. This will be a problem in shared interrupt * scenarios and has to be taken care by the SOC designers. */ - num_events = hal_rpu_event_get_all(hal_dev_ctx); + (void)hal_rpu_event_get_all(hal_dev_ctx); - /* If we received an interrupt without any associated event(s) it is a - * likely indication that the RPU is stuck and this interrupt has been - * raised by the watchdog + /* Check the if this interrupt has been raised by the + * RPU watchdog */ - if (!num_events) { - /* Check the if this interrupt has been raised by the - * RPU watchdog - */ - if (hal_rpu_irq_wdog_chk(hal_dev_ctx)) { - nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "Received watchdog interrupt"); + if (hal_rpu_irq_wdog_chk(hal_dev_ctx)) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "Received watchdog interrupt"); - status = hal_rpu_process_wdog(hal_dev_ctx, do_rpu_recovery); - if (status == NRF_WIFI_STATUS_FAIL) { - nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, - "%s: hal_rpu_process_wdog failed", - __func__); - goto out; - } + status = hal_rpu_process_wdog(hal_dev_ctx, do_rpu_recovery); + if (status == NRF_WIFI_STATUS_FAIL) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: hal_rpu_process_wdog failed", + __func__); + goto out; + } - status = hal_rpu_irq_wdog_ack(hal_dev_ctx); - if (status == NRF_WIFI_STATUS_FAIL) { - nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, - "%s: hal_rpu_irq_wdog_ack failed", - __func__); - goto out; - } + status = hal_rpu_irq_wdog_ack(hal_dev_ctx); + if (status == NRF_WIFI_STATUS_FAIL) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: hal_rpu_irq_wdog_ack failed", + __func__); + goto out; } } From f99660422117f590dde023277bcf820504dea064 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Wed, 5 Jun 2024 01:29:35 +0530 Subject: [PATCH 06/25] nrf_wifi: Add support for recovering RPU stuck in sleep * As RPU recovery can triggered called from multiple places, use a tasklet with a lock to trigger RPU recovery. * In case RPU is stuck in sleep, FW based watchdog interrupt will not be received, so, recovery cannot be triggered. So, in case of RPU wakeup failure, trigger the recovery. Fixes SHEL-2810. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/inc/hal_structs.h | 2 + nrf_wifi/hw_if/hal/src/hal_api.c | 121 +++++++++++++++++++-------- 2 files changed, 89 insertions(+), 34 deletions(-) diff --git a/nrf_wifi/hw_if/hal/inc/hal_structs.h b/nrf_wifi/hw_if/hal/inc/hal_structs.h index f376ed5e77..02d891d972 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_structs.h +++ b/nrf_wifi/hw_if/hal/inc/hal_structs.h @@ -240,6 +240,8 @@ struct nrf_wifi_hal_dev_ctx { unsigned int event_data_pending; unsigned int event_resubmit; enum NRF_WIFI_HAL_STATUS hal_status; + void *recovery_tasklet; + void *lock_recovery; }; diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index a5ed73b1e3..8f013a318a 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -372,6 +372,8 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) RPU_PS_WAKE_TIMEOUT_S, reg_val, rpu_ps_state_mask); + nrf_wifi_osal_tasklet_schedule(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->recovery_tasklet); goto out; } hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_AWAKE; @@ -1098,6 +1100,51 @@ void nrf_wifi_hal_proc_ctx_set(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, } +static enum nrf_wifi_status hal_rpu_recovery(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) +{ + enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; + + if (!hal_dev_ctx->hpriv->rpu_recovery_callbk_fn) { + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "%s: RPU recovery callback not registered", + __func__); + goto out; + } + + status = hal_dev_ctx->hpriv->rpu_recovery_callbk_fn(hal_dev_ctx->mac_dev_ctx, NULL, 0); + if (status != NRF_WIFI_STATUS_SUCCESS) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: RPU recovery failed", + __func__); + goto out; + } + +out: + return status; +} + +static void recovery_tasklet_fn(unsigned long data) +{ + struct nrf_wifi_hal_dev_ctx *hal_dev_ctx = NULL; + unsigned long flags = 0; + + hal_dev_ctx = (struct nrf_wifi_hal_dev_ctx *)data; + if (!hal_dev_ctx) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: Invalid hal_dev_ctx", + __func__); + return; + } + + nrf_wifi_osal_spinlock_irq_take(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->lock_recovery, + &flags); + hal_rpu_recovery(hal_dev_ctx); + nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->lock_recovery, + &flags); +} + struct nrf_wifi_hal_dev_ctx *nrf_wifi_hal_dev_add(struct nrf_wifi_hal_priv *hpriv, void *mac_dev_ctx) { @@ -1182,6 +1229,29 @@ struct nrf_wifi_hal_dev_ctx *nrf_wifi_hal_dev_add(struct nrf_wifi_hal_priv *hpri event_tasklet_fn, (unsigned long)hal_dev_ctx); + hal_dev_ctx->recovery_tasklet = nrf_wifi_osal_tasklet_alloc(hpriv->opriv, + NRF_WIFI_TASKLET_TYPE_BH); + if (!hal_dev_ctx->recovery_tasklet) { + nrf_wifi_osal_log_err(hpriv->opriv, + "%s: Unable to allocate recovery_tasklet", + __func__); + goto event_tasklet_free; + } + nrf_wifi_osal_tasklet_init(hpriv->opriv, + hal_dev_ctx->recovery_tasklet, + recovery_tasklet_fn, + (unsigned long)hal_dev_ctx); + + hal_dev_ctx->lock_recovery = nrf_wifi_osal_spinlock_alloc(hpriv->opriv); + if (!hal_dev_ctx->lock_recovery) { + nrf_wifi_osal_log_err(hpriv->opriv, + "%s: Unable to allocate recovery lock", + __func__); + goto recovery_tasklet_free; + } + + nrf_wifi_osal_spinlock_init(hpriv->opriv, + hal_dev_ctx->lock_recovery); #ifdef CONFIG_NRF_WIFI_LOW_POWER status = hal_rpu_ps_init(hal_dev_ctx); @@ -1189,7 +1259,7 @@ struct nrf_wifi_hal_dev_ctx *nrf_wifi_hal_dev_add(struct nrf_wifi_hal_priv *hpri nrf_wifi_osal_log_err(hpriv->opriv, "%s: hal_rpu_ps_init failed", __func__); - goto tasklet_free; + goto lock_recovery_free; } #endif /* CONFIG_NRF_WIFI_LOW_POWER */ @@ -1200,7 +1270,7 @@ struct nrf_wifi_hal_dev_ctx *nrf_wifi_hal_dev_add(struct nrf_wifi_hal_priv *hpri nrf_wifi_osal_log_err(hpriv->opriv, "%s: nrf_wifi_bal_dev_add failed", __func__); - goto tasklet_free; + goto lock_recovery_free; } status = hal_rpu_irq_enable(hal_dev_ctx); @@ -1274,7 +1344,13 @@ struct nrf_wifi_hal_dev_ctx *nrf_wifi_hal_dev_add(struct nrf_wifi_hal_priv *hpri #endif /* !CONFIG_NRF700X_RADIO_TEST */ bal_dev_free: nrf_wifi_bal_dev_rem(hal_dev_ctx->bal_dev_ctx); -tasklet_free: +lock_recovery_free: + nrf_wifi_osal_spinlock_free(hpriv->opriv, + hal_dev_ctx->lock_recovery); +recovery_tasklet_free: + nrf_wifi_osal_tasklet_free(hpriv->opriv, + hal_dev_ctx->recovery_tasklet); +event_tasklet_free: nrf_wifi_osal_tasklet_free(hpriv->opriv, hal_dev_ctx->event_tasklet); lock_rx_free: @@ -1302,6 +1378,12 @@ void nrf_wifi_hal_dev_rem(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { unsigned int i = 0; + + nrf_wifi_osal_tasklet_kill(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->recovery_tasklet); + nrf_wifi_osal_tasklet_free(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->recovery_tasklet); + nrf_wifi_osal_tasklet_kill(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->event_tasklet); @@ -1398,29 +1480,6 @@ void nrf_wifi_hal_dev_deinit(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) nrf_wifi_bal_dev_deinit(hal_dev_ctx->bal_dev_ctx); } -enum nrf_wifi_status hal_rpu_recovery(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) -{ - enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; - - if (!hal_dev_ctx->hpriv->rpu_recovery_callbk_fn) { - nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "%s: RPU recovery callback not registered", - __func__); - goto out; - } - - status = hal_dev_ctx->hpriv->rpu_recovery_callbk_fn(hal_dev_ctx->mac_dev_ctx, NULL, 0); - if (status != NRF_WIFI_STATUS_SUCCESS) { - nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, - "%s: RPU recovery failed", - __func__); - goto out; - } - -out: - return status; -} - void nrf_wifi_hal_lock_rx(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { unsigned long flags = 0; @@ -1485,14 +1544,8 @@ enum nrf_wifi_status nrf_wifi_hal_irq_handler(void *data) } if (do_rpu_recovery) { - status = hal_rpu_recovery(hal_dev_ctx); - - if (status != NRF_WIFI_STATUS_SUCCESS) { - nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, - "%s: RPU recovery failed", - __func__); - } - /* RPU recovery is done, so ignore the rest of the processing */ + nrf_wifi_osal_tasklet_schedule(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->recovery_tasklet); goto out; } From d5a4a20d559bc7ef21dd46fbeb414a65500e98ed Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Mon, 8 Jul 2024 21:59:15 +0530 Subject: [PATCH 07/25] drivers: wifi: Use a separate variable to track host assertion In case host is asserting wakeup_now, don't rely on RPU PS state, as that is derived from multiples sources wakeup_now, RPU interrupt etc. Use a dedicated flag to track. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/inc/hal_structs.h | 1 + nrf_wifi/hw_if/hal/src/hal_api.c | 2 ++ nrf_wifi/hw_if/hal/src/hal_interrupt.c | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/nrf_wifi/hw_if/hal/inc/hal_structs.h b/nrf_wifi/hw_if/hal/inc/hal_structs.h index 02d891d972..4ebff83aa1 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_structs.h +++ b/nrf_wifi/hw_if/hal/inc/hal_structs.h @@ -227,6 +227,7 @@ struct nrf_wifi_hal_dev_ctx { unsigned long addr_rpu_pktram_base_rx_pool[MAX_NUM_OF_RX_QUEUES]; unsigned long tx_frame_offset; #ifdef CONFIG_NRF_WIFI_LOW_POWER + bool is_wakup_now_asserted; enum RPU_PS_STATE rpu_ps_state; void *rpu_ps_timer; void *rpu_ps_lock; diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 8f013a318a..3af297794b 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -332,6 +332,7 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) } nrf_wifi_bal_rpu_ps_wake(hal_dev_ctx->bal_dev_ctx); + hal_dev_ctx->is_wakup_now_asserted = true; start_time_us = nrf_wifi_osal_time_get_curr_us(hal_dev_ctx->hpriv->opriv); @@ -400,6 +401,7 @@ static void hal_rpu_ps_sleep(unsigned long data) &flags); nrf_wifi_bal_rpu_ps_sleep(hal_dev_ctx->bal_dev_ctx); + hal_dev_ctx->is_wakup_now_asserted = false; hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_ASLEEP; diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index d2224ee5be..b9998e44b4 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -515,7 +515,7 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha hal_dev_ctx->rpu_ps_lock, &flags); - if (hal_dev_ctx->rpu_ps_state == RPU_PS_STATE_AWAKE) { + if (hal_dev_ctx->is_wakup_now_asserted) { nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->rpu_ps_lock, &flags); From 57da5d7d90e8a31dd30cca5daf5ca10520c5efa5 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Mon, 8 Jul 2024 22:42:56 +0530 Subject: [PATCH 08/25] drivers: wifi: Fix RPU recovery not being triggered During watchdog (or any) interrupt processing, RPU accesses are being made and they assert the wakeup_now flag this causes RPU recovery to not trigger. New false or true recovery detection algo: Check the time difference b/w last de-assert and assert, and if it exceeds minimum time needed for RPU to enter sleep, then not the timestamp. This timestamp will be used to compare when a watchdog interrupt is received and see if during the last window if host has given a chance for RPU to attempt sleep, if yes, then attempt recovery else ignore watchdog. Also, add a Kconfig for the 10s active time that triggers recovery, this needs to be passed to the FW (once we have enough patch memory). Also, add a Kconfig for the minimum time needed for RPU to attempt sleep in positive case. Also, add a new _ms API for time stamp fetch, this is to avoid precision loss when converting to and from ms to us and also makes code readable by avoiding *1000 and /1000. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/inc/hal_structs.h | 3 ++ nrf_wifi/hw_if/hal/src/hal_api.c | 17 +++++++++++ nrf_wifi/hw_if/hal/src/hal_interrupt.c | 41 +++++++++++++++----------- nrf_wifi/os_if/inc/osal_api.h | 22 ++++++++++++++ nrf_wifi/os_if/inc/osal_ops.h | 2 ++ nrf_wifi/os_if/src/osal.c | 10 +++++++ 6 files changed, 78 insertions(+), 17 deletions(-) diff --git a/nrf_wifi/hw_if/hal/inc/hal_structs.h b/nrf_wifi/hw_if/hal/inc/hal_structs.h index 4ebff83aa1..42ab342276 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_structs.h +++ b/nrf_wifi/hw_if/hal/inc/hal_structs.h @@ -227,6 +227,9 @@ struct nrf_wifi_hal_dev_ctx { unsigned long addr_rpu_pktram_base_rx_pool[MAX_NUM_OF_RX_QUEUES]; unsigned long tx_frame_offset; #ifdef CONFIG_NRF_WIFI_LOW_POWER + unsigned long last_wakeup_now_asserted_time_ms; + unsigned long last_wakeup_now_deasserted_time_ms; + unsigned long last_rpu_sleep_opp_time_ms; bool is_wakup_now_asserted; enum RPU_PS_STATE rpu_ps_state; void *rpu_ps_timer; diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 3af297794b..9d2f73a10a 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -300,6 +300,18 @@ unsigned long nrf_wifi_hal_buf_unmap_tx(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx #ifdef CONFIG_NRF_WIFI_LOW_POWER +static void did_rpu_had_sleep_opp(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) +{ + unsigned int deassert_time_diff_ms = nrf_wifi_osal_time_elapsed_ms( + hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->last_wakeup_now_deasserted_time_ms); + + if (deassert_time_diff_ms > CONFIG_NRF_WIFI_RPU_MIN_TIME_TO_ENTER_SLEEP_MS) { + hal_dev_ctx->last_rpu_sleep_opp_time_ms = + hal_dev_ctx->last_wakeup_now_deasserted_time_ms; + } +} + enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { unsigned int reg_val = 0; @@ -333,6 +345,8 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) nrf_wifi_bal_rpu_ps_wake(hal_dev_ctx->bal_dev_ctx); hal_dev_ctx->is_wakup_now_asserted = true; + hal_dev_ctx->last_wakeup_now_asserted_time_ms = + nrf_wifi_osal_time_get_curr_ms(hal_dev_ctx->hpriv->opriv); start_time_us = nrf_wifi_osal_time_get_curr_us(hal_dev_ctx->hpriv->opriv); @@ -378,6 +392,7 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) goto out; } hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_AWAKE; + did_rpu_had_sleep_opp(hal_dev_ctx); out: if (!hal_dev_ctx->irq_ctx) { @@ -402,6 +417,8 @@ static void hal_rpu_ps_sleep(unsigned long data) nrf_wifi_bal_rpu_ps_sleep(hal_dev_ctx->bal_dev_ctx); hal_dev_ctx->is_wakup_now_asserted = false; + hal_dev_ctx->last_wakeup_now_deasserted_time_ms = + nrf_wifi_osal_time_get_curr_ms(hal_dev_ctx->hpriv->opriv); hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_ASLEEP; diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index b9998e44b4..df359244b7 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -497,37 +497,44 @@ static unsigned int hal_rpu_event_get_all(struct nrf_wifi_hal_dev_ctx *hal_dev_c return num_events; } +static inline bool is_rpu_recovery_needed(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) +{ + unsigned int rpu_sleep_opp_diff_ms = nrf_wifi_osal_time_elapsed_ms( + hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->last_rpu_sleep_opp_time_ms); + + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "RPU sleep opp diff: %d ms, last RPU sleep opp time: %lu", + rpu_sleep_opp_diff_ms, + hal_dev_ctx->last_rpu_sleep_opp_time_ms); + + if (rpu_sleep_opp_diff_ms >= CONFIG_NRF_WIFI_RPU_RECOVERY_PS_ACTIVE_TIMEOUT_MS) { + return false; + } + + return true; +} + static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, bool *do_rpu_recovery) { enum nrf_wifi_status nrf_wifi_status = NRF_WIFI_STATUS_FAIL; bool rpu_recovery = false; -#ifdef CONFIG_NRF_WIFI_LOW_POWER - unsigned long flags = 0; -#endif nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "Processing watchdog interrupt"); - /* Check if host has asserted WAKEUP_NOW */ #ifdef CONFIG_NRF_WIFI_LOW_POWER - nrf_wifi_osal_spinlock_irq_take(hal_dev_ctx->hpriv->opriv, - hal_dev_ctx->rpu_ps_lock, - &flags); - - if (hal_dev_ctx->is_wakup_now_asserted) { - nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, - hal_dev_ctx->rpu_ps_lock, - &flags); + /* Check if host has asserted WAKEUP_NOW or if the RPU has been in + * PS_ACTIVE state for more than the timeout period + */ + if (!is_rpu_recovery_needed(hal_dev_ctx)) { nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "Host has asserted WAKEUP_NOW, ignoring watchdog interrupt"); + "Host has not given RPU opp to sleep for the timeout period, RPU recovery not needed"); goto out; } rpu_recovery = true; - nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, - hal_dev_ctx->rpu_ps_lock, - &flags); #endif /* CONFIG_NRF_WIFI_LOW_POWER */ if (!rpu_recovery) { @@ -536,7 +543,7 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha } nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "Host has not asserted WAKEUP_NOW, start RPU recovery"); + "Host has given RPU opp to sleep at least once for the timeout period, , RPU recovery needed"); out: nrf_wifi_status = NRF_WIFI_STATUS_SUCCESS; *do_rpu_recovery = rpu_recovery; diff --git a/nrf_wifi/os_if/inc/osal_api.h b/nrf_wifi/os_if/inc/osal_api.h index 1b2b447c5c..61b837948a 100644 --- a/nrf_wifi/os_if/inc/osal_api.h +++ b/nrf_wifi/os_if/inc/osal_api.h @@ -884,7 +884,29 @@ unsigned long nrf_wifi_osal_time_get_curr_us(struct nrf_wifi_osal_priv *opriv); unsigned int nrf_wifi_osal_time_elapsed_us(struct nrf_wifi_osal_priv *opriv, unsigned long start_time_us); +/** + * nrf_wifi_osal_time_get_curr_ms() - Get current system uptime in milliseconds. + * @opriv: Pointer to the OSAL context returned by the @nrf_wifi_osal_init API. + * + * Gets the current system uptime in milliseconds. + * + * Return: System uptime in milliseconds. + */ +unsigned long nrf_wifi_osal_time_get_curr_ms(struct nrf_wifi_osal_priv *opriv); +/** + * nrf_wifi_osal_time_elapsed_ms() - Get elapsed time in milliseconds + * @opriv: Pointer to the OSAL context returned by the @nrf_wifi_osal_init API. + * @start_time_ms: The timestamp in milliseconds from which elapsed + * time is to be measured. + * + * Returns the time elapsed in milliseconds since some + * time instant (@start_time_ms). + * + * Return: Elapsed time in milliseconds. + */ +unsigned int nrf_wifi_osal_time_elapsed_ms(struct nrf_wifi_osal_priv *opriv, + unsigned long start_time_ms); /** * nrf_wifi_osal_bus_pcie_init() - Initialize a PCIe driver. diff --git a/nrf_wifi/os_if/inc/osal_ops.h b/nrf_wifi/os_if/inc/osal_ops.h index 63186ed785..a29d525f8d 100644 --- a/nrf_wifi/os_if/inc/osal_ops.h +++ b/nrf_wifi/os_if/inc/osal_ops.h @@ -258,6 +258,8 @@ struct nrf_wifi_osal_ops { int (*delay_us)(int usecs); unsigned long (*time_get_curr_us)(void); unsigned int (*time_elapsed_us)(unsigned long start_time_us); + unsigned long (*time_get_curr_ms)(void); + unsigned int (*time_elapsed_ms)(unsigned long start_time_us); void *(*bus_pcie_init)(const char *dev_name, unsigned int vendor_id, diff --git a/nrf_wifi/os_if/src/osal.c b/nrf_wifi/os_if/src/osal.c index 5abeae7a00..cf650daed2 100644 --- a/nrf_wifi/os_if/src/osal.c +++ b/nrf_wifi/os_if/src/osal.c @@ -508,6 +508,16 @@ unsigned int nrf_wifi_osal_time_elapsed_us(struct nrf_wifi_osal_priv *opriv, return opriv->ops->time_elapsed_us(start_time_us); } +unsigned long nrf_wifi_osal_time_get_curr_ms(struct nrf_wifi_osal_priv *opriv) +{ + return opriv->ops->time_get_curr_ms(); +} + +unsigned int nrf_wifi_osal_time_elapsed_ms(struct nrf_wifi_osal_priv *opriv, + unsigned long start_time_ms) +{ + return opriv->ops->time_elapsed_ms(start_time_ms); +} void *nrf_wifi_osal_bus_pcie_init(struct nrf_wifi_osal_priv *opriv, const char *dev_name, From d300c15314894e79d168bd68faa9f3da06c8bb4c Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Wed, 10 Jul 2024 00:44:08 +0530 Subject: [PATCH 09/25] drivers: wifi: Fix crash during interface down Add a missing NULL check for RX buffers, without this we see a crash during RPU recovery. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_api.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 9d2f73a10a..f59d963ddc 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -66,6 +66,13 @@ unsigned long nrf_wifi_hal_buf_map_rx(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, unsigned long bounce_buf_addr = 0; unsigned long rpu_addr = 0; + if (!hal_dev_ctx || !hal_dev_ctx->rx_buf_info[pool_id]) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: Invalid parameters\n", + __func__); + goto out; + } + rx_buf_info = &hal_dev_ctx->rx_buf_info[pool_id][buf_id]; if (rx_buf_info->mapped) { From 82f852c63de04e44871376242a530260debc3625 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Wed, 10 Jul 2024 00:56:32 +0530 Subject: [PATCH 10/25] drivers: wifi: Add support for separate debugs for RPU recovery These are helpful for debugging RPU recovery only. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_interrupt.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index df359244b7..ffaf2bd6c0 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -503,10 +503,17 @@ static inline bool is_rpu_recovery_needed(struct nrf_wifi_hal_dev_ctx *hal_dev_c hal_dev_ctx->hpriv->opriv, hal_dev_ctx->last_rpu_sleep_opp_time_ms); +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "RPU sleep opp diff: %d ms, last RPU sleep opp time: %lu", + rpu_sleep_opp_diff_ms, + hal_dev_ctx->last_rpu_sleep_opp_time_ms); +#else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "RPU sleep opp diff: %d ms, last RPU sleep opp time: %lu", rpu_sleep_opp_diff_ms, hal_dev_ctx->last_rpu_sleep_opp_time_ms); +#endif if (rpu_sleep_opp_diff_ms >= CONFIG_NRF_WIFI_RPU_RECOVERY_PS_ACTIVE_TIMEOUT_MS) { return false; @@ -521,16 +528,26 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha enum nrf_wifi_status nrf_wifi_status = NRF_WIFI_STATUS_FAIL; bool rpu_recovery = false; +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "Processing watchdog interrupt"); +#else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "Processing watchdog interrupt"); +#endif #ifdef CONFIG_NRF_WIFI_LOW_POWER /* Check if host has asserted WAKEUP_NOW or if the RPU has been in * PS_ACTIVE state for more than the timeout period */ if (!is_rpu_recovery_needed(hal_dev_ctx)) { +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "Host has not given RPU opp to sleep for the timeout period, RPU recovery not needed"); +#else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "Host has not given RPU opp to sleep for the timeout period, RPU recovery not needed"); +#endif goto out; } @@ -542,8 +559,13 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha goto out; } +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "Host has given RPU opp to sleep at least once for the timeout period, RPU recovery needed"); +#else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "Host has given RPU opp to sleep at least once for the timeout period, , RPU recovery needed"); + "Host has given RPU opp to sleep at least once for the timeout period, RPU recovery needed"); +#endif out: nrf_wifi_status = NRF_WIFI_STATUS_SUCCESS; *do_rpu_recovery = rpu_recovery; From 2ce6a64cbfc98c6b73e6e2a27657c8dff8a66152 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Wed, 10 Jul 2024 01:13:40 +0530 Subject: [PATCH 11/25] drivers: wifi: Fix de-init race condition The original fix is too big to backport, so, a simple check is added to fix race condition during de-init causing mulitple crashes. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/default/fmac_api.c | 3 +-- nrf_wifi/hw_if/hal/src/hal_api.c | 23 +++++++++++++++---- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c b/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c index 82f1b8437c..dc9ee7b8c0 100644 --- a/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c +++ b/nrf_wifi/fw_if/umac_if/src/default/fmac_api.c @@ -433,11 +433,10 @@ enum nrf_wifi_status nrf_wifi_fmac_dev_init(struct nrf_wifi_fmac_dev_ctx *fmac_d void nrf_wifi_fmac_dev_deinit(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx) { - nrf_wifi_hal_lock_rx(fmac_dev_ctx->hal_dev_ctx); + nrf_wifi_hal_dev_deinit(fmac_dev_ctx->hal_dev_ctx); nrf_wifi_fmac_fw_deinit(fmac_dev_ctx); nrf_wifi_osal_mem_free(fmac_dev_ctx->fpriv->opriv, fmac_dev_ctx->tx_pwr_ceil_params); - nrf_wifi_hal_unlock_rx(fmac_dev_ctx->hal_dev_ctx); } #ifdef CONFIG_NRF_WIFI_RPU_RECOVERY diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index f59d963ddc..17bd33ca87 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -1014,6 +1014,12 @@ static void event_tasklet_fn(unsigned long data) unsigned long flags = 0; hal_dev_ctx = (struct nrf_wifi_hal_dev_ctx *)data; + if (!hal_dev_ctx) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: Invalid hal_dev_ctx\n", + __func__); + return; + } nrf_wifi_osal_spinlock_irq_take(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->lock_rx, @@ -1503,6 +1509,7 @@ enum nrf_wifi_status nrf_wifi_hal_dev_init(struct nrf_wifi_hal_dev_ctx *hal_dev_ void nrf_wifi_hal_dev_deinit(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { + nrf_wifi_hal_disable(hal_dev_ctx); nrf_wifi_bal_dev_deinit(hal_dev_ctx->bal_dev_ctx); } @@ -1535,15 +1542,20 @@ enum nrf_wifi_status nrf_wifi_hal_irq_handler(void *data) bool do_rpu_recovery = false; hal_dev_ctx = (struct nrf_wifi_hal_dev_ctx *)data; + if (!hal_dev_ctx) { + nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, + "%s: Invalid hal_dev_ctx\n", + __func__); + goto out; + } nrf_wifi_osal_spinlock_irq_take(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->lock_rx, &flags); if (hal_dev_ctx->hal_status != NRF_WIFI_HAL_STATUS_ENABLED) { - /* Ignore the interrupt if the HAL is not enabled */ status = NRF_WIFI_STATUS_SUCCESS; - goto out; + goto unlock; } #ifdef CONFIG_NRF_WIFI_LOW_POWER @@ -1566,22 +1578,23 @@ enum nrf_wifi_status nrf_wifi_hal_irq_handler(void *data) #endif /* CONFIG_NRF_WIFI_LOW_POWER */ if (status != NRF_WIFI_STATUS_SUCCESS) { - goto out; + goto unlock; } if (do_rpu_recovery) { nrf_wifi_osal_tasklet_schedule(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->recovery_tasklet); - goto out; + goto unlock; } nrf_wifi_osal_tasklet_schedule(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->event_tasklet); -out: +unlock: nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->lock_rx, &flags); +out: return status; } From 9e3fbfde136c06082693e596e8a5d8ad96b4d655 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Tue, 2 Jul 2024 14:54:09 +0530 Subject: [PATCH 12/25] drivers: wifi: Log the event len This helps us understand OOM issues. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_interrupt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index ffaf2bd6c0..8180f53d68 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -405,8 +405,8 @@ static enum nrf_wifi_status hal_rpu_event_get(struct nrf_wifi_hal_dev_ctx *hal_d if (!event) { nrf_wifi_osal_log_err(hal_dev_ctx->hpriv->opriv, - "%s: Unable to alloc HAL msg for event", - __func__); + "%s: Unable to alloc HAL msg for event, len %d\n", + __func__, hal_dev_ctx->event_data_len); nrf_wifi_osal_mem_free(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->event_data); hal_dev_ctx->event_data = NULL; From bf96b7f573e56ac9fde8ee0347a13903cfe3197c Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Tue, 16 Jul 2024 02:44:50 +0530 Subject: [PATCH 13/25] drivers: wifi: Drain events during de-init When HAL is being de-initialized drain the events to free up the memory and also to avoid accessing any freed up variables. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_api.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 17bd33ca87..8f62187372 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -1123,8 +1123,6 @@ void hal_rpu_eventq_drain(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) return; } - - void nrf_wifi_hal_proc_ctx_set(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, enum RPU_PROC_TYPE proc) { @@ -1511,6 +1509,7 @@ void nrf_wifi_hal_dev_deinit(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { nrf_wifi_hal_disable(hal_dev_ctx); nrf_wifi_bal_dev_deinit(hal_dev_ctx->bal_dev_ctx); + hal_rpu_eventq_drain(hal_dev_ctx); } void nrf_wifi_hal_lock_rx(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) From 571d801381f3ce0ce53b254870dd651a564b79cc Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Tue, 16 Jul 2024 02:46:50 +0530 Subject: [PATCH 14/25] drivers: wifi: Fix memory leak in HAL Commit e1fc1137e ("nrf_wifi: Add support for recovering RPU stuck in sleep") introduced a memory leak where recovery spin lock isn't freed. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_api.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 8f62187372..781d8cda77 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -1413,6 +1413,8 @@ void nrf_wifi_hal_dev_rem(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) hal_dev_ctx->recovery_tasklet); nrf_wifi_osal_tasklet_free(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->recovery_tasklet); + nrf_wifi_osal_spinlock_free(hal_dev_ctx->hpriv->opriv, + hal_dev_ctx->lock_recovery); nrf_wifi_osal_tasklet_kill(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->event_tasklet); From e785ede0bbf24016208ee44c845f6e591ed49e25 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 18 Jul 2024 00:14:16 +0530 Subject: [PATCH 15/25] drivers: wifi: Fix RPU recovery disabled build failures Fix RPU recovery protection to solve build failures when RPU recovery is disabled. As recovery is primarily based on power-management, add a Kconfig dependency to enforce, this simplies the macros to protect the code. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/inc/hal_structs.h | 4 +++- nrf_wifi/hw_if/hal/src/hal_api.c | 12 ++++++++++-- nrf_wifi/hw_if/hal/src/hal_interrupt.c | 14 +++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/nrf_wifi/hw_if/hal/inc/hal_structs.h b/nrf_wifi/hw_if/hal/inc/hal_structs.h index 42ab342276..ba81691d8c 100644 --- a/nrf_wifi/hw_if/hal/inc/hal_structs.h +++ b/nrf_wifi/hw_if/hal/inc/hal_structs.h @@ -226,11 +226,13 @@ struct nrf_wifi_hal_dev_ctx { unsigned long addr_rpu_pktram_base_rx; unsigned long addr_rpu_pktram_base_rx_pool[MAX_NUM_OF_RX_QUEUES]; unsigned long tx_frame_offset; -#ifdef CONFIG_NRF_WIFI_LOW_POWER +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY unsigned long last_wakeup_now_asserted_time_ms; unsigned long last_wakeup_now_deasserted_time_ms; unsigned long last_rpu_sleep_opp_time_ms; bool is_wakup_now_asserted; +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ +#ifdef CONFIG_NRF_WIFI_LOW_POWER enum RPU_PS_STATE rpu_ps_state; void *rpu_ps_timer; void *rpu_ps_lock; diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 781d8cda77..04e10864b3 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -307,6 +307,7 @@ unsigned long nrf_wifi_hal_buf_unmap_tx(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx #ifdef CONFIG_NRF_WIFI_LOW_POWER +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY static void did_rpu_had_sleep_opp(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { unsigned int deassert_time_diff_ms = nrf_wifi_osal_time_elapsed_ms( @@ -318,6 +319,7 @@ static void did_rpu_had_sleep_opp(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) hal_dev_ctx->last_wakeup_now_deasserted_time_ms; } } +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { @@ -351,10 +353,11 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) } nrf_wifi_bal_rpu_ps_wake(hal_dev_ctx->bal_dev_ctx); +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY hal_dev_ctx->is_wakup_now_asserted = true; hal_dev_ctx->last_wakeup_now_asserted_time_ms = nrf_wifi_osal_time_get_curr_ms(hal_dev_ctx->hpriv->opriv); - +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ start_time_us = nrf_wifi_osal_time_get_curr_us(hal_dev_ctx->hpriv->opriv); rpu_ps_state_mask = ((1 << RPU_REG_BIT_PS_STATE) | @@ -394,12 +397,16 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) RPU_PS_WAKE_TIMEOUT_S, reg_val, rpu_ps_state_mask); +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY nrf_wifi_osal_tasklet_schedule(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->recovery_tasklet); +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ goto out; } hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_AWAKE; +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY did_rpu_had_sleep_opp(hal_dev_ctx); +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ out: if (!hal_dev_ctx->irq_ctx) { @@ -423,10 +430,11 @@ static void hal_rpu_ps_sleep(unsigned long data) &flags); nrf_wifi_bal_rpu_ps_sleep(hal_dev_ctx->bal_dev_ctx); +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY hal_dev_ctx->is_wakup_now_asserted = false; hal_dev_ctx->last_wakeup_now_deasserted_time_ms = nrf_wifi_osal_time_get_curr_ms(hal_dev_ctx->hpriv->opriv); - +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_ASLEEP; nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index 8180f53d68..e524dcd1bc 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -497,6 +497,7 @@ static unsigned int hal_rpu_event_get_all(struct nrf_wifi_hal_dev_ctx *hal_dev_c return num_events; } +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY static inline bool is_rpu_recovery_needed(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) { unsigned int rpu_sleep_opp_diff_ms = nrf_wifi_osal_time_elapsed_ms( @@ -513,7 +514,7 @@ static inline bool is_rpu_recovery_needed(struct nrf_wifi_hal_dev_ctx *hal_dev_c "RPU sleep opp diff: %d ms, last RPU sleep opp time: %lu", rpu_sleep_opp_diff_ms, hal_dev_ctx->last_rpu_sleep_opp_time_ms); -#endif +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG */ if (rpu_sleep_opp_diff_ms >= CONFIG_NRF_WIFI_RPU_RECOVERY_PS_ACTIVE_TIMEOUT_MS) { return false; @@ -521,6 +522,7 @@ static inline bool is_rpu_recovery_needed(struct nrf_wifi_hal_dev_ctx *hal_dev_c return true; } +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx, bool *do_rpu_recovery) @@ -536,7 +538,7 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha "Processing watchdog interrupt"); #endif -#ifdef CONFIG_NRF_WIFI_LOW_POWER +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY /* Check if host has asserted WAKEUP_NOW or if the RPU has been in * PS_ACTIVE state for more than the timeout period */ @@ -547,25 +549,27 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha #else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "Host has not given RPU opp to sleep for the timeout period, RPU recovery not needed"); -#endif +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG */ goto out; } rpu_recovery = true; -#endif /* CONFIG_NRF_WIFI_LOW_POWER */ +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ if (!rpu_recovery) { hal_rpu_irq_wdog_rearm(hal_dev_ctx); goto out; } +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY #ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, "Host has given RPU opp to sleep at least once for the timeout period, RPU recovery needed"); #else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, "Host has given RPU opp to sleep at least once for the timeout period, RPU recovery needed"); -#endif +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG */ +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ out: nrf_wifi_status = NRF_WIFI_STATUS_SUCCESS; *do_rpu_recovery = rpu_recovery; From 7b41ad67c805f32edebfa025c2a6d3cc7c5e4923 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 18 Jul 2024 01:02:57 +0530 Subject: [PATCH 16/25] drivers: wifi: Fix TX buffers leak During interface down in case TX has pending buffers in either TXQ or Pending_Q then they are not freed instead the Q itself is freed. Fix by traversing the Q and freeing all members. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/tx.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/nrf_wifi/fw_if/umac_if/src/tx.c b/nrf_wifi/fw_if/umac_if/src/tx.c index 509584c46e..8335a73ba4 100644 --- a/nrf_wifi/fw_if/umac_if/src/tx.c +++ b/nrf_wifi/fw_if/umac_if/src/tx.c @@ -1798,6 +1798,12 @@ void tx_deinit(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx) for (i = 0; i < def_priv->num_tx_tokens; i++) { if (def_dev_ctx->tx_config.pkt_info_p) { + while (nrf_wifi_utils_q_len(fpriv->opriv, + def_dev_ctx->tx_config.pkt_info_p[i].pkt)) { + nrf_wifi_osal_nbuf_free(fpriv->opriv, + nrf_wifi_utils_q_dequeue(fpriv->opriv, + def_dev_ctx->tx_config.pkt_info_p[i].pkt)); + } nrf_wifi_utils_list_free(fpriv->opriv, def_dev_ctx->tx_config.pkt_info_p[i].pkt); } @@ -1808,6 +1814,12 @@ void tx_deinit(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx) for (i = 0; i < NRF_WIFI_FMAC_AC_MAX; i++) { for (j = 0; j < MAX_SW_PEERS; j++) { + while (nrf_wifi_utils_q_len(fpriv->opriv, + def_dev_ctx->tx_config.data_pending_txq[j][i])) { + nrf_wifi_osal_nbuf_free(fpriv->opriv, + nrf_wifi_utils_q_dequeue(fpriv->opriv, + def_dev_ctx->tx_config.data_pending_txq[j][i])); + } nrf_wifi_utils_q_free(fpriv->opriv, def_dev_ctx->tx_config.data_pending_txq[j][i]); } From 2409b6e95d32deb013ffb2a653b2656e2d197d9c Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 18 Jul 2024 20:52:19 +0530 Subject: [PATCH 17/25] drivers: wifi: Add PS state debugs These are very frequent, so, a separate debug is added for debugging host RPU recovery logic. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_api.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index 04e10864b3..ee9d09b9b0 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -407,6 +407,11 @@ enum nrf_wifi_status hal_rpu_ps_wake(struct nrf_wifi_hal_dev_ctx *hal_dev_ctx) #ifdef CONFIG_NRF_WIFI_RPU_RECOVERY did_rpu_had_sleep_opp(hal_dev_ctx); #endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_PS_STATE_DEBUG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "%s: RPU PS state is AWAKE\n", + __func__); +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_PS_STATE_DEBUG */ out: if (!hal_dev_ctx->irq_ctx) { @@ -437,6 +442,11 @@ static void hal_rpu_ps_sleep(unsigned long data) #endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ hal_dev_ctx->rpu_ps_state = RPU_PS_STATE_ASLEEP; +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_PS_STATE_DEBUG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "%s: RPU PS state is ASLEEP\n", + __func__); +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_PS_STATE_DEBUG */ nrf_wifi_osal_spinlock_irq_rel(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->rpu_ps_lock, &flags); From af707fbd7e78d2ef879655ea7f5563863534babd Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 18 Jul 2024 21:24:53 +0530 Subject: [PATCH 18/25] drivers: wifi: Add command and event logging This is useful to understand the reason for comms trigger b/w host and RPU. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/event.c | 21 +++++++++++++++++++++ nrf_wifi/hw_if/hal/src/hal_api.c | 11 +++++++++++ 2 files changed, 32 insertions(+) diff --git a/nrf_wifi/fw_if/umac_if/src/event.c b/nrf_wifi/fw_if/umac_if/src/event.c index 41ca50ccc7..06dfbaaad4 100644 --- a/nrf_wifi/fw_if/umac_if/src/event.c +++ b/nrf_wifi/fw_if/umac_if/src/event.c @@ -194,10 +194,17 @@ static enum nrf_wifi_status umac_event_ctrl_process(struct nrf_wifi_fmac_dev_ctx callbk_fns = &def_priv->callbk_fns; #endif /* !CONFIG_NRF700X_RADIO_TEST */ +#ifdef CONFIG_NRF_WIFI_CMD_EVENT_LOG + nrf_wifi_osal_log_info(fmac_dev_ctx->fpriv->opriv, + "%s: Event %d received from UMAC\n", + __func__, + event_num); +#else nrf_wifi_osal_log_dbg(fmac_dev_ctx->fpriv->opriv, "%s: Event %d received from UMAC", __func__, event_num); +#endif /* CONFIG_NRF_WIFI_CMD_EVENT_LOG */ switch (umac_hdr->cmd_evnt) { case NRF_WIFI_UMAC_EVENT_GET_REG: @@ -631,10 +638,17 @@ nrf_wifi_fmac_data_event_process(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx, event = ((struct nrf_wifi_umac_head *)umac_head)->cmd; +#ifdef CONFIG_NRF_WIFI_CMD_EVENT_LOG + nrf_wifi_osal_log_info(fmac_dev_ctx->fpriv->opriv, + "%s: Event %d received from UMAC\n", + __func__, + event); +#else nrf_wifi_osal_log_dbg(fmac_dev_ctx->fpriv->opriv, "%s: Event %d received from UMAC", __func__, event); +#endif /* CONFIG_NRF_WIFI_CMD_EVENT_LOG */ switch (event) { case NRF_WIFI_CMD_RX_BUFF: @@ -1121,10 +1135,17 @@ enum nrf_wifi_status nrf_wifi_fmac_event_callback(void *mac_dev_ctx, umac_msg_len = rpu_msg->hdr.len; umac_msg_type = umac_hdr->cmd_evnt; +#ifdef CONFIG_NRF_WIFI_CMD_EVENT_LOG + nrf_wifi_osal_log_info(fmac_dev_ctx->fpriv->opriv, + "%s: Event type %d recd\n", + __func__, + rpu_msg->type); +#else nrf_wifi_osal_log_dbg(fmac_dev_ctx->fpriv->opriv, "%s: Event type %d recd", __func__, rpu_msg->type); +#endif /* CONFIG_NRF_WIFI_CMD_EVENT_LOG */ switch (rpu_msg->type) { #ifndef CONFIG_NRF700X_RADIO_TEST diff --git a/nrf_wifi/hw_if/hal/src/hal_api.c b/nrf_wifi/hw_if/hal/src/hal_api.c index ee9d09b9b0..c886dc248a 100644 --- a/nrf_wifi/hw_if/hal/src/hal_api.c +++ b/nrf_wifi/hw_if/hal/src/hal_api.c @@ -927,6 +927,17 @@ enum nrf_wifi_status nrf_wifi_hal_ctrl_cmd_send(struct nrf_wifi_hal_dev_ctx *hal { enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL; +#ifdef CONFIG_NRF_WIFI_CMD_EVENT_LOG + nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, + "%s: caller %p\n", + __func__, + __builtin_return_address(0)); +#else + nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, + "%s: caller %p\n", + __func__, + __builtin_return_address(0)); +#endif nrf_wifi_osal_spinlock_take(hal_dev_ctx->hpriv->opriv, hal_dev_ctx->lock_hal); From 89c5a9889478e8b1407d10d2fde7bbc01b1818ac Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 18 Jul 2024 21:29:24 +0530 Subject: [PATCH 19/25] drivers: wifi: Shorten the prints OSAL Shim only as 256 bytes for logs, causign recovery logs to be truncated. Signed-off-by: Chaitanya Tata --- nrf_wifi/hw_if/hal/src/hal_interrupt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nrf_wifi/hw_if/hal/src/hal_interrupt.c b/nrf_wifi/hw_if/hal/src/hal_interrupt.c index e524dcd1bc..22419b7cd9 100644 --- a/nrf_wifi/hw_if/hal/src/hal_interrupt.c +++ b/nrf_wifi/hw_if/hal/src/hal_interrupt.c @@ -545,10 +545,10 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha if (!is_rpu_recovery_needed(hal_dev_ctx)) { #ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, - "Host has not given RPU opp to sleep for the timeout period, RPU recovery not needed"); + "Ignore watchdog interrupt, RPU recovery not needed"); #else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "Host has not given RPU opp to sleep for the timeout period, RPU recovery not needed"); + "Ignore watchdog interrupt, RPU recovery not needed"); #endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG */ goto out; } @@ -564,10 +564,10 @@ static enum nrf_wifi_status hal_rpu_process_wdog(struct nrf_wifi_hal_dev_ctx *ha #ifdef CONFIG_NRF_WIFI_RPU_RECOVERY #ifdef CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG nrf_wifi_osal_log_info(hal_dev_ctx->hpriv->opriv, - "Host has given RPU opp to sleep at least once for the timeout period, RPU recovery needed"); + "RPU recovery needed"); #else nrf_wifi_osal_log_dbg(hal_dev_ctx->hpriv->opriv, - "Host has given RPU opp to sleep at least once for the timeout period, RPU recovery needed"); + "RPU recovery needed"); #endif /* CONFIG_NRF_WIFI_RPU_RECOVERY_DEBUG */ #endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ out: From acfa868b5841f34256bbe8dcf543a1a50c778a95 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 18 Jul 2024 17:40:46 +0530 Subject: [PATCH 20/25] drivers: wifi: Enable management buffers offload With this offload, host doesn't need to manage RX buffers for management frames, and this saves Host-RPU comms and thus giving RPU to sleep more often and is essential to test RPU recovery. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/cmd.c | 5 +++++ nrf_wifi/fw_if/umac_if/src/rx.c | 3 +++ 2 files changed, 8 insertions(+) diff --git a/nrf_wifi/fw_if/umac_if/src/cmd.c b/nrf_wifi/fw_if/umac_if/src/cmd.c index c28aa4f700..cd7cb50c24 100644 --- a/nrf_wifi/fw_if/umac_if/src/cmd.c +++ b/nrf_wifi/fw_if/umac_if/src/cmd.c @@ -153,6 +153,11 @@ enum nrf_wifi_status umac_cmd_init(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx, nrf_wifi_osal_log_dbg(fmac_dev_ctx->fpriv->opriv, "RPU LPM type: %s", umac_cmd_data->sys_params.sleep_enable == 2 ? "HW" : umac_cmd_data->sys_params.sleep_enable == 1 ? "SW" : "DISABLED"); +#ifdef CONFIG_NRF_WIFI_MGMT_BUFF_OFFLOAD + umac_cmd_data->mgmt_buff_offload = 1; + nrf_wifi_osal_log_info(fmac_dev_ctx->fpriv->opriv, + "Management buffer offload enabled\n"); +#endif /* CONFIG_NRF_WIFI_MGMT_BUFF_OFFLOAD */ #ifndef CONFIG_NRF700X_RADIO_TEST nrf_wifi_osal_mem_cpy(fmac_dev_ctx->fpriv->opriv, umac_cmd_data->rx_buf_pools, diff --git a/nrf_wifi/fw_if/umac_if/src/rx.c b/nrf_wifi/fw_if/umac_if/src/rx.c index 01f6d3d468..cdb6c206cb 100644 --- a/nrf_wifi/fw_if/umac_if/src/rx.c +++ b/nrf_wifi/fw_if/umac_if/src/rx.c @@ -375,6 +375,9 @@ enum nrf_wifi_status nrf_wifi_fmac_rx_event_process(struct nrf_wifi_fmac_dev_ctx #endif /* CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS */ nrf_wifi_osal_nbuf_free(fmac_dev_ctx->fpriv->opriv, nwb); +#ifdef CONFIG_NRF_WIFI_MGMT_BUFF_OFFLOAD + goto out; +#endif /* CONFIG_NRF_WIFI_MGMT_BUFF_OFFLOAD */ } #if defined(CONFIG_NRF700X_RAW_DATA_RX) || defined(CONFIG_NRF700X_PROMISC_DATA_RX) else if (config->rx_pkt_type == NRF_WIFI_RAW_RX_PKT) { From 8675ceaea520f3cbad560c3bc908341fdfae1c96 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Tue, 6 Aug 2024 21:10:39 +0530 Subject: [PATCH 21/25] drivers: wifi: Add support for keepalive To handle interoperability issue with few APs, add a feature to keep sending keepalive frames periodically to avoid AP disconnecting the STA. This is disabled by default to avoid unnecessary power consumption as it's only seen with few old APs. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/cmd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/nrf_wifi/fw_if/umac_if/src/cmd.c b/nrf_wifi/fw_if/umac_if/src/cmd.c index cd7cb50c24..3c1993240a 100644 --- a/nrf_wifi/fw_if/umac_if/src/cmd.c +++ b/nrf_wifi/fw_if/umac_if/src/cmd.c @@ -158,6 +158,14 @@ enum nrf_wifi_status umac_cmd_init(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx, nrf_wifi_osal_log_info(fmac_dev_ctx->fpriv->opriv, "Management buffer offload enabled\n"); #endif /* CONFIG_NRF_WIFI_MGMT_BUFF_OFFLOAD */ +#ifdef CONFIG_NRF_WIFI_FEAT_KEEPALIVE + umac_cmd_data->keep_alive_enable = KEEP_ALIVE_ENABLED; + umac_cmd_data->keep_alive_period = CONFIG_NRF_WIFI_KEEPALIVE_PERIOD_S; + nrf_wifi_osal_log_dbg(fmac_dev_ctx->fpriv->opriv, + "Keepalive enabled with period %d\n", + umac_cmd_data->keepalive_period); +#endif /* CONFIG_NRF_WIFI_FEAT_KEEPALIVE */ + #ifndef CONFIG_NRF700X_RADIO_TEST nrf_wifi_osal_mem_cpy(fmac_dev_ctx->fpriv->opriv, umac_cmd_data->rx_buf_pools, From 41a992ce68e2c04a92ee7564c4b167e6f0eb6e58 Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Thu, 25 Jul 2024 18:43:14 +0530 Subject: [PATCH 22/25] drivers: wifi: Send user timeout to FW User can configure watchdog timer using Kconfig and this needs to be sent to FW. This is primarily needed for crowded channel where RPU can stay awake for more than 10s. Signed-off-by: Chaitanya Tata --- nrf_wifi/fw_if/umac_if/src/cmd.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nrf_wifi/fw_if/umac_if/src/cmd.c b/nrf_wifi/fw_if/umac_if/src/cmd.c index 3c1993240a..063c520599 100644 --- a/nrf_wifi/fw_if/umac_if/src/cmd.c +++ b/nrf_wifi/fw_if/umac_if/src/cmd.c @@ -149,6 +149,13 @@ enum nrf_wifi_status umac_cmd_init(struct nrf_wifi_fmac_dev_ctx *fmac_dev_ctx, umac_cmd_data->tcp_ip_checksum_offload = 1; #endif /* CONFIG_NRF700X_TCP_IP_CHECKSUM_OFFLOAD */ umac_cmd_data->discon_timeout = CONFIG_NRF_WIFI_AP_DEAD_DETECT_TIMEOUT; +#ifdef CONFIG_NRF_WIFI_RPU_RECOVERY + umac_cmd_data->watchdog_timer_val = + (CONFIG_NRF_WIFI_RPU_RECOVERY_PS_ACTIVE_TIMEOUT_MS) / 1000; +#else + /* Disable watchdog */ + umac_cmd_data->watchdog_timer_val = 0xFFFFFF; +#endif /* CONFIG_NRF_WIFI_RPU_RECOVERY */ nrf_wifi_osal_log_dbg(fmac_dev_ctx->fpriv->opriv, "RPU LPM type: %s", umac_cmd_data->sys_params.sleep_enable == 2 ? "HW" : From 623631bb6f8d70cac87f60968e78306060ada92f Mon Sep 17 00:00:00 2001 From: Karun Kumar Eagalapati Date: Wed, 21 Aug 2024 12:58:02 +0530 Subject: [PATCH 23/25] drivers: wifi: Update RPU patch to release/v2.6 rev#3fc62454e39 UMAC: Fixes from v2.5 branch 1) Added watchdog timer programming from Host. 2) Handling TRIGGER_SWITCH_PS from LMAC. 3) Clearing and re-enabling watchdog before sending any event from UMAC to Host. 4) [SHEL-2995] : Parsing keep alive parameters from host in command init and sending to LMAC. LMAC: Fixes/features from 2.5 branch 1) Keep alive logic 2) Null frame based power save 3) TSF sync 4) Updated lma cpath bimg location to 0x8004b400 Signed-off-by: Karun Kumar Eagalapati --- nrf_wifi/fw_bins/default/nrf70.bin | Bin 73936 -> 75944 bytes nrf_wifi/fw_bins/radio_test/nrf70.bin | Bin 37894 -> 37894 bytes nrf_wifi/fw_bins/scan_only/nrf70.bin | Bin 25124 -> 25428 bytes .../fw_if/umac_if/inc/fw/host_rpu_sys_if.h | 21 ++++++++++++++++++ .../fw_if/umac_if/inc/fw/lmac_if_common.h | 2 +- 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/nrf_wifi/fw_bins/default/nrf70.bin b/nrf_wifi/fw_bins/default/nrf70.bin index 2a3f210217a34a27790a7e2f07abd40d29bdd770..28efc7fa307aea888c03b144256e2274c2447319 100644 GIT binary patch delta 13166 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 L6K_&RGDrRo@Q=yb delta 11338 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 delta 4650 zcmX|_30&0G7RT@Z&L3uE<}x!1%pGK8{sZW+DH@6>3QB+|h`C1uE+8P8h+4ih2hGrW zTE6}*=2BE@KFy_U(MmtLwEJwYr)^Xwso7%d)1>!1cgj8=XTHC4&OLWI=YRi0ZQFR; zHoi8-?_0M-w%q^21^XBI&9SRmUeb2jhql%KIsfzKYv=r&lGXZT_WL73!*0@;&gef~ z>-d8)#|ue}HHR(A%ysLfR~X}3q|9f`(izQIWcm=exMqukMOVxto<0r}x7yYrDESTq zmDf;^9&tg_m?g3qmWp}GV*M5QEM2`}sSn*oCR@aL3R>resqsE#vHnOw!6sO~p<$LY znAj@&5%xxUYsN%i#8aegNN&xVMfxyl)(3j~h3y2d$G0xvUg4oZx z?|KvIv`qWxlQi`&k#LP6#9I4<%ZOWh3_1cHyAyk3T8~5KhgYYiq#7_)2Q3u(!&q<) zWzh1d)}-l^29_u2K&t_hPhR%ITxF^6lI9hyW!YhjKL0Z!Q5Mv z)Zd_)kL?diO zGBF#?Z~r&}dBzEIIry`EuuK%zQ{XS#VV^3leHeU-id-eK%?FAHhI*hggStJJ{}O?d zd!Lp)lv6?`hqgcz@Gmf{E>AvjMcCwt@2&`kJV(bdQjKv*Z7W0}KVm~kWCfL{Sb4JK z0W_n%g#Q2$RcxgN$;KsU&Ay}CBTDQI) zpYdOyU!(2$T7ne`^lb<$P|RejX)nDh^bb72_UpKzj?K+5z*A|jQ5zp6Kfo<#pT_B$87KX#A*SBE%NSc3MImABKrq<@}EzX7O@}Rr34E5cO)Jb~zVov^S^>n`Qdl5RFPaAxnRT zn61RqvJ`iiy-A4|~ACflOF_ImZNHpk#yz`U8GDz znZ?te;3G&#<)BB&a(E_8{qtdR*u;RgD^UYgl$e47h#X>EYa7h9V=`)M&f-c@7lm=E z@CrWqJ#Zuy-{`jR3i{Ho;CVE;t55|bp!5F1F5KdO;qNDbSE~T0=`TB{y=pqjdua#F z^z!7Yoi}5}QQB@hW2~J4cVI+?-awA zn+jnpKo7(WNi{3RCWLOSWh^#rF3dUxjmEcS%sVh;5;|F|e4nm|T5s;Igfk@-&==o%M60aOjI;ScIt5FDSsAM<YSl3&%Zr~u)T!eR%6jwRYrMt&E|?m4CMuZi&3z4`Q3zdSofnl)CO%4C z%F!OS$Nw9=gPWE~KJhai7g?Is17pP^GjmdcXhZkPF-}-4yT36fPZ}_l9#B~wzLnhi z81i^OhN-3r=*X5cF5+9P!CqxuI8$aaxSrT0&g=mt=%wLBl76g_((H0;;HF1lYSaIbL+92#F+K4 zi-i*yOY}SpWMYH)z?4AfN&Fp{*mDak&f4R+ClY;SI6<)({hip0){Va~ZU83|>!N)) z*dVrvA8@>h0b+-Ea2Ys>*d@xhgOiD4#H-7}Da2C5N^o!D1X1@8xR1fGK)+})hfS5C zlrb=+zkrn(qaOff&_bM@Ax!1}dL=EYDuC$Ilz@piyu19J#5!{>uEgEz|NU(WGE6xB zHv`DT`03z_#5Qr?A@C()mxx{k{)1SG$tB>+Z^vOCKZ_z;2maaTXgFouOTWU z8CTChkgK7#g&D;(9jXy}27^aYOWIs>=GWs8D8|8}f-ubkX3~J$%i9*!&BEtH3SY!Vh>zjjCGN#dV z5f%sQ*6O?isjNn$j@pH%YYI=NrkF$dBAIjgZpQW*3-(h`R24GZL`Q+U1*c*xBG$!= zxYCSUD8wdKpkBrjs%f&=mjzyGFmqC+EA%T`&{$3bYDGj1cm;8T$im}iw9(aagP8d? zcoo@~h`Gdf61R#fCwTSim|%ryB)*GywUGF2XRJK|zL!OPj-8QN9e{;J(NJh($ diff --git a/nrf_wifi/fw_bins/scan_only/nrf70.bin b/nrf_wifi/fw_bins/scan_only/nrf70.bin index 8513073cb0662d49c61e10deb72f1ab5ef9fa65c..7ee268483b5382105921084d6baf2bfb6c80c4c6 100644 GIT binary patch delta 3286 zcmZu!eNa*rWC%$zEQRpC0)*Nkfcw!) zG`LQG1oQ%46tFUh)31=1iB_%O(+nQnHVZ@at*AwGO9L?P;}UQyiQ?92Fb=$lvsf(R z@NWPnD;2H#2{8=Ea)<2uJs~E;#1sm1w+qq9R^7Y35X{DGTHP+;+GIy?S0^DEh8LsA z5m|`l4`>zd0X!A4Ql~aD#PAYgwQdV^X($-T@XwC{7b4c{esTdWLTuEPc>qsCY|=eU zg}KFu&AK75MFuBg3mJO%9;9O&hMB!6{hb;@vk($pRX$)Z;?S_VTYyVHfz}8!Y>9Ai z%DAlUW5D%FwgRbh=L24d8I`(A+W;@h1HW2#_nsh485cZeojy_>V#wrMRBXyvG8}Q@ zaw=YSY%n1HF-XNr6A$VUpV3jVbYkrY#A6*)+?8IGf_T^yDz0W%$o?-&sJJt`L7p2- zqGCdtUY>jFD=JowIWFUiFH^C=p+!!Rq~4|C@k#H=foq$oNE|)GFzNDtQL)-#mj&vo zsdyvJEEl@zCKc^t&&m9mR#9iKaYwh$9^W`iCdrnYl9IvQY92U zzCbSYjonnVSd2EAbib2|Z`wZ?g(Tm5LS9~0uwhKMT*uD+RP;_Ll^Z(cr{XBvW2>o{m9tEqTR0lF zhCGFzf}AYEEn78?kW<1pd5h`J2Emg*NA-2XI`)B3o}bpymA{G!-e~koMqSjY47F$0 z$G-;4G-!PbmU+E-6p92jtT- zn>lx!1Uym~lj+Dl6ainobdiZjHyS;;T}&N0Xxl@4HjcbI$CKB^v_ia9>TMkGU9SGc z_n=Ww7np}ijYl)x#QO&fe9qNLQll`X;3BmLnhN(WjXD_;ajHWb`#1PnHoDl+BkQ>y zPIVtuBa+#$$4R0PC$!%kuUBUO!1S+=myoFQDcRtA`gDEVOR#1|TngZbvlQ`opuQh1 z7kitokG~cO_eJ971ix^#@C}dFv4UmDn)to7DO(svJFvzF(3Cq|P)RLQM<_2D8S_?%g^Ga#&TT7q2sQQ#KPPr%gt zoJB?@w}aDpacy1f?9v{t`qhXtDddtW4)<_dwf!;VEjF59&6FW*#vfPmTI-V-O_Gm}4Sx!RF>yl1$$iTBl72x4FDX#Is47dP{uDqL}PP}>q=o$ERd)$UXn zI##=l44PX#VH~nJ8xB71Tk7RIvZt$688i99bk;X~2GO1_D@?EI{tOboX`IPpS#*+} zr+Ic>cxBcU8!Nkdq(^}d-&>E@=L$7m7oEuqEnZ9B=DBCMPuV%-t=Iwy{)1upl_Bes zM}a%VX7Ul>8KBkpOv@8C%39x}R@|F`>z_Ki(#Z1ZFGMw&8oYYJ_xw&EWggEPbYq(;hAGl9zt1~j|PQ=lF}@wa~<3ce&fjJ z$dS#TbKPUz;jHH}8iAAY97pa45>C+gjYIyAf1KvPpwP4K<;sRao?*Z6Um92#IW!zX zBYp|Vk$;q7Q-0RVw=bz>Irr#vWB20lWfJ+1mlteh*AuFEeRh}^l)jQ+n1@B}94}|^ zOWXMfoDeRba!1P@T+BLYC-0AU%V$uX)B;$1hNFN;&z{=0rR*%*W z&hhL4Jzpynms`AHzA@ztnUQi?L)2qF$_p!NtR=@` z(>$i5yjvna;}$p^bG+_&7cW2T<~BYH{?u?AZ|txv@k9Q-z?m^&tM?PfMpHZgnpZxN zG5^h);rb3rH yikp()BzS;t1ke586CxLOSTO|N4(RwCh`=WV?m4BZFX4p|z8)g*zOC@3kpBX8X%|=k delta 3066 zcmZuzdr(tX8b9}tK!{09;7U_AvLQkmB+(c_K>8CtcZwPAGH>rTUPL~)}7Uc)m!Vj+Hp}w+zK*|GmXww_xmmmx;vXc?)iPc z@Ao~<iW@WM+WP7qC=ha!ctL<7vKT41KWD>HHRj~JpvtXLg_ zXUu&EIJvFpR4J!V0Qu}8z$}6+z{F*bV@OQld%$#KP)r0`&>BY~YypYZUJ6jzhW4+a zjMiC=_C>URgv{EUFv4<3sm*IZ=!IO`k`{omA%$|$(v?K<4EY;oN_5xcCRK_Rh0w=2 zmXN`5vh$}Igy`)!ruY6*u8K(otWxM(IEIk;RqufNk9i26<^%j3S)#^u zS_NnjK4M^H;rE~-v@XCVxuz4?LwkQ{H0C7#?_S=A`9EYh9ChSg7{t;6(5gWF7p?+Q!&X^Eysqds2H27 zmt${#N5xL-iGB>4V|EQ{LL@waimp)~%Z?Fuskp}8m552#E~cVrx61|UYpHlG)g(8% z@dqll*v`rNE7z&W+mjPef4Y~7&E_nbubcss$v7qBcHs9}s#(px#q*9S@`T#2QZd=GT9$3kred+HROZW$ zQ&BhSD>>D0n4HtmC)ZeU5O|v?&tdd?RQxLSx{Qylp<<(Ji5#1B4Yr27fL{#xQvq(- zqzpnjgqt~4bX%3+%PmoMR)w8?!nEAf*0$W$OsKOuD6!h+LPgEt^vb9RmT|zk29{~S zx&fAXz`6xi+JJQjEZcz94VHbtdH|Ml!0H1lYruM3R_&2;w7a2vYWhyUHyW+>No`EJ z!*#F;xJu~)({6WEnJhHwg*pNV)3RTb+ zg=U_mcln9tro~jOn@Gr7`0^0rtqA7uI5)GKmUj6Wp?$(2rb_tRgw&x|BN&Cz9_LsV zBlkwIr?`h3d+)Xy+&?jjkwmEz5PHXO=} zZc!88S};+iOiSkThdGOrCKAo*srkcZcAkPN@3YA~R->aNj^;?5usATrMr5i>dcb}9 z8{B3;dyuPQ4{+x6E4~>G`DDH({^A}d^nW2xZi;gK3-ycrUH*Cv;*g#YH=@X`5IWc z);+AHn39G|Hhju-H{pj3YF4MK@z{Eu5_i@pal1a+>9>63`EnXb-0E|#{IN5G>G3uM zU?*`Y32#$>9^a2)k{wf0fU>I(4p6BO-n6MdA>q%mgx{sM{8s@%H#G%TCd}$dkTtx_ zD{=jSSi!2^JCIH&ooWrC*a+e`UlTWNYWH_$cpIz(jfGhjG(%p~U?-SxggVF${y+S1 z_5OiEugZtn1jv*4NN#J_pl}q;Aor>!bbej0Xi|0H2-l4rsr0Kbd z7qW`4#@cwjtCAP=(h}AWDBJwd@$Nc`tdTr;!C^| zFp2HwSEJ@7UW=MotWS-PIj9V8S8Wg4pGJbf)aZ&Ljk+40H`3^WTbS_uv~&usJfCK@ z)%BlOV-0`Pk_V^xBn0J-u3L!K4!`5&yK{1$5GXNY%+iviENoa&^C5elc%CegF~@#G zEKip8=X$bI9>dYq^0+4wjIQNdPn4XXG<$)tyv(l8UV!g1milBv?&wQ%TE8fBQyS%j zz8OV0=?I%l$Zy#^ zvXGUy*7{j%D4jJ~(3MY0uHk9JR9IuujO_+ZwQ@TiQ2d(6=z0fL`VpQ(-)YUWy&ZiKD#8S8kjM4sYCI2> 24) #define NRF_WIFI_LMAC_VER_MAJ(ver) ((ver & 0x00FF0000) >> 16) From bede420928a3a744bb6d83e96d4fddceea619dbd Mon Sep 17 00:00:00 2001 From: Mahammadyunus Patil Date: Fri, 23 Aug 2024 15:18:37 +0530 Subject: [PATCH 24/25] drivers: wifi: Update RPU patch to release/v2.6 rev#6ab90eaa613 PHY: Fix for low TX power [SHEL-2583] : Tx power reduces due to incorrect backoff values applied when an inaccurate vbat value is provided. Signed-off-by: Mahammadyunus Patil --- nrf_wifi/fw_bins/default/nrf70.bin | Bin 75944 -> 75944 bytes nrf_wifi/fw_bins/radio_test/nrf70.bin | Bin 37894 -> 37890 bytes nrf_wifi/fw_bins/scan_only/nrf70.bin | Bin 25428 -> 25428 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/nrf_wifi/fw_bins/default/nrf70.bin b/nrf_wifi/fw_bins/default/nrf70.bin index 28efc7fa307aea888c03b144256e2274c2447319..901da75b52aa435620f6c628e75e79f815812e10 100644 GIT binary patch delta 487 zcmZ2+k!8h2mI)#XJ;BYdWXk2^1HaAMBcEfryCj&0D=xJzWZRQ0iB60Y18f2ZOYGzi>r@$^O%_{k!}pRK=xPp$ z#VZ*Z7Cvm zZ%}4Tp1gQNG!wt^rj2qr!I7>`2HoPSoA?=6_*!`$x%THRa%5?6`V(Wun|H|7u!xZX z%r|(!v?Ozx$6|&6>BSD!3=>!iWt1428P-??i10JiipVf9Z^>X#RsA3$z)&zfTb5B- zd4ho!Lua0>p%{Y$=OG4$2Tlw&+Q%3gfOLaGKzCs05}y^**UB>1>q)xuxNl&6EF#E| rEF!}2Rei?!t*WY-ix>j5S+}(QZ{PvhrNYo~9%LH>&-N5KMi(vstj2++ delta 469 zcmZ2+k!8h2mI)#X?Y%$iMdlbvmj(ZNxY;FQR>q>alT)AaxU#%sVJYi5h_)3_nu(F)*=j}x7BHKMRr)<6 z0}~Vb(bYgj<>!HleB(iiSXlj%fFk)Tfg=8eU=j8{4<-gy5Syg}NHEW`1ZSEDcTuFPN5OCNl*{ zFLtPB5ZJ^I#Ec9=OaYArGD-~13~MZcMEDtMMZ_4Gx1=$ss(um?U?`eiD9fnKHpxJX zp)+s#JXuBw#*Ndr%QDtmn7i`07cm4#J{A#VNEQ)c_^Lkh{8m-f>@=o;*}_}e{x|Rh eY~W{b+Q7&V#1J5uB%{Jma~@>J_7pir7cKzSwRv~| diff --git a/nrf_wifi/fw_bins/radio_test/nrf70.bin b/nrf_wifi/fw_bins/radio_test/nrf70.bin index f52c9125464d09653ce911100ecf40d297765db4..100c6d65c6f47f58eaa98585703f11610990d698 100644 GIT binary patch delta 6527 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 S)>Vc0A@G0s*3I0&>Hh*NkYsxR diff --git a/nrf_wifi/fw_bins/scan_only/nrf70.bin b/nrf_wifi/fw_bins/scan_only/nrf70.bin index 7ee268483b5382105921084d6baf2bfb6c80c4c6..909aaf50f85560dd87bb036fd11e18d8a99fd2cc 100644 GIT binary patch delta 529 zcmca|jPc4b#t9+{e3GjdA^I zRYnG$?jsBgFIXAifQf}YkdujliIL4%iHU*vtRMpekG2(1nu(D^E{u_Z1@beP=u!uDB@oT7Gb~liIIU7#Ac}g63oAKfpY1+43pzc zScMna16486}2hhBX!eBK!=sA~FojTQV3_RX>ObFceHyj#B2D zV4%g&nI~%~#xU6@N`i64z3C4 z4Ll%YRTvu1gA8Wi*(?+NgWaKl6X@GIW}p|405EQpfHB5An+X_T+QvW`VB9DGMVOda R_W=D2jFt%^KzTb+1^}NgeEk3b delta 548 zcmca|jPc4b#t9+{ftIdXXFF<)Ue5PBESToyy_S1Yv*v+|J$xZYp6{A+{^~}PHOBRO zRT&w0bd?zyUa&I20TT;*GA9!Q6C<0e5)%XSSwRK{9&Ib2G!r9-K^P+g3z*HsS~!!D zfr*J-Jq)PGaz0RzZ#+m53+o0Rpa@SRP{h9wEW-Zb6C(pFh|N*~B$$8e0_D4Pjv7V4pm>+$5dPN|A|y?*`Za4wj3P-X>c-l!L%eZnJGYe zu|qwBz$ShmW@Hdz3TP~lQDSIjSYr_+!p~4EBF4bHC5=H<^^=GIL(yc-C}sIc23icA zc@CV17#JQnG1zDyV`u=<4GIC>ft^cyHcrlus<$wA<#8`!2#|a%BFK;|BEs-hedhVC zs;b#(OaZfnx3v9l;0f5k&)~Fyks*j7Krl&0g`ws=$j;3&(LdN7CUF7--~-T8$N(5! mCcsE!=4S?mp|&wl3K(5RKoKS;)^osM0LIiJ5ukj4C<6eZgo8E! From 9c759897dd52e6245a44bf85bdd6b1ea454c567d Mon Sep 17 00:00:00 2001 From: Thomas Stilwell Date: Mon, 26 Aug 2024 13:44:38 +0200 Subject: [PATCH 25/25] ci: compliance: skip KconfigBasic It depends on links to other repos and errors are unavoidable. Signed-off-by: Thomas Stilwell --- .github/workflows/compliance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compliance.yml b/.github/workflows/compliance.yml index 1322acb42b..4dd81fffd0 100644 --- a/.github/workflows/compliance.yml +++ b/.github/workflows/compliance.yml @@ -63,7 +63,7 @@ jobs: # debug ls -la git log --pretty=oneline | head -n 10 - $ZEPHYR_BASE/scripts/ci/check_compliance.py -m Codeowners -m Devicetree -m Gitlint -m Identity -m Nits -m pylint -m checkpatch -m KconfigBasic -c origin/${BASE_REF}.. + $ZEPHYR_BASE/scripts/ci/check_compliance.py -m Codeowners -m Devicetree -m Gitlint -m Identity -m Nits -m pylint -m checkpatch -c origin/${BASE_REF}.. - name: Upload Results uses: actions/upload-artifact@master