Message ID | 20250522131704.612206-1-loic.poulain@oss.qualcomm.com |
---|---|
State | New |
Headers | show |
Series | [ath-next] wifi: ath10k: Avoid vdev delete timeout when firmware is already down | expand |
On 5/22/2025 6:17 AM, Loic Poulain wrote: > In some scenarios, the firmware may be stopped before the interface is > removed, either due to a crash or because the remoteproc (e.g., MPSS) > is shut down early during system reboot or shutdown. > > This leads to a delay during interface teardown, as the driver waits for > a vdev delete response that never arrives, eventually timing out. > > Example (SNOC): > $ echo stop > /sys/class/remoteproc/remoteproc0/state > [ 71.64] remoteproc remoteproc0: stopped remote processor modem > $ reboot > [ 74.84] ath10k_snoc c800000.wifi: failed to transmit packet, dropping: -108 > [ 74.84] ath10k_snoc c800000.wifi: failed to submit frame: -108 > [...] > [ 82.39] ath10k_snoc c800000.wifi: Timeout in receiving vdev delete response > > To avoid this, skip waiting for the vdev delete response if the firmware is > already marked as unreachable (`ATH10K_FLAG_CRASH_FLUSH`), similar to how > `ath10k_mac_wait_tx_complete()` and `ath10k_vdev_setup_sync()` handle this case. > > Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com> > --- > drivers/net/wireless/ath/ath10k/mac.c | 32 ++++++++++++++++++++------- FYI per current legal guidance I added a QTI copyright to this file when I pulled it to ath/pending: https://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git/commit/?h=pending&id=b9193382408c8f4859c6401bea9c028d8a601171
On Thu, 22 May 2025 15:17:04 +0200, Loic Poulain wrote: > In some scenarios, the firmware may be stopped before the interface is > removed, either due to a crash or because the remoteproc (e.g., MPSS) > is shut down early during system reboot or shutdown. > > This leads to a delay during interface teardown, as the driver waits for > a vdev delete response that never arrives, eventually timing out. > > [...] Applied, thanks! [1/1] wifi: ath10k: Avoid vdev delete timeout when firmware is already down commit: dc9c4252fe0d7a7f1ee904405ea91534277305bf Best regards,
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c index c61b95a928da..1df2617a82c0 100644 --- a/drivers/net/wireless/ath/ath10k/mac.c +++ b/drivers/net/wireless/ath/ath10k/mac.c @@ -1022,6 +1022,26 @@ static inline int ath10k_vdev_setup_sync(struct ath10k *ar) return ar->last_wmi_vdev_start_status; } +static inline int ath10k_vdev_delete_sync(struct ath10k *ar) +{ + unsigned long time_left; + + lockdep_assert_held(&ar->conf_mutex); + + if (!test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) + return 0; + + if (test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags)) + return -ESHUTDOWN; + + time_left = wait_for_completion_timeout(&ar->vdev_delete_done, + ATH10K_VDEV_DELETE_TIMEOUT_HZ); + if (time_left == 0) + return -ETIMEDOUT; + + return 0; +} + static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) { struct cfg80211_chan_def *chandef = NULL; @@ -5900,7 +5920,6 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw, struct ath10k *ar = hw->priv; struct ath10k_vif *arvif = (void *)vif->drv_priv; struct ath10k_peer *peer; - unsigned long time_left; int ret; int i; @@ -5940,13 +5959,10 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw, ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", arvif->vdev_id, ret); - if (test_bit(WMI_SERVICE_SYNC_DELETE_CMDS, ar->wmi.svc_map)) { - time_left = wait_for_completion_timeout(&ar->vdev_delete_done, - ATH10K_VDEV_DELETE_TIMEOUT_HZ); - if (time_left == 0) { - ath10k_warn(ar, "Timeout in receiving vdev delete response\n"); - goto out; - } + ret = ath10k_vdev_delete_sync(ar); + if (ret) { + ath10k_warn(ar, "Error in receiving vdev delete response: %d\n", ret); + goto out; } /* Some firmware revisions don't notify host about self-peer removal
In some scenarios, the firmware may be stopped before the interface is removed, either due to a crash or because the remoteproc (e.g., MPSS) is shut down early during system reboot or shutdown. This leads to a delay during interface teardown, as the driver waits for a vdev delete response that never arrives, eventually timing out. Example (SNOC): $ echo stop > /sys/class/remoteproc/remoteproc0/state [ 71.64] remoteproc remoteproc0: stopped remote processor modem $ reboot [ 74.84] ath10k_snoc c800000.wifi: failed to transmit packet, dropping: -108 [ 74.84] ath10k_snoc c800000.wifi: failed to submit frame: -108 [...] [ 82.39] ath10k_snoc c800000.wifi: Timeout in receiving vdev delete response To avoid this, skip waiting for the vdev delete response if the firmware is already marked as unreachable (`ATH10K_FLAG_CRASH_FLUSH`), similar to how `ath10k_mac_wait_tx_complete()` and `ath10k_vdev_setup_sync()` handle this case. Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com> --- drivers/net/wireless/ath/ath10k/mac.c | 32 ++++++++++++++++++++------- 1 file changed, 24 insertions(+), 8 deletions(-)