[PATCH 2/4] wifi: nxpwifi: stop AP TX after preparing channel switch
From: Zhao Li
Date: Wed Oct 28 2026 - 10:25:44 EST
A channel-switch request can leave AP traffic stopped if installing the
CSA management IEs fails or the driver's work wrapper refuses the request.
The driver disables carrier and the TX queues before programming the IEs,
and the wrapper silently drops work during removal, command timeout or
suspend.
Prepare the CSA IEs before stopping traffic. Queue the switch directly
with wiphy_delayed_work_queue(), since the driver's wrapper can silently
discard it after the IEs are installed and traffic is stopped. The wiphy
mutex serializes the callback and worker with AP-stop cancellation.
LLM assistance was used to find the bug and review.
Fixes: 73b01e57ed3e ("wifi: nxp: add nxpwifi driver for IW61x")
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Zhao Li <enderaoelyther@xxxxxxxxx>
---
Validation: A W=1 module build with MODPOST passed. Not
reproduced; IW61x hardware was unavailable.
Sparse C=2 passed. Targeted Smatch introduced no new diagnostics.
drivers/net/wireless/nxp/nxpwifi/cfg80211.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/nxp/nxpwifi/cfg80211.c b/drivers/net/wireless/nxp/nxpwifi/cfg80211.c
index 384ba69dd058..0f7720df0304 100644
--- a/drivers/net/wireless/nxp/nxpwifi/cfg80211.c
+++ b/drivers/net/wireless/nxp/nxpwifi/cfg80211.c
@@ -3115,12 +3115,6 @@ nxpwifi_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
&priv->dfs_chandef))
return -EINVAL;
- if (params->block_tx) {
- netif_carrier_off(priv->netdev);
- nxpwifi_stop_net_dev_queue(priv->netdev, priv->adapter);
- priv->uap_stop_tx = true;
- }
-
ret = nxpwifi_del_mgmt_ies(priv);
if (ret)
nxpwifi_dbg(priv->adapter, ERROR,
@@ -3137,11 +3131,16 @@ nxpwifi_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
memcpy(&priv->ap_update_info.beacon, ¶ms->beacon_after,
sizeof(priv->ap_update_info.beacon));
+ if (params->block_tx) {
+ netif_carrier_off(priv->netdev);
+ nxpwifi_stop_net_dev_queue(priv->netdev, priv->adapter);
+ priv->uap_stop_tx = true;
+ }
+
chsw_msec = max(params->count * priv->bss_cfg.beacon_period, 100);
- nxpwifi_queue_delayed_wiphy_work(priv->adapter,
- &priv->dfs_chan_sw_work,
- msecs_to_jiffies(chsw_msec));
+ wiphy_delayed_work_queue(wiphy, &priv->dfs_chan_sw_work,
+ msecs_to_jiffies(chsw_msec));
done:
return ret;
--
2.56.0