cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

main.c (37731B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * This file is part of wl1251
      4 *
      5 * Copyright (C) 2008-2009 Nokia Corporation
      6 */
      7
      8#include <linux/module.h>
      9#include <linux/interrupt.h>
     10#include <linux/firmware.h>
     11#include <linux/delay.h>
     12#include <linux/irq.h>
     13#include <linux/crc32.h>
     14#include <linux/etherdevice.h>
     15#include <linux/vmalloc.h>
     16#include <linux/slab.h>
     17#include <linux/netdevice.h>
     18
     19#include "wl1251.h"
     20#include "wl12xx_80211.h"
     21#include "reg.h"
     22#include "io.h"
     23#include "cmd.h"
     24#include "event.h"
     25#include "tx.h"
     26#include "rx.h"
     27#include "ps.h"
     28#include "init.h"
     29#include "debugfs.h"
     30#include "boot.h"
     31
     32void wl1251_enable_interrupts(struct wl1251 *wl)
     33{
     34	wl->if_ops->enable_irq(wl);
     35}
     36
     37void wl1251_disable_interrupts(struct wl1251 *wl)
     38{
     39	wl->if_ops->disable_irq(wl);
     40}
     41
     42static int wl1251_power_off(struct wl1251 *wl)
     43{
     44	return wl->if_ops->power(wl, false);
     45}
     46
     47static int wl1251_power_on(struct wl1251 *wl)
     48{
     49	return wl->if_ops->power(wl, true);
     50}
     51
     52static int wl1251_fetch_firmware(struct wl1251 *wl)
     53{
     54	const struct firmware *fw;
     55	struct device *dev = wiphy_dev(wl->hw->wiphy);
     56	int ret;
     57
     58	ret = request_firmware(&fw, WL1251_FW_NAME, dev);
     59
     60	if (ret < 0) {
     61		wl1251_error("could not get firmware: %d", ret);
     62		return ret;
     63	}
     64
     65	if (fw->size % 4) {
     66		wl1251_error("firmware size is not multiple of 32 bits: %zu",
     67			     fw->size);
     68		ret = -EILSEQ;
     69		goto out;
     70	}
     71
     72	wl->fw_len = fw->size;
     73	wl->fw = vmalloc(wl->fw_len);
     74
     75	if (!wl->fw) {
     76		wl1251_error("could not allocate memory for the firmware");
     77		ret = -ENOMEM;
     78		goto out;
     79	}
     80
     81	memcpy(wl->fw, fw->data, wl->fw_len);
     82
     83	ret = 0;
     84
     85out:
     86	release_firmware(fw);
     87
     88	return ret;
     89}
     90
     91static int wl1251_fetch_nvs(struct wl1251 *wl)
     92{
     93	const struct firmware *fw;
     94	struct device *dev = wiphy_dev(wl->hw->wiphy);
     95	int ret;
     96
     97	ret = request_firmware(&fw, WL1251_NVS_NAME, dev);
     98
     99	if (ret < 0) {
    100		wl1251_error("could not get nvs file: %d", ret);
    101		return ret;
    102	}
    103
    104	if (fw->size % 4) {
    105		wl1251_error("nvs size is not multiple of 32 bits: %zu",
    106			     fw->size);
    107		ret = -EILSEQ;
    108		goto out;
    109	}
    110
    111	wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
    112
    113	if (!wl->nvs) {
    114		wl1251_error("could not allocate memory for the nvs file");
    115		ret = -ENOMEM;
    116		goto out;
    117	}
    118
    119	wl->nvs_len = fw->size;
    120
    121	ret = 0;
    122
    123out:
    124	release_firmware(fw);
    125
    126	return ret;
    127}
    128
    129static void wl1251_fw_wakeup(struct wl1251 *wl)
    130{
    131	u32 elp_reg;
    132
    133	elp_reg = ELPCTRL_WAKE_UP;
    134	wl1251_write_elp(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
    135	elp_reg = wl1251_read_elp(wl, HW_ACCESS_ELP_CTRL_REG_ADDR);
    136
    137	if (!(elp_reg & ELPCTRL_WLAN_READY))
    138		wl1251_warning("WLAN not ready");
    139}
    140
    141static int wl1251_chip_wakeup(struct wl1251 *wl)
    142{
    143	int ret;
    144
    145	ret = wl1251_power_on(wl);
    146	if (ret < 0)
    147		return ret;
    148
    149	msleep(WL1251_POWER_ON_SLEEP);
    150	wl->if_ops->reset(wl);
    151
    152	/* We don't need a real memory partition here, because we only want
    153	 * to use the registers at this point. */
    154	wl1251_set_partition(wl,
    155			     0x00000000,
    156			     0x00000000,
    157			     REGISTERS_BASE,
    158			     REGISTERS_DOWN_SIZE);
    159
    160	/* ELP module wake up */
    161	wl1251_fw_wakeup(wl);
    162
    163	/* whal_FwCtrl_BootSm() */
    164
    165	/* 0. read chip id from CHIP_ID */
    166	wl->chip_id = wl1251_reg_read32(wl, CHIP_ID_B);
    167
    168	/* 1. check if chip id is valid */
    169
    170	switch (wl->chip_id) {
    171	case CHIP_ID_1251_PG12:
    172		wl1251_debug(DEBUG_BOOT, "chip id 0x%x (1251 PG12)",
    173			     wl->chip_id);
    174		break;
    175	case CHIP_ID_1251_PG11:
    176		wl1251_debug(DEBUG_BOOT, "chip id 0x%x (1251 PG11)",
    177			     wl->chip_id);
    178		break;
    179	case CHIP_ID_1251_PG10:
    180	default:
    181		wl1251_error("unsupported chip id: 0x%x", wl->chip_id);
    182		ret = -ENODEV;
    183		goto out;
    184	}
    185
    186	if (wl->fw == NULL) {
    187		ret = wl1251_fetch_firmware(wl);
    188		if (ret < 0)
    189			goto out;
    190	}
    191
    192out:
    193	return ret;
    194}
    195
    196#define WL1251_IRQ_LOOP_COUNT 10
    197static void wl1251_irq_work(struct work_struct *work)
    198{
    199	u32 intr, ctr = WL1251_IRQ_LOOP_COUNT;
    200	struct wl1251 *wl =
    201		container_of(work, struct wl1251, irq_work);
    202	int ret;
    203
    204	mutex_lock(&wl->mutex);
    205
    206	wl1251_debug(DEBUG_IRQ, "IRQ work");
    207
    208	if (wl->state == WL1251_STATE_OFF)
    209		goto out;
    210
    211	ret = wl1251_ps_elp_wakeup(wl);
    212	if (ret < 0)
    213		goto out;
    214
    215	wl1251_reg_write32(wl, ACX_REG_INTERRUPT_MASK, WL1251_ACX_INTR_ALL);
    216
    217	intr = wl1251_reg_read32(wl, ACX_REG_INTERRUPT_CLEAR);
    218	wl1251_debug(DEBUG_IRQ, "intr: 0x%x", intr);
    219
    220	do {
    221		if (wl->data_path) {
    222			wl->rx_counter = wl1251_mem_read32(
    223				wl, wl->data_path->rx_control_addr);
    224
    225			/* We handle a frmware bug here */
    226			switch ((wl->rx_counter - wl->rx_handled) & 0xf) {
    227			case 0:
    228				wl1251_debug(DEBUG_IRQ,
    229					     "RX: FW and host in sync");
    230				intr &= ~WL1251_ACX_INTR_RX0_DATA;
    231				intr &= ~WL1251_ACX_INTR_RX1_DATA;
    232				break;
    233			case 1:
    234				wl1251_debug(DEBUG_IRQ, "RX: FW +1");
    235				intr |= WL1251_ACX_INTR_RX0_DATA;
    236				intr &= ~WL1251_ACX_INTR_RX1_DATA;
    237				break;
    238			case 2:
    239				wl1251_debug(DEBUG_IRQ, "RX: FW +2");
    240				intr |= WL1251_ACX_INTR_RX0_DATA;
    241				intr |= WL1251_ACX_INTR_RX1_DATA;
    242				break;
    243			default:
    244				wl1251_warning(
    245					"RX: FW and host out of sync: %d",
    246					wl->rx_counter - wl->rx_handled);
    247				break;
    248			}
    249
    250			wl->rx_handled = wl->rx_counter;
    251
    252			wl1251_debug(DEBUG_IRQ, "RX counter: %d",
    253				     wl->rx_counter);
    254		}
    255
    256		intr &= wl->intr_mask;
    257
    258		if (intr == 0) {
    259			wl1251_debug(DEBUG_IRQ, "INTR is 0");
    260			goto out_sleep;
    261		}
    262
    263		if (intr & WL1251_ACX_INTR_RX0_DATA) {
    264			wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_RX0_DATA");
    265			wl1251_rx(wl);
    266		}
    267
    268		if (intr & WL1251_ACX_INTR_RX1_DATA) {
    269			wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_RX1_DATA");
    270			wl1251_rx(wl);
    271		}
    272
    273		if (intr & WL1251_ACX_INTR_TX_RESULT) {
    274			wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_TX_RESULT");
    275			wl1251_tx_complete(wl);
    276		}
    277
    278		if (intr & WL1251_ACX_INTR_EVENT_A) {
    279			wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_EVENT_A");
    280			wl1251_event_handle(wl, 0);
    281		}
    282
    283		if (intr & WL1251_ACX_INTR_EVENT_B) {
    284			wl1251_debug(DEBUG_IRQ, "WL1251_ACX_INTR_EVENT_B");
    285			wl1251_event_handle(wl, 1);
    286		}
    287
    288		if (intr & WL1251_ACX_INTR_INIT_COMPLETE)
    289			wl1251_debug(DEBUG_IRQ,
    290				     "WL1251_ACX_INTR_INIT_COMPLETE");
    291
    292		if (--ctr == 0)
    293			break;
    294
    295		intr = wl1251_reg_read32(wl, ACX_REG_INTERRUPT_CLEAR);
    296	} while (intr);
    297
    298out_sleep:
    299	wl1251_reg_write32(wl, ACX_REG_INTERRUPT_MASK, ~(wl->intr_mask));
    300	wl1251_ps_elp_sleep(wl);
    301
    302out:
    303	mutex_unlock(&wl->mutex);
    304}
    305
    306static int wl1251_join(struct wl1251 *wl, u8 bss_type, u8 channel,
    307		       u16 beacon_interval, u8 dtim_period)
    308{
    309	int ret;
    310
    311	ret = wl1251_acx_frame_rates(wl, DEFAULT_HW_GEN_TX_RATE,
    312				     DEFAULT_HW_GEN_MODULATION_TYPE,
    313				     wl->tx_mgmt_frm_rate,
    314				     wl->tx_mgmt_frm_mod);
    315	if (ret < 0)
    316		goto out;
    317
    318	/*
    319	 * Join command applies filters, and if we are not associated,
    320	 * BSSID filter must be disabled for association to work.
    321	 */
    322	if (is_zero_ether_addr(wl->bssid))
    323		wl->rx_config &= ~CFG_BSSID_FILTER_EN;
    324
    325	ret = wl1251_cmd_join(wl, bss_type, channel, beacon_interval,
    326			      dtim_period);
    327	if (ret < 0)
    328		goto out;
    329
    330	ret = wl1251_event_wait(wl, JOIN_EVENT_COMPLETE_ID, 100);
    331	if (ret < 0)
    332		wl1251_warning("join timeout");
    333
    334out:
    335	return ret;
    336}
    337
    338static void wl1251_op_tx(struct ieee80211_hw *hw,
    339			 struct ieee80211_tx_control *control,
    340			 struct sk_buff *skb)
    341{
    342	struct wl1251 *wl = hw->priv;
    343	unsigned long flags;
    344
    345	skb_queue_tail(&wl->tx_queue, skb);
    346
    347	/*
    348	 * The chip specific setup must run before the first TX packet -
    349	 * before that, the tx_work will not be initialized!
    350	 */
    351
    352	ieee80211_queue_work(wl->hw, &wl->tx_work);
    353
    354	/*
    355	 * The workqueue is slow to process the tx_queue and we need stop
    356	 * the queue here, otherwise the queue will get too long.
    357	 */
    358	if (skb_queue_len(&wl->tx_queue) >= WL1251_TX_QUEUE_HIGH_WATERMARK) {
    359		wl1251_debug(DEBUG_TX, "op_tx: tx_queue full, stop queues");
    360
    361		spin_lock_irqsave(&wl->wl_lock, flags);
    362		ieee80211_stop_queues(wl->hw);
    363		wl->tx_queue_stopped = true;
    364		spin_unlock_irqrestore(&wl->wl_lock, flags);
    365	}
    366}
    367
    368static int wl1251_op_start(struct ieee80211_hw *hw)
    369{
    370	struct wl1251 *wl = hw->priv;
    371	struct wiphy *wiphy = hw->wiphy;
    372	int ret = 0;
    373
    374	wl1251_debug(DEBUG_MAC80211, "mac80211 start");
    375
    376	mutex_lock(&wl->mutex);
    377
    378	if (wl->state != WL1251_STATE_OFF) {
    379		wl1251_error("cannot start because not in off state: %d",
    380			     wl->state);
    381		ret = -EBUSY;
    382		goto out;
    383	}
    384
    385	ret = wl1251_chip_wakeup(wl);
    386	if (ret < 0)
    387		goto out;
    388
    389	ret = wl1251_boot(wl);
    390	if (ret < 0)
    391		goto out;
    392
    393	ret = wl1251_hw_init(wl);
    394	if (ret < 0)
    395		goto out;
    396
    397	ret = wl1251_acx_station_id(wl);
    398	if (ret < 0)
    399		goto out;
    400
    401	wl->state = WL1251_STATE_ON;
    402
    403	wl1251_info("firmware booted (%s)", wl->fw_ver);
    404
    405	/* update hw/fw version info in wiphy struct */
    406	wiphy->hw_version = wl->chip_id;
    407	strncpy(wiphy->fw_version, wl->fw_ver, sizeof(wiphy->fw_version));
    408
    409out:
    410	if (ret < 0)
    411		wl1251_power_off(wl);
    412
    413	mutex_unlock(&wl->mutex);
    414
    415	return ret;
    416}
    417
    418static void wl1251_op_stop(struct ieee80211_hw *hw)
    419{
    420	struct wl1251 *wl = hw->priv;
    421
    422	wl1251_info("down");
    423
    424	wl1251_debug(DEBUG_MAC80211, "mac80211 stop");
    425
    426	mutex_lock(&wl->mutex);
    427
    428	WARN_ON(wl->state != WL1251_STATE_ON);
    429
    430	if (wl->scanning) {
    431		struct cfg80211_scan_info info = {
    432			.aborted = true,
    433		};
    434
    435		ieee80211_scan_completed(wl->hw, &info);
    436		wl->scanning = false;
    437	}
    438
    439	wl->state = WL1251_STATE_OFF;
    440
    441	wl1251_disable_interrupts(wl);
    442
    443	mutex_unlock(&wl->mutex);
    444
    445	cancel_work_sync(&wl->irq_work);
    446	cancel_work_sync(&wl->tx_work);
    447	cancel_delayed_work_sync(&wl->elp_work);
    448
    449	mutex_lock(&wl->mutex);
    450
    451	/* let's notify MAC80211 about the remaining pending TX frames */
    452	wl1251_tx_flush(wl);
    453	wl1251_power_off(wl);
    454
    455	eth_zero_addr(wl->bssid);
    456	wl->listen_int = 1;
    457	wl->bss_type = MAX_BSS_TYPE;
    458
    459	wl->data_in_count = 0;
    460	wl->rx_counter = 0;
    461	wl->rx_handled = 0;
    462	wl->rx_current_buffer = 0;
    463	wl->rx_last_id = 0;
    464	wl->next_tx_complete = 0;
    465	wl->elp = false;
    466	wl->station_mode = STATION_ACTIVE_MODE;
    467	wl->psm_entry_retry = 0;
    468	wl->tx_queue_stopped = false;
    469	wl->power_level = WL1251_DEFAULT_POWER_LEVEL;
    470	wl->rssi_thold = 0;
    471	wl->channel = WL1251_DEFAULT_CHANNEL;
    472	wl->monitor_present = false;
    473	wl->joined = false;
    474
    475	wl1251_debugfs_reset(wl);
    476
    477	mutex_unlock(&wl->mutex);
    478}
    479
    480static int wl1251_op_add_interface(struct ieee80211_hw *hw,
    481				   struct ieee80211_vif *vif)
    482{
    483	struct wl1251 *wl = hw->priv;
    484	int ret = 0;
    485
    486	vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
    487			     IEEE80211_VIF_SUPPORTS_UAPSD |
    488			     IEEE80211_VIF_SUPPORTS_CQM_RSSI;
    489
    490	wl1251_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
    491		     vif->type, vif->addr);
    492
    493	mutex_lock(&wl->mutex);
    494	if (wl->vif) {
    495		ret = -EBUSY;
    496		goto out;
    497	}
    498
    499	wl->vif = vif;
    500
    501	switch (vif->type) {
    502	case NL80211_IFTYPE_STATION:
    503		wl->bss_type = BSS_TYPE_STA_BSS;
    504		break;
    505	case NL80211_IFTYPE_ADHOC:
    506		wl->bss_type = BSS_TYPE_IBSS;
    507		break;
    508	default:
    509		ret = -EOPNOTSUPP;
    510		goto out;
    511	}
    512
    513	if (!ether_addr_equal_unaligned(wl->mac_addr, vif->addr)) {
    514		memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
    515		SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
    516		ret = wl1251_acx_station_id(wl);
    517		if (ret < 0)
    518			goto out;
    519	}
    520
    521out:
    522	mutex_unlock(&wl->mutex);
    523	return ret;
    524}
    525
    526static void wl1251_op_remove_interface(struct ieee80211_hw *hw,
    527					 struct ieee80211_vif *vif)
    528{
    529	struct wl1251 *wl = hw->priv;
    530
    531	mutex_lock(&wl->mutex);
    532	wl1251_debug(DEBUG_MAC80211, "mac80211 remove interface");
    533	wl->vif = NULL;
    534	eth_zero_addr(wl->bssid);
    535	mutex_unlock(&wl->mutex);
    536}
    537
    538static int wl1251_build_null_data(struct wl1251 *wl)
    539{
    540	struct sk_buff *skb = NULL;
    541	int size;
    542	void *ptr;
    543	int ret = -ENOMEM;
    544
    545	if (wl->bss_type == BSS_TYPE_IBSS) {
    546		size = sizeof(struct wl12xx_null_data_template);
    547		ptr = NULL;
    548	} else {
    549		skb = ieee80211_nullfunc_get(wl->hw, wl->vif, false);
    550		if (!skb)
    551			goto out;
    552		size = skb->len;
    553		ptr = skb->data;
    554	}
    555
    556	ret = wl1251_cmd_template_set(wl, CMD_NULL_DATA, ptr, size);
    557
    558out:
    559	dev_kfree_skb(skb);
    560	if (ret)
    561		wl1251_warning("cmd build null data failed: %d", ret);
    562
    563	return ret;
    564}
    565
    566static int wl1251_build_qos_null_data(struct wl1251 *wl)
    567{
    568	struct ieee80211_qos_hdr template;
    569
    570	memset(&template, 0, sizeof(template));
    571
    572	memcpy(template.addr1, wl->bssid, ETH_ALEN);
    573	memcpy(template.addr2, wl->mac_addr, ETH_ALEN);
    574	memcpy(template.addr3, wl->bssid, ETH_ALEN);
    575
    576	template.frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
    577					     IEEE80211_STYPE_QOS_NULLFUNC |
    578					     IEEE80211_FCTL_TODS);
    579
    580	/* FIXME: not sure what priority to use here */
    581	template.qos_ctrl = cpu_to_le16(0);
    582
    583	return wl1251_cmd_template_set(wl, CMD_QOS_NULL_DATA, &template,
    584				       sizeof(template));
    585}
    586
    587static bool wl1251_can_do_pm(struct ieee80211_conf *conf, struct wl1251 *wl)
    588{
    589	return (conf->flags & IEEE80211_CONF_PS) && !wl->monitor_present;
    590}
    591
    592static int wl1251_op_config(struct ieee80211_hw *hw, u32 changed)
    593{
    594	struct wl1251 *wl = hw->priv;
    595	struct ieee80211_conf *conf = &hw->conf;
    596	int channel, ret = 0;
    597
    598	channel = ieee80211_frequency_to_channel(
    599			conf->chandef.chan->center_freq);
    600
    601	wl1251_debug(DEBUG_MAC80211,
    602		     "mac80211 config ch %d monitor %s psm %s power %d",
    603		     channel,
    604		     conf->flags & IEEE80211_CONF_MONITOR ? "on" : "off",
    605		     conf->flags & IEEE80211_CONF_PS ? "on" : "off",
    606		     conf->power_level);
    607
    608	mutex_lock(&wl->mutex);
    609
    610	ret = wl1251_ps_elp_wakeup(wl);
    611	if (ret < 0)
    612		goto out;
    613
    614	if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
    615		u32 mode;
    616
    617		if (conf->flags & IEEE80211_CONF_MONITOR) {
    618			wl->monitor_present = true;
    619			mode = DF_SNIFF_MODE_ENABLE | DF_ENCRYPTION_DISABLE;
    620		} else {
    621			wl->monitor_present = false;
    622			mode = 0;
    623		}
    624
    625		ret = wl1251_acx_feature_cfg(wl, mode);
    626		if (ret < 0)
    627			goto out_sleep;
    628	}
    629
    630	if (channel != wl->channel) {
    631		wl->channel = channel;
    632
    633		/*
    634		 * Use ENABLE_RX command for channel switching when no
    635		 * interface is present (monitor mode only).
    636		 * This leaves the tx path disabled in firmware, whereas
    637		 * the usual JOIN command seems to transmit some frames
    638		 * at firmware level.
    639		 */
    640		if (wl->vif == NULL) {
    641			wl->joined = false;
    642			ret = wl1251_cmd_data_path_rx(wl, wl->channel, 1);
    643		} else {
    644			ret = wl1251_join(wl, wl->bss_type, wl->channel,
    645					  wl->beacon_int, wl->dtim_period);
    646		}
    647		if (ret < 0)
    648			goto out_sleep;
    649	}
    650
    651	if (wl1251_can_do_pm(conf, wl) && !wl->psm_requested) {
    652		wl1251_debug(DEBUG_PSM, "psm enabled");
    653
    654		wl->psm_requested = true;
    655
    656		wl->dtim_period = conf->ps_dtim_period;
    657
    658		ret = wl1251_acx_wr_tbtt_and_dtim(wl, wl->beacon_int,
    659						  wl->dtim_period);
    660
    661		/*
    662		 * mac80211 enables PSM only if we're already associated.
    663		 */
    664		ret = wl1251_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
    665		if (ret < 0)
    666			goto out_sleep;
    667	} else if (!wl1251_can_do_pm(conf, wl) && wl->psm_requested) {
    668		wl1251_debug(DEBUG_PSM, "psm disabled");
    669
    670		wl->psm_requested = false;
    671
    672		if (wl->station_mode != STATION_ACTIVE_MODE) {
    673			ret = wl1251_ps_set_mode(wl, STATION_ACTIVE_MODE);
    674			if (ret < 0)
    675				goto out_sleep;
    676		}
    677	}
    678
    679	if (changed & IEEE80211_CONF_CHANGE_IDLE && !wl->scanning) {
    680		if (conf->flags & IEEE80211_CONF_IDLE) {
    681			ret = wl1251_ps_set_mode(wl, STATION_IDLE);
    682			if (ret < 0)
    683				goto out_sleep;
    684		} else {
    685			ret = wl1251_ps_set_mode(wl, STATION_ACTIVE_MODE);
    686			if (ret < 0)
    687				goto out_sleep;
    688			ret = wl1251_join(wl, wl->bss_type, wl->channel,
    689					  wl->beacon_int, wl->dtim_period);
    690			if (ret < 0)
    691				goto out_sleep;
    692		}
    693	}
    694
    695	if (conf->power_level != wl->power_level) {
    696		ret = wl1251_acx_tx_power(wl, conf->power_level);
    697		if (ret < 0)
    698			goto out_sleep;
    699
    700		wl->power_level = conf->power_level;
    701	}
    702
    703out_sleep:
    704	wl1251_ps_elp_sleep(wl);
    705
    706out:
    707	mutex_unlock(&wl->mutex);
    708
    709	return ret;
    710}
    711
    712struct wl1251_filter_params {
    713	bool enabled;
    714	int mc_list_length;
    715	u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
    716};
    717
    718static u64 wl1251_op_prepare_multicast(struct ieee80211_hw *hw,
    719				       struct netdev_hw_addr_list *mc_list)
    720{
    721	struct wl1251_filter_params *fp;
    722	struct netdev_hw_addr *ha;
    723	struct wl1251 *wl = hw->priv;
    724
    725	if (unlikely(wl->state == WL1251_STATE_OFF))
    726		return 0;
    727
    728	fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
    729	if (!fp) {
    730		wl1251_error("Out of memory setting filters.");
    731		return 0;
    732	}
    733
    734	/* update multicast filtering parameters */
    735	fp->mc_list_length = 0;
    736	if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
    737		fp->enabled = false;
    738	} else {
    739		fp->enabled = true;
    740		netdev_hw_addr_list_for_each(ha, mc_list) {
    741			memcpy(fp->mc_list[fp->mc_list_length],
    742					ha->addr, ETH_ALEN);
    743			fp->mc_list_length++;
    744		}
    745	}
    746
    747	return (u64)(unsigned long)fp;
    748}
    749
    750#define WL1251_SUPPORTED_FILTERS (FIF_ALLMULTI | \
    751				  FIF_FCSFAIL | \
    752				  FIF_BCN_PRBRESP_PROMISC | \
    753				  FIF_CONTROL | \
    754				  FIF_OTHER_BSS | \
    755				  FIF_PROBE_REQ)
    756
    757static void wl1251_op_configure_filter(struct ieee80211_hw *hw,
    758				       unsigned int changed,
    759				       unsigned int *total, u64 multicast)
    760{
    761	struct wl1251_filter_params *fp = (void *)(unsigned long)multicast;
    762	struct wl1251 *wl = hw->priv;
    763	int ret;
    764
    765	wl1251_debug(DEBUG_MAC80211, "mac80211 configure filter");
    766
    767	*total &= WL1251_SUPPORTED_FILTERS;
    768	changed &= WL1251_SUPPORTED_FILTERS;
    769
    770	if (changed == 0) {
    771		/* no filters which we support changed */
    772		kfree(fp);
    773		return;
    774	}
    775
    776	mutex_lock(&wl->mutex);
    777
    778	wl->rx_config = WL1251_DEFAULT_RX_CONFIG;
    779	wl->rx_filter = WL1251_DEFAULT_RX_FILTER;
    780
    781	if (*total & FIF_ALLMULTI)
    782		/*
    783		 * CFG_MC_FILTER_EN in rx_config needs to be 0 to receive
    784		 * all multicast frames
    785		 */
    786		wl->rx_config &= ~CFG_MC_FILTER_EN;
    787	if (*total & FIF_FCSFAIL)
    788		wl->rx_filter |= CFG_RX_FCS_ERROR;
    789	if (*total & FIF_BCN_PRBRESP_PROMISC) {
    790		wl->rx_config &= ~CFG_BSSID_FILTER_EN;
    791		wl->rx_config &= ~CFG_SSID_FILTER_EN;
    792	}
    793	if (*total & FIF_CONTROL)
    794		wl->rx_filter |= CFG_RX_CTL_EN;
    795	if (*total & FIF_OTHER_BSS || is_zero_ether_addr(wl->bssid))
    796		wl->rx_config &= ~CFG_BSSID_FILTER_EN;
    797	if (*total & FIF_PROBE_REQ)
    798		wl->rx_filter |= CFG_RX_PREQ_EN;
    799
    800	if (wl->state == WL1251_STATE_OFF)
    801		goto out;
    802
    803	ret = wl1251_ps_elp_wakeup(wl);
    804	if (ret < 0)
    805		goto out;
    806
    807	if (*total & FIF_ALLMULTI)
    808		ret = wl1251_acx_group_address_tbl(wl, false, NULL, 0);
    809	else if (fp)
    810		ret = wl1251_acx_group_address_tbl(wl, fp->enabled,
    811						   fp->mc_list,
    812						   fp->mc_list_length);
    813	if (ret < 0)
    814		goto out;
    815
    816	/* send filters to firmware */
    817	wl1251_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
    818
    819	wl1251_ps_elp_sleep(wl);
    820
    821out:
    822	mutex_unlock(&wl->mutex);
    823	kfree(fp);
    824}
    825
    826/* HW encryption */
    827static int wl1251_set_key_type(struct wl1251 *wl,
    828			       struct wl1251_cmd_set_keys *key,
    829			       enum set_key_cmd cmd,
    830			       struct ieee80211_key_conf *mac80211_key,
    831			       const u8 *addr)
    832{
    833	switch (mac80211_key->cipher) {
    834	case WLAN_CIPHER_SUITE_WEP40:
    835	case WLAN_CIPHER_SUITE_WEP104:
    836		if (is_broadcast_ether_addr(addr))
    837			key->key_type = KEY_WEP_DEFAULT;
    838		else
    839			key->key_type = KEY_WEP_ADDR;
    840
    841		mac80211_key->hw_key_idx = mac80211_key->keyidx;
    842		break;
    843	case WLAN_CIPHER_SUITE_TKIP:
    844		if (is_broadcast_ether_addr(addr))
    845			key->key_type = KEY_TKIP_MIC_GROUP;
    846		else
    847			key->key_type = KEY_TKIP_MIC_PAIRWISE;
    848
    849		mac80211_key->hw_key_idx = mac80211_key->keyidx;
    850		break;
    851	case WLAN_CIPHER_SUITE_CCMP:
    852		if (is_broadcast_ether_addr(addr))
    853			key->key_type = KEY_AES_GROUP;
    854		else
    855			key->key_type = KEY_AES_PAIRWISE;
    856		mac80211_key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
    857		break;
    858	default:
    859		wl1251_error("Unknown key cipher 0x%x", mac80211_key->cipher);
    860		return -EOPNOTSUPP;
    861	}
    862
    863	return 0;
    864}
    865
    866static int wl1251_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
    867			     struct ieee80211_vif *vif,
    868			     struct ieee80211_sta *sta,
    869			     struct ieee80211_key_conf *key)
    870{
    871	struct wl1251 *wl = hw->priv;
    872	struct wl1251_cmd_set_keys *wl_cmd;
    873	const u8 *addr;
    874	int ret;
    875
    876	static const u8 bcast_addr[ETH_ALEN] =
    877		{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
    878
    879	wl1251_debug(DEBUG_MAC80211, "mac80211 set key");
    880
    881	wl_cmd = kzalloc(sizeof(*wl_cmd), GFP_KERNEL);
    882	if (!wl_cmd) {
    883		ret = -ENOMEM;
    884		goto out;
    885	}
    886
    887	addr = sta ? sta->addr : bcast_addr;
    888
    889	wl1251_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
    890	wl1251_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
    891	wl1251_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
    892		     key->cipher, key->keyidx, key->keylen, key->flags);
    893	wl1251_dump(DEBUG_CRYPT, "KEY: ", key->key, key->keylen);
    894
    895	if (is_zero_ether_addr(addr)) {
    896		/* We dont support TX only encryption */
    897		ret = -EOPNOTSUPP;
    898		goto out;
    899	}
    900
    901	mutex_lock(&wl->mutex);
    902
    903	switch (cmd) {
    904	case SET_KEY:
    905		if (wl->monitor_present) {
    906			ret = -EOPNOTSUPP;
    907			goto out_unlock;
    908		}
    909		wl_cmd->key_action = KEY_ADD_OR_REPLACE;
    910		break;
    911	case DISABLE_KEY:
    912		wl_cmd->key_action = KEY_REMOVE;
    913		break;
    914	default:
    915		wl1251_error("Unsupported key cmd 0x%x", cmd);
    916		break;
    917	}
    918
    919	ret = wl1251_ps_elp_wakeup(wl);
    920	if (ret < 0)
    921		goto out_unlock;
    922
    923	ret = wl1251_set_key_type(wl, wl_cmd, cmd, key, addr);
    924	if (ret < 0) {
    925		wl1251_error("Set KEY type failed");
    926		goto out_sleep;
    927	}
    928
    929	if (wl_cmd->key_type != KEY_WEP_DEFAULT)
    930		memcpy(wl_cmd->addr, addr, ETH_ALEN);
    931
    932	if ((wl_cmd->key_type == KEY_TKIP_MIC_GROUP) ||
    933	    (wl_cmd->key_type == KEY_TKIP_MIC_PAIRWISE)) {
    934		/*
    935		 * We get the key in the following form:
    936		 * TKIP (16 bytes) - TX MIC (8 bytes) - RX MIC (8 bytes)
    937		 * but the target is expecting:
    938		 * TKIP - RX MIC - TX MIC
    939		 */
    940		memcpy(wl_cmd->key, key->key, 16);
    941		memcpy(wl_cmd->key + 16, key->key + 24, 8);
    942		memcpy(wl_cmd->key + 24, key->key + 16, 8);
    943
    944	} else {
    945		memcpy(wl_cmd->key, key->key, key->keylen);
    946	}
    947	wl_cmd->key_size = key->keylen;
    948
    949	wl_cmd->id = key->keyidx;
    950	wl_cmd->ssid_profile = 0;
    951
    952	wl1251_dump(DEBUG_CRYPT, "TARGET KEY: ", wl_cmd, sizeof(*wl_cmd));
    953
    954	ret = wl1251_cmd_send(wl, CMD_SET_KEYS, wl_cmd, sizeof(*wl_cmd));
    955	if (ret < 0) {
    956		wl1251_warning("could not set keys");
    957		goto out_sleep;
    958	}
    959
    960out_sleep:
    961	wl1251_ps_elp_sleep(wl);
    962
    963out_unlock:
    964	mutex_unlock(&wl->mutex);
    965
    966out:
    967	kfree(wl_cmd);
    968
    969	return ret;
    970}
    971
    972static int wl1251_op_hw_scan(struct ieee80211_hw *hw,
    973			     struct ieee80211_vif *vif,
    974			     struct ieee80211_scan_request *hw_req)
    975{
    976	struct cfg80211_scan_request *req = &hw_req->req;
    977	struct wl1251 *wl = hw->priv;
    978	struct sk_buff *skb;
    979	size_t ssid_len = 0;
    980	u8 *ssid = NULL;
    981	int ret;
    982
    983	wl1251_debug(DEBUG_MAC80211, "mac80211 hw scan");
    984
    985	if (req->n_ssids) {
    986		ssid = req->ssids[0].ssid;
    987		ssid_len = req->ssids[0].ssid_len;
    988	}
    989
    990	mutex_lock(&wl->mutex);
    991
    992	if (wl->scanning) {
    993		wl1251_debug(DEBUG_SCAN, "scan already in progress");
    994		ret = -EINVAL;
    995		goto out;
    996	}
    997
    998	ret = wl1251_ps_elp_wakeup(wl);
    999	if (ret < 0)
   1000		goto out;
   1001
   1002	if (hw->conf.flags & IEEE80211_CONF_IDLE) {
   1003		ret = wl1251_ps_set_mode(wl, STATION_ACTIVE_MODE);
   1004		if (ret < 0)
   1005			goto out_sleep;
   1006		ret = wl1251_join(wl, wl->bss_type, wl->channel,
   1007				  wl->beacon_int, wl->dtim_period);
   1008		if (ret < 0)
   1009			goto out_sleep;
   1010	}
   1011
   1012	skb = ieee80211_probereq_get(wl->hw, wl->vif->addr, ssid, ssid_len,
   1013				     req->ie_len);
   1014	if (!skb) {
   1015		ret = -ENOMEM;
   1016		goto out_idle;
   1017	}
   1018	if (req->ie_len)
   1019		skb_put_data(skb, req->ie, req->ie_len);
   1020
   1021	ret = wl1251_cmd_template_set(wl, CMD_PROBE_REQ, skb->data,
   1022				      skb->len);
   1023	dev_kfree_skb(skb);
   1024	if (ret < 0)
   1025		goto out_idle;
   1026
   1027	ret = wl1251_cmd_trigger_scan_to(wl, 0);
   1028	if (ret < 0)
   1029		goto out_idle;
   1030
   1031	wl->scanning = true;
   1032
   1033	ret = wl1251_cmd_scan(wl, ssid, ssid_len, req->channels,
   1034			      req->n_channels, WL1251_SCAN_NUM_PROBES);
   1035	if (ret < 0) {
   1036		wl1251_debug(DEBUG_SCAN, "scan failed %d", ret);
   1037		wl->scanning = false;
   1038		goto out_idle;
   1039	}
   1040	goto out_sleep;
   1041
   1042out_idle:
   1043	if (hw->conf.flags & IEEE80211_CONF_IDLE)
   1044		ret = wl1251_ps_set_mode(wl, STATION_IDLE);
   1045out_sleep:
   1046	wl1251_ps_elp_sleep(wl);
   1047
   1048out:
   1049	mutex_unlock(&wl->mutex);
   1050
   1051	return ret;
   1052}
   1053
   1054static int wl1251_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
   1055{
   1056	struct wl1251 *wl = hw->priv;
   1057	int ret;
   1058
   1059	mutex_lock(&wl->mutex);
   1060
   1061	ret = wl1251_ps_elp_wakeup(wl);
   1062	if (ret < 0)
   1063		goto out;
   1064
   1065	ret = wl1251_acx_rts_threshold(wl, (u16) value);
   1066	if (ret < 0)
   1067		wl1251_warning("wl1251_op_set_rts_threshold failed: %d", ret);
   1068
   1069	wl1251_ps_elp_sleep(wl);
   1070
   1071out:
   1072	mutex_unlock(&wl->mutex);
   1073
   1074	return ret;
   1075}
   1076
   1077static void wl1251_op_bss_info_changed(struct ieee80211_hw *hw,
   1078				       struct ieee80211_vif *vif,
   1079				       struct ieee80211_bss_conf *bss_conf,
   1080				       u32 changed)
   1081{
   1082	struct wl1251 *wl = hw->priv;
   1083	struct sk_buff *beacon, *skb;
   1084	bool enable;
   1085	int ret;
   1086
   1087	wl1251_debug(DEBUG_MAC80211, "mac80211 bss info changed");
   1088
   1089	mutex_lock(&wl->mutex);
   1090
   1091	ret = wl1251_ps_elp_wakeup(wl);
   1092	if (ret < 0)
   1093		goto out;
   1094
   1095	if (changed & BSS_CHANGED_CQM) {
   1096		ret = wl1251_acx_low_rssi(wl, bss_conf->cqm_rssi_thold,
   1097					  WL1251_DEFAULT_LOW_RSSI_WEIGHT,
   1098					  WL1251_DEFAULT_LOW_RSSI_DEPTH,
   1099					  WL1251_ACX_LOW_RSSI_TYPE_EDGE);
   1100		if (ret < 0)
   1101			goto out;
   1102		wl->rssi_thold = bss_conf->cqm_rssi_thold;
   1103	}
   1104
   1105	if ((changed & BSS_CHANGED_BSSID) &&
   1106	    memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
   1107		memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
   1108
   1109		if (!is_zero_ether_addr(wl->bssid)) {
   1110			ret = wl1251_build_null_data(wl);
   1111			if (ret < 0)
   1112				goto out_sleep;
   1113
   1114			ret = wl1251_build_qos_null_data(wl);
   1115			if (ret < 0)
   1116				goto out_sleep;
   1117
   1118			ret = wl1251_join(wl, wl->bss_type, wl->channel,
   1119					  wl->beacon_int, wl->dtim_period);
   1120			if (ret < 0)
   1121				goto out_sleep;
   1122		}
   1123	}
   1124
   1125	if (changed & BSS_CHANGED_ASSOC) {
   1126		if (bss_conf->assoc) {
   1127			wl->beacon_int = bss_conf->beacon_int;
   1128
   1129			skb = ieee80211_pspoll_get(wl->hw, wl->vif);
   1130			if (!skb)
   1131				goto out_sleep;
   1132
   1133			ret = wl1251_cmd_template_set(wl, CMD_PS_POLL,
   1134						      skb->data,
   1135						      skb->len);
   1136			dev_kfree_skb(skb);
   1137			if (ret < 0)
   1138				goto out_sleep;
   1139
   1140			ret = wl1251_acx_aid(wl, bss_conf->aid);
   1141			if (ret < 0)
   1142				goto out_sleep;
   1143		} else {
   1144			/* use defaults when not associated */
   1145			wl->beacon_int = WL1251_DEFAULT_BEACON_INT;
   1146			wl->dtim_period = WL1251_DEFAULT_DTIM_PERIOD;
   1147		}
   1148	}
   1149	if (changed & BSS_CHANGED_ERP_SLOT) {
   1150		if (bss_conf->use_short_slot)
   1151			ret = wl1251_acx_slot(wl, SLOT_TIME_SHORT);
   1152		else
   1153			ret = wl1251_acx_slot(wl, SLOT_TIME_LONG);
   1154		if (ret < 0) {
   1155			wl1251_warning("Set slot time failed %d", ret);
   1156			goto out_sleep;
   1157		}
   1158	}
   1159
   1160	if (changed & BSS_CHANGED_ERP_PREAMBLE) {
   1161		if (bss_conf->use_short_preamble)
   1162			wl1251_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
   1163		else
   1164			wl1251_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
   1165	}
   1166
   1167	if (changed & BSS_CHANGED_ERP_CTS_PROT) {
   1168		if (bss_conf->use_cts_prot)
   1169			ret = wl1251_acx_cts_protect(wl, CTSPROTECT_ENABLE);
   1170		else
   1171			ret = wl1251_acx_cts_protect(wl, CTSPROTECT_DISABLE);
   1172		if (ret < 0) {
   1173			wl1251_warning("Set ctsprotect failed %d", ret);
   1174			goto out_sleep;
   1175		}
   1176	}
   1177
   1178	if (changed & BSS_CHANGED_ARP_FILTER) {
   1179		__be32 addr = bss_conf->arp_addr_list[0];
   1180		WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
   1181
   1182		enable = bss_conf->arp_addr_cnt == 1 && bss_conf->assoc;
   1183		ret = wl1251_acx_arp_ip_filter(wl, enable, addr);
   1184		if (ret < 0)
   1185			goto out_sleep;
   1186	}
   1187
   1188	if (changed & BSS_CHANGED_BEACON) {
   1189		beacon = ieee80211_beacon_get(hw, vif);
   1190		if (!beacon)
   1191			goto out_sleep;
   1192
   1193		ret = wl1251_cmd_template_set(wl, CMD_BEACON, beacon->data,
   1194					      beacon->len);
   1195
   1196		if (ret < 0) {
   1197			dev_kfree_skb(beacon);
   1198			goto out_sleep;
   1199		}
   1200
   1201		ret = wl1251_cmd_template_set(wl, CMD_PROBE_RESP, beacon->data,
   1202					      beacon->len);
   1203
   1204		dev_kfree_skb(beacon);
   1205
   1206		if (ret < 0)
   1207			goto out_sleep;
   1208
   1209		ret = wl1251_join(wl, wl->bss_type, wl->channel,
   1210				  wl->beacon_int, wl->dtim_period);
   1211
   1212		if (ret < 0)
   1213			goto out_sleep;
   1214	}
   1215
   1216out_sleep:
   1217	wl1251_ps_elp_sleep(wl);
   1218
   1219out:
   1220	mutex_unlock(&wl->mutex);
   1221}
   1222
   1223
   1224/* can't be const, mac80211 writes to this */
   1225static struct ieee80211_rate wl1251_rates[] = {
   1226	{ .bitrate = 10,
   1227	  .hw_value = 0x1,
   1228	  .hw_value_short = 0x1, },
   1229	{ .bitrate = 20,
   1230	  .hw_value = 0x2,
   1231	  .hw_value_short = 0x2,
   1232	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
   1233	{ .bitrate = 55,
   1234	  .hw_value = 0x4,
   1235	  .hw_value_short = 0x4,
   1236	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
   1237	{ .bitrate = 110,
   1238	  .hw_value = 0x20,
   1239	  .hw_value_short = 0x20,
   1240	  .flags = IEEE80211_RATE_SHORT_PREAMBLE },
   1241	{ .bitrate = 60,
   1242	  .hw_value = 0x8,
   1243	  .hw_value_short = 0x8, },
   1244	{ .bitrate = 90,
   1245	  .hw_value = 0x10,
   1246	  .hw_value_short = 0x10, },
   1247	{ .bitrate = 120,
   1248	  .hw_value = 0x40,
   1249	  .hw_value_short = 0x40, },
   1250	{ .bitrate = 180,
   1251	  .hw_value = 0x80,
   1252	  .hw_value_short = 0x80, },
   1253	{ .bitrate = 240,
   1254	  .hw_value = 0x200,
   1255	  .hw_value_short = 0x200, },
   1256	{ .bitrate = 360,
   1257	 .hw_value = 0x400,
   1258	 .hw_value_short = 0x400, },
   1259	{ .bitrate = 480,
   1260	  .hw_value = 0x800,
   1261	  .hw_value_short = 0x800, },
   1262	{ .bitrate = 540,
   1263	  .hw_value = 0x1000,
   1264	  .hw_value_short = 0x1000, },
   1265};
   1266
   1267/* can't be const, mac80211 writes to this */
   1268static struct ieee80211_channel wl1251_channels[] = {
   1269	{ .hw_value = 1, .center_freq = 2412},
   1270	{ .hw_value = 2, .center_freq = 2417},
   1271	{ .hw_value = 3, .center_freq = 2422},
   1272	{ .hw_value = 4, .center_freq = 2427},
   1273	{ .hw_value = 5, .center_freq = 2432},
   1274	{ .hw_value = 6, .center_freq = 2437},
   1275	{ .hw_value = 7, .center_freq = 2442},
   1276	{ .hw_value = 8, .center_freq = 2447},
   1277	{ .hw_value = 9, .center_freq = 2452},
   1278	{ .hw_value = 10, .center_freq = 2457},
   1279	{ .hw_value = 11, .center_freq = 2462},
   1280	{ .hw_value = 12, .center_freq = 2467},
   1281	{ .hw_value = 13, .center_freq = 2472},
   1282};
   1283
   1284static int wl1251_op_conf_tx(struct ieee80211_hw *hw,
   1285			     struct ieee80211_vif *vif, u16 queue,
   1286			     const struct ieee80211_tx_queue_params *params)
   1287{
   1288	enum wl1251_acx_ps_scheme ps_scheme;
   1289	struct wl1251 *wl = hw->priv;
   1290	int ret;
   1291
   1292	mutex_lock(&wl->mutex);
   1293
   1294	wl1251_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
   1295
   1296	ret = wl1251_ps_elp_wakeup(wl);
   1297	if (ret < 0)
   1298		goto out;
   1299
   1300	/* mac80211 uses units of 32 usec */
   1301	ret = wl1251_acx_ac_cfg(wl, wl1251_tx_get_queue(queue),
   1302				params->cw_min, params->cw_max,
   1303				params->aifs, params->txop * 32);
   1304	if (ret < 0)
   1305		goto out_sleep;
   1306
   1307	if (params->uapsd)
   1308		ps_scheme = WL1251_ACX_PS_SCHEME_UPSD_TRIGGER;
   1309	else
   1310		ps_scheme = WL1251_ACX_PS_SCHEME_LEGACY;
   1311
   1312	ret = wl1251_acx_tid_cfg(wl, wl1251_tx_get_queue(queue),
   1313				 CHANNEL_TYPE_EDCF,
   1314				 wl1251_tx_get_queue(queue), ps_scheme,
   1315				 WL1251_ACX_ACK_POLICY_LEGACY);
   1316	if (ret < 0)
   1317		goto out_sleep;
   1318
   1319out_sleep:
   1320	wl1251_ps_elp_sleep(wl);
   1321
   1322out:
   1323	mutex_unlock(&wl->mutex);
   1324
   1325	return ret;
   1326}
   1327
   1328static int wl1251_op_get_survey(struct ieee80211_hw *hw, int idx,
   1329				struct survey_info *survey)
   1330{
   1331	struct wl1251 *wl = hw->priv;
   1332	struct ieee80211_conf *conf = &hw->conf;
   1333 
   1334	if (idx != 0)
   1335		return -ENOENT;
   1336 
   1337	survey->channel = conf->chandef.chan;
   1338	survey->filled = SURVEY_INFO_NOISE_DBM;
   1339	survey->noise = wl->noise;
   1340 
   1341	return 0;
   1342}
   1343
   1344/* can't be const, mac80211 writes to this */
   1345static struct ieee80211_supported_band wl1251_band_2ghz = {
   1346	.channels = wl1251_channels,
   1347	.n_channels = ARRAY_SIZE(wl1251_channels),
   1348	.bitrates = wl1251_rates,
   1349	.n_bitrates = ARRAY_SIZE(wl1251_rates),
   1350};
   1351
   1352static const struct ieee80211_ops wl1251_ops = {
   1353	.start = wl1251_op_start,
   1354	.stop = wl1251_op_stop,
   1355	.add_interface = wl1251_op_add_interface,
   1356	.remove_interface = wl1251_op_remove_interface,
   1357	.config = wl1251_op_config,
   1358	.prepare_multicast = wl1251_op_prepare_multicast,
   1359	.configure_filter = wl1251_op_configure_filter,
   1360	.tx = wl1251_op_tx,
   1361	.set_key = wl1251_op_set_key,
   1362	.hw_scan = wl1251_op_hw_scan,
   1363	.bss_info_changed = wl1251_op_bss_info_changed,
   1364	.set_rts_threshold = wl1251_op_set_rts_threshold,
   1365	.conf_tx = wl1251_op_conf_tx,
   1366	.get_survey = wl1251_op_get_survey,
   1367};
   1368
   1369static int wl1251_read_eeprom_byte(struct wl1251 *wl, off_t offset, u8 *data)
   1370{
   1371	unsigned long timeout;
   1372
   1373	wl1251_reg_write32(wl, EE_ADDR, offset);
   1374	wl1251_reg_write32(wl, EE_CTL, EE_CTL_READ);
   1375
   1376	/* EE_CTL_READ clears when data is ready */
   1377	timeout = jiffies + msecs_to_jiffies(100);
   1378	while (1) {
   1379		if (!(wl1251_reg_read32(wl, EE_CTL) & EE_CTL_READ))
   1380			break;
   1381
   1382		if (time_after(jiffies, timeout))
   1383			return -ETIMEDOUT;
   1384
   1385		msleep(1);
   1386	}
   1387
   1388	*data = wl1251_reg_read32(wl, EE_DATA);
   1389	return 0;
   1390}
   1391
   1392static int wl1251_read_eeprom(struct wl1251 *wl, off_t offset,
   1393			      u8 *data, size_t len)
   1394{
   1395	size_t i;
   1396	int ret;
   1397
   1398	wl1251_reg_write32(wl, EE_START, 0);
   1399
   1400	for (i = 0; i < len; i++) {
   1401		ret = wl1251_read_eeprom_byte(wl, offset + i, &data[i]);
   1402		if (ret < 0)
   1403			return ret;
   1404	}
   1405
   1406	return 0;
   1407}
   1408
   1409static int wl1251_read_eeprom_mac(struct wl1251 *wl)
   1410{
   1411	u8 mac[ETH_ALEN];
   1412	int i, ret;
   1413
   1414	wl1251_set_partition(wl, 0, 0, REGISTERS_BASE, REGISTERS_DOWN_SIZE);
   1415
   1416	ret = wl1251_read_eeprom(wl, 0x1c, mac, sizeof(mac));
   1417	if (ret < 0) {
   1418		wl1251_warning("failed to read MAC address from EEPROM");
   1419		return ret;
   1420	}
   1421
   1422	/* MAC is stored in reverse order */
   1423	for (i = 0; i < ETH_ALEN; i++)
   1424		wl->mac_addr[i] = mac[ETH_ALEN - i - 1];
   1425
   1426	return 0;
   1427}
   1428
   1429#define NVS_OFF_MAC_LEN 0x19
   1430#define NVS_OFF_MAC_ADDR_LO 0x1a
   1431#define NVS_OFF_MAC_ADDR_HI 0x1b
   1432#define NVS_OFF_MAC_DATA 0x1c
   1433
   1434static int wl1251_check_nvs_mac(struct wl1251 *wl)
   1435{
   1436	if (wl->nvs_len < 0x24)
   1437		return -ENODATA;
   1438
   1439	/* length is 2 and data address is 0x546c (ANDed with 0xfffe) */
   1440	if (wl->nvs[NVS_OFF_MAC_LEN] != 2 ||
   1441	    wl->nvs[NVS_OFF_MAC_ADDR_LO] != 0x6d ||
   1442	    wl->nvs[NVS_OFF_MAC_ADDR_HI] != 0x54)
   1443		return -EINVAL;
   1444
   1445	return 0;
   1446}
   1447
   1448static int wl1251_read_nvs_mac(struct wl1251 *wl)
   1449{
   1450	u8 mac[ETH_ALEN];
   1451	int i, ret;
   1452
   1453	ret = wl1251_check_nvs_mac(wl);
   1454	if (ret)
   1455		return ret;
   1456
   1457	/* MAC is stored in reverse order */
   1458	for (i = 0; i < ETH_ALEN; i++)
   1459		mac[i] = wl->nvs[NVS_OFF_MAC_DATA + ETH_ALEN - i - 1];
   1460
   1461	/* 00:00:20:07:03:09 is in example file wl1251-nvs.bin, so invalid */
   1462	if (ether_addr_equal_unaligned(mac, "\x00\x00\x20\x07\x03\x09"))
   1463		return -EINVAL;
   1464
   1465	memcpy(wl->mac_addr, mac, ETH_ALEN);
   1466	return 0;
   1467}
   1468
   1469static int wl1251_write_nvs_mac(struct wl1251 *wl)
   1470{
   1471	int i, ret;
   1472
   1473	ret = wl1251_check_nvs_mac(wl);
   1474	if (ret)
   1475		return ret;
   1476
   1477	/* MAC is stored in reverse order */
   1478	for (i = 0; i < ETH_ALEN; i++)
   1479		wl->nvs[NVS_OFF_MAC_DATA + i] = wl->mac_addr[ETH_ALEN - i - 1];
   1480
   1481	return 0;
   1482}
   1483
   1484static int wl1251_register_hw(struct wl1251 *wl)
   1485{
   1486	int ret;
   1487
   1488	if (wl->mac80211_registered)
   1489		return 0;
   1490
   1491	SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
   1492
   1493	ret = ieee80211_register_hw(wl->hw);
   1494	if (ret < 0) {
   1495		wl1251_error("unable to register mac80211 hw: %d", ret);
   1496		return ret;
   1497	}
   1498
   1499	wl->mac80211_registered = true;
   1500
   1501	wl1251_notice("loaded");
   1502
   1503	return 0;
   1504}
   1505
   1506int wl1251_init_ieee80211(struct wl1251 *wl)
   1507{
   1508	int ret;
   1509
   1510	/* The tx descriptor buffer and the TKIP space */
   1511	wl->hw->extra_tx_headroom = sizeof(struct tx_double_buffer_desc)
   1512		+ WL1251_TKIP_IV_SPACE;
   1513
   1514	/* unit us */
   1515	/* FIXME: find a proper value */
   1516
   1517	ieee80211_hw_set(wl->hw, SIGNAL_DBM);
   1518	ieee80211_hw_set(wl->hw, SUPPORTS_PS);
   1519
   1520	wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
   1521					 BIT(NL80211_IFTYPE_ADHOC);
   1522	wl->hw->wiphy->max_scan_ssids = 1;
   1523
   1524	/* We set max_scan_ie_len to a random value to make wpa_supplicant scans not
   1525	 * fail, as the driver will the ignore the extra passed IEs anyway
   1526	 */
   1527	wl->hw->wiphy->max_scan_ie_len = 512;
   1528
   1529	wl->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wl1251_band_2ghz;
   1530
   1531	wl->hw->queues = 4;
   1532
   1533	if (wl->nvs == NULL && !wl->use_eeprom) {
   1534		ret = wl1251_fetch_nvs(wl);
   1535		if (ret < 0)
   1536			goto out;
   1537	}
   1538
   1539	if (wl->use_eeprom)
   1540		ret = wl1251_read_eeprom_mac(wl);
   1541	else
   1542		ret = wl1251_read_nvs_mac(wl);
   1543
   1544	if (ret == 0 && !is_valid_ether_addr(wl->mac_addr))
   1545		ret = -EINVAL;
   1546
   1547	if (ret < 0) {
   1548		/*
   1549		 * In case our MAC address is not correctly set,
   1550		 * we use a random but Nokia MAC.
   1551		 */
   1552		static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
   1553		memcpy(wl->mac_addr, nokia_oui, 3);
   1554		get_random_bytes(wl->mac_addr + 3, 3);
   1555		if (!wl->use_eeprom)
   1556			wl1251_write_nvs_mac(wl);
   1557		wl1251_warning("MAC address in eeprom or nvs data is not valid");
   1558		wl1251_warning("Setting random MAC address: %pM", wl->mac_addr);
   1559	}
   1560
   1561	ret = wl1251_register_hw(wl);
   1562	if (ret)
   1563		goto out;
   1564
   1565	wl1251_debugfs_init(wl);
   1566	wl1251_notice("initialized");
   1567
   1568	ret = 0;
   1569
   1570out:
   1571	return ret;
   1572}
   1573EXPORT_SYMBOL_GPL(wl1251_init_ieee80211);
   1574
   1575struct ieee80211_hw *wl1251_alloc_hw(void)
   1576{
   1577	struct ieee80211_hw *hw;
   1578	struct wl1251 *wl;
   1579	int i;
   1580
   1581	hw = ieee80211_alloc_hw(sizeof(*wl), &wl1251_ops);
   1582	if (!hw) {
   1583		wl1251_error("could not alloc ieee80211_hw");
   1584		return ERR_PTR(-ENOMEM);
   1585	}
   1586
   1587	wl = hw->priv;
   1588	memset(wl, 0, sizeof(*wl));
   1589
   1590	wl->hw = hw;
   1591
   1592	wl->data_in_count = 0;
   1593
   1594	skb_queue_head_init(&wl->tx_queue);
   1595
   1596	INIT_DELAYED_WORK(&wl->elp_work, wl1251_elp_work);
   1597	wl->channel = WL1251_DEFAULT_CHANNEL;
   1598	wl->monitor_present = false;
   1599	wl->joined = false;
   1600	wl->scanning = false;
   1601	wl->bss_type = MAX_BSS_TYPE;
   1602	wl->default_key = 0;
   1603	wl->listen_int = 1;
   1604	wl->rx_counter = 0;
   1605	wl->rx_handled = 0;
   1606	wl->rx_current_buffer = 0;
   1607	wl->rx_last_id = 0;
   1608	wl->rx_config = WL1251_DEFAULT_RX_CONFIG;
   1609	wl->rx_filter = WL1251_DEFAULT_RX_FILTER;
   1610	wl->elp = false;
   1611	wl->station_mode = STATION_ACTIVE_MODE;
   1612	wl->psm_requested = false;
   1613	wl->psm_entry_retry = 0;
   1614	wl->tx_queue_stopped = false;
   1615	wl->power_level = WL1251_DEFAULT_POWER_LEVEL;
   1616	wl->rssi_thold = 0;
   1617	wl->beacon_int = WL1251_DEFAULT_BEACON_INT;
   1618	wl->dtim_period = WL1251_DEFAULT_DTIM_PERIOD;
   1619	wl->vif = NULL;
   1620
   1621	for (i = 0; i < FW_TX_CMPLT_BLOCK_SIZE; i++)
   1622		wl->tx_frames[i] = NULL;
   1623
   1624	wl->next_tx_complete = 0;
   1625
   1626	INIT_WORK(&wl->irq_work, wl1251_irq_work);
   1627	INIT_WORK(&wl->tx_work, wl1251_tx_work);
   1628
   1629	wl->state = WL1251_STATE_OFF;
   1630	mutex_init(&wl->mutex);
   1631	spin_lock_init(&wl->wl_lock);
   1632
   1633	wl->tx_mgmt_frm_rate = DEFAULT_HW_GEN_TX_RATE;
   1634	wl->tx_mgmt_frm_mod = DEFAULT_HW_GEN_MODULATION_TYPE;
   1635
   1636	wl->rx_descriptor = kmalloc(sizeof(*wl->rx_descriptor), GFP_KERNEL);
   1637	if (!wl->rx_descriptor) {
   1638		wl1251_error("could not allocate memory for rx descriptor");
   1639		ieee80211_free_hw(hw);
   1640		return ERR_PTR(-ENOMEM);
   1641	}
   1642
   1643	return hw;
   1644}
   1645EXPORT_SYMBOL_GPL(wl1251_alloc_hw);
   1646
   1647int wl1251_free_hw(struct wl1251 *wl)
   1648{
   1649	ieee80211_unregister_hw(wl->hw);
   1650
   1651	wl1251_debugfs_exit(wl);
   1652
   1653	kfree(wl->target_mem_map);
   1654	kfree(wl->data_path);
   1655	vfree(wl->fw);
   1656	wl->fw = NULL;
   1657	kfree(wl->nvs);
   1658	wl->nvs = NULL;
   1659
   1660	kfree(wl->rx_descriptor);
   1661	wl->rx_descriptor = NULL;
   1662
   1663	ieee80211_free_hw(wl->hw);
   1664
   1665	return 0;
   1666}
   1667EXPORT_SYMBOL_GPL(wl1251_free_hw);
   1668
   1669MODULE_DESCRIPTION("TI wl1251 Wireless LAN Driver Core");
   1670MODULE_LICENSE("GPL");
   1671MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
   1672MODULE_FIRMWARE(WL1251_FW_NAME);
   1673MODULE_FIRMWARE(WL1251_NVS_NAME);