From: Jeff Chen Add SDIO device ID (0x0215) for NXP IW610 to sdio_ids.h. It is used by the nxpwifi driver to probe the IW610 chip over SDIO. Signed-off-by: Jeff Chen --- include/linux/mmc/sdio_ids.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index afae93f6f245..5eff5e348eb0 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h @@ -123,6 +123,7 @@ #define SDIO_VENDOR_ID_NXP 0x0471 #define SDIO_DEVICE_ID_NXP_IW61X_BASE 0x0204 #define SDIO_DEVICE_ID_NXP_IW61X 0x0205 +#define SDIO_DEVICE_ID_NXP_IW610 0x0215 #define SDIO_VENDOR_ID_REALTEK 0x024c #define SDIO_DEVICE_ID_REALTEK_RTW8723BS 0xb723 -- 2.34.1 From: Jeff Chen The NXP IW610 SDIO chipset identifies itself with a base card ID (0x0214) during the initial MMC bus scan, whereas the WLAN function reports a different ID (0x0215). Like the IW61x, the IW610 requires MMC_QUIRK_BLKSZ_FOR_BYTE_MODE for correct byte-mode block size handling. Since SDIO fixups are applied before function devices are enumerated, the quirk must be associated with the base card ID rather than the WLAN function ID. Add the SDIO_DEVICE_ID_NXP_IW610_BASE definition and apply the required fixup in the SDIO quirk table. Signed-off-by: Jeff Chen --- drivers/mmc/core/quirks.h | 3 +++ include/linux/mmc/sdio_ids.h | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h index ae3ece89d0aa..98cb680e3ace 100644 --- a/drivers/mmc/core/quirks.h +++ b/drivers/mmc/core/quirks.h @@ -211,6 +211,9 @@ static const struct mmc_fixup __maybe_unused sdio_fixup_methods[] = { SDIO_FIXUP(SDIO_VENDOR_ID_NXP, SDIO_DEVICE_ID_NXP_IW61X_BASE, add_quirk, MMC_QUIRK_BLKSZ_FOR_BYTE_MODE), + SDIO_FIXUP(SDIO_VENDOR_ID_NXP, SDIO_DEVICE_ID_NXP_IW610_BASE, + add_quirk, MMC_QUIRK_BLKSZ_FOR_BYTE_MODE), + END_FIXUP }; diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h index 5eff5e348eb0..dfffda3d8002 100644 --- a/include/linux/mmc/sdio_ids.h +++ b/include/linux/mmc/sdio_ids.h @@ -123,6 +123,7 @@ #define SDIO_VENDOR_ID_NXP 0x0471 #define SDIO_DEVICE_ID_NXP_IW61X_BASE 0x0204 #define SDIO_DEVICE_ID_NXP_IW61X 0x0205 +#define SDIO_DEVICE_ID_NXP_IW610_BASE 0x0214 #define SDIO_DEVICE_ID_NXP_IW610 0x0215 #define SDIO_VENDOR_ID_REALTEK 0x024c -- 2.34.1 From: Jeff Chen Add the IW610 SDIO device ID to the supported device table. This enables driver probing, interface initialization, and firmware download for the NXP IW610 wireless chipset. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Jeff Chen --- drivers/net/wireless/nxp/nxpwifi/sdio.c | 16 ++++++++++++++++ drivers/net/wireless/nxp/nxpwifi/sdio.h | 1 + 2 files changed, 17 insertions(+) diff --git a/drivers/net/wireless/nxp/nxpwifi/sdio.c b/drivers/net/wireless/nxp/nxpwifi/sdio.c index 8ef0f6eb49e2..f4de494bf2f2 100644 --- a/drivers/net/wireless/nxp/nxpwifi/sdio.c +++ b/drivers/net/wireless/nxp/nxpwifi/sdio.c @@ -96,6 +96,19 @@ static const struct nxpwifi_sdio_device nxpwifi_sdio_iw61x = { .can_ext_scan = true, }; +static const struct nxpwifi_sdio_device nxpwifi_sdio_iw610 = { + .firmware = IW610_SDIO_FW_NAME, + .reg = &nxpwifi_reg_iw61x, + .max_ports = 32, + .mp_agg_pkt_limit = 16, + .tx_buf_size = NXPWIFI_TX_DATA_BUF_SIZE_4K, + .mp_tx_agg_buf_size = NXPWIFI_MP_AGGR_BSIZE_MAX, + .mp_rx_agg_buf_size = NXPWIFI_MP_AGGR_BSIZE_MAX, + .can_dump_fw = true, + .fw_dump_enh = true, + .can_ext_scan = true, +}; + static struct memory_type_mapping generic_mem_type_map[] = { {"DUMP", NULL, 0, 0xDD}, }; @@ -458,6 +471,8 @@ static void nxpwifi_sdio_coredump(struct device *dev) static const struct sdio_device_id nxpwifi_ids[] = { {SDIO_DEVICE(SDIO_VENDOR_ID_NXP, SDIO_DEVICE_ID_NXP_IW61X), .driver_data = (unsigned long)&nxpwifi_sdio_iw61x}, + {SDIO_DEVICE(SDIO_VENDOR_ID_NXP, SDIO_DEVICE_ID_NXP_IW610), + .driver_data = (unsigned long)&nxpwifi_sdio_iw610}, {}, }; @@ -2326,3 +2341,4 @@ MODULE_DESCRIPTION("NXP WiFi SDIO Driver version " SDIO_VERSION); MODULE_VERSION(SDIO_VERSION); MODULE_LICENSE("GPL"); MODULE_FIRMWARE(IW61X_SDIO_FW_NAME); +MODULE_FIRMWARE(IW610_SDIO_FW_NAME); diff --git a/drivers/net/wireless/nxp/nxpwifi/sdio.h b/drivers/net/wireless/nxp/nxpwifi/sdio.h index de5c884a5b14..e9881448fe2f 100644 --- a/drivers/net/wireless/nxp/nxpwifi/sdio.h +++ b/drivers/net/wireless/nxp/nxpwifi/sdio.h @@ -11,6 +11,7 @@ #include "main.h" #define IW61X_SDIO_FW_NAME "nxp/sd_w61x_v1.bin.se" +#define IW610_SDIO_FW_NAME "nxp/sd_iw610.bin.se" #define BLOCK_MODE 1 #define BYTE_MODE 0 -- 2.34.1 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