]> git.itanic.dy.fi Git - linux-stable/commitdiff
wifi: mwifiex: Support SD8978 chipset
authorLukas Wunner <lukas@wunner.de>
Fri, 27 Jan 2023 14:02:00 +0000 (15:02 +0100)
committerKalle Valo <kvalo@kernel.org>
Mon, 13 Feb 2023 16:51:35 +0000 (18:51 +0200)
The Marvell SD8978 (aka NXP IW416) uses identical registers as SD8987,
so reuse the existing mwifiex_reg_sd8987 definition.

Note that mwifiex_reg_sd8977 and mwifiex_reg_sd8997 are likewise
identical, save for the fw_dump_ctrl register:  They define it as 0xf0
whereas mwifiex_reg_sd8987 defines it as 0xf9.  I've verified that
0xf9 is the correct value on SD8978.  NXP's out-of-tree driver uses
0xf9 for all of them, so there's a chance that 0xf0 is not correct
in the mwifiex_reg_sd8977 and mwifiex_reg_sd8997 definitions.  I cannot
test that for lack of hardware, hence am leaving it as is.

NXP has only released a firmware which runs Bluetooth over UART.
Perhaps Bluetooth over SDIO is unsupported by this chipset.
Consequently, only an "sdiouart" firmware image is referenced, not an
alternative "sdsd" image.

Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/536b4f17a72ca460ad1b07045757043fb0778988.1674827105.git.lukas@wunner.de
Documentation/devicetree/bindings/net/wireless/marvell-8xxx.txt
drivers/net/wireless/marvell/mwifiex/Kconfig
drivers/net/wireless/marvell/mwifiex/sdio.c
drivers/net/wireless/marvell/mwifiex/sdio.h
include/linux/mmc/sdio_ids.h

index 9bf9bbac16e250fdc674c90a7074aa7724d0ce89..cdc303caf5f45cf276420b41cf0651898848b525 100644 (file)
@@ -1,4 +1,4 @@
-Marvell 8787/8897/8997 (sd8787/sd8897/sd8997/pcie8997) SDIO/PCIE devices
+Marvell 8787/8897/8978/8997 (sd8787/sd8897/sd8978/sd8997/pcie8997) SDIO/PCIE devices
 ------
 
 This node provides properties for controlling the Marvell SDIO/PCIE wireless device.
@@ -10,7 +10,9 @@ Required properties:
   - compatible : should be one of the following:
        * "marvell,sd8787"
        * "marvell,sd8897"
+       * "marvell,sd8978"
        * "marvell,sd8997"
+       * "nxp,iw416"
        * "pci11ab,2b42"
        * "pci1b4b,2b42"
 
index 2b4ff2b78a7e132554d526ca663f6c75f9038900..b182f7155d66faddf4c95d8459fa251bab07cab2 100644 (file)
@@ -10,13 +10,14 @@ config MWIFIEX
          mwifiex.
 
 config MWIFIEX_SDIO
-       tristate "Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8987/SD8997"
+       tristate "Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8978/SD8987/SD8997"
        depends on MWIFIEX && MMC
        select FW_LOADER
        select WANT_DEV_COREDUMP
        help
          This adds support for wireless adapters based on Marvell
-         8786/8787/8797/8887/8897/8977/8987/8997 chipsets with SDIO interface.
+         8786/8787/8797/8887/8897/8977/8978/8987/8997 chipsets with
+         SDIO interface. SD8978 is also known as NXP IW416.
 
          If you choose to build it as a module, it will be called
          mwifiex_sdio.
index 9f506efa53705b344c23f73d62be334a1fb0e619..c64e24c10ea659908cd697321ac6adc996ddf835 100644 (file)
@@ -263,7 +263,7 @@ static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8887 = {
                                 0x68, 0x69, 0x6a},
 };
 
