wl1271: Allocate TX descriptors more efficiently
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / net / wireless / wl12xx / wl1271_main.c
blob0fd472597fa60d270e96e9adfe1e59f8ce52de95
1 /*
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
20 * 02110-1301 USA
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/platform_device.h>
32 #include <linux/slab.h>
34 #include "wl1271.h"
35 #include "wl12xx_80211.h"
36 #include "wl1271_reg.h"
37 #include "wl1271_io.h"
38 #include "wl1271_event.h"
39 #include "wl1271_tx.h"
40 #include "wl1271_rx.h"
41 #include "wl1271_ps.h"
42 #include "wl1271_init.h"
43 #include "wl1271_debugfs.h"
44 #include "wl1271_cmd.h"
45 #include "wl1271_boot.h"
46 #include "wl1271_testmode.h"
47 #include "wl1271_scan.h"
49 #define WL1271_BOOT_RETRIES 3
51 static struct conf_drv_settings default_conf = {
52 .sg = {
53 .params = {
54 [CONF_SG_BT_PER_THRESHOLD] = 7500,
55 [CONF_SG_HV3_MAX_OVERRIDE] = 0,
56 [CONF_SG_BT_NFS_SAMPLE_INTERVAL] = 400,
57 [CONF_SG_BT_LOAD_RATIO] = 50,
58 [CONF_SG_AUTO_PS_MODE] = 1,
59 [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
60 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
61 [CONF_SG_ANTENNA_CONFIGURATION] = 0,
62 [CONF_SG_BEACON_MISS_PERCENT] = 60,
63 [CONF_SG_RATE_ADAPT_THRESH] = 12,
64 [CONF_SG_RATE_ADAPT_SNR] = 0,
65 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR] = 10,
66 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR] = 30,
67 [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR] = 8,
68 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR] = 20,
69 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR] = 50,
70 /* Note: with UPSD, this should be 4 */
71 [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR] = 8,
72 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR] = 7,
73 [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR] = 25,
74 [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR] = 20,
75 /* Note: with UPDS, this should be 15 */
76 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR] = 8,
77 /* Note: with UPDS, this should be 50 */
78 [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR] = 40,
79 /* Note: with UPDS, this should be 10 */
80 [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR] = 20,
81 [CONF_SG_RXT] = 1200,
82 [CONF_SG_TXT] = 1000,
83 [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
84 [CONF_SG_PS_POLL_TIMEOUT] = 10,
85 [CONF_SG_UPSD_TIMEOUT] = 10,
86 [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR] = 7,
87 [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR] = 15,
88 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR] = 15,
89 [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR] = 8,
90 [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR] = 20,
91 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR] = 15,
92 [CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR] = 20,
93 [CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR] = 50,
94 [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR] = 10,
95 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
96 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP] = 800,
97 [CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME] = 75,
98 [CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME] = 15,
99 [CONF_SG_HV3_MAX_SERVED] = 6,
100 [CONF_SG_DHCP_TIME] = 5000,
101 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
103 .state = CONF_SG_PROTECTIVE,
105 .rx = {
106 .rx_msdu_life_time = 512000,
107 .packet_detection_threshold = 0,
108 .ps_poll_timeout = 15,
109 .upsd_timeout = 15,
110 .rts_threshold = 2347,
111 .rx_cca_threshold = 0,
112 .irq_blk_threshold = 0xFFFF,
113 .irq_pkt_threshold = 0,
114 .irq_timeout = 600,
115 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
117 .tx = {
118 .tx_energy_detection = 0,
119 .rc_conf = {
120 .enabled_rates = 0,
121 .short_retry_limit = 10,
122 .long_retry_limit = 10,
123 .aflags = 0
125 .ac_conf_count = 4,
126 .ac_conf = {
127 [CONF_TX_AC_BE] = {
128 .ac = CONF_TX_AC_BE,
129 .cw_min = 15,
130 .cw_max = 63,
131 .aifsn = 3,
132 .tx_op_limit = 0,
134 [CONF_TX_AC_BK] = {
135 .ac = CONF_TX_AC_BK,
136 .cw_min = 15,
137 .cw_max = 63,
138 .aifsn = 7,
139 .tx_op_limit = 0,
141 [CONF_TX_AC_VI] = {
142 .ac = CONF_TX_AC_VI,
143 .cw_min = 15,
144 .cw_max = 63,
145 .aifsn = CONF_TX_AIFS_PIFS,
146 .tx_op_limit = 3008,
148 [CONF_TX_AC_VO] = {
149 .ac = CONF_TX_AC_VO,
150 .cw_min = 15,
151 .cw_max = 63,
152 .aifsn = CONF_TX_AIFS_PIFS,
153 .tx_op_limit = 1504,
156 .tid_conf_count = 4,
157 .tid_conf = {
158 [CONF_TX_AC_BE] = {
159 .queue_id = CONF_TX_AC_BE,
160 .channel_type = CONF_CHANNEL_TYPE_EDCF,
161 .tsid = CONF_TX_AC_BE,
162 .ps_scheme = CONF_PS_SCHEME_LEGACY,
163 .ack_policy = CONF_ACK_POLICY_LEGACY,
164 .apsd_conf = {0, 0},
166 [CONF_TX_AC_BK] = {
167 .queue_id = CONF_TX_AC_BK,
168 .channel_type = CONF_CHANNEL_TYPE_EDCF,
169 .tsid = CONF_TX_AC_BK,
170 .ps_scheme = CONF_PS_SCHEME_LEGACY,
171 .ack_policy = CONF_ACK_POLICY_LEGACY,
172 .apsd_conf = {0, 0},
174 [CONF_TX_AC_VI] = {
175 .queue_id = CONF_TX_AC_VI,
176 .channel_type = CONF_CHANNEL_TYPE_EDCF,
177 .tsid = CONF_TX_AC_VI,
178 .ps_scheme = CONF_PS_SCHEME_LEGACY,
179 .ack_policy = CONF_ACK_POLICY_LEGACY,
180 .apsd_conf = {0, 0},
182 [CONF_TX_AC_VO] = {
183 .queue_id = CONF_TX_AC_VO,
184 .channel_type = CONF_CHANNEL_TYPE_EDCF,
185 .tsid = CONF_TX_AC_VO,
186 .ps_scheme = CONF_PS_SCHEME_LEGACY,
187 .ack_policy = CONF_ACK_POLICY_LEGACY,
188 .apsd_conf = {0, 0},
191 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
192 .tx_compl_timeout = 700,
193 .tx_compl_threshold = 4,
194 .basic_rate = CONF_HW_BIT_RATE_1MBPS,
195 .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
197 .conn = {
198 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
199 .listen_interval = 1,
200 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
201 .bcn_filt_ie_count = 1,
202 .bcn_filt_ie = {
203 [0] = {
204 .ie = WLAN_EID_CHANNEL_SWITCH,
205 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
208 .synch_fail_thold = 10,
209 .bss_lose_timeout = 100,
210 .beacon_rx_timeout = 10000,
211 .broadcast_timeout = 20000,
212 .rx_broadcast_in_ps = 1,
213 .ps_poll_threshold = 10,
214 .ps_poll_recovery_period = 700,
215 .bet_enable = CONF_BET_MODE_ENABLE,
216 .bet_max_consecutive = 10,
217 .psm_entry_retries = 5,
218 .psm_entry_nullfunc_retries = 3,
219 .psm_entry_hangover_period = 1,
220 .keep_alive_interval = 55000,
221 .max_listen_interval = 20,
223 .itrim = {
224 .enable = false,
225 .timeout = 50000,
227 .pm_config = {
228 .host_clk_settling_time = 5000,
229 .host_fast_wakeup_support = false
231 .roam_trigger = {
232 .trigger_pacing = 1,
233 .avg_weight_rssi_beacon = 20,
234 .avg_weight_rssi_data = 10,
235 .avg_weight_snr_beacon = 20,
236 .avg_weight_snr_data = 10
238 .scan = {
239 .min_dwell_time_active = 7500,
240 .max_dwell_time_active = 30000,
241 .min_dwell_time_passive = 30000,
242 .max_dwell_time_passive = 60000,
243 .num_probe_reqs = 2,
245 .rf = {
246 .tx_per_channel_power_compensation_2 = {
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 .tx_per_channel_power_compensation_5 = {
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
257 static void __wl1271_op_remove_interface(struct wl1271 *wl);
260 static void wl1271_device_release(struct device *dev)
265 static struct platform_device wl1271_device = {
266 .name = "wl1271",
267 .id = -1,
269 /* device model insists to have a release function */
270 .dev = {
271 .release = wl1271_device_release,
275 static LIST_HEAD(wl_list);
277 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
278 void *arg)
280 struct net_device *dev = arg;
281 struct wireless_dev *wdev;
282 struct wiphy *wiphy;
283 struct ieee80211_hw *hw;
284 struct wl1271 *wl;
285 struct wl1271 *wl_temp;
286 int ret = 0;
288 /* Check that this notification is for us. */
289 if (what != NETDEV_CHANGE)
290 return NOTIFY_DONE;
292 wdev = dev->ieee80211_ptr;
293 if (wdev == NULL)
294 return NOTIFY_DONE;
296 wiphy = wdev->wiphy;
297 if (wiphy == NULL)
298 return NOTIFY_DONE;
300 hw = wiphy_priv(wiphy);
301 if (hw == NULL)
302 return NOTIFY_DONE;
304 wl_temp = hw->priv;
305 list_for_each_entry(wl, &wl_list, list) {
306 if (wl == wl_temp)
307 break;
309 if (wl != wl_temp)
310 return NOTIFY_DONE;
312 mutex_lock(&wl->mutex);
314 if (wl->state == WL1271_STATE_OFF)
315 goto out;
317 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
318 goto out;
320 ret = wl1271_ps_elp_wakeup(wl, false);
321 if (ret < 0)
322 goto out;
324 if ((dev->operstate == IF_OPER_UP) &&
325 !test_and_set_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags)) {
326 wl1271_cmd_set_sta_state(wl);
327 wl1271_info("Association completed.");
330 wl1271_ps_elp_sleep(wl);
332 out:
333 mutex_unlock(&wl->mutex);
335 return NOTIFY_OK;
338 static void wl1271_conf_init(struct wl1271 *wl)
342 * This function applies the default configuration to the driver. This
343 * function is invoked upon driver load (spi probe.)
345 * The configuration is stored in a run-time structure in order to
346 * facilitate for run-time adjustment of any of the parameters. Making
347 * changes to the configuration structure will apply the new values on
348 * the next interface up (wl1271_op_start.)
351 /* apply driver default configuration */
352 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
356 static int wl1271_plt_init(struct wl1271 *wl)
358 struct conf_tx_ac_category *conf_ac;
359 struct conf_tx_tid *conf_tid;
360 int ret, i;
362 ret = wl1271_cmd_general_parms(wl);
363 if (ret < 0)
364 return ret;
366 ret = wl1271_cmd_radio_parms(wl);
367 if (ret < 0)
368 return ret;
370 ret = wl1271_cmd_ext_radio_parms(wl);
371 if (ret < 0)
372 return ret;
374 ret = wl1271_init_templates_config(wl);
375 if (ret < 0)
376 return ret;
378 ret = wl1271_acx_init_mem_config(wl);
379 if (ret < 0)
380 return ret;
382 /* PHY layer config */
383 ret = wl1271_init_phy_config(wl);
384 if (ret < 0)
385 goto out_free_memmap;
387 ret = wl1271_acx_dco_itrim_params(wl);
388 if (ret < 0)
389 goto out_free_memmap;
391 /* Initialize connection monitoring thresholds */
392 ret = wl1271_acx_conn_monit_params(wl, false);
393 if (ret < 0)
394 goto out_free_memmap;
396 /* Bluetooth WLAN coexistence */
397 ret = wl1271_init_pta(wl);
398 if (ret < 0)
399 goto out_free_memmap;
401 /* Energy detection */
402 ret = wl1271_init_energy_detection(wl);
403 if (ret < 0)
404 goto out_free_memmap;
406 /* Default fragmentation threshold */
407 ret = wl1271_acx_frag_threshold(wl);
408 if (ret < 0)
409 goto out_free_memmap;
411 /* Default TID/AC configuration */
412 BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
413 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
414 conf_ac = &wl->conf.tx.ac_conf[i];
415 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
416 conf_ac->cw_max, conf_ac->aifsn,
417 conf_ac->tx_op_limit);
418 if (ret < 0)
419 goto out_free_memmap;
421 conf_tid = &wl->conf.tx.tid_conf[i];
422 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
423 conf_tid->channel_type,
424 conf_tid->tsid,
425 conf_tid->ps_scheme,
426 conf_tid->ack_policy,
427 conf_tid->apsd_conf[0],
428 conf_tid->apsd_conf[1]);
429 if (ret < 0)
430 goto out_free_memmap;
433 /* Enable data path */
434 ret = wl1271_cmd_data_path(wl, 1);
435 if (ret < 0)
436 goto out_free_memmap;
438 /* Configure for CAM power saving (ie. always active) */
439 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
440 if (ret < 0)
441 goto out_free_memmap;
443 /* configure PM */
444 ret = wl1271_acx_pm_config(wl);
445 if (ret < 0)
446 goto out_free_memmap;
448 return 0;
450 out_free_memmap:
451 kfree(wl->target_mem_map);
452 wl->target_mem_map = NULL;
454 return ret;
457 static void wl1271_fw_status(struct wl1271 *wl,
458 struct wl1271_fw_status *status)
460 struct timespec ts;
461 u32 total = 0;
462 int i;
464 wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
466 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
467 "drv_rx_counter = %d, tx_results_counter = %d)",
468 status->intr,
469 status->fw_rx_counter,
470 status->drv_rx_counter,
471 status->tx_results_counter);
473 /* update number of available TX blocks */
474 for (i = 0; i < NUM_TX_QUEUES; i++) {
475 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
476 wl->tx_blocks_freed[i];
478 wl->tx_blocks_freed[i] =
479 le32_to_cpu(status->tx_released_blks[i]);
480 wl->tx_blocks_available += cnt;
481 total += cnt;
484 /* if more blocks are available now, tx work can be scheduled */
485 if (total)
486 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
488 /* update the host-chipset time offset */
489 getnstimeofday(&ts);
490 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
491 (s64)le32_to_cpu(status->fw_localtime);
494 #define WL1271_IRQ_MAX_LOOPS 10
496 static void wl1271_irq_work(struct work_struct *work)
498 int ret;
499 u32 intr;
500 int loopcount = WL1271_IRQ_MAX_LOOPS;
501 unsigned long flags;
502 struct wl1271 *wl =
503 container_of(work, struct wl1271, irq_work);
505 mutex_lock(&wl->mutex);
507 wl1271_debug(DEBUG_IRQ, "IRQ work");
509 if (unlikely(wl->state == WL1271_STATE_OFF))
510 goto out;
512 ret = wl1271_ps_elp_wakeup(wl, true);
513 if (ret < 0)
514 goto out;
516 spin_lock_irqsave(&wl->wl_lock, flags);
517 while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
518 clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
519 spin_unlock_irqrestore(&wl->wl_lock, flags);
520 loopcount--;
522 wl1271_fw_status(wl, wl->fw_status);
523 intr = le32_to_cpu(wl->fw_status->intr);
524 if (!intr) {
525 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
526 spin_lock_irqsave(&wl->wl_lock, flags);
527 continue;
530 intr &= WL1271_INTR_MASK;
532 if (intr & WL1271_ACX_INTR_DATA) {
533 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
535 /* check for tx results */
536 if (wl->fw_status->tx_results_counter !=
537 (wl->tx_results_count & 0xff))
538 wl1271_tx_complete(wl);
540 /* Check if any tx blocks were freed */
541 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
542 !skb_queue_empty(&wl->tx_queue)) {
544 * In order to avoid starvation of the TX path,
545 * call the work function directly.
547 wl1271_tx_work_locked(wl);
550 wl1271_rx(wl, wl->fw_status);
553 if (intr & WL1271_ACX_INTR_EVENT_A) {
554 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
555 wl1271_event_handle(wl, 0);
558 if (intr & WL1271_ACX_INTR_EVENT_B) {
559 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
560 wl1271_event_handle(wl, 1);
563 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
564 wl1271_debug(DEBUG_IRQ,
565 "WL1271_ACX_INTR_INIT_COMPLETE");
567 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
568 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
570 spin_lock_irqsave(&wl->wl_lock, flags);
573 if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
574 ieee80211_queue_work(wl->hw, &wl->irq_work);
575 else
576 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
577 spin_unlock_irqrestore(&wl->wl_lock, flags);
579 wl1271_ps_elp_sleep(wl);
581 out:
582 mutex_unlock(&wl->mutex);
585 static int wl1271_fetch_firmware(struct wl1271 *wl)
587 const struct firmware *fw;
588 int ret;
590 ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
592 if (ret < 0) {
593 wl1271_error("could not get firmware: %d", ret);
594 return ret;
597 if (fw->size % 4) {
598 wl1271_error("firmware size is not multiple of 32 bits: %zu",
599 fw->size);
600 ret = -EILSEQ;
601 goto out;
604 wl->fw_len = fw->size;
605 wl->fw = vmalloc(wl->fw_len);
607 if (!wl->fw) {
608 wl1271_error("could not allocate memory for the firmware");
609 ret = -ENOMEM;
610 goto out;
613 memcpy(wl->fw, fw->data, wl->fw_len);
615 ret = 0;
617 out:
618 release_firmware(fw);
620 return ret;
623 static int wl1271_fetch_nvs(struct wl1271 *wl)
625 const struct firmware *fw;
626 int ret;
628 ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
630 if (ret < 0) {
631 wl1271_error("could not get nvs file: %d", ret);
632 return ret;
635 wl->nvs = kmemdup(fw->data, sizeof(struct wl1271_nvs_file), GFP_KERNEL);
637 if (!wl->nvs) {
638 wl1271_error("could not allocate memory for the nvs file");
639 ret = -ENOMEM;
640 goto out;
643 wl->nvs_len = fw->size;
645 out:
646 release_firmware(fw);
648 return ret;
651 static void wl1271_recovery_work(struct work_struct *work)
653 struct wl1271 *wl =
654 container_of(work, struct wl1271, recovery_work);
656 mutex_lock(&wl->mutex);
658 if (wl->state != WL1271_STATE_ON)
659 goto out;
661 wl1271_info("Hardware recovery in progress.");
663 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
664 ieee80211_connection_loss(wl->vif);
666 /* reboot the chipset */
667 __wl1271_op_remove_interface(wl);
668 ieee80211_restart_hw(wl->hw);
670 out:
671 mutex_unlock(&wl->mutex);
674 static void wl1271_fw_wakeup(struct wl1271 *wl)
676 u32 elp_reg;
678 elp_reg = ELPCTRL_WAKE_UP;
679 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
682 static int wl1271_setup(struct wl1271 *wl)
684 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
685 if (!wl->fw_status)
686 return -ENOMEM;
688 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
689 if (!wl->tx_res_if) {
690 kfree(wl->fw_status);
691 return -ENOMEM;
694 return 0;
697 static int wl1271_chip_wakeup(struct wl1271 *wl)
699 struct wl1271_partition_set partition;
700 int ret = 0;
702 msleep(WL1271_PRE_POWER_ON_SLEEP);
703 ret = wl1271_power_on(wl);
704 if (ret < 0)
705 goto out;
706 msleep(WL1271_POWER_ON_SLEEP);
707 wl1271_io_reset(wl);
708 wl1271_io_init(wl);
710 /* We don't need a real memory partition here, because we only want
711 * to use the registers at this point. */
712 memset(&partition, 0, sizeof(partition));
713 partition.reg.start = REGISTERS_BASE;
714 partition.reg.size = REGISTERS_DOWN_SIZE;
715 wl1271_set_partition(wl, &partition);
717 /* ELP module wake up */
718 wl1271_fw_wakeup(wl);
720 /* whal_FwCtrl_BootSm() */
722 /* 0. read chip id from CHIP_ID */
723 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
725 /* 1. check if chip id is valid */
727 switch (wl->chip.id) {
728 case CHIP_ID_1271_PG10:
729 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
730 wl->chip.id);
732 ret = wl1271_setup(wl);
733 if (ret < 0)
734 goto out;
735 break;
736 case CHIP_ID_1271_PG20:
737 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
738 wl->chip.id);
740 ret = wl1271_setup(wl);
741 if (ret < 0)
742 goto out;
743 break;
744 default:
745 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
746 ret = -ENODEV;
747 goto out;
750 if (wl->fw == NULL) {
751 ret = wl1271_fetch_firmware(wl);
752 if (ret < 0)
753 goto out;
756 /* No NVS from netlink, try to get it from the filesystem */
757 if (wl->nvs == NULL) {
758 ret = wl1271_fetch_nvs(wl);
759 if (ret < 0)
760 goto out;
763 out:
764 return ret;
767 int wl1271_plt_start(struct wl1271 *wl)
769 int retries = WL1271_BOOT_RETRIES;
770 int ret;
772 mutex_lock(&wl->mutex);
774 wl1271_notice("power up");
776 if (wl->state != WL1271_STATE_OFF) {
777 wl1271_error("cannot go into PLT state because not "
778 "in off state: %d", wl->state);
779 ret = -EBUSY;
780 goto out;
783 while (retries) {
784 retries--;
785 ret = wl1271_chip_wakeup(wl);
786 if (ret < 0)
787 goto power_off;
789 ret = wl1271_boot(wl);
790 if (ret < 0)
791 goto power_off;
793 ret = wl1271_plt_init(wl);
794 if (ret < 0)
795 goto irq_disable;
797 wl->state = WL1271_STATE_PLT;
798 wl1271_notice("firmware booted in PLT mode (%s)",
799 wl->chip.fw_ver);
800 goto out;
802 irq_disable:
803 wl1271_disable_interrupts(wl);
804 mutex_unlock(&wl->mutex);
805 /* Unlocking the mutex in the middle of handling is
806 inherently unsafe. In this case we deem it safe to do,
807 because we need to let any possibly pending IRQ out of
808 the system (and while we are WL1271_STATE_OFF the IRQ
809 work function will not do anything.) Also, any other
810 possible concurrent operations will fail due to the
811 current state, hence the wl1271 struct should be safe. */
812 cancel_work_sync(&wl->irq_work);
813 mutex_lock(&wl->mutex);
814 power_off:
815 wl1271_power_off(wl);
818 wl1271_error("firmware boot in PLT mode failed despite %d retries",
819 WL1271_BOOT_RETRIES);
820 out:
821 mutex_unlock(&wl->mutex);
823 return ret;
826 int wl1271_plt_stop(struct wl1271 *wl)
828 int ret = 0;
830 mutex_lock(&wl->mutex);
832 wl1271_notice("power down");
834 if (wl->state != WL1271_STATE_PLT) {
835 wl1271_error("cannot power down because not in PLT "
836 "state: %d", wl->state);
837 ret = -EBUSY;
838 goto out;
841 wl1271_disable_interrupts(wl);
842 wl1271_power_off(wl);
844 wl->state = WL1271_STATE_OFF;
845 wl->rx_counter = 0;
847 out:
848 mutex_unlock(&wl->mutex);
850 cancel_work_sync(&wl->irq_work);
851 cancel_work_sync(&wl->recovery_work);
853 return ret;
856 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
858 struct wl1271 *wl = hw->priv;
859 struct ieee80211_conf *conf = &hw->conf;
860 struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
861 struct ieee80211_sta *sta = txinfo->control.sta;
862 unsigned long flags;
864 /* peek into the rates configured in the STA entry */
865 spin_lock_irqsave(&wl->wl_lock, flags);
866 if (sta && sta->supp_rates[conf->channel->band] != wl->sta_rate_set) {
867 wl->sta_rate_set = sta->supp_rates[conf->channel->band];
868 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
870 spin_unlock_irqrestore(&wl->wl_lock, flags);
872 /* queue the packet */
873 skb_queue_tail(&wl->tx_queue, skb);
876 * The chip specific setup must run before the first TX packet -
877 * before that, the tx_work will not be initialized!
880 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
881 ieee80211_queue_work(wl->hw, &wl->tx_work);
884 * The workqueue is slow to process the tx_queue and we need stop
885 * the queue here, otherwise the queue will get too long.
887 if (skb_queue_len(&wl->tx_queue) >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
888 wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
890 spin_lock_irqsave(&wl->wl_lock, flags);
891 ieee80211_stop_queues(wl->hw);
892 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
893 spin_unlock_irqrestore(&wl->wl_lock, flags);
896 return NETDEV_TX_OK;
899 static struct notifier_block wl1271_dev_notifier = {
900 .notifier_call = wl1271_dev_notify,
903 static int wl1271_op_start(struct ieee80211_hw *hw)
905 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
908 * We have to delay the booting of the hardware because
909 * we need to know the local MAC address before downloading and
910 * initializing the firmware. The MAC address cannot be changed
911 * after boot, and without the proper MAC address, the firmware
912 * will not function properly.
914 * The MAC address is first known when the corresponding interface
915 * is added. That is where we will initialize the hardware.
918 return 0;
921 static void wl1271_op_stop(struct ieee80211_hw *hw)
923 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
926 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
927 struct ieee80211_vif *vif)
929 struct wl1271 *wl = hw->priv;
930 struct wiphy *wiphy = hw->wiphy;
931 int retries = WL1271_BOOT_RETRIES;
932 int ret = 0;
934 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
935 vif->type, vif->addr);
937 mutex_lock(&wl->mutex);
938 if (wl->vif) {
939 ret = -EBUSY;
940 goto out;
943 wl->vif = vif;
945 switch (vif->type) {
946 case NL80211_IFTYPE_STATION:
947 wl->bss_type = BSS_TYPE_STA_BSS;
948 wl->set_bss_type = BSS_TYPE_STA_BSS;
949 break;
950 case NL80211_IFTYPE_ADHOC:
951 wl->bss_type = BSS_TYPE_IBSS;
952 wl->set_bss_type = BSS_TYPE_STA_BSS;
953 break;
954 default:
955 ret = -EOPNOTSUPP;
956 goto out;
959 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
961 if (wl->state != WL1271_STATE_OFF) {
962 wl1271_error("cannot start because not in off state: %d",
963 wl->state);
964 ret = -EBUSY;
965 goto out;
968 while (retries) {
969 retries--;
970 ret = wl1271_chip_wakeup(wl);
971 if (ret < 0)
972 goto power_off;
974 ret = wl1271_boot(wl);
975 if (ret < 0)
976 goto power_off;
978 ret = wl1271_hw_init(wl);
979 if (ret < 0)
980 goto irq_disable;
982 wl->state = WL1271_STATE_ON;
983 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
985 /* update hw/fw version info in wiphy struct */
986 wiphy->hw_version = wl->chip.id;
987 strncpy(wiphy->fw_version, wl->chip.fw_ver,
988 sizeof(wiphy->fw_version));
990 goto out;
992 irq_disable:
993 wl1271_disable_interrupts(wl);
994 mutex_unlock(&wl->mutex);
995 /* Unlocking the mutex in the middle of handling is
996 inherently unsafe. In this case we deem it safe to do,
997 because we need to let any possibly pending IRQ out of
998 the system (and while we are WL1271_STATE_OFF the IRQ
999 work function will not do anything.) Also, any other
1000 possible concurrent operations will fail due to the
1001 current state, hence the wl1271 struct should be safe. */
1002 cancel_work_sync(&wl->irq_work);
1003 mutex_lock(&wl->mutex);
1004 power_off:
1005 wl1271_power_off(wl);
1008 wl1271_error("firmware boot failed despite %d retries",
1009 WL1271_BOOT_RETRIES);
1010 out:
1011 mutex_unlock(&wl->mutex);
1013 if (!ret)
1014 list_add(&wl->list, &wl_list);
1016 return ret;
1019 static void __wl1271_op_remove_interface(struct wl1271 *wl)
1021 int i;
1023 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1025 wl1271_info("down");
1027 list_del(&wl->list);
1029 WARN_ON(wl->state != WL1271_STATE_ON);
1031 /* enable dyn ps just in case (if left on due to fw crash etc) */
1032 if (wl->bss_type == BSS_TYPE_STA_BSS)
1033 ieee80211_enable_dyn_ps(wl->vif);
1035 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
1036 wl->scan.state = WL1271_SCAN_STATE_IDLE;
1037 kfree(wl->scan.scanned_ch);
1038 wl->scan.scanned_ch = NULL;
1039 ieee80211_scan_completed(wl->hw, true);
1042 wl->state = WL1271_STATE_OFF;
1044 wl1271_disable_interrupts(wl);
1046 mutex_unlock(&wl->mutex);
1048 cancel_delayed_work_sync(&wl->scan_complete_work);
1049 cancel_work_sync(&wl->irq_work);
1050 cancel_work_sync(&wl->tx_work);
1051 cancel_delayed_work_sync(&wl->pspoll_work);
1052 cancel_delayed_work_sync(&wl->elp_work);
1054 mutex_lock(&wl->mutex);
1056 /* let's notify MAC80211 about the remaining pending TX frames */
1057 wl1271_tx_reset(wl);
1058 wl1271_power_off(wl);
1060 memset(wl->bssid, 0, ETH_ALEN);
1061 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1062 wl->ssid_len = 0;
1063 wl->bss_type = MAX_BSS_TYPE;
1064 wl->set_bss_type = MAX_BSS_TYPE;
1065 wl->band = IEEE80211_BAND_2GHZ;
1067 wl->rx_counter = 0;
1068 wl->psm_entry_retry = 0;
1069 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1070 wl->tx_blocks_available = 0;
1071 wl->tx_results_count = 0;
1072 wl->tx_packets_count = 0;
1073 wl->tx_security_last_seq = 0;
1074 wl->tx_security_seq = 0;
1075 wl->time_offset = 0;
1076 wl->session_counter = 0;
1077 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1078 wl->sta_rate_set = 0;
1079 wl->flags = 0;
1080 wl->vif = NULL;
1081 wl->filters = 0;
1083 for (i = 0; i < NUM_TX_QUEUES; i++)
1084 wl->tx_blocks_freed[i] = 0;
1086 wl1271_debugfs_reset(wl);
1088 kfree(wl->fw_status);
1089 wl->fw_status = NULL;
1090 kfree(wl->tx_res_if);
1091 wl->tx_res_if = NULL;
1092 kfree(wl->target_mem_map);
1093 wl->target_mem_map = NULL;
1096 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1097 struct ieee80211_vif *vif)
1099 struct wl1271 *wl = hw->priv;
1101 mutex_lock(&wl->mutex);
1102 WARN_ON(wl->vif != vif);
1103 __wl1271_op_remove_interface(wl);
1104 mutex_unlock(&wl->mutex);
1106 cancel_work_sync(&wl->recovery_work);
1109 static void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters)
1111 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1112 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1114 /* combine requested filters with current filter config */
1115 filters = wl->filters | filters;
1117 wl1271_debug(DEBUG_FILTERS, "RX filters set: ");
1119 if (filters & FIF_PROMISC_IN_BSS) {
1120 wl1271_debug(DEBUG_FILTERS, " - FIF_PROMISC_IN_BSS");
1121 wl->rx_config &= ~CFG_UNI_FILTER_EN;
1122 wl->rx_config |= CFG_BSSID_FILTER_EN;
1124 if (filters & FIF_BCN_PRBRESP_PROMISC) {
1125 wl1271_debug(DEBUG_FILTERS, " - FIF_BCN_PRBRESP_PROMISC");
1126 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1127 wl->rx_config &= ~CFG_SSID_FILTER_EN;
1129 if (filters & FIF_OTHER_BSS) {
1130 wl1271_debug(DEBUG_FILTERS, " - FIF_OTHER_BSS");
1131 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1133 if (filters & FIF_CONTROL) {
1134 wl1271_debug(DEBUG_FILTERS, " - FIF_CONTROL");
1135 wl->rx_filter |= CFG_RX_CTL_EN;
1137 if (filters & FIF_FCSFAIL) {
1138 wl1271_debug(DEBUG_FILTERS, " - FIF_FCSFAIL");
1139 wl->rx_filter |= CFG_RX_FCS_ERROR;
1143 static int wl1271_dummy_join(struct wl1271 *wl)
1145 int ret = 0;
1146 /* we need to use a dummy BSSID for now */
1147 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1148 0xad, 0xbe, 0xef };
1150 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1152 /* pass through frames from all BSS */
1153 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1155 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1156 if (ret < 0)
1157 goto out;
1159 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1161 out:
1162 return ret;
1165 static int wl1271_join(struct wl1271 *wl, bool set_assoc)
1167 int ret;
1170 * One of the side effects of the JOIN command is that is clears
1171 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1172 * to a WPA/WPA2 access point will therefore kill the data-path.
1173 * Currently there is no supported scenario for JOIN during
1174 * association - if it becomes a supported scenario, the WPA/WPA2 keys
1175 * must be handled somehow.
1178 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1179 wl1271_info("JOIN while associated.");
1181 if (set_assoc)
1182 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1184 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1185 if (ret < 0)
1186 goto out;
1188 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1190 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1191 goto out;
1194 * The join command disable the keep-alive mode, shut down its process,
1195 * and also clear the template config, so we need to reset it all after
1196 * the join. The acx_aid starts the keep-alive process, and the order
1197 * of the commands below is relevant.
1199 ret = wl1271_acx_keep_alive_mode(wl, true);
1200 if (ret < 0)
1201 goto out;
1203 ret = wl1271_acx_aid(wl, wl->aid);
1204 if (ret < 0)
1205 goto out;
1207 ret = wl1271_cmd_build_klv_null_data(wl);
1208 if (ret < 0)
1209 goto out;
1211 ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1212 ACX_KEEP_ALIVE_TPL_VALID);
1213 if (ret < 0)
1214 goto out;
1216 out:
1217 return ret;
1220 static int wl1271_unjoin(struct wl1271 *wl)
1222 int ret;
1224 /* to stop listening to a channel, we disconnect */
1225 ret = wl1271_cmd_disconnect(wl);
1226 if (ret < 0)
1227 goto out;
1229 clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1230 memset(wl->bssid, 0, ETH_ALEN);
1232 /* stop filterting packets based on bssid */
1233 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1235 out:
1236 return ret;
1239 static void wl1271_set_band_rate(struct wl1271 *wl)
1241 if (wl->band == IEEE80211_BAND_2GHZ)
1242 wl->basic_rate_set = wl->conf.tx.basic_rate;
1243 else
1244 wl->basic_rate_set = wl->conf.tx.basic_rate_5;
1247 static u32 wl1271_min_rate_get(struct wl1271 *wl)
1249 int i;
1250 u32 rate = 0;
1252 if (!wl->basic_rate_set) {
1253 WARN_ON(1);
1254 wl->basic_rate_set = wl->conf.tx.basic_rate;
1257 for (i = 0; !rate; i++) {
1258 if ((wl->basic_rate_set >> i) & 0x1)
1259 rate = 1 << i;
1262 return rate;
1265 static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
1267 int ret;
1269 if (idle) {
1270 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1271 ret = wl1271_unjoin(wl);
1272 if (ret < 0)
1273 goto out;
1275 wl->rate_set = wl1271_min_rate_get(wl);
1276 wl->sta_rate_set = 0;
1277 ret = wl1271_acx_rate_policies(wl);
1278 if (ret < 0)
1279 goto out;
1280 ret = wl1271_acx_keep_alive_config(
1281 wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1282 ACX_KEEP_ALIVE_TPL_INVALID);
1283 if (ret < 0)
1284 goto out;
1285 set_bit(WL1271_FLAG_IDLE, &wl->flags);
1286 } else {
1287 /* increment the session counter */
1288 wl->session_counter++;
1289 if (wl->session_counter >= SESSION_COUNTER_MAX)
1290 wl->session_counter = 0;
1291 ret = wl1271_dummy_join(wl);
1292 if (ret < 0)
1293 goto out;
1294 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
1297 out:
1298 return ret;
1301 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1303 struct wl1271 *wl = hw->priv;
1304 struct ieee80211_conf *conf = &hw->conf;
1305 int channel, ret = 0;
1307 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1309 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1310 channel,
1311 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1312 conf->power_level,
1313 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1316 * mac80211 will go to idle nearly immediately after transmitting some
1317 * frames, such as the deauth. To make sure those frames reach the air,
1318 * wait here until the TX queue is fully flushed.
1320 if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
1321 (conf->flags & IEEE80211_CONF_IDLE))
1322 wl1271_tx_flush(wl);
1324 mutex_lock(&wl->mutex);
1326 if (unlikely(wl->state == WL1271_STATE_OFF))
1327 goto out;
1329 ret = wl1271_ps_elp_wakeup(wl, false);
1330 if (ret < 0)
1331 goto out;
1333 /* if the channel changes while joined, join again */
1334 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
1335 ((wl->band != conf->channel->band) ||
1336 (wl->channel != channel))) {
1337 wl->band = conf->channel->band;
1338 wl->channel = channel;
1341 * FIXME: the mac80211 should really provide a fixed rate
1342 * to use here. for now, just use the smallest possible rate
1343 * for the band as a fixed rate for association frames and
1344 * other control messages.
1346 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1347 wl1271_set_band_rate(wl);
1349 wl->basic_rate = wl1271_min_rate_get(wl);
1350 ret = wl1271_acx_rate_policies(wl);
1351 if (ret < 0)
1352 wl1271_warning("rate policy for update channel "
1353 "failed %d", ret);
1355 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1356 ret = wl1271_join(wl, false);
1357 if (ret < 0)
1358 wl1271_warning("cmd join to update channel "
1359 "failed %d", ret);
1363 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1364 ret = wl1271_handle_idle(wl, conf->flags & IEEE80211_CONF_IDLE);
1365 if (ret < 0)
1366 wl1271_warning("idle mode change failed %d", ret);
1370 * if mac80211 changes the PSM mode, make sure the mode is not
1371 * incorrectly changed after the pspoll failure active window.
1373 if (changed & IEEE80211_CONF_CHANGE_PS)
1374 clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
1376 if (conf->flags & IEEE80211_CONF_PS &&
1377 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1378 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1381 * We enter PSM only if we're already associated.
1382 * If we're not, we'll enter it when joining an SSID,
1383 * through the bss_info_changed() hook.
1385 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1386 wl1271_debug(DEBUG_PSM, "psm enabled");
1387 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1388 wl->basic_rate, true);
1390 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1391 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1392 wl1271_debug(DEBUG_PSM, "psm disabled");
1394 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1396 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1397 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1398 wl->basic_rate, true);
1401 if (conf->power_level != wl->power_level) {
1402 ret = wl1271_acx_tx_power(wl, conf->power_level);
1403 if (ret < 0)
1404 goto out_sleep;
1406 wl->power_level = conf->power_level;
1409 out_sleep:
1410 wl1271_ps_elp_sleep(wl);
1412 out:
1413 mutex_unlock(&wl->mutex);
1415 return ret;
1418 struct wl1271_filter_params {
1419 bool enabled;
1420 int mc_list_length;
1421 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1424 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
1425 struct netdev_hw_addr_list *mc_list)
1427 struct wl1271_filter_params *fp;
1428 struct netdev_hw_addr *ha;
1429 struct wl1271 *wl = hw->priv;
1431 if (unlikely(wl->state == WL1271_STATE_OFF))
1432 return 0;
1434 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1435 if (!fp) {
1436 wl1271_error("Out of memory setting filters.");
1437 return 0;
1440 /* update multicast filtering parameters */
1441 fp->mc_list_length = 0;
1442 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
1443 fp->enabled = false;
1444 } else {
1445 fp->enabled = true;
1446 netdev_hw_addr_list_for_each(ha, mc_list) {
1447 memcpy(fp->mc_list[fp->mc_list_length],
1448 ha->addr, ETH_ALEN);
1449 fp->mc_list_length++;
1453 return (u64)(unsigned long)fp;
1456 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1457 FIF_ALLMULTI | \
1458 FIF_FCSFAIL | \
1459 FIF_BCN_PRBRESP_PROMISC | \
1460 FIF_CONTROL | \
1461 FIF_OTHER_BSS)
1463 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1464 unsigned int changed,
1465 unsigned int *total, u64 multicast)
1467 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1468 struct wl1271 *wl = hw->priv;
1469 int ret;
1471 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1473 mutex_lock(&wl->mutex);
1475 *total &= WL1271_SUPPORTED_FILTERS;
1476 changed &= WL1271_SUPPORTED_FILTERS;
1478 if (unlikely(wl->state == WL1271_STATE_OFF))
1479 goto out;
1481 ret = wl1271_ps_elp_wakeup(wl, false);
1482 if (ret < 0)
1483 goto out;
1486 if (*total & FIF_ALLMULTI)
1487 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1488 else if (fp)
1489 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1490 fp->mc_list,
1491 fp->mc_list_length);
1492 if (ret < 0)
1493 goto out_sleep;
1495 /* determine, whether supported filter values have changed */
1496 if (changed == 0)
1497 goto out_sleep;
1499 /* configure filters */
1500 wl->filters = *total;
1501 wl1271_configure_filters(wl, 0);
1503 /* apply configured filters */
1504 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1505 if (ret < 0)
1506 goto out_sleep;
1508 out_sleep:
1509 wl1271_ps_elp_sleep(wl);
1511 out:
1512 mutex_unlock(&wl->mutex);
1513 kfree(fp);
1516 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1517 struct ieee80211_vif *vif,
1518 struct ieee80211_sta *sta,
1519 struct ieee80211_key_conf *key_conf)
1521 struct wl1271 *wl = hw->priv;
1522 const u8 *addr;
1523 int ret;
1524 u32 tx_seq_32 = 0;
1525 u16 tx_seq_16 = 0;
1526 u8 key_type;
1528 static const u8 bcast_addr[ETH_ALEN] =
1529 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1531 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1533 addr = sta ? sta->addr : bcast_addr;
1535 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1536 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1537 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1538 key_conf->cipher, key_conf->keyidx,
1539 key_conf->keylen, key_conf->flags);
1540 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1542 if (is_zero_ether_addr(addr)) {
1543 /* We dont support TX only encryption */
1544 ret = -EOPNOTSUPP;
1545 goto out;
1548 mutex_lock(&wl->mutex);
1550 ret = wl1271_ps_elp_wakeup(wl, false);
1551 if (ret < 0)
1552 goto out_unlock;
1554 switch (key_conf->cipher) {
1555 case WLAN_CIPHER_SUITE_WEP40:
1556 case WLAN_CIPHER_SUITE_WEP104:
1557 key_type = KEY_WEP;
1559 key_conf->hw_key_idx = key_conf->keyidx;
1560 break;
1561 case WLAN_CIPHER_SUITE_TKIP:
1562 key_type = KEY_TKIP;
1564 key_conf->hw_key_idx = key_conf->keyidx;
1565 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1566 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1567 break;
1568 case WLAN_CIPHER_SUITE_CCMP:
1569 key_type = KEY_AES;
1571 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1572 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1573 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1574 break;
1575 case WL1271_CIPHER_SUITE_GEM:
1576 key_type = KEY_GEM;
1577 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1578 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1579 break;
1580 default:
1581 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
1583 ret = -EOPNOTSUPP;
1584 goto out_sleep;
1587 switch (cmd) {
1588 case SET_KEY:
1589 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1590 key_conf->keyidx, key_type,
1591 key_conf->keylen, key_conf->key,
1592 addr, tx_seq_32, tx_seq_16);
1593 if (ret < 0) {
1594 wl1271_error("Could not add or replace key");
1595 goto out_sleep;
1598 /* the default WEP key needs to be configured at least once */
1599 if (key_type == KEY_WEP) {
1600 ret = wl1271_cmd_set_default_wep_key(wl,
1601 wl->default_key);
1602 if (ret < 0)
1603 goto out_sleep;
1605 break;
1607 case DISABLE_KEY:
1608 /* The wl1271 does not allow to remove unicast keys - they
1609 will be cleared automatically on next CMD_JOIN. Ignore the
1610 request silently, as we dont want the mac80211 to emit
1611 an error message. */
1612 if (!is_broadcast_ether_addr(addr))
1613 break;
1615 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1616 key_conf->keyidx, key_type,
1617 key_conf->keylen, key_conf->key,
1618 addr, 0, 0);
1619 if (ret < 0) {
1620 wl1271_error("Could not remove key");
1621 goto out_sleep;
1623 break;
1625 default:
1626 wl1271_error("Unsupported key cmd 0x%x", cmd);
1627 ret = -EOPNOTSUPP;
1628 break;
1631 out_sleep:
1632 wl1271_ps_elp_sleep(wl);
1634 out_unlock:
1635 mutex_unlock(&wl->mutex);
1637 out:
1638 return ret;
1641 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1642 struct ieee80211_vif *vif,
1643 struct cfg80211_scan_request *req)
1645 struct wl1271 *wl = hw->priv;
1646 int ret;
1647 u8 *ssid = NULL;
1648 size_t len = 0;
1650 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1652 if (req->n_ssids) {
1653 ssid = req->ssids[0].ssid;
1654 len = req->ssids[0].ssid_len;
1657 mutex_lock(&wl->mutex);
1659 ret = wl1271_ps_elp_wakeup(wl, false);
1660 if (ret < 0)
1661 goto out;
1663 ret = wl1271_scan(hw->priv, ssid, len, req);
1665 wl1271_ps_elp_sleep(wl);
1667 out:
1668 mutex_unlock(&wl->mutex);
1670 return ret;
1673 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1675 struct wl1271 *wl = hw->priv;
1676 int ret = 0;
1678 mutex_lock(&wl->mutex);
1680 if (unlikely(wl->state == WL1271_STATE_OFF))
1681 goto out;
1683 ret = wl1271_ps_elp_wakeup(wl, false);
1684 if (ret < 0)
1685 goto out;
1687 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1688 if (ret < 0)
1689 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1691 wl1271_ps_elp_sleep(wl);
1693 out:
1694 mutex_unlock(&wl->mutex);
1696 return ret;
1699 static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *beacon)
1701 u8 *ptr = beacon->data +
1702 offsetof(struct ieee80211_mgmt, u.beacon.variable);
1704 /* find the location of the ssid in the beacon */
1705 while (ptr < beacon->data + beacon->len) {
1706 if (ptr[0] == WLAN_EID_SSID) {
1707 wl->ssid_len = ptr[1];
1708 memcpy(wl->ssid, ptr+2, wl->ssid_len);
1709 return;
1711 ptr += ptr[1];
1713 wl1271_error("ad-hoc beacon template has no SSID!\n");
1716 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1717 struct ieee80211_vif *vif,
1718 struct ieee80211_bss_conf *bss_conf,
1719 u32 changed)
1721 enum wl1271_cmd_ps_mode mode;
1722 struct wl1271 *wl = hw->priv;
1723 bool do_join = false;
1724 bool set_assoc = false;
1725 int ret;
1727 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1729 mutex_lock(&wl->mutex);
1731 ret = wl1271_ps_elp_wakeup(wl, false);
1732 if (ret < 0)
1733 goto out;
1735 if ((changed & BSS_CHANGED_BEACON_INT) &&
1736 (wl->bss_type == BSS_TYPE_IBSS)) {
1737 wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon interval updated: %d",
1738 bss_conf->beacon_int);
1740 wl->beacon_int = bss_conf->beacon_int;
1741 do_join = true;
1744 if ((changed & BSS_CHANGED_BEACON) &&
1745 (wl->bss_type == BSS_TYPE_IBSS)) {
1746 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
1748 wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon updated");
1750 if (beacon) {
1751 struct ieee80211_hdr *hdr;
1753 wl1271_ssid_set(wl, beacon);
1754 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1755 beacon->data,
1756 beacon->len, 0,
1757 wl1271_min_rate_get(wl));
1759 if (ret < 0) {
1760 dev_kfree_skb(beacon);
1761 goto out_sleep;
1764 hdr = (struct ieee80211_hdr *) beacon->data;
1765 hdr->frame_control = cpu_to_le16(
1766 IEEE80211_FTYPE_MGMT |
1767 IEEE80211_STYPE_PROBE_RESP);
1769 ret = wl1271_cmd_template_set(wl,
1770 CMD_TEMPL_PROBE_RESPONSE,
1771 beacon->data,
1772 beacon->len, 0,
1773 wl1271_min_rate_get(wl));
1774 dev_kfree_skb(beacon);
1775 if (ret < 0)
1776 goto out_sleep;
1778 /* Need to update the SSID (for filtering etc) */
1779 do_join = true;
1783 if ((changed & BSS_CHANGED_BEACON_ENABLED) &&
1784 (wl->bss_type == BSS_TYPE_IBSS)) {
1785 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
1786 bss_conf->enable_beacon ? "enabled" : "disabled");
1788 if (bss_conf->enable_beacon)
1789 wl->set_bss_type = BSS_TYPE_IBSS;
1790 else
1791 wl->set_bss_type = BSS_TYPE_STA_BSS;
1792 do_join = true;
1795 if (changed & BSS_CHANGED_CQM) {
1796 bool enable = false;
1797 if (bss_conf->cqm_rssi_thold)
1798 enable = true;
1799 ret = wl1271_acx_rssi_snr_trigger(wl, enable,
1800 bss_conf->cqm_rssi_thold,
1801 bss_conf->cqm_rssi_hyst);
1802 if (ret < 0)
1803 goto out;
1804 wl->rssi_thold = bss_conf->cqm_rssi_thold;
1807 if ((changed & BSS_CHANGED_BSSID) &&
1809 * Now we know the correct bssid, so we send a new join command
1810 * and enable the BSSID filter
1812 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1813 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1815 ret = wl1271_cmd_build_null_data(wl);
1816 if (ret < 0)
1817 goto out_sleep;
1819 ret = wl1271_build_qos_null_data(wl);
1820 if (ret < 0)
1821 goto out_sleep;
1823 /* filter out all packets not from this BSSID */
1824 wl1271_configure_filters(wl, 0);
1826 /* Need to update the BSSID (for filtering etc) */
1827 do_join = true;
1830 if (changed & BSS_CHANGED_ASSOC) {
1831 if (bss_conf->assoc) {
1832 u32 rates;
1833 wl->aid = bss_conf->aid;
1834 set_assoc = true;
1836 wl->ps_poll_failures = 0;
1839 * use basic rates from AP, and determine lowest rate
1840 * to use with control frames.
1842 rates = bss_conf->basic_rates;
1843 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
1844 rates);
1845 wl->basic_rate = wl1271_min_rate_get(wl);
1846 ret = wl1271_acx_rate_policies(wl);
1847 if (ret < 0)
1848 goto out_sleep;
1851 * with wl1271, we don't need to update the
1852 * beacon_int and dtim_period, because the firmware
1853 * updates it by itself when the first beacon is
1854 * received after a join.
1856 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1857 if (ret < 0)
1858 goto out_sleep;
1861 * The SSID is intentionally set to NULL here - the
1862 * firmware will set the probe request with a
1863 * broadcast SSID regardless of what we set in the
1864 * template.
1866 ret = wl1271_cmd_build_probe_req(wl, NULL, 0,
1867 NULL, 0, wl->band);
1869 /* enable the connection monitoring feature */
1870 ret = wl1271_acx_conn_monit_params(wl, true);
1871 if (ret < 0)
1872 goto out_sleep;
1874 /* If we want to go in PSM but we're not there yet */
1875 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
1876 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
1877 mode = STATION_POWER_SAVE_MODE;
1878 ret = wl1271_ps_set_mode(wl, mode,
1879 wl->basic_rate,
1880 true);
1881 if (ret < 0)
1882 goto out_sleep;
1884 } else {
1885 /* use defaults when not associated */
1886 clear_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags);
1887 clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1888 wl->aid = 0;
1890 /* re-enable dynamic ps - just in case */
1891 ieee80211_enable_dyn_ps(wl->vif);
1893 /* revert back to minimum rates for the current band */
1894 wl1271_set_band_rate(wl);
1895 wl->basic_rate = wl1271_min_rate_get(wl);
1896 ret = wl1271_acx_rate_policies(wl);
1897 if (ret < 0)
1898 goto out_sleep;
1900 /* disable connection monitor features */
1901 ret = wl1271_acx_conn_monit_params(wl, false);
1903 /* Disable the keep-alive feature */
1904 ret = wl1271_acx_keep_alive_mode(wl, false);
1906 if (ret < 0)
1907 goto out_sleep;
1912 if (changed & BSS_CHANGED_ERP_SLOT) {
1913 if (bss_conf->use_short_slot)
1914 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
1915 else
1916 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
1917 if (ret < 0) {
1918 wl1271_warning("Set slot time failed %d", ret);
1919 goto out_sleep;
1923 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
1924 if (bss_conf->use_short_preamble)
1925 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
1926 else
1927 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
1930 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
1931 if (bss_conf->use_cts_prot)
1932 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
1933 else
1934 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
1935 if (ret < 0) {
1936 wl1271_warning("Set ctsprotect failed %d", ret);
1937 goto out_sleep;
1941 if (changed & BSS_CHANGED_ARP_FILTER) {
1942 __be32 addr = bss_conf->arp_addr_list[0];
1943 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
1945 if (bss_conf->arp_addr_cnt == 1 && bss_conf->arp_filter_enabled)
1946 ret = wl1271_acx_arp_ip_filter(wl, true, addr);
1947 else
1948 ret = wl1271_acx_arp_ip_filter(wl, false, addr);
1950 if (ret < 0)
1951 goto out_sleep;
1954 if (do_join) {
1955 ret = wl1271_join(wl, set_assoc);
1956 if (ret < 0) {
1957 wl1271_warning("cmd join failed %d", ret);
1958 goto out_sleep;
1962 out_sleep:
1963 wl1271_ps_elp_sleep(wl);
1965 out:
1966 mutex_unlock(&wl->mutex);
1969 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
1970 const struct ieee80211_tx_queue_params *params)
1972 struct wl1271 *wl = hw->priv;
1973 u8 ps_scheme;
1974 int ret;
1976 mutex_lock(&wl->mutex);
1978 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
1980 ret = wl1271_ps_elp_wakeup(wl, false);
1981 if (ret < 0)
1982 goto out;
1984 /* the txop is confed in units of 32us by the mac80211, we need us */
1985 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
1986 params->cw_min, params->cw_max,
1987 params->aifs, params->txop << 5);
1988 if (ret < 0)
1989 goto out_sleep;
1991 if (params->uapsd)
1992 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
1993 else
1994 ps_scheme = CONF_PS_SCHEME_LEGACY;
1996 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
1997 CONF_CHANNEL_TYPE_EDCF,
1998 wl1271_tx_get_queue(queue),
1999 ps_scheme, CONF_ACK_POLICY_LEGACY, 0, 0);
2000 if (ret < 0)
2001 goto out_sleep;
2003 out_sleep:
2004 wl1271_ps_elp_sleep(wl);
2006 out:
2007 mutex_unlock(&wl->mutex);
2009 return ret;
2012 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
2015 struct wl1271 *wl = hw->priv;
2016 u64 mactime = ULLONG_MAX;
2017 int ret;
2019 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
2021 mutex_lock(&wl->mutex);
2023 ret = wl1271_ps_elp_wakeup(wl, false);
2024 if (ret < 0)
2025 goto out;
2027 ret = wl1271_acx_tsf_info(wl, &mactime);
2028 if (ret < 0)
2029 goto out_sleep;
2031 out_sleep:
2032 wl1271_ps_elp_sleep(wl);
2034 out:
2035 mutex_unlock(&wl->mutex);
2036 return mactime;
2039 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
2040 struct survey_info *survey)
2042 struct wl1271 *wl = hw->priv;
2043 struct ieee80211_conf *conf = &hw->conf;
2045 if (idx != 0)
2046 return -ENOENT;
2048 survey->channel = conf->channel;
2049 survey->filled = SURVEY_INFO_NOISE_DBM;
2050 survey->noise = wl->noise;
2052 return 0;
2055 /* can't be const, mac80211 writes to this */
2056 static struct ieee80211_rate wl1271_rates[] = {
2057 { .bitrate = 10,
2058 .hw_value = CONF_HW_BIT_RATE_1MBPS,
2059 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
2060 { .bitrate = 20,
2061 .hw_value = CONF_HW_BIT_RATE_2MBPS,
2062 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
2063 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2064 { .bitrate = 55,
2065 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
2066 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
2067 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2068 { .bitrate = 110,
2069 .hw_value = CONF_HW_BIT_RATE_11MBPS,
2070 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
2071 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2072 { .bitrate = 60,
2073 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2074 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2075 { .bitrate = 90,
2076 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2077 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2078 { .bitrate = 120,
2079 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2080 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2081 { .bitrate = 180,
2082 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2083 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2084 { .bitrate = 240,
2085 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2086 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2087 { .bitrate = 360,
2088 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2089 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2090 { .bitrate = 480,
2091 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2092 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2093 { .bitrate = 540,
2094 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2095 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2099 * Can't be const, mac80211 writes to this. The order of the channels here
2100 * is designed to improve scanning.
2102 static struct ieee80211_channel wl1271_channels[] = {
2103 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
2104 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
2105 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
2106 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
2107 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
2108 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
2109 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
2110 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
2111 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
2112 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
2113 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
2114 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
2115 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
2118 /* mapping to indexes for wl1271_rates */
2119 static const u8 wl1271_rate_to_idx_2ghz[] = {
2120 /* MCS rates are used only with 11n */
2121 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */
2122 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */
2123 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */
2124 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */
2125 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */
2126 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */
2127 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */
2128 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */
2130 11, /* CONF_HW_RXTX_RATE_54 */
2131 10, /* CONF_HW_RXTX_RATE_48 */
2132 9, /* CONF_HW_RXTX_RATE_36 */
2133 8, /* CONF_HW_RXTX_RATE_24 */
2135 /* TI-specific rate */
2136 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
2138 7, /* CONF_HW_RXTX_RATE_18 */
2139 6, /* CONF_HW_RXTX_RATE_12 */
2140 3, /* CONF_HW_RXTX_RATE_11 */
2141 5, /* CONF_HW_RXTX_RATE_9 */
2142 4, /* CONF_HW_RXTX_RATE_6 */
2143 2, /* CONF_HW_RXTX_RATE_5_5 */
2144 1, /* CONF_HW_RXTX_RATE_2 */
2145 0 /* CONF_HW_RXTX_RATE_1 */
2148 /* can't be const, mac80211 writes to this */
2149 static struct ieee80211_supported_band wl1271_band_2ghz = {
2150 .channels = wl1271_channels,
2151 .n_channels = ARRAY_SIZE(wl1271_channels),
2152 .bitrates = wl1271_rates,
2153 .n_bitrates = ARRAY_SIZE(wl1271_rates),
2156 /* 5 GHz data rates for WL1273 */
2157 static struct ieee80211_rate wl1271_rates_5ghz[] = {
2158 { .bitrate = 60,
2159 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2160 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2161 { .bitrate = 90,
2162 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2163 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2164 { .bitrate = 120,
2165 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2166 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2167 { .bitrate = 180,
2168 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2169 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2170 { .bitrate = 240,
2171 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2172 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2173 { .bitrate = 360,
2174 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2175 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2176 { .bitrate = 480,
2177 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2178 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2179 { .bitrate = 540,
2180 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2181 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2185 * 5 GHz band channels for WL1273 - can't be const, mac80211 writes to this.
2186 * The order of the channels here is designed to improve scanning.
2188 static struct ieee80211_channel wl1271_channels_5ghz[] = {
2189 { .hw_value = 183, .center_freq = 4915},
2190 { .hw_value = 188, .center_freq = 4940},
2191 { .hw_value = 8, .center_freq = 5040},
2192 { .hw_value = 34, .center_freq = 5170},
2193 { .hw_value = 44, .center_freq = 5220},
2194 { .hw_value = 60, .center_freq = 5300},
2195 { .hw_value = 112, .center_freq = 5560},
2196 { .hw_value = 132, .center_freq = 5660},
2197 { .hw_value = 157, .center_freq = 5785},
2198 { .hw_value = 184, .center_freq = 4920},
2199 { .hw_value = 189, .center_freq = 4945},
2200 { .hw_value = 9, .center_freq = 5045},
2201 { .hw_value = 36, .center_freq = 5180},
2202 { .hw_value = 46, .center_freq = 5230},
2203 { .hw_value = 64, .center_freq = 5320},
2204 { .hw_value = 116, .center_freq = 5580},
2205 { .hw_value = 136, .center_freq = 5680},
2206 { .hw_value = 192, .center_freq = 4960},
2207 { .hw_value = 11, .center_freq = 5055},
2208 { .hw_value = 38, .center_freq = 5190},
2209 { .hw_value = 48, .center_freq = 5240},
2210 { .hw_value = 100, .center_freq = 5500},
2211 { .hw_value = 120, .center_freq = 5600},
2212 { .hw_value = 140, .center_freq = 5700},
2213 { .hw_value = 185, .center_freq = 4925},
2214 { .hw_value = 196, .center_freq = 4980},
2215 { .hw_value = 12, .center_freq = 5060},
2216 { .hw_value = 40, .center_freq = 5200},
2217 { .hw_value = 52, .center_freq = 5260},
2218 { .hw_value = 104, .center_freq = 5520},
2219 { .hw_value = 124, .center_freq = 5620},
2220 { .hw_value = 149, .center_freq = 5745},
2221 { .hw_value = 161, .center_freq = 5805},
2222 { .hw_value = 187, .center_freq = 4935},
2223 { .hw_value = 7, .center_freq = 5035},
2224 { .hw_value = 16, .center_freq = 5080},
2225 { .hw_value = 42, .center_freq = 5210},
2226 { .hw_value = 56, .center_freq = 5280},
2227 { .hw_value = 108, .center_freq = 5540},
2228 { .hw_value = 128, .center_freq = 5640},
2229 { .hw_value = 153, .center_freq = 5765},
2230 { .hw_value = 165, .center_freq = 5825},
2233 /* mapping to indexes for wl1271_rates_5ghz */
2234 static const u8 wl1271_rate_to_idx_5ghz[] = {
2235 /* MCS rates are used only with 11n */
2236 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */
2237 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */
2238 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */
2239 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */
2240 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */
2241 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */
2242 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */
2243 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */
2245 7, /* CONF_HW_RXTX_RATE_54 */
2246 6, /* CONF_HW_RXTX_RATE_48 */
2247 5, /* CONF_HW_RXTX_RATE_36 */
2248 4, /* CONF_HW_RXTX_RATE_24 */
2250 /* TI-specific rate */
2251 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
2253 3, /* CONF_HW_RXTX_RATE_18 */
2254 2, /* CONF_HW_RXTX_RATE_12 */
2255 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
2256 1, /* CONF_HW_RXTX_RATE_9 */
2257 0, /* CONF_HW_RXTX_RATE_6 */
2258 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
2259 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
2260 CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
2263 static struct ieee80211_supported_band wl1271_band_5ghz = {
2264 .channels = wl1271_channels_5ghz,
2265 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
2266 .bitrates = wl1271_rates_5ghz,
2267 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
2270 static const u8 *wl1271_band_rate_to_idx[] = {
2271 [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
2272 [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
2275 static const struct ieee80211_ops wl1271_ops = {
2276 .start = wl1271_op_start,
2277 .stop = wl1271_op_stop,
2278 .add_interface = wl1271_op_add_interface,
2279 .remove_interface = wl1271_op_remove_interface,
2280 .config = wl1271_op_config,
2281 .prepare_multicast = wl1271_op_prepare_multicast,
2282 .configure_filter = wl1271_op_configure_filter,
2283 .tx = wl1271_op_tx,
2284 .set_key = wl1271_op_set_key,
2285 .hw_scan = wl1271_op_hw_scan,
2286 .bss_info_changed = wl1271_op_bss_info_changed,
2287 .set_rts_threshold = wl1271_op_set_rts_threshold,
2288 .conf_tx = wl1271_op_conf_tx,
2289 .get_tsf = wl1271_op_get_tsf,
2290 .get_survey = wl1271_op_get_survey,
2291 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
2295 u8 wl1271_rate_to_idx(struct wl1271 *wl, int rate)
2297 u8 idx;
2299 BUG_ON(wl->band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
2301 if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
2302 wl1271_error("Illegal RX rate from HW: %d", rate);
2303 return 0;
2306 idx = wl1271_band_rate_to_idx[wl->band][rate];
2307 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
2308 wl1271_error("Unsupported RX rate from HW: %d", rate);
2309 return 0;
2312 return idx;
2315 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
2316 struct device_attribute *attr,
2317 char *buf)
2319 struct wl1271 *wl = dev_get_drvdata(dev);
2320 ssize_t len;
2322 len = PAGE_SIZE;
2324 mutex_lock(&wl->mutex);
2325 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
2326 wl->sg_enabled);
2327 mutex_unlock(&wl->mutex);
2329 return len;
2333 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
2334 struct device_attribute *attr,
2335 const char *buf, size_t count)
2337 struct wl1271 *wl = dev_get_drvdata(dev);
2338 unsigned long res;
2339 int ret;
2341 ret = strict_strtoul(buf, 10, &res);
2343 if (ret < 0) {
2344 wl1271_warning("incorrect value written to bt_coex_mode");
2345 return count;
2348 mutex_lock(&wl->mutex);
2350 res = !!res;
2352 if (res == wl->sg_enabled)
2353 goto out;
2355 wl->sg_enabled = res;
2357 if (wl->state == WL1271_STATE_OFF)
2358 goto out;
2360 ret = wl1271_ps_elp_wakeup(wl, false);
2361 if (ret < 0)
2362 goto out;
2364 wl1271_acx_sg_enable(wl, wl->sg_enabled);
2365 wl1271_ps_elp_sleep(wl);
2367 out:
2368 mutex_unlock(&wl->mutex);
2369 return count;
2372 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
2373 wl1271_sysfs_show_bt_coex_state,
2374 wl1271_sysfs_store_bt_coex_state);
2376 static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
2377 struct device_attribute *attr,
2378 char *buf)
2380 struct wl1271 *wl = dev_get_drvdata(dev);
2381 ssize_t len;
2383 len = PAGE_SIZE;
2385 mutex_lock(&wl->mutex);
2386 if (wl->hw_pg_ver >= 0)
2387 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
2388 else
2389 len = snprintf(buf, len, "n/a\n");
2390 mutex_unlock(&wl->mutex);
2392 return len;
2395 static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
2396 wl1271_sysfs_show_hw_pg_ver, NULL);
2398 int wl1271_register_hw(struct wl1271 *wl)
2400 int ret;
2402 if (wl->mac80211_registered)
2403 return 0;
2405 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
2407 ret = ieee80211_register_hw(wl->hw);
2408 if (ret < 0) {
2409 wl1271_error("unable to register mac80211 hw: %d", ret);
2410 return ret;
2413 wl->mac80211_registered = true;
2415 register_netdevice_notifier(&wl1271_dev_notifier);
2417 wl1271_notice("loaded");
2419 return 0;
2421 EXPORT_SYMBOL_GPL(wl1271_register_hw);
2423 void wl1271_unregister_hw(struct wl1271 *wl)
2425 unregister_netdevice_notifier(&wl1271_dev_notifier);
2426 ieee80211_unregister_hw(wl->hw);
2427 wl->mac80211_registered = false;
2430 EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
2432 int wl1271_init_ieee80211(struct wl1271 *wl)
2434 static const u32 cipher_suites[] = {
2435 WLAN_CIPHER_SUITE_WEP40,
2436 WLAN_CIPHER_SUITE_WEP104,
2437 WLAN_CIPHER_SUITE_TKIP,
2438 WLAN_CIPHER_SUITE_CCMP,
2439 WL1271_CIPHER_SUITE_GEM,
2442 /* The tx descriptor buffer and the TKIP space. */
2443 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
2444 sizeof(struct wl1271_tx_hw_descr);
2446 /* unit us */
2447 /* FIXME: find a proper value */
2448 wl->hw->channel_change_time = 10000;
2449 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
2451 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
2452 IEEE80211_HW_BEACON_FILTER |
2453 IEEE80211_HW_SUPPORTS_PS |
2454 IEEE80211_HW_SUPPORTS_UAPSD |
2455 IEEE80211_HW_HAS_RATE_CONTROL |
2456 IEEE80211_HW_CONNECTION_MONITOR |
2457 IEEE80211_HW_SUPPORTS_CQM_RSSI;
2459 wl->hw->wiphy->cipher_suites = cipher_suites;
2460 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
2462 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2463 BIT(NL80211_IFTYPE_ADHOC);
2464 wl->hw->wiphy->max_scan_ssids = 1;
2465 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
2466 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
2468 wl->hw->queues = 4;
2469 wl->hw->max_rates = 1;
2471 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
2473 return 0;
2475 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
2477 #define WL1271_DEFAULT_CHANNEL 0
2479 struct ieee80211_hw *wl1271_alloc_hw(void)
2481 struct ieee80211_hw *hw;
2482 struct platform_device *plat_dev = NULL;
2483 struct wl1271 *wl;
2484 int i, ret;
2485 unsigned int order;
2487 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
2488 if (!hw) {
2489 wl1271_error("could not alloc ieee80211_hw");
2490 ret = -ENOMEM;
2491 goto err_hw_alloc;
2494 plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
2495 if (!plat_dev) {
2496 wl1271_error("could not allocate platform_device");
2497 ret = -ENOMEM;
2498 goto err_plat_alloc;
2501 wl = hw->priv;
2502 memset(wl, 0, sizeof(*wl));
2504 INIT_LIST_HEAD(&wl->list);
2506 wl->hw = hw;
2507 wl->plat_dev = plat_dev;
2509 skb_queue_head_init(&wl->tx_queue);
2511 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
2512 INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
2513 INIT_WORK(&wl->irq_work, wl1271_irq_work);
2514 INIT_WORK(&wl->tx_work, wl1271_tx_work);
2515 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
2516 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
2517 wl->channel = WL1271_DEFAULT_CHANNEL;
2518 wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
2519 wl->default_key = 0;
2520 wl->rx_counter = 0;
2521 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
2522 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
2523 wl->psm_entry_retry = 0;
2524 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2525 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2526 wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
2527 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
2528 wl->sta_rate_set = 0;
2529 wl->band = IEEE80211_BAND_2GHZ;
2530 wl->vif = NULL;
2531 wl->flags = 0;
2532 wl->sg_enabled = true;
2533 wl->hw_pg_ver = -1;
2535 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
2536 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
2537 wl->tx_frames[i] = NULL;
2539 spin_lock_init(&wl->wl_lock);
2541 wl->state = WL1271_STATE_OFF;
2542 mutex_init(&wl->mutex);
2544 /* Apply default driver configuration. */
2545 wl1271_conf_init(wl);
2547 wl1271_debugfs_init(wl);
2549 order = get_order(WL1271_AGGR_BUFFER_SIZE);
2550 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
2551 if (!wl->aggr_buf) {
2552 ret = -ENOMEM;
2553 goto err_hw;
2556 /* Register platform device */
2557 ret = platform_device_register(wl->plat_dev);
2558 if (ret) {
2559 wl1271_error("couldn't register platform device");
2560 goto err_aggr;
2562 dev_set_drvdata(&wl->plat_dev->dev, wl);
2564 /* Create sysfs file to control bt coex state */
2565 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2566 if (ret < 0) {
2567 wl1271_error("failed to create sysfs file bt_coex_state");
2568 goto err_platform;
2571 /* Create sysfs file to get HW PG version */
2572 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
2573 if (ret < 0) {
2574 wl1271_error("failed to create sysfs file hw_pg_ver");
2575 goto err_bt_coex_state;
2578 return hw;
2580 err_bt_coex_state:
2581 device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2583 err_platform:
2584 platform_device_unregister(wl->plat_dev);
2586 err_aggr:
2587 free_pages((unsigned long)wl->aggr_buf, order);
2589 err_hw:
2590 wl1271_debugfs_exit(wl);
2591 kfree(plat_dev);
2593 err_plat_alloc:
2594 ieee80211_free_hw(hw);
2596 err_hw_alloc:
2598 return ERR_PTR(ret);
2600 EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
2602 int wl1271_free_hw(struct wl1271 *wl)
2604 platform_device_unregister(wl->plat_dev);
2605 free_pages((unsigned long)wl->aggr_buf,
2606 get_order(WL1271_AGGR_BUFFER_SIZE));
2607 kfree(wl->plat_dev);
2609 wl1271_debugfs_exit(wl);
2611 vfree(wl->fw);
2612 wl->fw = NULL;
2613 kfree(wl->nvs);
2614 wl->nvs = NULL;
2616 kfree(wl->fw_status);
2617 kfree(wl->tx_res_if);
2619 ieee80211_free_hw(wl->hw);
2621 return 0;
2623 EXPORT_SYMBOL_GPL(wl1271_free_hw);
2625 MODULE_LICENSE("GPL");
2626 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2627 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");