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 static struct conf_drv_settings default_conf = {
52 .per_threshold = 7500,
53 .max_scan_compensation_time = 120000,
54 .nfs_sample_interval = 400,
57 .probe_req_compensation = 170,
58 .scan_window_compensation = 50,
60 .beacon_miss_threshold = 60,
61 .rate_adaptation_threshold = CONF_HW_BIT_RATE_12MBPS,
62 .rate_adaptation_snr = 0
65 .rx_msdu_life_time = 512000,
66 .packet_detection_threshold = 0,
67 .ps_poll_timeout = 15,
69 .rts_threshold = 2347,
70 .rx_cca_threshold = 0xFFEF,
71 .irq_blk_threshold = 0,
72 .irq_pkt_threshold = USHORT_MAX,
74 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
77 .tx_energy_detection = 0,
79 .enabled_rates = CONF_TX_RATE_MASK_UNSPECIFIED,
80 .short_retry_limit = 10,
81 .long_retry_limit = 10,
104 .aifsn = CONF_TX_AIFS_PIFS,
111 .aifsn = CONF_TX_AIFS_PIFS,
119 .channel_type = CONF_CHANNEL_TYPE_DCF,
120 .tsid = CONF_TX_AC_BE,
121 .ps_scheme = CONF_PS_SCHEME_LEGACY,
122 .ack_policy = CONF_ACK_POLICY_LEGACY,
127 .channel_type = CONF_CHANNEL_TYPE_DCF,
128 .tsid = CONF_TX_AC_BE,
129 .ps_scheme = CONF_PS_SCHEME_LEGACY,
130 .ack_policy = CONF_ACK_POLICY_LEGACY,
135 .channel_type = CONF_CHANNEL_TYPE_DCF,
136 .tsid = CONF_TX_AC_BE,
137 .ps_scheme = CONF_PS_SCHEME_LEGACY,
138 .ack_policy = CONF_ACK_POLICY_LEGACY,
143 .channel_type = CONF_CHANNEL_TYPE_DCF,
144 .tsid = CONF_TX_AC_BE,
145 .ps_scheme = CONF_PS_SCHEME_LEGACY,
146 .ack_policy = CONF_ACK_POLICY_LEGACY,
151 .channel_type = CONF_CHANNEL_TYPE_DCF,
152 .tsid = CONF_TX_AC_BE,
153 .ps_scheme = CONF_PS_SCHEME_LEGACY,
154 .ack_policy = CONF_ACK_POLICY_LEGACY,
159 .channel_type = CONF_CHANNEL_TYPE_DCF,
160 .tsid = CONF_TX_AC_BE,
161 .ps_scheme = CONF_PS_SCHEME_LEGACY,
162 .ack_policy = CONF_ACK_POLICY_LEGACY,
167 .channel_type = CONF_CHANNEL_TYPE_DCF,
168 .tsid = CONF_TX_AC_BE,
169 .ps_scheme = CONF_PS_SCHEME_LEGACY,
170 .ack_policy = CONF_ACK_POLICY_LEGACY,
174 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
175 .tx_compl_timeout = 5,
176 .tx_compl_threshold = 5
179 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
180 .listen_interval = 0,
181 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
182 .bcn_filt_ie_count = 1,
185 .ie = WLAN_EID_CHANNEL_SWITCH,
186 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
189 .synch_fail_thold = 5,
190 .bss_lose_timeout = 100,
191 .beacon_rx_timeout = 10000,
192 .broadcast_timeout = 20000,
193 .rx_broadcast_in_ps = 1,
194 .ps_poll_threshold = 4,
195 .sig_trigger_count = 2,
200 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
201 .type = CONF_TRIG_EVENT_TYPE_EDGE,
202 .direction = CONF_TRIG_EVENT_DIR_LOW,
210 .metric = CONF_TRIG_METRIC_RSSI_BEACON,
211 .type = CONF_TRIG_EVENT_TYPE_EDGE,
212 .direction = CONF_TRIG_EVENT_DIR_HIGH,
219 .rssi_bcn_avg_weight = 10,
220 .rssi_pkt_avg_weight = 10,
221 .snr_bcn_avg_weight = 10,
222 .snr_pkt_avg_weight = 10
224 .bet_enable = CONF_BET_MODE_ENABLE,
225 .bet_max_consecutive = 10,
226 .psm_entry_retries = 3
234 0x18, 0x10, 0x05, 0xfb, 0xf0, 0xe8,
241 0x18, 0x10, 0x05, 0xf6, 0xf0, 0xe8,
248 0x18, 0x10, 0x05, 0xfb, 0xf0, 0xe8,
254 .ref_clk = CONF_REF_CLK_38_4_E,
256 .clk_valid_on_wakeup = 0,
258 .single_dual_band = CONF_SINGLE_BAND,
259 .tx_bip_fem_autodetect = 1,
260 .tx_bip_fem_manufacturer = 1,
263 .srf1 = { 0, 0, 0, 0, 0, 0, 0, 0,
264 0, 0, 0, 0, 0, 0, 0, 0 },
265 .srf2 = { 0, 0, 0, 0, 0, 0, 0, 0,
266 0, 0, 0, 0, 0, 0, 0, 0 },
267 .srf3 = { 0, 0, 0, 0, 0, 0, 0, 0,
268 0, 0, 0, 0, 0, 0, 0, 0 },
269 .sr_debug_table = { 0, 0, 0, 0, 0, 0, 0, 0,
270 0, 0, 0, 0, 0, 0, 0, 0 },
272 .sr_sen_n_p_gain = 0,
277 .rx_trace_loss = 0x24,
278 .tx_trace_loss = 0x0,
279 .rx_rssi_and_proc_compens = {
280 0xec, 0xf6, 0x00, 0x0c, 0x18, 0xf8,
281 0xfc, 0x00, 0x08, 0x10, 0xf0, 0xf8,
283 .rx_trace_loss_5 = { 0, 0, 0, 0, 0, 0, 0 },
284 .tx_trace_loss_5 = { 0, 0, 0, 0, 0, 0, 0 },
285 .rx_rssi_and_proc_compens_5 = {
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 .tx_ref_pd_voltage = 0x1a9,
290 .tx_ref_power = 0x80,
292 .tx_rate_limits_normal = {
293 0x1d, 0x1f, 0x24, 0x28, 0x28, 0x29 },
294 .tx_rate_limits_degraded = {
295 0x19, 0x1f, 0x22, 0x23, 0x27, 0x28 },
296 .tx_rate_limits_extreme = {
297 0x19, 0x1c, 0x1e, 0x20, 0x24, 0x25 },
298 .tx_channel_limits_11b = {
299 0x22, 0x50, 0x50, 0x50, 0x50, 0x50,
300 0x50, 0x50, 0x50, 0x50, 0x22, 0x50,
302 .tx_channel_limits_ofdm = {
303 0x20, 0x50, 0x50, 0x50, 0x50, 0x50,
304 0x50, 0x50, 0x50, 0x50, 0x20, 0x50,
306 .tx_pdv_rate_offsets = {
307 0x07, 0x08, 0x04, 0x02, 0x02, 0x00 },
309 0x11, 0x11, 0x15, 0x11, 0x15, 0x0f },
310 .rx_fem_insertion_loss = 0x0e,
311 .degraded_low_to_normal_threshold = 0x1e,
312 .degraded_normal_to_high_threshold = 0x2d,
313 .tx_ref_pd_voltage_5 = {
314 0x0190, 0x01a4, 0x01c3, 0x01d8,
317 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 },
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
320 .tx_rate_limits_normal_5 = {
321 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
322 .tx_rate_limits_degraded_5 = {
323 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
324 .tx_rate_limits_extreme_5 = {
325 0x1b, 0x1e, 0x21, 0x23, 0x27, 0x00 },
326 .tx_channel_limits_ofdm_5 = {
327 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
328 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
329 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
330 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50,
332 .tx_pdv_rate_offsets_5 = {
333 0x01, 0x02, 0x02, 0x02, 0x02, 0x00 },
335 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
336 .rx_fem_insertion_loss_5 = {
337 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 },
338 .degraded_low_to_normal_threshold_5 = 0x00,
339 .degraded_normal_to_high_threshold_5 = 0x00
344 static LIST_HEAD(wl_list);
346 static void wl1271_conf_init(struct wl1271 *wl)
350 * This function applies the default configuration to the driver. This
351 * function is invoked upon driver load (spi probe.)
353 * The configuration is stored in a run-time structure in order to
354 * facilitate for run-time adjustment of any of the parameters. Making
355 * changes to the configuration structure will apply the new values on
356 * the next interface up (wl1271_op_start.)
359 /* apply driver default configuration */
360 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
362 if (wl1271_11a_enabled())
363 wl->conf.init.genparam.single_dual_band = CONF_DUAL_BAND;
367 static int wl1271_plt_init(struct wl1271 *wl)
371 ret = wl1271_cmd_general_parms(wl);
375 ret = wl1271_cmd_radio_parms(wl);
379 ret = wl1271_acx_init_mem_config(wl);
383 ret = wl1271_cmd_data_path(wl, wl->channel, 1);
390 static void wl1271_disable_interrupts(struct wl1271 *wl)
392 disable_irq(wl->irq);
395 static void wl1271_power_off(struct wl1271 *wl)
397 wl->set_power(false);
400 static void wl1271_power_on(struct wl1271 *wl)
405 static void wl1271_fw_status(struct wl1271 *wl,
406 struct wl1271_fw_status *status)
411 wl1271_spi_read(wl, FW_STATUS_ADDR, status,
412 sizeof(*status), false);
414 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
415 "drv_rx_counter = %d, tx_results_counter = %d)",
417 status->fw_rx_counter,
418 status->drv_rx_counter,
419 status->tx_results_counter);
421 /* update number of available TX blocks */
422 for (i = 0; i < NUM_TX_QUEUES; i++) {
423 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
424 wl->tx_blocks_freed[i];
426 wl->tx_blocks_freed[i] =
427 le32_to_cpu(status->tx_released_blks[i]);
428 wl->tx_blocks_available += cnt;
432 /* if more blocks are available now, schedule some tx work */
433 if (total && !skb_queue_empty(&wl->tx_queue))
434 ieee80211_queue_work(wl->hw, &wl->tx_work);
436 /* update the host-chipset time offset */
437 wl->time_offset = jiffies_to_usecs(jiffies) -
438 le32_to_cpu(status->fw_localtime);
441 static void wl1271_irq_work(struct work_struct *work)
446 container_of(work, struct wl1271, irq_work);
448 mutex_lock(&wl->mutex);
450 wl1271_debug(DEBUG_IRQ, "IRQ work");
452 if (wl->state == WL1271_STATE_OFF)
455 ret = wl1271_ps_elp_wakeup(wl, true);
459 wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
461 wl1271_fw_status(wl, wl->fw_status);
462 intr = le32_to_cpu(wl->fw_status->intr);
464 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
468 intr &= WL1271_INTR_MASK;
470 if (intr & WL1271_ACX_INTR_EVENT_A) {
471 bool do_ack = (intr & WL1271_ACX_INTR_EVENT_B) ? false : true;
472 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
473 wl1271_event_handle(wl, 0, do_ack);
476 if (intr & WL1271_ACX_INTR_EVENT_B) {
477 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
478 wl1271_event_handle(wl, 1, true);
481 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
482 wl1271_debug(DEBUG_IRQ,
483 "WL1271_ACX_INTR_INIT_COMPLETE");
485 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
486 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
488 if (intr & WL1271_ACX_INTR_DATA) {
489 u8 tx_res_cnt = wl->fw_status->tx_results_counter -
490 wl->tx_results_count;
492 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
494 /* check for tx results */
496 wl1271_tx_complete(wl, tx_res_cnt);
498 wl1271_rx(wl, wl->fw_status);
502 wl1271_spi_write32(wl, ACX_REG_INTERRUPT_MASK,
503 WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
504 wl1271_ps_elp_sleep(wl);
507 mutex_unlock(&wl->mutex);
510 static irqreturn_t wl1271_irq(int irq, void *cookie)
515 wl1271_debug(DEBUG_IRQ, "IRQ");
519 /* complete the ELP completion */
520 spin_lock_irqsave(&wl->wl_lock, flags);
522 complete(wl->elp_compl);
523 wl->elp_compl = NULL;
526 ieee80211_queue_work(wl->hw, &wl->irq_work);
527 spin_unlock_irqrestore(&wl->wl_lock, flags);
532 static int wl1271_fetch_firmware(struct wl1271 *wl)
534 const struct firmware *fw;
537 ret = request_firmware(&fw, WL1271_FW_NAME, &wl->spi->dev);
540 wl1271_error("could not get firmware: %d", ret);
545 wl1271_error("firmware size is not multiple of 32 bits: %zu",
551 wl->fw_len = fw->size;
552 wl->fw = vmalloc(wl->fw_len);
555 wl1271_error("could not allocate memory for the firmware");
560 memcpy(wl->fw, fw->data, wl->fw_len);
565 release_firmware(fw);
570 static int wl1271_fetch_nvs(struct wl1271 *wl)
572 const struct firmware *fw;
575 ret = request_firmware(&fw, WL1271_NVS_NAME, &wl->spi->dev);
578 wl1271_error("could not get nvs file: %d", ret);
583 wl1271_error("nvs size is not multiple of 32 bits: %zu",
589 wl->nvs_len = fw->size;
590 wl->nvs = kmalloc(wl->nvs_len, GFP_KERNEL);
593 wl1271_error("could not allocate memory for the nvs file");
598 memcpy(wl->nvs, fw->data, wl->nvs_len);
603 release_firmware(fw);
608 static void wl1271_fw_wakeup(struct wl1271 *wl)
612 elp_reg = ELPCTRL_WAKE_UP;
613 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
616 static int wl1271_setup(struct wl1271 *wl)
618 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
622 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
623 if (!wl->tx_res_if) {
624 kfree(wl->fw_status);
628 INIT_WORK(&wl->irq_work, wl1271_irq_work);
629 INIT_WORK(&wl->tx_work, wl1271_tx_work);
633 static int wl1271_chip_wakeup(struct wl1271 *wl)
635 struct wl1271_partition_set partition;
639 msleep(WL1271_POWER_ON_SLEEP);
640 wl1271_spi_reset(wl);
643 /* We don't need a real memory partition here, because we only want
644 * to use the registers at this point. */
645 memset(&partition, 0, sizeof(partition));
646 partition.reg.start = REGISTERS_BASE;
647 partition.reg.size = REGISTERS_DOWN_SIZE;
648 wl1271_set_partition(wl, &partition);
650 /* ELP module wake up */
651 wl1271_fw_wakeup(wl);
653 /* whal_FwCtrl_BootSm() */
655 /* 0. read chip id from CHIP_ID */
656 wl->chip.id = wl1271_spi_read32(wl, CHIP_ID_B);
658 /* 1. check if chip id is valid */
660 switch (wl->chip.id) {
661 case CHIP_ID_1271_PG10:
662 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
665 ret = wl1271_setup(wl);
669 case CHIP_ID_1271_PG20:
670 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
673 ret = wl1271_setup(wl);
678 wl1271_error("unsupported chip id: 0x%x", wl->chip.id);
683 if (wl->fw == NULL) {
684 ret = wl1271_fetch_firmware(wl);
689 /* No NVS from netlink, try to get it from the filesystem */
690 if (wl->nvs == NULL) {
691 ret = wl1271_fetch_nvs(wl);
699 wl1271_power_off(wl);
705 int wl1271_plt_start(struct wl1271 *wl)
709 mutex_lock(&wl->mutex);
711 wl1271_notice("power up");
713 if (wl->state != WL1271_STATE_OFF) {
714 wl1271_error("cannot go into PLT state because not "
715 "in off state: %d", wl->state);
720 wl->state = WL1271_STATE_PLT;
722 ret = wl1271_chip_wakeup(wl);
726 ret = wl1271_boot(wl);
730 wl1271_notice("firmware booted in PLT mode (%s)", wl->chip.fw_ver);
732 ret = wl1271_plt_init(wl);
734 goto out_irq_disable;
736 /* Make sure power saving is disabled */
737 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
739 goto out_irq_disable;
744 wl1271_disable_interrupts(wl);
747 wl1271_power_off(wl);
750 mutex_unlock(&wl->mutex);
755 int wl1271_plt_stop(struct wl1271 *wl)
759 mutex_lock(&wl->mutex);
761 wl1271_notice("power down");
763 if (wl->state != WL1271_STATE_PLT) {
764 wl1271_error("cannot power down because not in PLT "
765 "state: %d", wl->state);
770 wl1271_disable_interrupts(wl);
771 wl1271_power_off(wl);
773 wl->state = WL1271_STATE_OFF;
777 mutex_unlock(&wl->mutex);
783 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
785 struct wl1271 *wl = hw->priv;
787 skb_queue_tail(&wl->tx_queue, skb);
790 * The chip specific setup must run before the first TX packet -
791 * before that, the tx_work will not be initialized!
794 ieee80211_queue_work(wl->hw, &wl->tx_work);
797 * The workqueue is slow to process the tx_queue and we need stop
798 * the queue here, otherwise the queue will get too long.
800 if (skb_queue_len(&wl->tx_queue) >= WL1271_TX_QUEUE_MAX_LENGTH) {
801 ieee80211_stop_queues(wl->hw);
804 * FIXME: this is racy, the variable is not properly
805 * protected. Maybe fix this by removing the stupid
806 * variable altogether and checking the real queue state?
808 wl->tx_queue_stopped = true;
814 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
817 struct net_device *dev;
818 struct wireless_dev *wdev;
820 struct ieee80211_hw *hw;
822 struct wl1271 *wl_temp;
823 struct in_device *idev;
824 struct in_ifaddr *ifa = arg;
827 /* FIXME: this ugly function should probably be implemented in the
828 * mac80211, and here should only be a simple callback handling actual
829 * setting of the filters. Now we need to dig up references to
830 * various structures to gain access to what we need.
831 * Also, because of this, there is no "initial" setting of the filter
832 * in "op_start", because we don't want to dig up struct net_device
833 * there - the filter will be set upon first change of the interface
836 dev = ifa->ifa_dev->dev;
838 wdev = dev->ieee80211_ptr;
846 hw = wiphy_priv(wiphy);
850 /* Check that the interface is one supported by this driver. */
852 list_for_each_entry(wl, &wl_list, list) {
859 /* Get the interface IP address for the device. "ifa" will become
861 - there is no IPV4 protocol address configured
862 - there are multiple (virtual) IPV4 addresses configured
863 When "ifa" is NULL, filtering will be disabled.
868 ifa = idev->ifa_list;
870 if (ifa && ifa->ifa_next)
873 mutex_lock(&wl->mutex);
875 if (wl->state == WL1271_STATE_OFF)
878 ret = wl1271_ps_elp_wakeup(wl, false);
882 ret = wl1271_acx_arp_ip_filter(wl, true,
883 (u8 *)&ifa->ifa_address,
886 ret = wl1271_acx_arp_ip_filter(wl, false, NULL,
888 wl1271_ps_elp_sleep(wl);
891 mutex_unlock(&wl->mutex);
896 static struct notifier_block wl1271_dev_notifier = {
897 .notifier_call = wl1271_dev_notify,
901 static int wl1271_op_start(struct ieee80211_hw *hw)
903 struct wl1271 *wl = hw->priv;
906 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
908 mutex_lock(&wl->mutex);
910 if (wl->state != WL1271_STATE_OFF) {
911 wl1271_error("cannot start because not in off state: %d",
917 ret = wl1271_chip_wakeup(wl);
921 ret = wl1271_boot(wl);
925 ret = wl1271_hw_init(wl);
927 goto out_irq_disable;
929 wl->state = WL1271_STATE_ON;
931 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
936 wl1271_disable_interrupts(wl);
939 wl1271_power_off(wl);
942 mutex_unlock(&wl->mutex);
945 list_add(&wl->list, &wl_list);
946 register_inetaddr_notifier(&wl1271_dev_notifier);
952 static void wl1271_op_stop(struct ieee80211_hw *hw)
954 struct wl1271 *wl = hw->priv;
959 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
961 unregister_inetaddr_notifier(&wl1271_dev_notifier);
964 mutex_lock(&wl->mutex);
966 WARN_ON(wl->state != WL1271_STATE_ON);
969 mutex_unlock(&wl->mutex);
970 ieee80211_scan_completed(wl->hw, true);
971 mutex_lock(&wl->mutex);
972 wl->scanning = false;
975 wl->state = WL1271_STATE_OFF;
977 wl1271_disable_interrupts(wl);
979 mutex_unlock(&wl->mutex);
981 cancel_work_sync(&wl->irq_work);
982 cancel_work_sync(&wl->tx_work);
984 mutex_lock(&wl->mutex);
986 /* let's notify MAC80211 about the remaining pending TX frames */
988 wl1271_power_off(wl);
990 memset(wl->bssid, 0, ETH_ALEN);
991 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
993 wl->bss_type = MAX_BSS_TYPE;
994 wl->band = IEEE80211_BAND_2GHZ;
999 wl->psm_entry_retry = 0;
1000 wl->tx_queue_stopped = false;
1001 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1002 wl->tx_blocks_available = 0;
1003 wl->tx_results_count = 0;
1004 wl->tx_packets_count = 0;
1005 wl->tx_security_last_seq = 0;
1006 wl->tx_security_seq_16 = 0;
1007 wl->tx_security_seq_32 = 0;
1008 wl->time_offset = 0;
1009 wl->session_counter = 0;
1012 for (i = 0; i < NUM_TX_QUEUES; i++)
1013 wl->tx_blocks_freed[i] = 0;
1015 wl1271_debugfs_reset(wl);
1016 mutex_unlock(&wl->mutex);
1019 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1020 struct ieee80211_if_init_conf *conf)
1022 struct wl1271 *wl = hw->priv;
1025 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1026 conf->type, conf->mac_addr);
1028 mutex_lock(&wl->mutex);
1034 wl->vif = conf->vif;
1036 switch (conf->type) {
1037 case NL80211_IFTYPE_STATION:
1038 wl->bss_type = BSS_TYPE_STA_BSS;
1040 case NL80211_IFTYPE_ADHOC:
1041 wl->bss_type = BSS_TYPE_IBSS;
1048 /* FIXME: what if conf->mac_addr changes? */
1051 mutex_unlock(&wl->mutex);
1055 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1056 struct ieee80211_if_init_conf *conf)
1058 struct wl1271 *wl = hw->priv;
1060 mutex_lock(&wl->mutex);
1061 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1063 mutex_unlock(&wl->mutex);
1067 static int wl1271_op_config_interface(struct ieee80211_hw *hw,
1068 struct ieee80211_vif *vif,
1069 struct ieee80211_if_conf *conf)
1071 struct wl1271 *wl = hw->priv;
1072 struct sk_buff *beacon;
1075 wl1271_debug(DEBUG_MAC80211, "mac80211 config_interface bssid %pM",
1077 wl1271_dump_ascii(DEBUG_MAC80211, "ssid: ", conf->ssid,
1080 mutex_lock(&wl->mutex);
1082 ret = wl1271_ps_elp_wakeup(wl, false);
1086 if (memcmp(wl->bssid, conf->bssid, ETH_ALEN)) {
1087 wl1271_debug(DEBUG_MAC80211, "bssid changed");
1089 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
1091 ret = wl1271_cmd_join(wl);
1095 ret = wl1271_cmd_build_null_data(wl);
1100 wl->ssid_len = conf->ssid_len;
1102 memcpy(wl->ssid, conf->ssid, wl->ssid_len);
1104 if (conf->changed & IEEE80211_IFCC_BEACON) {
1105 beacon = ieee80211_beacon_get(hw, vif);
1106 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1107 beacon->data, beacon->len);
1110 dev_kfree_skb(beacon);
1114 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE,
1115 beacon->data, beacon->len);
1117 dev_kfree_skb(beacon);
1124 wl1271_ps_elp_sleep(wl);
1127 mutex_unlock(&wl->mutex);
1133 static int wl1271_join_channel(struct wl1271 *wl, int channel)
1136 /* we need to use a dummy BSSID for now */
1137 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1140 /* disable mac filter, so we hear everything */
1141 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1143 wl->channel = channel;
1144 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1146 ret = wl1271_cmd_join(wl);
1156 static int wl1271_unjoin_channel(struct wl1271 *wl)
1160 /* to stop listening to a channel, we disconnect */
1161 ret = wl1271_cmd_disconnect(wl);
1167 memset(wl->bssid, 0, ETH_ALEN);
1168 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1174 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1176 struct wl1271 *wl = hw->priv;
1177 struct ieee80211_conf *conf = &hw->conf;
1178 int channel, ret = 0;
1180 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1182 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1184 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1186 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1188 mutex_lock(&wl->mutex);
1190 wl->band = conf->channel->band;
1192 ret = wl1271_ps_elp_wakeup(wl, false);
1196 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1197 if (conf->flags & IEEE80211_CONF_IDLE && wl->joined)
1198 wl1271_unjoin_channel(wl);
1200 wl1271_join_channel(wl, channel);
1203 /* if the channel changes while joined, join again */
1204 if (channel != wl->channel && wl->joined)
1205 wl1271_join_channel(wl, channel);
1207 if (conf->flags & IEEE80211_CONF_PS && !wl->psm_requested) {
1208 wl1271_info("psm enabled");
1210 wl->psm_requested = true;
1213 * We enter PSM only if we're already associated.
1214 * If we're not, we'll enter it when joining an SSID,
1215 * through the bss_info_changed() hook.
1217 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE);
1218 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1219 wl->psm_requested) {
1220 wl1271_info("psm disabled");
1222 wl->psm_requested = false;
1225 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE);
1228 if (conf->power_level != wl->power_level) {
1229 ret = wl1271_acx_tx_power(wl, conf->power_level);
1233 wl->power_level = conf->power_level;
1237 wl1271_ps_elp_sleep(wl);
1240 mutex_unlock(&wl->mutex);
1245 struct wl1271_filter_params {
1248 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1251 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
1252 struct dev_addr_list *mc_list)
1254 struct wl1271_filter_params *fp;
1257 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1259 wl1271_error("Out of memory setting filters.");
1263 /* update multicast filtering parameters */
1265 if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
1267 fp->enabled = false;
1270 fp->mc_list_length = 0;
1271 for (i = 0; i < mc_count; i++) {
1272 if (mc_list->da_addrlen == ETH_ALEN) {
1273 memcpy(fp->mc_list[fp->mc_list_length],
1274 mc_list->da_addr, ETH_ALEN);
1275 fp->mc_list_length++;
1277 wl1271_warning("Unknown mc address length.");
1278 mc_list = mc_list->next;
1281 return (u64)(unsigned long)fp;
1284 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1287 FIF_BCN_PRBRESP_PROMISC | \
1291 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1292 unsigned int changed,
1293 unsigned int *total, u64 multicast)
1295 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1296 struct wl1271 *wl = hw->priv;
1299 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1301 mutex_lock(&wl->mutex);
1303 if (wl->state == WL1271_STATE_OFF)
1306 ret = wl1271_ps_elp_wakeup(wl, false);
1310 *total &= WL1271_SUPPORTED_FILTERS;
1311 changed &= WL1271_SUPPORTED_FILTERS;
1313 if (*total & FIF_ALLMULTI)
1314 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1316 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1318 fp->mc_list_length);
1324 /* FIXME: We still need to set our filters properly */
1326 /* determine, whether supported filter values have changed */
1330 /* apply configured filters */
1331 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1336 wl1271_ps_elp_sleep(wl);
1339 mutex_unlock(&wl->mutex);
1342 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1343 struct ieee80211_vif *vif,
1344 struct ieee80211_sta *sta,
1345 struct ieee80211_key_conf *key_conf)
1347 struct wl1271 *wl = hw->priv;
1354 static const u8 bcast_addr[ETH_ALEN] =
1355 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1357 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1359 addr = sta ? sta->addr : bcast_addr;
1361 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1362 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1363 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1364 key_conf->alg, key_conf->keyidx,
1365 key_conf->keylen, key_conf->flags);
1366 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1368 if (is_zero_ether_addr(addr)) {
1369 /* We dont support TX only encryption */
1374 mutex_lock(&wl->mutex);
1376 ret = wl1271_ps_elp_wakeup(wl, false);
1380 switch (key_conf->alg) {
1384 key_conf->hw_key_idx = key_conf->keyidx;
1387 key_type = KEY_TKIP;
1389 key_conf->hw_key_idx = key_conf->keyidx;
1390 tx_seq_32 = wl->tx_security_seq_32;
1391 tx_seq_16 = wl->tx_security_seq_16;
1396 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1397 tx_seq_32 = wl->tx_security_seq_32;
1398 tx_seq_16 = wl->tx_security_seq_16;
1401 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
1409 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1410 key_conf->keyidx, key_type,
1411 key_conf->keylen, key_conf->key,
1412 addr, tx_seq_32, tx_seq_16);
1414 wl1271_error("Could not add or replace key");
1420 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1421 key_conf->keyidx, key_type,
1422 key_conf->keylen, key_conf->key,
1425 wl1271_error("Could not remove key");
1431 wl1271_error("Unsupported key cmd 0x%x", cmd);
1439 wl1271_ps_elp_sleep(wl);
1442 mutex_unlock(&wl->mutex);
1448 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1449 struct cfg80211_scan_request *req)
1451 struct wl1271 *wl = hw->priv;
1456 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1459 ssid = req->ssids[0].ssid;
1460 len = req->ssids[0].ssid_len;
1463 mutex_lock(&wl->mutex);
1465 ret = wl1271_ps_elp_wakeup(wl, false);
1469 if (wl1271_11a_enabled())
1470 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1471 WL1271_SCAN_BAND_DUAL, 3);
1473 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1474 WL1271_SCAN_BAND_2_4_GHZ, 3);
1476 wl1271_ps_elp_sleep(wl);
1479 mutex_unlock(&wl->mutex);
1484 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1486 struct wl1271 *wl = hw->priv;
1489 mutex_lock(&wl->mutex);
1491 ret = wl1271_ps_elp_wakeup(wl, false);
1495 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1497 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1499 wl1271_ps_elp_sleep(wl);
1502 mutex_unlock(&wl->mutex);
1507 static u32 wl1271_enabled_rates_get(struct wl1271 *wl, u64 basic_rate_set)
1509 struct ieee80211_supported_band *band;
1510 u32 enabled_rates = 0;
1513 band = wl->hw->wiphy->bands[wl->band];
1514 for (bit = 0; bit < band->n_bitrates; bit++) {
1515 if (basic_rate_set & 0x1)
1516 enabled_rates |= band->bitrates[bit].hw_value;
1517 basic_rate_set >>= 1;
1520 return enabled_rates;
1523 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1524 struct ieee80211_vif *vif,
1525 struct ieee80211_bss_conf *bss_conf,
1528 enum wl1271_cmd_ps_mode mode;
1529 struct wl1271 *wl = hw->priv;
1532 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1534 mutex_lock(&wl->mutex);
1536 ret = wl1271_ps_elp_wakeup(wl, false);
1540 if ((changed & BSS_CHANGED_BSSID) &&
1542 * Now we know the correct bssid, so we send a new join command
1543 * and enable the BSSID filter
1545 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1546 wl->rx_config |= CFG_BSSID_FILTER_EN;
1547 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1548 wl1271_cmd_join(wl);
1552 if (changed & BSS_CHANGED_ASSOC) {
1553 if (bss_conf->assoc) {
1554 wl->aid = bss_conf->aid;
1557 * with wl1271, we don't need to update the
1558 * beacon_int and dtim_period, because the firmware
1559 * updates it by itself when the first beacon is
1560 * received after a join.
1562 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1566 ret = wl1271_acx_aid(wl, wl->aid);
1570 /* If we want to go in PSM but we're not there yet */
1571 if (wl->psm_requested && !wl->psm) {
1572 mode = STATION_POWER_SAVE_MODE;
1573 ret = wl1271_ps_set_mode(wl, mode);
1578 /* use defaults when not associated */
1579 wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET;
1585 if (changed & BSS_CHANGED_ERP_SLOT) {
1586 if (bss_conf->use_short_slot)
1587 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1589 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1591 wl1271_warning("Set slot time failed %d", ret);
1596 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1597 if (bss_conf->use_short_preamble)
1598 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1600 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1603 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1604 if (bss_conf->use_cts_prot)
1605 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1607 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1609 wl1271_warning("Set ctsprotect failed %d", ret);
1614 if (changed & BSS_CHANGED_BASIC_RATES) {
1615 wl->basic_rate_set = wl1271_enabled_rates_get(
1616 wl, bss_conf->basic_rates);
1618 ret = wl1271_acx_rate_policies(wl, wl->basic_rate_set);
1620 wl1271_warning("Set rate policies failed %d", ret);
1626 wl1271_ps_elp_sleep(wl);
1629 mutex_unlock(&wl->mutex);
1633 /* can't be const, mac80211 writes to this */
1634 static struct ieee80211_rate wl1271_rates[] = {
1636 .hw_value = CONF_HW_BIT_RATE_1MBPS,
1637 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
1639 .hw_value = CONF_HW_BIT_RATE_2MBPS,
1640 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
1641 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1643 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
1644 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
1645 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1647 .hw_value = CONF_HW_BIT_RATE_11MBPS,
1648 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
1649 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1651 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1652 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1654 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1655 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1657 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1658 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1660 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1661 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1663 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1664 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1666 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1667 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1669 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1670 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1672 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1673 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1676 /* can't be const, mac80211 writes to this */
1677 static struct ieee80211_channel wl1271_channels[] = {
1678 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
1679 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
1680 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
1681 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
1682 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
1683 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
1684 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
1685 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
1686 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
1687 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
1688 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
1689 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
1690 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
1693 /* can't be const, mac80211 writes to this */
1694 static struct ieee80211_supported_band wl1271_band_2ghz = {
1695 .channels = wl1271_channels,
1696 .n_channels = ARRAY_SIZE(wl1271_channels),
1697 .bitrates = wl1271_rates,
1698 .n_bitrates = ARRAY_SIZE(wl1271_rates),
1701 /* 5 GHz data rates for WL1273 */
1702 static struct ieee80211_rate wl1271_rates_5ghz[] = {
1704 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1705 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1707 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1708 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1710 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1711 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1713 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1714 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1716 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1717 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1719 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1720 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1722 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1723 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1725 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1726 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1729 /* 5 GHz band channels for WL1273 */
1730 static struct ieee80211_channel wl1271_channels_5ghz[] = {
1731 { .hw_value = 183, .center_freq = 4915},
1732 { .hw_value = 184, .center_freq = 4920},
1733 { .hw_value = 185, .center_freq = 4925},
1734 { .hw_value = 187, .center_freq = 4935},
1735 { .hw_value = 188, .center_freq = 4940},
1736 { .hw_value = 189, .center_freq = 4945},
1737 { .hw_value = 192, .center_freq = 4960},
1738 { .hw_value = 196, .center_freq = 4980},
1739 { .hw_value = 7, .center_freq = 5035},
1740 { .hw_value = 8, .center_freq = 5040},
1741 { .hw_value = 9, .center_freq = 5045},
1742 { .hw_value = 11, .center_freq = 5055},
1743 { .hw_value = 12, .center_freq = 5060},
1744 { .hw_value = 16, .center_freq = 5080},
1745 { .hw_value = 34, .center_freq = 5170},
1746 { .hw_value = 36, .center_freq = 5180},
1747 { .hw_value = 38, .center_freq = 5190},
1748 { .hw_value = 40, .center_freq = 5200},
1749 { .hw_value = 42, .center_freq = 5210},
1750 { .hw_value = 44, .center_freq = 5220},
1751 { .hw_value = 46, .center_freq = 5230},
1752 { .hw_value = 48, .center_freq = 5240},
1753 { .hw_value = 52, .center_freq = 5260},
1754 { .hw_value = 56, .center_freq = 5280},
1755 { .hw_value = 60, .center_freq = 5300},
1756 { .hw_value = 64, .center_freq = 5320},
1757 { .hw_value = 100, .center_freq = 5500},
1758 { .hw_value = 104, .center_freq = 5520},
1759 { .hw_value = 108, .center_freq = 5540},
1760 { .hw_value = 112, .center_freq = 5560},
1761 { .hw_value = 116, .center_freq = 5580},
1762 { .hw_value = 120, .center_freq = 5600},
1763 { .hw_value = 124, .center_freq = 5620},
1764 { .hw_value = 128, .center_freq = 5640},
1765 { .hw_value = 132, .center_freq = 5660},
1766 { .hw_value = 136, .center_freq = 5680},
1767 { .hw_value = 140, .center_freq = 5700},
1768 { .hw_value = 149, .center_freq = 5745},
1769 { .hw_value = 153, .center_freq = 5765},
1770 { .hw_value = 157, .center_freq = 5785},
1771 { .hw_value = 161, .center_freq = 5805},
1772 { .hw_value = 165, .center_freq = 5825},
1776 static struct ieee80211_supported_band wl1271_band_5ghz = {
1777 .channels = wl1271_channels_5ghz,
1778 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
1779 .bitrates = wl1271_rates_5ghz,
1780 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
1783 static const struct ieee80211_ops wl1271_ops = {
1784 .start = wl1271_op_start,
1785 .stop = wl1271_op_stop,
1786 .add_interface = wl1271_op_add_interface,
1787 .remove_interface = wl1271_op_remove_interface,
1788 .config = wl1271_op_config,
1789 /* .config_interface = wl1271_op_config_interface, */
1790 .prepare_multicast = wl1271_op_prepare_multicast,
1791 .configure_filter = wl1271_op_configure_filter,
1793 .set_key = wl1271_op_set_key,
1794 .hw_scan = wl1271_op_hw_scan,
1795 .bss_info_changed = wl1271_op_bss_info_changed,
1796 .set_rts_threshold = wl1271_op_set_rts_threshold,
1799 static int wl1271_register_hw(struct wl1271 *wl)
1803 if (wl->mac80211_registered)
1806 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
1808 ret = ieee80211_register_hw(wl->hw);
1810 wl1271_error("unable to register mac80211 hw: %d", ret);
1814 wl->mac80211_registered = true;
1816 wl1271_notice("loaded");
1821 static int wl1271_init_ieee80211(struct wl1271 *wl)
1823 /* The tx descriptor buffer and the TKIP space. */
1824 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
1825 sizeof(struct wl1271_tx_hw_descr);
1828 /* FIXME: find a proper value */
1829 wl->hw->channel_change_time = 10000;
1831 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
1832 IEEE80211_HW_NOISE_DBM |
1833 IEEE80211_HW_BEACON_FILTER |
1834 IEEE80211_HW_SUPPORTS_PS;
1836 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
1837 wl->hw->wiphy->max_scan_ssids = 1;
1838 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
1840 if (wl1271_11a_enabled())
1841 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
1843 SET_IEEE80211_DEV(wl->hw, &wl->spi->dev);
1848 static void wl1271_device_release(struct device *dev)
1853 static struct platform_device wl1271_device = {
1857 /* device model insists to have a release function */
1859 .release = wl1271_device_release,
1863 #define WL1271_DEFAULT_CHANNEL 0
1864 static int __devinit wl1271_probe(struct spi_device *spi)
1866 struct wl12xx_platform_data *pdata;
1867 struct ieee80211_hw *hw;
1870 static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
1872 pdata = spi->dev.platform_data;
1874 wl1271_error("no platform data");
1878 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
1880 wl1271_error("could not alloc ieee80211_hw");
1885 memset(wl, 0, sizeof(*wl));
1887 INIT_LIST_HEAD(&wl->list);
1890 dev_set_drvdata(&spi->dev, wl);
1893 skb_queue_head_init(&wl->tx_queue);
1895 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
1896 wl->channel = WL1271_DEFAULT_CHANNEL;
1897 wl->scanning = false;
1898 wl->default_key = 0;
1900 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1901 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1904 wl->psm_requested = false;
1905 wl->psm_entry_retry = 0;
1906 wl->tx_queue_stopped = false;
1907 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1908 wl->basic_rate_set = WL1271_DEFAULT_BASIC_RATE_SET;
1909 wl->band = IEEE80211_BAND_2GHZ;
1913 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
1914 wl->tx_frames[i] = NULL;
1916 spin_lock_init(&wl->wl_lock);
1919 * In case our MAC address is not correctly set,
1920 * we use a random but Nokia MAC.
1922 memcpy(wl->mac_addr, nokia_oui, 3);
1923 get_random_bytes(wl->mac_addr + 3, 3);
1925 wl->state = WL1271_STATE_OFF;
1926 mutex_init(&wl->mutex);
1928 /* This is the only SPI value that we need to set here, the rest
1929 * comes from the board-peripherals file */
1930 spi->bits_per_word = 32;
1932 ret = spi_setup(spi);
1934 wl1271_error("spi_setup failed");
1938 wl->set_power = pdata->set_power;
1939 if (!wl->set_power) {
1940 wl1271_error("set power function missing in platform data");
1947 wl1271_error("irq missing in platform data");
1952 ret = request_irq(wl->irq, wl1271_irq, 0, DRIVER_NAME, wl);
1954 wl1271_error("request_irq() failed: %d", ret);
1958 set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING);
1960 disable_irq(wl->irq);
1962 ret = platform_device_register(&wl1271_device);
1964 wl1271_error("couldn't register platform device");
1967 dev_set_drvdata(&wl1271_device.dev, wl);
1969 /* Apply default driver configuration. */
1970 wl1271_conf_init(wl);
1972 ret = wl1271_init_ieee80211(wl);
1976 ret = wl1271_register_hw(wl);
1980 wl1271_debugfs_init(wl);
1982 wl1271_notice("initialized");
1987 platform_device_unregister(&wl1271_device);
1990 free_irq(wl->irq, wl);
1993 ieee80211_free_hw(hw);
1998 static int __devexit wl1271_remove(struct spi_device *spi)
2000 struct wl1271 *wl = dev_get_drvdata(&spi->dev);
2002 ieee80211_unregister_hw(wl->hw);
2004 wl1271_debugfs_exit(wl);
2005 platform_device_unregister(&wl1271_device);
2006 free_irq(wl->irq, wl);
2007 kfree(wl->target_mem_map);
2013 kfree(wl->fw_status);
2014 kfree(wl->tx_res_if);
2016 ieee80211_free_hw(wl->hw);
2022 static struct spi_driver wl1271_spi_driver = {
2025 .bus = &spi_bus_type,
2026 .owner = THIS_MODULE,
2029 .probe = wl1271_probe,
2030 .remove = __devexit_p(wl1271_remove),
2033 static int __init wl1271_init(void)
2037 ret = spi_register_driver(&wl1271_spi_driver);
2039 wl1271_error("failed to register spi driver: %d", ret);
2047 static void __exit wl1271_exit(void)
2049 spi_unregister_driver(&wl1271_spi_driver);
2051 wl1271_notice("unloaded");
2054 module_init(wl1271_init);
2055 module_exit(wl1271_exit);
2057 MODULE_LICENSE("GPL");
2058 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2059 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
2060 MODULE_FIRMWARE(WL1271_FW_NAME);