2 * This file is part of wl1271
4 * Copyright (C) 2008-2010 Nokia Corporation
6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 #include <linux/module.h>
25 #include <linux/firmware.h>
26 #include <linux/delay.h>
27 #include <linux/spi/spi.h>
28 #include <linux/crc32.h>
29 #include <linux/etherdevice.h>
30 #include <linux/vmalloc.h>
31 #include <linux/inetdevice.h>
32 #include <linux/platform_device.h>
35 #include "wl12xx_80211.h"
36 #include "wl1271_reg.h"
37 #include "wl1271_io.h"
38 #include "wl1271_event.h"
39 #include "wl1271_tx.h"
40 #include "wl1271_rx.h"
41 #include "wl1271_ps.h"
42 #include "wl1271_init.h"
43 #include "wl1271_debugfs.h"
44 #include "wl1271_cmd.h"
45 #include "wl1271_boot.h"
46 #include "wl1271_testmode.h"
48 #define WL1271_BOOT_RETRIES 3
50 static struct conf_drv_settings default_conf = {
53 [CONF_SG_BT_PER_THRESHOLD] = 7500,
54 [CONF_SG_HV3_MAX_OVERRIDE] = 0,
55 [CONF_SG_BT_NFS_SAMPLE_INTERVAL] = 400,
56 [CONF_SG_BT_LOAD_RATIO] = 50,
57 [CONF_SG_AUTO_PS_MODE] = 0,
58 [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
59 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
60 [CONF_SG_ANTENNA_CONFIGURATION] = 0,
61 [CONF_SG_BEACON_MISS_PERCENT] = 60,
62 [CONF_SG_RATE_ADAPT_THRESH] = 12,
63 [CONF_SG_RATE_ADAPT_SNR] = 0,
64 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR] = 10,
65 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR] = 30,
66 [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR] = 8,
67 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR] = 20,
68 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR] = 50,
69 /* Note: with UPSD, this should be 4 */
70 [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR] = 8,
71 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR] = 7,
72 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR] = 25,
73 [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR] = 20,
74 /* Note: with UPDS, this should be 15 */
75 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR] = 8,
76 /* Note: with UPDS, this should be 50 */
77 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR] = 40,
78 /* Note: with UPDS, this should be 10 */
79 [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR] = 20,
82 [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
83 [CONF_SG_PS_POLL_TIMEOUT] = 10,
84 [CONF_SG_UPSD_TIMEOUT] = 10,
85 [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR] = 7,
86 [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR] = 15,
87 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR] = 15,
88 [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR] = 8,
89 [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR] = 20,
90 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR] = 15,
91 [CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR] = 20,
92 [CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR] = 50,
93 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR] = 10,
94 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
95 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP] = 800,
96 [CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME] = 75,
97 [CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME] = 15,
98 [CONF_SG_HV3_MAX_SERVED] = 6,
99 [CONF_SG_DHCP_TIME] = 5000,
100 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
102 .state = CONF_SG_PROTECTIVE,
105 .rx_msdu_life_time = 512000,
106 .packet_detection_threshold = 0,
107 .ps_poll_timeout = 15,
109 .rts_threshold = 2347,
110 .rx_cca_threshold = 0,
111 .irq_blk_threshold = 0xFFFF,
112 .irq_pkt_threshold = 0,
114 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
117 .tx_energy_detection = 0,
119 .enabled_rates = CONF_HW_BIT_RATE_1MBPS |
120 CONF_HW_BIT_RATE_2MBPS,
121 .short_retry_limit = 10,
122 .long_retry_limit = 10,
145 .aifsn = CONF_TX_AIFS_PIFS,
152 .aifsn = CONF_TX_AIFS_PIFS,
160 .channel_type = CONF_CHANNEL_TYPE_DCF,
161 .tsid = CONF_TX_AC_BE,
162 .ps_scheme = CONF_PS_SCHEME_LEGACY,
163 .ack_policy = CONF_ACK_POLICY_LEGACY,
168 .channel_type = CONF_CHANNEL_TYPE_DCF,
169 .tsid = CONF_TX_AC_BE,
170 .ps_scheme = CONF_PS_SCHEME_LEGACY,
171 .ack_policy = CONF_ACK_POLICY_LEGACY,
176 .channel_type = CONF_CHANNEL_TYPE_DCF,
177 .tsid = CONF_TX_AC_BE,
178 .ps_scheme = CONF_PS_SCHEME_LEGACY,
179 .ack_policy = CONF_ACK_POLICY_LEGACY,
184 .channel_type = CONF_CHANNEL_TYPE_DCF,
185 .tsid = CONF_TX_AC_BE,
186 .ps_scheme = CONF_PS_SCHEME_LEGACY,
187 .ack_policy = CONF_ACK_POLICY_LEGACY,
192 .channel_type = CONF_CHANNEL_TYPE_DCF,
193 .tsid = CONF_TX_AC_BE,
194 .ps_scheme = CONF_PS_SCHEME_LEGACY,
195 .ack_policy = CONF_ACK_POLICY_LEGACY,
200 .channel_type = CONF_CHANNEL_TYPE_DCF,
201 .tsid = CONF_TX_AC_BE,
202 .ps_scheme = CONF_PS_SCHEME_LEGACY,
203 .ack_policy = CONF_ACK_POLICY_LEGACY,
208 .channel_type = CONF_CHANNEL_TYPE_DCF,
209 .tsid = CONF_TX_AC_BE,
210 .ps_scheme = CONF_PS_SCHEME_LEGACY,
211 .ack_policy = CONF_ACK_POLICY_LEGACY,
215 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
216 .tx_compl_timeout = 700,
217 .tx_compl_threshold = 4
220 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
221 .listen_interval = 0,
222 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
223 .bcn_filt_ie_count = 1,
226 .ie = WLAN_EID_CHANNEL_SWITCH,
227 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
230 .synch_fail_thold = 10,
231 .bss_lose_timeout = 100,
232 .beacon_rx_timeout = 10000,
233 .broadcast_timeout = 20000,
234 .rx_broadcast_in_ps = 1,
235 .ps_poll_threshold = 20,
236 .sig_trigger_count = 2,
241 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
242 .type = CONF_TRIG_EVENT_TYPE_EDGE,
243 .direction = CONF_TRIG_EVENT_DIR_LOW,
251 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
252 .type = CONF_TRIG_EVENT_TYPE_EDGE,
253 .direction = CONF_TRIG_EVENT_DIR_HIGH,
260 .rssi_bcn_avg_weight = 10,
261 .rssi_pkt_avg_weight = 10,
262 .snr_bcn_avg_weight = 10,
263 .snr_pkt_avg_weight = 10
265 .bet_enable = CONF_BET_MODE_ENABLE,
266 .bet_max_consecutive = 10,
267 .psm_entry_retries = 3
279 .host_clk_settling_time = 5000,
280 .host_fast_wakeup_support = false
284 static void wl1271_device_release(struct device *dev)
289 static struct platform_device wl1271_device = {
293 /* device model insists to have a release function */
295 .release = wl1271_device_release,
299 static LIST_HEAD(wl_list);
301 static void wl1271_conf_init(struct wl1271 *wl)
305 * This function applies the default configuration to the driver. This
306 * function is invoked upon driver load (spi probe.)
308 * The configuration is stored in a run-time structure in order to
309 * facilitate for run-time adjustment of any of the parameters. Making
310 * changes to the configuration structure will apply the new values on
311 * the next interface up (wl1271_op_start.)
314 /* apply driver default configuration */
315 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
319 static int wl1271_plt_init(struct wl1271 *wl)
321 struct conf_tx_ac_category *conf_ac;
322 struct conf_tx_tid *conf_tid;
325 ret = wl1271_cmd_general_parms(wl);
329 ret = wl1271_cmd_radio_parms(wl);
333 ret = wl1271_init_templates_config(wl);
337 ret = wl1271_acx_init_mem_config(wl);
341 /* PHY layer config */
342 ret = wl1271_init_phy_config(wl);
344 goto out_free_memmap;
346 ret = wl1271_acx_dco_itrim_params(wl);
348 goto out_free_memmap;
350 /* Initialize connection monitoring thresholds */
351 ret = wl1271_acx_conn_monit_params(wl);
353 goto out_free_memmap;
355 /* Bluetooth WLAN coexistence */
356 ret = wl1271_init_pta(wl);
358 goto out_free_memmap;
360 /* Energy detection */
361 ret = wl1271_init_energy_detection(wl);
363 goto out_free_memmap;
365 /* Default fragmentation threshold */
366 ret = wl1271_acx_frag_threshold(wl);
368 goto out_free_memmap;
370 /* Default TID configuration */
371 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
372 conf_tid = &wl->conf.tx.tid_conf[i];
373 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
374 conf_tid->channel_type,
377 conf_tid->ack_policy,
378 conf_tid->apsd_conf[0],
379 conf_tid->apsd_conf[1]);
381 goto out_free_memmap;
384 /* Default AC configuration */
385 for (i = 0; i < wl->conf.tx.ac_conf_count; i++) {
386 conf_ac = &wl->conf.tx.ac_conf[i];
387 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
388 conf_ac->cw_max, conf_ac->aifsn,
389 conf_ac->tx_op_limit);
391 goto out_free_memmap;
394 /* Enable data path */
395 ret = wl1271_cmd_data_path(wl, 1);
397 goto out_free_memmap;
399 /* Configure for CAM power saving (ie. always active) */
400 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
402 goto out_free_memmap;
405 ret = wl1271_acx_pm_config(wl);
407 goto out_free_memmap;
412 kfree(wl->target_mem_map);
413 wl->target_mem_map = NULL;
418 static void wl1271_fw_status(struct wl1271 *wl,
419 struct wl1271_fw_status *status)
425 wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
427 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
428 "drv_rx_counter = %d, tx_results_counter = %d)",
430 status->fw_rx_counter,
431 status->drv_rx_counter,
432 status->tx_results_counter);
434 /* update number of available TX blocks */
435 for (i = 0; i < NUM_TX_QUEUES; i++) {
436 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
437 wl->tx_blocks_freed[i];
439 wl->tx_blocks_freed[i] =
440 le32_to_cpu(status->tx_released_blks[i]);
441 wl->tx_blocks_available += cnt;
445 /* if more blocks are available now, schedule some tx work */
446 if (total && !skb_queue_empty(&wl->tx_queue))
447 ieee80211_queue_work(wl->hw, &wl->tx_work);
449 /* update the host-chipset time offset */
451 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
452 (s64)le32_to_cpu(status->fw_localtime);
455 #define WL1271_IRQ_MAX_LOOPS 10
457 static void wl1271_irq_work(struct work_struct *work)
461 int loopcount = WL1271_IRQ_MAX_LOOPS;
464 container_of(work, struct wl1271, irq_work);
466 mutex_lock(&wl->mutex);
468 wl1271_debug(DEBUG_IRQ, "IRQ work");
470 if (unlikely(wl->state == WL1271_STATE_OFF))
473 ret = wl1271_ps_elp_wakeup(wl, true);
477 spin_lock_irqsave(&wl->wl_lock, flags);
478 while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
479 clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
480 spin_unlock_irqrestore(&wl->wl_lock, flags);
483 wl1271_fw_status(wl, wl->fw_status);
484 intr = le32_to_cpu(wl->fw_status->intr);
486 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
490 intr &= WL1271_INTR_MASK;
492 if (intr & WL1271_ACX_INTR_DATA) {
493 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
495 /* check for tx results */
496 if (wl->fw_status->tx_results_counter !=
497 (wl->tx_results_count & 0xff))
498 wl1271_tx_complete(wl);
500 wl1271_rx(wl, wl->fw_status);
503 if (intr & WL1271_ACX_INTR_EVENT_A) {
504 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
505 wl1271_event_handle(wl, 0);
508 if (intr & WL1271_ACX_INTR_EVENT_B) {
509 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
510 wl1271_event_handle(wl, 1);
513 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
514 wl1271_debug(DEBUG_IRQ,
515 "WL1271_ACX_INTR_INIT_COMPLETE");
517 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
518 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
520 spin_lock_irqsave(&wl->wl_lock, flags);
523 if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
524 ieee80211_queue_work(wl->hw, &wl->irq_work);
526 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
527 spin_unlock_irqrestore(&wl->wl_lock, flags);
529 wl1271_ps_elp_sleep(wl);
532 mutex_unlock(&wl->mutex);
535 static int wl1271_fetch_firmware(struct wl1271 *wl)
537 const struct firmware *fw;
540 ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
543 wl1271_error("could not get firmware: %d", ret);
548 wl1271_error("firmware size is not multiple of 32 bits: %zu",
554 wl->fw_len = fw->size;
555 wl->fw = vmalloc(wl->fw_len);
558 wl1271_error("could not allocate memory for the firmware");
563 memcpy(wl->fw, fw->data, wl->fw_len);
568 release_firmware(fw);
573 static int wl1271_update_mac_addr(struct wl1271 *wl)
576 u8 *nvs_ptr = (u8 *)wl->nvs->nvs;
578 /* get mac address from the NVS */
579 wl->mac_addr[0] = nvs_ptr[11];
580 wl->mac_addr[1] = nvs_ptr[10];
581 wl->mac_addr[2] = nvs_ptr[6];
582 wl->mac_addr[3] = nvs_ptr[5];
583 wl->mac_addr[4] = nvs_ptr[4];
584 wl->mac_addr[5] = nvs_ptr[3];
586 /* FIXME: if it is a zero-address, we should bail out. Now, instead,
587 we randomize an address */
588 if (is_zero_ether_addr(wl->mac_addr)) {
589 static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
590 memcpy(wl->mac_addr, nokia_oui, 3);
591 get_random_bytes(wl->mac_addr + 3, 3);
593 /* update this address to the NVS */
594 nvs_ptr[11] = wl->mac_addr[0];
595 nvs_ptr[10] = wl->mac_addr[1];
596 nvs_ptr[6] = wl->mac_addr[2];
597 nvs_ptr[5] = wl->mac_addr[3];
598 nvs_ptr[4] = wl->mac_addr[4];
599 nvs_ptr[3] = wl->mac_addr[5];
602 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
607 static int wl1271_fetch_nvs(struct wl1271 *wl)
609 const struct firmware *fw;
612 ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
615 wl1271_error("could not get nvs file: %d", ret);
619 if (fw->size != sizeof(struct wl1271_nvs_file)) {
620 wl1271_error("nvs size is not as expected: %zu != %zu",
621 fw->size, sizeof(struct wl1271_nvs_file));
626 wl->nvs = kmalloc(sizeof(struct wl1271_nvs_file), GFP_KERNEL);
629 wl1271_error("could not allocate memory for the nvs file");
634 memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file));
636 ret = wl1271_update_mac_addr(wl);
639 release_firmware(fw);
644 static void wl1271_fw_wakeup(struct wl1271 *wl)
648 elp_reg = ELPCTRL_WAKE_UP;
649 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
652 static int wl1271_setup(struct wl1271 *wl)
654 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
658 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
659 if (!wl->tx_res_if) {
660 kfree(wl->fw_status);
664 INIT_WORK(&wl->irq_work, wl1271_irq_work);
665 INIT_WORK(&wl->tx_work, wl1271_tx_work);
669 static int wl1271_chip_wakeup(struct wl1271 *wl)
671 struct wl1271_partition_set partition;
674 msleep(WL1271_PRE_POWER_ON_SLEEP);
676 msleep(WL1271_POWER_ON_SLEEP);
680 /* We don't need a real memory partition here, because we only want
681 * to use the registers at this point. */
682 memset(&partition, 0, sizeof(partition));
683 partition.reg.start = REGISTERS_BASE;
684 partition.reg.size = REGISTERS_DOWN_SIZE;
685 wl1271_set_partition(wl, &partition);
687 /* ELP module wake up */
688 wl1271_fw_wakeup(wl);
690 /* whal_FwCtrl_BootSm() */
692 /* 0. read chip id from CHIP_ID */
693 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
695 /* 1. check if chip id is valid */
697 switch (wl->chip.id) {
698 case CHIP_ID_1271_PG10:
699 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
702 ret = wl1271_setup(wl);
706 case CHIP_ID_1271_PG20:
707 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
710 ret = wl1271_setup(wl);
715 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
720 if (wl->fw == NULL) {
721 ret = wl1271_fetch_firmware(wl);
726 /* No NVS from netlink, try to get it from the filesystem */
727 if (wl->nvs == NULL) {
728 ret = wl1271_fetch_nvs(wl);
737 int wl1271_plt_start(struct wl1271 *wl)
739 int retries = WL1271_BOOT_RETRIES;
742 mutex_lock(&wl->mutex);
744 wl1271_notice("power up");
746 if (wl->state != WL1271_STATE_OFF) {
747 wl1271_error("cannot go into PLT state because not "
748 "in off state: %d", wl->state);
755 ret = wl1271_chip_wakeup(wl);
759 ret = wl1271_boot(wl);
763 ret = wl1271_plt_init(wl);
767 wl->state = WL1271_STATE_PLT;
768 wl1271_notice("firmware booted in PLT mode (%s)",
773 wl1271_disable_interrupts(wl);
774 mutex_unlock(&wl->mutex);
775 /* Unlocking the mutex in the middle of handling is
776 inherently unsafe. In this case we deem it safe to do,
777 because we need to let any possibly pending IRQ out of
778 the system (and while we are WL1271_STATE_OFF the IRQ
779 work function will not do anything.) Also, any other
780 possible concurrent operations will fail due to the
781 current state, hence the wl1271 struct should be safe. */
782 cancel_work_sync(&wl->irq_work);
783 mutex_lock(&wl->mutex);
785 wl1271_power_off(wl);
788 wl1271_error("firmware boot in PLT mode failed despite %d retries",
789 WL1271_BOOT_RETRIES);
791 mutex_unlock(&wl->mutex);
796 int wl1271_plt_stop(struct wl1271 *wl)
800 mutex_lock(&wl->mutex);
802 wl1271_notice("power down");
804 if (wl->state != WL1271_STATE_PLT) {
805 wl1271_error("cannot power down because not in PLT "
806 "state: %d", wl->state);
811 wl1271_disable_interrupts(wl);
812 wl1271_power_off(wl);
814 wl->state = WL1271_STATE_OFF;
818 mutex_unlock(&wl->mutex);
824 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
826 struct wl1271 *wl = hw->priv;
827 struct ieee80211_conf *conf = &hw->conf;
828 struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
829 struct ieee80211_sta *sta = txinfo->control.sta;
832 /* peek into the rates configured in the STA entry */
833 spin_lock_irqsave(&wl->wl_lock, flags);
834 if (sta && sta->supp_rates[conf->channel->band] != wl->sta_rate_set) {
835 wl->sta_rate_set = sta->supp_rates[conf->channel->band];
836 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
838 spin_unlock_irqrestore(&wl->wl_lock, flags);
840 /* queue the packet */
841 skb_queue_tail(&wl->tx_queue, skb);
844 * The chip specific setup must run before the first TX packet -
845 * before that, the tx_work will not be initialized!
848 ieee80211_queue_work(wl->hw, &wl->tx_work);
851 * The workqueue is slow to process the tx_queue and we need stop
852 * the queue here, otherwise the queue will get too long.
854 if (skb_queue_len(&wl->tx_queue) >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
855 wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
857 spin_lock_irqsave(&wl->wl_lock, flags);
858 ieee80211_stop_queues(wl->hw);
859 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
860 spin_unlock_irqrestore(&wl->wl_lock, flags);
866 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
869 struct net_device *dev;
870 struct wireless_dev *wdev;
872 struct ieee80211_hw *hw;
874 struct wl1271 *wl_temp;
875 struct in_device *idev;
876 struct in_ifaddr *ifa = arg;
879 /* FIXME: this ugly function should probably be implemented in the
880 * mac80211, and here should only be a simple callback handling actual
881 * setting of the filters. Now we need to dig up references to
882 * various structures to gain access to what we need.
883 * Also, because of this, there is no "initial" setting of the filter
884 * in "op_start", because we don't want to dig up struct net_device
885 * there - the filter will be set upon first change of the interface
888 dev = ifa->ifa_dev->dev;
890 wdev = dev->ieee80211_ptr;
898 hw = wiphy_priv(wiphy);
902 /* Check that the interface is one supported by this driver. */
904 list_for_each_entry(wl, &wl_list, list) {
911 /* Get the interface IP address for the device. "ifa" will become
913 - there is no IPV4 protocol address configured
914 - there are multiple (virtual) IPV4 addresses configured
915 When "ifa" is NULL, filtering will be disabled.
920 ifa = idev->ifa_list;
922 if (ifa && ifa->ifa_next)
925 mutex_lock(&wl->mutex);
927 if (wl->state == WL1271_STATE_OFF)
930 ret = wl1271_ps_elp_wakeup(wl, false);
934 ret = wl1271_acx_arp_ip_filter(wl, true,
935 (u8 *)&ifa->ifa_address,
938 ret = wl1271_acx_arp_ip_filter(wl, false, NULL,
940 wl1271_ps_elp_sleep(wl);
943 mutex_unlock(&wl->mutex);
948 static struct notifier_block wl1271_dev_notifier = {
949 .notifier_call = wl1271_dev_notify,
953 static int wl1271_op_start(struct ieee80211_hw *hw)
955 struct wl1271 *wl = hw->priv;
956 int retries = WL1271_BOOT_RETRIES;
959 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
961 mutex_lock(&wl->mutex);
963 if (wl->state != WL1271_STATE_OFF) {
964 wl1271_error("cannot start because not in off state: %d",
972 ret = wl1271_chip_wakeup(wl);
976 ret = wl1271_boot(wl);
980 ret = wl1271_hw_init(wl);
984 wl->state = WL1271_STATE_ON;
985 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
989 wl1271_disable_interrupts(wl);
990 mutex_unlock(&wl->mutex);
991 /* Unlocking the mutex in the middle of handling is
992 inherently unsafe. In this case we deem it safe to do,
993 because we need to let any possibly pending IRQ out of
994 the system (and while we are WL1271_STATE_OFF the IRQ
995 work function will not do anything.) Also, any other
996 possible concurrent operations will fail due to the
997 current state, hence the wl1271 struct should be safe. */
998 cancel_work_sync(&wl->irq_work);
999 mutex_lock(&wl->mutex);
1001 wl1271_power_off(wl);
1004 wl1271_error("firmware boot failed despite %d retries",
1005 WL1271_BOOT_RETRIES);
1007 mutex_unlock(&wl->mutex);
1010 list_add(&wl->list, &wl_list);
1011 register_inetaddr_notifier(&wl1271_dev_notifier);
1017 static void wl1271_op_stop(struct ieee80211_hw *hw)
1019 struct wl1271 *wl = hw->priv;
1022 wl1271_info("down");
1024 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
1026 unregister_inetaddr_notifier(&wl1271_dev_notifier);
1027 list_del(&wl->list);
1029 mutex_lock(&wl->mutex);
1031 WARN_ON(wl->state != WL1271_STATE_ON);
1033 if (test_and_clear_bit(WL1271_FLAG_SCANNING, &wl->flags)) {
1034 mutex_unlock(&wl->mutex);
1035 ieee80211_scan_completed(wl->hw, true);
1036 mutex_lock(&wl->mutex);
1039 wl->state = WL1271_STATE_OFF;
1041 wl1271_disable_interrupts(wl);
1043 mutex_unlock(&wl->mutex);
1045 cancel_work_sync(&wl->irq_work);
1046 cancel_work_sync(&wl->tx_work);
1048 mutex_lock(&wl->mutex);
1050 /* let's notify MAC80211 about the remaining pending TX frames */
1051 wl1271_tx_flush(wl);
1052 wl1271_power_off(wl);
1054 memset(wl->bssid, 0, ETH_ALEN);
1055 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1057 wl->bss_type = MAX_BSS_TYPE;
1058 wl->band = IEEE80211_BAND_2GHZ;
1061 wl->psm_entry_retry = 0;
1062 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1063 wl->tx_blocks_available = 0;
1064 wl->tx_results_count = 0;
1065 wl->tx_packets_count = 0;
1066 wl->tx_security_last_seq = 0;
1067 wl->tx_security_seq = 0;
1068 wl->time_offset = 0;
1069 wl->session_counter = 0;
1070 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1071 wl->sta_rate_set = 0;
1074 for (i = 0; i < NUM_TX_QUEUES; i++)
1075 wl->tx_blocks_freed[i] = 0;
1077 wl1271_debugfs_reset(wl);
1078 mutex_unlock(&wl->mutex);
1081 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1082 struct ieee80211_vif *vif)
1084 struct wl1271 *wl = hw->priv;
1087 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1088 vif->type, vif->addr);
1090 mutex_lock(&wl->mutex);
1098 switch (vif->type) {
1099 case NL80211_IFTYPE_STATION:
1100 wl->bss_type = BSS_TYPE_STA_BSS;
1102 case NL80211_IFTYPE_ADHOC:
1103 wl->bss_type = BSS_TYPE_IBSS;
1110 /* FIXME: what if conf->mac_addr changes? */
1113 mutex_unlock(&wl->mutex);
1117 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1118 struct ieee80211_vif *vif)
1120 struct wl1271 *wl = hw->priv;
1122 mutex_lock(&wl->mutex);
1123 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1125 mutex_unlock(&wl->mutex);
1129 static int wl1271_op_config_interface(struct ieee80211_hw *hw,
1130 struct ieee80211_vif *vif,
1131 struct ieee80211_if_conf *conf)
1133 struct wl1271 *wl = hw->priv;
1134 struct sk_buff *beacon;
1137 wl1271_debug(DEBUG_MAC80211, "mac80211 config_interface bssid %pM",
1139 wl1271_dump_ascii(DEBUG_MAC80211, "ssid: ", conf->ssid,
1142 mutex_lock(&wl->mutex);
1144 ret = wl1271_ps_elp_wakeup(wl, false);
1148 if (memcmp(wl->bssid, conf->bssid, ETH_ALEN)) {
1149 wl1271_debug(DEBUG_MAC80211, "bssid changed");
1151 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
1153 ret = wl1271_cmd_join(wl, wl->bss_type);
1157 ret = wl1271_cmd_build_null_data(wl);
1162 wl->ssid_len = conf->ssid_len;
1164 memcpy(wl->ssid, conf->ssid, wl->ssid_len);
1166 if (conf->changed & IEEE80211_IFCC_BEACON) {
1167 beacon = ieee80211_beacon_get(hw, vif);
1168 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1169 beacon->data, beacon->len);
1172 dev_kfree_skb(beacon);
1176 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE,
1177 beacon->data, beacon->len);
1179 dev_kfree_skb(beacon);
1186 wl1271_ps_elp_sleep(wl);
1189 mutex_unlock(&wl->mutex);
1195 static int wl1271_join_channel(struct wl1271 *wl, int channel)
1198 /* we need to use a dummy BSSID for now */
1199 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1202 /* disable mac filter, so we hear everything */
1203 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1205 wl->channel = channel;
1206 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1208 /* the dummy join is performed always with STATION BSS type to allow
1209 also ad-hoc mode to listen to the surroundings without sending any
1211 ret = wl1271_cmd_join(wl, BSS_TYPE_STA_BSS);
1215 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1221 static int wl1271_unjoin_channel(struct wl1271 *wl)
1225 /* to stop listening to a channel, we disconnect */
1226 ret = wl1271_cmd_disconnect(wl);
1230 clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1232 memset(wl->bssid, 0, ETH_ALEN);
1233 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1239 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1241 struct wl1271 *wl = hw->priv;
1242 struct ieee80211_conf *conf = &hw->conf;
1243 int channel, ret = 0;
1245 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1247 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1249 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1251 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1253 mutex_lock(&wl->mutex);
1255 wl->band = conf->channel->band;
1257 ret = wl1271_ps_elp_wakeup(wl, false);
1261 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1262 if (conf->flags & IEEE80211_CONF_IDLE &&
1263 test_bit(WL1271_FLAG_JOINED, &wl->flags))
1264 wl1271_unjoin_channel(wl);
1265 else if (!(conf->flags & IEEE80211_CONF_IDLE))
1266 wl1271_join_channel(wl, channel);
1268 if (conf->flags & IEEE80211_CONF_IDLE) {
1269 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1270 wl->sta_rate_set = 0;
1271 wl1271_acx_rate_policies(wl);
1275 /* if the channel changes while joined, join again */
1276 if (channel != wl->channel &&
1277 test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1278 wl->channel = channel;
1279 /* FIXME: maybe use CMD_CHANNEL_SWITCH for this? */
1280 ret = wl1271_cmd_join(wl, wl->bss_type);
1282 wl1271_warning("cmd join to update channel failed %d",
1285 wl->channel = channel;
1287 if (conf->flags & IEEE80211_CONF_PS &&
1288 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1289 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1292 * We enter PSM only if we're already associated.
1293 * If we're not, we'll enter it when joining an SSID,
1294 * through the bss_info_changed() hook.
1296 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1297 wl1271_debug(DEBUG_PSM, "psm enabled");
1298 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1301 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1302 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1303 wl1271_debug(DEBUG_PSM, "psm disabled");
1305 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1307 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1308 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1312 if (conf->power_level != wl->power_level) {
1313 ret = wl1271_acx_tx_power(wl, conf->power_level);
1317 wl->power_level = conf->power_level;
1321 wl1271_ps_elp_sleep(wl);
1324 mutex_unlock(&wl->mutex);
1329 struct wl1271_filter_params {
1332 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1335 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
1336 struct dev_addr_list *mc_list)
1338 struct wl1271_filter_params *fp;
1341 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1343 wl1271_error("Out of memory setting filters.");
1347 /* update multicast filtering parameters */
1349 if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
1351 fp->enabled = false;
1354 fp->mc_list_length = 0;
1355 for (i = 0; i < mc_count; i++) {
1356 if (mc_list->da_addrlen == ETH_ALEN) {
1357 memcpy(fp->mc_list[fp->mc_list_length],
1358 mc_list->da_addr, ETH_ALEN);
1359 fp->mc_list_length++;
1361 wl1271_warning("Unknown mc address length.");
1362 mc_list = mc_list->next;
1365 return (u64)(unsigned long)fp;
1368 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1371 FIF_BCN_PRBRESP_PROMISC | \
1375 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1376 unsigned int changed,
1377 unsigned int *total, u64 multicast)
1379 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1380 struct wl1271 *wl = hw->priv;
1383 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1385 mutex_lock(&wl->mutex);
1387 if (wl->state == WL1271_STATE_OFF)
1390 ret = wl1271_ps_elp_wakeup(wl, false);
1394 *total &= WL1271_SUPPORTED_FILTERS;
1395 changed &= WL1271_SUPPORTED_FILTERS;
1397 if (*total & FIF_ALLMULTI)
1398 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1400 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1402 fp->mc_list_length);
1408 /* FIXME: We still need to set our filters properly */
1410 /* determine, whether supported filter values have changed */
1414 /* apply configured filters */
1415 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1420 wl1271_ps_elp_sleep(wl);
1423 mutex_unlock(&wl->mutex);
1426 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1427 struct ieee80211_vif *vif,
1428 struct ieee80211_sta *sta,
1429 struct ieee80211_key_conf *key_conf)
1431 struct wl1271 *wl = hw->priv;
1438 static const u8 bcast_addr[ETH_ALEN] =
1439 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1441 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1443 addr = sta ? sta->addr : bcast_addr;
1445 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1446 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1447 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1448 key_conf->alg, key_conf->keyidx,
1449 key_conf->keylen, key_conf->flags);
1450 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1452 if (is_zero_ether_addr(addr)) {
1453 /* We dont support TX only encryption */
1458 mutex_lock(&wl->mutex);
1460 ret = wl1271_ps_elp_wakeup(wl, false);
1464 switch (key_conf->alg) {
1468 key_conf->hw_key_idx = key_conf->keyidx;
1471 key_type = KEY_TKIP;
1473 key_conf->hw_key_idx = key_conf->keyidx;
1474 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1475 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1480 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1481 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1482 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1485 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
1493 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1494 key_conf->keyidx, key_type,
1495 key_conf->keylen, key_conf->key,
1496 addr, tx_seq_32, tx_seq_16);
1498 wl1271_error("Could not add or replace key");
1502 /* the default WEP key needs to be configured at least once */
1503 if (key_type == KEY_WEP) {
1504 ret = wl1271_cmd_set_default_wep_key(wl,
1512 /* The wl1271 does not allow to remove unicast keys - they
1513 will be cleared automatically on next CMD_JOIN. Ignore the
1514 request silently, as we dont want the mac80211 to emit
1515 an error message. */
1516 if (!is_broadcast_ether_addr(addr))
1519 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1520 key_conf->keyidx, key_type,
1521 key_conf->keylen, key_conf->key,
1524 wl1271_error("Could not remove key");
1530 wl1271_error("Unsupported key cmd 0x%x", cmd);
1538 wl1271_ps_elp_sleep(wl);
1541 mutex_unlock(&wl->mutex);
1547 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1548 struct cfg80211_scan_request *req)
1550 struct wl1271 *wl = hw->priv;
1555 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1558 ssid = req->ssids[0].ssid;
1559 len = req->ssids[0].ssid_len;
1562 mutex_lock(&wl->mutex);
1564 ret = wl1271_ps_elp_wakeup(wl, false);
1568 if (wl1271_11a_enabled())
1569 ret = wl1271_cmd_scan(hw->priv, ssid, len,
1570 req->ie, req->ie_len, 1, 0,
1571 WL1271_SCAN_BAND_DUAL, 3);
1573 ret = wl1271_cmd_scan(hw->priv, ssid, len,
1574 req->ie, req->ie_len, 1, 0,
1575 WL1271_SCAN_BAND_2_4_GHZ, 3);
1577 wl1271_ps_elp_sleep(wl);
1580 mutex_unlock(&wl->mutex);
1585 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1587 struct wl1271 *wl = hw->priv;
1590 mutex_lock(&wl->mutex);
1592 ret = wl1271_ps_elp_wakeup(wl, false);
1596 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1598 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1600 wl1271_ps_elp_sleep(wl);
1603 mutex_unlock(&wl->mutex);
1608 static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *beacon)
1610 u8 *ptr = beacon->data +
1611 offsetof(struct ieee80211_mgmt, u.beacon.variable);
1613 /* find the location of the ssid in the beacon */
1614 while (ptr < beacon->data + beacon->len) {
1615 if (ptr[0] == WLAN_EID_SSID) {
1616 wl->ssid_len = ptr[1];
1617 memcpy(wl->ssid, ptr+2, wl->ssid_len);
1622 wl1271_error("ad-hoc beacon template has no SSID!\n");
1625 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1626 struct ieee80211_vif *vif,
1627 struct ieee80211_bss_conf *bss_conf,
1630 enum wl1271_cmd_ps_mode mode;
1631 struct wl1271 *wl = hw->priv;
1632 bool do_join = false;
1635 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1637 mutex_lock(&wl->mutex);
1639 ret = wl1271_ps_elp_wakeup(wl, false);
1643 if (wl->bss_type == BSS_TYPE_IBSS) {
1644 /* FIXME: This implements rudimentary ad-hoc support -
1645 proper templates are on the wish list and notification
1646 on when they change. This patch will update the templates
1647 on every call to this function. */
1648 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
1651 struct ieee80211_hdr *hdr;
1653 wl1271_ssid_set(wl, beacon);
1654 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1659 dev_kfree_skb(beacon);
1663 hdr = (struct ieee80211_hdr *) beacon->data;
1664 hdr->frame_control = cpu_to_le16(
1665 IEEE80211_FTYPE_MGMT |
1666 IEEE80211_STYPE_PROBE_RESP);
1668 ret = wl1271_cmd_template_set(wl,
1669 CMD_TEMPL_PROBE_RESPONSE,
1672 dev_kfree_skb(beacon);
1676 /* Need to update the SSID (for filtering etc) */
1681 if ((changed & BSS_CHANGED_BSSID) &&
1683 * Now we know the correct bssid, so we send a new join command
1684 * and enable the BSSID filter
1686 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1687 wl->rx_config |= CFG_BSSID_FILTER_EN;
1688 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1689 ret = wl1271_cmd_build_null_data(wl);
1691 wl1271_warning("cmd buld null data failed %d",
1696 /* Need to update the BSSID (for filtering etc) */
1700 if (changed & BSS_CHANGED_ASSOC) {
1701 if (bss_conf->assoc) {
1702 wl->aid = bss_conf->aid;
1703 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1706 * with wl1271, we don't need to update the
1707 * beacon_int and dtim_period, because the firmware
1708 * updates it by itself when the first beacon is
1709 * received after a join.
1711 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1715 ret = wl1271_acx_aid(wl, wl->aid);
1719 /* If we want to go in PSM but we're not there yet */
1720 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
1721 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
1722 mode = STATION_POWER_SAVE_MODE;
1723 ret = wl1271_ps_set_mode(wl, mode, true);
1728 /* use defaults when not associated */
1729 clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1735 if (changed & BSS_CHANGED_ERP_SLOT) {
1736 if (bss_conf->use_short_slot)
1737 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1739 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1741 wl1271_warning("Set slot time failed %d", ret);
1746 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1747 if (bss_conf->use_short_preamble)
1748 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1750 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1753 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1754 if (bss_conf->use_cts_prot)
1755 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1757 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1759 wl1271_warning("Set ctsprotect failed %d", ret);
1765 ret = wl1271_cmd_join(wl, wl->bss_type);
1767 wl1271_warning("cmd join failed %d", ret);
1770 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1774 wl1271_ps_elp_sleep(wl);
1777 mutex_unlock(&wl->mutex);
1780 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
1781 const struct ieee80211_tx_queue_params *params)
1783 struct wl1271 *wl = hw->priv;
1786 mutex_lock(&wl->mutex);
1788 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
1790 ret = wl1271_ps_elp_wakeup(wl, false);
1794 /* the txop is confed in units of 32us by the mac80211, we need us */
1795 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
1796 params->cw_min, params->cw_max,
1797 params->aifs, params->txop << 5);
1801 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
1802 CONF_CHANNEL_TYPE_EDCF,
1803 wl1271_tx_get_queue(queue),
1804 CONF_PS_SCHEME_LEGACY,
1805 CONF_ACK_POLICY_LEGACY, 0, 0);
1810 wl1271_ps_elp_sleep(wl);
1813 mutex_unlock(&wl->mutex);
1819 /* can't be const, mac80211 writes to this */
1820 static struct ieee80211_rate wl1271_rates[] = {
1822 .hw_value = CONF_HW_BIT_RATE_1MBPS,
1823 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
1825 .hw_value = CONF_HW_BIT_RATE_2MBPS,
1826 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
1827 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1829 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
1830 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
1831 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1833 .hw_value = CONF_HW_BIT_RATE_11MBPS,
1834 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
1835 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1837 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1838 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1840 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1841 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1843 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1844 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1846 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1847 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1849 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1850 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1852 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1853 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1855 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1856 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1858 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1859 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1862 /* can't be const, mac80211 writes to this */
1863 static struct ieee80211_channel wl1271_channels[] = {
1864 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
1865 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
1866 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
1867 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
1868 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
1869 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
1870 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
1871 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
1872 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
1873 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
1874 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
1875 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
1876 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
1879 /* can't be const, mac80211 writes to this */
1880 static struct ieee80211_supported_band wl1271_band_2ghz = {
1881 .channels = wl1271_channels,
1882 .n_channels = ARRAY_SIZE(wl1271_channels),
1883 .bitrates = wl1271_rates,
1884 .n_bitrates = ARRAY_SIZE(wl1271_rates),
1887 /* 5 GHz data rates for WL1273 */
1888 static struct ieee80211_rate wl1271_rates_5ghz[] = {
1890 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1891 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1893 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1894 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1896 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1897 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1899 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1900 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1902 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1903 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1905 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1906 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1908 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1909 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1911 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1912 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1915 /* 5 GHz band channels for WL1273 */
1916 static struct ieee80211_channel wl1271_channels_5ghz[] = {
1917 { .hw_value = 183, .center_freq = 4915},
1918 { .hw_value = 184, .center_freq = 4920},
1919 { .hw_value = 185, .center_freq = 4925},
1920 { .hw_value = 187, .center_freq = 4935},
1921 { .hw_value = 188, .center_freq = 4940},
1922 { .hw_value = 189, .center_freq = 4945},
1923 { .hw_value = 192, .center_freq = 4960},
1924 { .hw_value = 196, .center_freq = 4980},
1925 { .hw_value = 7, .center_freq = 5035},
1926 { .hw_value = 8, .center_freq = 5040},
1927 { .hw_value = 9, .center_freq = 5045},
1928 { .hw_value = 11, .center_freq = 5055},
1929 { .hw_value = 12, .center_freq = 5060},
1930 { .hw_value = 16, .center_freq = 5080},
1931 { .hw_value = 34, .center_freq = 5170},
1932 { .hw_value = 36, .center_freq = 5180},
1933 { .hw_value = 38, .center_freq = 5190},
1934 { .hw_value = 40, .center_freq = 5200},
1935 { .hw_value = 42, .center_freq = 5210},
1936 { .hw_value = 44, .center_freq = 5220},
1937 { .hw_value = 46, .center_freq = 5230},
1938 { .hw_value = 48, .center_freq = 5240},
1939 { .hw_value = 52, .center_freq = 5260},
1940 { .hw_value = 56, .center_freq = 5280},
1941 { .hw_value = 60, .center_freq = 5300},
1942 { .hw_value = 64, .center_freq = 5320},
1943 { .hw_value = 100, .center_freq = 5500},
1944 { .hw_value = 104, .center_freq = 5520},
1945 { .hw_value = 108, .center_freq = 5540},
1946 { .hw_value = 112, .center_freq = 5560},
1947 { .hw_value = 116, .center_freq = 5580},
1948 { .hw_value = 120, .center_freq = 5600},
1949 { .hw_value = 124, .center_freq = 5620},
1950 { .hw_value = 128, .center_freq = 5640},
1951 { .hw_value = 132, .center_freq = 5660},
1952 { .hw_value = 136, .center_freq = 5680},
1953 { .hw_value = 140, .center_freq = 5700},
1954 { .hw_value = 149, .center_freq = 5745},
1955 { .hw_value = 153, .center_freq = 5765},
1956 { .hw_value = 157, .center_freq = 5785},
1957 { .hw_value = 161, .center_freq = 5805},
1958 { .hw_value = 165, .center_freq = 5825},
1962 static struct ieee80211_supported_band wl1271_band_5ghz = {
1963 .channels = wl1271_channels_5ghz,
1964 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
1965 .bitrates = wl1271_rates_5ghz,
1966 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
1969 static const struct ieee80211_ops wl1271_ops = {
1970 .start = wl1271_op_start,
1971 .stop = wl1271_op_stop,
1972 .add_interface = wl1271_op_add_interface,
1973 .remove_interface = wl1271_op_remove_interface,
1974 .config = wl1271_op_config,
1975 /* .config_interface = wl1271_op_config_interface, */
1976 .prepare_multicast = wl1271_op_prepare_multicast,
1977 .configure_filter = wl1271_op_configure_filter,
1979 .set_key = wl1271_op_set_key,
1980 .hw_scan = wl1271_op_hw_scan,
1981 .bss_info_changed = wl1271_op_bss_info_changed,
1982 .set_rts_threshold = wl1271_op_set_rts_threshold,
1983 .conf_tx = wl1271_op_conf_tx,
1984 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
1987 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
1988 struct device_attribute *attr,
1991 struct wl1271 *wl = dev_get_drvdata(dev);
1994 /* FIXME: what's the maximum length of buf? page size?*/
1997 mutex_lock(&wl->mutex);
1998 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
2000 mutex_unlock(&wl->mutex);
2006 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
2007 struct device_attribute *attr,
2008 const char *buf, size_t count)
2010 struct wl1271 *wl = dev_get_drvdata(dev);
2014 ret = strict_strtoul(buf, 10, &res);
2017 wl1271_warning("incorrect value written to bt_coex_mode");
2021 mutex_lock(&wl->mutex);
2025 if (res == wl->sg_enabled)
2028 wl->sg_enabled = res;
2030 if (wl->state == WL1271_STATE_OFF)
2033 ret = wl1271_ps_elp_wakeup(wl, false);
2037 wl1271_acx_sg_enable(wl, wl->sg_enabled);
2038 wl1271_ps_elp_sleep(wl);
2041 mutex_unlock(&wl->mutex);
2045 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
2046 wl1271_sysfs_show_bt_coex_state,
2047 wl1271_sysfs_store_bt_coex_state);
2049 int wl1271_register_hw(struct wl1271 *wl)
2053 if (wl->mac80211_registered)
2056 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
2058 ret = ieee80211_register_hw(wl->hw);
2060 wl1271_error("unable to register mac80211 hw: %d", ret);
2064 wl->mac80211_registered = true;
2066 wl1271_notice("loaded");
2070 EXPORT_SYMBOL_GPL(wl1271_register_hw);
2072 int wl1271_init_ieee80211(struct wl1271 *wl)
2074 /* The tx descriptor buffer and the TKIP space. */
2075 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
2076 sizeof(struct wl1271_tx_hw_descr);
2079 /* FIXME: find a proper value */
2080 wl->hw->channel_change_time = 10000;
2082 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
2083 IEEE80211_HW_NOISE_DBM |
2084 IEEE80211_HW_BEACON_FILTER |
2085 IEEE80211_HW_SUPPORTS_PS |
2086 IEEE80211_HW_HAS_RATE_CONTROL;
2088 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2089 BIT(NL80211_IFTYPE_ADHOC);
2090 wl->hw->wiphy->max_scan_ssids = 1;
2091 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
2093 if (wl1271_11a_enabled())
2094 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
2098 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
2102 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
2104 #define WL1271_DEFAULT_CHANNEL 0
2106 struct ieee80211_hw *wl1271_alloc_hw(void)
2108 struct ieee80211_hw *hw;
2112 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
2114 wl1271_error("could not alloc ieee80211_hw");
2120 memset(wl, 0, sizeof(*wl));
2122 INIT_LIST_HEAD(&wl->list);
2126 skb_queue_head_init(&wl->tx_queue);
2128 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
2129 wl->channel = WL1271_DEFAULT_CHANNEL;
2130 wl->default_key = 0;
2132 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
2133 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
2134 wl->psm_entry_retry = 0;
2135 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2136 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2137 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
2138 wl->sta_rate_set = 0;
2139 wl->band = IEEE80211_BAND_2GHZ;
2142 wl->sg_enabled = true;
2144 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
2145 wl->tx_frames[i] = NULL;
2147 spin_lock_init(&wl->wl_lock);
2149 wl->state = WL1271_STATE_OFF;
2150 mutex_init(&wl->mutex);
2152 /* Apply default driver configuration. */
2153 wl1271_conf_init(wl);
2155 wl1271_debugfs_init(wl);
2157 /* Register platform device */
2158 ret = platform_device_register(&wl1271_device);
2160 wl1271_error("couldn't register platform device");
2163 dev_set_drvdata(&wl1271_device.dev, wl);
2165 /* Create sysfs file to control bt coex state */
2166 ret = device_create_file(&wl1271_device.dev, &dev_attr_bt_coex_state);
2168 wl1271_error("failed to create sysfs file bt_coex_state");
2175 platform_device_unregister(&wl1271_device);
2178 ieee80211_unregister_hw(wl->hw);
2181 return ERR_PTR(ret);
2183 EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
2185 int wl1271_free_hw(struct wl1271 *wl)
2187 platform_device_unregister(&wl1271_device);
2188 ieee80211_unregister_hw(wl->hw);
2190 wl1271_debugfs_exit(wl);
2192 kfree(wl->target_mem_map);
2198 kfree(wl->fw_status);
2199 kfree(wl->tx_res_if);
2201 ieee80211_free_hw(wl->hw);
2205 EXPORT_SYMBOL_GPL(wl1271_free_hw);
2207 MODULE_LICENSE("GPL");
2208 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2209 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");