mwifiex: add support for Marvell sd8797 device
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>
This commit is contained in:
parent
7adb92faa8
commit
e3bea1c875
8 changed files with 49 additions and 19 deletions
|
@ -10,12 +10,12 @@ config MWIFIEX
|
||||||
mwifiex.
|
mwifiex.
|
||||||
|
|
||||||
config MWIFIEX_SDIO
|
config MWIFIEX_SDIO
|
||||||
tristate "Marvell WiFi-Ex Driver for SD8787"
|
tristate "Marvell WiFi-Ex Driver for SD8787/SD8797"
|
||||||
depends on MWIFIEX && MMC
|
depends on MWIFIEX && MMC
|
||||||
select FW_LOADER
|
select FW_LOADER
|
||||||
---help---
|
---help---
|
||||||
This adds support for wireless adapters based on Marvell
|
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
|
If you choose to build it as a module, it will be called
|
||||||
mwifiex_sdio.
|
mwifiex_sdio.
|
||||||
|
|
|
@ -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
|
* This function maps an index in supported rates table into
|
||||||
* the corresponding data rate.
|
* 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}
|
* For every mcs_rate line, the first 8 bytes are for stream 1x1,
|
||||||
, /* LG 40M */
|
* and all 16 bytes are for stream 2x2.
|
||||||
{0x1e, 0x3c, 0x5a, 0x78, 0xb4, 0xf0, 0x10e, 0x12c}
|
*/
|
||||||
, /* SG 40M */
|
u16 mcs_rate[4][16] = {
|
||||||
{0x0d, 0x1a, 0x27, 0x34, 0x4e, 0x68, 0x75, 0x82}
|
/* LGI 40M */
|
||||||
, /* LG 20M */
|
{ 0x1b, 0x36, 0x51, 0x6c, 0xa2, 0xd8, 0xf3, 0x10e,
|
||||||
{0x0e, 0x1c, 0x2b, 0x39, 0x56, 0x73, 0x82, 0x90}
|
0x36, 0x6c, 0xa2, 0xd8, 0x144, 0x1b0, 0x1e6, 0x21c },
|
||||||
}; /* SG 20M */
|
|
||||||
|
|
||||||
|
/* 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;
|
u32 rate;
|
||||||
|
|
||||||
if (ht_info & BIT(0)) {
|
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 */
|
rate = 0x0D; /* MCS 32 SGI rate */
|
||||||
else
|
else
|
||||||
rate = 0x0C; /* MCS 32 LGI rate */
|
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(1)) {
|
||||||
if (ht_info & BIT(2))
|
if (ht_info & BIT(2))
|
||||||
/* SGI, 40M */
|
/* SGI, 40M */
|
||||||
|
|
|
@ -165,6 +165,7 @@ enum MWIFIEX_802_11_WEP_STATUS {
|
||||||
|
|
||||||
#define GET_RXMCSSUPP(DevMCSSupported) (DevMCSSupported & 0x0f)
|
#define GET_RXMCSSUPP(DevMCSSupported) (DevMCSSupported & 0x0f)
|
||||||
#define SETHT_MCS32(x) (x[4] |= 1)
|
#define SETHT_MCS32(x) (x[4] |= 1)
|
||||||
|
#define HT_STREAM_2X2 0x22
|
||||||
|
|
||||||
#define SET_SECONDARYCHAN(RadioType, SECCHAN) (RadioType |= (SECCHAN << 4))
|
#define SET_SECONDARYCHAN(RadioType, SECCHAN) (RadioType |= (SECCHAN << 4))
|
||||||
|
|
||||||
|
|
|
@ -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_chan_freq_power *mwifiex_get_cfp_by_band_and_freq_from_cfg80211(
|
||||||
struct mwifiex_private *priv,
|
struct mwifiex_private *priv,
|
||||||
u8 band, u32 freq);
|
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);
|
u32 mwifiex_find_freq_from_band_chan(u8, u8);
|
||||||
int mwifiex_cmd_append_vsie_tlv(struct mwifiex_private *priv, u16 vsie_mask,
|
int mwifiex_cmd_append_vsie_tlv(struct mwifiex_private *priv, u16 vsie_mask,
|
||||||
u8 **buffer);
|
u8 **buffer);
|
||||||
|
|
|
@ -256,10 +256,13 @@ static int mwifiex_sdio_resume(struct device *dev)
|
||||||
|
|
||||||
/* Device ID for SD8787 */
|
/* Device ID for SD8787 */
|
||||||
#define SDIO_DEVICE_ID_MARVELL_8787 (0x9119)
|
#define SDIO_DEVICE_ID_MARVELL_8787 (0x9119)
|
||||||
|
/* Device ID for SD8797 */
|
||||||
|
#define SDIO_DEVICE_ID_MARVELL_8797 (0x9129)
|
||||||
|
|
||||||
/* WLAN IDs */
|
/* WLAN IDs */
|
||||||
static const struct sdio_device_id mwifiex_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_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);
|
sdio_set_drvdata(func, card);
|
||||||
|
|
||||||
adapter->dev = &func->dev;
|
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;
|
return 0;
|
||||||
|
|
||||||
|
@ -1774,4 +1786,5 @@ MODULE_AUTHOR("Marvell International Ltd.");
|
||||||
MODULE_DESCRIPTION("Marvell WiFi-Ex SDIO Driver version " SDIO_VERSION);
|
MODULE_DESCRIPTION("Marvell WiFi-Ex SDIO Driver version " SDIO_VERSION);
|
||||||
MODULE_VERSION(SDIO_VERSION);
|
MODULE_VERSION(SDIO_VERSION);
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin");
|
MODULE_FIRMWARE(SD8787_DEFAULT_FW_NAME);
|
||||||
|
MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
#define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin"
|
#define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin"
|
||||||
|
#define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin"
|
||||||
|
|
||||||
#define BLOCK_MODE 1
|
#define BLOCK_MODE 1
|
||||||
#define BYTE_MODE 0
|
#define BYTE_MODE 0
|
||||||
|
|
|
@ -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;
|
priv->tx_htinfo = resp->params.tx_rate.ht_info;
|
||||||
if (!priv->is_data_rate_auto)
|
if (!priv->is_data_rate_auto)
|
||||||
priv->data_rate =
|
priv->data_rate =
|
||||||
mwifiex_index_to_data_rate(priv->tx_rate,
|
mwifiex_index_to_data_rate(priv, priv->tx_rate,
|
||||||
priv->tx_htinfo);
|
priv->tx_htinfo);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -832,8 +832,8 @@ int mwifiex_drv_get_data_rate(struct mwifiex_private *priv,
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
if (rate->is_rate_auto)
|
if (rate->is_rate_auto)
|
||||||
rate->rate = mwifiex_index_to_data_rate(priv->tx_rate,
|
rate->rate = mwifiex_index_to_data_rate(priv,
|
||||||
priv->tx_htinfo);
|
priv->tx_rate, priv->tx_htinfo);
|
||||||
else
|
else
|
||||||
rate->rate = priv->data_rate;
|
rate->rate = priv->data_rate;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Reference in a new issue