From: Jeff Chen nxpwifi_cmd_append_11n_tlv() derived the channel width solely from the AP's advertised operating bandwidth and could request 40/80 MHz operation even when the firmware did not support it. On 20 MHz-only devices such as IW610, this may cause the firmware to be configured with an unsupported channel width. Check firmware bandwidth capabilities before selecting the channel width: - Allow 80 MHz only when ISSUPP_NO_80MHZ() is false. - Allow 40 MHz only when ISSUPP_40MHZ_ENABLED() is true. - Otherwise fall back to 20 MHz operation. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Jeff Chen --- drivers/net/wireless/nxp/nxpwifi/11n.c | 4 +++- drivers/net/wireless/nxp/nxpwifi/fw.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/nxp/nxpwifi/11n.c b/drivers/net/wireless/nxp/nxpwifi/11n.c index c2a54d781b42..a83e29ecc466 100644 --- a/drivers/net/wireless/nxp/nxpwifi/11n.c +++ b/drivers/net/wireless/nxp/nxpwifi/11n.c @@ -349,6 +349,7 @@ nxpwifi_cmd_append_11n_tlv(struct nxpwifi_private *priv, nxpwifi_band_to_radio_type((u8)bss_desc->bss_band); if (ISSUPP_11ACENABLED(priv->adapter->fw_cap_info) && + !ISSUPP_NO_80MHZ(priv->adapter->fw_cap_ext) && bss_desc->bcn_vht_oper && bss_desc->bcn_vht_oper->chan_width == IEEE80211_VHT_CHANWIDTH_80MHZ) { @@ -359,7 +360,8 @@ nxpwifi_cmd_append_11n_tlv(struct nxpwifi_private *priv, ((CHAN_BW_80MHZ << BAND_CFG_CHAN_WIDTH_SHIFT_BIT) & BAND_CFG_CHAN_WIDTH_MASK); - } else if (sband->ht_cap.cap & + } else if (ISSUPP_40MHZ_ENABLED(priv->adapter->fw_cap_ext) && + sband->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 && bss_desc->bcn_ht_oper->ht_param & IEEE80211_HT_PARAM_CHAN_WIDTH_ANY) { diff --git a/drivers/net/wireless/nxp/nxpwifi/fw.h b/drivers/net/wireless/nxp/nxpwifi/fw.h index 188110b020cf..124728a72442 100644 --- a/drivers/net/wireless/nxp/nxpwifi/fw.h +++ b/drivers/net/wireless/nxp/nxpwifi/fw.h @@ -334,6 +334,8 @@ enum NXPWIFI_802_11_PRIVACY_FILTER { #define DFS_CHAN_MOVE_TIME 10000 #define ISSUPP_11AXENABLED(fw_cap_ext) ((fw_cap_ext) & BIT(7)) +#define ISSUPP_NO_80MHZ(fw_cap_ext) ((fw_cap_ext) & BIT(8)) +#define ISSUPP_40MHZ_ENABLED(fw_cap_ext) ((fw_cap_ext) & BIT(15)) #define HOST_CMD_GET_HW_SPEC 0x0003 #define HOST_CMD_802_11_SCAN 0x0006 -- 2.34.1