proc: use seq_puts()/seq_putc() where possible
[linux-2.6/next.git] / drivers / net / wireless / wl12xx / main.c
blob062247ef3ad2742378c7993649eef5780842c665
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 .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 int wl1271_reg_notify(struct wiphy *wiphy,
339 struct regulatory_request *request)
341 struct ieee80211_supported_band *band;
342 struct ieee80211_channel *ch;
343 int i;
345 band = wiphy->bands[IEEE80211_BAND_5GHZ];
346 for (i = 0; i < band->n_channels; i++) {
347 ch = &band->channels[i];
348 if (ch->flags & IEEE80211_CHAN_DISABLED)
349 continue;
351 if (ch->flags & IEEE80211_CHAN_RADAR)
352 ch->flags |= IEEE80211_CHAN_NO_IBSS |
353 IEEE80211_CHAN_PASSIVE_SCAN;
357 return 0;
360 static void wl1271_conf_init(struct wl1271 *wl)
364 * This function applies the default configuration to the driver. This
365 * function is invoked upon driver load (spi probe.)
367 * The configuration is stored in a run-time structure in order to
368 * facilitate for run-time adjustment of any of the parameters. Making
369 * changes to the configuration structure will apply the new values on
370 * the next interface up (wl1271_op_start.)
373 /* apply driver default configuration */
374 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
378 static int wl1271_plt_init(struct wl1271 *wl)
380 struct conf_tx_ac_category *conf_ac;
381 struct conf_tx_tid *conf_tid;
382 int ret, i;
384 ret = wl1271_cmd_general_parms(wl);
385 if (ret < 0)
386 return ret;
388 ret = wl1271_cmd_radio_parms(wl);
389 if (ret < 0)
390 return ret;
392 ret = wl1271_cmd_ext_radio_parms(wl);
393 if (ret < 0)
394 return ret;
396 ret = wl1271_init_templates_config(wl);
397 if (ret < 0)
398 return ret;
400 ret = wl1271_acx_init_mem_config(wl);
401 if (ret < 0)
402 return ret;
404 /* PHY layer config */
405 ret = wl1271_init_phy_config(wl);
406 if (ret < 0)
407 goto out_free_memmap;
409 ret = wl1271_acx_dco_itrim_params(wl);
410 if (ret < 0)
411 goto out_free_memmap;
413 /* Initialize connection monitoring thresholds */
414 ret = wl1271_acx_conn_monit_params(wl, false);
415 if (ret < 0)
416 goto out_free_memmap;
418 /* Bluetooth WLAN coexistence */
419 ret = wl1271_init_pta(wl);
420 if (ret < 0)
421 goto out_free_memmap;
423 /* Energy detection */
424 ret = wl1271_init_energy_detection(wl);
425 if (ret < 0)
426 goto out_free_memmap;
428 /* Default fragmentation threshold */
429 ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
430 if (ret < 0)
431 goto out_free_memmap;
433 /* Default TID/AC configuration */
434 BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
435 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
436 conf_ac = &wl->conf.tx.ac_conf[i];
437 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
438 conf_ac->cw_max, conf_ac->aifsn,
439 conf_ac->tx_op_limit);
440 if (ret < 0)
441 goto out_free_memmap;
443 conf_tid = &wl->conf.tx.tid_conf[i];
444 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
445 conf_tid->channel_type,
446 conf_tid->tsid,
447 conf_tid->ps_scheme,
448 conf_tid->ack_policy,
449 conf_tid->apsd_conf[0],
450 conf_tid->apsd_conf[1]);
451 if (ret < 0)
452 goto out_free_memmap;
455 /* Enable data path */
456 ret = wl1271_cmd_data_path(wl, 1);
457 if (ret < 0)
458 goto out_free_memmap;
460 /* Configure for CAM power saving (ie. always active) */
461 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
462 if (ret < 0)
463 goto out_free_memmap;
465 /* configure PM */
466 ret = wl1271_acx_pm_config(wl);
467 if (ret < 0)
468 goto out_free_memmap;
470 return 0;
472 out_free_memmap:
473 kfree(wl->target_mem_map);
474 wl->target_mem_map = NULL;
476 return ret;
479 static void wl1271_fw_status(struct wl1271 *wl,
480 struct wl1271_fw_status *status)
482 struct timespec ts;
483 u32 total = 0;
484 int i;
486 wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
488 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
489 "drv_rx_counter = %d, tx_results_counter = %d)",
490 status->intr,
491 status->fw_rx_counter,
492 status->drv_rx_counter,
493 status->tx_results_counter);
495 /* update number of available TX blocks */
496 for (i = 0; i < NUM_TX_QUEUES; i++) {
497 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
498 wl->tx_blocks_freed[i];
500 wl->tx_blocks_freed[i] =
501 le32_to_cpu(status->tx_released_blks[i]);
502 wl->tx_blocks_available += cnt;
503 total += cnt;
506 /* if more blocks are available now, tx work can be scheduled */
507 if (total)
508 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
510 /* update the host-chipset time offset */
511 getnstimeofday(&ts);
512 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
513 (s64)le32_to_cpu(status->fw_localtime);
516 #define WL1271_IRQ_MAX_LOOPS 10
518 static void wl1271_irq_work(struct work_struct *work)
520 int ret;
521 u32 intr;
522 int loopcount = WL1271_IRQ_MAX_LOOPS;
523 unsigned long flags;
524 struct wl1271 *wl =
525 container_of(work, struct wl1271, irq_work);
527 mutex_lock(&wl->mutex);
529 wl1271_debug(DEBUG_IRQ, "IRQ work");
531 if (unlikely(wl->state == WL1271_STATE_OFF))
532 goto out;
534 ret = wl1271_ps_elp_wakeup(wl, true);
535 if (ret < 0)
536 goto out;
538 spin_lock_irqsave(&wl->wl_lock, flags);
539 while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
540 clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
541 spin_unlock_irqrestore(&wl->wl_lock, flags);
542 loopcount--;
544 wl1271_fw_status(wl, wl->fw_status);
545 intr = le32_to_cpu(wl->fw_status->intr);
546 if (!intr) {
547 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
548 spin_lock_irqsave(&wl->wl_lock, flags);
549 continue;
552 intr &= WL1271_INTR_MASK;
554 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
555 wl1271_error("watchdog interrupt received! "
556 "starting recovery.");
557 ieee80211_queue_work(wl->hw, &wl->recovery_work);
559 /* restarting the chip. ignore any other interrupt. */
560 goto out;
563 if (intr & WL1271_ACX_INTR_DATA) {
564 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
566 /* check for tx results */
567 if (wl->fw_status->tx_results_counter !=
568 (wl->tx_results_count & 0xff))
569 wl1271_tx_complete(wl);
571 /* Check if any tx blocks were freed */
572 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
573 wl->tx_queue_count) {
575 * In order to avoid starvation of the TX path,
576 * call the work function directly.
578 wl1271_tx_work_locked(wl);
581 wl1271_rx(wl, wl->fw_status);
584 if (intr & WL1271_ACX_INTR_EVENT_A) {
585 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
586 wl1271_event_handle(wl, 0);
589 if (intr & WL1271_ACX_INTR_EVENT_B) {
590 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
591 wl1271_event_handle(wl, 1);
594 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
595 wl1271_debug(DEBUG_IRQ,
596 "WL1271_ACX_INTR_INIT_COMPLETE");
598 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
599 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
601 spin_lock_irqsave(&wl->wl_lock, flags);
604 if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
605 ieee80211_queue_work(wl->hw, &wl->irq_work);
606 else
607 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
608 spin_unlock_irqrestore(&wl->wl_lock, flags);
610 wl1271_ps_elp_sleep(wl);
612 out:
613 mutex_unlock(&wl->mutex);
616 static int wl1271_fetch_firmware(struct wl1271 *wl)
618 const struct firmware *fw;
619 int ret;
621 ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
623 if (ret < 0) {
624 wl1271_error("could not get firmware: %d", ret);
625 return ret;
628 if (fw->size % 4) {
629 wl1271_error("firmware size is not multiple of 32 bits: %zu",
630 fw->size);
631 ret = -EILSEQ;
632 goto out;
635 wl->fw_len = fw->size;
636 wl->fw = vmalloc(wl->fw_len);
638 if (!wl->fw) {
639 wl1271_error("could not allocate memory for the firmware");
640 ret = -ENOMEM;
641 goto out;
644 memcpy(wl->fw, fw->data, wl->fw_len);
646 ret = 0;
648 out:
649 release_firmware(fw);
651 return ret;
654 static int wl1271_fetch_nvs(struct wl1271 *wl)
656 const struct firmware *fw;
657 int ret;
659 ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
661 if (ret < 0) {
662 wl1271_error("could not get nvs file: %d", ret);
663 return ret;
666 wl->nvs = kmemdup(fw->data, sizeof(struct wl1271_nvs_file), GFP_KERNEL);
668 if (!wl->nvs) {
669 wl1271_error("could not allocate memory for the nvs file");
670 ret = -ENOMEM;
671 goto out;
674 wl->nvs_len = fw->size;
676 out:
677 release_firmware(fw);
679 return ret;
682 static void wl1271_recovery_work(struct work_struct *work)
684 struct wl1271 *wl =
685 container_of(work, struct wl1271, recovery_work);
687 mutex_lock(&wl->mutex);
689 if (wl->state != WL1271_STATE_ON)
690 goto out;
692 wl1271_info("Hardware recovery in progress.");
694 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
695 ieee80211_connection_loss(wl->vif);
697 /* reboot the chipset */
698 __wl1271_op_remove_interface(wl);
699 ieee80211_restart_hw(wl->hw);
701 out:
702 mutex_unlock(&wl->mutex);
705 static void wl1271_fw_wakeup(struct wl1271 *wl)
707 u32 elp_reg;
709 elp_reg = ELPCTRL_WAKE_UP;
710 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
713 static int wl1271_setup(struct wl1271 *wl)
715 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
716 if (!wl->fw_status)
717 return -ENOMEM;
719 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
720 if (!wl->tx_res_if) {
721 kfree(wl->fw_status);
722 return -ENOMEM;
725 return 0;
728 static int wl1271_chip_wakeup(struct wl1271 *wl)
730 struct wl1271_partition_set partition;
731 int ret = 0;
733 msleep(WL1271_PRE_POWER_ON_SLEEP);
734 ret = wl1271_power_on(wl);
735 if (ret < 0)
736 goto out;
737 msleep(WL1271_POWER_ON_SLEEP);
738 wl1271_io_reset(wl);
739 wl1271_io_init(wl);
741 /* We don't need a real memory partition here, because we only want
742 * to use the registers at this point. */
743 memset(&partition, 0, sizeof(partition));
744 partition.reg.start = REGISTERS_BASE;
745 partition.reg.size = REGISTERS_DOWN_SIZE;
746 wl1271_set_partition(wl, &partition);
748 /* ELP module wake up */
749 wl1271_fw_wakeup(wl);
751 /* whal_FwCtrl_BootSm() */
753 /* 0. read chip id from CHIP_ID */
754 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
756 /* 1. check if chip id is valid */
758 switch (wl->chip.id) {
759 case CHIP_ID_1271_PG10:
760 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
761 wl->chip.id);
763 ret = wl1271_setup(wl);
764 if (ret < 0)
765 goto out;
766 break;
767 case CHIP_ID_1271_PG20:
768 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
769 wl->chip.id);
771 ret = wl1271_setup(wl);
772 if (ret < 0)
773 goto out;
774 break;
775 default:
776 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
777 ret = -ENODEV;
778 goto out;
781 if (wl->fw == NULL) {
782 ret = wl1271_fetch_firmware(wl);
783 if (ret < 0)
784 goto out;
787 /* No NVS from netlink, try to get it from the filesystem */
788 if (wl->nvs == NULL) {
789 ret = wl1271_fetch_nvs(wl);
790 if (ret < 0)
791 goto out;
794 out:
795 return ret;
798 int wl1271_plt_start(struct wl1271 *wl)
800 int retries = WL1271_BOOT_RETRIES;
801 int ret;
803 mutex_lock(&wl->mutex);
805 wl1271_notice("power up");
807 if (wl->state != WL1271_STATE_OFF) {
808 wl1271_error("cannot go into PLT state because not "
809 "in off state: %d", wl->state);
810 ret = -EBUSY;
811 goto out;
814 while (retries) {
815 retries--;
816 ret = wl1271_chip_wakeup(wl);
817 if (ret < 0)
818 goto power_off;
820 ret = wl1271_boot(wl);
821 if (ret < 0)
822 goto power_off;
824 ret = wl1271_plt_init(wl);
825 if (ret < 0)
826 goto irq_disable;
828 wl->state = WL1271_STATE_PLT;
829 wl1271_notice("firmware booted in PLT mode (%s)",
830 wl->chip.fw_ver);
831 goto out;
833 irq_disable:
834 wl1271_disable_interrupts(wl);
835 mutex_unlock(&wl->mutex);
836 /* Unlocking the mutex in the middle of handling is
837 inherently unsafe. In this case we deem it safe to do,
838 because we need to let any possibly pending IRQ out of
839 the system (and while we are WL1271_STATE_OFF the IRQ
840 work function will not do anything.) Also, any other
841 possible concurrent operations will fail due to the
842 current state, hence the wl1271 struct should be safe. */
843 cancel_work_sync(&wl->irq_work);
844 mutex_lock(&wl->mutex);
845 power_off:
846 wl1271_power_off(wl);
849 wl1271_error("firmware boot in PLT mode failed despite %d retries",
850 WL1271_BOOT_RETRIES);
851 out:
852 mutex_unlock(&wl->mutex);
854 return ret;
857 int wl1271_plt_stop(struct wl1271 *wl)
859 int ret = 0;
861 mutex_lock(&wl->mutex);
863 wl1271_notice("power down");
865 if (wl->state != WL1271_STATE_PLT) {
866 wl1271_error("cannot power down because not in PLT "
867 "state: %d", wl->state);
868 ret = -EBUSY;
869 goto out;
872 wl1271_disable_interrupts(wl);
873 wl1271_power_off(wl);
875 wl->state = WL1271_STATE_OFF;
876 wl->rx_counter = 0;
878 out:
879 mutex_unlock(&wl->mutex);
881 cancel_work_sync(&wl->irq_work);
882 cancel_work_sync(&wl->recovery_work);
884 return ret;
887 static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
889 struct wl1271 *wl = hw->priv;
890 struct ieee80211_conf *conf = &hw->conf;
891 struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
892 struct ieee80211_sta *sta = txinfo->control.sta;
893 unsigned long flags;
894 int q;
897 * peek into the rates configured in the STA entry.
898 * The rates set after connection stage, The first block only BG sets:
899 * the compare is for bit 0-16 of sta_rate_set. The second block add
900 * HT rates in case of HT supported.
902 spin_lock_irqsave(&wl->wl_lock, flags);
903 if (sta &&
904 (sta->supp_rates[conf->channel->band] !=
905 (wl->sta_rate_set & HW_BG_RATES_MASK))) {
906 wl->sta_rate_set = sta->supp_rates[conf->channel->band];
907 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
910 #ifdef CONFIG_WL12XX_HT
911 if (sta &&
912 sta->ht_cap.ht_supported &&
913 ((wl->sta_rate_set >> HW_HT_RATES_OFFSET) !=
914 sta->ht_cap.mcs.rx_mask[0])) {
915 /* Clean MCS bits before setting them */
916 wl->sta_rate_set &= HW_BG_RATES_MASK;
917 wl->sta_rate_set |=
918 (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
919 set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
921 #endif
922 wl->tx_queue_count++;
923 spin_unlock_irqrestore(&wl->wl_lock, flags);
925 /* queue the packet */
926 q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
927 skb_queue_tail(&wl->tx_queue[q], skb);
930 * The chip specific setup must run before the first TX packet -
931 * before that, the tx_work will not be initialized!
934 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
935 ieee80211_queue_work(wl->hw, &wl->tx_work);
938 * The workqueue is slow to process the tx_queue and we need stop
939 * the queue here, otherwise the queue will get too long.
941 if (wl->tx_queue_count >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
942 wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
944 spin_lock_irqsave(&wl->wl_lock, flags);
945 ieee80211_stop_queues(wl->hw);
946 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
947 spin_unlock_irqrestore(&wl->wl_lock, flags);
950 return NETDEV_TX_OK;
953 static struct notifier_block wl1271_dev_notifier = {
954 .notifier_call = wl1271_dev_notify,
957 static int wl1271_op_start(struct ieee80211_hw *hw)
959 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
962 * We have to delay the booting of the hardware because
963 * we need to know the local MAC address before downloading and
964 * initializing the firmware. The MAC address cannot be changed
965 * after boot, and without the proper MAC address, the firmware
966 * will not function properly.
968 * The MAC address is first known when the corresponding interface
969 * is added. That is where we will initialize the hardware.
972 return 0;
975 static void wl1271_op_stop(struct ieee80211_hw *hw)
977 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
980 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
981 struct ieee80211_vif *vif)
983 struct wl1271 *wl = hw->priv;
984 struct wiphy *wiphy = hw->wiphy;
985 int retries = WL1271_BOOT_RETRIES;
986 int ret = 0;
987 bool booted = false;
989 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
990 vif->type, vif->addr);
992 mutex_lock(&wl->mutex);
993 if (wl->vif) {
994 wl1271_debug(DEBUG_MAC80211,
995 "multiple vifs are not supported yet");
996 ret = -EBUSY;
997 goto out;
1000 switch (vif->type) {
1001 case NL80211_IFTYPE_STATION:
1002 wl->bss_type = BSS_TYPE_STA_BSS;
1003 wl->set_bss_type = BSS_TYPE_STA_BSS;
1004 break;
1005 case NL80211_IFTYPE_ADHOC:
1006 wl->bss_type = BSS_TYPE_IBSS;
1007 wl->set_bss_type = BSS_TYPE_STA_BSS;
1008 break;
1009 default:
1010 ret = -EOPNOTSUPP;
1011 goto out;
1014 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
1016 if (wl->state != WL1271_STATE_OFF) {
1017 wl1271_error("cannot start because not in off state: %d",
1018 wl->state);
1019 ret = -EBUSY;
1020 goto out;
1023 while (retries) {
1024 retries--;
1025 ret = wl1271_chip_wakeup(wl);
1026 if (ret < 0)
1027 goto power_off;
1029 ret = wl1271_boot(wl);
1030 if (ret < 0)
1031 goto power_off;
1033 ret = wl1271_hw_init(wl);
1034 if (ret < 0)
1035 goto irq_disable;
1037 booted = true;
1038 break;
1040 irq_disable:
1041 wl1271_disable_interrupts(wl);
1042 mutex_unlock(&wl->mutex);
1043 /* Unlocking the mutex in the middle of handling is
1044 inherently unsafe. In this case we deem it safe to do,
1045 because we need to let any possibly pending IRQ out of
1046 the system (and while we are WL1271_STATE_OFF the IRQ
1047 work function will not do anything.) Also, any other
1048 possible concurrent operations will fail due to the
1049 current state, hence the wl1271 struct should be safe. */
1050 cancel_work_sync(&wl->irq_work);
1051 mutex_lock(&wl->mutex);
1052 power_off:
1053 wl1271_power_off(wl);
1056 if (!booted) {
1057 wl1271_error("firmware boot failed despite %d retries",
1058 WL1271_BOOT_RETRIES);
1059 goto out;
1062 wl->vif = vif;
1063 wl->state = WL1271_STATE_ON;
1064 wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
1066 /* update hw/fw version info in wiphy struct */
1067 wiphy->hw_version = wl->chip.id;
1068 strncpy(wiphy->fw_version, wl->chip.fw_ver,
1069 sizeof(wiphy->fw_version));
1072 * Now we know if 11a is supported (info from the NVS), so disable
1073 * 11a channels if not supported
1075 if (!wl->enable_11a)
1076 wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
1078 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
1079 wl->enable_11a ? "" : "not ");
1081 out:
1082 mutex_unlock(&wl->mutex);
1084 if (!ret)
1085 list_add(&wl->list, &wl_list);
1087 return ret;
1090 static void __wl1271_op_remove_interface(struct wl1271 *wl)
1092 int i;
1094 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1096 wl1271_info("down");
1098 list_del(&wl->list);
1100 WARN_ON(wl->state != WL1271_STATE_ON);
1102 /* enable dyn ps just in case (if left on due to fw crash etc) */
1103 if (wl->bss_type == BSS_TYPE_STA_BSS)
1104 ieee80211_enable_dyn_ps(wl->vif);
1106 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
1107 wl->scan.state = WL1271_SCAN_STATE_IDLE;
1108 kfree(wl->scan.scanned_ch);
1109 wl->scan.scanned_ch = NULL;
1110 wl->scan.req = NULL;
1111 ieee80211_scan_completed(wl->hw, true);
1114 wl->state = WL1271_STATE_OFF;
1116 wl1271_disable_interrupts(wl);
1118 mutex_unlock(&wl->mutex);
1120 cancel_delayed_work_sync(&wl->scan_complete_work);
1121 cancel_work_sync(&wl->irq_work);
1122 cancel_work_sync(&wl->tx_work);
1123 cancel_delayed_work_sync(&wl->pspoll_work);
1124 cancel_delayed_work_sync(&wl->elp_work);
1126 mutex_lock(&wl->mutex);
1128 /* let's notify MAC80211 about the remaining pending TX frames */
1129 wl1271_tx_reset(wl);
1130 wl1271_power_off(wl);
1132 memset(wl->bssid, 0, ETH_ALEN);
1133 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1134 wl->ssid_len = 0;
1135 wl->bss_type = MAX_BSS_TYPE;
1136 wl->set_bss_type = MAX_BSS_TYPE;
1137 wl->band = IEEE80211_BAND_2GHZ;
1139 wl->rx_counter = 0;
1140 wl->psm_entry_retry = 0;
1141 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1142 wl->tx_blocks_available = 0;
1143 wl->tx_results_count = 0;
1144 wl->tx_packets_count = 0;
1145 wl->tx_security_last_seq = 0;
1146 wl->tx_security_seq = 0;
1147 wl->time_offset = 0;
1148 wl->session_counter = 0;
1149 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1150 wl->sta_rate_set = 0;
1151 wl->flags = 0;
1152 wl->vif = NULL;
1153 wl->filters = 0;
1155 for (i = 0; i < NUM_TX_QUEUES; i++)
1156 wl->tx_blocks_freed[i] = 0;
1158 wl1271_debugfs_reset(wl);
1160 kfree(wl->fw_status);
1161 wl->fw_status = NULL;
1162 kfree(wl->tx_res_if);
1163 wl->tx_res_if = NULL;
1164 kfree(wl->target_mem_map);
1165 wl->target_mem_map = NULL;
1168 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1169 struct ieee80211_vif *vif)
1171 struct wl1271 *wl = hw->priv;
1173 mutex_lock(&wl->mutex);
1175 * wl->vif can be null here if someone shuts down the interface
1176 * just when hardware recovery has been started.
1178 if (wl->vif) {
1179 WARN_ON(wl->vif != vif);
1180 __wl1271_op_remove_interface(wl);
1183 mutex_unlock(&wl->mutex);
1184 cancel_work_sync(&wl->recovery_work);
1187 static void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters)
1189 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1190 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1192 /* combine requested filters with current filter config */
1193 filters = wl->filters | filters;
1195 wl1271_debug(DEBUG_FILTERS, "RX filters set: ");
1197 if (filters & FIF_PROMISC_IN_BSS) {
1198 wl1271_debug(DEBUG_FILTERS, " - FIF_PROMISC_IN_BSS");
1199 wl->rx_config &= ~CFG_UNI_FILTER_EN;
1200 wl->rx_config |= CFG_BSSID_FILTER_EN;
1202 if (filters & FIF_BCN_PRBRESP_PROMISC) {
1203 wl1271_debug(DEBUG_FILTERS, " - FIF_BCN_PRBRESP_PROMISC");
1204 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1205 wl->rx_config &= ~CFG_SSID_FILTER_EN;
1207 if (filters & FIF_OTHER_BSS) {
1208 wl1271_debug(DEBUG_FILTERS, " - FIF_OTHER_BSS");
1209 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1211 if (filters & FIF_CONTROL) {
1212 wl1271_debug(DEBUG_FILTERS, " - FIF_CONTROL");
1213 wl->rx_filter |= CFG_RX_CTL_EN;
1215 if (filters & FIF_FCSFAIL) {
1216 wl1271_debug(DEBUG_FILTERS, " - FIF_FCSFAIL");
1217 wl->rx_filter |= CFG_RX_FCS_ERROR;
1221 static int wl1271_dummy_join(struct wl1271 *wl)
1223 int ret = 0;
1224 /* we need to use a dummy BSSID for now */
1225 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1226 0xad, 0xbe, 0xef };
1228 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1230 /* pass through frames from all BSS */
1231 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1233 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1234 if (ret < 0)
1235 goto out;
1237 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1239 out:
1240 return ret;
1243 static int wl1271_join(struct wl1271 *wl, bool set_assoc)
1245 int ret;
1248 * One of the side effects of the JOIN command is that is clears
1249 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1250 * to a WPA/WPA2 access point will therefore kill the data-path.
1251 * Currently there is no supported scenario for JOIN during
1252 * association - if it becomes a supported scenario, the WPA/WPA2 keys
1253 * must be handled somehow.
1256 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1257 wl1271_info("JOIN while associated.");
1259 if (set_assoc)
1260 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1262 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1263 if (ret < 0)
1264 goto out;
1266 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1268 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1269 goto out;
1272 * The join command disable the keep-alive mode, shut down its process,
1273 * and also clear the template config, so we need to reset it all after
1274 * the join. The acx_aid starts the keep-alive process, and the order
1275 * of the commands below is relevant.
1277 ret = wl1271_acx_keep_alive_mode(wl, true);
1278 if (ret < 0)
1279 goto out;
1281 ret = wl1271_acx_aid(wl, wl->aid);
1282 if (ret < 0)
1283 goto out;
1285 ret = wl1271_cmd_build_klv_null_data(wl);
1286 if (ret < 0)
1287 goto out;
1289 ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1290 ACX_KEEP_ALIVE_TPL_VALID);
1291 if (ret < 0)
1292 goto out;
1294 out:
1295 return ret;
1298 static int wl1271_unjoin(struct wl1271 *wl)
1300 int ret;
1302 /* to stop listening to a channel, we disconnect */
1303 ret = wl1271_cmd_disconnect(wl);
1304 if (ret < 0)
1305 goto out;
1307 clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1308 memset(wl->bssid, 0, ETH_ALEN);
1310 /* stop filterting packets based on bssid */
1311 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1313 out:
1314 return ret;
1317 static void wl1271_set_band_rate(struct wl1271 *wl)
1319 if (wl->band == IEEE80211_BAND_2GHZ)
1320 wl->basic_rate_set = wl->conf.tx.basic_rate;
1321 else
1322 wl->basic_rate_set = wl->conf.tx.basic_rate_5;
1325 static u32 wl1271_min_rate_get(struct wl1271 *wl)
1327 int i;
1328 u32 rate = 0;
1330 if (!wl->basic_rate_set) {
1331 WARN_ON(1);
1332 wl->basic_rate_set = wl->conf.tx.basic_rate;
1335 for (i = 0; !rate; i++) {
1336 if ((wl->basic_rate_set >> i) & 0x1)
1337 rate = 1 << i;
1340 return rate;
1343 static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
1345 int ret;
1347 if (idle) {
1348 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1349 ret = wl1271_unjoin(wl);
1350 if (ret < 0)
1351 goto out;
1353 wl->rate_set = wl1271_min_rate_get(wl);
1354 wl->sta_rate_set = 0;
1355 ret = wl1271_acx_rate_policies(wl);
1356 if (ret < 0)
1357 goto out;
1358 ret = wl1271_acx_keep_alive_config(
1359 wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1360 ACX_KEEP_ALIVE_TPL_INVALID);
1361 if (ret < 0)
1362 goto out;
1363 set_bit(WL1271_FLAG_IDLE, &wl->flags);
1364 } else {
1365 /* increment the session counter */
1366 wl->session_counter++;
1367 if (wl->session_counter >= SESSION_COUNTER_MAX)
1368 wl->session_counter = 0;
1369 ret = wl1271_dummy_join(wl);
1370 if (ret < 0)
1371 goto out;
1372 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
1375 out:
1376 return ret;
1379 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1381 struct wl1271 *wl = hw->priv;
1382 struct ieee80211_conf *conf = &hw->conf;
1383 int channel, ret = 0;
1385 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1387 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1388 channel,
1389 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1390 conf->power_level,
1391 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1394 * mac80211 will go to idle nearly immediately after transmitting some
1395 * frames, such as the deauth. To make sure those frames reach the air,
1396 * wait here until the TX queue is fully flushed.
1398 if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
1399 (conf->flags & IEEE80211_CONF_IDLE))
1400 wl1271_tx_flush(wl);
1402 mutex_lock(&wl->mutex);
1404 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1405 ret = -EAGAIN;
1406 goto out;
1409 ret = wl1271_ps_elp_wakeup(wl, false);
1410 if (ret < 0)
1411 goto out;
1413 /* if the channel changes while joined, join again */
1414 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
1415 ((wl->band != conf->channel->band) ||
1416 (wl->channel != channel))) {
1417 wl->band = conf->channel->band;
1418 wl->channel = channel;
1421 * FIXME: the mac80211 should really provide a fixed rate
1422 * to use here. for now, just use the smallest possible rate
1423 * for the band as a fixed rate for association frames and
1424 * other control messages.
1426 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1427 wl1271_set_band_rate(wl);
1429 wl->basic_rate = wl1271_min_rate_get(wl);
1430 ret = wl1271_acx_rate_policies(wl);
1431 if (ret < 0)
1432 wl1271_warning("rate policy for update channel "
1433 "failed %d", ret);
1435 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1436 ret = wl1271_join(wl, false);
1437 if (ret < 0)
1438 wl1271_warning("cmd join to update channel "
1439 "failed %d", ret);
1443 if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1444 ret = wl1271_handle_idle(wl, conf->flags & IEEE80211_CONF_IDLE);
1445 if (ret < 0)
1446 wl1271_warning("idle mode change failed %d", ret);
1450 * if mac80211 changes the PSM mode, make sure the mode is not
1451 * incorrectly changed after the pspoll failure active window.
1453 if (changed & IEEE80211_CONF_CHANGE_PS)
1454 clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
1456 if (conf->flags & IEEE80211_CONF_PS &&
1457 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1458 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1461 * We enter PSM only if we're already associated.
1462 * If we're not, we'll enter it when joining an SSID,
1463 * through the bss_info_changed() hook.
1465 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1466 wl1271_debug(DEBUG_PSM, "psm enabled");
1467 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1468 wl->basic_rate, true);
1470 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1471 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1472 wl1271_debug(DEBUG_PSM, "psm disabled");
1474 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1476 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1477 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1478 wl->basic_rate, true);
1481 if (conf->power_level != wl->power_level) {
1482 ret = wl1271_acx_tx_power(wl, conf->power_level);
1483 if (ret < 0)
1484 goto out_sleep;
1486 wl->power_level = conf->power_level;
1489 out_sleep:
1490 wl1271_ps_elp_sleep(wl);
1492 out:
1493 mutex_unlock(&wl->mutex);
1495 return ret;
1498 struct wl1271_filter_params {
1499 bool enabled;
1500 int mc_list_length;
1501 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1504 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
1505 struct netdev_hw_addr_list *mc_list)
1507 struct wl1271_filter_params *fp;
1508 struct netdev_hw_addr *ha;
1509 struct wl1271 *wl = hw->priv;
1511 if (unlikely(wl->state == WL1271_STATE_OFF))
1512 return 0;
1514 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1515 if (!fp) {
1516 wl1271_error("Out of memory setting filters.");
1517 return 0;
1520 /* update multicast filtering parameters */
1521 fp->mc_list_length = 0;
1522 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
1523 fp->enabled = false;
1524 } else {
1525 fp->enabled = true;
1526 netdev_hw_addr_list_for_each(ha, mc_list) {
1527 memcpy(fp->mc_list[fp->mc_list_length],
1528 ha->addr, ETH_ALEN);
1529 fp->mc_list_length++;
1533 return (u64)(unsigned long)fp;
1536 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1537 FIF_ALLMULTI | \
1538 FIF_FCSFAIL | \
1539 FIF_BCN_PRBRESP_PROMISC | \
1540 FIF_CONTROL | \
1541 FIF_OTHER_BSS)
1543 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1544 unsigned int changed,
1545 unsigned int *total, u64 multicast)
1547 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1548 struct wl1271 *wl = hw->priv;
1549 int ret;
1551 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1553 mutex_lock(&wl->mutex);
1555 *total &= WL1271_SUPPORTED_FILTERS;
1556 changed &= WL1271_SUPPORTED_FILTERS;
1558 if (unlikely(wl->state == WL1271_STATE_OFF))
1559 goto out;
1561 ret = wl1271_ps_elp_wakeup(wl, false);
1562 if (ret < 0)
1563 goto out;
1566 if (*total & FIF_ALLMULTI)
1567 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1568 else if (fp)
1569 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1570 fp->mc_list,
1571 fp->mc_list_length);
1572 if (ret < 0)
1573 goto out_sleep;
1575 /* determine, whether supported filter values have changed */
1576 if (changed == 0)
1577 goto out_sleep;
1579 /* configure filters */
1580 wl->filters = *total;
1581 wl1271_configure_filters(wl, 0);
1583 /* apply configured filters */
1584 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1585 if (ret < 0)
1586 goto out_sleep;
1588 out_sleep:
1589 wl1271_ps_elp_sleep(wl);
1591 out:
1592 mutex_unlock(&wl->mutex);
1593 kfree(fp);
1596 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1597 struct ieee80211_vif *vif,
1598 struct ieee80211_sta *sta,
1599 struct ieee80211_key_conf *key_conf)
1601 struct wl1271 *wl = hw->priv;
1602 const u8 *addr;
1603 int ret;
1604 u32 tx_seq_32 = 0;
1605 u16 tx_seq_16 = 0;
1606 u8 key_type;
1608 static const u8 bcast_addr[ETH_ALEN] =
1609 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1611 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1613 addr = sta ? sta->addr : bcast_addr;
1615 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1616 wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1617 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1618 key_conf->cipher, key_conf->keyidx,
1619 key_conf->keylen, key_conf->flags);
1620 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1622 if (is_zero_ether_addr(addr)) {
1623 /* We dont support TX only encryption */
1624 ret = -EOPNOTSUPP;
1625 goto out;
1628 mutex_lock(&wl->mutex);
1630 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1631 ret = -EAGAIN;
1632 goto out_unlock;
1635 ret = wl1271_ps_elp_wakeup(wl, false);
1636 if (ret < 0)
1637 goto out_unlock;
1639 switch (key_conf->cipher) {
1640 case WLAN_CIPHER_SUITE_WEP40:
1641 case WLAN_CIPHER_SUITE_WEP104:
1642 key_type = KEY_WEP;
1644 key_conf->hw_key_idx = key_conf->keyidx;
1645 break;
1646 case WLAN_CIPHER_SUITE_TKIP:
1647 key_type = KEY_TKIP;
1649 key_conf->hw_key_idx = key_conf->keyidx;
1650 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1651 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1652 break;
1653 case WLAN_CIPHER_SUITE_CCMP:
1654 key_type = KEY_AES;
1656 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1657 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1658 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1659 break;
1660 case WL1271_CIPHER_SUITE_GEM:
1661 key_type = KEY_GEM;
1662 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1663 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1664 break;
1665 default:
1666 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
1668 ret = -EOPNOTSUPP;
1669 goto out_sleep;
1672 switch (cmd) {
1673 case SET_KEY:
1674 ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1675 key_conf->keyidx, key_type,
1676 key_conf->keylen, key_conf->key,
1677 addr, tx_seq_32, tx_seq_16);
1678 if (ret < 0) {
1679 wl1271_error("Could not add or replace key");
1680 goto out_sleep;
1683 /* the default WEP key needs to be configured at least once */
1684 if (key_type == KEY_WEP) {
1685 ret = wl1271_cmd_set_default_wep_key(wl,
1686 wl->default_key);
1687 if (ret < 0)
1688 goto out_sleep;
1690 break;
1692 case DISABLE_KEY:
1693 /* The wl1271 does not allow to remove unicast keys - they
1694 will be cleared automatically on next CMD_JOIN. Ignore the
1695 request silently, as we dont want the mac80211 to emit
1696 an error message. */
1697 if (!is_broadcast_ether_addr(addr))
1698 break;
1700 ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1701 key_conf->keyidx, key_type,
1702 key_conf->keylen, key_conf->key,
1703 addr, 0, 0);
1704 if (ret < 0) {
1705 wl1271_error("Could not remove key");
1706 goto out_sleep;
1708 break;
1710 default:
1711 wl1271_error("Unsupported key cmd 0x%x", cmd);
1712 ret = -EOPNOTSUPP;
1713 break;
1716 out_sleep:
1717 wl1271_ps_elp_sleep(wl);
1719 out_unlock:
1720 mutex_unlock(&wl->mutex);
1722 out:
1723 return ret;
1726 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1727 struct ieee80211_vif *vif,
1728 struct cfg80211_scan_request *req)
1730 struct wl1271 *wl = hw->priv;
1731 int ret;
1732 u8 *ssid = NULL;
1733 size_t len = 0;
1735 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1737 if (req->n_ssids) {
1738 ssid = req->ssids[0].ssid;
1739 len = req->ssids[0].ssid_len;
1742 mutex_lock(&wl->mutex);
1744 if (wl->state == WL1271_STATE_OFF) {
1746 * We cannot return -EBUSY here because cfg80211 will expect
1747 * a call to ieee80211_scan_completed if we do - in this case
1748 * there won't be any call.
1750 ret = -EAGAIN;
1751 goto out;
1754 ret = wl1271_ps_elp_wakeup(wl, false);
1755 if (ret < 0)
1756 goto out;
1758 ret = wl1271_scan(hw->priv, ssid, len, req);
1760 wl1271_ps_elp_sleep(wl);
1762 out:
1763 mutex_unlock(&wl->mutex);
1765 return ret;
1768 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
1770 struct wl1271 *wl = hw->priv;
1771 int ret = 0;
1773 mutex_lock(&wl->mutex);
1775 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1776 ret = -EAGAIN;
1777 goto out;
1780 ret = wl1271_ps_elp_wakeup(wl, false);
1781 if (ret < 0)
1782 goto out;
1784 ret = wl1271_acx_frag_threshold(wl, (u16)value);
1785 if (ret < 0)
1786 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
1788 wl1271_ps_elp_sleep(wl);
1790 out:
1791 mutex_unlock(&wl->mutex);
1793 return ret;
1796 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1798 struct wl1271 *wl = hw->priv;
1799 int ret = 0;
1801 mutex_lock(&wl->mutex);
1803 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1804 ret = -EAGAIN;
1805 goto out;
1808 ret = wl1271_ps_elp_wakeup(wl, false);
1809 if (ret < 0)
1810 goto out;
1812 ret = wl1271_acx_rts_threshold(wl, (u16) value);
1813 if (ret < 0)
1814 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1816 wl1271_ps_elp_sleep(wl);
1818 out:
1819 mutex_unlock(&wl->mutex);
1821 return ret;
1824 static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *skb,
1825 int offset)
1827 u8 *ptr = skb->data + offset;
1829 /* find the location of the ssid in the beacon */
1830 while (ptr < skb->data + skb->len) {
1831 if (ptr[0] == WLAN_EID_SSID) {
1832 wl->ssid_len = ptr[1];
1833 memcpy(wl->ssid, ptr+2, wl->ssid_len);
1834 return;
1836 ptr += (ptr[1] + 2);
1838 wl1271_error("No SSID in IEs!\n");
1841 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1842 struct ieee80211_vif *vif,
1843 struct ieee80211_bss_conf *bss_conf,
1844 u32 changed)
1846 enum wl1271_cmd_ps_mode mode;
1847 struct wl1271 *wl = hw->priv;
1848 struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid);
1849 bool do_join = false;
1850 bool set_assoc = false;
1851 int ret;
1853 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1855 mutex_lock(&wl->mutex);
1857 if (unlikely(wl->state == WL1271_STATE_OFF))
1858 goto out;
1860 ret = wl1271_ps_elp_wakeup(wl, false);
1861 if (ret < 0)
1862 goto out;
1864 if ((changed & BSS_CHANGED_BEACON_INT) &&
1865 (wl->bss_type == BSS_TYPE_IBSS)) {
1866 wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon interval updated: %d",
1867 bss_conf->beacon_int);
1869 wl->beacon_int = bss_conf->beacon_int;
1870 do_join = true;
1873 if ((changed & BSS_CHANGED_BEACON) &&
1874 (wl->bss_type == BSS_TYPE_IBSS)) {
1875 struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
1877 wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon updated");
1879 if (beacon) {
1880 struct ieee80211_hdr *hdr;
1881 int ieoffset = offsetof(struct ieee80211_mgmt,
1882 u.beacon.variable);
1884 wl1271_ssid_set(wl, beacon, ieoffset);
1886 ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1887 beacon->data,
1888 beacon->len, 0,
1889 wl1271_min_rate_get(wl));
1891 if (ret < 0) {
1892 dev_kfree_skb(beacon);
1893 goto out_sleep;
1896 hdr = (struct ieee80211_hdr *) beacon->data;
1897 hdr->frame_control = cpu_to_le16(
1898 IEEE80211_FTYPE_MGMT |
1899 IEEE80211_STYPE_PROBE_RESP);
1901 ret = wl1271_cmd_template_set(wl,
1902 CMD_TEMPL_PROBE_RESPONSE,
1903 beacon->data,
1904 beacon->len, 0,
1905 wl1271_min_rate_get(wl));
1906 dev_kfree_skb(beacon);
1907 if (ret < 0)
1908 goto out_sleep;
1910 /* Need to update the SSID (for filtering etc) */
1911 do_join = true;
1915 if ((changed & BSS_CHANGED_BEACON_ENABLED) &&
1916 (wl->bss_type == BSS_TYPE_IBSS)) {
1917 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
1918 bss_conf->enable_beacon ? "enabled" : "disabled");
1920 if (bss_conf->enable_beacon)
1921 wl->set_bss_type = BSS_TYPE_IBSS;
1922 else
1923 wl->set_bss_type = BSS_TYPE_STA_BSS;
1924 do_join = true;
1927 if (changed & BSS_CHANGED_CQM) {
1928 bool enable = false;
1929 if (bss_conf->cqm_rssi_thold)
1930 enable = true;
1931 ret = wl1271_acx_rssi_snr_trigger(wl, enable,
1932 bss_conf->cqm_rssi_thold,
1933 bss_conf->cqm_rssi_hyst);
1934 if (ret < 0)
1935 goto out;
1936 wl->rssi_thold = bss_conf->cqm_rssi_thold;
1939 if ((changed & BSS_CHANGED_BSSID) &&
1941 * Now we know the correct bssid, so we send a new join command
1942 * and enable the BSSID filter
1944 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1945 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1947 ret = wl1271_cmd_build_null_data(wl);
1948 if (ret < 0)
1949 goto out_sleep;
1951 ret = wl1271_build_qos_null_data(wl);
1952 if (ret < 0)
1953 goto out_sleep;
1955 /* filter out all packets not from this BSSID */
1956 wl1271_configure_filters(wl, 0);
1958 /* Need to update the BSSID (for filtering etc) */
1959 do_join = true;
1962 if (changed & BSS_CHANGED_ASSOC) {
1963 if (bss_conf->assoc) {
1964 u32 rates;
1965 int ieoffset;
1966 wl->aid = bss_conf->aid;
1967 set_assoc = true;
1969 wl->ps_poll_failures = 0;
1972 * use basic rates from AP, and determine lowest rate
1973 * to use with control frames.
1975 rates = bss_conf->basic_rates;
1976 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
1977 rates);
1978 wl->basic_rate = wl1271_min_rate_get(wl);
1979 ret = wl1271_acx_rate_policies(wl);
1980 if (ret < 0)
1981 goto out_sleep;
1984 * with wl1271, we don't need to update the
1985 * beacon_int and dtim_period, because the firmware
1986 * updates it by itself when the first beacon is
1987 * received after a join.
1989 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1990 if (ret < 0)
1991 goto out_sleep;
1994 * Get a template for hardware connection maintenance
1996 dev_kfree_skb(wl->probereq);
1997 wl->probereq = wl1271_cmd_build_ap_probe_req(wl, NULL);
1998 ieoffset = offsetof(struct ieee80211_mgmt,
1999 u.probe_req.variable);
2000 wl1271_ssid_set(wl, wl->probereq, ieoffset);
2002 /* enable the connection monitoring feature */
2003 ret = wl1271_acx_conn_monit_params(wl, true);
2004 if (ret < 0)
2005 goto out_sleep;
2007 /* If we want to go in PSM but we're not there yet */
2008 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
2009 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
2010 mode = STATION_POWER_SAVE_MODE;
2011 ret = wl1271_ps_set_mode(wl, mode,
2012 wl->basic_rate,
2013 true);
2014 if (ret < 0)
2015 goto out_sleep;
2017 } else {
2018 /* use defaults when not associated */
2019 clear_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags);
2020 clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
2021 wl->aid = 0;
2023 /* free probe-request template */
2024 dev_kfree_skb(wl->probereq);
2025 wl->probereq = NULL;
2027 /* re-enable dynamic ps - just in case */
2028 ieee80211_enable_dyn_ps(wl->vif);
2030 /* revert back to minimum rates for the current band */
2031 wl1271_set_band_rate(wl);
2032 wl->basic_rate = wl1271_min_rate_get(wl);
2033 ret = wl1271_acx_rate_policies(wl);
2034 if (ret < 0)
2035 goto out_sleep;
2037 /* disable connection monitor features */
2038 ret = wl1271_acx_conn_monit_params(wl, false);
2040 /* Disable the keep-alive feature */
2041 ret = wl1271_acx_keep_alive_mode(wl, false);
2042 if (ret < 0)
2043 goto out_sleep;
2045 /* restore the bssid filter and go to dummy bssid */
2046 wl1271_unjoin(wl);
2047 wl1271_dummy_join(wl);
2052 if (changed & BSS_CHANGED_ERP_SLOT) {
2053 if (bss_conf->use_short_slot)
2054 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
2055 else
2056 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
2057 if (ret < 0) {
2058 wl1271_warning("Set slot time failed %d", ret);
2059 goto out_sleep;
2063 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2064 if (bss_conf->use_short_preamble)
2065 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
2066 else
2067 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
2070 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2071 if (bss_conf->use_cts_prot)
2072 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
2073 else
2074 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
2075 if (ret < 0) {
2076 wl1271_warning("Set ctsprotect failed %d", ret);
2077 goto out_sleep;
2082 * Takes care of: New association with HT enable,
2083 * HT information change in beacon.
2085 if (sta &&
2086 (changed & BSS_CHANGED_HT) &&
2087 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
2088 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true);
2089 if (ret < 0) {
2090 wl1271_warning("Set ht cap true failed %d", ret);
2091 goto out_sleep;
2093 ret = wl1271_acx_set_ht_information(wl,
2094 bss_conf->ht_operation_mode);
2095 if (ret < 0) {
2096 wl1271_warning("Set ht information failed %d", ret);
2097 goto out_sleep;
2101 * Takes care of: New association without HT,
2102 * Disassociation.
2104 else if (sta && (changed & BSS_CHANGED_ASSOC)) {
2105 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, false);
2106 if (ret < 0) {
2107 wl1271_warning("Set ht cap false failed %d", ret);
2108 goto out_sleep;
2112 if (changed & BSS_CHANGED_ARP_FILTER) {
2113 __be32 addr = bss_conf->arp_addr_list[0];
2114 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
2116 if (bss_conf->arp_addr_cnt == 1 &&
2117 bss_conf->arp_filter_enabled) {
2119 * The template should have been configured only upon
2120 * association. however, it seems that the correct ip
2121 * isn't being set (when sending), so we have to
2122 * reconfigure the template upon every ip change.
2124 ret = wl1271_cmd_build_arp_rsp(wl, addr);
2125 if (ret < 0) {
2126 wl1271_warning("build arp rsp failed: %d", ret);
2127 goto out_sleep;
2130 ret = wl1271_acx_arp_ip_filter(wl,
2131 (ACX_ARP_FILTER_ARP_FILTERING |
2132 ACX_ARP_FILTER_AUTO_ARP),
2133 addr);
2134 } else
2135 ret = wl1271_acx_arp_ip_filter(wl, 0, addr);
2137 if (ret < 0)
2138 goto out_sleep;
2141 if (do_join) {
2142 ret = wl1271_join(wl, set_assoc);
2143 if (ret < 0) {
2144 wl1271_warning("cmd join failed %d", ret);
2145 goto out_sleep;
2149 out_sleep:
2150 wl1271_ps_elp_sleep(wl);
2152 out:
2153 mutex_unlock(&wl->mutex);
2156 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
2157 const struct ieee80211_tx_queue_params *params)
2159 struct wl1271 *wl = hw->priv;
2160 u8 ps_scheme;
2161 int ret;
2163 mutex_lock(&wl->mutex);
2165 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
2167 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2168 ret = -EAGAIN;
2169 goto out;
2172 ret = wl1271_ps_elp_wakeup(wl, false);
2173 if (ret < 0)
2174 goto out;
2176 /* the txop is confed in units of 32us by the mac80211, we need us */
2177 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
2178 params->cw_min, params->cw_max,
2179 params->aifs, params->txop << 5);
2180 if (ret < 0)
2181 goto out_sleep;
2183 if (params->uapsd)
2184 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
2185 else
2186 ps_scheme = CONF_PS_SCHEME_LEGACY;
2188 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
2189 CONF_CHANNEL_TYPE_EDCF,
2190 wl1271_tx_get_queue(queue),
2191 ps_scheme, CONF_ACK_POLICY_LEGACY, 0, 0);
2192 if (ret < 0)
2193 goto out_sleep;
2195 out_sleep:
2196 wl1271_ps_elp_sleep(wl);
2198 out:
2199 mutex_unlock(&wl->mutex);
2201 return ret;
2204 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
2207 struct wl1271 *wl = hw->priv;
2208 u64 mactime = ULLONG_MAX;
2209 int ret;
2211 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
2213 mutex_lock(&wl->mutex);
2215 if (unlikely(wl->state == WL1271_STATE_OFF))
2216 goto out;
2218 ret = wl1271_ps_elp_wakeup(wl, false);
2219 if (ret < 0)
2220 goto out;
2222 ret = wl1271_acx_tsf_info(wl, &mactime);
2223 if (ret < 0)
2224 goto out_sleep;
2226 out_sleep:
2227 wl1271_ps_elp_sleep(wl);
2229 out:
2230 mutex_unlock(&wl->mutex);
2231 return mactime;
2234 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
2235 struct survey_info *survey)
2237 struct wl1271 *wl = hw->priv;
2238 struct ieee80211_conf *conf = &hw->conf;
2240 if (idx != 0)
2241 return -ENOENT;
2243 survey->channel = conf->channel;
2244 survey->filled = SURVEY_INFO_NOISE_DBM;
2245 survey->noise = wl->noise;
2247 return 0;
2250 /* can't be const, mac80211 writes to this */
2251 static struct ieee80211_rate wl1271_rates[] = {
2252 { .bitrate = 10,
2253 .hw_value = CONF_HW_BIT_RATE_1MBPS,
2254 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
2255 { .bitrate = 20,
2256 .hw_value = CONF_HW_BIT_RATE_2MBPS,
2257 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
2258 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2259 { .bitrate = 55,
2260 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
2261 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
2262 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2263 { .bitrate = 110,
2264 .hw_value = CONF_HW_BIT_RATE_11MBPS,
2265 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
2266 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2267 { .bitrate = 60,
2268 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2269 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2270 { .bitrate = 90,
2271 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2272 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2273 { .bitrate = 120,
2274 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2275 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2276 { .bitrate = 180,
2277 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2278 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2279 { .bitrate = 240,
2280 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2281 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2282 { .bitrate = 360,
2283 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2284 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2285 { .bitrate = 480,
2286 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2287 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2288 { .bitrate = 540,
2289 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2290 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2293 /* can't be const, mac80211 writes to this */
2294 static struct ieee80211_channel wl1271_channels[] = {
2295 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
2296 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
2297 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
2298 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
2299 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
2300 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
2301 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
2302 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
2303 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
2304 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
2305 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
2306 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
2307 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
2310 /* mapping to indexes for wl1271_rates */
2311 static const u8 wl1271_rate_to_idx_2ghz[] = {
2312 /* MCS rates are used only with 11n */
2313 7, /* CONF_HW_RXTX_RATE_MCS7 */
2314 6, /* CONF_HW_RXTX_RATE_MCS6 */
2315 5, /* CONF_HW_RXTX_RATE_MCS5 */
2316 4, /* CONF_HW_RXTX_RATE_MCS4 */
2317 3, /* CONF_HW_RXTX_RATE_MCS3 */
2318 2, /* CONF_HW_RXTX_RATE_MCS2 */
2319 1, /* CONF_HW_RXTX_RATE_MCS1 */
2320 0, /* CONF_HW_RXTX_RATE_MCS0 */
2322 11, /* CONF_HW_RXTX_RATE_54 */
2323 10, /* CONF_HW_RXTX_RATE_48 */
2324 9, /* CONF_HW_RXTX_RATE_36 */
2325 8, /* CONF_HW_RXTX_RATE_24 */
2327 /* TI-specific rate */
2328 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
2330 7, /* CONF_HW_RXTX_RATE_18 */
2331 6, /* CONF_HW_RXTX_RATE_12 */
2332 3, /* CONF_HW_RXTX_RATE_11 */
2333 5, /* CONF_HW_RXTX_RATE_9 */
2334 4, /* CONF_HW_RXTX_RATE_6 */
2335 2, /* CONF_HW_RXTX_RATE_5_5 */
2336 1, /* CONF_HW_RXTX_RATE_2 */
2337 0 /* CONF_HW_RXTX_RATE_1 */
2340 /* 11n STA capabilities */
2341 #define HW_RX_HIGHEST_RATE 72
2343 #ifdef CONFIG_WL12XX_HT
2344 #define WL12XX_HT_CAP { \
2345 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \
2346 .ht_supported = true, \
2347 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
2348 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
2349 .mcs = { \
2350 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
2351 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
2352 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
2353 }, \
2355 #else
2356 #define WL12XX_HT_CAP { \
2357 .ht_supported = false, \
2359 #endif
2361 /* can't be const, mac80211 writes to this */
2362 static struct ieee80211_supported_band wl1271_band_2ghz = {
2363 .channels = wl1271_channels,
2364 .n_channels = ARRAY_SIZE(wl1271_channels),
2365 .bitrates = wl1271_rates,
2366 .n_bitrates = ARRAY_SIZE(wl1271_rates),
2367 .ht_cap = WL12XX_HT_CAP,
2370 /* 5 GHz data rates for WL1273 */
2371 static struct ieee80211_rate wl1271_rates_5ghz[] = {
2372 { .bitrate = 60,
2373 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2374 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2375 { .bitrate = 90,
2376 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2377 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2378 { .bitrate = 120,
2379 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2380 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2381 { .bitrate = 180,
2382 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2383 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2384 { .bitrate = 240,
2385 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2386 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2387 { .bitrate = 360,
2388 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2389 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2390 { .bitrate = 480,
2391 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2392 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2393 { .bitrate = 540,
2394 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2395 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2398 /* 5 GHz band channels for WL1273 */
2399 static struct ieee80211_channel wl1271_channels_5ghz[] = {
2400 { .hw_value = 7, .center_freq = 5035},
2401 { .hw_value = 8, .center_freq = 5040},
2402 { .hw_value = 9, .center_freq = 5045},
2403 { .hw_value = 11, .center_freq = 5055},
2404 { .hw_value = 12, .center_freq = 5060},
2405 { .hw_value = 16, .center_freq = 5080},
2406 { .hw_value = 34, .center_freq = 5170},
2407 { .hw_value = 36, .center_freq = 5180},
2408 { .hw_value = 38, .center_freq = 5190},
2409 { .hw_value = 40, .center_freq = 5200},
2410 { .hw_value = 42, .center_freq = 5210},
2411 { .hw_value = 44, .center_freq = 5220},
2412 { .hw_value = 46, .center_freq = 5230},
2413 { .hw_value = 48, .center_freq = 5240},
2414 { .hw_value = 52, .center_freq = 5260},
2415 { .hw_value = 56, .center_freq = 5280},
2416 { .hw_value = 60, .center_freq = 5300},
2417 { .hw_value = 64, .center_freq = 5320},
2418 { .hw_value = 100, .center_freq = 5500},
2419 { .hw_value = 104, .center_freq = 5520},
2420 { .hw_value = 108, .center_freq = 5540},
2421 { .hw_value = 112, .center_freq = 5560},
2422 { .hw_value = 116, .center_freq = 5580},
2423 { .hw_value = 120, .center_freq = 5600},
2424 { .hw_value = 124, .center_freq = 5620},
2425 { .hw_value = 128, .center_freq = 5640},
2426 { .hw_value = 132, .center_freq = 5660},
2427 { .hw_value = 136, .center_freq = 5680},
2428 { .hw_value = 140, .center_freq = 5700},
2429 { .hw_value = 149, .center_freq = 5745},
2430 { .hw_value = 153, .center_freq = 5765},
2431 { .hw_value = 157, .center_freq = 5785},
2432 { .hw_value = 161, .center_freq = 5805},
2433 { .hw_value = 165, .center_freq = 5825},
2436 /* mapping to indexes for wl1271_rates_5ghz */
2437 static const u8 wl1271_rate_to_idx_5ghz[] = {
2438 /* MCS rates are used only with 11n */
2439 7, /* CONF_HW_RXTX_RATE_MCS7 */
2440 6, /* CONF_HW_RXTX_RATE_MCS6 */
2441 5, /* CONF_HW_RXTX_RATE_MCS5 */
2442 4, /* CONF_HW_RXTX_RATE_MCS4 */
2443 3, /* CONF_HW_RXTX_RATE_MCS3 */
2444 2, /* CONF_HW_RXTX_RATE_MCS2 */
2445 1, /* CONF_HW_RXTX_RATE_MCS1 */
2446 0, /* CONF_HW_RXTX_RATE_MCS0 */
2448 7, /* CONF_HW_RXTX_RATE_54 */
2449 6, /* CONF_HW_RXTX_RATE_48 */
2450 5, /* CONF_HW_RXTX_RATE_36 */
2451 4, /* CONF_HW_RXTX_RATE_24 */
2453 /* TI-specific rate */
2454 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
2456 3, /* CONF_HW_RXTX_RATE_18 */
2457 2, /* CONF_HW_RXTX_RATE_12 */
2458 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
2459 1, /* CONF_HW_RXTX_RATE_9 */
2460 0, /* CONF_HW_RXTX_RATE_6 */
2461 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
2462 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
2463 CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
2466 static struct ieee80211_supported_band wl1271_band_5ghz = {
2467 .channels = wl1271_channels_5ghz,
2468 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
2469 .bitrates = wl1271_rates_5ghz,
2470 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
2471 .ht_cap = WL12XX_HT_CAP,
2474 static const u8 *wl1271_band_rate_to_idx[] = {
2475 [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
2476 [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
2479 static const struct ieee80211_ops wl1271_ops = {
2480 .start = wl1271_op_start,
2481 .stop = wl1271_op_stop,
2482 .add_interface = wl1271_op_add_interface,
2483 .remove_interface = wl1271_op_remove_interface,
2484 .config = wl1271_op_config,
2485 .prepare_multicast = wl1271_op_prepare_multicast,
2486 .configure_filter = wl1271_op_configure_filter,
2487 .tx = wl1271_op_tx,
2488 .set_key = wl1271_op_set_key,
2489 .hw_scan = wl1271_op_hw_scan,
2490 .bss_info_changed = wl1271_op_bss_info_changed,
2491 .set_frag_threshold = wl1271_op_set_frag_threshold,
2492 .set_rts_threshold = wl1271_op_set_rts_threshold,
2493 .conf_tx = wl1271_op_conf_tx,
2494 .get_tsf = wl1271_op_get_tsf,
2495 .get_survey = wl1271_op_get_survey,
2496 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
2500 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
2502 u8 idx;
2504 BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
2506 if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
2507 wl1271_error("Illegal RX rate from HW: %d", rate);
2508 return 0;
2511 idx = wl1271_band_rate_to_idx[band][rate];
2512 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
2513 wl1271_error("Unsupported RX rate from HW: %d", rate);
2514 return 0;
2517 return idx;
2520 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
2521 struct device_attribute *attr,
2522 char *buf)
2524 struct wl1271 *wl = dev_get_drvdata(dev);
2525 ssize_t len;
2527 len = PAGE_SIZE;
2529 mutex_lock(&wl->mutex);
2530 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
2531 wl->sg_enabled);
2532 mutex_unlock(&wl->mutex);
2534 return len;
2538 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
2539 struct device_attribute *attr,
2540 const char *buf, size_t count)
2542 struct wl1271 *wl = dev_get_drvdata(dev);
2543 unsigned long res;
2544 int ret;
2546 ret = strict_strtoul(buf, 10, &res);
2548 if (ret < 0) {
2549 wl1271_warning("incorrect value written to bt_coex_mode");
2550 return count;
2553 mutex_lock(&wl->mutex);
2555 res = !!res;
2557 if (res == wl->sg_enabled)
2558 goto out;
2560 wl->sg_enabled = res;
2562 if (wl->state == WL1271_STATE_OFF)
2563 goto out;
2565 ret = wl1271_ps_elp_wakeup(wl, false);
2566 if (ret < 0)
2567 goto out;
2569 wl1271_acx_sg_enable(wl, wl->sg_enabled);
2570 wl1271_ps_elp_sleep(wl);
2572 out:
2573 mutex_unlock(&wl->mutex);
2574 return count;
2577 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
2578 wl1271_sysfs_show_bt_coex_state,
2579 wl1271_sysfs_store_bt_coex_state);
2581 static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
2582 struct device_attribute *attr,
2583 char *buf)
2585 struct wl1271 *wl = dev_get_drvdata(dev);
2586 ssize_t len;
2588 len = PAGE_SIZE;
2590 mutex_lock(&wl->mutex);
2591 if (wl->hw_pg_ver >= 0)
2592 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
2593 else
2594 len = snprintf(buf, len, "n/a\n");
2595 mutex_unlock(&wl->mutex);
2597 return len;
2600 static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
2601 wl1271_sysfs_show_hw_pg_ver, NULL);
2603 int wl1271_register_hw(struct wl1271 *wl)
2605 int ret;
2607 if (wl->mac80211_registered)
2608 return 0;
2610 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
2612 ret = ieee80211_register_hw(wl->hw);
2613 if (ret < 0) {
2614 wl1271_error("unable to register mac80211 hw: %d", ret);
2615 return ret;
2618 wl->mac80211_registered = true;
2620 wl1271_debugfs_init(wl);
2622 register_netdevice_notifier(&wl1271_dev_notifier);
2624 wl1271_notice("loaded");
2626 return 0;
2628 EXPORT_SYMBOL_GPL(wl1271_register_hw);
2630 void wl1271_unregister_hw(struct wl1271 *wl)
2632 unregister_netdevice_notifier(&wl1271_dev_notifier);
2633 ieee80211_unregister_hw(wl->hw);
2634 wl->mac80211_registered = false;
2637 EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
2639 int wl1271_init_ieee80211(struct wl1271 *wl)
2641 static const u32 cipher_suites[] = {
2642 WLAN_CIPHER_SUITE_WEP40,
2643 WLAN_CIPHER_SUITE_WEP104,
2644 WLAN_CIPHER_SUITE_TKIP,
2645 WLAN_CIPHER_SUITE_CCMP,
2646 WL1271_CIPHER_SUITE_GEM,
2649 /* The tx descriptor buffer and the TKIP space. */
2650 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
2651 sizeof(struct wl1271_tx_hw_descr);
2653 /* unit us */
2654 /* FIXME: find a proper value */
2655 wl->hw->channel_change_time = 10000;
2656 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
2658 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
2659 IEEE80211_HW_BEACON_FILTER |
2660 IEEE80211_HW_SUPPORTS_PS |
2661 IEEE80211_HW_SUPPORTS_UAPSD |
2662 IEEE80211_HW_HAS_RATE_CONTROL |
2663 IEEE80211_HW_CONNECTION_MONITOR |
2664 IEEE80211_HW_SUPPORTS_CQM_RSSI;
2666 wl->hw->wiphy->cipher_suites = cipher_suites;
2667 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
2669 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2670 BIT(NL80211_IFTYPE_ADHOC);
2671 wl->hw->wiphy->max_scan_ssids = 1;
2673 * Maximum length of elements in scanning probe request templates
2674 * should be the maximum length possible for a template, without
2675 * the IEEE80211 header of the template
2677 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
2678 sizeof(struct ieee80211_header);
2679 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
2680 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
2682 wl->hw->queues = 4;
2683 wl->hw->max_rates = 1;
2685 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
2687 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
2689 return 0;
2691 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
2693 #define WL1271_DEFAULT_CHANNEL 0
2695 struct ieee80211_hw *wl1271_alloc_hw(void)
2697 struct ieee80211_hw *hw;
2698 struct platform_device *plat_dev = NULL;
2699 struct wl1271 *wl;
2700 int i, ret;
2701 unsigned int order;
2703 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
2704 if (!hw) {
2705 wl1271_error("could not alloc ieee80211_hw");
2706 ret = -ENOMEM;
2707 goto err_hw_alloc;
2710 plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
2711 if (!plat_dev) {
2712 wl1271_error("could not allocate platform_device");
2713 ret = -ENOMEM;
2714 goto err_plat_alloc;
2717 wl = hw->priv;
2718 memset(wl, 0, sizeof(*wl));
2720 INIT_LIST_HEAD(&wl->list);
2722 wl->hw = hw;
2723 wl->plat_dev = plat_dev;
2725 for (i = 0; i < NUM_TX_QUEUES; i++)
2726 skb_queue_head_init(&wl->tx_queue[i]);
2728 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
2729 INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
2730 INIT_WORK(&wl->irq_work, wl1271_irq_work);
2731 INIT_WORK(&wl->tx_work, wl1271_tx_work);
2732 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
2733 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
2734 wl->channel = WL1271_DEFAULT_CHANNEL;
2735 wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
2736 wl->default_key = 0;
2737 wl->rx_counter = 0;
2738 wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
2739 wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
2740 wl->psm_entry_retry = 0;
2741 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2742 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2743 wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
2744 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
2745 wl->sta_rate_set = 0;
2746 wl->band = IEEE80211_BAND_2GHZ;
2747 wl->vif = NULL;
2748 wl->flags = 0;
2749 wl->sg_enabled = true;
2750 wl->hw_pg_ver = -1;
2752 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
2753 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
2754 wl->tx_frames[i] = NULL;
2756 spin_lock_init(&wl->wl_lock);
2758 wl->state = WL1271_STATE_OFF;
2759 mutex_init(&wl->mutex);
2761 /* Apply default driver configuration. */
2762 wl1271_conf_init(wl);
2764 order = get_order(WL1271_AGGR_BUFFER_SIZE);
2765 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
2766 if (!wl->aggr_buf) {
2767 ret = -ENOMEM;
2768 goto err_hw;
2771 /* Register platform device */
2772 ret = platform_device_register(wl->plat_dev);
2773 if (ret) {
2774 wl1271_error("couldn't register platform device");
2775 goto err_aggr;
2777 dev_set_drvdata(&wl->plat_dev->dev, wl);
2779 /* Create sysfs file to control bt coex state */
2780 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2781 if (ret < 0) {
2782 wl1271_error("failed to create sysfs file bt_coex_state");
2783 goto err_platform;
2786 /* Create sysfs file to get HW PG version */
2787 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
2788 if (ret < 0) {
2789 wl1271_error("failed to create sysfs file hw_pg_ver");
2790 goto err_bt_coex_state;
2793 return hw;
2795 err_bt_coex_state:
2796 device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2798 err_platform:
2799 platform_device_unregister(wl->plat_dev);
2801 err_aggr:
2802 free_pages((unsigned long)wl->aggr_buf, order);
2804 err_hw:
2805 wl1271_debugfs_exit(wl);
2806 kfree(plat_dev);
2808 err_plat_alloc:
2809 ieee80211_free_hw(hw);
2811 err_hw_alloc:
2813 return ERR_PTR(ret);
2815 EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
2817 int wl1271_free_hw(struct wl1271 *wl)
2819 platform_device_unregister(wl->plat_dev);
2820 free_pages((unsigned long)wl->aggr_buf,
2821 get_order(WL1271_AGGR_BUFFER_SIZE));
2822 kfree(wl->plat_dev);
2824 wl1271_debugfs_exit(wl);
2826 vfree(wl->fw);
2827 wl->fw = NULL;
2828 kfree(wl->nvs);
2829 wl->nvs = NULL;
2831 kfree(wl->fw_status);
2832 kfree(wl->tx_res_if);
2834 ieee80211_free_hw(wl->hw);
2836 return 0;
2838 EXPORT_SYMBOL_GPL(wl1271_free_hw);
2840 u32 wl12xx_debug_level;
2841 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
2842 module_param_named(debug_level, wl12xx_debug_level, uint, DEBUG_NONE);
2843 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
2845 MODULE_LICENSE("GPL");
2846 MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2847 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");