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>
34 #include "wl12xx_80211.h"
35 #include "wl1271_reg.h"
36 #include "wl1271_io.h"
37 #include "wl1271_event.h"
38 #include "wl1271_tx.h"
39 #include "wl1271_rx.h"
40 #include "wl1271_ps.h"
41 #include "wl1271_init.h"
42 #include "wl1271_debugfs.h"
43 #include "wl1271_cmd.h"
44 #include "wl1271_boot.h"
45 #include "wl1271_testmode.h"
47 #define WL1271_BOOT_RETRIES 3
49 static struct conf_drv_settings default_conf = {
51 .per_threshold = 7500,
52 .max_scan_compensation_time = 120000,
53 .nfs_sample_interval = 400,
56 .probe_req_compensation = 170,
57 .scan_window_compensation = 50,
59 .beacon_miss_threshold = 60,
60 .rate_adaptation_threshold = CONF_HW_BIT_RATE_12MBPS,
61 .rate_adaptation_snr = 0
64 .rx_msdu_life_time = 512000,
65 .packet_detection_threshold = 0,
66 .ps_poll_timeout = 15,
68 .rts_threshold = 2347,
69 .rx_cca_threshold = 0,
70 .irq_blk_threshold = 0xFFFF,
71 .irq_pkt_threshold = 0,
73 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
76 .tx_energy_detection = 0,
78 .enabled_rates = CONF_HW_BIT_RATE_1MBPS |
79 CONF_HW_BIT_RATE_2MBPS,
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 = 700,
176 .tx_compl_threshold = 4
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 = 10,
190 .bss_lose_timeout = 100,
191 .beacon_rx_timeout = 10000,
192 .broadcast_timeout = 20000,
193 .rx_broadcast_in_ps = 1,
194 .ps_poll_threshold = 20,
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
238 .host_clk_settling_time = 5000,
239 .host_fast_wakeup_support = false
243 static LIST_HEAD(wl_list);
245 static void wl1271_conf_init(struct wl1271 *wl)
249 * This function applies the default configuration to the driver. This
250 * function is invoked upon driver load (spi probe.)
252 * The configuration is stored in a run-time structure in order to
253 * facilitate for run-time adjustment of any of the parameters. Making
254 * changes to the configuration structure will apply the new values on
255 * the next interface up (wl1271_op_start.)
258 /* apply driver default configuration */
259 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
263 static int wl1271_plt_init(struct wl1271 *wl)
265 struct conf_tx_ac_category *conf_ac;
266 struct conf_tx_tid *conf_tid;
269 ret = wl1271_cmd_general_parms(wl);
273 ret = wl1271_cmd_radio_parms(wl);
277 ret = wl1271_init_templates_config(wl);
281 ret = wl1271_acx_init_mem_config(wl);
285 /* PHY layer config */
286 ret = wl1271_init_phy_config(wl);
288 goto out_free_memmap;
290 ret = wl1271_acx_dco_itrim_params(wl);
292 goto out_free_memmap;
294 /* Initialize connection monitoring thresholds */
295 ret = wl1271_acx_conn_monit_params(wl);
297 goto out_free_memmap;
299 /* Bluetooth WLAN coexistence */
300 ret = wl1271_init_pta(wl);
302 goto out_free_memmap;
304 /* Energy detection */
305 ret = wl1271_init_energy_detection(wl);
307 goto out_free_memmap;
309 /* Default fragmentation threshold */
310 ret = wl1271_acx_frag_threshold(wl);
312 goto out_free_memmap;
314 /* Default TID configuration */
315 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
316 conf_tid = &wl->conf.tx.tid_conf[i];
317 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
318 conf_tid->channel_type,
321 conf_tid->ack_policy,
322 conf_tid->apsd_conf[0],
323 conf_tid->apsd_conf[1]);
325 goto out_free_memmap;
328 /* Default AC configuration */
329 for (i = 0; i < wl->conf.tx.ac_conf_count; i++) {
330 conf_ac = &wl->conf.tx.ac_conf[i];
331 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
332 conf_ac->cw_max, conf_ac->aifsn,
333 conf_ac->tx_op_limit);
335 goto out_free_memmap;
338 /* Enable data path */
339 ret = wl1271_cmd_data_path(wl, 1);
341 goto out_free_memmap;
343 /* Configure for CAM power saving (ie. always active) */
344 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
346 goto out_free_memmap;
349 ret = wl1271_acx_pm_config(wl);
351 goto out_free_memmap;
356 kfree(wl->target_mem_map);
357 wl->target_mem_map = NULL;
362 static void wl1271_power_off(struct wl1271 *wl)
364 wl->set_power(false);
365 clear_bit(WL1271_FLAG_GPIO_POWER, &wl->flags);
368 static void wl1271_power_on(struct wl1271 *wl)
371 set_bit(WL1271_FLAG_GPIO_POWER, &wl->flags);
374 static void wl1271_fw_status(struct wl1271 *wl,
375 struct wl1271_fw_status *status)
380 wl1271_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
382 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
383 "drv_rx_counter = %d, tx_results_counter = %d)",
385 status->fw_rx_counter,
386 status->drv_rx_counter,
387 status->tx_results_counter);
389 /* update number of available TX blocks */
390 for (i = 0; i < NUM_TX_QUEUES; i++) {
391 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
392 wl->tx_blocks_freed[i];
394 wl->tx_blocks_freed[i] =
395 le32_to_cpu(status->tx_released_blks[i]);
396 wl->tx_blocks_available += cnt;
400 /* if more blocks are available now, schedule some tx work */
401 if (total && !skb_queue_empty(&wl->tx_queue))
402 ieee80211_queue_work(wl->hw, &wl->tx_work);
404 /* update the host-chipset time offset */
405 wl->time_offset = jiffies_to_usecs(jiffies) -
406 le32_to_cpu(status->fw_localtime);
409 static void wl1271_irq_work(struct work_struct *work)
414 container_of(work, struct wl1271, irq_work);
416 mutex_lock(&wl->mutex);
418 wl1271_debug(DEBUG_IRQ, "IRQ work");
420 if (wl->state == WL1271_STATE_OFF)
423 ret = wl1271_ps_elp_wakeup(wl, true);
427 wl1271_write32(wl, ACX_REG_INTERRUPT_MASK, WL1271_ACX_INTR_ALL);
429 wl1271_fw_status(wl, wl->fw_status);
430 intr = le32_to_cpu(wl->fw_status->intr);
432 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
436 intr &= WL1271_INTR_MASK;
438 if (intr & WL1271_ACX_INTR_EVENT_A) {
439 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
440 wl1271_event_handle(wl, 0);
443 if (intr & WL1271_ACX_INTR_EVENT_B) {
444 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
445 wl1271_event_handle(wl, 1);
448 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
449 wl1271_debug(DEBUG_IRQ,
450 "WL1271_ACX_INTR_INIT_COMPLETE");
452 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
453 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
455 if (intr & WL1271_ACX_INTR_DATA) {
456 u8 tx_res_cnt = wl->fw_status->tx_results_counter -
457 wl->tx_results_count;
459 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
461 /* check for tx results */
463 wl1271_tx_complete(wl, tx_res_cnt);
465 wl1271_rx(wl, wl->fw_status);
469 wl1271_write32(wl, ACX_REG_INTERRUPT_MASK,
470 WL1271_ACX_INTR_ALL & ~(WL1271_INTR_MASK));
471 wl1271_ps_elp_sleep(wl);
474 mutex_unlock(&wl->mutex);
477 static int wl1271_fetch_firmware(struct wl1271 *wl)
479 const struct firmware *fw;
482 ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
485 wl1271_error("could not get firmware: %d", ret);
490 wl1271_error("firmware size is not multiple of 32 bits: %zu",
496 wl->fw_len = fw->size;
497 wl->fw = vmalloc(wl->fw_len);
500 wl1271_error("could not allocate memory for the firmware");
505 memcpy(wl->fw, fw->data, wl->fw_len);
510 release_firmware(fw);
515 static int wl1271_update_mac_addr(struct wl1271 *wl)
518 u8 *nvs_ptr = (u8 *)wl->nvs->nvs;
520 /* get mac address from the NVS */
521 wl->mac_addr[0] = nvs_ptr[11];
522 wl->mac_addr[1] = nvs_ptr[10];
523 wl->mac_addr[2] = nvs_ptr[6];
524 wl->mac_addr[3] = nvs_ptr[5];
525 wl->mac_addr[4] = nvs_ptr[4];
526 wl->mac_addr[5] = nvs_ptr[3];
528 /* FIXME: if it is a zero-address, we should bail out. Now, instead,
529 we randomize an address */
530 if (is_zero_ether_addr(wl->mac_addr)) {
531 static const u8 nokia_oui[3] = {0x00, 0x1f, 0xdf};
532 memcpy(wl->mac_addr, nokia_oui, 3);
533 get_random_bytes(wl->mac_addr + 3, 3);
535 /* update this address to the NVS */
536 nvs_ptr[11] = wl->mac_addr[0];
537 nvs_ptr[10] = wl->mac_addr[1];
538 nvs_ptr[6] = wl->mac_addr[2];
539 nvs_ptr[5] = wl->mac_addr[3];
540 nvs_ptr[4] = wl->mac_addr[4];
541 nvs_ptr[3] = wl->mac_addr[5];
544 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
549 static int wl1271_fetch_nvs(struct wl1271 *wl)
551 const struct firmware *fw;
554 ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
557 wl1271_error("could not get nvs file: %d", ret);
561 if (fw->size != sizeof(struct wl1271_nvs_file)) {
562 wl1271_error("nvs size is not as expected: %zu != %zu",
563 fw->size, sizeof(struct wl1271_nvs_file));
568 wl->nvs = kmalloc(sizeof(struct wl1271_nvs_file), GFP_KERNEL);
571 wl1271_error("could not allocate memory for the nvs file");
576 memcpy(wl->nvs, fw->data, sizeof(struct wl1271_nvs_file));
578 ret = wl1271_update_mac_addr(wl);
581 release_firmware(fw);
586 static void wl1271_fw_wakeup(struct wl1271 *wl)
590 elp_reg = ELPCTRL_WAKE_UP;
591 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
594 static int wl1271_setup(struct wl1271 *wl)
596 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
600 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
601 if (!wl->tx_res_if) {
602 kfree(wl->fw_status);
606 INIT_WORK(&wl->irq_work, wl1271_irq_work);
607 INIT_WORK(&wl->tx_work, wl1271_tx_work);
611 static int wl1271_chip_wakeup(struct wl1271 *wl)
613 struct wl1271_partition_set partition;
616 msleep(WL1271_PRE_POWER_ON_SLEEP);
618 msleep(WL1271_POWER_ON_SLEEP);
622 /* We don't need a real memory partition here, because we only want
623 * to use the registers at this point. */
624 memset(&partition, 0, sizeof(partition));
625 partition.reg.start = REGISTERS_BASE;
626 partition.reg.size = REGISTERS_DOWN_SIZE;
627 wl1271_set_partition(wl, &partition);
629 /* ELP module wake up */
630 wl1271_fw_wakeup(wl);
632 /* whal_FwCtrl_BootSm() */
634 /* 0. read chip id from CHIP_ID */
635 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
637 /* 1. check if chip id is valid */
639 switch (wl->chip.id) {
640 case CHIP_ID_1271_PG10:
641 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
644 ret = wl1271_setup(wl);
648 case CHIP_ID_1271_PG20:
649 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
652 ret = wl1271_setup(wl);
657 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
662 if (wl->fw == NULL) {
663 ret = wl1271_fetch_firmware(wl);
668 /* No NVS from netlink, try to get it from the filesystem */
669 if (wl->nvs == NULL) {
670 ret = wl1271_fetch_nvs(wl);
679 int wl1271_plt_start(struct wl1271 *wl)
681 int retries = WL1271_BOOT_RETRIES;
684 mutex_lock(&wl->mutex);
686 wl1271_notice("power up");
688 if (wl->state != WL1271_STATE_OFF) {
689 wl1271_error("cannot go into PLT state because not "
690 "in off state: %d", wl->state);
697 ret = wl1271_chip_wakeup(wl);
701 ret = wl1271_boot(wl);
705 ret = wl1271_plt_init(wl);
709 wl->state = WL1271_STATE_PLT;
710 wl1271_notice("firmware booted in PLT mode (%s)",
715 wl1271_disable_interrupts(wl);
716 mutex_unlock(&wl->mutex);
717 /* Unlocking the mutex in the middle of handling is
718 inherently unsafe. In this case we deem it safe to do,
719 because we need to let any possibly pending IRQ out of
720 the system (and while we are WL1271_STATE_OFF the IRQ
721 work function will not do anything.) Also, any other
722 possible concurrent operations will fail due to the
723 current state, hence the wl1271 struct should be safe. */
724 cancel_work_sync(&wl->irq_work);
725 mutex_lock(&wl->mutex);
727 wl1271_power_off(wl);
730 wl1271_error("firmware boot in PLT mode failed despite %d retries",
731 WL1271_BOOT_RETRIES);
733 mutex_unlock(&wl->mutex);
738 int wl1271_plt_stop(struct wl1271 *wl)
742 mutex_lock(&wl->mutex);
744 wl1271_notice("power down");
746 if (wl->state != WL1271_STATE_PLT) {
747 wl1271_error("cannot power down because not in PLT "
748 "state: %d", wl->state);
753 wl1271_disable_interrupts(wl);
754 wl1271_power_off(wl);
756 wl->state = WL1271_STATE_OFF;
760 mutex_unlock(&wl->mutex);
766 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
768 struct wl1271 *wl = hw->priv;
769 struct ieee80211_conf *conf = &hw->conf;
770 struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
771 struct ieee80211_sta *sta = txinfo->control.sta;
774 /* peek into the rates configured in the STA entry */
775 spin_lock_irqsave(&wl->wl_lock, flags);
776 if (sta && sta->supp_rates[conf->channel->band] != wl->sta_rate_set) {
777 wl->sta_rate_set = sta->supp_rates[conf->channel->band];
778 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
780 spin_unlock_irqrestore(&wl->wl_lock, flags);
782 /* queue the packet */
783 skb_queue_tail(&wl->tx_queue, skb);
786 * The chip specific setup must run before the first TX packet -
787 * before that, the tx_work will not be initialized!
790 ieee80211_queue_work(wl->hw, &wl->tx_work);
793 * The workqueue is slow to process the tx_queue and we need stop
794 * the queue here, otherwise the queue will get too long.
796 if (skb_queue_len(&wl->tx_queue) >= WL1271_TX_QUEUE_MAX_LENGTH) {
797 ieee80211_stop_queues(wl->hw);
800 * FIXME: this is racy, the variable is not properly
801 * protected. Maybe fix this by removing the stupid
802 * variable altogether and checking the real queue state?
804 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
810 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
813 struct net_device *dev;
814 struct wireless_dev *wdev;
816 struct ieee80211_hw *hw;
818 struct wl1271 *wl_temp;
819 struct in_device *idev;
820 struct in_ifaddr *ifa = arg;
823 /* FIXME: this ugly function should probably be implemented in the
824 * mac80211, and here should only be a simple callback handling actual
825 * setting of the filters. Now we need to dig up references to
826 * various structures to gain access to what we need.
827 * Also, because of this, there is no "initial" setting of the filter
828 * in "op_start", because we don't want to dig up struct net_device
829 * there - the filter will be set upon first change of the interface
832 dev = ifa->ifa_dev->dev;
834 wdev = dev->ieee80211_ptr;
842 hw = wiphy_priv(wiphy);
846 /* Check that the interface is one supported by this driver. */
848 list_for_each_entry(wl, &wl_list, list) {
855 /* Get the interface IP address for the device. "ifa" will become
857 - there is no IPV4 protocol address configured
858 - there are multiple (virtual) IPV4 addresses configured
859 When "ifa" is NULL, filtering will be disabled.
864 ifa = idev->ifa_list;
866 if (ifa && ifa->ifa_next)
869 mutex_lock(&wl->mutex);
871 if (wl->state == WL1271_STATE_OFF)
874 ret = wl1271_ps_elp_wakeup(wl, false);
878 ret = wl1271_acx_arp_ip_filter(wl, true,
879 (u8 *)&ifa->ifa_address,
882 ret = wl1271_acx_arp_ip_filter(wl, false, NULL,
884 wl1271_ps_elp_sleep(wl);
887 mutex_unlock(&wl->mutex);
892 static struct notifier_block wl1271_dev_notifier = {
893 .notifier_call = wl1271_dev_notify,
897 static int wl1271_op_start(struct ieee80211_hw *hw)
899 struct wl1271 *wl = hw->priv;
900 int retries = WL1271_BOOT_RETRIES;
903 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
905 mutex_lock(&wl->mutex);
907 if (wl->state != WL1271_STATE_OFF) {
908 wl1271_error("cannot start because not in off state: %d",
916 ret = wl1271_chip_wakeup(wl);
920 ret = wl1271_boot(wl);
924 ret = wl1271_hw_init(wl);
928 wl->state = WL1271_STATE_ON;
929 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
933 wl1271_disable_interrupts(wl);
934 mutex_unlock(&wl->mutex);
935 /* Unlocking the mutex in the middle of handling is
936 inherently unsafe. In this case we deem it safe to do,
937 because we need to let any possibly pending IRQ out of
938 the system (and while we are WL1271_STATE_OFF the IRQ
939 work function will not do anything.) Also, any other
940 possible concurrent operations will fail due to the
941 current state, hence the wl1271 struct should be safe. */
942 cancel_work_sync(&wl->irq_work);
943 mutex_lock(&wl->mutex);
945 wl1271_power_off(wl);
948 wl1271_error("firmware boot failed despite %d retries",
949 WL1271_BOOT_RETRIES);
951 mutex_unlock(&wl->mutex);
954 list_add(&wl->list, &wl_list);
955 register_inetaddr_notifier(&wl1271_dev_notifier);
961 static void wl1271_op_stop(struct ieee80211_hw *hw)
963 struct wl1271 *wl = hw->priv;
968 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
970 unregister_inetaddr_notifier(&wl1271_dev_notifier);
973 mutex_lock(&wl->mutex);
975 WARN_ON(wl->state != WL1271_STATE_ON);
977 if (test_and_clear_bit(WL1271_FLAG_SCANNING, &wl->flags)) {
978 mutex_unlock(&wl->mutex);
979 ieee80211_scan_completed(wl->hw, true);
980 mutex_lock(&wl->mutex);
983 wl->state = WL1271_STATE_OFF;
985 wl1271_disable_interrupts(wl);
987 mutex_unlock(&wl->mutex);
989 cancel_work_sync(&wl->irq_work);
990 cancel_work_sync(&wl->tx_work);
992 mutex_lock(&wl->mutex);
994 /* let's notify MAC80211 about the remaining pending TX frames */
996 wl1271_power_off(wl);
998 memset(wl->bssid, 0, ETH_ALEN);
999 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1001 wl->bss_type = MAX_BSS_TYPE;
1002 wl->band = IEEE80211_BAND_2GHZ;
1005 wl->psm_entry_retry = 0;
1006 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1007 wl->tx_blocks_available = 0;
1008 wl->tx_results_count = 0;
1009 wl->tx_packets_count = 0;
1010 wl->tx_security_last_seq = 0;
1011 wl->tx_security_seq_16 = 0;
1012 wl->tx_security_seq_32 = 0;
1013 wl->time_offset = 0;
1014 wl->session_counter = 0;
1015 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1016 wl->sta_rate_set = 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_vif *vif)
1029 struct wl1271 *wl = hw->priv;
1032 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1033 vif->type, vif->addr);
1035 mutex_lock(&wl->mutex);
1043 switch (vif->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_vif *vif)
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 /* the dummy join is not required for ad-hoc */
1148 if (wl->bss_type == BSS_TYPE_IBSS)
1151 /* disable mac filter, so we hear everything */
1152 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1154 wl->channel = channel;
1155 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1157 ret = wl1271_cmd_join(wl);
1161 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1167 static int wl1271_unjoin_channel(struct wl1271 *wl)
1171 /* to stop listening to a channel, we disconnect */
1172 ret = wl1271_cmd_disconnect(wl);
1176 clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1178 memset(wl->bssid, 0, ETH_ALEN);
1179 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1185 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1187 struct wl1271 *wl = hw->priv;
1188 struct ieee80211_conf *conf = &hw->conf;
1189 int channel, ret = 0;
1191 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1193 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1195 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1197 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1199 mutex_lock(&wl->mutex);
1201 wl->band = conf->channel->band;
1203 ret = wl1271_ps_elp_wakeup(wl, false);
1207 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1208 if (conf->flags & IEEE80211_CONF_IDLE &&
1209 test_bit(WL1271_FLAG_JOINED, &wl->flags))
1210 wl1271_unjoin_channel(wl);
1211 else if (!(conf->flags & IEEE80211_CONF_IDLE))
1212 wl1271_join_channel(wl, channel);
1214 if (conf->flags & IEEE80211_CONF_IDLE) {
1215 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1216 wl->sta_rate_set = 0;
1217 wl1271_acx_rate_policies(wl);
1221 /* if the channel changes while joined, join again */
1222 if (channel != wl->channel &&
1223 test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1224 wl->channel = channel;
1225 /* FIXME: maybe use CMD_CHANNEL_SWITCH for this? */
1226 ret = wl1271_cmd_join(wl);
1228 wl1271_warning("cmd join to update channel failed %d",
1231 wl->channel = channel;
1233 if (conf->flags & IEEE80211_CONF_PS &&
1234 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1235 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1238 * We enter PSM only if we're already associated.
1239 * If we're not, we'll enter it when joining an SSID,
1240 * through the bss_info_changed() hook.
1242 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1243 wl1271_info("psm enabled");
1244 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1247 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1248 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1249 wl1271_info("psm disabled");
1251 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1253 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1254 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1258 if (conf->power_level != wl->power_level) {
1259 ret = wl1271_acx_tx_power(wl, conf->power_level);
1263 wl->power_level = conf->power_level;
1267 wl1271_ps_elp_sleep(wl);
1270 mutex_unlock(&wl->mutex);
1275 struct wl1271_filter_params {
1278 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1281 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw, int mc_count,
1282 struct dev_addr_list *mc_list)
1284 struct wl1271_filter_params *fp;
1287 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1289 wl1271_error("Out of memory setting filters.");
1293 /* update multicast filtering parameters */
1295 if (mc_count > ACX_MC_ADDRESS_GROUP_MAX) {
1297 fp->enabled = false;
1300 fp->mc_list_length = 0;
1301 for (i = 0; i < mc_count; i++) {
1302 if (mc_list->da_addrlen == ETH_ALEN) {
1303 memcpy(fp->mc_list[fp->mc_list_length],
1304 mc_list->da_addr, ETH_ALEN);
1305 fp->mc_list_length++;
1307 wl1271_warning("Unknown mc address length.");
1308 mc_list = mc_list->next;
1311 return (u64)(unsigned long)fp;
1314 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1317 FIF_BCN_PRBRESP_PROMISC | \
1321 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1322 unsigned int changed,
1323 unsigned int *total, u64 multicast)
1325 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1326 struct wl1271 *wl = hw->priv;
1329 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1331 mutex_lock(&wl->mutex);
1333 if (wl->state == WL1271_STATE_OFF)
1336 ret = wl1271_ps_elp_wakeup(wl, false);
1340 *total &= WL1271_SUPPORTED_FILTERS;
1341 changed &= WL1271_SUPPORTED_FILTERS;
1343 if (*total & FIF_ALLMULTI)
1344 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1346 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1348 fp->mc_list_length);
1354 /* FIXME: We still need to set our filters properly */
1356 /* determine, whether supported filter values have changed */
1360 /* apply configured filters */
1361 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1366 wl1271_ps_elp_sleep(wl);
1369 mutex_unlock(&wl->mutex);
1372 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1373 struct ieee80211_vif *vif,
1374 struct ieee80211_sta *sta,
1375 struct ieee80211_key_conf *key_conf)
1377 struct wl1271 *wl = hw->priv;
1384 static const u8 bcast_addr[ETH_ALEN] =
1385 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1387 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1389 addr = sta ? sta->addr : bcast_addr;
1391 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1392 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1393 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1394 key_conf->alg, key_conf->keyidx,
1395 key_conf->keylen, key_conf->flags);
1396 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1398 if (is_zero_ether_addr(addr)) {
1399 /* We dont support TX only encryption */
1404 mutex_lock(&wl->mutex);
1406 ret = wl1271_ps_elp_wakeup(wl, false);
1410 switch (key_conf->alg) {
1414 key_conf->hw_key_idx = key_conf->keyidx;
1417 key_type = KEY_TKIP;
1419 key_conf->hw_key_idx = key_conf->keyidx;
1420 tx_seq_32 = wl->tx_security_seq_32;
1421 tx_seq_16 = wl->tx_security_seq_16;
1426 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1427 tx_seq_32 = wl->tx_security_seq_32;
1428 tx_seq_16 = wl->tx_security_seq_16;
1431 wl1271_error("Unknown key algo 0x%x", key_conf->alg);
1439 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1440 key_conf->keyidx, key_type,
1441 key_conf->keylen, key_conf->key,
1442 addr, tx_seq_32, tx_seq_16);
1444 wl1271_error("Could not add or replace key");
1448 /* the default WEP key needs to be configured at least once */
1449 if (key_type == KEY_WEP) {
1450 ret = wl1271_cmd_set_default_wep_key(wl,
1458 /* The wl1271 does not allow to remove unicast keys - they
1459 will be cleared automatically on next CMD_JOIN. Ignore the
1460 request silently, as we dont want the mac80211 to emit
1461 an error message. */
1462 if (!is_broadcast_ether_addr(addr))
1465 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1466 key_conf->keyidx, key_type,
1467 key_conf->keylen, key_conf->key,
1470 wl1271_error("Could not remove key");
1476 wl1271_error("Unsupported key cmd 0x%x", cmd);
1484 wl1271_ps_elp_sleep(wl);
1487 mutex_unlock(&wl->mutex);
1493 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1494 struct cfg80211_scan_request *req)
1496 struct wl1271 *wl = hw->priv;
1501 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1504 ssid = req->ssids[0].ssid;
1505 len = req->ssids[0].ssid_len;
1508 mutex_lock(&wl->mutex);
1510 ret = wl1271_ps_elp_wakeup(wl, false);
1514 if (wl1271_11a_enabled())
1515 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1516 WL1271_SCAN_BAND_DUAL, 3);
1518 ret = wl1271_cmd_scan(hw->priv, ssid, len, 1, 0,
1519 WL1271_SCAN_BAND_2_4_GHZ, 3);
1521 wl1271_ps_elp_sleep(wl);
1524 mutex_unlock(&wl->mutex);
1529 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1531 struct wl1271 *wl = hw->priv;
1534 mutex_lock(&wl->mutex);
1536 ret = wl1271_ps_elp_wakeup(wl, false);
1540 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1542 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1544 wl1271_ps_elp_sleep(wl);
1547 mutex_unlock(&wl->mutex);
1552 static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *beacon)
1554 u8 *ptr = beacon->data +
1555 offsetof(struct ieee80211_mgmt, u.beacon.variable);
1557 /* find the location of the ssid in the beacon */
1558 while (ptr < beacon->data + beacon->len) {
1559 if (ptr[0] == WLAN_EID_SSID) {
1560 wl->ssid_len = ptr[1];
1561 memcpy(wl->ssid, ptr+2, wl->ssid_len);
1566 wl1271_error("ad-hoc beacon template has no SSID!\n");
1569 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1570 struct ieee80211_vif *vif,
1571 struct ieee80211_bss_conf *bss_conf,
1574 enum wl1271_cmd_ps_mode mode;
1575 struct wl1271 *wl = hw->priv;
1576 bool do_join = false;
1579 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1581 mutex_lock(&wl->mutex);
1583 ret = wl1271_ps_elp_wakeup(wl, false);
1587 if (wl->bss_type == BSS_TYPE_IBSS) {
1588 /* FIXME: This implements rudimentary ad-hoc support -
1589 proper templates are on the wish list and notification
1590 on when they change. This patch will update the templates
1591 on every call to this function. */
1592 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
1595 struct ieee80211_hdr *hdr;
1597 wl1271_ssid_set(wl, beacon);
1598 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1603 dev_kfree_skb(beacon);
1607 hdr = (struct ieee80211_hdr *) beacon->data;
1608 hdr->frame_control = cpu_to_le16(
1609 IEEE80211_FTYPE_MGMT |
1610 IEEE80211_STYPE_PROBE_RESP);
1612 ret = wl1271_cmd_template_set(wl,
1613 CMD_TEMPL_PROBE_RESPONSE,
1616 dev_kfree_skb(beacon);
1620 /* Need to update the SSID (for filtering etc) */
1625 if ((changed & BSS_CHANGED_BSSID) &&
1627 * Now we know the correct bssid, so we send a new join command
1628 * and enable the BSSID filter
1630 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1631 wl->rx_config |= CFG_BSSID_FILTER_EN;
1632 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1633 ret = wl1271_cmd_build_null_data(wl);
1635 wl1271_warning("cmd buld null data failed %d",
1640 /* Need to update the BSSID (for filtering etc) */
1644 if (changed & BSS_CHANGED_ASSOC) {
1645 if (bss_conf->assoc) {
1646 wl->aid = bss_conf->aid;
1647 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1650 * with wl1271, we don't need to update the
1651 * beacon_int and dtim_period, because the firmware
1652 * updates it by itself when the first beacon is
1653 * received after a join.
1655 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1659 ret = wl1271_acx_aid(wl, wl->aid);
1663 /* If we want to go in PSM but we're not there yet */
1664 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
1665 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
1666 mode = STATION_POWER_SAVE_MODE;
1667 ret = wl1271_ps_set_mode(wl, mode, true);
1672 /* use defaults when not associated */
1673 clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1679 if (changed & BSS_CHANGED_ERP_SLOT) {
1680 if (bss_conf->use_short_slot)
1681 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1683 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1685 wl1271_warning("Set slot time failed %d", ret);
1690 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1691 if (bss_conf->use_short_preamble)
1692 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1694 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1697 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1698 if (bss_conf->use_cts_prot)
1699 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1701 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1703 wl1271_warning("Set ctsprotect failed %d", ret);
1709 ret = wl1271_cmd_join(wl);
1711 wl1271_warning("cmd join failed %d", ret);
1714 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1718 wl1271_ps_elp_sleep(wl);
1721 mutex_unlock(&wl->mutex);
1724 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
1725 const struct ieee80211_tx_queue_params *params)
1727 struct wl1271 *wl = hw->priv;
1730 mutex_lock(&wl->mutex);
1732 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
1734 ret = wl1271_ps_elp_wakeup(wl, false);
1738 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
1739 params->cw_min, params->cw_max,
1740 params->aifs, params->txop);
1744 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
1745 CONF_CHANNEL_TYPE_EDCF,
1746 wl1271_tx_get_queue(queue),
1747 CONF_PS_SCHEME_LEGACY_PSPOLL,
1748 CONF_ACK_POLICY_LEGACY, 0, 0);
1753 wl1271_ps_elp_sleep(wl);
1756 mutex_unlock(&wl->mutex);
1762 /* can't be const, mac80211 writes to this */
1763 static struct ieee80211_rate wl1271_rates[] = {
1765 .hw_value = CONF_HW_BIT_RATE_1MBPS,
1766 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
1768 .hw_value = CONF_HW_BIT_RATE_2MBPS,
1769 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
1770 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1772 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
1773 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
1774 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1776 .hw_value = CONF_HW_BIT_RATE_11MBPS,
1777 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
1778 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
1780 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1781 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1783 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1784 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1786 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1787 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1789 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1790 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1792 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1793 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1795 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1796 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1798 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1799 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1801 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1802 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1805 /* can't be const, mac80211 writes to this */
1806 static struct ieee80211_channel wl1271_channels[] = {
1807 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
1808 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
1809 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
1810 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
1811 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
1812 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
1813 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
1814 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
1815 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
1816 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
1817 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
1818 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
1819 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
1822 /* can't be const, mac80211 writes to this */
1823 static struct ieee80211_supported_band wl1271_band_2ghz = {
1824 .channels = wl1271_channels,
1825 .n_channels = ARRAY_SIZE(wl1271_channels),
1826 .bitrates = wl1271_rates,
1827 .n_bitrates = ARRAY_SIZE(wl1271_rates),
1830 /* 5 GHz data rates for WL1273 */
1831 static struct ieee80211_rate wl1271_rates_5ghz[] = {
1833 .hw_value = CONF_HW_BIT_RATE_6MBPS,
1834 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
1836 .hw_value = CONF_HW_BIT_RATE_9MBPS,
1837 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
1839 .hw_value = CONF_HW_BIT_RATE_12MBPS,
1840 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
1842 .hw_value = CONF_HW_BIT_RATE_18MBPS,
1843 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
1845 .hw_value = CONF_HW_BIT_RATE_24MBPS,
1846 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
1848 .hw_value = CONF_HW_BIT_RATE_36MBPS,
1849 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
1851 .hw_value = CONF_HW_BIT_RATE_48MBPS,
1852 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
1854 .hw_value = CONF_HW_BIT_RATE_54MBPS,
1855 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
1858 /* 5 GHz band channels for WL1273 */
1859 static struct ieee80211_channel wl1271_channels_5ghz[] = {
1860 { .hw_value = 183, .center_freq = 4915},
1861 { .hw_value = 184, .center_freq = 4920},
1862 { .hw_value = 185, .center_freq = 4925},
1863 { .hw_value = 187, .center_freq = 4935},
1864 { .hw_value = 188, .center_freq = 4940},
1865 { .hw_value = 189, .center_freq = 4945},
1866 { .hw_value = 192, .center_freq = 4960},
1867 { .hw_value = 196, .center_freq = 4980},
1868 { .hw_value = 7, .center_freq = 5035},
1869 { .hw_value = 8, .center_freq = 5040},
1870 { .hw_value = 9, .center_freq = 5045},
1871 { .hw_value = 11, .center_freq = 5055},
1872 { .hw_value = 12, .center_freq = 5060},
1873 { .hw_value = 16, .center_freq = 5080},
1874 { .hw_value = 34, .center_freq = 5170},
1875 { .hw_value = 36, .center_freq = 5180},
1876 { .hw_value = 38, .center_freq = 5190},
1877 { .hw_value = 40, .center_freq = 5200},
1878 { .hw_value = 42, .center_freq = 5210},
1879 { .hw_value = 44, .center_freq = 5220},
1880 { .hw_value = 46, .center_freq = 5230},
1881 { .hw_value = 48, .center_freq = 5240},
1882 { .hw_value = 52, .center_freq = 5260},
1883 { .hw_value = 56, .center_freq = 5280},
1884 { .hw_value = 60, .center_freq = 5300},
1885 { .hw_value = 64, .center_freq = 5320},
1886 { .hw_value = 100, .center_freq = 5500},
1887 { .hw_value = 104, .center_freq = 5520},
1888 { .hw_value = 108, .center_freq = 5540},
1889 { .hw_value = 112, .center_freq = 5560},
1890 { .hw_value = 116, .center_freq = 5580},
1891 { .hw_value = 120, .center_freq = 5600},
1892 { .hw_value = 124, .center_freq = 5620},
1893 { .hw_value = 128, .center_freq = 5640},
1894 { .hw_value = 132, .center_freq = 5660},
1895 { .hw_value = 136, .center_freq = 5680},
1896 { .hw_value = 140, .center_freq = 5700},
1897 { .hw_value = 149, .center_freq = 5745},
1898 { .hw_value = 153, .center_freq = 5765},
1899 { .hw_value = 157, .center_freq = 5785},
1900 { .hw_value = 161, .center_freq = 5805},
1901 { .hw_value = 165, .center_freq = 5825},
1905 static struct ieee80211_supported_band wl1271_band_5ghz = {
1906 .channels = wl1271_channels_5ghz,
1907 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
1908 .bitrates = wl1271_rates_5ghz,
1909 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
1912 static const struct ieee80211_ops wl1271_ops = {
1913 .start = wl1271_op_start,
1914 .stop = wl1271_op_stop,
1915 .add_interface = wl1271_op_add_interface,
1916 .remove_interface = wl1271_op_remove_interface,
1917 .config = wl1271_op_config,
1918 /* .config_interface = wl1271_op_config_interface, */
1919 .prepare_multicast = wl1271_op_prepare_multicast,
1920 .configure_filter = wl1271_op_configure_filter,
1922 .set_key = wl1271_op_set_key,
1923 .hw_scan = wl1271_op_hw_scan,
1924 .bss_info_changed = wl1271_op_bss_info_changed,
1925 .set_rts_threshold = wl1271_op_set_rts_threshold,
1926 .conf_tx = wl1271_op_conf_tx,
1927 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
1930 int wl1271_register_hw(struct wl1271 *wl)
1934 if (wl->mac80211_registered)
1937 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
1939 ret = ieee80211_register_hw(wl->hw);
1941 wl1271_error("unable to register mac80211 hw: %d", ret);
1945 wl->mac80211_registered = true;
1947 wl1271_notice("loaded");
1952 int wl1271_init_ieee80211(struct wl1271 *wl)
1954 /* The tx descriptor buffer and the TKIP space. */
1955 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
1956 sizeof(struct wl1271_tx_hw_descr);
1959 /* FIXME: find a proper value */
1960 wl->hw->channel_change_time = 10000;
1962 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
1963 IEEE80211_HW_NOISE_DBM |
1964 IEEE80211_HW_BEACON_FILTER |
1965 IEEE80211_HW_SUPPORTS_PS;
1967 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1968 BIT(NL80211_IFTYPE_ADHOC);
1969 wl->hw->wiphy->max_scan_ssids = 1;
1970 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
1972 if (wl1271_11a_enabled())
1973 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
1975 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
1980 #define WL1271_DEFAULT_CHANNEL 0
1982 struct ieee80211_hw *wl1271_alloc_hw(void)
1984 struct ieee80211_hw *hw;
1988 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
1990 wl1271_error("could not alloc ieee80211_hw");
1991 return ERR_PTR(-ENOMEM);
1995 memset(wl, 0, sizeof(*wl));
1997 INIT_LIST_HEAD(&wl->list);
2001 skb_queue_head_init(&wl->tx_queue);
2003 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
2004 wl->channel = WL1271_DEFAULT_CHANNEL;
2005 wl->default_key = 0;
2007 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
2008 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
2009 wl->psm_entry_retry = 0;
2010 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2011 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2012 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
2013 wl->sta_rate_set = 0;
2014 wl->band = IEEE80211_BAND_2GHZ;
2018 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
2019 wl->tx_frames[i] = NULL;
2021 spin_lock_init(&wl->wl_lock);
2023 wl->state = WL1271_STATE_OFF;
2024 mutex_init(&wl->mutex);
2026 /* Apply default driver configuration. */
2027 wl1271_conf_init(wl);
2029 wl1271_debugfs_init(wl);
2034 int wl1271_free_hw(struct wl1271 *wl)
2036 ieee80211_unregister_hw(wl->hw);
2038 wl1271_debugfs_exit(wl);
2040 kfree(wl->target_mem_map);
2046 kfree(wl->fw_status);
2047 kfree(wl->tx_res_if);
2049 ieee80211_free_hw(wl->hw);