-static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8987 = {
+static const struct mwifiex_sdio_card_reg mwifiex_reg_sd89xx = {
        .start_rd_port = 0,
        .start_wr_port = 0,
        .base_0_reg = 0xF8,
@@ -394,6 +394,22 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8977 = {
        .can_ext_scan = true,
 };
 
+static const struct mwifiex_sdio_device mwifiex_sdio_sd8978 = {
+       .firmware_sdiouart = SD8978_SDIOUART_FW_NAME,
+       .reg = &mwifiex_reg_sd89xx,
+       .max_ports = 32,
+       .mp_agg_pkt_limit = 16,
+       .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
+       .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_MAX,
+       .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_MAX,
+       .supports_sdio_new_mode = true,
+       .has_control_mask = false,
+       .can_dump_fw = true,
+       .fw_dump_enh = true,
+       .can_auto_tdls = false,
+       .can_ext_scan = true,
+};
+
 static const struct mwifiex_sdio_device mwifiex_sdio_sd8997 = {
        .firmware = SD8997_DEFAULT_FW_NAME,
        .firmware_sdiouart = SD8997_SDIOUART_FW_NAME,
@@ -428,7 +444,7 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = {
 
 static const struct mwifiex_sdio_device mwifiex_sdio_sd8987 = {
        .firmware = SD8987_DEFAULT_FW_NAME,
-       .reg = &mwifiex_reg_sd8987,
+       .reg = &mwifiex_reg_sd89xx,
        .max_ports = 32,
        .mp_agg_pkt_limit = 16,
        .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
@@ -482,7 +498,9 @@ static struct memory_type_mapping mem_type_mapping_tbl[] = {
 static const struct of_device_id mwifiex_sdio_of_match_table[] = {
        { .compatible = "marvell,sd8787" },
        { .compatible = "marvell,sd8897" },
+       { .compatible = "marvell,sd8978" },
        { .compatible = "marvell,sd8997" },
+       { .compatible = "nxp,iw416" },
        { }
 };
 
@@ -920,6 +938,8 @@ static const struct sdio_device_id mwifiex_ids[] = {
                .driver_data = (unsigned long)&mwifiex_sdio_sd8801},
        {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8977_WLAN),
                .driver_data = (unsigned long)&mwifiex_sdio_sd8977},
+       {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8978_WLAN),
+               .driver_data = (unsigned long)&mwifiex_sdio_sd8978},
        {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8987_WLAN),
                .driver_data = (unsigned long)&mwifiex_sdio_sd8987},
        {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997_WLAN),
@@ -3164,6 +3184,7 @@ MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME);
 MODULE_FIRMWARE(SD8897_DEFAULT_FW_NAME);
 MODULE_FIRMWARE(SD8887_DEFAULT_FW_NAME);
 MODULE_FIRMWARE(SD8977_DEFAULT_FW_NAME);
+MODULE_FIRMWARE(SD8978_SDIOUART_FW_NAME);
 MODULE_FIRMWARE(SD8987_DEFAULT_FW_NAME);
 MODULE_FIRMWARE(SD8997_DEFAULT_FW_NAME);
 MODULE_FIRMWARE(SD8997_SDIOUART_FW_NAME);
index 3a24bb48b29962884b55bc847d317729e3ec3989..ae94c172310ff52291ef5d6e5e28545a3a6ac471 100644 (file)
@@ -25,6 +25,7 @@
 #define SD8887_DEFAULT_FW_NAME "mrvl/sd8887_uapsta.bin"
 #define SD8801_DEFAULT_FW_NAME "mrvl/sd8801_uapsta.bin"
 #define SD8977_DEFAULT_FW_NAME "mrvl/sdsd8977_combo_v2.bin"
+#define SD8978_SDIOUART_FW_NAME "mrvl/sdiouartiw416_combo_v0.bin"
 #define SD8987_DEFAULT_FW_NAME "mrvl/sd8987_uapsta.bin"
 #define SD8997_DEFAULT_FW_NAME "mrvl/sdsd8997_combo_v4.bin"
 #define SD8997_SDIOUART_FW_NAME "mrvl/sdiouart8997_combo_v4.bin"
index 74f9d9a6d33076dc6c000b32b123355c745896ab..0e4ef9c5127ad23a6894e8c4a84afe53bc586c25 100644 (file)
 #define SDIO_DEVICE_ID_MARVELL_8977_BT         0x9146
 #define SDIO_DEVICE_ID_MARVELL_8987_WLAN       0x9149
 #define SDIO_DEVICE_ID_MARVELL_8987_BT         0x914a
+#define SDIO_DEVICE_ID_MARVELL_8978_WLAN       0x9159
 
 #define SDIO_VENDOR_ID_MEDIATEK                        0x037a
 #define SDIO_DEVICE_ID_MEDIATEK_MT7663         0x7663