Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Conflicts: drivers/net/wireless/iwlwifi/dvm/tx.c drivers/net/wireless/ti/wlcore/sdio.c drivers/net/wireless/ti/wlcore/spi.c
This commit is contained in:
@@ -12,4 +12,13 @@ source "drivers/net/wireless/ti/wl18xx/Kconfig"
|
||||
|
||||
# keep last for automatic dependencies
|
||||
source "drivers/net/wireless/ti/wlcore/Kconfig"
|
||||
|
||||
config WILINK_PLATFORM_DATA
|
||||
bool "TI WiLink platform data"
|
||||
depends on WLCORE_SDIO || WL1251_SDIO
|
||||
default y
|
||||
---help---
|
||||
Small platform data bit needed to pass data to the sdio modules.
|
||||
|
||||
|
||||
endif # WL_TI
|
||||
|
@@ -1,5 +1,7 @@
|
||||
obj-$(CONFIG_WLCORE) += wlcore/
|
||||
obj-$(CONFIG_WL12XX) += wl12xx/
|
||||
obj-$(CONFIG_WL12XX_PLATFORM_DATA) += wlcore/
|
||||
obj-$(CONFIG_WL1251) += wl1251/
|
||||
obj-$(CONFIG_WL18XX) += wl18xx/
|
||||
|
||||
# small builtin driver bit
|
||||
obj-$(CONFIG_WILINK_PLATFORM_DATA) += wilink_platform_data.o
|
||||
|
@@ -29,6 +29,8 @@
|
||||
static int wl1251_event_scan_complete(struct wl1251 *wl,
|
||||
struct event_mailbox *mbox)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
wl1251_debug(DEBUG_EVENT, "status: 0x%x, channels: %d",
|
||||
mbox->scheduled_scan_status,
|
||||
mbox->scheduled_scan_channels);
|
||||
@@ -37,9 +39,11 @@ static int wl1251_event_scan_complete(struct wl1251 *wl,
|
||||
ieee80211_scan_completed(wl->hw, false);
|
||||
wl1251_debug(DEBUG_MAC80211, "mac80211 hw scan completed");
|
||||
wl->scanning = false;
|
||||
if (wl->hw->conf.flags & IEEE80211_CONF_IDLE)
|
||||
ret = wl1251_ps_set_mode(wl, STATION_IDLE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void wl1251_event_mbox_dump(struct event_mailbox *mbox)
|
||||
|
@@ -623,7 +623,7 @@ static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed)
|
||||
}
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_IDLE) {
|
||||
if (changed & IEEE80211_CONF_CHANGE_IDLE && !wl->scanning) {
|
||||
if (conf->flags & IEEE80211_CONF_IDLE) {
|
||||
ret = wl1251_ps_set_mode(wl, STATION_IDLE);
|
||||
if (ret < 0)
|
||||
@@ -895,11 +895,21 @@ static int wl1251_op_hw_scan(struct ieee80211_hw *hw,
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
if (hw->conf.flags & IEEE80211_CONF_IDLE) {
|
||||
ret = wl1251_ps_set_mode(wl, STATION_ACTIVE_MODE);
|
||||
if (ret < 0)
|
||||
goto out_sleep;
|
||||
ret = wl1251_join(wl, wl->bss_type, wl->channel,
|
||||
wl->beacon_int, wl->dtim_period);
|
||||
if (ret < 0)
|
||||
goto out_sleep;
|
||||
}
|
||||
|
||||
skb = ieee80211_probereq_get(wl->hw, wl->vif, ssid, ssid_len,
|
||||
req->ie_len);
|
||||
if (!skb) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
goto out_idle;
|
||||
}
|
||||
if (req->ie_len)
|
||||
memcpy(skb_put(skb, req->ie_len), req->ie, req->ie_len);
|
||||
@@ -908,11 +918,11 @@ static int wl1251_op_hw_scan(struct ieee80211_hw *hw,
|
||||
skb->len);
|
||||
dev_kfree_skb(skb);
|
||||
if (ret < 0)
|
||||
goto out_sleep;
|
||||
goto out_idle;
|
||||
|
||||
ret = wl1251_cmd_trigger_scan_to(wl, 0);
|
||||
if (ret < 0)
|
||||
goto out_sleep;
|
||||
goto out_idle;
|
||||
|
||||
wl->scanning = true;
|
||||
|
||||
@@ -920,9 +930,13 @@ static int wl1251_op_hw_scan(struct ieee80211_hw *hw,
|
||||
req->n_channels, WL1251_SCAN_NUM_PROBES);
|
||||
if (ret < 0) {
|
||||
wl->scanning = false;
|
||||
goto out_sleep;
|
||||
goto out_idle;
|
||||
}
|
||||
goto out_sleep;
|
||||
|
||||
out_idle:
|
||||
if (hw->conf.flags & IEEE80211_CONF_IDLE)
|
||||
ret = wl1251_ps_set_mode(wl, STATION_IDLE);
|
||||
out_sleep:
|
||||
wl1251_ps_elp_sleep(wl);
|
||||
|
||||
|
@@ -1703,7 +1703,8 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
|
||||
static int wl12xx_setup(struct wl1271 *wl)
|
||||
{
|
||||
struct wl12xx_priv *priv = wl->priv;
|
||||
struct wl12xx_platform_data *pdata = wl->pdev->dev.platform_data;
|
||||
struct wlcore_platdev_data *pdev_data = wl->pdev->dev.platform_data;
|
||||
struct wl12xx_platform_data *pdata = pdev_data->pdata;
|
||||
|
||||
wl->rtable = wl12xx_rtable;
|
||||
wl->num_tx_desc = WL12XX_NUM_TX_DESCRIPTORS;
|
||||
|
@@ -23,7 +23,7 @@
|
||||
#define __WL18XX_CONF_H__
|
||||
|
||||
#define WL18XX_CONF_MAGIC 0x10e100ca
|
||||
#define WL18XX_CONF_VERSION (WLCORE_CONF_VERSION | 0x0005)
|
||||
#define WL18XX_CONF_VERSION (WLCORE_CONF_VERSION | 0x0006)
|
||||
#define WL18XX_CONF_MASK 0x0000ffff
|
||||
#define WL18XX_CONF_SIZE (WLCORE_CONF_SIZE + \
|
||||
sizeof(struct wl18xx_priv_conf))
|
||||
@@ -70,8 +70,9 @@ struct wl18xx_mac_and_phy_params {
|
||||
u8 pwr_limit_reference_11_abg;
|
||||
u8 per_chan_pwr_limit_arr_11p[NUM_OF_CHANNELS_11_P];
|
||||
u8 pwr_limit_reference_11p;
|
||||
u8 spare1[9];
|
||||
u8 spare2[9];
|
||||
u8 spare1;
|
||||
u8 per_chan_bo_mode_11_abg[13];
|
||||
u8 per_chan_bo_mode_11_p[4];
|
||||
u8 primary_clock_setting_time;
|
||||
u8 clock_valid_on_wake_up;
|
||||
u8 secondary_clock_setting_time;
|
||||
|
@@ -547,6 +547,11 @@ static struct wl18xx_priv_conf wl18xx_default_priv_conf = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
|
||||
.pwr_limit_reference_11p = 0x64,
|
||||
.per_chan_bo_mode_11_abg = { 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00 },
|
||||
.per_chan_bo_mode_11_p = { 0x00, 0x00, 0x00, 0x00 },
|
||||
.per_chan_pwr_limit_arr_11p = { 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff },
|
||||
.psat = 0,
|
||||
@@ -1369,7 +1374,7 @@ static void wl18xx_sta_rc_update(struct wl1271 *wl,
|
||||
struct ieee80211_sta *sta,
|
||||
u32 changed)
|
||||
{
|
||||
bool wide = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
bool wide = sta->bandwidth >= IEEE80211_STA_RX_BW_40;
|
||||
|
||||
wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update wide %d", wide);
|
||||
|
||||
|
@@ -33,8 +33,3 @@ config WLCORE_SDIO
|
||||
|
||||
If you choose to build a module, it'll be called wlcore_sdio.
|
||||
Say N if unsure.
|
||||
|
||||
config WL12XX_PLATFORM_DATA
|
||||
bool
|
||||
depends on WLCORE_SDIO != n || WL1251_SDIO != n
|
||||
default y
|
||||
|
@@ -9,7 +9,4 @@ obj-$(CONFIG_WLCORE) += wlcore.o
|
||||
obj-$(CONFIG_WLCORE_SPI) += wlcore_spi.o
|
||||
obj-$(CONFIG_WLCORE_SDIO) += wlcore_sdio.o
|
||||
|
||||
# small builtin driver bit
|
||||
obj-$(CONFIG_WL12XX_PLATFORM_DATA) += wl12xx_platform_data.o
|
||||
|
||||
ccflags-y += -D__CHECK_ENDIAN__
|
||||
|
@@ -84,8 +84,8 @@ out:
|
||||
static int wlcore_validate_fw_ver(struct wl1271 *wl)
|
||||
{
|
||||
unsigned int *fw_ver = wl->chip.fw_ver;
|
||||
unsigned int *min_ver = (wl->fw_type == WL12XX_FW_TYPE_NORMAL) ?
|
||||
wl->min_sr_fw_ver : wl->min_mr_fw_ver;
|
||||
unsigned int *min_ver = (wl->fw_type == WL12XX_FW_TYPE_MULTI) ?
|
||||
wl->min_mr_fw_ver : wl->min_sr_fw_ver;
|
||||
char min_fw_str[32] = "";
|
||||
int i;
|
||||
|
||||
|
@@ -510,10 +510,12 @@ int wl12xx_cmd_role_start_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
||||
cmd->sta.hlid = wlvif->sta.hlid;
|
||||
cmd->sta.session = wl->session_ids[wlvif->sta.hlid];
|
||||
/*
|
||||
* We don't have the correct remote rates in this stage. the rates
|
||||
* will be reconfigured later, after authorization.
|
||||
* We don't have the correct remote rates in this stage. The
|
||||
* rates will be reconfigured later, after association, if the
|
||||
* firmware supports ACX_PEER_CAP. Otherwise, there's nothing
|
||||
* we can do, so use all supported_rates here.
|
||||
*/
|
||||
cmd->sta.remote_rates = cpu_to_le32(wlvif->rate_set);
|
||||
cmd->sta.remote_rates = cpu_to_le32(supported_rates);
|
||||
|
||||
wl1271_debug(DEBUG_CMD, "role start: roleid=%d, hlid=%d, session=%d "
|
||||
"basic_rate_set: 0x%x, remote_rates: 0x%x",
|
||||
|
@@ -2162,7 +2162,7 @@ static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool wl12xx_init_fw(struct wl1271 *wl)
|
||||
static int wl12xx_init_fw(struct wl1271 *wl)
|
||||
{
|
||||
int retries = WL1271_BOOT_RETRIES;
|
||||
bool booted = false;
|
||||
@@ -2228,7 +2228,7 @@ power_off:
|
||||
|
||||
wl->state = WLCORE_STATE_ON;
|
||||
out:
|
||||
return booted;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
|
||||
@@ -2371,7 +2371,6 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
|
||||
struct vif_counter_data vif_count;
|
||||
int ret = 0;
|
||||
u8 role_type;
|
||||
bool booted = false;
|
||||
|
||||
vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
|
||||
IEEE80211_VIF_SUPPORTS_CQM_RSSI;
|
||||
@@ -2432,11 +2431,9 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
|
||||
*/
|
||||
memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN);
|
||||
|
||||
booted = wl12xx_init_fw(wl);
|
||||
if (!booted) {
|
||||
ret = -EINVAL;
|
||||
ret = wl12xx_init_fw(wl);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
ret = wl12xx_cmd_role_enable(wl, vif->addr,
|
||||
@@ -5639,7 +5636,6 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
|
||||
IEEE80211_HW_AP_LINK_PS |
|
||||
IEEE80211_HW_AMPDU_AGGREGATION |
|
||||
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW |
|
||||
IEEE80211_HW_SCAN_WHILE_IDLE |
|
||||
IEEE80211_HW_QUEUE_CONTROL;
|
||||
|
||||
wl->hw->wiphy->cipher_suites = cipher_suites;
|
||||
@@ -5966,7 +5962,8 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
|
||||
{
|
||||
struct wl1271 *wl = context;
|
||||
struct platform_device *pdev = wl->pdev;
|
||||
struct wl12xx_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct wlcore_platdev_data *pdev_data = pdev->dev.platform_data;
|
||||
struct wl12xx_platform_data *pdata = pdev_data->pdata;
|
||||
unsigned long irqflags;
|
||||
int ret;
|
||||
|
||||
@@ -5995,8 +5992,7 @@ static void wlcore_nvs_cb(const struct firmware *fw, void *context)
|
||||
|
||||
wl->irq = platform_get_irq(pdev, 0);
|
||||
wl->platform_quirks = pdata->platform_quirks;
|
||||
wl->set_power = pdata->set_power;
|
||||
wl->if_ops = pdata->ops;
|
||||
wl->if_ops = pdev_data->if_ops;
|
||||
|
||||
if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
|
||||
irqflags = IRQF_TRIGGER_RISING;
|
||||
|
@@ -217,7 +217,7 @@ static struct wl1271_if_operations sdio_ops = {
|
||||
static int wl1271_probe(struct sdio_func *func,
|
||||
const struct sdio_device_id *id)
|
||||
{
|
||||
struct wl12xx_platform_data *wlan_data;
|
||||
struct wlcore_platdev_data *pdev_data;
|
||||
struct wl12xx_sdio_glue *glue;
|
||||
struct resource res[1];
|
||||
mmc_pm_flag_t mmcflags;
|
||||
@@ -228,10 +228,18 @@ static int wl1271_probe(struct sdio_func *func,
|
||||
if (func->num != 0x02)
|
||||
return -ENODEV;
|
||||
|
||||
glue = kzalloc(sizeof(*glue), GFP_KERNEL);
|
||||
if (!glue)
|
||||
pdev_data = kzalloc(sizeof(*pdev_data), GFP_KERNEL);
|
||||
if (!pdev_data)
|
||||
goto out;
|
||||
|
||||
pdev_data->if_ops = &sdio_ops;
|
||||
|
||||
glue = kzalloc(sizeof(*glue), GFP_KERNEL);
|
||||
if (!glue) {
|
||||
dev_err(&func->dev, "can't allocate glue\n");
|
||||
goto out_free_pdev_data;
|
||||
}
|
||||
|
||||
glue->dev = &func->dev;
|
||||
|
||||
/* Grab access to FN0 for ELP reg. */
|
||||
@@ -240,9 +248,9 @@ static int wl1271_probe(struct sdio_func *func,
|
||||
/* Use block mode for transferring over one block size of data */
|
||||
func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
|
||||
|
||||
wlan_data = wl12xx_get_platform_data();
|
||||
if (IS_ERR(wlan_data)) {
|
||||
ret = PTR_ERR(wlan_data);
|
||||
pdev_data->pdata = wl12xx_get_platform_data();
|
||||
if (IS_ERR(pdev_data->pdata)) {
|
||||
ret = PTR_ERR(pdev_data->pdata);
|
||||
dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
|
||||
goto out_free_glue;
|
||||
}
|
||||
@@ -252,9 +260,7 @@ static int wl1271_probe(struct sdio_func *func,
|
||||
dev_dbg(glue->dev, "sdio PM caps = 0x%x\n", mmcflags);
|
||||
|
||||
if (mmcflags & MMC_PM_KEEP_POWER)
|
||||
wlan_data->pwr_in_suspend = true;
|
||||
|
||||
wlan_data->ops = &sdio_ops;
|
||||
pdev_data->pdata->pwr_in_suspend = true;
|
||||
|
||||
sdio_set_drvdata(func, glue);
|
||||
|
||||
@@ -272,7 +278,7 @@ static int wl1271_probe(struct sdio_func *func,
|
||||
else
|
||||
chip_family = "wl12xx";
|
||||
|
||||
glue->core = platform_device_alloc(chip_family, -1);
|
||||
glue->core = platform_device_alloc(chip_family, PLATFORM_DEVID_AUTO);
|
||||
if (!glue->core) {
|
||||
dev_err(glue->dev, "can't allocate platform_device");
|
||||
ret = -ENOMEM;
|
||||
@@ -283,7 +289,7 @@ static int wl1271_probe(struct sdio_func *func,
|
||||
|
||||
memset(res, 0x00, sizeof(res));
|
||||
|
||||
res[0].start = wlan_data->irq;
|
||||
res[0].start = pdev_data->pdata->irq;
|
||||
res[0].flags = IORESOURCE_IRQ;
|
||||
res[0].name = "irq";
|
||||
|
||||
@@ -293,8 +299,8 @@ static int wl1271_probe(struct sdio_func *func,
|
||||
goto out_dev_put;
|
||||
}
|
||||
|
||||
ret = platform_device_add_data(glue->core, wlan_data,
|
||||
sizeof(*wlan_data));
|
||||
ret = platform_device_add_data(glue->core, pdev_data,
|
||||
sizeof(*pdev_data));
|
||||
if (ret) {
|
||||
dev_err(glue->dev, "can't add platform data\n");
|
||||
goto out_dev_put;
|
||||
@@ -313,6 +319,9 @@ out_dev_put:
|
||||
out_free_glue:
|
||||
kfree(glue);
|
||||
|
||||
out_free_pdev_data:
|
||||
kfree(pdev_data);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
@@ -87,8 +87,11 @@ static void wl12xx_spi_reset(struct device *child)
|
||||
struct spi_message m;
|
||||
|
||||
cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
|
||||
if (!cmd)
|
||||
if (!cmd) {
|
||||
dev_err(child->parent,
|
||||
"could not allocate cmd for spi reset\n");
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&t, 0, sizeof(t));
|
||||
spi_message_init(&m);
|
||||
@@ -112,8 +115,11 @@ static void wl12xx_spi_init(struct device *child)
|
||||
struct spi_message m;
|
||||
|
||||
cmd = kzalloc(WSPI_INIT_CMD_LEN, GFP_KERNEL);
|
||||
if (!cmd)
|
||||
if (!cmd) {
|
||||
dev_err(child->parent,
|
||||
"could not allocate cmd for spi init\n");
|
||||
return;
|
||||
}
|
||||
|
||||
memset(crc, 0, sizeof(crc));
|
||||
memset(&t, 0, sizeof(t));
|
||||
@@ -321,21 +327,28 @@ static struct wl1271_if_operations spi_ops = {
|
||||
static int wl1271_probe(struct spi_device *spi)
|
||||
{
|
||||
struct wl12xx_spi_glue *glue;
|
||||
struct wl12xx_platform_data *pdata;
|
||||
struct wlcore_platdev_data *pdev_data;
|
||||
struct resource res[1];
|
||||
int ret = -ENOMEM;
|
||||
|
||||
pdata = spi->dev.platform_data;
|
||||
if (!pdata) {
|
||||
pdev_data = kzalloc(sizeof(*pdev_data), GFP_KERNEL);
|
||||
if (!pdev_data)
|
||||
goto out;
|
||||
|
||||
pdev_data->pdata = spi->dev.platform_data;
|
||||
if (!pdev_data->pdata) {
|
||||
dev_err(&spi->dev, "no platform data\n");
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto out_free_pdev_data;
|
||||
}
|
||||
|
||||
pdata->ops = &spi_ops;
|
||||
pdev_data->if_ops = &spi_ops;
|
||||
|
||||
glue = kzalloc(sizeof(*glue), GFP_KERNEL);
|
||||
if (!glue)
|
||||
goto out;
|
||||
if (!glue) {
|
||||
dev_err(&spi->dev, "can't allocate glue\n");
|
||||
goto out_free_pdev_data;
|
||||
}
|
||||
|
||||
glue->dev = &spi->dev;
|
||||
|
||||
@@ -351,7 +364,7 @@ static int wl1271_probe(struct spi_device *spi)
|
||||
goto out_free_glue;
|
||||
}
|
||||
|
||||
glue->core = platform_device_alloc("wl12xx", -1);
|
||||
glue->core = platform_device_alloc("wl12xx", PLATFORM_DEVID_AUTO);
|
||||
if (!glue->core) {
|
||||
dev_err(glue->dev, "can't allocate platform_device\n");
|
||||
ret = -ENOMEM;
|
||||
@@ -372,7 +385,8 @@ static int wl1271_probe(struct spi_device *spi)
|
||||
goto out_dev_put;
|
||||
}
|
||||
|
||||
ret = platform_device_add_data(glue->core, pdata, sizeof(*pdata));
|
||||
ret = platform_device_add_data(glue->core, pdev_data,
|
||||
sizeof(*pdev_data));
|
||||
if (ret) {
|
||||
dev_err(glue->dev, "can't add platform data\n");
|
||||
goto out_dev_put;
|
||||
@@ -391,6 +405,10 @@ out_dev_put:
|
||||
|
||||
out_free_glue:
|
||||
kfree(glue);
|
||||
|
||||
out_free_pdev_data:
|
||||
kfree(pdev_data);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
@@ -183,7 +183,6 @@ struct wl1271 {
|
||||
|
||||
struct wl1271_if_operations *if_ops;
|
||||
|
||||
void (*set_power)(bool enable);
|
||||
int irq;
|
||||
|
||||
spinlock_t wl_lock;
|
||||
|
@@ -206,6 +206,11 @@ struct wl1271_if_operations {
|
||||
void (*set_block_size) (struct device *child, unsigned int blksz);
|
||||
};
|
||||
|
||||
struct wlcore_platdev_data {
|
||||
struct wl12xx_platform_data *pdata;
|
||||
struct wl1271_if_operations *if_ops;
|
||||
};
|
||||
|
||||
#define MAX_NUM_KEYS 14
|
||||
#define MAX_KEY_SIZE 32
|
||||
|
||||
|
Reference in New Issue
Block a user