wl12xx: Reorder data handling in irq_work
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / net / wireless / wl12xx / main.c
blob65e8a0cc92d058d73206183ae697b7f7825df404
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_irq_ps_regulate_link(struct wl1271 *wl, u8 hlid, u8 tx_blks)
542 bool fw_ps;
544 /* only regulate station links */
545 if (hlid < WL1271_AP_STA_HLID_START)
546 return;
548 fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
551 * Wake up from high level PS if the STA is asleep with too little
552 * blocks in FW or if the STA is awake.
554 if (!fw_ps || tx_blks < WL1271_PS_STA_MAX_BLOCKS)
555 wl1271_ps_link_end(wl, hlid);
557 /* Start high-level PS if the STA is asleep with enough blocks in FW */
558 else if (fw_ps && tx_blks >= WL1271_PS_STA_MAX_BLOCKS)
559 wl1271_ps_link_start(wl, hlid, true);
562 static void wl1271_irq_update_links_status(struct wl1271 *wl,
563 struct wl1271_fw_ap_status *status)
565 u32 cur_fw_ps_map;
566 u8 hlid;
568 cur_fw_ps_map = le32_to_cpu(status->link_ps_bitmap);
569 if (wl->ap_fw_ps_map != cur_fw_ps_map) {
570 wl1271_debug(DEBUG_PSM,
571 "link ps prev 0x%x cur 0x%x changed 0x%x",
572 wl->ap_fw_ps_map, cur_fw_ps_map,
573 wl->ap_fw_ps_map ^ cur_fw_ps_map);
575 wl->ap_fw_ps_map = cur_fw_ps_map;
578 for (hlid = WL1271_AP_STA_HLID_START; hlid < AP_MAX_LINKS; hlid++) {
579 u8 cnt = status->tx_lnk_free_blks[hlid] -
580 wl->links[hlid].prev_freed_blks;
582 wl->links[hlid].prev_freed_blks =
583 status->tx_lnk_free_blks[hlid];
584 wl->links[hlid].allocated_blks -= cnt;
586 wl1271_irq_ps_regulate_link(wl, hlid,
587 wl->links[hlid].allocated_blks);
591 static void wl1271_fw_status(struct wl1271 *wl,
592 struct wl1271_fw_full_status *full_status)
594 struct wl1271_fw_common_status *status = &full_status->common;
595 struct timespec ts;
596 u32 total = 0;
597 int i;
599 if (wl->bss_type == BSS_TYPE_AP_BSS)
600 wl1271_raw_read(wl, FW_STATUS_ADDR, status,
601 sizeof(struct wl1271_fw_ap_status), false);
602 else
603 wl1271_raw_read(wl, FW_STATUS_ADDR, status,
604 sizeof(struct wl1271_fw_sta_status), false);
606 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
607 "drv_rx_counter = %d, tx_results_counter = %d)",
608 status->intr,
609 status->fw_rx_counter,
610 status->drv_rx_counter,
611 status->tx_results_counter);
613 /* update number of available TX blocks */
614 for (i = 0; i < NUM_TX_QUEUES; i++) {
615 u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
616 wl->tx_blocks_freed[i];
618 wl->tx_blocks_freed[i] =
619 le32_to_cpu(status->tx_released_blks[i]);
620 wl->tx_blocks_available += cnt;
621 total += cnt;
624 /* if more blocks are available now, tx work can be scheduled */
625 if (total)
626 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
628 /* for AP update num of allocated TX blocks per link and ps status */
629 if (wl->bss_type == BSS_TYPE_AP_BSS)
630 wl1271_irq_update_links_status(wl, &full_status->ap);
632 /* update the host-chipset time offset */
633 getnstimeofday(&ts);
634 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
635 (s64)le32_to_cpu(status->fw_localtime);
638 #define WL1271_IRQ_MAX_LOOPS 10
640 static void wl1271_irq_work(struct work_struct *work)
642 int ret;
643 u32 intr;
644 int loopcount = WL1271_IRQ_MAX_LOOPS;
645 unsigned long flags;
646 struct wl1271 *wl =
647 container_of(work, struct wl1271, irq_work);
649 mutex_lock(&wl->mutex);
651 wl1271_debug(DEBUG_IRQ, "IRQ work");
653 if (unlikely(wl->state == WL1271_STATE_OFF))
654 goto out;
656 ret = wl1271_ps_elp_wakeup(wl, true);
657 if (ret < 0)
658 goto out;
660 spin_lock_irqsave(&wl->wl_lock, flags);
661 while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
662 clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
663 spin_unlock_irqrestore(&wl->wl_lock, flags);
664 loopcount--;
666 wl1271_fw_status(wl, wl->fw_status);
667 intr = le32_to_cpu(wl->fw_status->common.intr);
668 if (!intr) {
669 wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
670 spin_lock_irqsave(&wl->wl_lock, flags);
671 continue;
674 intr &= WL1271_INTR_MASK;
676 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
677 wl1271_error("watchdog interrupt received! "
678 "starting recovery.");
679 ieee80211_queue_work(wl->hw, &wl->recovery_work);
681 /* restarting the chip. ignore any other interrupt. */
682 goto out;
685 if (intr & WL1271_ACX_INTR_DATA) {
686 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
688 wl1271_rx(wl, &wl->fw_status->common);
690 /* Check if any tx blocks were freed */
691 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
692 wl->tx_queue_count) {
694 * In order to avoid starvation of the TX path,
695 * call the work function directly.
697 wl1271_tx_work_locked(wl);
700 /* check for tx results */
701 if (wl->fw_status->common.tx_results_counter !=
702 (wl->tx_results_count & 0xff))
703 wl1271_tx_complete(wl);
706 if (intr & WL1271_ACX_INTR_EVENT_A) {
707 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
708 wl1271_event_handle(wl, 0);
711 if (intr & WL1271_ACX_INTR_EVENT_B) {
712 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
713 wl1271_event_handle(wl, 1);
716 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
717 wl1271_debug(DEBUG_IRQ,
718 "WL1271_ACX_INTR_INIT_COMPLETE");
720 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
721 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
723 spin_lock_irqsave(&wl->wl_lock, flags);
726 if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
727 ieee80211_queue_work(wl->hw, &wl->irq_work);
728 else
729 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
730 spin_unlock_irqrestore(&wl->wl_lock, flags);
732 wl1271_ps_elp_sleep(wl);
734 out:
735 mutex_unlock(&wl->mutex);
738 static int wl1271_fetch_firmware(struct wl1271 *wl)
740 const struct firmware *fw;
741 const char *fw_name;
742 int ret;
744 switch (wl->bss_type) {
745 case BSS_TYPE_AP_BSS:
746 fw_name = WL1271_AP_FW_NAME;
747 break;
748 case BSS_TYPE_IBSS:
749 case BSS_TYPE_STA_BSS:
750 fw_name = WL1271_FW_NAME;
751 break;
752 default:
753 wl1271_error("no compatible firmware for bss_type %d",
754 wl->bss_type);
755 return -EINVAL;
758 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
760 ret = request_firmware(&fw, fw_name, wl1271_wl_to_dev(wl));
762 if (ret < 0) {
763 wl1271_error("could not get firmware: %d", ret);
764 return ret;
767 if (fw->size % 4) {
768 wl1271_error("firmware size is not multiple of 32 bits: %zu",
769 fw->size);
770 ret = -EILSEQ;
771 goto out;
774 vfree(wl->fw);
775 wl->fw_len = fw->size;
776 wl->fw = vmalloc(wl->fw_len);
778 if (!wl->fw) {
779 wl1271_error("could not allocate memory for the firmware");
780 ret = -ENOMEM;
781 goto out;
784 memcpy(wl->fw, fw->data, wl->fw_len);
785 wl->fw_bss_type = wl->bss_type;
786 ret = 0;
788 out:
789 release_firmware(fw);
791 return ret;
794 static int wl1271_fetch_nvs(struct wl1271 *wl)
796 const struct firmware *fw;
797 int ret;
799 ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
801 if (ret < 0) {
802 wl1271_error("could not get nvs file: %d", ret);
803 return ret;
806 wl->nvs = kmemdup(fw->data, sizeof(struct wl1271_nvs_file), GFP_KERNEL);
808 if (!wl->nvs) {
809 wl1271_error("could not allocate memory for the nvs file");
810 ret = -ENOMEM;
811 goto out;
814 wl->nvs_len = fw->size;
816 out:
817 release_firmware(fw);
819 return ret;
822 static void wl1271_recovery_work(struct work_struct *work)
824 struct wl1271 *wl =
825 container_of(work, struct wl1271, recovery_work);
827 mutex_lock(&wl->mutex);
829 if (wl->state != WL1271_STATE_ON)
830 goto out;
832 wl1271_info("Hardware recovery in progress.");
834 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
835 ieee80211_connection_loss(wl->vif);
837 /* reboot the chipset */
838 __wl1271_op_remove_interface(wl);
839 ieee80211_restart_hw(wl->hw);
841 out:
842 mutex_unlock(&wl->mutex);
845 static void wl1271_fw_wakeup(struct wl1271 *wl)
847 u32 elp_reg;
849 elp_reg = ELPCTRL_WAKE_UP;
850 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
853 static int wl1271_setup(struct wl1271 *wl)
855 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
856 if (!wl->fw_status)
857 return -ENOMEM;
859 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
860 if (!wl->tx_res_if) {
861 kfree(wl->fw_status);
862 return -ENOMEM;
865 return 0;
868 static int wl1271_chip_wakeup(struct wl1271 *wl)
870 struct wl1271_partition_set partition;
871 int ret = 0;
873 msleep(WL1271_PRE_POWER_ON_SLEEP);
874 ret = wl1271_power_on(wl);
875 if (ret < 0)
876 goto out;
877 msleep(WL1271_POWER_ON_SLEEP);
878 wl1271_io_reset(wl);
879 wl1271_io_init(wl);
881 /* We don't need a real memory partition here, because we only want
882 * to use the registers at this point. */
883 memset(&partition, 0, sizeof(partition));
884 partition.reg.start = REGISTERS_BASE;
885 partition.reg.size = REGISTERS_DOWN_SIZE;
886 wl1271_set_partition(wl, &partition);
888 /* ELP module wake up */
889 wl1271_fw_wakeup(wl);
891 /* whal_FwCtrl_BootSm() */
893 /* 0. read chip id from CHIP_ID */
894 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
896 /* 1. check if chip id is valid */
898 switch (wl->chip.id) {
899 case CHIP_ID_1271_PG10:
900 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
901 wl->chip.id);
903 ret = wl1271_setup(wl);
904 if (ret < 0)
905 goto out;
906 break;
907 case CHIP_ID_1271_PG20:
908 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
909 wl->chip.id);
911 ret = wl1271_setup(wl);
912 if (ret < 0)
913 goto out;
914 break;
915 default:
916 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
917 ret = -ENODEV;
918 goto out;
921 /* Make sure the firmware type matches the BSS type */
922 if (wl->fw == NULL || wl->fw_bss_type != wl->bss_type) {
923 ret = wl1271_fetch_firmware(wl);
924 if (ret < 0)
925 goto out;
928 /* No NVS from netlink, try to get it from the filesystem */
929 if (wl->nvs == NULL) {
930 ret = wl1271_fetch_nvs(wl);
931 if (ret < 0)
932 goto out;
935 out:
936 return ret;
939 int wl1271_plt_start(struct wl1271 *wl)
941 int retries = WL1271_BOOT_RETRIES;
942 int ret;
944 mutex_lock(&wl->mutex);
946 wl1271_notice("power up");
948 if (wl->state != WL1271_STATE_OFF) {
949 wl1271_error("cannot go into PLT state because not "
950 "in off state: %d", wl->state);
951 ret = -EBUSY;
952 goto out;
955 wl->bss_type = BSS_TYPE_STA_BSS;
957 while (retries) {
958 retries--;
959 ret = wl1271_chip_wakeup(wl);
960 if (ret < 0)
961 goto power_off;
963 ret = wl1271_boot(wl);
964 if (ret < 0)
965 goto power_off;
967 ret = wl1271_plt_init(wl);
968 if (ret < 0)
969 goto irq_disable;
971 wl->state = WL1271_STATE_PLT;
972 wl1271_notice("firmware booted in PLT mode (%s)",
973 wl->chip.fw_ver_str);
974 goto out;
976 irq_disable:
977 wl1271_disable_interrupts(wl);
978 mutex_unlock(&wl->mutex);
979 /* Unlocking the mutex in the middle of handling is
980 inherently unsafe. In this case we deem it safe to do,
981 because we need to let any possibly pending IRQ out of
982 the system (and while we are WL1271_STATE_OFF the IRQ
983 work function will not do anything.) Also, any other
984 possible concurrent operations will fail due to the
985 current state, hence the wl1271 struct should be safe. */
986 cancel_work_sync(&wl->irq_work);
987 mutex_lock(&wl->mutex);
988 power_off:
989 wl1271_power_off(wl);
992 wl1271_error("firmware boot in PLT mode failed despite %d retries",
993 WL1271_BOOT_RETRIES);
994 out:
995 mutex_unlock(&wl->mutex);
997 return ret;
1000 int __wl1271_plt_stop(struct wl1271 *wl)
1002 int ret = 0;
1004 wl1271_notice("power down");
1006 if (wl->state != WL1271_STATE_PLT) {
1007 wl1271_error("cannot power down because not in PLT "
1008 "state: %d", wl->state);
1009 ret = -EBUSY;
1010 goto out;
1013 wl1271_disable_interrupts(wl);
1014 wl1271_power_off(wl);
1016 wl->state = WL1271_STATE_OFF;
1017 wl->rx_counter = 0;
1019 mutex_unlock(&wl->mutex);
1020 cancel_work_sync(&wl->irq_work);
1021 cancel_work_sync(&wl->recovery_work);
1022 mutex_lock(&wl->mutex);
1023 out:
1024 return ret;
1027 int wl1271_plt_stop(struct wl1271 *wl)
1029 int ret;
1031 mutex_lock(&wl->mutex);
1032 ret = __wl1271_plt_stop(wl);
1033 mutex_unlock(&wl->mutex);
1034 return ret;
1037 static void wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
1039 struct wl1271 *wl = hw->priv;
1040 unsigned long flags;
1041 int q;
1042 u8 hlid = 0;
1044 spin_lock_irqsave(&wl->wl_lock, flags);
1045 wl->tx_queue_count++;
1048 * The workqueue is slow to process the tx_queue and we need stop
1049 * the queue here, otherwise the queue will get too long.
1051 if (wl->tx_queue_count >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
1052 wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
1053 ieee80211_stop_queues(wl->hw);
1054 set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
1057 spin_unlock_irqrestore(&wl->wl_lock, flags);
1059 /* queue the packet */
1060 q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
1061 if (wl->bss_type == BSS_TYPE_AP_BSS) {
1062 hlid = wl1271_tx_get_hlid(skb);
1063 wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d", hlid, q);
1064 skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1065 } else {
1066 skb_queue_tail(&wl->tx_queue[q], skb);
1070 * The chip specific setup must run before the first TX packet -
1071 * before that, the tx_work will not be initialized!
1074 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1075 ieee80211_queue_work(wl->hw, &wl->tx_work);
1078 static struct notifier_block wl1271_dev_notifier = {
1079 .notifier_call = wl1271_dev_notify,
1082 static int wl1271_op_start(struct ieee80211_hw *hw)
1084 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1087 * We have to delay the booting of the hardware because
1088 * we need to know the local MAC address before downloading and
1089 * initializing the firmware. The MAC address cannot be changed
1090 * after boot, and without the proper MAC address, the firmware
1091 * will not function properly.
1093 * The MAC address is first known when the corresponding interface
1094 * is added. That is where we will initialize the hardware.
1096 * In addition, we currently have different firmwares for AP and managed
1097 * operation. We will know which to boot according to interface type.
1100 return 0;
1103 static void wl1271_op_stop(struct ieee80211_hw *hw)
1105 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
1108 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1109 struct ieee80211_vif *vif)
1111 struct wl1271 *wl = hw->priv;
1112 struct wiphy *wiphy = hw->wiphy;
1113 int retries = WL1271_BOOT_RETRIES;
1114 int ret = 0;
1115 bool booted = false;
1117 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
1118 vif->type, vif->addr);
1120 mutex_lock(&wl->mutex);
1121 if (wl->vif) {
1122 wl1271_debug(DEBUG_MAC80211,
1123 "multiple vifs are not supported yet");
1124 ret = -EBUSY;
1125 goto out;
1128 switch (vif->type) {
1129 case NL80211_IFTYPE_STATION:
1130 wl->bss_type = BSS_TYPE_STA_BSS;
1131 wl->set_bss_type = BSS_TYPE_STA_BSS;
1132 break;
1133 case NL80211_IFTYPE_ADHOC:
1134 wl->bss_type = BSS_TYPE_IBSS;
1135 wl->set_bss_type = BSS_TYPE_STA_BSS;
1136 break;
1137 case NL80211_IFTYPE_AP:
1138 wl->bss_type = BSS_TYPE_AP_BSS;
1139 break;
1140 default:
1141 ret = -EOPNOTSUPP;
1142 goto out;
1145 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
1147 if (wl->state != WL1271_STATE_OFF) {
1148 wl1271_error("cannot start because not in off state: %d",
1149 wl->state);
1150 ret = -EBUSY;
1151 goto out;
1154 while (retries) {
1155 retries--;
1156 ret = wl1271_chip_wakeup(wl);
1157 if (ret < 0)
1158 goto power_off;
1160 ret = wl1271_boot(wl);
1161 if (ret < 0)
1162 goto power_off;
1164 ret = wl1271_hw_init(wl);
1165 if (ret < 0)
1166 goto irq_disable;
1168 booted = true;
1169 break;
1171 irq_disable:
1172 wl1271_disable_interrupts(wl);
1173 mutex_unlock(&wl->mutex);
1174 /* Unlocking the mutex in the middle of handling is
1175 inherently unsafe. In this case we deem it safe to do,
1176 because we need to let any possibly pending IRQ out of
1177 the system (and while we are WL1271_STATE_OFF the IRQ
1178 work function will not do anything.) Also, any other
1179 possible concurrent operations will fail due to the
1180 current state, hence the wl1271 struct should be safe. */
1181 cancel_work_sync(&wl->irq_work);
1182 mutex_lock(&wl->mutex);
1183 power_off:
1184 wl1271_power_off(wl);
1187 if (!booted) {
1188 wl1271_error("firmware boot failed despite %d retries",
1189 WL1271_BOOT_RETRIES);
1190 goto out;
1193 wl->vif = vif;
1194 wl->state = WL1271_STATE_ON;
1195 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
1197 /* update hw/fw version info in wiphy struct */
1198 wiphy->hw_version = wl->chip.id;
1199 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
1200 sizeof(wiphy->fw_version));
1203 * Now we know if 11a is supported (info from the NVS), so disable
1204 * 11a channels if not supported
1206 if (!wl->enable_11a)
1207 wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
1209 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
1210 wl->enable_11a ? "" : "not ");
1212 out:
1213 mutex_unlock(&wl->mutex);
1215 if (!ret)
1216 list_add(&wl->list, &wl_list);
1218 return ret;
1221 static void __wl1271_op_remove_interface(struct wl1271 *wl)
1223 int i;
1225 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1227 wl1271_info("down");
1229 list_del(&wl->list);
1231 WARN_ON(wl->state != WL1271_STATE_ON);
1233 /* enable dyn ps just in case (if left on due to fw crash etc) */
1234 if (wl->bss_type == BSS_TYPE_STA_BSS)
1235 ieee80211_enable_dyn_ps(wl->vif);
1237 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
1238 wl->scan.state = WL1271_SCAN_STATE_IDLE;
1239 kfree(wl->scan.scanned_ch);
1240 wl->scan.scanned_ch = NULL;
1241 wl->scan.req = NULL;
1242 ieee80211_scan_completed(wl->hw, true);
1245 wl->state = WL1271_STATE_OFF;
1247 wl1271_disable_interrupts(wl);
1249 mutex_unlock(&wl->mutex);
1251 cancel_delayed_work_sync(&wl->scan_complete_work);
1252 cancel_work_sync(&wl->irq_work);
1253 cancel_work_sync(&wl->tx_work);
1254 cancel_delayed_work_sync(&wl->pspoll_work);
1255 cancel_delayed_work_sync(&wl->elp_work);
1257 mutex_lock(&wl->mutex);
1259 /* let's notify MAC80211 about the remaining pending TX frames */
1260 wl1271_tx_reset(wl);
1261 wl1271_power_off(wl);
1263 memset(wl->bssid, 0, ETH_ALEN);
1264 memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1265 wl->ssid_len = 0;
1266 wl->bss_type = MAX_BSS_TYPE;
1267 wl->set_bss_type = MAX_BSS_TYPE;
1268 wl->band = IEEE80211_BAND_2GHZ;
1270 wl->rx_counter = 0;
1271 wl->psm_entry_retry = 0;
1272 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1273 wl->tx_blocks_available = 0;
1274 wl->tx_results_count = 0;
1275 wl->tx_packets_count = 0;
1276 wl->tx_security_last_seq = 0;
1277 wl->tx_security_seq = 0;
1278 wl->time_offset = 0;
1279 wl->session_counter = 0;
1280 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1281 wl->flags = 0;
1282 wl->vif = NULL;
1283 wl->filters = 0;
1284 wl1271_free_ap_keys(wl);
1285 memset(wl->ap_hlid_map, 0, sizeof(wl->ap_hlid_map));
1286 wl->ap_fw_ps_map = 0;
1287 wl->ap_ps_map = 0;
1289 for (i = 0; i < NUM_TX_QUEUES; i++)
1290 wl->tx_blocks_freed[i] = 0;
1292 wl1271_debugfs_reset(wl);
1294 kfree(wl->fw_status);
1295 wl->fw_status = NULL;
1296 kfree(wl->tx_res_if);
1297 wl->tx_res_if = NULL;
1298 kfree(wl->target_mem_map);
1299 wl->target_mem_map = NULL;
1302 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1303 struct ieee80211_vif *vif)
1305 struct wl1271 *wl = hw->priv;
1307 mutex_lock(&wl->mutex);
1309 * wl->vif can be null here if someone shuts down the interface
1310 * just when hardware recovery has been started.
1312 if (wl->vif) {
1313 WARN_ON(wl->vif != vif);
1314 __wl1271_op_remove_interface(wl);
1317 mutex_unlock(&wl->mutex);
1318 cancel_work_sync(&wl->recovery_work);
1321 static void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters)
1323 wl1271_set_default_filters(wl);
1325 /* combine requested filters with current filter config */
1326 filters = wl->filters | filters;
1328 wl1271_debug(DEBUG_FILTERS, "RX filters set: ");
1330 if (filters & FIF_PROMISC_IN_BSS) {
1331 wl1271_debug(DEBUG_FILTERS, " - FIF_PROMISC_IN_BSS");
1332 wl->rx_config &= ~CFG_UNI_FILTER_EN;
1333 wl->rx_config |= CFG_BSSID_FILTER_EN;
1335 if (filters & FIF_BCN_PRBRESP_PROMISC) {
1336 wl1271_debug(DEBUG_FILTERS, " - FIF_BCN_PRBRESP_PROMISC");
1337 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1338 wl->rx_config &= ~CFG_SSID_FILTER_EN;
1340 if (filters & FIF_OTHER_BSS) {
1341 wl1271_debug(DEBUG_FILTERS, " - FIF_OTHER_BSS");
1342 wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1344 if (filters & FIF_CONTROL) {
1345 wl1271_debug(DEBUG_FILTERS, " - FIF_CONTROL");
1346 wl->rx_filter |= CFG_RX_CTL_EN;
1348 if (filters & FIF_FCSFAIL) {
1349 wl1271_debug(DEBUG_FILTERS, " - FIF_FCSFAIL");
1350 wl->rx_filter |= CFG_RX_FCS_ERROR;
1354 static int wl1271_dummy_join(struct wl1271 *wl)
1356 int ret = 0;
1357 /* we need to use a dummy BSSID for now */
1358 static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1359 0xad, 0xbe, 0xef };
1361 memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1363 /* pass through frames from all BSS */
1364 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1366 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1367 if (ret < 0)
1368 goto out;
1370 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1372 out:
1373 return ret;
1376 static int wl1271_join(struct wl1271 *wl, bool set_assoc)
1378 int ret;
1381 * One of the side effects of the JOIN command is that is clears
1382 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1383 * to a WPA/WPA2 access point will therefore kill the data-path.
1384 * Currently there is no supported scenario for JOIN during
1385 * association - if it becomes a supported scenario, the WPA/WPA2 keys
1386 * must be handled somehow.
1389 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1390 wl1271_info("JOIN while associated.");
1392 if (set_assoc)
1393 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1395 ret = wl1271_cmd_join(wl, wl->set_bss_type);
1396 if (ret < 0)
1397 goto out;
1399 set_bit(WL1271_FLAG_JOINED, &wl->flags);
1401 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1402 goto out;
1405 * The join command disable the keep-alive mode, shut down its process,
1406 * and also clear the template config, so we need to reset it all after
1407 * the join. The acx_aid starts the keep-alive process, and the order
1408 * of the commands below is relevant.
1410 ret = wl1271_acx_keep_alive_mode(wl, true);
1411 if (ret < 0)
1412 goto out;
1414 ret = wl1271_acx_aid(wl, wl->aid);
1415 if (ret < 0)
1416 goto out;
1418 ret = wl1271_cmd_build_klv_null_data(wl);
1419 if (ret < 0)
1420 goto out;
1422 ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1423 ACX_KEEP_ALIVE_TPL_VALID);
1424 if (ret < 0)
1425 goto out;
1427 out:
1428 return ret;
1431 static int wl1271_unjoin(struct wl1271 *wl)
1433 int ret;
1435 /* to stop listening to a channel, we disconnect */
1436 ret = wl1271_cmd_disconnect(wl);
1437 if (ret < 0)
1438 goto out;
1440 clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1441 memset(wl->bssid, 0, ETH_ALEN);
1443 /* stop filterting packets based on bssid */
1444 wl1271_configure_filters(wl, FIF_OTHER_BSS);
1446 out:
1447 return ret;
1450 static void wl1271_set_band_rate(struct wl1271 *wl)
1452 if (wl->band == IEEE80211_BAND_2GHZ)
1453 wl->basic_rate_set = wl->conf.tx.basic_rate;
1454 else
1455 wl->basic_rate_set = wl->conf.tx.basic_rate_5;
1458 static int wl1271_sta_handle_idle(struct wl1271 *wl, bool idle)
1460 int ret;
1462 if (idle) {
1463 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1464 ret = wl1271_unjoin(wl);
1465 if (ret < 0)
1466 goto out;
1468 wl->rate_set = wl1271_tx_min_rate_get(wl);
1469 ret = wl1271_acx_sta_rate_policies(wl);
1470 if (ret < 0)
1471 goto out;
1472 ret = wl1271_acx_keep_alive_config(
1473 wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1474 ACX_KEEP_ALIVE_TPL_INVALID);
1475 if (ret < 0)
1476 goto out;
1477 set_bit(WL1271_FLAG_IDLE, &wl->flags);
1478 } else {
1479 /* increment the session counter */
1480 wl->session_counter++;
1481 if (wl->session_counter >= SESSION_COUNTER_MAX)
1482 wl->session_counter = 0;
1483 ret = wl1271_dummy_join(wl);
1484 if (ret < 0)
1485 goto out;
1486 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
1489 out:
1490 return ret;
1493 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1495 struct wl1271 *wl = hw->priv;
1496 struct ieee80211_conf *conf = &hw->conf;
1497 int channel, ret = 0;
1498 bool is_ap;
1500 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1502 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s"
1503 " changed 0x%x",
1504 channel,
1505 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1506 conf->power_level,
1507 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
1508 changed);
1511 * mac80211 will go to idle nearly immediately after transmitting some
1512 * frames, such as the deauth. To make sure those frames reach the air,
1513 * wait here until the TX queue is fully flushed.
1515 if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
1516 (conf->flags & IEEE80211_CONF_IDLE))
1517 wl1271_tx_flush(wl);
1519 mutex_lock(&wl->mutex);
1521 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1522 ret = -EAGAIN;
1523 goto out;
1526 is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
1528 ret = wl1271_ps_elp_wakeup(wl, false);
1529 if (ret < 0)
1530 goto out;
1532 /* if the channel changes while joined, join again */
1533 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
1534 ((wl->band != conf->channel->band) ||
1535 (wl->channel != channel))) {
1536 wl->band = conf->channel->band;
1537 wl->channel = channel;
1539 if (!is_ap) {
1541 * FIXME: the mac80211 should really provide a fixed
1542 * rate to use here. for now, just use the smallest
1543 * possible rate for the band as a fixed rate for
1544 * association frames and other control messages.
1546 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1547 wl1271_set_band_rate(wl);
1549 wl->basic_rate = wl1271_tx_min_rate_get(wl);
1550 ret = wl1271_acx_sta_rate_policies(wl);
1551 if (ret < 0)
1552 wl1271_warning("rate policy for channel "
1553 "failed %d", ret);
1555 if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1556 ret = wl1271_join(wl, false);
1557 if (ret < 0)
1558 wl1271_warning("cmd join on channel "
1559 "failed %d", ret);
1564 if (changed & IEEE80211_CONF_CHANGE_IDLE && !is_ap) {
1565 ret = wl1271_sta_handle_idle(wl,
1566 conf->flags & IEEE80211_CONF_IDLE);
1567 if (ret < 0)
1568 wl1271_warning("idle mode change failed %d", ret);
1572 * if mac80211 changes the PSM mode, make sure the mode is not
1573 * incorrectly changed after the pspoll failure active window.
1575 if (changed & IEEE80211_CONF_CHANGE_PS)
1576 clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
1578 if (conf->flags & IEEE80211_CONF_PS &&
1579 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1580 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1583 * We enter PSM only if we're already associated.
1584 * If we're not, we'll enter it when joining an SSID,
1585 * through the bss_info_changed() hook.
1587 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1588 wl1271_debug(DEBUG_PSM, "psm enabled");
1589 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1590 wl->basic_rate, true);
1592 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1593 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1594 wl1271_debug(DEBUG_PSM, "psm disabled");
1596 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1598 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1599 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1600 wl->basic_rate, true);
1603 if (conf->power_level != wl->power_level) {
1604 ret = wl1271_acx_tx_power(wl, conf->power_level);
1605 if (ret < 0)
1606 goto out_sleep;
1608 wl->power_level = conf->power_level;
1611 out_sleep:
1612 wl1271_ps_elp_sleep(wl);
1614 out:
1615 mutex_unlock(&wl->mutex);
1617 return ret;
1620 struct wl1271_filter_params {
1621 bool enabled;
1622 int mc_list_length;
1623 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1626 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
1627 struct netdev_hw_addr_list *mc_list)
1629 struct wl1271_filter_params *fp;
1630 struct netdev_hw_addr *ha;
1631 struct wl1271 *wl = hw->priv;
1633 if (unlikely(wl->state == WL1271_STATE_OFF))
1634 return 0;
1636 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1637 if (!fp) {
1638 wl1271_error("Out of memory setting filters.");
1639 return 0;
1642 /* update multicast filtering parameters */
1643 fp->mc_list_length = 0;
1644 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
1645 fp->enabled = false;
1646 } else {
1647 fp->enabled = true;
1648 netdev_hw_addr_list_for_each(ha, mc_list) {
1649 memcpy(fp->mc_list[fp->mc_list_length],
1650 ha->addr, ETH_ALEN);
1651 fp->mc_list_length++;
1655 return (u64)(unsigned long)fp;
1658 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1659 FIF_ALLMULTI | \
1660 FIF_FCSFAIL | \
1661 FIF_BCN_PRBRESP_PROMISC | \
1662 FIF_CONTROL | \
1663 FIF_OTHER_BSS)
1665 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1666 unsigned int changed,
1667 unsigned int *total, u64 multicast)
1669 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1670 struct wl1271 *wl = hw->priv;
1671 int ret;
1673 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
1674 " total %x", changed, *total);
1676 mutex_lock(&wl->mutex);
1678 *total &= WL1271_SUPPORTED_FILTERS;
1679 changed &= WL1271_SUPPORTED_FILTERS;
1681 if (unlikely(wl->state == WL1271_STATE_OFF))
1682 goto out;
1684 ret = wl1271_ps_elp_wakeup(wl, false);
1685 if (ret < 0)
1686 goto out;
1688 if (wl->bss_type != BSS_TYPE_AP_BSS) {
1689 if (*total & FIF_ALLMULTI)
1690 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1691 else if (fp)
1692 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1693 fp->mc_list,
1694 fp->mc_list_length);
1695 if (ret < 0)
1696 goto out_sleep;
1699 /* determine, whether supported filter values have changed */
1700 if (changed == 0)
1701 goto out_sleep;
1703 /* configure filters */
1704 wl->filters = *total;
1705 wl1271_configure_filters(wl, 0);
1707 /* apply configured filters */
1708 ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1709 if (ret < 0)
1710 goto out_sleep;
1712 out_sleep:
1713 wl1271_ps_elp_sleep(wl);
1715 out:
1716 mutex_unlock(&wl->mutex);
1717 kfree(fp);
1720 static int wl1271_record_ap_key(struct wl1271 *wl, u8 id, u8 key_type,
1721 u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
1722 u16 tx_seq_16)
1724 struct wl1271_ap_key *ap_key;
1725 int i;
1727 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
1729 if (key_size > MAX_KEY_SIZE)
1730 return -EINVAL;
1733 * Find next free entry in ap_keys. Also check we are not replacing
1734 * an existing key.
1736 for (i = 0; i < MAX_NUM_KEYS; i++) {
1737 if (wl->recorded_ap_keys[i] == NULL)
1738 break;
1740 if (wl->recorded_ap_keys[i]->id == id) {
1741 wl1271_warning("trying to record key replacement");
1742 return -EINVAL;
1746 if (i == MAX_NUM_KEYS)
1747 return -EBUSY;
1749 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
1750 if (!ap_key)
1751 return -ENOMEM;
1753 ap_key->id = id;
1754 ap_key->key_type = key_type;
1755 ap_key->key_size = key_size;
1756 memcpy(ap_key->key, key, key_size);
1757 ap_key->hlid = hlid;
1758 ap_key->tx_seq_32 = tx_seq_32;
1759 ap_key->tx_seq_16 = tx_seq_16;
1761 wl->recorded_ap_keys[i] = ap_key;
1762 return 0;
1765 static void wl1271_free_ap_keys(struct wl1271 *wl)
1767 int i;
1769 for (i = 0; i < MAX_NUM_KEYS; i++) {
1770 kfree(wl->recorded_ap_keys[i]);
1771 wl->recorded_ap_keys[i] = NULL;
1775 static int wl1271_ap_init_hwenc(struct wl1271 *wl)
1777 int i, ret = 0;
1778 struct wl1271_ap_key *key;
1779 bool wep_key_added = false;
1781 for (i = 0; i < MAX_NUM_KEYS; i++) {
1782 if (wl->recorded_ap_keys[i] == NULL)
1783 break;
1785 key = wl->recorded_ap_keys[i];
1786 ret = wl1271_cmd_set_ap_key(wl, KEY_ADD_OR_REPLACE,
1787 key->id, key->key_type,
1788 key->key_size, key->key,
1789 key->hlid, key->tx_seq_32,
1790 key->tx_seq_16);
1791 if (ret < 0)
1792 goto out;
1794 if (key->key_type == KEY_WEP)
1795 wep_key_added = true;
1798 if (wep_key_added) {
1799 ret = wl1271_cmd_set_ap_default_wep_key(wl, wl->default_key);
1800 if (ret < 0)
1801 goto out;
1804 out:
1805 wl1271_free_ap_keys(wl);
1806 return ret;
1809 static int wl1271_set_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
1810 u8 key_size, const u8 *key, u32 tx_seq_32,
1811 u16 tx_seq_16, struct ieee80211_sta *sta)
1813 int ret;
1814 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
1816 if (is_ap) {
1817 struct wl1271_station *wl_sta;
1818 u8 hlid;
1820 if (sta) {
1821 wl_sta = (struct wl1271_station *)sta->drv_priv;
1822 hlid = wl_sta->hlid;
1823 } else {
1824 hlid = WL1271_AP_BROADCAST_HLID;
1827 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
1829 * We do not support removing keys after AP shutdown.
1830 * Pretend we do to make mac80211 happy.
1832 if (action != KEY_ADD_OR_REPLACE)
1833 return 0;
1835 ret = wl1271_record_ap_key(wl, id,
1836 key_type, key_size,
1837 key, hlid, tx_seq_32,
1838 tx_seq_16);
1839 } else {
1840 ret = wl1271_cmd_set_ap_key(wl, action,
1841 id, key_type, key_size,
1842 key, hlid, tx_seq_32,
1843 tx_seq_16);
1846 if (ret < 0)
1847 return ret;
1848 } else {
1849 const u8 *addr;
1850 static const u8 bcast_addr[ETH_ALEN] = {
1851 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
1854 addr = sta ? sta->addr : bcast_addr;
1856 if (is_zero_ether_addr(addr)) {
1857 /* We dont support TX only encryption */
1858 return -EOPNOTSUPP;
1861 /* The wl1271 does not allow to remove unicast keys - they
1862 will be cleared automatically on next CMD_JOIN. Ignore the
1863 request silently, as we dont want the mac80211 to emit
1864 an error message. */
1865 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
1866 return 0;
1868 ret = wl1271_cmd_set_sta_key(wl, action,
1869 id, key_type, key_size,
1870 key, addr, tx_seq_32,
1871 tx_seq_16);
1872 if (ret < 0)
1873 return ret;
1875 /* the default WEP key needs to be configured at least once */
1876 if (key_type == KEY_WEP) {
1877 ret = wl1271_cmd_set_sta_default_wep_key(wl,
1878 wl->default_key);
1879 if (ret < 0)
1880 return ret;
1884 return 0;
1887 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1888 struct ieee80211_vif *vif,
1889 struct ieee80211_sta *sta,
1890 struct ieee80211_key_conf *key_conf)
1892 struct wl1271 *wl = hw->priv;
1893 int ret;
1894 u32 tx_seq_32 = 0;
1895 u16 tx_seq_16 = 0;
1896 u8 key_type;
1898 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1900 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
1901 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1902 key_conf->cipher, key_conf->keyidx,
1903 key_conf->keylen, key_conf->flags);
1904 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1906 mutex_lock(&wl->mutex);
1908 if (unlikely(wl->state == WL1271_STATE_OFF)) {
1909 ret = -EAGAIN;
1910 goto out_unlock;
1913 ret = wl1271_ps_elp_wakeup(wl, false);
1914 if (ret < 0)
1915 goto out_unlock;
1917 switch (key_conf->cipher) {
1918 case WLAN_CIPHER_SUITE_WEP40:
1919 case WLAN_CIPHER_SUITE_WEP104:
1920 key_type = KEY_WEP;
1922 key_conf->hw_key_idx = key_conf->keyidx;
1923 break;
1924 case WLAN_CIPHER_SUITE_TKIP:
1925 key_type = KEY_TKIP;
1927 key_conf->hw_key_idx = key_conf->keyidx;
1928 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1929 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1930 break;
1931 case WLAN_CIPHER_SUITE_CCMP:
1932 key_type = KEY_AES;
1934 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1935 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1936 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1937 break;
1938 case WL1271_CIPHER_SUITE_GEM:
1939 key_type = KEY_GEM;
1940 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1941 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1942 break;
1943 default:
1944 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
1946 ret = -EOPNOTSUPP;
1947 goto out_sleep;
1950 switch (cmd) {
1951 case SET_KEY:
1952 ret = wl1271_set_key(wl, KEY_ADD_OR_REPLACE,
1953 key_conf->keyidx, key_type,
1954 key_conf->keylen, key_conf->key,
1955 tx_seq_32, tx_seq_16, sta);
1956 if (ret < 0) {
1957 wl1271_error("Could not add or replace key");
1958 goto out_sleep;
1960 break;
1962 case DISABLE_KEY:
1963 ret = wl1271_set_key(wl, KEY_REMOVE,
1964 key_conf->keyidx, key_type,
1965 key_conf->keylen, key_conf->key,
1966 0, 0, sta);
1967 if (ret < 0) {
1968 wl1271_error("Could not remove key");
1969 goto out_sleep;
1971 break;
1973 default:
1974 wl1271_error("Unsupported key cmd 0x%x", cmd);
1975 ret = -EOPNOTSUPP;
1976 break;
1979 out_sleep:
1980 wl1271_ps_elp_sleep(wl);
1982 out_unlock:
1983 mutex_unlock(&wl->mutex);
1985 return ret;
1988 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1989 struct ieee80211_vif *vif,
1990 struct cfg80211_scan_request *req)
1992 struct wl1271 *wl = hw->priv;
1993 int ret;
1994 u8 *ssid = NULL;
1995 size_t len = 0;
1997 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1999 if (req->n_ssids) {
2000 ssid = req->ssids[0].ssid;
2001 len = req->ssids[0].ssid_len;
2004 mutex_lock(&wl->mutex);
2006 if (wl->state == WL1271_STATE_OFF) {
2008 * We cannot return -EBUSY here because cfg80211 will expect
2009 * a call to ieee80211_scan_completed if we do - in this case
2010 * there won't be any call.
2012 ret = -EAGAIN;
2013 goto out;
2016 ret = wl1271_ps_elp_wakeup(wl, false);
2017 if (ret < 0)
2018 goto out;
2020 ret = wl1271_scan(hw->priv, ssid, len, req);
2022 wl1271_ps_elp_sleep(wl);
2024 out:
2025 mutex_unlock(&wl->mutex);
2027 return ret;
2030 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
2032 struct wl1271 *wl = hw->priv;
2033 int ret = 0;
2035 mutex_lock(&wl->mutex);
2037 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2038 ret = -EAGAIN;
2039 goto out;
2042 ret = wl1271_ps_elp_wakeup(wl, false);
2043 if (ret < 0)
2044 goto out;
2046 ret = wl1271_acx_frag_threshold(wl, (u16)value);
2047 if (ret < 0)
2048 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
2050 wl1271_ps_elp_sleep(wl);
2052 out:
2053 mutex_unlock(&wl->mutex);
2055 return ret;
2058 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2060 struct wl1271 *wl = hw->priv;
2061 int ret = 0;
2063 mutex_lock(&wl->mutex);
2065 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2066 ret = -EAGAIN;
2067 goto out;
2070 ret = wl1271_ps_elp_wakeup(wl, false);
2071 if (ret < 0)
2072 goto out;
2074 ret = wl1271_acx_rts_threshold(wl, (u16) value);
2075 if (ret < 0)
2076 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
2078 wl1271_ps_elp_sleep(wl);
2080 out:
2081 mutex_unlock(&wl->mutex);
2083 return ret;
2086 static int wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *skb,
2087 int offset)
2089 u8 *ptr = skb->data + offset;
2091 /* find the location of the ssid in the beacon */
2092 while (ptr < skb->data + skb->len) {
2093 if (ptr[0] == WLAN_EID_SSID) {
2094 wl->ssid_len = ptr[1];
2095 memcpy(wl->ssid, ptr+2, wl->ssid_len);
2096 return 0;
2098 ptr += (ptr[1] + 2);
2101 wl1271_error("No SSID in IEs!\n");
2102 return -ENOENT;
2105 static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
2106 struct ieee80211_bss_conf *bss_conf,
2107 u32 changed)
2109 int ret = 0;
2111 if (changed & BSS_CHANGED_ERP_SLOT) {
2112 if (bss_conf->use_short_slot)
2113 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
2114 else
2115 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
2116 if (ret < 0) {
2117 wl1271_warning("Set slot time failed %d", ret);
2118 goto out;
2122 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2123 if (bss_conf->use_short_preamble)
2124 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
2125 else
2126 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
2129 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2130 if (bss_conf->use_cts_prot)
2131 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
2132 else
2133 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
2134 if (ret < 0) {
2135 wl1271_warning("Set ctsprotect failed %d", ret);
2136 goto out;
2140 out:
2141 return ret;
2144 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
2145 struct ieee80211_vif *vif,
2146 struct ieee80211_bss_conf *bss_conf,
2147 u32 changed)
2149 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
2150 int ret = 0;
2152 if ((changed & BSS_CHANGED_BEACON_INT)) {
2153 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
2154 bss_conf->beacon_int);
2156 wl->beacon_int = bss_conf->beacon_int;
2159 if ((changed & BSS_CHANGED_BEACON)) {
2160 struct ieee80211_hdr *hdr;
2161 int ieoffset = offsetof(struct ieee80211_mgmt,
2162 u.beacon.variable);
2163 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
2164 u16 tmpl_id;
2166 if (!beacon)
2167 goto out;
2169 wl1271_debug(DEBUG_MASTER, "beacon updated");
2171 ret = wl1271_ssid_set(wl, beacon, ieoffset);
2172 if (ret < 0) {
2173 dev_kfree_skb(beacon);
2174 goto out;
2176 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
2177 CMD_TEMPL_BEACON;
2178 ret = wl1271_cmd_template_set(wl, tmpl_id,
2179 beacon->data,
2180 beacon->len, 0,
2181 wl1271_tx_min_rate_get(wl));
2182 if (ret < 0) {
2183 dev_kfree_skb(beacon);
2184 goto out;
2187 hdr = (struct ieee80211_hdr *) beacon->data;
2188 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
2189 IEEE80211_STYPE_PROBE_RESP);
2191 tmpl_id = is_ap ? CMD_TEMPL_AP_PROBE_RESPONSE :
2192 CMD_TEMPL_PROBE_RESPONSE;
2193 ret = wl1271_cmd_template_set(wl,
2194 tmpl_id,
2195 beacon->data,
2196 beacon->len, 0,
2197 wl1271_tx_min_rate_get(wl));
2198 dev_kfree_skb(beacon);
2199 if (ret < 0)
2200 goto out;
2203 out:
2204 return ret;
2207 /* AP mode changes */
2208 static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
2209 struct ieee80211_vif *vif,
2210 struct ieee80211_bss_conf *bss_conf,
2211 u32 changed)
2213 int ret = 0;
2215 if ((changed & BSS_CHANGED_BASIC_RATES)) {
2216 u32 rates = bss_conf->basic_rates;
2217 struct conf_tx_rate_class mgmt_rc;
2219 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates);
2220 wl->basic_rate = wl1271_tx_min_rate_get(wl);
2221 wl1271_debug(DEBUG_AP, "basic rates: 0x%x",
2222 wl->basic_rate_set);
2224 /* update the AP management rate policy with the new rates */
2225 mgmt_rc.enabled_rates = wl->basic_rate_set;
2226 mgmt_rc.long_retry_limit = 10;
2227 mgmt_rc.short_retry_limit = 10;
2228 mgmt_rc.aflags = 0;
2229 ret = wl1271_acx_ap_rate_policy(wl, &mgmt_rc,
2230 ACX_TX_AP_MODE_MGMT_RATE);
2231 if (ret < 0) {
2232 wl1271_error("AP mgmt policy change failed %d", ret);
2233 goto out;
2237 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
2238 if (ret < 0)
2239 goto out;
2241 if ((changed & BSS_CHANGED_BEACON_ENABLED)) {
2242 if (bss_conf->enable_beacon) {
2243 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
2244 ret = wl1271_cmd_start_bss(wl);
2245 if (ret < 0)
2246 goto out;
2248 set_bit(WL1271_FLAG_AP_STARTED, &wl->flags);
2249 wl1271_debug(DEBUG_AP, "started AP");
2251 ret = wl1271_ap_init_hwenc(wl);
2252 if (ret < 0)
2253 goto out;
2255 } else {
2256 if (test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
2257 ret = wl1271_cmd_stop_bss(wl);
2258 if (ret < 0)
2259 goto out;
2261 clear_bit(WL1271_FLAG_AP_STARTED, &wl->flags);
2262 wl1271_debug(DEBUG_AP, "stopped AP");
2267 ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
2268 if (ret < 0)
2269 goto out;
2270 out:
2271 return;
2274 /* STA/IBSS mode changes */
2275 static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
2276 struct ieee80211_vif *vif,
2277 struct ieee80211_bss_conf *bss_conf,
2278 u32 changed)
2280 bool do_join = false, set_assoc = false;
2281 bool is_ibss = (wl->bss_type == BSS_TYPE_IBSS);
2282 u32 sta_rate_set = 0;
2283 int ret;
2284 struct ieee80211_sta *sta;
2285 bool sta_exists = false;
2286 struct ieee80211_sta_ht_cap sta_ht_cap;
2288 if (is_ibss) {
2289 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
2290 changed);
2291 if (ret < 0)
2292 goto out;
2295 if ((changed & BSS_CHANGED_BEACON_INT) && is_ibss)
2296 do_join = true;
2298 /* Need to update the SSID (for filtering etc) */
2299 if ((changed & BSS_CHANGED_BEACON) && is_ibss)
2300 do_join = true;
2302 if ((changed & BSS_CHANGED_BEACON_ENABLED) && is_ibss) {
2303 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
2304 bss_conf->enable_beacon ? "enabled" : "disabled");
2306 if (bss_conf->enable_beacon)
2307 wl->set_bss_type = BSS_TYPE_IBSS;
2308 else
2309 wl->set_bss_type = BSS_TYPE_STA_BSS;
2310 do_join = true;
2313 if ((changed & BSS_CHANGED_CQM)) {
2314 bool enable = false;
2315 if (bss_conf->cqm_rssi_thold)
2316 enable = true;
2317 ret = wl1271_acx_rssi_snr_trigger(wl, enable,
2318 bss_conf->cqm_rssi_thold,
2319 bss_conf->cqm_rssi_hyst);
2320 if (ret < 0)
2321 goto out;
2322 wl->rssi_thold = bss_conf->cqm_rssi_thold;
2325 if ((changed & BSS_CHANGED_BSSID) &&
2327 * Now we know the correct bssid, so we send a new join command
2328 * and enable the BSSID filter
2330 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
2331 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
2333 if (!is_zero_ether_addr(wl->bssid)) {
2334 ret = wl1271_cmd_build_null_data(wl);
2335 if (ret < 0)
2336 goto out;
2338 ret = wl1271_build_qos_null_data(wl);
2339 if (ret < 0)
2340 goto out;
2342 /* filter out all packets not from this BSSID */
2343 wl1271_configure_filters(wl, 0);
2345 /* Need to update the BSSID (for filtering etc) */
2346 do_join = true;
2350 rcu_read_lock();
2351 sta = ieee80211_find_sta(vif, bss_conf->bssid);
2352 if (sta) {
2353 /* save the supp_rates of the ap */
2354 sta_rate_set = sta->supp_rates[wl->hw->conf.channel->band];
2355 if (sta->ht_cap.ht_supported)
2356 sta_rate_set |=
2357 (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
2358 sta_ht_cap = sta->ht_cap;
2359 sta_exists = true;
2361 rcu_read_unlock();
2363 if (sta_exists) {
2364 /* handle new association with HT and HT information change */
2365 if ((changed & BSS_CHANGED_HT) &&
2366 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
2367 ret = wl1271_acx_set_ht_capabilities(wl, &sta_ht_cap,
2368 true);
2369 if (ret < 0) {
2370 wl1271_warning("Set ht cap true failed %d",
2371 ret);
2372 goto out;
2374 ret = wl1271_acx_set_ht_information(wl,
2375 bss_conf->ht_operation_mode);
2376 if (ret < 0) {
2377 wl1271_warning("Set ht information failed %d",
2378 ret);
2379 goto out;
2382 /* handle new association without HT and disassociation */
2383 else if (changed & BSS_CHANGED_ASSOC) {
2384 ret = wl1271_acx_set_ht_capabilities(wl, &sta_ht_cap,
2385 false);
2386 if (ret < 0) {
2387 wl1271_warning("Set ht cap false failed %d",
2388 ret);
2389 goto out;
2394 if ((changed & BSS_CHANGED_ASSOC)) {
2395 if (bss_conf->assoc) {
2396 u32 rates;
2397 int ieoffset;
2398 wl->aid = bss_conf->aid;
2399 set_assoc = true;
2401 wl->ps_poll_failures = 0;
2404 * use basic rates from AP, and determine lowest rate
2405 * to use with control frames.
2407 rates = bss_conf->basic_rates;
2408 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
2409 rates);
2410 wl->basic_rate = wl1271_tx_min_rate_get(wl);
2411 if (sta_rate_set)
2412 wl->rate_set = wl1271_tx_enabled_rates_get(wl,
2413 sta_rate_set);
2414 ret = wl1271_acx_sta_rate_policies(wl);
2415 if (ret < 0)
2416 goto out;
2419 * with wl1271, we don't need to update the
2420 * beacon_int and dtim_period, because the firmware
2421 * updates it by itself when the first beacon is
2422 * received after a join.
2424 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
2425 if (ret < 0)
2426 goto out;
2429 * Get a template for hardware connection maintenance
2431 dev_kfree_skb(wl->probereq);
2432 wl->probereq = wl1271_cmd_build_ap_probe_req(wl, NULL);
2433 ieoffset = offsetof(struct ieee80211_mgmt,
2434 u.probe_req.variable);
2435 wl1271_ssid_set(wl, wl->probereq, ieoffset);
2437 /* enable the connection monitoring feature */
2438 ret = wl1271_acx_conn_monit_params(wl, true);
2439 if (ret < 0)
2440 goto out;
2442 /* If we want to go in PSM but we're not there yet */
2443 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
2444 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
2445 enum wl1271_cmd_ps_mode mode;
2447 mode = STATION_POWER_SAVE_MODE;
2448 ret = wl1271_ps_set_mode(wl, mode,
2449 wl->basic_rate,
2450 true);
2451 if (ret < 0)
2452 goto out;
2454 } else {
2455 /* use defaults when not associated */
2456 clear_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags);
2457 clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
2458 wl->aid = 0;
2460 /* free probe-request template */
2461 dev_kfree_skb(wl->probereq);
2462 wl->probereq = NULL;
2464 /* re-enable dynamic ps - just in case */
2465 ieee80211_enable_dyn_ps(wl->vif);
2467 /* revert back to minimum rates for the current band */
2468 wl1271_set_band_rate(wl);
2469 wl->basic_rate = wl1271_tx_min_rate_get(wl);
2470 ret = wl1271_acx_sta_rate_policies(wl);
2471 if (ret < 0)
2472 goto out;
2474 /* disable connection monitor features */
2475 ret = wl1271_acx_conn_monit_params(wl, false);
2477 /* Disable the keep-alive feature */
2478 ret = wl1271_acx_keep_alive_mode(wl, false);
2479 if (ret < 0)
2480 goto out;
2482 /* restore the bssid filter and go to dummy bssid */
2483 wl1271_unjoin(wl);
2484 wl1271_dummy_join(wl);
2488 ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
2489 if (ret < 0)
2490 goto out;
2492 if (changed & BSS_CHANGED_ARP_FILTER) {
2493 __be32 addr = bss_conf->arp_addr_list[0];
2494 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
2496 if (bss_conf->arp_addr_cnt == 1 &&
2497 bss_conf->arp_filter_enabled) {
2499 * The template should have been configured only upon
2500 * association. however, it seems that the correct ip
2501 * isn't being set (when sending), so we have to
2502 * reconfigure the template upon every ip change.
2504 ret = wl1271_cmd_build_arp_rsp(wl, addr);
2505 if (ret < 0) {
2506 wl1271_warning("build arp rsp failed: %d", ret);
2507 goto out;
2510 ret = wl1271_acx_arp_ip_filter(wl,
2511 ACX_ARP_FILTER_ARP_FILTERING,
2512 addr);
2513 } else
2514 ret = wl1271_acx_arp_ip_filter(wl, 0, addr);
2516 if (ret < 0)
2517 goto out;
2520 if (do_join) {
2521 ret = wl1271_join(wl, set_assoc);
2522 if (ret < 0) {
2523 wl1271_warning("cmd join failed %d", ret);
2524 goto out;
2528 out:
2529 return;
2532 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
2533 struct ieee80211_vif *vif,
2534 struct ieee80211_bss_conf *bss_conf,
2535 u32 changed)
2537 struct wl1271 *wl = hw->priv;
2538 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
2539 int ret;
2541 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed 0x%x",
2542 (int)changed);
2544 mutex_lock(&wl->mutex);
2546 if (unlikely(wl->state == WL1271_STATE_OFF))
2547 goto out;
2549 ret = wl1271_ps_elp_wakeup(wl, false);
2550 if (ret < 0)
2551 goto out;
2553 if (is_ap)
2554 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
2555 else
2556 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
2558 wl1271_ps_elp_sleep(wl);
2560 out:
2561 mutex_unlock(&wl->mutex);
2564 static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
2565 const struct ieee80211_tx_queue_params *params)
2567 struct wl1271 *wl = hw->priv;
2568 u8 ps_scheme;
2569 int ret = 0;
2571 mutex_lock(&wl->mutex);
2573 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
2575 if (params->uapsd)
2576 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
2577 else
2578 ps_scheme = CONF_PS_SCHEME_LEGACY;
2580 if (wl->state == WL1271_STATE_OFF) {
2582 * If the state is off, the parameters will be recorded and
2583 * configured on init. This happens in AP-mode.
2585 struct conf_tx_ac_category *conf_ac =
2586 &wl->conf.tx.ac_conf[wl1271_tx_get_queue(queue)];
2587 struct conf_tx_tid *conf_tid =
2588 &wl->conf.tx.tid_conf[wl1271_tx_get_queue(queue)];
2590 conf_ac->ac = wl1271_tx_get_queue(queue);
2591 conf_ac->cw_min = (u8)params->cw_min;
2592 conf_ac->cw_max = params->cw_max;
2593 conf_ac->aifsn = params->aifs;
2594 conf_ac->tx_op_limit = params->txop << 5;
2596 conf_tid->queue_id = wl1271_tx_get_queue(queue);
2597 conf_tid->channel_type = CONF_CHANNEL_TYPE_EDCF;
2598 conf_tid->tsid = wl1271_tx_get_queue(queue);
2599 conf_tid->ps_scheme = ps_scheme;
2600 conf_tid->ack_policy = CONF_ACK_POLICY_LEGACY;
2601 conf_tid->apsd_conf[0] = 0;
2602 conf_tid->apsd_conf[1] = 0;
2603 } else {
2604 ret = wl1271_ps_elp_wakeup(wl, false);
2605 if (ret < 0)
2606 goto out;
2609 * the txop is confed in units of 32us by the mac80211,
2610 * we need us
2612 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
2613 params->cw_min, params->cw_max,
2614 params->aifs, params->txop << 5);
2615 if (ret < 0)
2616 goto out_sleep;
2618 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
2619 CONF_CHANNEL_TYPE_EDCF,
2620 wl1271_tx_get_queue(queue),
2621 ps_scheme, CONF_ACK_POLICY_LEGACY,
2622 0, 0);
2623 if (ret < 0)
2624 goto out_sleep;
2626 out_sleep:
2627 wl1271_ps_elp_sleep(wl);
2630 out:
2631 mutex_unlock(&wl->mutex);
2633 return ret;
2636 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
2639 struct wl1271 *wl = hw->priv;
2640 u64 mactime = ULLONG_MAX;
2641 int ret;
2643 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
2645 mutex_lock(&wl->mutex);
2647 if (unlikely(wl->state == WL1271_STATE_OFF))
2648 goto out;
2650 ret = wl1271_ps_elp_wakeup(wl, false);
2651 if (ret < 0)
2652 goto out;
2654 ret = wl1271_acx_tsf_info(wl, &mactime);
2655 if (ret < 0)
2656 goto out_sleep;
2658 out_sleep:
2659 wl1271_ps_elp_sleep(wl);
2661 out:
2662 mutex_unlock(&wl->mutex);
2663 return mactime;
2666 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
2667 struct survey_info *survey)
2669 struct wl1271 *wl = hw->priv;
2670 struct ieee80211_conf *conf = &hw->conf;
2672 if (idx != 0)
2673 return -ENOENT;
2675 survey->channel = conf->channel;
2676 survey->filled = SURVEY_INFO_NOISE_DBM;
2677 survey->noise = wl->noise;
2679 return 0;
2682 static int wl1271_allocate_sta(struct wl1271 *wl,
2683 struct ieee80211_sta *sta,
2684 u8 *hlid)
2686 struct wl1271_station *wl_sta;
2687 int id;
2689 id = find_first_zero_bit(wl->ap_hlid_map, AP_MAX_STATIONS);
2690 if (id >= AP_MAX_STATIONS) {
2691 wl1271_warning("could not allocate HLID - too much stations");
2692 return -EBUSY;
2695 wl_sta = (struct wl1271_station *)sta->drv_priv;
2696 __set_bit(id, wl->ap_hlid_map);
2697 wl_sta->hlid = WL1271_AP_STA_HLID_START + id;
2698 *hlid = wl_sta->hlid;
2699 memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
2700 return 0;
2703 static void wl1271_free_sta(struct wl1271 *wl, u8 hlid)
2705 int id = hlid - WL1271_AP_STA_HLID_START;
2707 if (WARN_ON(!test_bit(id, wl->ap_hlid_map)))
2708 return;
2710 __clear_bit(id, wl->ap_hlid_map);
2711 memset(wl->links[hlid].addr, 0, ETH_ALEN);
2712 wl1271_tx_reset_link_queues(wl, hlid);
2713 __clear_bit(hlid, &wl->ap_ps_map);
2714 __clear_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
2717 static int wl1271_op_sta_add(struct ieee80211_hw *hw,
2718 struct ieee80211_vif *vif,
2719 struct ieee80211_sta *sta)
2721 struct wl1271 *wl = hw->priv;
2722 int ret = 0;
2723 u8 hlid;
2725 mutex_lock(&wl->mutex);
2727 if (unlikely(wl->state == WL1271_STATE_OFF))
2728 goto out;
2730 if (wl->bss_type != BSS_TYPE_AP_BSS)
2731 goto out;
2733 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
2735 ret = wl1271_allocate_sta(wl, sta, &hlid);
2736 if (ret < 0)
2737 goto out;
2739 ret = wl1271_ps_elp_wakeup(wl, false);
2740 if (ret < 0)
2741 goto out_free_sta;
2743 ret = wl1271_cmd_add_sta(wl, sta, hlid);
2744 if (ret < 0)
2745 goto out_sleep;
2747 out_sleep:
2748 wl1271_ps_elp_sleep(wl);
2750 out_free_sta:
2751 if (ret < 0)
2752 wl1271_free_sta(wl, hlid);
2754 out:
2755 mutex_unlock(&wl->mutex);
2756 return ret;
2759 static int wl1271_op_sta_remove(struct ieee80211_hw *hw,
2760 struct ieee80211_vif *vif,
2761 struct ieee80211_sta *sta)
2763 struct wl1271 *wl = hw->priv;
2764 struct wl1271_station *wl_sta;
2765 int ret = 0, id;
2767 mutex_lock(&wl->mutex);
2769 if (unlikely(wl->state == WL1271_STATE_OFF))
2770 goto out;
2772 if (wl->bss_type != BSS_TYPE_AP_BSS)
2773 goto out;
2775 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
2777 wl_sta = (struct wl1271_station *)sta->drv_priv;
2778 id = wl_sta->hlid - WL1271_AP_STA_HLID_START;
2779 if (WARN_ON(!test_bit(id, wl->ap_hlid_map)))
2780 goto out;
2782 ret = wl1271_ps_elp_wakeup(wl, false);
2783 if (ret < 0)
2784 goto out;
2786 ret = wl1271_cmd_remove_sta(wl, wl_sta->hlid);
2787 if (ret < 0)
2788 goto out_sleep;
2790 wl1271_free_sta(wl, wl_sta->hlid);
2792 out_sleep:
2793 wl1271_ps_elp_sleep(wl);
2795 out:
2796 mutex_unlock(&wl->mutex);
2797 return ret;
2800 int wl1271_op_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2801 enum ieee80211_ampdu_mlme_action action,
2802 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
2803 u8 buf_size)
2805 struct wl1271 *wl = hw->priv;
2806 int ret;
2808 mutex_lock(&wl->mutex);
2810 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2811 ret = -EAGAIN;
2812 goto out;
2815 ret = wl1271_ps_elp_wakeup(wl, false);
2816 if (ret < 0)
2817 goto out;
2819 switch (action) {
2820 case IEEE80211_AMPDU_RX_START:
2821 if (wl->ba_support) {
2822 ret = wl1271_acx_set_ba_receiver_session(wl, tid, *ssn,
2823 true);
2824 if (!ret)
2825 wl->ba_rx_bitmap |= BIT(tid);
2826 } else {
2827 ret = -ENOTSUPP;
2829 break;
2831 case IEEE80211_AMPDU_RX_STOP:
2832 ret = wl1271_acx_set_ba_receiver_session(wl, tid, 0, false);
2833 if (!ret)
2834 wl->ba_rx_bitmap &= ~BIT(tid);
2835 break;
2838 * The BA initiator session management in FW independently.
2839 * Falling break here on purpose for all TX APDU commands.
2841 case IEEE80211_AMPDU_TX_START:
2842 case IEEE80211_AMPDU_TX_STOP:
2843 case IEEE80211_AMPDU_TX_OPERATIONAL:
2844 ret = -EINVAL;
2845 break;
2847 default:
2848 wl1271_error("Incorrect ampdu action id=%x\n", action);
2849 ret = -EINVAL;
2852 wl1271_ps_elp_sleep(wl);
2854 out:
2855 mutex_unlock(&wl->mutex);
2857 return ret;
2860 /* can't be const, mac80211 writes to this */
2861 static struct ieee80211_rate wl1271_rates[] = {
2862 { .bitrate = 10,
2863 .hw_value = CONF_HW_BIT_RATE_1MBPS,
2864 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
2865 { .bitrate = 20,
2866 .hw_value = CONF_HW_BIT_RATE_2MBPS,
2867 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
2868 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2869 { .bitrate = 55,
2870 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
2871 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
2872 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2873 { .bitrate = 110,
2874 .hw_value = CONF_HW_BIT_RATE_11MBPS,
2875 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
2876 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2877 { .bitrate = 60,
2878 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2879 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2880 { .bitrate = 90,
2881 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2882 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2883 { .bitrate = 120,
2884 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2885 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2886 { .bitrate = 180,
2887 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2888 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2889 { .bitrate = 240,
2890 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2891 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2892 { .bitrate = 360,
2893 .hw_value = CONF_HW_BIT_RATE_36MBPS,
2894 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2895 { .bitrate = 480,
2896 .hw_value = CONF_HW_BIT_RATE_48MBPS,
2897 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2898 { .bitrate = 540,
2899 .hw_value = CONF_HW_BIT_RATE_54MBPS,
2900 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2903 /* can't be const, mac80211 writes to this */
2904 static struct ieee80211_channel wl1271_channels[] = {
2905 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
2906 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
2907 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
2908 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
2909 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
2910 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
2911 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
2912 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
2913 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
2914 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
2915 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
2916 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
2917 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
2918 { .hw_value = 14, .center_freq = 2484, .max_power = 25 },
2921 /* mapping to indexes for wl1271_rates */
2922 static const u8 wl1271_rate_to_idx_2ghz[] = {
2923 /* MCS rates are used only with 11n */
2924 7, /* CONF_HW_RXTX_RATE_MCS7 */
2925 6, /* CONF_HW_RXTX_RATE_MCS6 */
2926 5, /* CONF_HW_RXTX_RATE_MCS5 */
2927 4, /* CONF_HW_RXTX_RATE_MCS4 */
2928 3, /* CONF_HW_RXTX_RATE_MCS3 */
2929 2, /* CONF_HW_RXTX_RATE_MCS2 */
2930 1, /* CONF_HW_RXTX_RATE_MCS1 */
2931 0, /* CONF_HW_RXTX_RATE_MCS0 */
2933 11, /* CONF_HW_RXTX_RATE_54 */
2934 10, /* CONF_HW_RXTX_RATE_48 */
2935 9, /* CONF_HW_RXTX_RATE_36 */
2936 8, /* CONF_HW_RXTX_RATE_24 */
2938 /* TI-specific rate */
2939 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
2941 7, /* CONF_HW_RXTX_RATE_18 */
2942 6, /* CONF_HW_RXTX_RATE_12 */
2943 3, /* CONF_HW_RXTX_RATE_11 */
2944 5, /* CONF_HW_RXTX_RATE_9 */
2945 4, /* CONF_HW_RXTX_RATE_6 */
2946 2, /* CONF_HW_RXTX_RATE_5_5 */
2947 1, /* CONF_HW_RXTX_RATE_2 */
2948 0 /* CONF_HW_RXTX_RATE_1 */
2951 /* 11n STA capabilities */
2952 #define HW_RX_HIGHEST_RATE 72
2954 #ifdef CONFIG_WL12XX_HT
2955 #define WL12XX_HT_CAP { \
2956 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \
2957 .ht_supported = true, \
2958 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
2959 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
2960 .mcs = { \
2961 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
2962 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
2963 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
2964 }, \
2966 #else
2967 #define WL12XX_HT_CAP { \
2968 .ht_supported = false, \
2970 #endif
2972 /* can't be const, mac80211 writes to this */
2973 static struct ieee80211_supported_band wl1271_band_2ghz = {
2974 .channels = wl1271_channels,
2975 .n_channels = ARRAY_SIZE(wl1271_channels),
2976 .bitrates = wl1271_rates,
2977 .n_bitrates = ARRAY_SIZE(wl1271_rates),
2978 .ht_cap = WL12XX_HT_CAP,
2981 /* 5 GHz data rates for WL1273 */
2982 static struct ieee80211_rate wl1271_rates_5ghz[] = {
2983 { .bitrate = 60,
2984 .hw_value = CONF_HW_BIT_RATE_6MBPS,
2985 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2986 { .bitrate = 90,
2987 .hw_value = CONF_HW_BIT_RATE_9MBPS,
2988 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2989 { .bitrate = 120,
2990 .hw_value = CONF_HW_BIT_RATE_12MBPS,
2991 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2992 { .bitrate = 180,
2993 .hw_value = CONF_HW_BIT_RATE_18MBPS,
2994 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2995 { .bitrate = 240,
2996 .hw_value = CONF_HW_BIT_RATE_24MBPS,
2997 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2998 { .bitrate = 360,
2999 .hw_value = CONF_HW_BIT_RATE_36MBPS,
3000 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
3001 { .bitrate = 480,
3002 .hw_value = CONF_HW_BIT_RATE_48MBPS,
3003 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
3004 { .bitrate = 540,
3005 .hw_value = CONF_HW_BIT_RATE_54MBPS,
3006 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
3009 /* 5 GHz band channels for WL1273 */
3010 static struct ieee80211_channel wl1271_channels_5ghz[] = {
3011 { .hw_value = 7, .center_freq = 5035},
3012 { .hw_value = 8, .center_freq = 5040},
3013 { .hw_value = 9, .center_freq = 5045},
3014 { .hw_value = 11, .center_freq = 5055},
3015 { .hw_value = 12, .center_freq = 5060},
3016 { .hw_value = 16, .center_freq = 5080},
3017 { .hw_value = 34, .center_freq = 5170},
3018 { .hw_value = 36, .center_freq = 5180},
3019 { .hw_value = 38, .center_freq = 5190},
3020 { .hw_value = 40, .center_freq = 5200},
3021 { .hw_value = 42, .center_freq = 5210},
3022 { .hw_value = 44, .center_freq = 5220},
3023 { .hw_value = 46, .center_freq = 5230},
3024 { .hw_value = 48, .center_freq = 5240},
3025 { .hw_value = 52, .center_freq = 5260},
3026 { .hw_value = 56, .center_freq = 5280},
3027 { .hw_value = 60, .center_freq = 5300},
3028 { .hw_value = 64, .center_freq = 5320},
3029 { .hw_value = 100, .center_freq = 5500},
3030 { .hw_value = 104, .center_freq = 5520},
3031 { .hw_value = 108, .center_freq = 5540},
3032 { .hw_value = 112, .center_freq = 5560},
3033 { .hw_value = 116, .center_freq = 5580},
3034 { .hw_value = 120, .center_freq = 5600},
3035 { .hw_value = 124, .center_freq = 5620},
3036 { .hw_value = 128, .center_freq = 5640},
3037 { .hw_value = 132, .center_freq = 5660},
3038 { .hw_value = 136, .center_freq = 5680},
3039 { .hw_value = 140, .center_freq = 5700},
3040 { .hw_value = 149, .center_freq = 5745},
3041 { .hw_value = 153, .center_freq = 5765},
3042 { .hw_value = 157, .center_freq = 5785},
3043 { .hw_value = 161, .center_freq = 5805},
3044 { .hw_value = 165, .center_freq = 5825},
3047 /* mapping to indexes for wl1271_rates_5ghz */
3048 static const u8 wl1271_rate_to_idx_5ghz[] = {
3049 /* MCS rates are used only with 11n */
3050 7, /* CONF_HW_RXTX_RATE_MCS7 */
3051 6, /* CONF_HW_RXTX_RATE_MCS6 */
3052 5, /* CONF_HW_RXTX_RATE_MCS5 */
3053 4, /* CONF_HW_RXTX_RATE_MCS4 */
3054 3, /* CONF_HW_RXTX_RATE_MCS3 */
3055 2, /* CONF_HW_RXTX_RATE_MCS2 */
3056 1, /* CONF_HW_RXTX_RATE_MCS1 */
3057 0, /* CONF_HW_RXTX_RATE_MCS0 */
3059 7, /* CONF_HW_RXTX_RATE_54 */
3060 6, /* CONF_HW_RXTX_RATE_48 */
3061 5, /* CONF_HW_RXTX_RATE_36 */
3062 4, /* CONF_HW_RXTX_RATE_24 */
3064 /* TI-specific rate */
3065 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
3067 3, /* CONF_HW_RXTX_RATE_18 */
3068 2, /* CONF_HW_RXTX_RATE_12 */
3069 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
3070 1, /* CONF_HW_RXTX_RATE_9 */
3071 0, /* CONF_HW_RXTX_RATE_6 */
3072 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
3073 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
3074 CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
3077 static struct ieee80211_supported_band wl1271_band_5ghz = {
3078 .channels = wl1271_channels_5ghz,
3079 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
3080 .bitrates = wl1271_rates_5ghz,
3081 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
3082 .ht_cap = WL12XX_HT_CAP,
3085 static const u8 *wl1271_band_rate_to_idx[] = {
3086 [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
3087 [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
3090 static const struct ieee80211_ops wl1271_ops = {
3091 .start = wl1271_op_start,
3092 .stop = wl1271_op_stop,
3093 .add_interface = wl1271_op_add_interface,
3094 .remove_interface = wl1271_op_remove_interface,
3095 .config = wl1271_op_config,
3096 .prepare_multicast = wl1271_op_prepare_multicast,
3097 .configure_filter = wl1271_op_configure_filter,
3098 .tx = wl1271_op_tx,
3099 .set_key = wl1271_op_set_key,
3100 .hw_scan = wl1271_op_hw_scan,
3101 .bss_info_changed = wl1271_op_bss_info_changed,
3102 .set_frag_threshold = wl1271_op_set_frag_threshold,
3103 .set_rts_threshold = wl1271_op_set_rts_threshold,
3104 .conf_tx = wl1271_op_conf_tx,
3105 .get_tsf = wl1271_op_get_tsf,
3106 .get_survey = wl1271_op_get_survey,
3107 .sta_add = wl1271_op_sta_add,
3108 .sta_remove = wl1271_op_sta_remove,
3109 .ampdu_action = wl1271_op_ampdu_action,
3110 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
3114 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
3116 u8 idx;
3118 BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
3120 if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
3121 wl1271_error("Illegal RX rate from HW: %d", rate);
3122 return 0;
3125 idx = wl1271_band_rate_to_idx[band][rate];
3126 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
3127 wl1271_error("Unsupported RX rate from HW: %d", rate);
3128 return 0;
3131 return idx;
3134 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
3135 struct device_attribute *attr,
3136 char *buf)
3138 struct wl1271 *wl = dev_get_drvdata(dev);
3139 ssize_t len;
3141 len = PAGE_SIZE;
3143 mutex_lock(&wl->mutex);
3144 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
3145 wl->sg_enabled);
3146 mutex_unlock(&wl->mutex);
3148 return len;
3152 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
3153 struct device_attribute *attr,
3154 const char *buf, size_t count)
3156 struct wl1271 *wl = dev_get_drvdata(dev);
3157 unsigned long res;
3158 int ret;
3160 ret = strict_strtoul(buf, 10, &res);
3162 if (ret < 0) {
3163 wl1271_warning("incorrect value written to bt_coex_mode");
3164 return count;
3167 mutex_lock(&wl->mutex);
3169 res = !!res;
3171 if (res == wl->sg_enabled)
3172 goto out;
3174 wl->sg_enabled = res;
3176 if (wl->state == WL1271_STATE_OFF)
3177 goto out;
3179 ret = wl1271_ps_elp_wakeup(wl, false);
3180 if (ret < 0)
3181 goto out;
3183 wl1271_acx_sg_enable(wl, wl->sg_enabled);
3184 wl1271_ps_elp_sleep(wl);
3186 out:
3187 mutex_unlock(&wl->mutex);
3188 return count;
3191 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
3192 wl1271_sysfs_show_bt_coex_state,
3193 wl1271_sysfs_store_bt_coex_state);
3195 static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
3196 struct device_attribute *attr,
3197 char *buf)
3199 struct wl1271 *wl = dev_get_drvdata(dev);
3200 ssize_t len;
3202 len = PAGE_SIZE;
3204 mutex_lock(&wl->mutex);
3205 if (wl->hw_pg_ver >= 0)
3206 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
3207 else
3208 len = snprintf(buf, len, "n/a\n");
3209 mutex_unlock(&wl->mutex);
3211 return len;
3214 static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
3215 wl1271_sysfs_show_hw_pg_ver, NULL);
3217 int wl1271_register_hw(struct wl1271 *wl)
3219 int ret;
3221 if (wl->mac80211_registered)
3222 return 0;
3224 ret = wl1271_fetch_nvs(wl);
3225 if (ret == 0) {
3226 u8 *nvs_ptr = (u8 *)wl->nvs->nvs;
3228 wl->mac_addr[0] = nvs_ptr[11];
3229 wl->mac_addr[1] = nvs_ptr[10];
3230 wl->mac_addr[2] = nvs_ptr[6];
3231 wl->mac_addr[3] = nvs_ptr[5];
3232 wl->mac_addr[4] = nvs_ptr[4];
3233 wl->mac_addr[5] = nvs_ptr[3];
3236 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
3238 ret = ieee80211_register_hw(wl->hw);
3239 if (ret < 0) {
3240 wl1271_error("unable to register mac80211 hw: %d", ret);
3241 return ret;
3244 wl->mac80211_registered = true;
3246 wl1271_debugfs_init(wl);
3248 register_netdevice_notifier(&wl1271_dev_notifier);
3250 wl1271_notice("loaded");
3252 return 0;
3254 EXPORT_SYMBOL_GPL(wl1271_register_hw);
3256 void wl1271_unregister_hw(struct wl1271 *wl)
3258 if (wl->state == WL1271_STATE_PLT)
3259 __wl1271_plt_stop(wl);
3261 unregister_netdevice_notifier(&wl1271_dev_notifier);
3262 ieee80211_unregister_hw(wl->hw);
3263 wl->mac80211_registered = false;
3266 EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
3268 int wl1271_init_ieee80211(struct wl1271 *wl)
3270 static const u32 cipher_suites[] = {
3271 WLAN_CIPHER_SUITE_WEP40,
3272 WLAN_CIPHER_SUITE_WEP104,
3273 WLAN_CIPHER_SUITE_TKIP,
3274 WLAN_CIPHER_SUITE_CCMP,
3275 WL1271_CIPHER_SUITE_GEM,
3278 /* The tx descriptor buffer and the TKIP space. */
3279 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
3280 sizeof(struct wl1271_tx_hw_descr);
3282 /* unit us */
3283 /* FIXME: find a proper value */
3284 wl->hw->channel_change_time = 10000;
3285 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
3287 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3288 IEEE80211_HW_BEACON_FILTER |
3289 IEEE80211_HW_SUPPORTS_PS |
3290 IEEE80211_HW_SUPPORTS_UAPSD |
3291 IEEE80211_HW_HAS_RATE_CONTROL |
3292 IEEE80211_HW_CONNECTION_MONITOR |
3293 IEEE80211_HW_SUPPORTS_CQM_RSSI |
3294 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
3295 IEEE80211_HW_AP_LINK_PS;
3297 wl->hw->wiphy->cipher_suites = cipher_suites;
3298 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
3300 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
3301 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
3302 wl->hw->wiphy->max_scan_ssids = 1;
3304 * Maximum length of elements in scanning probe request templates
3305 * should be the maximum length possible for a template, without
3306 * the IEEE80211 header of the template
3308 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
3309 sizeof(struct ieee80211_header);
3312 * We keep local copies of the band structs because we need to
3313 * modify them on a per-device basis.
3315 memcpy(&wl->bands[IEEE80211_BAND_2GHZ], &wl1271_band_2ghz,
3316 sizeof(wl1271_band_2ghz));
3317 memcpy(&wl->bands[IEEE80211_BAND_5GHZ], &wl1271_band_5ghz,
3318 sizeof(wl1271_band_5ghz));
3320 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
3321 &wl->bands[IEEE80211_BAND_2GHZ];
3322 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
3323 &wl->bands[IEEE80211_BAND_5GHZ];
3325 wl->hw->queues = 4;
3326 wl->hw->max_rates = 1;
3328 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
3330 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
3332 wl->hw->sta_data_size = sizeof(struct wl1271_station);
3334 wl->hw->max_rx_aggregation_subframes = 8;
3336 return 0;
3338 EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
3340 #define WL1271_DEFAULT_CHANNEL 0
3342 struct ieee80211_hw *wl1271_alloc_hw(void)
3344 struct ieee80211_hw *hw;
3345 struct platform_device *plat_dev = NULL;
3346 struct wl1271 *wl;
3347 int i, j, ret;
3348 unsigned int order;
3350 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
3351 if (!hw) {
3352 wl1271_error("could not alloc ieee80211_hw");
3353 ret = -ENOMEM;
3354 goto err_hw_alloc;
3357 plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
3358 if (!plat_dev) {
3359 wl1271_error("could not allocate platform_device");
3360 ret = -ENOMEM;
3361 goto err_plat_alloc;
3364 wl = hw->priv;
3365 memset(wl, 0, sizeof(*wl));
3367 INIT_LIST_HEAD(&wl->list);
3369 wl->hw = hw;
3370 wl->plat_dev = plat_dev;
3372 for (i = 0; i < NUM_TX_QUEUES; i++)
3373 skb_queue_head_init(&wl->tx_queue[i]);
3375 for (i = 0; i < NUM_TX_QUEUES; i++)
3376 for (j = 0; j < AP_MAX_LINKS; j++)
3377 skb_queue_head_init(&wl->links[j].tx_queue[i]);
3379 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
3380 INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
3381 INIT_WORK(&wl->irq_work, wl1271_irq_work);
3382 INIT_WORK(&wl->tx_work, wl1271_tx_work);
3383 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
3384 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
3385 wl->channel = WL1271_DEFAULT_CHANNEL;
3386 wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
3387 wl->default_key = 0;
3388 wl->rx_counter = 0;
3389 wl->rx_config = WL1271_DEFAULT_STA_RX_CONFIG;
3390 wl->rx_filter = WL1271_DEFAULT_STA_RX_FILTER;
3391 wl->psm_entry_retry = 0;
3392 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
3393 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
3394 wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
3395 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
3396 wl->band = IEEE80211_BAND_2GHZ;
3397 wl->vif = NULL;
3398 wl->flags = 0;
3399 wl->sg_enabled = true;
3400 wl->hw_pg_ver = -1;
3401 wl->bss_type = MAX_BSS_TYPE;
3402 wl->set_bss_type = MAX_BSS_TYPE;
3403 wl->fw_bss_type = MAX_BSS_TYPE;
3404 wl->last_tx_hlid = 0;
3405 wl->ap_ps_map = 0;
3406 wl->ap_fw_ps_map = 0;
3408 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
3409 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
3410 wl->tx_frames[i] = NULL;
3412 spin_lock_init(&wl->wl_lock);
3414 wl->state = WL1271_STATE_OFF;
3415 mutex_init(&wl->mutex);
3417 /* Apply default driver configuration. */
3418 wl1271_conf_init(wl);
3420 order = get_order(WL1271_AGGR_BUFFER_SIZE);
3421 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
3422 if (!wl->aggr_buf) {
3423 ret = -ENOMEM;
3424 goto err_hw;
3427 /* Register platform device */
3428 ret = platform_device_register(wl->plat_dev);
3429 if (ret) {
3430 wl1271_error("couldn't register platform device");
3431 goto err_aggr;
3433 dev_set_drvdata(&wl->plat_dev->dev, wl);
3435 /* Create sysfs file to control bt coex state */
3436 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
3437 if (ret < 0) {
3438 wl1271_error("failed to create sysfs file bt_coex_state");
3439 goto err_platform;
3442 /* Create sysfs file to get HW PG version */
3443 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
3444 if (ret < 0) {
3445 wl1271_error("failed to create sysfs file hw_pg_ver");
3446 goto err_bt_coex_state;
3449 return hw;
3451 err_bt_coex_state:
3452 device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
3454 err_platform:
3455 platform_device_unregister(wl->plat_dev);
3457 err_aggr:
3458 free_pages((unsigned long)wl->aggr_buf, order);
3460 err_hw:
3461 wl1271_debugfs_exit(wl);
3462 kfree(plat_dev);
3464 err_plat_alloc:
3465 ieee80211_free_hw(hw);
3467 err_hw_alloc:
3469 return ERR_PTR(ret);
3471 EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
3473 int wl1271_free_hw(struct wl1271 *wl)
3475 platform_device_unregister(wl->plat_dev);
3476 free_pages((unsigned long)wl->aggr_buf,
3477 get_order(WL1271_AGGR_BUFFER_SIZE));
3478 kfree(wl->plat_dev);
3480 wl1271_debugfs_exit(wl);
3482 vfree(wl->fw);
3483 wl->fw = NULL;
3484 kfree(wl->nvs);
3485 wl->nvs = NULL;
3487 kfree(wl->fw_status);
3488 kfree(wl->tx_res_if);
3490 ieee80211_free_hw(wl->hw);
3492 return 0;
3494 EXPORT_SYMBOL_GPL(wl1271_free_hw);
3496 u32 wl12xx_debug_level = DEBUG_NONE;
3497 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
3498 module_param_named(debug_level, wl12xx_debug_level, uint, S_IRUSR | S_IWUSR);
3499 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
3501 MODULE_LICENSE("GPL");
3502 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
3503 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");