mwifiex: add support for Marvell sd8797 device
authorBing Zhao <bzhao@marvell.com>
Thu, 17 Nov 2011 04:40:35 +0000 (20:40 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 17 Nov 2011 20:45:19 +0000 (15:45 -0500)
This patch supports Marvell chipset 88W8797 (Avastar) with
SDIO interface.

The corresponding firmware image file is located at:
"mrvl/sd8797_uapsta.bin"

Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Tristan Xu <xurf@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kiran Divekar <dkiran@marvell.com>
Signed-off-by: Frank Huang <frankh@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/Kconfig
drivers/net/wireless/mwifiex/cfp.c
drivers/net/wireless/mwifiex/fw.h
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sdio.c
drivers/net/wireless/mwifiex/sdio.h
drivers/net/wireless/mwifiex/sta_cmdresp.c
drivers/net/wireless/mwifiex/sta_ioctl.c

index 8f2797aa0c6083be6f22f557b4b479d7014b1b69..2a078cea830a01b04237a646c5d9b73f84febd4e 100644 (file)
@@ -10,12 +10,12 @@ config MWIFIEX
          mwifiex.
 
 config MWIFIEX_SDIO
-       tristate "Marvell WiFi-Ex Driver for SD8787"
+       tristate "Marvell WiFi-Ex Driver for SD8787/SD8797"
        depends on MWIFIEX && MMC
        select FW_LOADER
        ---help---
          This adds support for wireless adapters based on Marvell
-         8787 chipset with SDIO interface.
+         8787/8797 chipsets with SDIO interface.
 
          If you choose to build it as a module, it will be called
          mwifiex_sdio.
index f2e6de03805cd61bbe246d8ccf8a5a6235d78e0b..1782a77f15dcb82b9a2d1febef1f0fecd03f2895 100644 (file)
@@ -75,18 +75,32 @@ static u8 supported_rates_n[N_SUPPORTED_RATES] = { 0x02, 0x04, 0 };
  * This function maps an index in supported rates table into
  * the corresponding data rate.
  */
-u32 mwifiex_index_to_data_rate(u8 index, u8 ht_info)
+u32 mwifiex_index_to_data_rate(struct mwifiex_private *priv, u8 index,
+                                                       u8 ht_info)
 {
-       u16 mcs_rate[4][8] = {
-               {0x1b, 0x36, 0x51, 0x6c, 0xa2, 0xd8, 0xf3, 0x10e}
-       ,                       /* LG 40M */
-       {0x1e, 0x3c, 0x5a, 0x78, 0xb4, 0xf0, 0x10e, 0x12c}
-       ,                       /* SG 40M */
-       {0x0d, 0x1a, 0x27, 0x34, 0x4e, 0x68, 0x75, 0x82}
-       ,                       /* LG 20M */
-       {0x0e, 0x1c, 0x2b, 0x39, 0x56, 0x73, 0x82, 0x90}
-       };                      /* SG 20M */
-
+       /*
+        * For every mcs_rate line, the first 8 bytes are for stream 1x1,
+        * and all 16 bytes are for stream 2x2.
+        */
+       u16  mcs_rate[4][16] = {
+               /* LGI 40M */
+               { 0x1b, 0x36, 0x51, 0x6c, 0xa2, 0xd8, 0xf3, 0x10e,
+                 0x36, 0x6c, 0xa2, 0xd8, 0x144, 0x1b0, 0x1e6, 0x21c },
+
+               /* SGI 40M */
+               { 0x1e, 0x3c, 0x5a, 0x78, 0xb4, 0xf0, 0x10e, 0x12c,
+                 0x3c, 0x78, 0xb4, 0xf0, 0x168, 0x1e0, 0x21c, 0x258 },
+
+               /* LGI 20M */
+               { 0x0d, 0x1a, 0x27, 0x34, 0x4e, 0x68, 0x75, 0x82,
+                 0x1a, 0x34, 0x4e, 0x68, 0x9c, 0xd0, 0xea, 0x104 },
+
+               /* SGI 20M */
+               { 0x0e, 0x1c, 0x2b, 0x39, 0x56, 0x73, 0x82, 0x90,
+                 0x1c, 0x39, 0x56, 0x73, 0xad, 0xe7, 0x104, 0x120 }
+       };
+       u32 mcs_num_supp =
+               (priv->adapter->hw_dev_mcs_support == HT_STREAM_2X2) ? 16 : 8;
        u32 rate;
 
        if (ht_info & BIT(0)) {
@@ -95,7 +109,7 @@ u32 mwifiex_index_to_data_rate(u8 index, u8 ht_info)
                                rate = 0x0D;    /* MCS 32 SGI rate */
                        else
                                rate = 0x0C;    /* MCS 32 LGI rate */
-               } else if (index < 8) {
+               } else if (index < mcs_num_supp) {
                        if (ht_info & BIT(1)) {
                                if (ht_info & BIT(2))
                                        /* SGI, 40M */
index 35cb29cbd96e5d083b438fa62c22e85493dec45d..62b863907698028f07a5abb51d33bde8c3a96681 100644 (file)
@@ -165,6 +165,7 @@ enum MWIFIEX_802_11_WEP_STATUS {
 
 #define GET_RXMCSSUPP(DevMCSSupported) (DevMCSSupported & 0x0f)
 #define SETHT_MCS32(x) (x[4] |= 1)
+#define HT_STREAM_2X2  0x22
 
 #define SET_SECONDARYCHAN(RadioType, SECCHAN) (RadioType |= (SECCHAN << 4))
 
index 30f138b6fa4c6cf4545ca1c2500baf8a42c43248..3861a617c0e13e3b5b61a768924e20bfb2784715 100644 (file)
@@ -775,7 +775,8 @@ struct mwifiex_chan_freq_power *
 struct mwifiex_chan_freq_power *mwifiex_get_cfp_by_band_and_freq_from_cfg80211(
                                                struct mwifiex_private *priv,
                                                u8 band, u32 freq);
-u32 mwifiex_index_to_data_rate(u8 index, u8 ht_info);
+u32 mwifiex_index_to_data_rate(struct mwifiex_private *priv, u8 index,
+                                                       u8 ht_info);
 u32 mwifiex_find_freq_from_band_chan(u8, u8);
 int mwifiex_cmd_append_vsie_tlv(struct mwifiex_private *priv, u16 vsie_mask,
                                u8 **buffer);
index ffaf3f3a57df047beea84986504a071b4b05e3ca..702452b505c33c3e29f00dc45b576879524a3eed 100644 (file)
@@ -256,10 +256,13 @@ static int mwifiex_sdio_resume(struct device *dev)
 
 /* Device ID for SD8787 */
 #define SDIO_DEVICE_ID_MARVELL_8787   (0x9119)
+/* Device ID for SD8797 */
+#define SDIO_DEVICE_ID_MARVELL_8797   (0x9129)
 
 /* WLAN IDs */
 static const struct sdio_device_id mwifiex_ids[] = {
        {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787)},
+       {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797)},
        {},
 };
 
@@ -1573,7 +1576,16 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
        sdio_set_drvdata(func, card);
 
        adapter->dev = &func->dev;
-       strcpy(adapter->fw_name, SD8787_DEFAULT_FW_NAME);
+
+       switch (func->device) {
+       case SDIO_DEVICE_ID_MARVELL_8797:
+               strcpy(adapter->fw_name, SD8797_DEFAULT_FW_NAME);
+               break;
+       case SDIO_DEVICE_ID_MARVELL_8787:
+       default:
+               strcpy(adapter->fw_name, SD8787_DEFAULT_FW_NAME);
+               break;
+       }
 
        return 0;
 
@@ -1774,4 +1786,5 @@ MODULE_AUTHOR("Marvell International Ltd.");
 MODULE_DESCRIPTION("Marvell WiFi-Ex SDIO Driver version " SDIO_VERSION);
 MODULE_VERSION(SDIO_VERSION);
 MODULE_LICENSE("GPL v2");
-MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin");
+MODULE_FIRMWARE(SD8787_DEFAULT_FW_NAME);
+MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME);
index 3f711801e58a9cb4916ffe259e5a5c71691cdfbd..a3fb322205b0a69c295049cecb94c6522ea4b768 100644 (file)
@@ -29,6 +29,7 @@
 #include "main.h"
 
 #define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin"
+#define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin"
 
 #define BLOCK_MODE     1
 #define BYTE_MODE      0
index 7a16b0c417afc58a0d7a23cf5aadd6151d2b7fd6..e812db8b695cabdfa294c19d9ab08e92b4cb88b7 100644 (file)
@@ -508,7 +508,7 @@ static int mwifiex_ret_802_11_tx_rate_query(struct mwifiex_private *priv,
        priv->tx_htinfo = resp->params.tx_rate.ht_info;
        if (!priv->is_data_rate_auto)
                priv->data_rate =
-                       mwifiex_index_to_data_rate(priv->tx_rate,
+                       mwifiex_index_to_data_rate(priv, priv->tx_rate,
                                                   priv->tx_htinfo);
 
        return 0;
index ea4a29b7e331c4bccf646deb92f414c4825a5796..4b6f5539657d6cd250c07939cda005c02e66fba0 100644 (file)
@@ -832,8 +832,8 @@ int mwifiex_drv_get_data_rate(struct mwifiex_private *priv,
 
        if (!ret) {
                if (rate->is_rate_auto)
-                       rate->rate = mwifiex_index_to_data_rate(priv->tx_rate,
-                                                       priv->tx_htinfo);
+                       rate->rate = mwifiex_index_to_data_rate(priv,
+                                       priv->tx_rate, priv->tx_htinfo);
                else
                        rate->rate = priv->data_rate;
        } else {