2 * This file is part of wl1271
4 * Copyright (C) 2008-2009 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/platform_device.h>
26 #include <linux/interrupt.h>
27 #include <linux/firmware.h>
28 #include <linux/delay.h>
29 #include <linux/irq.h>
30 #include <linux/spi/spi.h>
31 #include <linux/crc32.h>
32 #include <linux/etherdevice.h>
33 #include <linux/vmalloc.h>
34 #include <linux/spi/wl12xx.h>
35 #include <linux/inetdevice.h>
38 #include "wl12xx_80211.h"
39 #include "wl1271_reg.h"
40 #include "wl1271_spi.h"
41 #include "wl1271_event.h"
42 #include "wl1271_tx.h"
43 #include "wl1271_rx.h"
44 #include "wl1271_ps.h"
45 #include "wl1271_init.h"
46 #include "wl1271_debugfs.h"
47 #include "wl1271_cmd.h"
48 #include "wl1271_boot.h"
50 #define WL1271_BOOT_RETRIES 3
52 static struct conf_drv_settings default_conf = {
54 .per_threshold = 7500,
55 .max_scan_compensation_time = 120000,
56 .nfs_sample_interval = 400,
59 .probe_req_compensation = 170,
60 .scan_window_compensation = 50,
62 .beacon_miss_threshold = 60,
63 .rate_adaptation_threshold = CONF_HW_BIT_RATE_12MBPS,
64 .rate_adaptation_snr = 0
67 .rx_msdu_life_time = 512000,
68 .packet_detection_threshold = 0,
69 .ps_poll_timeout = 15,
71 .rts_threshold = 2347,
72 .rx_cca_threshold = 0,
73 .irq_blk_threshold = 0xFFFF,
74 .irq_pkt_threshold = 0,
76 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
79 .tx_energy_detection = 0,
81 .enabled_rates = CONF_TX_RATE_MASK_UNSPECIFIED,
82 .short_retry_limit = 10,
83 .long_retry_limit = 10,
106 .aifsn = CONF_TX_AIFS_PIFS,
113 .aifsn = CONF_TX_AIFS_PIFS,
121 .channel_type = CONF_CHANNEL_TYPE_DCF,
122 .tsid = CONF_TX_AC_BE,
123 .ps_scheme = CONF_PS_SCHEME_LEGACY,
124 .ack_policy = CONF_ACK_POLICY_LEGACY,
129 .channel_type = CONF_CHANNEL_TYPE_DCF,
130 .tsid = CONF_TX_AC_BE,
131 .ps_scheme = CONF_PS_SCHEME_LEGACY,
132 .ack_policy = CONF_ACK_POLICY_LEGACY,
137 .channel_type = CONF_CHANNEL_TYPE_DCF,
138 .tsid = CONF_TX_AC_BE,
139 .ps_scheme = CONF_PS_SCHEME_LEGACY,
140 .ack_policy = CONF_ACK_POLICY_LEGACY,
145 .channel_type = CONF_CHANNEL_TYPE_DCF,
146 .tsid = CONF_TX_AC_BE,
147 .ps_scheme = CONF_PS_SCHEME_LEGACY,
148 .ack_policy = CONF_ACK_POLICY_LEGACY,
153 .channel_type = CONF_CHANNEL_TYPE_DCF,
154 .tsid = CONF_TX_AC_BE,
155 .ps_scheme = CONF_PS_SCHEME_LEGACY,
156 .ack_policy = CONF_ACK_POLICY_LEGACY,
161 .channel_type = CONF_CHANNEL_TYPE_DCF,
162 .tsid = CONF_TX_AC_BE,
163 .ps_scheme = CONF_PS_SCHEME_LEGACY,
164 .ack_policy = CONF_ACK_POLICY_LEGACY,
169 .channel_type = CONF_CHANNEL_TYPE_DCF,
170 .tsid = CONF_TX_AC_BE,
171 .ps_scheme = CONF_PS_SCHEME_LEGACY,
172 .ack_policy = CONF_ACK_POLICY_LEGACY,
176 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
177 .tx_compl_timeout = 700,
178 .tx_compl_threshold = 4
181 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
182 .listen_interval = 0,
183 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
184 .bcn_filt_ie_count = 1,
187 .ie = WLAN_EID_CHANNEL_SWITCH,
188 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
191 .synch_fail_thold = 10,
192 .bss_lose_timeout = 100,
193 .beacon_rx_timeout = 10000,
194 .broadcast_timeout = 20000,
195 .rx_broadcast_in_ps = 1,
196 .ps_poll_threshold = 20,
197 .sig_trigger_count = 2,
202 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
203 .type = CONF_TRIG_EVENT_TYPE_EDGE,
204 .direction = CONF_TRIG_EVENT_DIR_LOW,
212 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
213 .type = CONF_TRIG_EVENT_TYPE_EDGE,
214 .direction = CONF_TRIG_EVENT_DIR_HIGH,
221 .rssi_bcn_avg_weight = 10,
222 .rssi_pkt_avg_weight = 10,
223 .snr_bcn_avg_weight = 10,
224 .snr_pkt_avg_weight = 10
226 .bet_enable = CONF_BET_MODE_ENABLE,
227 .bet_max_consecutive = 10,
228 .psm_entry_retries = 3
232 .ref_clk = CONF_REF_CLK_38_4_E,
234 .clk_valid_on_wakeup = 0,
236 .single_dual_band = CONF_SINGLE_BAND,
237 .tx_bip_fem_autodetect = 1,
238 .tx_bip_fem_manufacturer = 1,
241 .srf1 = { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
242 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
243 .srf2 = { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
244 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
245 .srf3 = { 0x07, 0x03, 0x18, 0x10, 0x05, 0xfb, 0xf0,
246 0xe8, 0, 0, 0, 0, 0, 0, 0, 0 },
247 .sr_debug_table = { 0, 0, 0, 0, 0, 0, 0, 0,
248 0, 0, 0, 0, 0, 0, 0, 0 },
250 .sr_sen_n_p_gain = 0,
255 .rx_trace_loss = 0x24,
256 .tx_trace_loss = 0x0,
257 .rx_rssi_and_proc_compens = {
258 0xec, 0xf6, 0x00, 0x0c, 0x18, 0xf8,
259 0xfc, 0x00, 0x80, 0x10, 0xf0, 0xf8,
261 .rx_trace_loss_5 = { 0, 0, 0, 0, 0, 0, 0 },
262 .tx_trace_loss_5 = { 0, 0, 0, 0, 0, 0, 0 },
263 .rx_rssi_and_proc_compens_5 = {
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 .tx_ref_pd_voltage = 0x1a9,
268 .tx_ref_power = 0x80,
270 .tx_rate_limits_normal = {
271 0x1d, 0x1f, 0x24, 0x28, 0x28, 0x29 },
272 .tx_rate_limits_degraded = {
273 0x19, 0x1f, 0x22, 0x23, 0x27, 0x28 },
274 .tx_rate_limits_extreme = {
275 0x19, 0x1c, 0x1e, 0x20, 0x24, 0x25 },
276 .tx_channel_limits_11b = {
277 0x22, 0x50, 0x50, 0x50, 0x50, 0x50,
278 0x50, 0x50, 0x50, 0x50, 0x22, 0x50,
280 .tx_channel_limits_ofdm = {
281 0x20, 0x50, 0x50, 0x50, 0x50, 0x50,
282 0x50, 0x50, 0x50, 0x50, 0x20, 0x50,
284 .tx_pdv_rate_offsets = {
285 0x07, 0x08, 0x04, 0x02, 0x02, 0x00 },
287 0x11, 0x11, 0x15, 0x11, 0x15, 0x0f },
288 .rx_fem_insertion_loss = 0x0e,
289 .degraded_low_to_normal_threshold = 0x1e,
290 .degraded_normal_to_high_threshold = 0x2d,
291 .tx_ref_pd_voltage_5 = {
292 0x0190, 0x01a4, 0x01c3, 0x01d8,
295 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 },
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
298 .tx_rate_limits_normal_5 = {
299 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
300 .tx_rate_limits_degraded_5 = {
301 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
302 .tx_rate_limits_extreme_5 = {
303 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
304 .tx_channel_limits_ofdm_5 = {
305 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
306 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
307 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
308 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
310 .tx_pdv_rate_offsets_5 = {
311 0x01, 0x02, 0x02, 0x02, 0x02, 0x00 },
313 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
314 .rx_fem_insertion_loss_5 = {
315 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
316 .degraded_low_to_normal_threshold_5 = 0x00,
317 .degraded_normal_to_high_threshold_5 = 0x00
326 static LIST_HEAD(wl_list);
328 static void wl1271_conf_init(struct wl1271 *wl)
332 * This function applies the default configuration to the driver. This
333 * function is invoked upon driver load (spi probe.)
335 * The configuration is stored in a run-time structure in order to
336 * facilitate for run-time adjustment of any of the parameters. Making
337 * changes to the configuration structure will apply the new values on
338 * the next interface up (wl1271_op_start.)
341 /* apply driver default configuration */
342 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
344 if (wl1271_11a_enabled())
345 wl->conf.init.genparam.single_dual_band = CONF_DUAL_BAND;
349 static int wl1271_plt_init(struct wl1271 *wl)
353 ret = wl1271_cmd_general_parms(wl);
357 ret = wl1271_cmd_radio_parms(wl);
361 ret = wl1271_acx_init_mem_config(wl);
365 ret = wl1271_cmd_data_path(wl, 1);
372 static void wl1271_disable_interrupts(struct wl1271 *wl)
374 disable_irq(wl->irq);
377 static void wl1271_power_off(struct wl1271 *wl)
379 wl->set_power(false);
380 wl->gpio_power = false;
383 static void wl1271_power_on(struct wl1271 *wl)
386 wl->gpio_power = true;
389 static void wl1271_fw_status(struct wl1271 *wl,
390 struct wl1271_fw_status *status)
395 wl1271_spi_read(wl, FW_STATUS_ADDR, status,
396 sizeof(*status), false);
398 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
399 "drv_rx_counter = %d, tx_results_counter = %d)",
401 status->fw_rx_counter,
402 status->drv_rx_counter,
403 status->tx_results_counter);
405 /* update number of available TX blocks */
406 for (i = 0; i < NUM_TX_QUEUES; i++) {
407 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
408 wl->tx_blocks_freed[i];
410 wl->tx_blocks_freed[i] =
411 le32_to_cpu(status->tx_released_blks[i]);
412 wl->tx_blocks_available += cnt;
416 /* if more blocks are available now, schedule some tx work */
417 if (total && !skb_queue_empty(&wl->tx_queue))
418 ieee80211_queue_work(wl->hw, &wl->tx_work);
420 /* update the host-chipset time offset */
421 wl->time_offset = jiffies_to_usecs(jiffies) -
422 le32_to_cpu(status->fw_localtime);
425 static void wl1271_irq_work(struct work_struct *work)
430 container_of(work, struct wl1271, irq_work);
432 mutex_lock(&wl->mutex);
434 wl1271_debug(DEBUG_IRQ, "IRQ work");
436 if (wl->state == WL1271_STATE_OFF)
439 ret = wl1271_ps_elp_wakeup(wl, true);
443 wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
445 wl1271_fw_status(wl, wl->fw_status);
446 intr = le32_to_cpu(wl->fw_status->intr);
448 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
452 intr &= WL1271_INTR_MASK;
454 if (intr & WL1271_ACX_INTR_EVENT_A) {
455 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
456 wl1271_event_handle(wl, 0);
459 if (intr & WL1271_ACX_INTR_EVENT_B) {
460 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
461 wl1271_event_handle(wl, 1);
464 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
465 wl1271_debug(DEBUG_IRQ,
466 "WL1271_ACX_INTR_INIT_COMPLETE");
468 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
469 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
471 if (intr & WL1271_ACX_INTR_DATA) {
472 u8 tx_res_cnt = wl->fw_status->tx_results_counter -
473 wl->tx_results_count;
475 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
477 /* check for tx results */
479 wl1271_tx_complete(wl, tx_res_cnt);
481 wl1271_rx(wl, wl->fw_status);
485 wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK,
486 WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
487 wl1271_ps_elp_sleep(wl);
490 mutex_unlock(&wl->mutex);
493 static irqreturn_t wl1271_irq(int irq, void *cookie)
498 wl1271_debug(DEBUG_IRQ, "IRQ");
502 /* complete the ELP completion */
503 spin_lock_irqsave(&wl->wl_lock, flags);
505 complete(wl->elp_compl);
506 wl->elp_compl = NULL;
509 ieee80211_queue_work(wl->hw, &wl->irq_work);
510 spin_unlock_irqrestore(&wl->wl_lock, flags);
515 static int wl1271_fetch_firmware(struct wl1271 *wl)
517 const struct firmware *fw;
520 ret = request_firmware(&fw, WL1271_FW_NAME, &wl->spi->dev);
523 wl1271_error("could not get firmware: %d", ret);
528 wl1271_error("firmware size is not multiple of 32 bits: %zu",
534 wl->fw_len = fw->size;
535 wl->fw = vmalloc(wl->fw_len);
538 wl1271_error("could not allocate memory for the firmware");
543 memcpy(wl->fw, fw->data, wl->fw_len);
548 release_firmware(fw);
553 static int wl1271_fetch_nvs(struct wl1271 *wl)
555 const struct firmware *fw;
558 ret = request_firmware(&fw, WL1271_NVS_NAME, &wl->spi->dev);
561 wl1271_error("could not get nvs file: %d", ret);
566 wl1271_error("nvs size is not multiple of 32 bits: %zu",
572 wl->nvs_len = fw->size;
573 wl->nvs = kmalloc(wl->nvs_len, GFP_KERNEL);
576 wl1271_error("could not allocate memory for the nvs file");
581 memcpy(wl->nvs, fw->data, wl->nvs_len);
586 release_firmware(fw);
591 static void wl1271_fw_wakeup(struct wl1271 *wl)
595 elp_reg = ELPCTRL_WAKE_UP;
596 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
599 static int wl1271_setup(struct wl1271 *wl)
601 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
605 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
606 if (!wl->tx_res_if) {
607 kfree(wl->fw_status);
611 INIT_WORK(&wl->irq_work, wl1271_irq_work);
612 INIT_WORK(&wl->tx_work, wl1271_tx_work);
616 static int wl1271_chip_wakeup(struct wl1271 *wl)
618 struct wl1271_partition_set partition;
621 msleep(WL1271_PRE_POWER_ON_SLEEP);
623 msleep(WL1271_POWER_ON_SLEEP);
624 wl1271_spi_reset(wl);
627 /* We don't need a real memory partition here, because we only want
628 * to use the registers at this point. */
629 memset(&partition, 0, sizeof(partition));
630 partition.reg.start = REGISTERS_BASE;
631 partition.reg.size = REGISTERS_DOWN_SIZE;
632 wl1271_set_partition(wl, &partition);
634 /* ELP module wake up */
635 wl1271_fw_wakeup(wl);
637 /* whal_FwCtrl_BootSm() */
639 /* 0. read chip id from CHIP_ID */
640 wl->chip.id = wl1271_spi_read32(wl, CHIP_ID_B);
642 /* 1. check if chip id is valid */
644 switch (wl->chip.id) {
645 case CHIP_ID_1271_PG10:
646 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
649 ret = wl1271_setup(wl);
653 case CHIP_ID_1271_PG20:
654 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
657 ret = wl1271_setup(wl);
662 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
667 if (wl->fw == NULL) {
668 ret = wl1271_fetch_firmware(wl);
673 /* No NVS from netlink, try to get it from the filesystem */
674 if (wl->nvs == NULL) {
675 ret = wl1271_fetch_nvs(wl);
684 int wl1271_plt_start(struct wl1271 *wl)
686 int retries = WL1271_BOOT_RETRIES;
689 mutex_lock(&wl->mutex);
691 wl1271_notice("power up");
693 if (wl->state != WL1271_STATE_OFF) {
694 wl1271_error("cannot go into PLT state because not "
695 "in off state: %d", wl->state);
702 ret = wl1271_chip_wakeup(wl);
706 ret = wl1271_boot(wl);
710 ret = wl1271_plt_init(wl);
714 /* Make sure power saving is disabled */
715 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
719 wl->state = WL1271_STATE_PLT;
720 wl1271_notice("firmware booted in PLT mode (%s)",
725 wl1271_disable_interrupts(wl);
726 mutex_unlock(&wl->mutex);
727 /* Unlocking the mutex in the middle of handling is
728 inherently unsafe. In this case we deem it safe to do,
729 because we need to let any possibly pending IRQ out of
730 the system (and while we are WL1271_STATE_OFF the IRQ
731 work function will not do anything.) Also, any other
732 possible concurrent operations will fail due to the
733 current state, hence the wl1271 struct should be safe. */
734 cancel_work_sync(&wl->irq_work);
735 mutex_lock(&wl->mutex);
737 wl1271_power_off(wl);
740 wl1271_error("firmware boot in PLT mode failed despite %d retries",
741 WL1271_BOOT_RETRIES);
743 mutex_unlock(&wl->mutex);
748 int wl1271_plt_stop(struct wl1271 *wl)
752 mutex_lock(&wl->mutex);
754 wl1271_notice("power down");
756 if (wl->state != WL1271_STATE_PLT) {
757 wl1271_error("cannot power down because not in PLT "
758 "state: %d", wl->state);
763 wl1271_disable_interrupts(wl);
764 wl1271_power_off(wl);
766 wl->state = WL1271_STATE_OFF;
770 mutex_unlock(&wl->mutex);
776 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
778 struct wl1271 *wl = hw->priv;
780 skb_queue_tail(&wl->tx_queue, skb);
783 * The chip specific setup must run before the first TX packet -
784 * before that, the tx_work will not be initialized!
787 ieee80211_queue_work(wl->hw, &wl->tx_work);
790 * The workqueue is slow to process the tx_queue and we need stop
791 * the queue here, otherwise the queue will get too long.
793 if (skb_queue_len(&wl->tx_queue) >= WL1271_TX_QUEUE_MAX_LENGTH) {
794 ieee80211_stop_queues(wl->hw);
797 * FIXME: this is racy, the variable is not properly
798 * protected. Maybe fix this by removing the stupid
799 * variable altogether and checking the real queue state?
801 wl->tx_queue_stopped = true;
807 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
810 struct net_device *dev;
811 struct wireless_dev *wdev;
813 struct ieee80211_hw *hw;
815 struct wl1271 *wl_temp;
816 struct in_device *idev;
817 struct in_ifaddr *ifa = arg;
820 /* FIXME: this ugly function should probably be implemented in the
821 * mac80211, and here should only be a simple callback handling actual
822 * setting of the filters. Now we need to dig up references to
823 * various structures to gain access to what we need.
824 * Also, because of this, there is no "initial" setting of the filter
825 * in "op_start", because we don't want to dig up struct net_device
826 * there - the filter will be set upon first change of the interface
829 dev = ifa->ifa_dev->dev;
831 wdev = dev->ieee80211_ptr;
839 hw = wiphy_priv(wiphy);
843 /* Check that the interface is one supported by this driver. */
845 list_for_each_entry(wl, &wl_list, list) {
852 /* Get the interface IP address for the device. "ifa" will become
854 - there is no IPV4 protocol address configured
855 - there are multiple (virtual) IPV4 addresses configured
856 When "ifa" is NULL, filtering will be disabled.
861 ifa = idev->ifa_list;
863 if (ifa && ifa->ifa_next)
866 mutex_lock(&wl->mutex);
868 if (wl->state == WL1271_STATE_OFF)
871 ret = wl1271_ps_elp_wakeup(wl, false);
875 ret = wl1271_acx_arp_ip_filter(wl, true,
876 (u8 *)&ifa->ifa_address,
879 ret = wl1271_acx_arp_ip_filter(wl, false, NULL,
881 wl1271_ps_elp_sleep(wl);
884 mutex_unlock(&wl->mutex);
889 static struct notifier_block wl1271_dev_notifier = {
890 .notifier_call = wl1271_dev_notify,
894 static int wl1271_op_start(struct ieee80211_hw *hw)
896 struct wl1271 *wl = hw->priv;
897 int retries = WL1271_BOOT_RETRIES;
900 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
902 mutex_lock(&wl->mutex);
904 if (wl->state != WL1271_STATE_OFF) {
905 wl1271_error("cannot start because not in off state: %d",
913 ret = wl1271_chip_wakeup(wl);
917 ret = wl1271_boot(wl);
921 ret = wl1271_hw_init(wl);
925 wl->state = WL1271_STATE_ON;
926 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
930 wl1271_disable_interrupts(wl);
931 mutex_unlock(&wl->mutex);
932 /* Unlocking the mutex in the middle of handling is
933 inherently unsafe. In this case we deem it safe to do,
934 because we need to let any possibly pending IRQ out of
935 the system (and while we are WL1271_STATE_OFF the IRQ
936 work function will not do anything.) Also, any other
937 possible concurrent operations will fail due to the
938 current state, hence the wl1271 struct should be safe. */
939 cancel_work_sync(&wl->irq_work);
940 mutex_lock(&wl->mutex);
942 wl1271_power_off(wl);
945 wl1271_error("firmware boot failed despite %d retries",
946 WL1271_BOOT_RETRIES);
948 mutex_unlock(&wl->mutex);
951 list_add(&wl->list, &wl_list);
952 register_inetaddr_notifier(&wl1271_dev_notifier);
958 static void wl1271_op_stop(struct ieee80211_hw *hw)
960 struct wl1271 *wl = hw->priv;
965 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
967 unregister_inetaddr_notifier(&wl1271_dev_notifier);
970 mutex_lock(&wl->mutex);
972 WARN_ON(wl->state != WL1271_STATE_ON);
975 mutex_unlock(&wl->mutex);
976 ieee80211_scan_completed(wl->hw, true);
977 mutex_lock(&wl->mutex);
978 wl->scanning = false;
981 wl->state = WL1271_STATE_OFF;
983 wl1271_disable_interrupts(wl);
985 mutex_unlock(&wl->mutex);
987 cancel_work_sync(&wl->irq_work);
988 cancel_work_sync(&wl->tx_work);
990 mutex_lock(&wl->mutex);
992 /* let's notify MAC80211 about the remaining pending TX frames */
994 wl1271_power_off(wl);
996 memset(wl->bssid, 0, ETH_ALEN);
997 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
999 wl->bss_type = MAX_BSS_TYPE;
1000 wl->band = IEEE80211_BAND_2GHZ;
1005 wl->psm_entry_retry = 0;
1006 wl->associated = false;
1007 wl->tx_queue_stopped = false;
1008 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1009 wl->tx_blocks_available = 0;
1010 wl->tx_results_count = 0;
1011 wl->tx_packets_count = 0;
1012 wl->tx_security_last_seq = 0;
1013 wl->tx_security_seq_16 = 0;
1014 wl->tx_security_seq_32 = 0;
1015 wl->time_offset = 0;
1016 wl->session_counter = 0;
1019 for (i = 0; i < NUM_TX_QUEUES; i++)
1020 wl->tx_blocks_freed[i] = 0;
1022 wl1271_debugfs_reset(wl);
1023 mutex_unlock(&wl->mutex);
1026 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1027 struct ieee80211_if_init_conf *conf)
1029 struct wl1271 *wl = hw->priv;
1032 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1033 conf->type, conf->mac_addr);
1035 mutex_lock(&wl->mutex);
1041 wl->vif = conf->vif;
1043 switch (conf->type) {
1044 case NL80211_IFTYPE_STATION:
1045 wl->bss_type = BSS_TYPE_STA_BSS;
1047 case NL80211_IFTYPE_ADHOC:
1048 wl->bss_type = BSS_TYPE_IBSS;
1055 /* FIXME: what if conf->mac_addr changes? */
1058 mutex_unlock(&wl->mutex);
1062 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1063 struct ieee80211_if_init_conf *conf)
1065 struct wl1271 *wl = hw->priv;
1067 mutex_lock(&wl->mutex);
1068 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1070 mutex_unlock(&wl->mutex);
1074 static int wl1271_op_config_interface(struct ieee80211_hw *hw,
1075 struct ieee80211_vif *vif,
1076 struct ieee80211_if_conf *conf)
1078 struct wl1271 *wl = hw->priv;
1079 struct sk_buff *beacon;
1082 wl1271_debug(DEBUG_MAC80211, "mac80211 config_interface bssid %pM",
1084 wl1271_dump_ascii(DEBUG_MAC80211, "ssid: ", conf->ssid,
1087 mutex_lock(&wl->mutex);
1089 ret = wl1271_ps_elp_wakeup(wl, false);
1093 if (memcmp(wl->bssid, conf->bssid, ETH_ALEN)) {
1094 wl1271_debug(DEBUG_MAC80211, "bssid changed");
1096 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
1098 ret = wl1271_cmd_join(wl);
1102 ret = wl1271_cmd_build_null_data(wl);
1107 wl->ssid_len = conf->ssid_len;
1109 memcpy(wl->ssid, conf->ssid, wl->ssid_len);
1111 if (conf->changed & IEEE80211_IFCC_BEACON) {
1112 beacon = ieee80211_beacon_get(hw, vif);
1113 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1114 beacon->data, beacon->len);
1117 dev_kfree_skb(beacon);
1121 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE,
1122 beacon->data, beacon->len);
1124 dev_kfree_skb(beacon);
1131 wl1271_ps_elp_sleep(wl);
1134 mutex_unlock(&wl->mutex);
1140 static int wl1271_join_channel(struct wl1271 *wl, int channel)
1143 /* we need to use a dummy BSSID for now */
1144 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1147 /* disable mac filter, so we hear everything */
1148 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1150 wl->channel = channel;
1151 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1153 ret = wl1271_cmd_join(wl);
1163 static int wl1271_unjoin_channel(struct wl1271 *wl)
1167 /* to stop listening to a channel, we disconnect */
1168 ret = wl1271_cmd_disconnect(wl);
1174 memset(wl->bssid, 0, ETH_ALEN);
1175 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1181 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1183 struct wl1271 *wl = hw->priv;
1184 struct ieee80211_conf *conf = &hw->conf;
1185 int channel, ret = 0;
1187 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1189 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1191 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1193 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1195 mutex_lock(&wl->mutex);
1197 wl->band = conf->channel->band;
1199 ret = wl1271_ps_elp_wakeup(wl, false);
1203 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1204 if (conf->flags & IEEE80211_CONF_IDLE && wl->joined)
1205 wl1271_unjoin_channel(wl);
1207 wl1271_join_channel(wl, channel);
1209 if (conf->flags & IEEE80211_CONF_IDLE) {
1210 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
1211 wl1271_acx_rate_policies(wl, CONF_TX_RATE_MASK_BASIC);
1215 /* if the channel changes while joined, join again */
1216 if (channel != wl->channel && wl->joined)
1217 wl1271_join_channel(wl, channel);
1219 if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {
1220 wl->psm_requested = true;
1223 * We enter PSM only if we're already associated.
1224 * If we're not, we'll enter it when joining an SSID,
1225 * through the bss_info_changed() hook.
1227 if (wl->associated) {
1228 wl1271_info("psm enabled");
1229 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
1231 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1232 wl->psm_requested) {
1233 wl1271_info("psm disabled");
1235 wl->psm_requested = false;
1238 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE);
1241 if (conf->power_level != wl->power_level) {
1242 ret = wl1271_acx_tx_power(wl, conf->power_level);
1246 wl->power_level = conf->power_level;
1250 wl1271_ps_elp_sleep(wl);
1253 mutex_unlock(&wl->mutex);
1258 struct wl1271_filter_params {
1261 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1264 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
1265 struct dev_addr_list *mc_list)
1267 struct wl1271_filter_params *fp;
1270 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1272 wl1271_error("Out of memory setting filters.");
1276 /* update multicast filtering parameters */
1278 if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
1280 fp->enabled = false;
1283 fp->mc_list_length = 0;
1284 for (i = 0; i < mc_count; i++) {
1285 if (mc_list->da_addrlen == ETH_ALEN) {
1286 memcpy(fp->mc_list[fp->mc_list_length],
1287 mc_list->da_addr, ETH_ALEN);
1288 fp->mc_list_length++;
1290 wl1271_warning("Unknown mc address length.");
1291 mc_list = mc_list->next;
1294 return (u64)(unsigned long)fp;
1297 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1300 FIF_BCN_PRBRESP_PROMISC | \
1304 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1305 unsigned int changed,
1306 unsigned int *total, u64 multicast)
1308 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1309 struct wl1271 *wl = hw->priv;
1312 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1314 mutex_lock(&wl->mutex);
1316 if (wl->state == WL1271_STATE_OFF)
1319 ret = wl1271_ps_elp_wakeup(wl, false);
1323 *total &= WL1271_SUPPORTED_FILTERS;
1324 changed &= WL1271_SUPPORTED_FILTERS;
1326 if (*total & FIF_ALLMULTI)
1327 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1329 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1331 fp->mc_list_length);
1337 /* FIXME: We still need to set our filters properly */
1339 /* determine, whether supported filter values have changed */
1343 /* apply configured filters */
1344 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1349 wl1271_ps_elp_sleep(wl);
1352 mutex_unlock(&wl->mutex);
1355 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1356 struct ieee80211_vif *vif,
1357 struct ieee80211_sta *sta,
1358 struct ieee80211_key_conf *key_conf)
1360 struct wl1271 *wl = hw->priv;
1367 static const u8 bcast_addr[ETH_ALEN] =
1368 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1370 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1372 addr = sta ? sta->addr : bcast_addr;
1374 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1375 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1376 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1377 key_conf->alg, key_conf->keyidx,
1378 key_conf->keylen, key_conf->flags);
1379 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1381 if (is_zero_ether_addr(addr)) {
1382 /* We dont support TX only encryption */
1387 mutex_lock(&wl->mutex);
1389 ret = wl1271_ps_elp_wakeup(wl, false);
1393 switch (key_conf->alg) {
1397 key_conf->hw_key_idx = key_conf->keyidx;
1400 key_type = KEY_TKIP;
1402 key_conf->hw_key_idx = key_conf->keyidx;
1403 tx_seq_32 = wl->tx_security_seq_32;
1404 tx_seq_16 = wl->tx_security_seq_16;
1409 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1410 tx_seq_32 = wl->tx_security_seq_32;
1411 tx_seq_16 = wl->tx_security_seq_16;
1414 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
1422 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1423 key_conf->keyidx, key_type,
1424 key_conf->keylen, key_conf->key,
1425 addr, tx_seq_32, tx_seq_16);
1427 wl1271_error("Could not add or replace key");
1433 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1434 key_conf->keyidx, key_type,
1435 key_conf->keylen, key_conf->key,
1438 wl1271_error("Could not remove key");
1444 wl1271_error("Unsupported key cmd 0x%x", cmd);
1452 wl1271_ps_elp_sleep(wl);
1455 mutex_unlock(&wl->mutex);
1461 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1462 struct cfg80211_scan_request *req)
1464 struct wl1271 *wl = hw->priv;
1469 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1472 ssid = req->ssids[0].ssid;
1473 len = req->ssids[0].ssid_len;
1476 mutex_lock(&wl->mutex);
1478 ret = wl1271_ps_elp_wakeup(wl, false);
1482 if (wl1271_11a_enabled())
1483 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1484 WL1271_SCAN_BAND_DUAL, 3);
1486 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1487 WL1271_SCAN_BAND_2_4_GHZ, 3);
1489 wl1271_ps_elp_sleep(wl);
1492 mutex_unlock(&wl->mutex);
1497 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1499 struct wl1271 *wl = hw->priv;
1502 mutex_lock(&wl->mutex);
1504 ret = wl1271_ps_elp_wakeup(wl, false);
1508 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1510 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1512 wl1271_ps_elp_sleep(wl);
1515 mutex_unlock(&wl->mutex);
1520 static u32 wl1271_enabled_rates_get(struct wl1271 *wl, u64 basic_rate_set)
1522 struct ieee80211_supported_band *band;
1523 u32 enabled_rates = 0;
1526 band = wl->hw->wiphy->bands[wl->band];
1527 for (bit = 0; bit < band->n_bitrates; bit++) {
1528 if (basic_rate_set & 0x1)
1529 enabled_rates |= band->bitrates[bit].hw_value;
1530 basic_rate_set >>= 1;
1533 return enabled_rates;
1536 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1537 struct ieee80211_vif *vif,
1538 struct ieee80211_bss_conf *bss_conf,
1541 enum wl1271_cmd_ps_mode mode;
1542 struct wl1271 *wl = hw->priv;
1545 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1547 mutex_lock(&wl->mutex);
1549 ret = wl1271_ps_elp_wakeup(wl, false);
1553 if ((changed & BSS_CHANGED_BSSID) &&
1555 * Now we know the correct bssid, so we send a new join command
1556 * and enable the BSSID filter
1558 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1559 wl->rx_config |= CFG_BSSID_FILTER_EN;
1560 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1561 ret = wl1271_cmd_build_null_data(wl);
1563 wl1271_warning("cmd buld null data failed %d",
1567 ret = wl1271_cmd_join(wl);
1569 wl1271_warning("cmd join failed %d", ret);
1575 if (changed & BSS_CHANGED_ASSOC) {
1576 if (bss_conf->assoc) {
1577 wl->aid = bss_conf->aid;
1578 wl->associated = true;
1581 * with wl1271, we don't need to update the
1582 * beacon_int and dtim_period, because the firmware
1583 * updates it by itself when the first beacon is
1584 * received after a join.
1586 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1590 ret = wl1271_acx_aid(wl, wl->aid);
1594 /* If we want to go in PSM but we're not there yet */
1595 if (wl->psm_requested && !wl->psm) {
1596 mode = STATION_POWER_SAVE_MODE;
1597 ret = wl1271_ps_set_mode(wl, mode);
1602 /* use defaults when not associated */
1603 wl->associated = false;
1609 if (changed & BSS_CHANGED_ERP_SLOT) {
1610 if (bss_conf->use_short_slot)
1611 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1613 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1615 wl1271_warning("Set slot time failed %d", ret);
1620 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1621 if (bss_conf->use_short_preamble)
1622 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1624 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1627 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1628 if (bss_conf->use_cts_prot)
1629 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1631 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1633 wl1271_warning("Set ctsprotect failed %d", ret);
1638 if (changed & BSS_CHANGED_BASIC_RATES) {
1639 wl->basic_rate_set = wl1271_enabled_rates_get(
1640 wl, bss_conf->basic_rates);
1642 ret = wl1271_acx_rate_policies(wl, wl->basic_rate_set);
1644 wl1271_warning("Set rate policies failed %d", ret);
1650 wl1271_ps_elp_sleep(wl);
1653 mutex_unlock(&wl->mutex);
1657 /* can't be const, mac80211 writes to this */
1658 static struct ieee80211_rate wl1271_rates[] = {
1660 .hw_value = CONF_HW_BIT_RATE_1MBPS,
1661 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
1663 .hw_value = CONF_HW_BIT_RATE_2MBPS,
1664 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
1665 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1667 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
1668 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
1669 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1671 .hw_value = CONF_HW_BIT_RATE_11MBPS,
1672 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
1673 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1675 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1676 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1678 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1679 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1681 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1682 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1684 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1685 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1687 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1688 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1690 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1691 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1693 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1694 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1696 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1697 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1700 /* can't be const, mac80211 writes to this */
1701 static struct ieee80211_channel wl1271_channels[] = {
1702 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
1703 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
1704 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
1705 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
1706 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
1707 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
1708 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
1709 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
1710 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
1711 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
1712 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
1713 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
1714 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
1717 /* can't be const, mac80211 writes to this */
1718 static struct ieee80211_supported_band wl1271_band_2ghz = {
1719 .channels = wl1271_channels,
1720 .n_channels = ARRAY_SIZE(wl1271_channels),
1721 .bitrates = wl1271_rates,
1722 .n_bitrates = ARRAY_SIZE(wl1271_rates),
1725 /* 5 GHz data rates for WL1273 */
1726 static struct ieee80211_rate wl1271_rates_5ghz[] = {
1728 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1729 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1731 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1732 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1734 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1735 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1737 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1738 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1740 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1741 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1743 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1744 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1746 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1747 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1749 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1750 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1753 /* 5 GHz band channels for WL1273 */
1754 static struct ieee80211_channel wl1271_channels_5ghz[] = {
1755 { .hw_value = 183, .center_freq = 4915},
1756 { .hw_value = 184, .center_freq = 4920},
1757 { .hw_value = 185, .center_freq = 4925},
1758 { .hw_value = 187, .center_freq = 4935},
1759 { .hw_value = 188, .center_freq = 4940},
1760 { .hw_value = 189, .center_freq = 4945},
1761 { .hw_value = 192, .center_freq = 4960},
1762 { .hw_value = 196, .center_freq = 4980},
1763 { .hw_value = 7, .center_freq = 5035},
1764 { .hw_value = 8, .center_freq = 5040},
1765 { .hw_value = 9, .center_freq = 5045},
1766 { .hw_value = 11, .center_freq = 5055},
1767 { .hw_value = 12, .center_freq = 5060},
1768 { .hw_value = 16, .center_freq = 5080},
1769 { .hw_value = 34, .center_freq = 5170},
1770 { .hw_value = 36, .center_freq = 5180},
1771 { .hw_value = 38, .center_freq = 5190},
1772 { .hw_value = 40, .center_freq = 5200},
1773 { .hw_value = 42, .center_freq = 5210},
1774 { .hw_value = 44, .center_freq = 5220},
1775 { .hw_value = 46, .center_freq = 5230},
1776 { .hw_value = 48, .center_freq = 5240},
1777 { .hw_value = 52, .center_freq = 5260},
1778 { .hw_value = 56, .center_freq = 5280},
1779 { .hw_value = 60, .center_freq = 5300},
1780 { .hw_value = 64, .center_freq = 5320},
1781 { .hw_value = 100, .center_freq = 5500},
1782 { .hw_value = 104, .center_freq = 5520},
1783 { .hw_value = 108, .center_freq = 5540},
1784 { .hw_value = 112, .center_freq = 5560},
1785 { .hw_value = 116, .center_freq = 5580},
1786 { .hw_value = 120, .center_freq = 5600},
1787 { .hw_value = 124, .center_freq = 5620},
1788 { .hw_value = 128, .center_freq = 5640},
1789 { .hw_value = 132, .center_freq = 5660},
1790 { .hw_value = 136, .center_freq = 5680},
1791 { .hw_value = 140, .center_freq = 5700},
1792 { .hw_value = 149, .center_freq = 5745},
1793 { .hw_value = 153, .center_freq = 5765},
1794 { .hw_value = 157, .center_freq = 5785},
1795 { .hw_value = 161, .center_freq = 5805},
1796 { .hw_value = 165, .center_freq = 5825},
1800 static struct ieee80211_supported_band wl1271_band_5ghz = {
1801 .channels = wl1271_channels_5ghz,
1802 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
1803 .bitrates = wl1271_rates_5ghz,
1804 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
1807 static const struct ieee80211_ops wl1271_ops = {
1808 .start = wl1271_op_start,
1809 .stop = wl1271_op_stop,
1810 .add_interface = wl1271_op_add_interface,
1811 .remove_interface = wl1271_op_remove_interface,
1812 .config = wl1271_op_config,
1813 /* .config_interface = wl1271_op_config_interface, */
1814 .prepare_multicast = wl1271_op_prepare_multicast,
1815 .configure_filter = wl1271_op_configure_filter,
1817 .set_key = wl1271_op_set_key,
1818 .hw_scan = wl1271_op_hw_scan,
1819 .bss_info_changed = wl1271_op_bss_info_changed,
1820 .set_rts_threshold = wl1271_op_set_rts_threshold,
1823 static int wl1271_register_hw(struct wl1271 *wl)
1827 if (wl->mac80211_registered)
1830 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
1832 ret = ieee80211_register_hw(wl->hw);
1834 wl1271_error("unable to register mac80211 hw: %d", ret);
1838 wl->mac80211_registered = true;
1840 wl1271_notice("loaded");
1845 static int wl1271_init_ieee80211(struct wl1271 *wl)
1847 /* The tx descriptor buffer and the TKIP space. */
1848 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
1849 sizeof(struct wl1271_tx_hw_descr);
1852 /* FIXME: find a proper value */
1853 wl->hw->channel_change_time = 10000;
1855 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
1856 IEEE80211_HW_NOISE_DBM |
1857 IEEE80211_HW_BEACON_FILTER |
1858 IEEE80211_HW_SUPPORTS_PS;
1860 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
1861 wl->hw->wiphy->max_scan_ssids = 1;
1862 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
1864 if (wl1271_11a_enabled())
1865 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
1867 SET_IEEE80211_DEV(wl->hw, &wl->spi->dev);
1872 static void wl1271_device_release(struct device *dev)
1877 static struct platform_device wl1271_device = {
1881 /* device model insists to have a release function */
1883 .release = wl1271_device_release,
1887 #define WL1271_DEFAULT_CHANNEL 0
1888 static int __devinit wl1271_probe(struct spi_device *spi)
1890 struct wl12xx_platform_data *pdata;
1891 struct ieee80211_hw *hw;
1894 static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
1896 pdata = spi->dev.platform_data;
1898 wl1271_error("no platform data");
1902 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
1904 wl1271_error("could not alloc ieee80211_hw");
1909 memset(wl, 0, sizeof(*wl));
1911 INIT_LIST_HEAD(&wl->list);
1914 dev_set_drvdata(&spi->dev, wl);
1917 skb_queue_head_init(&wl->tx_queue);
1919 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
1920 wl->channel = WL1271_DEFAULT_CHANNEL;
1921 wl->scanning = false;
1922 wl->default_key = 0;
1924 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1925 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1928 wl->psm_requested = false;
1929 wl->psm_entry_retry = 0;
1930 wl->associated = false;
1931 wl->tx_queue_stopped = false;
1932 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1933 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
1934 wl->band = IEEE80211_BAND_2GHZ;
1937 wl->gpio_power = false;
1939 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
1940 wl->tx_frames[i] = NULL;
1942 spin_lock_init(&wl->wl_lock);
1945 * In case our MAC address is not correctly set,
1946 * we use a random but Nokia MAC.
1948 memcpy(wl->mac_addr, nokia_oui, 3);
1949 get_random_bytes(wl->mac_addr + 3, 3);
1951 wl->state = WL1271_STATE_OFF;
1952 mutex_init(&wl->mutex);
1954 /* This is the only SPI value that we need to set here, the rest
1955 * comes from the board-peripherals file */
1956 spi->bits_per_word = 32;
1958 ret = spi_setup(spi);
1960 wl1271_error("spi_setup failed");
1964 wl->set_power = pdata->set_power;
1965 if (!wl->set_power) {
1966 wl1271_error("set power function missing in platform data");
1973 wl1271_error("irq missing in platform data");
1978 ret = request_irq(wl->irq, wl1271_irq, 0, DRIVER_NAME, wl);
1980 wl1271_error("request_irq() failed: %d", ret);
1984 set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING);
1986 disable_irq(wl->irq);
1988 ret = platform_device_register(&wl1271_device);
1990 wl1271_error("couldn't register platform device");
1993 dev_set_drvdata(&wl1271_device.dev, wl);
1995 /* Apply default driver configuration. */
1996 wl1271_conf_init(wl);
1998 ret = wl1271_init_ieee80211(wl);
2002 ret = wl1271_register_hw(wl);
2006 wl1271_debugfs_init(wl);
2008 wl1271_notice("initialized");
2013 platform_device_unregister(&wl1271_device);
2016 free_irq(wl->irq, wl);
2019 ieee80211_free_hw(hw);
2024 static int __devexit wl1271_remove(struct spi_device *spi)
2026 struct wl1271 *wl = dev_get_drvdata(&spi->dev);
2028 ieee80211_unregister_hw(wl->hw);
2030 wl1271_debugfs_exit(wl);
2031 platform_device_unregister(&wl1271_device);
2032 free_irq(wl->irq, wl);
2033 kfree(wl->target_mem_map);
2039 kfree(wl->fw_status);
2040 kfree(wl->tx_res_if);
2042 ieee80211_free_hw(wl->hw);
2048 static struct spi_driver wl1271_spi_driver = {
2051 .bus = &spi_bus_type,
2052 .owner = THIS_MODULE,
2055 .probe = wl1271_probe,
2056 .remove = __devexit_p(wl1271_remove),
2059 static int __init wl1271_init(void)
2063 ret = spi_register_driver(&wl1271_spi_driver);
2065 wl1271_error("failed to register spi driver: %d", ret);
2073 static void __exit wl1271_exit(void)
2075 spi_unregister_driver(&wl1271_spi_driver);
2077 wl1271_notice("unloaded");
2080 module_init(wl1271_init);
2081 module_exit(wl1271_exit);
2083 MODULE_LICENSE("GPL");
2084 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2085 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
2086 MODULE_FIRMWARE(WL1271_FW_NAME);