wl12xx: AP mode - fix bug in cleanup of wl1271_op_sta_add()
[linux-2.6/libata-dev.git] / drivers / net / wireless / wl12xx / main.c
blob92f8220433317f3752d74ed3fbdbd554e26733fd
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 "wl12xx.h"
35 #include "wl12xx_80211.h"
36 #include "reg.h"
37 #include "io.h"
38 #include "event.h"
39 #include "tx.h"
40 #include "rx.h"
41 #include "ps.h"
42 #include "init.h"
43 #include "debugfs.h"
44 #include "cmd.h"
45 #include "boot.h"
46 #include "testmode.h"
47 #include "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 .sta_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 .ap_rc_conf = {
157 [0] = {
158 .enabled_rates = CONF_TX_AP_ENABLED_RATES,
159 .short_retry_limit = 10,
160 .long_retry_limit = 10,
161 .aflags = 0,
163 [1] = {
164 .enabled_rates = CONF_TX_AP_ENABLED_RATES,
165 .short_retry_limit = 10,
166 .long_retry_limit = 10,
167 .aflags = 0,
169 [2] = {
170 .enabled_rates = CONF_TX_AP_ENABLED_RATES,
171 .short_retry_limit = 10,
172 .long_retry_limit = 10,
173 .aflags = 0,
175 [3] = {
176 .enabled_rates = CONF_TX_AP_ENABLED_RATES,
177 .short_retry_limit = 10,
178 .long_retry_limit = 10,
179 .aflags = 0,
182 .ap_mgmt_conf = {
183 .enabled_rates = CONF_TX_AP_DEFAULT_MGMT_RATES,
184 .short_retry_limit = 10,
185 .long_retry_limit = 10,
186 .aflags = 0,
188 .ap_bcst_conf = {
189 .enabled_rates = CONF_HW_BIT_RATE_1MBPS,
190 .short_retry_limit = 10,
191 .long_retry_limit = 10,
192 .aflags = 0,
194 .ap_max_tx_retries = 100,
195 .tid_conf_count = 4,
196 .tid_conf = {
197 [CONF_TX_AC_BE] = {
198 .queue_id = CONF_TX_AC_BE,
199 .channel_type = CONF_CHANNEL_TYPE_EDCF,
200 .tsid = CONF_TX_AC_BE,
201 .ps_scheme = CONF_PS_SCHEME_LEGACY,
202 .ack_policy = CONF_ACK_POLICY_LEGACY,
203 .apsd_conf = {0, 0},
205 [CONF_TX_AC_BK] = {
206 .queue_id = CONF_TX_AC_BK,
207 .channel_type = CONF_CHANNEL_TYPE_EDCF,
208 .tsid = CONF_TX_AC_BK,
209 .ps_scheme = CONF_PS_SCHEME_LEGACY,
210 .ack_policy = CONF_ACK_POLICY_LEGACY,
211 .apsd_conf = {0, 0},
213 [CONF_TX_AC_VI] = {
214 .queue_id = CONF_TX_AC_VI,
215 .channel_type = CONF_CHANNEL_TYPE_EDCF,
216 .tsid = CONF_TX_AC_VI,
217 .ps_scheme = CONF_PS_SCHEME_LEGACY,
218 .ack_policy = CONF_ACK_POLICY_LEGACY,
219 .apsd_conf = {0, 0},
221 [CONF_TX_AC_VO] = {
222 .queue_id = CONF_TX_AC_VO,
223 .channel_type = CONF_CHANNEL_TYPE_EDCF,
224 .tsid = CONF_TX_AC_VO,
225 .ps_scheme = CONF_PS_SCHEME_LEGACY,
226 .ack_policy = CONF_ACK_POLICY_LEGACY,
227 .apsd_conf = {0, 0},
230 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
231 .tx_compl_timeout = 700,
232 .tx_compl_threshold = 4,
233 .basic_rate = CONF_HW_BIT_RATE_1MBPS,
234 .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
235 .tmpl_short_retry_limit = 10,
236 .tmpl_long_retry_limit = 10,
238 .conn = {
239 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
240 .listen_interval = 1,
241 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
242 .bcn_filt_ie_count = 1,
243 .bcn_filt_ie = {
244 [0] = {
245 .ie = WLAN_EID_CHANNEL_SWITCH,
246 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
249 .synch_fail_thold = 10,
250 .bss_lose_timeout = 100,
251 .beacon_rx_timeout = 10000,
252 .broadcast_timeout = 20000,
253 .rx_broadcast_in_ps = 1,
254 .ps_poll_threshold = 10,
255 .ps_poll_recovery_period = 700,
256 .bet_enable = CONF_BET_MODE_ENABLE,
257 .bet_max_consecutive = 10,
258 .psm_entry_retries = 5,
259 .psm_exit_retries = 255,
260 .psm_entry_nullfunc_retries = 3,
261 .psm_entry_hangover_period = 1,
262 .keep_alive_interval = 55000,
263 .max_listen_interval = 20,
265 .itrim = {
266 .enable = false,
267 .timeout = 50000,
269 .pm_config = {
270 .host_clk_settling_time = 5000,
271 .host_fast_wakeup_support = false
273 .roam_trigger = {
274 .trigger_pacing = 1,
275 .avg_weight_rssi_beacon = 20,
276 .avg_weight_rssi_data = 10,
277 .avg_weight_snr_beacon = 20,
278 .avg_weight_snr_data = 10,
280 .scan = {
281 .min_dwell_time_active = 7500,
282 .max_dwell_time_active = 30000,
283 .min_dwell_time_passive = 100000,
284 .max_dwell_time_passive = 100000,
285 .num_probe_reqs = 2,
287 .rf = {
288 .tx_per_channel_power_compensation_2 = {
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 .tx_per_channel_power_compensation_5 = {
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 .ht = {
298 .tx_ba_win_size = 64,
299 .inactivity_timeout = 10000,
301 .mem = {
302 .num_stations = 1,
303 .ssid_profiles = 1,
304 .rx_block_num = 70,
305 .tx_min_block_num = 40,
306 .dynamic_memory = 0,
307 .min_req_tx_blocks = 104,
308 .min_req_rx_blocks = 22,
309 .tx_min = 27,
313 static void __wl1271_op_remove_interface(struct wl1271 *wl);
314 static void wl1271_free_ap_keys(struct wl1271 *wl);
317 static void wl1271_device_release(struct device *dev)
322 static struct platform_device wl1271_device = {
323 .name = "wl1271",
324 .id = -1,
326 /* device model insists to have a release function */
327 .dev = {
328 .release = wl1271_device_release,
332 static LIST_HEAD(wl_list);
334 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
335 void *arg)
337 struct net_device *dev = arg;
338 struct wireless_dev *wdev;
339 struct wiphy *wiphy;
340 struct ieee80211_hw *hw;
341 struct wl1271 *wl;
342 struct wl1271 *wl_temp;
343 int ret = 0;
345 /* Check that this notification is for us. */
346 if (what != NETDEV_CHANGE)
347 return NOTIFY_DONE;
349 wdev = dev->ieee80211_ptr;
350 if (wdev == NULL)
351 return NOTIFY_DONE;
353 wiphy = wdev->wiphy;
354 if (wiphy == NULL)
355 return NOTIFY_DONE;
357 hw = wiphy_priv(wiphy);
358 if (hw == NULL)
359 return NOTIFY_DONE;
361 wl_temp = hw->priv;
362 list_for_each_entry(wl, &wl_list, list) {
363 if (wl == wl_temp)
364 break;
366 if (wl != wl_temp)
367 return NOTIFY_DONE;
369 mutex_lock(&wl->mutex);
371 if (wl->state == WL1271_STATE_OFF)
372 goto out;
374 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
375 goto out;
377 ret = wl1271_ps_elp_wakeup(wl, false);
378 if (ret < 0)
379 goto out;
381 if ((dev->operstate == IF_OPER_UP) &&
382 !test_and_set_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags)) {
383 wl1271_cmd_set_sta_state(wl);
384 wl1271_info("Association completed.");
387 wl1271_ps_elp_sleep(wl);
389 out:
390 mutex_unlock(&wl->mutex);
392 return NOTIFY_OK;
395 static int wl1271_reg_notify(struct wiphy *wiphy,
396 struct regulatory_request *request)
398 struct ieee80211_supported_band *band;
399 struct ieee80211_channel *ch;
400 int i;
402 band = wiphy->bands[IEEE80211_BAND_5GHZ];
403 for (i = 0; i < band->n_channels; i++) {
404 ch = &band->channels[i];
405 if (ch->flags & IEEE80211_CHAN_DISABLED)
406 continue;
408 if (ch->flags & IEEE80211_CHAN_RADAR)
409 ch->flags |= IEEE80211_CHAN_NO_IBSS |
410 IEEE80211_CHAN_PASSIVE_SCAN;
414 return 0;
417 static void wl1271_conf_init(struct wl1271 *wl)
421 * This function applies the default configuration to the driver. This
422 * function is invoked upon driver load (spi probe.)
424 * The configuration is stored in a run-time structure in order to
425 * facilitate for run-time adjustment of any of the parameters. Making
426 * changes to the configuration structure will apply the new values on
427 * the next interface up (wl1271_op_start.)
430 /* apply driver default configuration */
431 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
435 static int wl1271_plt_init(struct wl1271 *wl)
437 struct conf_tx_ac_category *conf_ac;
438 struct conf_tx_tid *conf_tid;
439 int ret, i;
441 ret = wl1271_cmd_general_parms(wl);
442 if (ret < 0)
443 return ret;
445 ret = wl1271_cmd_radio_parms(wl);
446 if (ret < 0)
447 return ret;
449 ret = wl1271_cmd_ext_radio_parms(wl);
450 if (ret < 0)
451 return ret;
453 ret = wl1271_sta_init_templates_config(wl);
454 if (ret < 0)
455 return ret;
457 ret = wl1271_acx_init_mem_config(wl);
458 if (ret < 0)
459 return ret;
461 /* PHY layer config */
462 ret = wl1271_init_phy_config(wl);
463 if (ret < 0)
464 goto out_free_memmap;
466 ret = wl1271_acx_dco_itrim_params(wl);
467 if (ret < 0)
468 goto out_free_memmap;
470 /* Initialize connection monitoring thresholds */
471 ret = wl1271_acx_conn_monit_params(wl, false);
472 if (ret < 0)
473 goto out_free_memmap;
475 /* Bluetooth WLAN coexistence */
476 ret = wl1271_init_pta(wl);
477 if (ret < 0)
478 goto out_free_memmap;
480 /* Energy detection */
481 ret = wl1271_init_energy_detection(wl);
482 if (ret < 0)
483 goto out_free_memmap;
485 ret = wl1271_acx_sta_mem_cfg(wl);
486 if (ret < 0)
487 goto out_free_memmap;
489 /* Default fragmentation threshold */
490 ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
491 if (ret < 0)
492 goto out_free_memmap;
494 /* Default TID/AC configuration */
495 BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
496 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
497 conf_ac = &wl->conf.tx.ac_conf[i];
498 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
499 conf_ac->cw_max, conf_ac->aifsn,
500 conf_ac->tx_op_limit);
501 if (ret < 0)
502 goto out_free_memmap;
504 conf_tid = &wl->conf.tx.tid_conf[i];
505 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
506 conf_tid->channel_type,
507 conf_tid->tsid,
508 conf_tid->ps_scheme,
509 conf_tid->ack_policy,
510 conf_tid->apsd_conf[0],
511 conf_tid->apsd_conf[1]);
512 if (ret < 0)
513 goto out_free_memmap;
516 /* Enable data path */
517 ret = wl1271_cmd_data_path(wl, 1);
518 if (ret < 0)
519 goto out_free_memmap;
521 /* Configure for CAM power saving (ie. always active) */
522 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
523 if (ret < 0)
524 goto out_free_memmap;
526 /* configure PM */
527 ret = wl1271_acx_pm_config(wl);
528 if (ret < 0)
529 goto out_free_memmap;
531 return 0;
533 out_free_memmap:
534 kfree(wl->target_mem_map);
535 wl->target_mem_map = NULL;
537 return ret;
540 static void wl1271_fw_status(struct wl1271 *wl,
541 struct wl1271_fw_full_status *full_status)
543 struct wl1271_fw_common_status *status = &full_status->common;
544 struct timespec ts;
545 u32 total = 0;
546 int i;
548 if (wl->bss_type == BSS_TYPE_AP_BSS)
549 wl1271_raw_read(wl, FW_STATUS_ADDR, status,
550 sizeof(struct wl1271_fw_ap_status), false);
551 else
552 wl1271_raw_read(wl, FW_STATUS_ADDR, status,
553 sizeof(struct wl1271_fw_sta_status), false);
555 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
556 "drv_rx_counter = %d, tx_results_counter = %d)",
557 status->intr,
558 status->fw_rx_counter,
559 status->drv_rx_counter,
560 status->tx_results_counter);
562 /* update number of available TX blocks */
563 for (i = 0; i < NUM_TX_QUEUES; i++) {
564 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
565 wl->tx_blocks_freed[i];
567 wl->tx_blocks_freed[i] =
568 le32_to_cpu(status->tx_released_blks[i]);
569 wl->tx_blocks_available += cnt;
570 total += cnt;
573 /* if more blocks are available now, tx work can be scheduled */
574 if (total)
575 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
577 /* update the host-chipset time offset */
578 getnstimeofday(&ts);
579 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
580 (s64)le32_to_cpu(status->fw_localtime);
583 #define WL1271_IRQ_MAX_LOOPS 10
585 static void wl1271_irq_work(struct work_struct *work)
587 int ret;
588 u32 intr;
589 int loopcount = WL1271_IRQ_MAX_LOOPS;
590 unsigned long flags;
591 struct wl1271 *wl =
592 container_of(work, struct wl1271, irq_work);
594 mutex_lock(&wl->mutex);
596 wl1271_debug(DEBUG_IRQ, "IRQ work");
598 if (unlikely(wl->state == WL1271_STATE_OFF))
599 goto out;
601 ret = wl1271_ps_elp_wakeup(wl, true);
602 if (ret < 0)
603 goto out;
605 spin_lock_irqsave(&wl->wl_lock, flags);
606 while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
607 clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
608 spin_unlock_irqrestore(&wl->wl_lock, flags);
609 loopcount--;
611 wl1271_fw_status(wl, wl->fw_status);
612 intr = le32_to_cpu(wl->fw_status->common.intr);
613 if (!intr) {
614 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
615 spin_lock_irqsave(&wl->wl_lock, flags);
616 continue;
619 intr &= WL1271_INTR_MASK;
621 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
622 wl1271_error("watchdog interrupt received! "
623 "starting recovery.");
624 ieee80211_queue_work(wl->hw, &wl->recovery_work);
626 /* restarting the chip. ignore any other interrupt. */
627 goto out;
630 if (intr & WL1271_ACX_INTR_DATA) {
631 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
633 /* check for tx results */
634 if (wl->fw_status->common.tx_results_counter !=
635 (wl->tx_results_count & 0xff))
636 wl1271_tx_complete(wl);
638 /* Check if any tx blocks were freed */
639 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
640 wl->tx_queue_count) {
642 * In order to avoid starvation of the TX path,
643 * call the work function directly.
645 wl1271_tx_work_locked(wl);
648 wl1271_rx(wl, &wl->fw_status->common);
651 if (intr & WL1271_ACX_INTR_EVENT_A) {
652 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
653 wl1271_event_handle(wl, 0);
656 if (intr & WL1271_ACX_INTR_EVENT_B) {
657 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
658 wl1271_event_handle(wl, 1);
661 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
662 wl1271_debug(DEBUG_IRQ,
663 "WL1271_ACX_INTR_INIT_COMPLETE");
665 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
666 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
668 spin_lock_irqsave(&wl->wl_lock, flags);
671 if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
672 ieee80211_queue_work(wl->hw, &wl->irq_work);
673 else
674 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
675 spin_unlock_irqrestore(&wl->wl_lock, flags);
677 wl1271_ps_elp_sleep(wl);
679 out:
680 mutex_unlock(&wl->mutex);
683 static int wl1271_fetch_firmware(struct wl1271 *wl)
685 const struct firmware *fw;
686 const char *fw_name;
687 int ret;
689 switch (wl->bss_type) {
690 case BSS_TYPE_AP_BSS:
691 fw_name = WL1271_AP_FW_NAME;
692 break;
693 case BSS_TYPE_IBSS:
694 case BSS_TYPE_STA_BSS:
695 fw_name = WL1271_FW_NAME;
696 break;
697 default:
698 wl1271_error("no compatible firmware for bss_type %d",
699 wl->bss_type);
700 return -EINVAL;
703 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
705 ret = request_firmware(&fw, fw_name, wl1271_wl_to_dev(wl));
707 if (ret < 0) {
708 wl1271_error("could not get firmware: %d", ret);
709 return ret;
712 if (fw->size % 4) {
713 wl1271_error("firmware size is not multiple of 32 bits: %zu",
714 fw->size);
715 ret = -EILSEQ;
716 goto out;
719 vfree(wl->fw);
720 wl->fw_len = fw->size;
721 wl->fw = vmalloc(wl->fw_len);
723 if (!wl->fw) {
724 wl1271_error("could not allocate memory for the firmware");
725 ret = -ENOMEM;
726 goto out;
729 memcpy(wl->fw, fw->data, wl->fw_len);
730 wl->fw_bss_type = wl->bss_type;
731 ret = 0;
733 out:
734 release_firmware(fw);
736 return ret;
739 static int wl1271_fetch_nvs(struct wl1271 *wl)
741 const struct firmware *fw;
742 int ret;
744 ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
746 if (ret < 0) {
747 wl1271_error("could not get nvs file: %d", ret);
748 return ret;
751 wl->nvs = kmemdup(fw->data, sizeof(struct wl1271_nvs_file), GFP_KERNEL);
753 if (!wl->nvs) {
754 wl1271_error("could not allocate memory for the nvs file");
755 ret = -ENOMEM;
756 goto out;
759 wl->nvs_len = fw->size;
761 out:
762 release_firmware(fw);
764 return ret;
767 static void wl1271_recovery_work(struct work_struct *work)
769 struct wl1271 *wl =
770 container_of(work, struct wl1271, recovery_work);
772 mutex_lock(&wl->mutex);
774 if (wl->state != WL1271_STATE_ON)
775 goto out;
777 wl1271_info("Hardware recovery in progress.");
779 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
780 ieee80211_connection_loss(wl->vif);
782 /* reboot the chipset */
783 __wl1271_op_remove_interface(wl);
784 ieee80211_restart_hw(wl->hw);
786 out:
787 mutex_unlock(&wl->mutex);
790 static void wl1271_fw_wakeup(struct wl1271 *wl)
792 u32 elp_reg;
794 elp_reg = ELPCTRL_WAKE_UP;
795 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
798 static int wl1271_setup(struct wl1271 *wl)
800 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
801 if (!wl->fw_status)
802 return -ENOMEM;
804 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
805 if (!wl->tx_res_if) {
806 kfree(wl->fw_status);
807 return -ENOMEM;
810 return 0;
813 static int wl1271_chip_wakeup(struct wl1271 *wl)
815 struct wl1271_partition_set partition;
816 int ret = 0;
818 msleep(WL1271_PRE_POWER_ON_SLEEP);
819 ret = wl1271_power_on(wl);
820 if (ret < 0)
821 goto out;
822 msleep(WL1271_POWER_ON_SLEEP);
823 wl1271_io_reset(wl);
824 wl1271_io_init(wl);
826 /* We don't need a real memory partition here, because we only want
827 * to use the registers at this point. */
828 memset(&partition, 0, sizeof(partition));
829 partition.reg.start = REGISTERS_BASE;
830 partition.reg.size = REGISTERS_DOWN_SIZE;
831 wl1271_set_partition(wl, &partition);
833 /* ELP module wake up */
834 wl1271_fw_wakeup(wl);
836 /* whal_FwCtrl_BootSm() */
838 /* 0. read chip id from CHIP_ID */
839 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
841 /* 1. check if chip id is valid */
843 switch (wl->chip.id) {
844 case CHIP_ID_1271_PG10:
845 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
846 wl->chip.id);
848 ret = wl1271_setup(wl);
849 if (ret < 0)
850 goto out;
851 break;
852 case CHIP_ID_1271_PG20:
853 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
854 wl->chip.id);
856 ret = wl1271_setup(wl);
857 if (ret < 0)
858 goto out;
859 break;
860 default:
861 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
862 ret = -ENODEV;
863 goto out;
866 /* Make sure the firmware type matches the BSS type */
867 if (wl->fw == NULL || wl->fw_bss_type != wl->bss_type) {
868 ret = wl1271_fetch_firmware(wl);
869 if (ret < 0)
870 goto out;
873 /* No NVS from netlink, try to get it from the filesystem */
874 if (wl->nvs == NULL) {
875 ret = wl1271_fetch_nvs(wl);
876 if (ret < 0)
877 goto out;
880 out:
881 return ret;
884 int wl1271_plt_start(struct wl1271 *wl)
886 int retries = WL1271_BOOT_RETRIES;
887 int ret;
889 mutex_lock(&wl->mutex);
891 wl1271_notice("power up");
893 if (wl->state != WL1271_STATE_OFF) {
894 wl1271_error("cannot go into PLT state because not "
895 "in off state: %d", wl->state);
896 ret = -EBUSY;
897 goto out;
900 wl->bss_type = BSS_TYPE_STA_BSS;
902 while (retries) {
903 retries--;
904 ret = wl1271_chip_wakeup(wl);
905 if (ret < 0)
906 goto power_off;
908 ret = wl1271_boot(wl);
909 if (ret < 0)
910 goto power_off;
912 ret = wl1271_plt_init(wl);
913 if (ret < 0)
914 goto irq_disable;
916 wl->state = WL1271_STATE_PLT;
917 wl1271_notice("firmware booted in PLT mode (%s)",
918 wl->chip.fw_ver_str);
919 goto out;
921 irq_disable:
922 wl1271_disable_interrupts(wl);
923 mutex_unlock(&wl->mutex);
924 /* Unlocking the mutex in the middle of handling is
925 inherently unsafe. In this case we deem it safe to do,
926 because we need to let any possibly pending IRQ out of
927 the system (and while we are WL1271_STATE_OFF the IRQ
928 work function will not do anything.) Also, any other
929 possible concurrent operations will fail due to the
930 current state, hence the wl1271 struct should be safe. */
931 cancel_work_sync(&wl->irq_work);
932 mutex_lock(&wl->mutex);
933 power_off:
934 wl1271_power_off(wl);
937 wl1271_error("firmware boot in PLT mode failed despite %d retries",
938 WL1271_BOOT_RETRIES);
939 out:
940 mutex_unlock(&wl->mutex);
942 return ret;
945 int __wl1271_plt_stop(struct wl1271 *wl)
947 int ret = 0;
949 wl1271_notice("power down");
951 if (wl->state != WL1271_STATE_PLT) {
952 wl1271_error("cannot power down because not in PLT "
953 "state: %d", wl->state);
954 ret = -EBUSY;
955 goto out;
958 wl1271_disable_interrupts(wl);
959 wl1271_power_off(wl);
961 wl->state = WL1271_STATE_OFF;
962 wl->rx_counter = 0;
964 mutex_unlock(&wl->mutex);
965 cancel_work_sync(&wl->irq_work);
966 cancel_work_sync(&wl->recovery_work);
967 mutex_lock(&wl->mutex);
968 out:
969 return ret;
972 int wl1271_plt_stop(struct wl1271 *wl)
974 int ret;
976 mutex_lock(&wl->mutex);
977 ret = __wl1271_plt_stop(wl);
978 mutex_unlock(&wl->mutex);
979 return ret;
982 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
984 struct wl1271 *wl = hw->priv;
985 unsigned long flags;
986 int q;
987 u8 hlid = 0;
989 spin_lock_irqsave(&wl->wl_lock, flags);
990 wl->tx_queue_count++;
993 * The workqueue is slow to process the tx_queue and we need stop
994 * the queue here, otherwise the queue will get too long.
996 if (wl->tx_queue_count >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
997 wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
998 ieee80211_stop_queues(wl->hw);
999 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
1002 spin_unlock_irqrestore(&wl->wl_lock, flags);
1004 /* queue the packet */
1005 q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
1006 if (wl->bss_type == BSS_TYPE_AP_BSS) {
1007 hlid = wl1271_tx_get_hlid(skb);
1008 wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d", hlid, q);
1009 skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1010 } else {
1011 skb_queue_tail(&wl->tx_queue[q], skb);
1015 * The chip specific setup must run before the first TX packet -
1016 * before that, the tx_work will not be initialized!
1019 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1020 ieee80211_queue_work(wl->hw, &wl->tx_work);
1022 return NETDEV_TX_OK;
1025 static struct notifier_block wl1271_dev_notifier = {
1026 .notifier_call = wl1271_dev_notify,
1029 static int wl1271_op_start(struct ieee80211_hw *hw)
1031 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1034 * We have to delay the booting of the hardware because
1035 * we need to know the local MAC address before downloading and
1036 * initializing the firmware. The MAC address cannot be changed
1037 * after boot, and without the proper MAC address, the firmware
1038 * will not function properly.
1040 * The MAC address is first known when the corresponding interface
1041 * is added. That is where we will initialize the hardware.
1043 * In addition, we currently have different firmwares for AP and managed
1044 * operation. We will know which to boot according to interface type.
1047 return 0;
1050 static void wl1271_op_stop(struct ieee80211_hw *hw)
1052 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
1055 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1056 struct ieee80211_vif *vif)
1058 struct wl1271 *wl = hw->priv;
1059 struct wiphy *wiphy = hw->wiphy;
1060 int retries = WL1271_BOOT_RETRIES;
1061 int ret = 0;
1062 bool booted = false;
1064 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1065 vif->type, vif->addr);
1067 mutex_lock(&wl->mutex);
1068 if (wl->vif) {
1069 wl1271_debug(DEBUG_MAC80211,
1070 "multiple vifs are not supported yet");
1071 ret = -EBUSY;
1072 goto out;
1075 switch (vif->type) {
1076 case NL80211_IFTYPE_STATION:
1077 wl->bss_type = BSS_TYPE_STA_BSS;
1078 wl->set_bss_type = BSS_TYPE_STA_BSS;
1079 break;
1080 case NL80211_IFTYPE_ADHOC:
1081 wl->bss_type = BSS_TYPE_IBSS;
1082 wl->set_bss_type = BSS_TYPE_STA_BSS;
1083 break;
1084 case NL80211_IFTYPE_AP:
1085 wl->bss_type = BSS_TYPE_AP_BSS;
1086 break;
1087 default:
1088 ret = -EOPNOTSUPP;
1089 goto out;
1092 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
1094 if (wl->state != WL1271_STATE_OFF) {
1095 wl1271_error("cannot start because not in off state: %d",
1096 wl->state);
1097 ret = -EBUSY;
1098 goto out;
1101 while (retries) {
1102 retries--;
1103 ret = wl1271_chip_wakeup(wl);
1104 if (ret < 0)
1105 goto power_off;
1107 ret = wl1271_boot(wl);
1108 if (ret < 0)
1109 goto power_off;
1111 ret = wl1271_hw_init(wl);
1112 if (ret < 0)
1113 goto irq_disable;
1115 booted = true;
1116 break;
1118 irq_disable:
1119 wl1271_disable_interrupts(wl);
1120 mutex_unlock(&wl->mutex);
1121 /* Unlocking the mutex in the middle of handling is
1122 inherently unsafe. In this case we deem it safe to do,
1123 because we need to let any possibly pending IRQ out of
1124 the system (and while we are WL1271_STATE_OFF the IRQ
1125 work function will not do anything.) Also, any other
1126 possible concurrent operations will fail due to the
1127 current state, hence the wl1271 struct should be safe. */
1128 cancel_work_sync(&wl->irq_work);
1129 mutex_lock(&wl->mutex);
1130 power_off:
1131 wl1271_power_off(wl);
1134 if (!booted) {
1135 wl1271_error("firmware boot failed despite %d retries",
1136 WL1271_BOOT_RETRIES);
1137 goto out;
1140 wl->vif = vif;
1141 wl->state = WL1271_STATE_ON;
1142 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
1144 /* update hw/fw version info in wiphy struct */
1145 wiphy->hw_version = wl->chip.id;
1146 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
1147 sizeof(wiphy->fw_version));
1150 * Now we know if 11a is supported (info from the NVS), so disable
1151 * 11a channels if not supported
1153 if (!wl->enable_11a)
1154 wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
1156 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
1157 wl->enable_11a ? "" : "not ");
1159 out:
1160 mutex_unlock(&wl->mutex);
1162 if (!ret)
1163 list_add(&wl->list, &wl_list);
1165 return ret;
1168 static void __wl1271_op_remove_interface(struct wl1271 *wl)
1170 int i;
1172 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1174 wl1271_info("down");
1176 list_del(&wl->list);
1178 WARN_ON(wl->state != WL1271_STATE_ON);
1180 /* enable dyn ps just in case (if left on due to fw crash etc) */
1181 if (wl->bss_type == BSS_TYPE_STA_BSS)
1182 ieee80211_enable_dyn_ps(wl->vif);
1184 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
1185 wl->scan.state = WL1271_SCAN_STATE_IDLE;
1186 kfree(wl->scan.scanned_ch);
1187 wl->scan.scanned_ch = NULL;
1188 wl->scan.req = NULL;
1189 ieee80211_scan_completed(wl->hw, true);
1192 wl->state = WL1271_STATE_OFF;
1194 wl1271_disable_interrupts(wl);
1196 mutex_unlock(&wl->mutex);
1198 cancel_delayed_work_sync(&wl->scan_complete_work);
1199 cancel_work_sync(&wl->irq_work);
1200 cancel_work_sync(&wl->tx_work);
1201 cancel_delayed_work_sync(&wl->pspoll_work);
1202 cancel_delayed_work_sync(&wl->elp_work);
1204 mutex_lock(&wl->mutex);
1206 /* let's notify MAC80211 about the remaining pending TX frames */
1207 wl1271_tx_reset(wl);
1208 wl1271_power_off(wl);
1210 memset(wl->bssid, 0, ETH_ALEN);
1211 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1212 wl->ssid_len = 0;
1213 wl->bss_type = MAX_BSS_TYPE;
1214 wl->set_bss_type = MAX_BSS_TYPE;
1215 wl->band = IEEE80211_BAND_2GHZ;
1217 wl->rx_counter = 0;
1218 wl->psm_entry_retry = 0;
1219 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1220 wl->tx_blocks_available = 0;
1221 wl->tx_results_count = 0;
1222 wl->tx_packets_count = 0;
1223 wl->tx_security_last_seq = 0;
1224 wl->tx_security_seq = 0;
1225 wl->time_offset = 0;
1226 wl->session_counter = 0;
1227 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1228 wl->flags = 0;
1229 wl->vif = NULL;
1230 wl->filters = 0;
1231 wl1271_free_ap_keys(wl);
1232 memset(wl->ap_hlid_map, 0, sizeof(wl->ap_hlid_map));
1234 for (i = 0; i < NUM_TX_QUEUES; i++)
1235 wl->tx_blocks_freed[i] = 0;
1237 wl1271_debugfs_reset(wl);
1239 kfree(wl->fw_status);
1240 wl->fw_status = NULL;
1241 kfree(wl->tx_res_if);
1242 wl->tx_res_if = NULL;
1243 kfree(wl->target_mem_map);
1244 wl->target_mem_map = NULL;
1247 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1248 struct ieee80211_vif *vif)
1250 struct wl1271 *wl = hw->priv;
1252 mutex_lock(&wl->mutex);
1254 * wl->vif can be null here if someone shuts down the interface
1255 * just when hardware recovery has been started.
1257 if (wl->vif) {
1258 WARN_ON(wl->vif != vif);
1259 __wl1271_op_remove_interface(wl);
1262 mutex_unlock(&wl->mutex);
1263 cancel_work_sync(&wl->recovery_work);
1266 static void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters)
1268 wl1271_set_default_filters(wl);
1270 /* combine requested filters with current filter config */
1271 filters = wl->filters | filters;
1273 wl1271_debug(DEBUG_FILTERS, "RX filters set: ");
1275 if (filters & FIF_PROMISC_IN_BSS) {
1276 wl1271_debug(DEBUG_FILTERS, " - FIF_PROMISC_IN_BSS");
1277 wl->rx_config &= ~CFG_UNI_FILTER_EN;
1278 wl->rx_config |= CFG_BSSID_FILTER_EN;
1280 if (filters & FIF_BCN_PRBRESP_PROMISC) {
1281 wl1271_debug(DEBUG_FILTERS, " - FIF_BCN_PRBRESP_PROMISC");
1282 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1283 wl->rx_config &= ~CFG_SSID_FILTER_EN;
1285 if (filters & FIF_OTHER_BSS) {
1286 wl1271_debug(DEBUG_FILTERS, " - FIF_OTHER_BSS");
1287 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1289 if (filters & FIF_CONTROL) {
1290 wl1271_debug(DEBUG_FILTERS, " - FIF_CONTROL");
1291 wl->rx_filter |= CFG_RX_CTL_EN;
1293 if (filters & FIF_FCSFAIL) {
1294 wl1271_debug(DEBUG_FILTERS, " - FIF_FCSFAIL");
1295 wl->rx_filter |= CFG_RX_FCS_ERROR;
1299 static int wl1271_dummy_join(struct wl1271 *wl)
1301 int ret = 0;
1302 /* we need to use a dummy BSSID for now */
1303 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1304 0xad, 0xbe, 0xef };
1306 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1308 /* pass through frames from all BSS */
1309 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1311 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1312 if (ret < 0)
1313 goto out;
1315 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1317 out:
1318 return ret;
1321 static int wl1271_join(struct wl1271 *wl, bool set_assoc)
1323 int ret;
1326 * One of the side effects of the JOIN command is that is clears
1327 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1328 * to a WPA/WPA2 access point will therefore kill the data-path.
1329 * Currently there is no supported scenario for JOIN during
1330 * association - if it becomes a supported scenario, the WPA/WPA2 keys
1331 * must be handled somehow.
1334 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1335 wl1271_info("JOIN while associated.");
1337 if (set_assoc)
1338 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1340 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1341 if (ret < 0)
1342 goto out;
1344 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1346 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1347 goto out;
1350 * The join command disable the keep-alive mode, shut down its process,
1351 * and also clear the template config, so we need to reset it all after
1352 * the join. The acx_aid starts the keep-alive process, and the order
1353 * of the commands below is relevant.
1355 ret = wl1271_acx_keep_alive_mode(wl, true);
1356 if (ret < 0)
1357 goto out;
1359 ret = wl1271_acx_aid(wl, wl->aid);
1360 if (ret < 0)
1361 goto out;
1363 ret = wl1271_cmd_build_klv_null_data(wl);
1364 if (ret < 0)
1365 goto out;
1367 ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1368 ACX_KEEP_ALIVE_TPL_VALID);
1369 if (ret < 0)
1370 goto out;
1372 out:
1373 return ret;
1376 static int wl1271_unjoin(struct wl1271 *wl)
1378 int ret;
1380 /* to stop listening to a channel, we disconnect */
1381 ret = wl1271_cmd_disconnect(wl);
1382 if (ret < 0)
1383 goto out;
1385 clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1386 memset(wl->bssid, 0, ETH_ALEN);
1388 /* stop filterting packets based on bssid */
1389 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1391 out:
1392 return ret;
1395 static void wl1271_set_band_rate(struct wl1271 *wl)
1397 if (wl->band == IEEE80211_BAND_2GHZ)
1398 wl->basic_rate_set = wl->conf.tx.basic_rate;
1399 else
1400 wl->basic_rate_set = wl->conf.tx.basic_rate_5;
1403 static int wl1271_sta_handle_idle(struct wl1271 *wl, bool idle)
1405 int ret;
1407 if (idle) {
1408 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1409 ret = wl1271_unjoin(wl);
1410 if (ret < 0)
1411 goto out;
1413 wl->rate_set = wl1271_tx_min_rate_get(wl);
1414 ret = wl1271_acx_sta_rate_policies(wl);
1415 if (ret < 0)
1416 goto out;
1417 ret = wl1271_acx_keep_alive_config(
1418 wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1419 ACX_KEEP_ALIVE_TPL_INVALID);
1420 if (ret < 0)
1421 goto out;
1422 set_bit(WL1271_FLAG_IDLE, &wl->flags);
1423 } else {
1424 /* increment the session counter */
1425 wl->session_counter++;
1426 if (wl->session_counter >= SESSION_COUNTER_MAX)
1427 wl->session_counter = 0;
1428 ret = wl1271_dummy_join(wl);
1429 if (ret < 0)
1430 goto out;
1431 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
1434 out:
1435 return ret;
1438 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1440 struct wl1271 *wl = hw->priv;
1441 struct ieee80211_conf *conf = &hw->conf;
1442 int channel, ret = 0;
1443 bool is_ap;
1445 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1447 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s"
1448 " changed 0x%x",
1449 channel,
1450 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1451 conf->power_level,
1452 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
1453 changed);
1456 * mac80211 will go to idle nearly immediately after transmitting some
1457 * frames, such as the deauth. To make sure those frames reach the air,
1458 * wait here until the TX queue is fully flushed.
1460 if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
1461 (conf->flags & IEEE80211_CONF_IDLE))
1462 wl1271_tx_flush(wl);
1464 mutex_lock(&wl->mutex);
1466 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1467 ret = -EAGAIN;
1468 goto out;
1471 is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
1473 ret = wl1271_ps_elp_wakeup(wl, false);
1474 if (ret < 0)
1475 goto out;
1477 /* if the channel changes while joined, join again */
1478 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
1479 ((wl->band != conf->channel->band) ||
1480 (wl->channel != channel))) {
1481 wl->band = conf->channel->band;
1482 wl->channel = channel;
1484 if (!is_ap) {
1486 * FIXME: the mac80211 should really provide a fixed
1487 * rate to use here. for now, just use the smallest
1488 * possible rate for the band as a fixed rate for
1489 * association frames and other control messages.
1491 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1492 wl1271_set_band_rate(wl);
1494 wl->basic_rate = wl1271_tx_min_rate_get(wl);
1495 ret = wl1271_acx_sta_rate_policies(wl);
1496 if (ret < 0)
1497 wl1271_warning("rate policy for channel "
1498 "failed %d", ret);
1500 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1501 ret = wl1271_join(wl, false);
1502 if (ret < 0)
1503 wl1271_warning("cmd join on channel "
1504 "failed %d", ret);
1509 if (changed & IEEE80211_CONF_CHANGE_IDLE && !is_ap) {
1510 ret = wl1271_sta_handle_idle(wl,
1511 conf->flags & IEEE80211_CONF_IDLE);
1512 if (ret < 0)
1513 wl1271_warning("idle mode change failed %d", ret);
1517 * if mac80211 changes the PSM mode, make sure the mode is not
1518 * incorrectly changed after the pspoll failure active window.
1520 if (changed & IEEE80211_CONF_CHANGE_PS)
1521 clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
1523 if (conf->flags & IEEE80211_CONF_PS &&
1524 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1525 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1528 * We enter PSM only if we're already associated.
1529 * If we're not, we'll enter it when joining an SSID,
1530 * through the bss_info_changed() hook.
1532 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1533 wl1271_debug(DEBUG_PSM, "psm enabled");
1534 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1535 wl->basic_rate, true);
1537 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1538 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1539 wl1271_debug(DEBUG_PSM, "psm disabled");
1541 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1543 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1544 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1545 wl->basic_rate, true);
1548 if (conf->power_level != wl->power_level) {
1549 ret = wl1271_acx_tx_power(wl, conf->power_level);
1550 if (ret < 0)
1551 goto out_sleep;
1553 wl->power_level = conf->power_level;
1556 out_sleep:
1557 wl1271_ps_elp_sleep(wl);
1559 out:
1560 mutex_unlock(&wl->mutex);
1562 return ret;
1565 struct wl1271_filter_params {
1566 bool enabled;
1567 int mc_list_length;
1568 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1571 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
1572 struct netdev_hw_addr_list *mc_list)
1574 struct wl1271_filter_params *fp;
1575 struct netdev_hw_addr *ha;
1576 struct wl1271 *wl = hw->priv;
1578 if (unlikely(wl->state == WL1271_STATE_OFF))
1579 return 0;
1581 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1582 if (!fp) {
1583 wl1271_error("Out of memory setting filters.");
1584 return 0;
1587 /* update multicast filtering parameters */
1588 fp->mc_list_length = 0;
1589 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
1590 fp->enabled = false;
1591 } else {
1592 fp->enabled = true;
1593 netdev_hw_addr_list_for_each(ha, mc_list) {
1594 memcpy(fp->mc_list[fp->mc_list_length],
1595 ha->addr, ETH_ALEN);
1596 fp->mc_list_length++;
1600 return (u64)(unsigned long)fp;
1603 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1604 FIF_ALLMULTI | \
1605 FIF_FCSFAIL | \
1606 FIF_BCN_PRBRESP_PROMISC | \
1607 FIF_CONTROL | \
1608 FIF_OTHER_BSS)
1610 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1611 unsigned int changed,
1612 unsigned int *total, u64 multicast)
1614 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1615 struct wl1271 *wl = hw->priv;
1616 int ret;
1618 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
1619 " total %x", changed, *total);
1621 mutex_lock(&wl->mutex);
1623 *total &= WL1271_SUPPORTED_FILTERS;
1624 changed &= WL1271_SUPPORTED_FILTERS;
1626 if (unlikely(wl->state == WL1271_STATE_OFF))
1627 goto out;
1629 ret = wl1271_ps_elp_wakeup(wl, false);
1630 if (ret < 0)
1631 goto out;
1633 if (wl->bss_type != BSS_TYPE_AP_BSS) {
1634 if (*total & FIF_ALLMULTI)
1635 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1636 else if (fp)
1637 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1638 fp->mc_list,
1639 fp->mc_list_length);
1640 if (ret < 0)
1641 goto out_sleep;
1644 /* determine, whether supported filter values have changed */
1645 if (changed == 0)
1646 goto out_sleep;
1648 /* configure filters */
1649 wl->filters = *total;
1650 wl1271_configure_filters(wl, 0);
1652 /* apply configured filters */
1653 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1654 if (ret < 0)
1655 goto out_sleep;
1657 out_sleep:
1658 wl1271_ps_elp_sleep(wl);
1660 out:
1661 mutex_unlock(&wl->mutex);
1662 kfree(fp);
1665 static int wl1271_record_ap_key(struct wl1271 *wl, u8 id, u8 key_type,
1666 u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
1667 u16 tx_seq_16)
1669 struct wl1271_ap_key *ap_key;
1670 int i;
1672 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
1674 if (key_size > MAX_KEY_SIZE)
1675 return -EINVAL;
1678 * Find next free entry in ap_keys. Also check we are not replacing
1679 * an existing key.
1681 for (i = 0; i < MAX_NUM_KEYS; i++) {
1682 if (wl->recorded_ap_keys[i] == NULL)
1683 break;
1685 if (wl->recorded_ap_keys[i]->id == id) {
1686 wl1271_warning("trying to record key replacement");
1687 return -EINVAL;
1691 if (i == MAX_NUM_KEYS)
1692 return -EBUSY;
1694 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
1695 if (!ap_key)
1696 return -ENOMEM;
1698 ap_key->id = id;
1699 ap_key->key_type = key_type;
1700 ap_key->key_size = key_size;
1701 memcpy(ap_key->key, key, key_size);
1702 ap_key->hlid = hlid;
1703 ap_key->tx_seq_32 = tx_seq_32;
1704 ap_key->tx_seq_16 = tx_seq_16;
1706 wl->recorded_ap_keys[i] = ap_key;
1707 return 0;
1710 static void wl1271_free_ap_keys(struct wl1271 *wl)
1712 int i;
1714 for (i = 0; i < MAX_NUM_KEYS; i++) {
1715 kfree(wl->recorded_ap_keys[i]);
1716 wl->recorded_ap_keys[i] = NULL;
1720 static int wl1271_ap_init_hwenc(struct wl1271 *wl)
1722 int i, ret = 0;
1723 struct wl1271_ap_key *key;
1724 bool wep_key_added = false;
1726 for (i = 0; i < MAX_NUM_KEYS; i++) {
1727 if (wl->recorded_ap_keys[i] == NULL)
1728 break;
1730 key = wl->recorded_ap_keys[i];
1731 ret = wl1271_cmd_set_ap_key(wl, KEY_ADD_OR_REPLACE,
1732 key->id, key->key_type,
1733 key->key_size, key->key,
1734 key->hlid, key->tx_seq_32,
1735 key->tx_seq_16);
1736 if (ret < 0)
1737 goto out;
1739 if (key->key_type == KEY_WEP)
1740 wep_key_added = true;
1743 if (wep_key_added) {
1744 ret = wl1271_cmd_set_ap_default_wep_key(wl, wl->default_key);
1745 if (ret < 0)
1746 goto out;
1749 out:
1750 wl1271_free_ap_keys(wl);
1751 return ret;
1754 static int wl1271_set_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
1755 u8 key_size, const u8 *key, u32 tx_seq_32,
1756 u16 tx_seq_16, struct ieee80211_sta *sta)
1758 int ret;
1759 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
1761 if (is_ap) {
1762 struct wl1271_station *wl_sta;
1763 u8 hlid;
1765 if (sta) {
1766 wl_sta = (struct wl1271_station *)sta->drv_priv;
1767 hlid = wl_sta->hlid;
1768 } else {
1769 hlid = WL1271_AP_BROADCAST_HLID;
1772 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
1774 * We do not support removing keys after AP shutdown.
1775 * Pretend we do to make mac80211 happy.
1777 if (action != KEY_ADD_OR_REPLACE)
1778 return 0;
1780 ret = wl1271_record_ap_key(wl, id,
1781 key_type, key_size,
1782 key, hlid, tx_seq_32,
1783 tx_seq_16);
1784 } else {
1785 ret = wl1271_cmd_set_ap_key(wl, action,
1786 id, key_type, key_size,
1787 key, hlid, tx_seq_32,
1788 tx_seq_16);
1791 if (ret < 0)
1792 return ret;
1793 } else {
1794 const u8 *addr;
1795 static const u8 bcast_addr[ETH_ALEN] = {
1796 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1799 addr = sta ? sta->addr : bcast_addr;
1801 if (is_zero_ether_addr(addr)) {
1802 /* We dont support TX only encryption */
1803 return -EOPNOTSUPP;
1806 /* The wl1271 does not allow to remove unicast keys - they
1807 will be cleared automatically on next CMD_JOIN. Ignore the
1808 request silently, as we dont want the mac80211 to emit
1809 an error message. */
1810 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
1811 return 0;
1813 ret = wl1271_cmd_set_sta_key(wl, action,
1814 id, key_type, key_size,
1815 key, addr, tx_seq_32,
1816 tx_seq_16);
1817 if (ret < 0)
1818 return ret;
1820 /* the default WEP key needs to be configured at least once */
1821 if (key_type == KEY_WEP) {
1822 ret = wl1271_cmd_set_sta_default_wep_key(wl,
1823 wl->default_key);
1824 if (ret < 0)
1825 return ret;
1829 return 0;
1832 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1833 struct ieee80211_vif *vif,
1834 struct ieee80211_sta *sta,
1835 struct ieee80211_key_conf *key_conf)
1837 struct wl1271 *wl = hw->priv;
1838 int ret;
1839 u32 tx_seq_32 = 0;
1840 u16 tx_seq_16 = 0;
1841 u8 key_type;
1843 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1845 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
1846 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1847 key_conf->cipher, key_conf->keyidx,
1848 key_conf->keylen, key_conf->flags);
1849 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1851 mutex_lock(&wl->mutex);
1853 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1854 ret = -EAGAIN;
1855 goto out_unlock;
1858 ret = wl1271_ps_elp_wakeup(wl, false);
1859 if (ret < 0)
1860 goto out_unlock;
1862 switch (key_conf->cipher) {
1863 case WLAN_CIPHER_SUITE_WEP40:
1864 case WLAN_CIPHER_SUITE_WEP104:
1865 key_type = KEY_WEP;
1867 key_conf->hw_key_idx = key_conf->keyidx;
1868 break;
1869 case WLAN_CIPHER_SUITE_TKIP:
1870 key_type = KEY_TKIP;
1872 key_conf->hw_key_idx = key_conf->keyidx;
1873 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1874 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1875 break;
1876 case WLAN_CIPHER_SUITE_CCMP:
1877 key_type = KEY_AES;
1879 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1880 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1881 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1882 break;
1883 case WL1271_CIPHER_SUITE_GEM:
1884 key_type = KEY_GEM;
1885 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1886 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1887 break;
1888 default:
1889 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
1891 ret = -EOPNOTSUPP;
1892 goto out_sleep;
1895 switch (cmd) {
1896 case SET_KEY:
1897 ret = wl1271_set_key(wl, KEY_ADD_OR_REPLACE,
1898 key_conf->keyidx, key_type,
1899 key_conf->keylen, key_conf->key,
1900 tx_seq_32, tx_seq_16, sta);
1901 if (ret < 0) {
1902 wl1271_error("Could not add or replace key");
1903 goto out_sleep;
1905 break;
1907 case DISABLE_KEY:
1908 ret = wl1271_set_key(wl, KEY_REMOVE,
1909 key_conf->keyidx, key_type,
1910 key_conf->keylen, key_conf->key,
1911 0, 0, sta);
1912 if (ret < 0) {
1913 wl1271_error("Could not remove key");
1914 goto out_sleep;
1916 break;
1918 default:
1919 wl1271_error("Unsupported key cmd 0x%x", cmd);
1920 ret = -EOPNOTSUPP;
1921 break;
1924 out_sleep:
1925 wl1271_ps_elp_sleep(wl);
1927 out_unlock:
1928 mutex_unlock(&wl->mutex);
1930 return ret;
1933 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1934 struct ieee80211_vif *vif,
1935 struct cfg80211_scan_request *req)
1937 struct wl1271 *wl = hw->priv;
1938 int ret;
1939 u8 *ssid = NULL;
1940 size_t len = 0;
1942 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1944 if (req->n_ssids) {
1945 ssid = req->ssids[0].ssid;
1946 len = req->ssids[0].ssid_len;
1949 mutex_lock(&wl->mutex);
1951 if (wl->state == WL1271_STATE_OFF) {
1953 * We cannot return -EBUSY here because cfg80211 will expect
1954 * a call to ieee80211_scan_completed if we do - in this case
1955 * there won't be any call.
1957 ret = -EAGAIN;
1958 goto out;
1961 ret = wl1271_ps_elp_wakeup(wl, false);
1962 if (ret < 0)
1963 goto out;
1965 ret = wl1271_scan(hw->priv, ssid, len, req);
1967 wl1271_ps_elp_sleep(wl);
1969 out:
1970 mutex_unlock(&wl->mutex);
1972 return ret;
1975 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
1977 struct wl1271 *wl = hw->priv;
1978 int ret = 0;
1980 mutex_lock(&wl->mutex);
1982 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1983 ret = -EAGAIN;
1984 goto out;
1987 ret = wl1271_ps_elp_wakeup(wl, false);
1988 if (ret < 0)
1989 goto out;
1991 ret = wl1271_acx_frag_threshold(wl, (u16)value);
1992 if (ret < 0)
1993 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
1995 wl1271_ps_elp_sleep(wl);
1997 out:
1998 mutex_unlock(&wl->mutex);
2000 return ret;
2003 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2005 struct wl1271 *wl = hw->priv;
2006 int ret = 0;
2008 mutex_lock(&wl->mutex);
2010 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2011 ret = -EAGAIN;
2012 goto out;
2015 ret = wl1271_ps_elp_wakeup(wl, false);
2016 if (ret < 0)
2017 goto out;
2019 ret = wl1271_acx_rts_threshold(wl, (u16) value);
2020 if (ret < 0)
2021 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
2023 wl1271_ps_elp_sleep(wl);
2025 out:
2026 mutex_unlock(&wl->mutex);
2028 return ret;
2031 static int wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *skb,
2032 int offset)
2034 u8 *ptr = skb->data + offset;
2036 /* find the location of the ssid in the beacon */
2037 while (ptr < skb->data + skb->len) {
2038 if (ptr[0] == WLAN_EID_SSID) {
2039 wl->ssid_len = ptr[1];
2040 memcpy(wl->ssid, ptr+2, wl->ssid_len);
2041 return 0;
2043 ptr += (ptr[1] + 2);
2046 wl1271_error("No SSID in IEs!\n");
2047 return -ENOENT;
2050 static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
2051 struct ieee80211_bss_conf *bss_conf,
2052 u32 changed)
2054 int ret = 0;
2056 if (changed & BSS_CHANGED_ERP_SLOT) {
2057 if (bss_conf->use_short_slot)
2058 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
2059 else
2060 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
2061 if (ret < 0) {
2062 wl1271_warning("Set slot time failed %d", ret);
2063 goto out;
2067 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2068 if (bss_conf->use_short_preamble)
2069 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
2070 else
2071 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
2074 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2075 if (bss_conf->use_cts_prot)
2076 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
2077 else
2078 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
2079 if (ret < 0) {
2080 wl1271_warning("Set ctsprotect failed %d", ret);
2081 goto out;
2085 out:
2086 return ret;
2089 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
2090 struct ieee80211_vif *vif,
2091 struct ieee80211_bss_conf *bss_conf,
2092 u32 changed)
2094 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
2095 int ret = 0;
2097 if ((changed & BSS_CHANGED_BEACON_INT)) {
2098 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
2099 bss_conf->beacon_int);
2101 wl->beacon_int = bss_conf->beacon_int;
2104 if ((changed & BSS_CHANGED_BEACON)) {
2105 struct ieee80211_hdr *hdr;
2106 int ieoffset = offsetof(struct ieee80211_mgmt,
2107 u.beacon.variable);
2108 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
2109 u16 tmpl_id;
2111 if (!beacon)
2112 goto out;
2114 wl1271_debug(DEBUG_MASTER, "beacon updated");
2116 ret = wl1271_ssid_set(wl, beacon, ieoffset);
2117 if (ret < 0) {
2118 dev_kfree_skb(beacon);
2119 goto out;
2121 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
2122 CMD_TEMPL_BEACON;
2123 ret = wl1271_cmd_template_set(wl, tmpl_id,
2124 beacon->data,
2125 beacon->len, 0,
2126 wl1271_tx_min_rate_get(wl));
2127 if (ret < 0) {
2128 dev_kfree_skb(beacon);
2129 goto out;
2132 hdr = (struct ieee80211_hdr *) beacon->data;
2133 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
2134 IEEE80211_STYPE_PROBE_RESP);
2136 tmpl_id = is_ap ? CMD_TEMPL_AP_PROBE_RESPONSE :
2137 CMD_TEMPL_PROBE_RESPONSE;
2138 ret = wl1271_cmd_template_set(wl,
2139 tmpl_id,
2140 beacon->data,
2141 beacon->len, 0,
2142 wl1271_tx_min_rate_get(wl));
2143 dev_kfree_skb(beacon);
2144 if (ret < 0)
2145 goto out;
2148 out:
2149 return ret;
2152 /* AP mode changes */
2153 static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
2154 struct ieee80211_vif *vif,
2155 struct ieee80211_bss_conf *bss_conf,
2156 u32 changed)
2158 int ret = 0;
2160 if ((changed & BSS_CHANGED_BASIC_RATES)) {
2161 u32 rates = bss_conf->basic_rates;
2162 struct conf_tx_rate_class mgmt_rc;
2164 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates);
2165 wl->basic_rate = wl1271_tx_min_rate_get(wl);
2166 wl1271_debug(DEBUG_AP, "basic rates: 0x%x",
2167 wl->basic_rate_set);
2169 /* update the AP management rate policy with the new rates */
2170 mgmt_rc.enabled_rates = wl->basic_rate_set;
2171 mgmt_rc.long_retry_limit = 10;
2172 mgmt_rc.short_retry_limit = 10;
2173 mgmt_rc.aflags = 0;
2174 ret = wl1271_acx_ap_rate_policy(wl, &mgmt_rc,
2175 ACX_TX_AP_MODE_MGMT_RATE);
2176 if (ret < 0) {
2177 wl1271_error("AP mgmt policy change failed %d", ret);
2178 goto out;
2182 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
2183 if (ret < 0)
2184 goto out;
2186 if ((changed & BSS_CHANGED_BEACON_ENABLED)) {
2187 if (bss_conf->enable_beacon) {
2188 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
2189 ret = wl1271_cmd_start_bss(wl);
2190 if (ret < 0)
2191 goto out;
2193 set_bit(WL1271_FLAG_AP_STARTED, &wl->flags);
2194 wl1271_debug(DEBUG_AP, "started AP");
2196 ret = wl1271_ap_init_hwenc(wl);
2197 if (ret < 0)
2198 goto out;
2200 } else {
2201 if (test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
2202 ret = wl1271_cmd_stop_bss(wl);
2203 if (ret < 0)
2204 goto out;
2206 clear_bit(WL1271_FLAG_AP_STARTED, &wl->flags);
2207 wl1271_debug(DEBUG_AP, "stopped AP");
2212 ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
2213 if (ret < 0)
2214 goto out;
2215 out:
2216 return;
2219 /* STA/IBSS mode changes */
2220 static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
2221 struct ieee80211_vif *vif,
2222 struct ieee80211_bss_conf *bss_conf,
2223 u32 changed)
2225 bool do_join = false, set_assoc = false;
2226 bool is_ibss = (wl->bss_type == BSS_TYPE_IBSS);
2227 u32 sta_rate_set = 0;
2228 int ret;
2229 struct ieee80211_sta *sta;
2230 bool sta_exists = false;
2231 struct ieee80211_sta_ht_cap sta_ht_cap;
2233 if (is_ibss) {
2234 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
2235 changed);
2236 if (ret < 0)
2237 goto out;
2240 if ((changed & BSS_CHANGED_BEACON_INT) && is_ibss)
2241 do_join = true;
2243 /* Need to update the SSID (for filtering etc) */
2244 if ((changed & BSS_CHANGED_BEACON) && is_ibss)
2245 do_join = true;
2247 if ((changed & BSS_CHANGED_BEACON_ENABLED) && is_ibss) {
2248 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
2249 bss_conf->enable_beacon ? "enabled" : "disabled");
2251 if (bss_conf->enable_beacon)
2252 wl->set_bss_type = BSS_TYPE_IBSS;
2253 else
2254 wl->set_bss_type = BSS_TYPE_STA_BSS;
2255 do_join = true;
2258 if ((changed & BSS_CHANGED_CQM)) {
2259 bool enable = false;
2260 if (bss_conf->cqm_rssi_thold)
2261 enable = true;
2262 ret = wl1271_acx_rssi_snr_trigger(wl, enable,
2263 bss_conf->cqm_rssi_thold,
2264 bss_conf->cqm_rssi_hyst);
2265 if (ret < 0)
2266 goto out;
2267 wl->rssi_thold = bss_conf->cqm_rssi_thold;
2270 if ((changed & BSS_CHANGED_BSSID) &&
2272 * Now we know the correct bssid, so we send a new join command
2273 * and enable the BSSID filter
2275 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
2276 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
2278 if (!is_zero_ether_addr(wl->bssid)) {
2279 ret = wl1271_cmd_build_null_data(wl);
2280 if (ret < 0)
2281 goto out;
2283 ret = wl1271_build_qos_null_data(wl);
2284 if (ret < 0)
2285 goto out;
2287 /* filter out all packets not from this BSSID */
2288 wl1271_configure_filters(wl, 0);
2290 /* Need to update the BSSID (for filtering etc) */
2291 do_join = true;
2295 rcu_read_lock();
2296 sta = ieee80211_find_sta(vif, bss_conf->bssid);
2297 if (sta) {
2298 /* save the supp_rates of the ap */
2299 sta_rate_set = sta->supp_rates[wl->hw->conf.channel->band];
2300 if (sta->ht_cap.ht_supported)
2301 sta_rate_set |=
2302 (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
2303 sta_ht_cap = sta->ht_cap;
2304 sta_exists = true;
2306 rcu_read_unlock();
2308 if (sta_exists) {
2309 /* handle new association with HT and HT information change */
2310 if ((changed & BSS_CHANGED_HT) &&
2311 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
2312 ret = wl1271_acx_set_ht_capabilities(wl, &sta_ht_cap,
2313 true);
2314 if (ret < 0) {
2315 wl1271_warning("Set ht cap true failed %d",
2316 ret);
2317 goto out;
2319 ret = wl1271_acx_set_ht_information(wl,
2320 bss_conf->ht_operation_mode);
2321 if (ret < 0) {
2322 wl1271_warning("Set ht information failed %d",
2323 ret);
2324 goto out;
2327 /* handle new association without HT and disassociation */
2328 else if (changed & BSS_CHANGED_ASSOC) {
2329 ret = wl1271_acx_set_ht_capabilities(wl, &sta_ht_cap,
2330 false);
2331 if (ret < 0) {
2332 wl1271_warning("Set ht cap false failed %d",
2333 ret);
2334 goto out;
2339 if ((changed & BSS_CHANGED_ASSOC)) {
2340 if (bss_conf->assoc) {
2341 u32 rates;
2342 int ieoffset;
2343 wl->aid = bss_conf->aid;
2344 set_assoc = true;
2346 wl->ps_poll_failures = 0;
2349 * use basic rates from AP, and determine lowest rate
2350 * to use with control frames.
2352 rates = bss_conf->basic_rates;
2353 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
2354 rates);
2355 wl->basic_rate = wl1271_tx_min_rate_get(wl);
2356 if (sta_rate_set)
2357 wl->rate_set = wl1271_tx_enabled_rates_get(wl,
2358 sta_rate_set);
2359 ret = wl1271_acx_sta_rate_policies(wl);
2360 if (ret < 0)
2361 goto out;
2364 * with wl1271, we don't need to update the
2365 * beacon_int and dtim_period, because the firmware
2366 * updates it by itself when the first beacon is
2367 * received after a join.
2369 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
2370 if (ret < 0)
2371 goto out;
2374 * Get a template for hardware connection maintenance
2376 dev_kfree_skb(wl->probereq);
2377 wl->probereq = wl1271_cmd_build_ap_probe_req(wl, NULL);
2378 ieoffset = offsetof(struct ieee80211_mgmt,
2379 u.probe_req.variable);
2380 wl1271_ssid_set(wl, wl->probereq, ieoffset);
2382 /* enable the connection monitoring feature */
2383 ret = wl1271_acx_conn_monit_params(wl, true);
2384 if (ret < 0)
2385 goto out;
2387 /* If we want to go in PSM but we're not there yet */
2388 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
2389 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
2390 enum wl1271_cmd_ps_mode mode;
2392 mode = STATION_POWER_SAVE_MODE;
2393 ret = wl1271_ps_set_mode(wl, mode,
2394 wl->basic_rate,
2395 true);
2396 if (ret < 0)
2397 goto out;
2399 } else {
2400 /* use defaults when not associated */
2401 clear_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags);
2402 clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
2403 wl->aid = 0;
2405 /* free probe-request template */
2406 dev_kfree_skb(wl->probereq);
2407 wl->probereq = NULL;
2409 /* re-enable dynamic ps - just in case */
2410 ieee80211_enable_dyn_ps(wl->vif);
2412 /* revert back to minimum rates for the current band */
2413 wl1271_set_band_rate(wl);
2414 wl->basic_rate = wl1271_tx_min_rate_get(wl);
2415 ret = wl1271_acx_sta_rate_policies(wl);
2416 if (ret < 0)
2417 goto out;
2419 /* disable connection monitor features */
2420 ret = wl1271_acx_conn_monit_params(wl, false);
2422 /* Disable the keep-alive feature */
2423 ret = wl1271_acx_keep_alive_mode(wl, false);
2424 if (ret < 0)
2425 goto out;
2427 /* restore the bssid filter and go to dummy bssid */
2428 wl1271_unjoin(wl);
2429 wl1271_dummy_join(wl);
2433 ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
2434 if (ret < 0)
2435 goto out;
2437 if (changed & BSS_CHANGED_ARP_FILTER) {
2438 __be32 addr = bss_conf->arp_addr_list[0];
2439 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
2441 if (bss_conf->arp_addr_cnt == 1 &&
2442 bss_conf->arp_filter_enabled) {
2444 * The template should have been configured only upon
2445 * association. however, it seems that the correct ip
2446 * isn't being set (when sending), so we have to
2447 * reconfigure the template upon every ip change.
2449 ret = wl1271_cmd_build_arp_rsp(wl, addr);
2450 if (ret < 0) {
2451 wl1271_warning("build arp rsp failed: %d", ret);
2452 goto out;
2455 ret = wl1271_acx_arp_ip_filter(wl,
2456 ACX_ARP_FILTER_ARP_FILTERING,
2457 addr);
2458 } else
2459 ret = wl1271_acx_arp_ip_filter(wl, 0, addr);
2461 if (ret < 0)
2462 goto out;
2465 if (do_join) {
2466 ret = wl1271_join(wl, set_assoc);
2467 if (ret < 0) {
2468 wl1271_warning("cmd join failed %d", ret);
2469 goto out;
2473 out:
2474 return;
2477 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
2478 struct ieee80211_vif *vif,
2479 struct ieee80211_bss_conf *bss_conf,
2480 u32 changed)
2482 struct wl1271 *wl = hw->priv;
2483 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
2484 int ret;
2486 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed 0x%x",
2487 (int)changed);
2489 mutex_lock(&wl->mutex);
2491 if (unlikely(wl->state == WL1271_STATE_OFF))
2492 goto out;
2494 ret = wl1271_ps_elp_wakeup(wl, false);
2495 if (ret < 0)
2496 goto out;
2498 if (is_ap)
2499 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
2500 else
2501 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
2503 wl1271_ps_elp_sleep(wl);
2505 out:
2506 mutex_unlock(&wl->mutex);
2509 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
2510 const struct ieee80211_tx_queue_params *params)
2512 struct wl1271 *wl = hw->priv;
2513 u8 ps_scheme;
2514 int ret = 0;
2516 mutex_lock(&wl->mutex);
2518 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
2520 if (params->uapsd)
2521 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
2522 else
2523 ps_scheme = CONF_PS_SCHEME_LEGACY;
2525 if (wl->state == WL1271_STATE_OFF) {
2527 * If the state is off, the parameters will be recorded and
2528 * configured on init. This happens in AP-mode.
2530 struct conf_tx_ac_category *conf_ac =
2531 &wl->conf.tx.ac_conf[wl1271_tx_get_queue(queue)];
2532 struct conf_tx_tid *conf_tid =
2533 &wl->conf.tx.tid_conf[wl1271_tx_get_queue(queue)];
2535 conf_ac->ac = wl1271_tx_get_queue(queue);
2536 conf_ac->cw_min = (u8)params->cw_min;
2537 conf_ac->cw_max = params->cw_max;
2538 conf_ac->aifsn = params->aifs;
2539 conf_ac->tx_op_limit = params->txop << 5;
2541 conf_tid->queue_id = wl1271_tx_get_queue(queue);
2542 conf_tid->channel_type = CONF_CHANNEL_TYPE_EDCF;
2543 conf_tid->tsid = wl1271_tx_get_queue(queue);
2544 conf_tid->ps_scheme = ps_scheme;
2545 conf_tid->ack_policy = CONF_ACK_POLICY_LEGACY;
2546 conf_tid->apsd_conf[0] = 0;
2547 conf_tid->apsd_conf[1] = 0;
2548 } else {
2549 ret = wl1271_ps_elp_wakeup(wl, false);
2550 if (ret < 0)
2551 goto out;
2554 * the txop is confed in units of 32us by the mac80211,
2555 * we need us
2557 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
2558 params->cw_min, params->cw_max,
2559 params->aifs, params->txop << 5);
2560 if (ret < 0)
2561 goto out_sleep;
2563 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
2564 CONF_CHANNEL_TYPE_EDCF,
2565 wl1271_tx_get_queue(queue),
2566 ps_scheme, CONF_ACK_POLICY_LEGACY,
2567 0, 0);
2568 if (ret < 0)
2569 goto out_sleep;
2571 out_sleep:
2572 wl1271_ps_elp_sleep(wl);
2575 out:
2576 mutex_unlock(&wl->mutex);
2578 return ret;
2581 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
2584 struct wl1271 *wl = hw->priv;
2585 u64 mactime = ULLONG_MAX;
2586 int ret;
2588 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
2590 mutex_lock(&wl->mutex);
2592 if (unlikely(wl->state == WL1271_STATE_OFF))
2593 goto out;
2595 ret = wl1271_ps_elp_wakeup(wl, false);
2596 if (ret < 0)
2597 goto out;
2599 ret = wl1271_acx_tsf_info(wl, &mactime);
2600 if (ret < 0)
2601 goto out_sleep;
2603 out_sleep:
2604 wl1271_ps_elp_sleep(wl);
2606 out:
2607 mutex_unlock(&wl->mutex);
2608 return mactime;
2611 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
2612 struct survey_info *survey)
2614 struct wl1271 *wl = hw->priv;
2615 struct ieee80211_conf *conf = &hw->conf;
2617 if (idx != 0)
2618 return -ENOENT;
2620 survey->channel = conf->channel;
2621 survey->filled = SURVEY_INFO_NOISE_DBM;
2622 survey->noise = wl->noise;
2624 return 0;
2627 static int wl1271_allocate_sta(struct wl1271 *wl,
2628 struct ieee80211_sta *sta,
2629 u8 *hlid)
2631 struct wl1271_station *wl_sta;
2632 int id;
2634 id = find_first_zero_bit(wl->ap_hlid_map, AP_MAX_STATIONS);
2635 if (id >= AP_MAX_STATIONS) {
2636 wl1271_warning("could not allocate HLID - too much stations");
2637 return -EBUSY;
2640 wl_sta = (struct wl1271_station *)sta->drv_priv;
2642 __set_bit(id, wl->ap_hlid_map);
2643 wl_sta->hlid = WL1271_AP_STA_HLID_START + id;
2644 *hlid = wl_sta->hlid;
2645 return 0;
2648 static void wl1271_free_sta(struct wl1271 *wl, u8 hlid)
2650 int id = hlid - WL1271_AP_STA_HLID_START;
2652 if (WARN_ON(!test_bit(id, wl->ap_hlid_map)))
2653 return;
2655 __clear_bit(id, wl->ap_hlid_map);
2656 wl1271_tx_reset_link_queues(wl, hlid);
2659 static int wl1271_op_sta_add(struct ieee80211_hw *hw,
2660 struct ieee80211_vif *vif,
2661 struct ieee80211_sta *sta)
2663 struct wl1271 *wl = hw->priv;
2664 int ret = 0;
2665 u8 hlid;
2667 mutex_lock(&wl->mutex);
2669 if (unlikely(wl->state == WL1271_STATE_OFF))
2670 goto out;
2672 if (wl->bss_type != BSS_TYPE_AP_BSS)
2673 goto out;
2675 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
2677 ret = wl1271_allocate_sta(wl, sta, &hlid);
2678 if (ret < 0)
2679 goto out;
2681 ret = wl1271_ps_elp_wakeup(wl, false);
2682 if (ret < 0)
2683 goto out_free_sta;
2685 ret = wl1271_cmd_add_sta(wl, sta, hlid);
2686 if (ret < 0)
2687 goto out_sleep;
2689 out_sleep:
2690 wl1271_ps_elp_sleep(wl);
2692 out_free_sta:
2693 if (ret < 0)
2694 wl1271_free_sta(wl, hlid);
2696 out:
2697 mutex_unlock(&wl->mutex);
2698 return ret;
2701 static int wl1271_op_sta_remove(struct ieee80211_hw *hw,
2702 struct ieee80211_vif *vif,
2703 struct ieee80211_sta *sta)
2705 struct wl1271 *wl = hw->priv;
2706 struct wl1271_station *wl_sta;
2707 int ret = 0, id;
2709 mutex_lock(&wl->mutex);
2711 if (unlikely(wl->state == WL1271_STATE_OFF))
2712 goto out;
2714 if (wl->bss_type != BSS_TYPE_AP_BSS)
2715 goto out;
2717 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
2719 wl_sta = (struct wl1271_station *)sta->drv_priv;
2720 id = wl_sta->hlid - WL1271_AP_STA_HLID_START;
2721 if (WARN_ON(!test_bit(id, wl->ap_hlid_map)))
2722 goto out;
2724 ret = wl1271_ps_elp_wakeup(wl, false);
2725 if (ret < 0)
2726 goto out;
2728 ret = wl1271_cmd_remove_sta(wl, wl_sta->hlid);
2729 if (ret < 0)
2730 goto out_sleep;
2732 wl1271_free_sta(wl, wl_sta->hlid);
2734 out_sleep:
2735 wl1271_ps_elp_sleep(wl);
2737 out:
2738 mutex_unlock(&wl->mutex);
2739 return ret;
2742 int wl1271_op_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2743 enum ieee80211_ampdu_mlme_action action,
2744 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
2745 u8 buf_size)
2747 struct wl1271 *wl = hw->priv;
2748 int ret;
2750 mutex_lock(&wl->mutex);
2752 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2753 ret = -EAGAIN;
2754 goto out;
2757 ret = wl1271_ps_elp_wakeup(wl, false);
2758 if (ret < 0)
2759 goto out;
2761 switch (action) {
2762 case IEEE80211_AMPDU_RX_START:
2763 if (wl->ba_support) {
2764 ret = wl1271_acx_set_ba_receiver_session(wl, tid, *ssn,
2765 true);
2766 if (!ret)
2767 wl->ba_rx_bitmap |= BIT(tid);
2768 } else {
2769 ret = -ENOTSUPP;
2771 break;
2773 case IEEE80211_AMPDU_RX_STOP:
2774 ret = wl1271_acx_set_ba_receiver_session(wl, tid, 0, false);
2775 if (!ret)
2776 wl->ba_rx_bitmap &= ~BIT(tid);
2777 break;
2780 * The BA initiator session management in FW independently.
2781 * Falling break here on purpose for all TX APDU commands.
2783 case IEEE80211_AMPDU_TX_START:
2784 case IEEE80211_AMPDU_TX_STOP:
2785 case IEEE80211_AMPDU_TX_OPERATIONAL:
2786 ret = -EINVAL;
2787 break;
2789 default:
2790 wl1271_error("Incorrect ampdu action id=%x\n", action);
2791 ret = -EINVAL;
2794 wl1271_ps_elp_sleep(wl);
2796 out:
2797 mutex_unlock(&wl->mutex);
2799 return ret;
2802 /* can't be const, mac80211 writes to this */
2803 static struct ieee80211_rate wl1271_rates[] = {
2804 { .bitrate = 10,
2805 .hw_value = CONF_HW_BIT_RATE_1MBPS,
2806 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
2807 { .bitrate = 20,
2808 .hw_value = CONF_HW_BIT_RATE_2MBPS,
2809 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
2810 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2811 { .bitrate = 55,
2812 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
2813 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
2814 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2815 { .bitrate = 110,
2816 .hw_value = CONF_HW_BIT_RATE_11MBPS,
2817 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
2818 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2819 { .bitrate = 60,
2820 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2821 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2822 { .bitrate = 90,
2823 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2824 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2825 { .bitrate = 120,
2826 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2827 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2828 { .bitrate = 180,
2829 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2830 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2831 { .bitrate = 240,
2832 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2833 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2834 { .bitrate = 360,
2835 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2836 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2837 { .bitrate = 480,
2838 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2839 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2840 { .bitrate = 540,
2841 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2842 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2845 /* can't be const, mac80211 writes to this */
2846 static struct ieee80211_channel wl1271_channels[] = {
2847 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
2848 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
2849 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
2850 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
2851 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
2852 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
2853 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
2854 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
2855 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
2856 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
2857 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
2858 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
2859 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
2860 { .hw_value = 14, .center_freq = 2484, .max_power = 25 },
2863 /* mapping to indexes for wl1271_rates */
2864 static const u8 wl1271_rate_to_idx_2ghz[] = {
2865 /* MCS rates are used only with 11n */
2866 7, /* CONF_HW_RXTX_RATE_MCS7 */
2867 6, /* CONF_HW_RXTX_RATE_MCS6 */
2868 5, /* CONF_HW_RXTX_RATE_MCS5 */
2869 4, /* CONF_HW_RXTX_RATE_MCS4 */
2870 3, /* CONF_HW_RXTX_RATE_MCS3 */
2871 2, /* CONF_HW_RXTX_RATE_MCS2 */
2872 1, /* CONF_HW_RXTX_RATE_MCS1 */
2873 0, /* CONF_HW_RXTX_RATE_MCS0 */
2875 11, /* CONF_HW_RXTX_RATE_54 */
2876 10, /* CONF_HW_RXTX_RATE_48 */
2877 9, /* CONF_HW_RXTX_RATE_36 */
2878 8, /* CONF_HW_RXTX_RATE_24 */
2880 /* TI-specific rate */
2881 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
2883 7, /* CONF_HW_RXTX_RATE_18 */
2884 6, /* CONF_HW_RXTX_RATE_12 */
2885 3, /* CONF_HW_RXTX_RATE_11 */
2886 5, /* CONF_HW_RXTX_RATE_9 */
2887 4, /* CONF_HW_RXTX_RATE_6 */
2888 2, /* CONF_HW_RXTX_RATE_5_5 */
2889 1, /* CONF_HW_RXTX_RATE_2 */
2890 0 /* CONF_HW_RXTX_RATE_1 */
2893 /* 11n STA capabilities */
2894 #define HW_RX_HIGHEST_RATE 72
2896 #ifdef CONFIG_WL12XX_HT
2897 #define WL12XX_HT_CAP { \
2898 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \
2899 .ht_supported = true, \
2900 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
2901 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
2902 .mcs = { \
2903 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
2904 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
2905 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
2906 }, \
2908 #else
2909 #define WL12XX_HT_CAP { \
2910 .ht_supported = false, \
2912 #endif
2914 /* can't be const, mac80211 writes to this */
2915 static struct ieee80211_supported_band wl1271_band_2ghz = {
2916 .channels = wl1271_channels,
2917 .n_channels = ARRAY_SIZE(wl1271_channels),
2918 .bitrates = wl1271_rates,
2919 .n_bitrates = ARRAY_SIZE(wl1271_rates),
2920 .ht_cap = WL12XX_HT_CAP,
2923 /* 5 GHz data rates for WL1273 */
2924 static struct ieee80211_rate wl1271_rates_5ghz[] = {
2925 { .bitrate = 60,
2926 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2927 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2928 { .bitrate = 90,
2929 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2930 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2931 { .bitrate = 120,
2932 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2933 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2934 { .bitrate = 180,
2935 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2936 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2937 { .bitrate = 240,
2938 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2939 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2940 { .bitrate = 360,
2941 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2942 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2943 { .bitrate = 480,
2944 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2945 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2946 { .bitrate = 540,
2947 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2948 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2951 /* 5 GHz band channels for WL1273 */
2952 static struct ieee80211_channel wl1271_channels_5ghz[] = {
2953 { .hw_value = 7, .center_freq = 5035},
2954 { .hw_value = 8, .center_freq = 5040},
2955 { .hw_value = 9, .center_freq = 5045},
2956 { .hw_value = 11, .center_freq = 5055},
2957 { .hw_value = 12, .center_freq = 5060},
2958 { .hw_value = 16, .center_freq = 5080},
2959 { .hw_value = 34, .center_freq = 5170},
2960 { .hw_value = 36, .center_freq = 5180},
2961 { .hw_value = 38, .center_freq = 5190},
2962 { .hw_value = 40, .center_freq = 5200},
2963 { .hw_value = 42, .center_freq = 5210},
2964 { .hw_value = 44, .center_freq = 5220},
2965 { .hw_value = 46, .center_freq = 5230},
2966 { .hw_value = 48, .center_freq = 5240},
2967 { .hw_value = 52, .center_freq = 5260},
2968 { .hw_value = 56, .center_freq = 5280},
2969 { .hw_value = 60, .center_freq = 5300},
2970 { .hw_value = 64, .center_freq = 5320},
2971 { .hw_value = 100, .center_freq = 5500},
2972 { .hw_value = 104, .center_freq = 5520},
2973 { .hw_value = 108, .center_freq = 5540},
2974 { .hw_value = 112, .center_freq = 5560},
2975 { .hw_value = 116, .center_freq = 5580},
2976 { .hw_value = 120, .center_freq = 5600},
2977 { .hw_value = 124, .center_freq = 5620},
2978 { .hw_value = 128, .center_freq = 5640},
2979 { .hw_value = 132, .center_freq = 5660},
2980 { .hw_value = 136, .center_freq = 5680},
2981 { .hw_value = 140, .center_freq = 5700},
2982 { .hw_value = 149, .center_freq = 5745},
2983 { .hw_value = 153, .center_freq = 5765},
2984 { .hw_value = 157, .center_freq = 5785},
2985 { .hw_value = 161, .center_freq = 5805},
2986 { .hw_value = 165, .center_freq = 5825},
2989 /* mapping to indexes for wl1271_rates_5ghz */
2990 static const u8 wl1271_rate_to_idx_5ghz[] = {
2991 /* MCS rates are used only with 11n */
2992 7, /* CONF_HW_RXTX_RATE_MCS7 */
2993 6, /* CONF_HW_RXTX_RATE_MCS6 */
2994 5, /* CONF_HW_RXTX_RATE_MCS5 */
2995 4, /* CONF_HW_RXTX_RATE_MCS4 */
2996 3, /* CONF_HW_RXTX_RATE_MCS3 */
2997 2, /* CONF_HW_RXTX_RATE_MCS2 */
2998 1, /* CONF_HW_RXTX_RATE_MCS1 */
2999 0, /* CONF_HW_RXTX_RATE_MCS0 */
3001 7, /* CONF_HW_RXTX_RATE_54 */
3002 6, /* CONF_HW_RXTX_RATE_48 */
3003 5, /* CONF_HW_RXTX_RATE_36 */
3004 4, /* CONF_HW_RXTX_RATE_24 */
3006 /* TI-specific rate */
3007 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
3009 3, /* CONF_HW_RXTX_RATE_18 */
3010 2, /* CONF_HW_RXTX_RATE_12 */
3011 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
3012 1, /* CONF_HW_RXTX_RATE_9 */
3013 0, /* CONF_HW_RXTX_RATE_6 */
3014 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
3015 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
3016 CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
3019 static struct ieee80211_supported_band wl1271_band_5ghz = {
3020 .channels = wl1271_channels_5ghz,
3021 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
3022 .bitrates = wl1271_rates_5ghz,
3023 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
3024 .ht_cap = WL12XX_HT_CAP,
3027 static const u8 *wl1271_band_rate_to_idx[] = {
3028 [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
3029 [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
3032 static const struct ieee80211_ops wl1271_ops = {
3033 .start = wl1271_op_start,
3034 .stop = wl1271_op_stop,
3035 .add_interface = wl1271_op_add_interface,
3036 .remove_interface = wl1271_op_remove_interface,
3037 .config = wl1271_op_config,
3038 .prepare_multicast = wl1271_op_prepare_multicast,
3039 .configure_filter = wl1271_op_configure_filter,
3040 .tx = wl1271_op_tx,
3041 .set_key = wl1271_op_set_key,
3042 .hw_scan = wl1271_op_hw_scan,
3043 .bss_info_changed = wl1271_op_bss_info_changed,
3044 .set_frag_threshold = wl1271_op_set_frag_threshold,
3045 .set_rts_threshold = wl1271_op_set_rts_threshold,
3046 .conf_tx = wl1271_op_conf_tx,
3047 .get_tsf = wl1271_op_get_tsf,
3048 .get_survey = wl1271_op_get_survey,
3049 .sta_add = wl1271_op_sta_add,
3050 .sta_remove = wl1271_op_sta_remove,
3051 .ampdu_action = wl1271_op_ampdu_action,
3052 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
3056 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
3058 u8 idx;
3060 BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
3062 if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
3063 wl1271_error("Illegal RX rate from HW: %d", rate);
3064 return 0;
3067 idx = wl1271_band_rate_to_idx[band][rate];
3068 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
3069 wl1271_error("Unsupported RX rate from HW: %d", rate);
3070 return 0;
3073 return idx;
3076 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
3077 struct device_attribute *attr,
3078 char *buf)
3080 struct wl1271 *wl = dev_get_drvdata(dev);
3081 ssize_t len;
3083 len = PAGE_SIZE;
3085 mutex_lock(&wl->mutex);
3086 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
3087 wl->sg_enabled);
3088 mutex_unlock(&wl->mutex);
3090 return len;
3094 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
3095 struct device_attribute *attr,
3096 const char *buf, size_t count)
3098 struct wl1271 *wl = dev_get_drvdata(dev);
3099 unsigned long res;
3100 int ret;
3102 ret = strict_strtoul(buf, 10, &res);
3104 if (ret < 0) {
3105 wl1271_warning("incorrect value written to bt_coex_mode");
3106 return count;
3109 mutex_lock(&wl->mutex);
3111 res = !!res;
3113 if (res == wl->sg_enabled)
3114 goto out;
3116 wl->sg_enabled = res;
3118 if (wl->state == WL1271_STATE_OFF)
3119 goto out;
3121 ret = wl1271_ps_elp_wakeup(wl, false);
3122 if (ret < 0)
3123 goto out;
3125 wl1271_acx_sg_enable(wl, wl->sg_enabled);
3126 wl1271_ps_elp_sleep(wl);
3128 out:
3129 mutex_unlock(&wl->mutex);
3130 return count;
3133 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
3134 wl1271_sysfs_show_bt_coex_state,
3135 wl1271_sysfs_store_bt_coex_state);
3137 static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
3138 struct device_attribute *attr,
3139 char *buf)
3141 struct wl1271 *wl = dev_get_drvdata(dev);
3142 ssize_t len;
3144 len = PAGE_SIZE;
3146 mutex_lock(&wl->mutex);
3147 if (wl->hw_pg_ver >= 0)
3148 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
3149 else
3150 len = snprintf(buf, len, "n/a\n");
3151 mutex_unlock(&wl->mutex);
3153 return len;
3156 static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
3157 wl1271_sysfs_show_hw_pg_ver, NULL);
3159 int wl1271_register_hw(struct wl1271 *wl)
3161 int ret;
3163 if (wl->mac80211_registered)
3164 return 0;
3166 ret = wl1271_fetch_nvs(wl);
3167 if (ret == 0) {
3168 u8 *nvs_ptr = (u8 *)wl->nvs->nvs;
3170 wl->mac_addr[0] = nvs_ptr[11];
3171 wl->mac_addr[1] = nvs_ptr[10];
3172 wl->mac_addr[2] = nvs_ptr[6];
3173 wl->mac_addr[3] = nvs_ptr[5];
3174 wl->mac_addr[4] = nvs_ptr[4];
3175 wl->mac_addr[5] = nvs_ptr[3];
3178 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
3180 ret = ieee80211_register_hw(wl->hw);
3181 if (ret < 0) {
3182 wl1271_error("unable to register mac80211 hw: %d", ret);
3183 return ret;
3186 wl->mac80211_registered = true;
3188 wl1271_debugfs_init(wl);
3190 register_netdevice_notifier(&wl1271_dev_notifier);
3192 wl1271_notice("loaded");
3194 return 0;
3196 EXPORT_SYMBOL_GPL(wl1271_register_hw);
3198 void wl1271_unregister_hw(struct wl1271 *wl)
3200 if (wl->state == WL1271_STATE_PLT)
3201 __wl1271_plt_stop(wl);
3203 unregister_netdevice_notifier(&wl1271_dev_notifier);
3204 ieee80211_unregister_hw(wl->hw);
3205 wl->mac80211_registered = false;
3208 EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
3210 int wl1271_init_ieee80211(struct wl1271 *wl)
3212 static const u32 cipher_suites[] = {
3213 WLAN_CIPHER_SUITE_WEP40,
3214 WLAN_CIPHER_SUITE_WEP104,
3215 WLAN_CIPHER_SUITE_TKIP,
3216 WLAN_CIPHER_SUITE_CCMP,
3217 WL1271_CIPHER_SUITE_GEM,
3220 /* The tx descriptor buffer and the TKIP space. */
3221 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
3222 sizeof(struct wl1271_tx_hw_descr);
3224 /* unit us */
3225 /* FIXME: find a proper value */
3226 wl->hw->channel_change_time = 10000;
3227 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
3229 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3230 IEEE80211_HW_BEACON_FILTER |
3231 IEEE80211_HW_SUPPORTS_PS |
3232 IEEE80211_HW_SUPPORTS_UAPSD |
3233 IEEE80211_HW_HAS_RATE_CONTROL |
3234 IEEE80211_HW_CONNECTION_MONITOR |
3235 IEEE80211_HW_SUPPORTS_CQM_RSSI |
3236 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3237 IEEE80211_HW_AP_LINK_PS;
3239 wl->hw->wiphy->cipher_suites = cipher_suites;
3240 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
3242 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
3243 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
3244 wl->hw->wiphy->max_scan_ssids = 1;
3246 * Maximum length of elements in scanning probe request templates
3247 * should be the maximum length possible for a template, without
3248 * the IEEE80211 header of the template
3250 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
3251 sizeof(struct ieee80211_header);
3254 * We keep local copies of the band structs because we need to
3255 * modify them on a per-device basis.
3257 memcpy(&wl->bands[IEEE80211_BAND_2GHZ], &wl1271_band_2ghz,
3258 sizeof(wl1271_band_2ghz));
3259 memcpy(&wl->bands[IEEE80211_BAND_5GHZ], &wl1271_band_5ghz,
3260 sizeof(wl1271_band_5ghz));
3262 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
3263 &wl->bands[IEEE80211_BAND_2GHZ];
3264 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
3265 &wl->bands[IEEE80211_BAND_5GHZ];
3267 wl->hw->queues = 4;
3268 wl->hw->max_rates = 1;
3270 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
3272 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
3274 wl->hw->sta_data_size = sizeof(struct wl1271_station);
3276 wl->hw->max_rx_aggregation_subframes = 8;
3278 return 0;
3280 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
3282 #define WL1271_DEFAULT_CHANNEL 0
3284 struct ieee80211_hw *wl1271_alloc_hw(void)
3286 struct ieee80211_hw *hw;
3287 struct platform_device *plat_dev = NULL;
3288 struct wl1271 *wl;
3289 int i, j, ret;
3290 unsigned int order;
3292 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
3293 if (!hw) {
3294 wl1271_error("could not alloc ieee80211_hw");
3295 ret = -ENOMEM;
3296 goto err_hw_alloc;
3299 plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
3300 if (!plat_dev) {
3301 wl1271_error("could not allocate platform_device");
3302 ret = -ENOMEM;
3303 goto err_plat_alloc;
3306 wl = hw->priv;
3307 memset(wl, 0, sizeof(*wl));
3309 INIT_LIST_HEAD(&wl->list);
3311 wl->hw = hw;
3312 wl->plat_dev = plat_dev;
3314 for (i = 0; i < NUM_TX_QUEUES; i++)
3315 skb_queue_head_init(&wl->tx_queue[i]);
3317 for (i = 0; i < NUM_TX_QUEUES; i++)
3318 for (j = 0; j < AP_MAX_LINKS; j++)
3319 skb_queue_head_init(&wl->links[j].tx_queue[i]);
3321 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
3322 INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
3323 INIT_WORK(&wl->irq_work, wl1271_irq_work);
3324 INIT_WORK(&wl->tx_work, wl1271_tx_work);
3325 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
3326 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
3327 wl->channel = WL1271_DEFAULT_CHANNEL;
3328 wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
3329 wl->default_key = 0;
3330 wl->rx_counter = 0;
3331 wl->rx_config = WL1271_DEFAULT_STA_RX_CONFIG;
3332 wl->rx_filter = WL1271_DEFAULT_STA_RX_FILTER;
3333 wl->psm_entry_retry = 0;
3334 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
3335 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
3336 wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
3337 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
3338 wl->band = IEEE80211_BAND_2GHZ;
3339 wl->vif = NULL;
3340 wl->flags = 0;
3341 wl->sg_enabled = true;
3342 wl->hw_pg_ver = -1;
3343 wl->bss_type = MAX_BSS_TYPE;
3344 wl->set_bss_type = MAX_BSS_TYPE;
3345 wl->fw_bss_type = MAX_BSS_TYPE;
3346 wl->last_tx_hlid = 0;
3348 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
3349 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
3350 wl->tx_frames[i] = NULL;
3352 spin_lock_init(&wl->wl_lock);
3354 wl->state = WL1271_STATE_OFF;
3355 mutex_init(&wl->mutex);
3357 /* Apply default driver configuration. */
3358 wl1271_conf_init(wl);
3360 order = get_order(WL1271_AGGR_BUFFER_SIZE);
3361 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
3362 if (!wl->aggr_buf) {
3363 ret = -ENOMEM;
3364 goto err_hw;
3367 /* Register platform device */
3368 ret = platform_device_register(wl->plat_dev);
3369 if (ret) {
3370 wl1271_error("couldn't register platform device");
3371 goto err_aggr;
3373 dev_set_drvdata(&wl->plat_dev->dev, wl);
3375 /* Create sysfs file to control bt coex state */
3376 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
3377 if (ret < 0) {
3378 wl1271_error("failed to create sysfs file bt_coex_state");
3379 goto err_platform;
3382 /* Create sysfs file to get HW PG version */
3383 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
3384 if (ret < 0) {
3385 wl1271_error("failed to create sysfs file hw_pg_ver");
3386 goto err_bt_coex_state;
3389 return hw;
3391 err_bt_coex_state:
3392 device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
3394 err_platform:
3395 platform_device_unregister(wl->plat_dev);
3397 err_aggr:
3398 free_pages((unsigned long)wl->aggr_buf, order);
3400 err_hw:
3401 wl1271_debugfs_exit(wl);
3402 kfree(plat_dev);
3404 err_plat_alloc:
3405 ieee80211_free_hw(hw);
3407 err_hw_alloc:
3409 return ERR_PTR(ret);
3411 EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
3413 int wl1271_free_hw(struct wl1271 *wl)
3415 platform_device_unregister(wl->plat_dev);
3416 free_pages((unsigned long)wl->aggr_buf,
3417 get_order(WL1271_AGGR_BUFFER_SIZE));
3418 kfree(wl->plat_dev);
3420 wl1271_debugfs_exit(wl);
3422 vfree(wl->fw);
3423 wl->fw = NULL;
3424 kfree(wl->nvs);
3425 wl->nvs = NULL;
3427 kfree(wl->fw_status);
3428 kfree(wl->tx_res_if);
3430 ieee80211_free_hw(wl->hw);
3432 return 0;
3434 EXPORT_SYMBOL_GPL(wl1271_free_hw);
3436 u32 wl12xx_debug_level = DEBUG_NONE;
3437 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
3438 module_param_named(debug_level, wl12xx_debug_level, uint, S_IRUSR | S_IWUSR);
3439 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
3441 MODULE_LICENSE("GPL");
3442 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
3443 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");