wl12xx: change blocksize alignment quirk to negative
[linux-2.6/libata-dev.git] / drivers / net / wireless / wl12xx / main.c
blobb9a3fe4972749c71cbb98a18e4a4e83f5e9ff1c5
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>
33 #include <linux/wl12xx.h>
34 #include <linux/sched.h>
35 #include <linux/interrupt.h>
37 #include "wl12xx.h"
38 #include "debug.h"
39 #include "wl12xx_80211.h"
40 #include "reg.h"
41 #include "io.h"
42 #include "event.h"
43 #include "tx.h"
44 #include "rx.h"
45 #include "ps.h"
46 #include "init.h"
47 #include "debugfs.h"
48 #include "cmd.h"
49 #include "boot.h"
50 #include "testmode.h"
51 #include "scan.h"
53 #define WL1271_BOOT_RETRIES 3
55 static struct conf_drv_settings default_conf = {
56 .sg = {
57 .params = {
58 [CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
59 [CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
60 [CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
61 [CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
62 [CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
63 [CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
64 [CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
65 [CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
66 [CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
67 [CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
68 [CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
69 [CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
70 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
71 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
72 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
73 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
74 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
75 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
76 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
77 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
78 [CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
79 [CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
80 [CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
81 [CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
82 [CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
83 [CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
84 /* active scan params */
85 [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
86 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
87 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
88 /* passive scan params */
89 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR] = 800,
90 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR] = 200,
91 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
92 /* passive scan in dual antenna params */
93 [CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
94 [CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN] = 0,
95 [CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN] = 0,
96 /* general params */
97 [CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
98 [CONF_SG_ANTENNA_CONFIGURATION] = 0,
99 [CONF_SG_BEACON_MISS_PERCENT] = 60,
100 [CONF_SG_DHCP_TIME] = 5000,
101 [CONF_SG_RXT] = 1200,
102 [CONF_SG_TXT] = 1000,
103 [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
104 [CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
105 [CONF_SG_HV3_MAX_SERVED] = 6,
106 [CONF_SG_PS_POLL_TIMEOUT] = 10,
107 [CONF_SG_UPSD_TIMEOUT] = 10,
108 [CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
109 [CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
110 [CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
111 /* AP params */
112 [CONF_AP_BEACON_MISS_TX] = 3,
113 [CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
114 [CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
115 [CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
116 [CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
117 [CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
119 .state = CONF_SG_PROTECTIVE,
121 .rx = {
122 .rx_msdu_life_time = 512000,
123 .packet_detection_threshold = 0,
124 .ps_poll_timeout = 15,
125 .upsd_timeout = 15,
126 .rts_threshold = IEEE80211_MAX_RTS_THRESHOLD,
127 .rx_cca_threshold = 0,
128 .irq_blk_threshold = 0xFFFF,
129 .irq_pkt_threshold = 0,
130 .irq_timeout = 600,
131 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
133 .tx = {
134 .tx_energy_detection = 0,
135 .sta_rc_conf = {
136 .enabled_rates = 0,
137 .short_retry_limit = 10,
138 .long_retry_limit = 10,
139 .aflags = 0,
141 .ac_conf_count = 4,
142 .ac_conf = {
143 [CONF_TX_AC_BE] = {
144 .ac = CONF_TX_AC_BE,
145 .cw_min = 15,
146 .cw_max = 63,
147 .aifsn = 3,
148 .tx_op_limit = 0,
150 [CONF_TX_AC_BK] = {
151 .ac = CONF_TX_AC_BK,
152 .cw_min = 15,
153 .cw_max = 63,
154 .aifsn = 7,
155 .tx_op_limit = 0,
157 [CONF_TX_AC_VI] = {
158 .ac = CONF_TX_AC_VI,
159 .cw_min = 15,
160 .cw_max = 63,
161 .aifsn = CONF_TX_AIFS_PIFS,
162 .tx_op_limit = 3008,
164 [CONF_TX_AC_VO] = {
165 .ac = CONF_TX_AC_VO,
166 .cw_min = 15,
167 .cw_max = 63,
168 .aifsn = CONF_TX_AIFS_PIFS,
169 .tx_op_limit = 1504,
172 .max_tx_retries = 100,
173 .ap_aging_period = 300,
174 .tid_conf_count = 4,
175 .tid_conf = {
176 [CONF_TX_AC_BE] = {
177 .queue_id = CONF_TX_AC_BE,
178 .channel_type = CONF_CHANNEL_TYPE_EDCF,
179 .tsid = CONF_TX_AC_BE,
180 .ps_scheme = CONF_PS_SCHEME_LEGACY,
181 .ack_policy = CONF_ACK_POLICY_LEGACY,
182 .apsd_conf = {0, 0},
184 [CONF_TX_AC_BK] = {
185 .queue_id = CONF_TX_AC_BK,
186 .channel_type = CONF_CHANNEL_TYPE_EDCF,
187 .tsid = CONF_TX_AC_BK,
188 .ps_scheme = CONF_PS_SCHEME_LEGACY,
189 .ack_policy = CONF_ACK_POLICY_LEGACY,
190 .apsd_conf = {0, 0},
192 [CONF_TX_AC_VI] = {
193 .queue_id = CONF_TX_AC_VI,
194 .channel_type = CONF_CHANNEL_TYPE_EDCF,
195 .tsid = CONF_TX_AC_VI,
196 .ps_scheme = CONF_PS_SCHEME_LEGACY,
197 .ack_policy = CONF_ACK_POLICY_LEGACY,
198 .apsd_conf = {0, 0},
200 [CONF_TX_AC_VO] = {
201 .queue_id = CONF_TX_AC_VO,
202 .channel_type = CONF_CHANNEL_TYPE_EDCF,
203 .tsid = CONF_TX_AC_VO,
204 .ps_scheme = CONF_PS_SCHEME_LEGACY,
205 .ack_policy = CONF_ACK_POLICY_LEGACY,
206 .apsd_conf = {0, 0},
209 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
210 .tx_compl_timeout = 700,
211 .tx_compl_threshold = 4,
212 .basic_rate = CONF_HW_BIT_RATE_1MBPS,
213 .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
214 .tmpl_short_retry_limit = 10,
215 .tmpl_long_retry_limit = 10,
217 .conn = {
218 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
219 .listen_interval = 1,
220 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
221 .bcn_filt_ie_count = 2,
222 .bcn_filt_ie = {
223 [0] = {
224 .ie = WLAN_EID_CHANNEL_SWITCH,
225 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
227 [1] = {
228 .ie = WLAN_EID_HT_INFORMATION,
229 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
232 .synch_fail_thold = 10,
233 .bss_lose_timeout = 100,
234 .beacon_rx_timeout = 10000,
235 .broadcast_timeout = 20000,
236 .rx_broadcast_in_ps = 1,
237 .ps_poll_threshold = 10,
238 .ps_poll_recovery_period = 700,
239 .bet_enable = CONF_BET_MODE_ENABLE,
240 .bet_max_consecutive = 50,
241 .psm_entry_retries = 8,
242 .psm_exit_retries = 16,
243 .psm_entry_nullfunc_retries = 3,
244 .keep_alive_interval = 55000,
245 .max_listen_interval = 20,
247 .itrim = {
248 .enable = false,
249 .timeout = 50000,
251 .pm_config = {
252 .host_clk_settling_time = 5000,
253 .host_fast_wakeup_support = false
255 .roam_trigger = {
256 .trigger_pacing = 1,
257 .avg_weight_rssi_beacon = 20,
258 .avg_weight_rssi_data = 10,
259 .avg_weight_snr_beacon = 20,
260 .avg_weight_snr_data = 10,
262 .scan = {
263 .min_dwell_time_active = 7500,
264 .max_dwell_time_active = 30000,
265 .min_dwell_time_passive = 100000,
266 .max_dwell_time_passive = 100000,
267 .num_probe_reqs = 2,
269 .sched_scan = {
270 /* sched_scan requires dwell times in TU instead of TU/1000 */
271 .min_dwell_time_active = 30,
272 .max_dwell_time_active = 60,
273 .dwell_time_passive = 100,
274 .dwell_time_dfs = 150,
275 .num_probe_reqs = 2,
276 .rssi_threshold = -90,
277 .snr_threshold = 0,
279 .rf = {
280 .tx_per_channel_power_compensation_2 = {
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 .tx_per_channel_power_compensation_5 = {
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 .ht = {
290 .rx_ba_win_size = 8,
291 .tx_ba_win_size = 64,
292 .inactivity_timeout = 10000,
293 .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
295 .mem_wl127x = {
296 .num_stations = 1,
297 .ssid_profiles = 1,
298 .rx_block_num = 70,
299 .tx_min_block_num = 40,
300 .dynamic_memory = 1,
301 .min_req_tx_blocks = 100,
302 .min_req_rx_blocks = 22,
303 .tx_min = 27,
305 .mem_wl128x = {
306 .num_stations = 1,
307 .ssid_profiles = 1,
308 .rx_block_num = 40,
309 .tx_min_block_num = 40,
310 .dynamic_memory = 1,
311 .min_req_tx_blocks = 45,
312 .min_req_rx_blocks = 22,
313 .tx_min = 27,
315 .fm_coex = {
316 .enable = true,
317 .swallow_period = 5,
318 .n_divider_fref_set_1 = 0xff, /* default */
319 .n_divider_fref_set_2 = 12,
320 .m_divider_fref_set_1 = 148,
321 .m_divider_fref_set_2 = 0xffff, /* default */
322 .coex_pll_stabilization_time = 0xffffffff, /* default */
323 .ldo_stabilization_time = 0xffff, /* default */
324 .fm_disturbed_band_margin = 0xff, /* default */
325 .swallow_clk_diff = 0xff, /* default */
327 .rx_streaming = {
328 .duration = 150,
329 .queues = 0x1,
330 .interval = 20,
331 .always = 0,
333 .fwlog = {
334 .mode = WL12XX_FWLOG_ON_DEMAND,
335 .mem_blocks = 2,
336 .severity = 0,
337 .timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED,
338 .output = WL12XX_FWLOG_OUTPUT_HOST,
339 .threshold = 0,
341 .hci_io_ds = HCI_IO_DS_6MA,
342 .rate = {
343 .rate_retry_score = 32000,
344 .per_add = 8192,
345 .per_th1 = 2048,
346 .per_th2 = 4096,
347 .max_per = 8100,
348 .inverse_curiosity_factor = 5,
349 .tx_fail_low_th = 4,
350 .tx_fail_high_th = 10,
351 .per_alpha_shift = 4,
352 .per_add_shift = 13,
353 .per_beta1_shift = 10,
354 .per_beta2_shift = 8,
355 .rate_check_up = 2,
356 .rate_check_down = 12,
357 .rate_retry_policy = {
358 0x00, 0x00, 0x00, 0x00, 0x00,
359 0x00, 0x00, 0x00, 0x00, 0x00,
360 0x00, 0x00, 0x00,
363 .hangover = {
364 .recover_time = 0,
365 .hangover_period = 20,
366 .dynamic_mode = 1,
367 .early_termination_mode = 1,
368 .max_period = 20,
369 .min_period = 1,
370 .increase_delta = 1,
371 .decrease_delta = 2,
372 .quiet_time = 4,
373 .increase_time = 1,
374 .window_size = 16,
378 static char *fwlog_param;
379 static bool bug_on_recovery;
381 static void __wl1271_op_remove_interface(struct wl1271 *wl,
382 struct ieee80211_vif *vif,
383 bool reset_tx_queues);
384 static void wl1271_op_stop(struct ieee80211_hw *hw);
385 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif);
387 static DEFINE_MUTEX(wl_list_mutex);
388 static LIST_HEAD(wl_list);
390 static int wl1271_check_operstate(struct wl1271 *wl, struct wl12xx_vif *wlvif,
391 unsigned char operstate)
393 int ret;
395 if (operstate != IF_OPER_UP)
396 return 0;
398 if (test_and_set_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags))
399 return 0;
401 ret = wl12xx_cmd_set_peer_state(wl, wlvif->sta.hlid);
402 if (ret < 0)
403 return ret;
405 wl12xx_croc(wl, wlvif->role_id);
407 wl1271_info("Association completed.");
408 return 0;
410 static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
411 void *arg)
413 struct net_device *dev = arg;
414 struct wireless_dev *wdev;
415 struct wiphy *wiphy;
416 struct ieee80211_hw *hw;
417 struct wl1271 *wl;
418 struct wl1271 *wl_temp;
419 struct wl12xx_vif *wlvif;
420 int ret = 0;
422 /* Check that this notification is for us. */
423 if (what != NETDEV_CHANGE)
424 return NOTIFY_DONE;
426 wdev = dev->ieee80211_ptr;
427 if (wdev == NULL)
428 return NOTIFY_DONE;
430 wiphy = wdev->wiphy;
431 if (wiphy == NULL)
432 return NOTIFY_DONE;
434 hw = wiphy_priv(wiphy);
435 if (hw == NULL)
436 return NOTIFY_DONE;
438 wl_temp = hw->priv;
439 mutex_lock(&wl_list_mutex);
440 list_for_each_entry(wl, &wl_list, list) {
441 if (wl == wl_temp)
442 break;
444 mutex_unlock(&wl_list_mutex);
445 if (wl != wl_temp)
446 return NOTIFY_DONE;
448 mutex_lock(&wl->mutex);
450 if (wl->state == WL1271_STATE_OFF)
451 goto out;
453 wl12xx_for_each_wlvif_sta(wl, wlvif) {
454 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
455 continue;
457 ret = wl1271_ps_elp_wakeup(wl);
458 if (ret < 0)
459 goto out;
461 wl1271_check_operstate(wl, wlvif, dev->operstate);
463 wl1271_ps_elp_sleep(wl);
465 out:
466 mutex_unlock(&wl->mutex);
468 return NOTIFY_OK;
471 static int wl1271_reg_notify(struct wiphy *wiphy,
472 struct regulatory_request *request)
474 struct ieee80211_supported_band *band;
475 struct ieee80211_channel *ch;
476 int i;
478 band = wiphy->bands[IEEE80211_BAND_5GHZ];
479 for (i = 0; i < band->n_channels; i++) {
480 ch = &band->channels[i];
481 if (ch->flags & IEEE80211_CHAN_DISABLED)
482 continue;
484 if (ch->flags & IEEE80211_CHAN_RADAR)
485 ch->flags |= IEEE80211_CHAN_NO_IBSS |
486 IEEE80211_CHAN_PASSIVE_SCAN;
490 return 0;
493 static int wl1271_set_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif,
494 bool enable)
496 int ret = 0;
498 /* we should hold wl->mutex */
499 ret = wl1271_acx_ps_rx_streaming(wl, wlvif, enable);
500 if (ret < 0)
501 goto out;
503 if (enable)
504 set_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
505 else
506 clear_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
507 out:
508 return ret;
512 * this function is being called when the rx_streaming interval
513 * has beed changed or rx_streaming should be disabled
515 int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif)
517 int ret = 0;
518 int period = wl->conf.rx_streaming.interval;
520 /* don't reconfigure if rx_streaming is disabled */
521 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
522 goto out;
524 /* reconfigure/disable according to new streaming_period */
525 if (period &&
526 test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
527 (wl->conf.rx_streaming.always ||
528 test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
529 ret = wl1271_set_rx_streaming(wl, wlvif, true);
530 else {
531 ret = wl1271_set_rx_streaming(wl, wlvif, false);
532 /* don't cancel_work_sync since we might deadlock */
533 del_timer_sync(&wlvif->rx_streaming_timer);
535 out:
536 return ret;
539 static void wl1271_rx_streaming_enable_work(struct work_struct *work)
541 int ret;
542 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
543 rx_streaming_enable_work);
544 struct wl1271 *wl = wlvif->wl;
546 mutex_lock(&wl->mutex);
548 if (test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags) ||
549 !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
550 (!wl->conf.rx_streaming.always &&
551 !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
552 goto out;
554 if (!wl->conf.rx_streaming.interval)
555 goto out;
557 ret = wl1271_ps_elp_wakeup(wl);
558 if (ret < 0)
559 goto out;
561 ret = wl1271_set_rx_streaming(wl, wlvif, true);
562 if (ret < 0)
563 goto out_sleep;
565 /* stop it after some time of inactivity */
566 mod_timer(&wlvif->rx_streaming_timer,
567 jiffies + msecs_to_jiffies(wl->conf.rx_streaming.duration));
569 out_sleep:
570 wl1271_ps_elp_sleep(wl);
571 out:
572 mutex_unlock(&wl->mutex);
575 static void wl1271_rx_streaming_disable_work(struct work_struct *work)
577 int ret;
578 struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
579 rx_streaming_disable_work);
580 struct wl1271 *wl = wlvif->wl;
582 mutex_lock(&wl->mutex);
584 if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
585 goto out;
587 ret = wl1271_ps_elp_wakeup(wl);
588 if (ret < 0)
589 goto out;
591 ret = wl1271_set_rx_streaming(wl, wlvif, false);
592 if (ret)
593 goto out_sleep;
595 out_sleep:
596 wl1271_ps_elp_sleep(wl);
597 out:
598 mutex_unlock(&wl->mutex);
601 static void wl1271_rx_streaming_timer(unsigned long data)
603 struct wl12xx_vif *wlvif = (struct wl12xx_vif *)data;
604 struct wl1271 *wl = wlvif->wl;
605 ieee80211_queue_work(wl->hw, &wlvif->rx_streaming_disable_work);
608 static void wl1271_conf_init(struct wl1271 *wl)
612 * This function applies the default configuration to the driver. This
613 * function is invoked upon driver load (spi probe.)
615 * The configuration is stored in a run-time structure in order to
616 * facilitate for run-time adjustment of any of the parameters. Making
617 * changes to the configuration structure will apply the new values on
618 * the next interface up (wl1271_op_start.)
621 /* apply driver default configuration */
622 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
624 /* Adjust settings according to optional module parameters */
625 if (fwlog_param) {
626 if (!strcmp(fwlog_param, "continuous")) {
627 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
628 } else if (!strcmp(fwlog_param, "ondemand")) {
629 wl->conf.fwlog.mode = WL12XX_FWLOG_ON_DEMAND;
630 } else if (!strcmp(fwlog_param, "dbgpins")) {
631 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
632 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_DBG_PINS;
633 } else if (!strcmp(fwlog_param, "disable")) {
634 wl->conf.fwlog.mem_blocks = 0;
635 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_NONE;
636 } else {
637 wl1271_error("Unknown fwlog parameter %s", fwlog_param);
642 static int wl1271_plt_init(struct wl1271 *wl)
644 struct conf_tx_ac_category *conf_ac;
645 struct conf_tx_tid *conf_tid;
646 int ret, i;
648 if (wl->chip.id == CHIP_ID_1283_PG20)
649 ret = wl128x_cmd_general_parms(wl);
650 else
651 ret = wl1271_cmd_general_parms(wl);
652 if (ret < 0)
653 return ret;
655 if (wl->chip.id == CHIP_ID_1283_PG20)
656 ret = wl128x_cmd_radio_parms(wl);
657 else
658 ret = wl1271_cmd_radio_parms(wl);
659 if (ret < 0)
660 return ret;
662 if (wl->chip.id != CHIP_ID_1283_PG20) {
663 ret = wl1271_cmd_ext_radio_parms(wl);
664 if (ret < 0)
665 return ret;
667 if (ret < 0)
668 return ret;
670 /* Chip-specific initializations */
671 ret = wl1271_chip_specific_init(wl);
672 if (ret < 0)
673 return ret;
675 ret = wl1271_init_templates_config(wl);
676 if (ret < 0)
677 return ret;
679 ret = wl1271_acx_init_mem_config(wl);
680 if (ret < 0)
681 return ret;
683 /* PHY layer config */
684 ret = wl1271_init_phy_config(wl);
685 if (ret < 0)
686 goto out_free_memmap;
688 ret = wl1271_acx_dco_itrim_params(wl);
689 if (ret < 0)
690 goto out_free_memmap;
692 /* Initialize connection monitoring thresholds */
693 ret = wl1271_acx_conn_monit_params(wl, NULL, false); /* TODO: fix */
694 if (ret < 0)
695 goto out_free_memmap;
697 /* Bluetooth WLAN coexistence */
698 ret = wl1271_init_pta(wl);
699 if (ret < 0)
700 goto out_free_memmap;
702 /* FM WLAN coexistence */
703 ret = wl1271_acx_fm_coex(wl);
704 if (ret < 0)
705 goto out_free_memmap;
707 /* Energy detection */
708 ret = wl1271_init_energy_detection(wl);
709 if (ret < 0)
710 goto out_free_memmap;
712 ret = wl12xx_acx_mem_cfg(wl);
713 if (ret < 0)
714 goto out_free_memmap;
716 /* Default fragmentation threshold */
717 ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
718 if (ret < 0)
719 goto out_free_memmap;
721 /* Default TID/AC configuration */
722 BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
723 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
724 conf_ac = &wl->conf.tx.ac_conf[i];
725 /* TODO: fix */
726 ret = wl1271_acx_ac_cfg(wl, NULL, conf_ac->ac, conf_ac->cw_min,
727 conf_ac->cw_max, conf_ac->aifsn,
728 conf_ac->tx_op_limit);
729 if (ret < 0)
730 goto out_free_memmap;
732 conf_tid = &wl->conf.tx.tid_conf[i];
733 /* TODO: fix */
734 ret = wl1271_acx_tid_cfg(wl, NULL, conf_tid->queue_id,
735 conf_tid->channel_type,
736 conf_tid->tsid,
737 conf_tid->ps_scheme,
738 conf_tid->ack_policy,
739 conf_tid->apsd_conf[0],
740 conf_tid->apsd_conf[1]);
741 if (ret < 0)
742 goto out_free_memmap;
745 /* Enable data path */
746 ret = wl1271_cmd_data_path(wl, 1);
747 if (ret < 0)
748 goto out_free_memmap;
750 /* Configure for CAM power saving (ie. always active) */
751 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
752 if (ret < 0)
753 goto out_free_memmap;
755 /* configure PM */
756 ret = wl1271_acx_pm_config(wl);
757 if (ret < 0)
758 goto out_free_memmap;
760 return 0;
762 out_free_memmap:
763 kfree(wl->target_mem_map);
764 wl->target_mem_map = NULL;
766 return ret;
769 static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
770 struct wl12xx_vif *wlvif,
771 u8 hlid, u8 tx_pkts)
773 bool fw_ps, single_sta;
775 fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
776 single_sta = (wl->active_sta_count == 1);
779 * Wake up from high level PS if the STA is asleep with too little
780 * packets in FW or if the STA is awake.
782 if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS)
783 wl12xx_ps_link_end(wl, wlvif, hlid);
786 * Start high-level PS if the STA is asleep with enough blocks in FW.
787 * Make an exception if this is the only connected station. In this
788 * case FW-memory congestion is not a problem.
790 else if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
791 wl12xx_ps_link_start(wl, wlvif, hlid, true);
794 static void wl12xx_irq_update_links_status(struct wl1271 *wl,
795 struct wl12xx_vif *wlvif,
796 struct wl12xx_fw_status *status)
798 struct wl1271_link *lnk;
799 u32 cur_fw_ps_map;
800 u8 hlid, cnt;
802 /* TODO: also use link_fast_bitmap here */
804 cur_fw_ps_map = le32_to_cpu(status->link_ps_bitmap);
805 if (wl->ap_fw_ps_map != cur_fw_ps_map) {
806 wl1271_debug(DEBUG_PSM,
807 "link ps prev 0x%x cur 0x%x changed 0x%x",
808 wl->ap_fw_ps_map, cur_fw_ps_map,
809 wl->ap_fw_ps_map ^ cur_fw_ps_map);
811 wl->ap_fw_ps_map = cur_fw_ps_map;
814 for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, WL12XX_MAX_LINKS) {
815 lnk = &wl->links[hlid];
816 cnt = status->tx_lnk_free_pkts[hlid] - lnk->prev_freed_pkts;
818 lnk->prev_freed_pkts = status->tx_lnk_free_pkts[hlid];
819 lnk->allocated_pkts -= cnt;
821 wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
822 lnk->allocated_pkts);
826 static void wl12xx_fw_status(struct wl1271 *wl,
827 struct wl12xx_fw_status *status)
829 struct wl12xx_vif *wlvif;
830 struct timespec ts;
831 u32 old_tx_blk_count = wl->tx_blocks_available;
832 int avail, freed_blocks;
833 int i;
835 wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
837 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
838 "drv_rx_counter = %d, tx_results_counter = %d)",
839 status->intr,
840 status->fw_rx_counter,
841 status->drv_rx_counter,
842 status->tx_results_counter);
844 for (i = 0; i < NUM_TX_QUEUES; i++) {
845 /* prevent wrap-around in freed-packets counter */
846 wl->tx_allocated_pkts[i] -=
847 (status->tx_released_pkts[i] -
848 wl->tx_pkts_freed[i]) & 0xff;
850 wl->tx_pkts_freed[i] = status->tx_released_pkts[i];
853 /* prevent wrap-around in total blocks counter */
854 if (likely(wl->tx_blocks_freed <=
855 le32_to_cpu(status->total_released_blks)))
856 freed_blocks = le32_to_cpu(status->total_released_blks) -
857 wl->tx_blocks_freed;
858 else
859 freed_blocks = 0x100000000LL - wl->tx_blocks_freed +
860 le32_to_cpu(status->total_released_blks);
862 wl->tx_blocks_freed = le32_to_cpu(status->total_released_blks);
864 wl->tx_allocated_blocks -= freed_blocks;
866 avail = le32_to_cpu(status->tx_total) - wl->tx_allocated_blocks;
869 * The FW might change the total number of TX memblocks before
870 * we get a notification about blocks being released. Thus, the
871 * available blocks calculation might yield a temporary result
872 * which is lower than the actual available blocks. Keeping in
873 * mind that only blocks that were allocated can be moved from
874 * TX to RX, tx_blocks_available should never decrease here.
876 wl->tx_blocks_available = max((int)wl->tx_blocks_available,
877 avail);
879 /* if more blocks are available now, tx work can be scheduled */
880 if (wl->tx_blocks_available > old_tx_blk_count)
881 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
883 /* for AP update num of allocated TX blocks per link and ps status */
884 wl12xx_for_each_wlvif_ap(wl, wlvif) {
885 wl12xx_irq_update_links_status(wl, wlvif, status);
888 /* update the host-chipset time offset */
889 getnstimeofday(&ts);
890 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
891 (s64)le32_to_cpu(status->fw_localtime);
894 static void wl1271_flush_deferred_work(struct wl1271 *wl)
896 struct sk_buff *skb;
898 /* Pass all received frames to the network stack */
899 while ((skb = skb_dequeue(&wl->deferred_rx_queue)))
900 ieee80211_rx_ni(wl->hw, skb);
902 /* Return sent skbs to the network stack */
903 while ((skb = skb_dequeue(&wl->deferred_tx_queue)))
904 ieee80211_tx_status_ni(wl->hw, skb);
907 static void wl1271_netstack_work(struct work_struct *work)
909 struct wl1271 *wl =
910 container_of(work, struct wl1271, netstack_work);
912 do {
913 wl1271_flush_deferred_work(wl);
914 } while (skb_queue_len(&wl->deferred_rx_queue));
917 #define WL1271_IRQ_MAX_LOOPS 256
919 static irqreturn_t wl1271_irq(int irq, void *cookie)
921 int ret;
922 u32 intr;
923 int loopcount = WL1271_IRQ_MAX_LOOPS;
924 struct wl1271 *wl = (struct wl1271 *)cookie;
925 bool done = false;
926 unsigned int defer_count;
927 unsigned long flags;
929 /* TX might be handled here, avoid redundant work */
930 set_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
931 cancel_work_sync(&wl->tx_work);
934 * In case edge triggered interrupt must be used, we cannot iterate
935 * more than once without introducing race conditions with the hardirq.
937 if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
938 loopcount = 1;
940 mutex_lock(&wl->mutex);
942 wl1271_debug(DEBUG_IRQ, "IRQ work");
944 if (unlikely(wl->state == WL1271_STATE_OFF))
945 goto out;
947 ret = wl1271_ps_elp_wakeup(wl);
948 if (ret < 0)
949 goto out;
951 while (!done && loopcount--) {
953 * In order to avoid a race with the hardirq, clear the flag
954 * before acknowledging the chip. Since the mutex is held,
955 * wl1271_ps_elp_wakeup cannot be called concurrently.
957 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
958 smp_mb__after_clear_bit();
960 wl12xx_fw_status(wl, wl->fw_status);
961 intr = le32_to_cpu(wl->fw_status->intr);
962 intr &= WL1271_INTR_MASK;
963 if (!intr) {
964 done = true;
965 continue;
968 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
969 wl1271_error("watchdog interrupt received! "
970 "starting recovery.");
971 wl12xx_queue_recovery_work(wl);
973 /* restarting the chip. ignore any other interrupt. */
974 goto out;
977 if (likely(intr & WL1271_ACX_INTR_DATA)) {
978 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
980 wl12xx_rx(wl, wl->fw_status);
982 /* Check if any tx blocks were freed */
983 spin_lock_irqsave(&wl->wl_lock, flags);
984 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
985 wl1271_tx_total_queue_count(wl) > 0) {
986 spin_unlock_irqrestore(&wl->wl_lock, flags);
988 * In order to avoid starvation of the TX path,
989 * call the work function directly.
991 wl1271_tx_work_locked(wl);
992 } else {
993 spin_unlock_irqrestore(&wl->wl_lock, flags);
996 /* check for tx results */
997 if (wl->fw_status->tx_results_counter !=
998 (wl->tx_results_count & 0xff))
999 wl1271_tx_complete(wl);
1001 /* Make sure the deferred queues don't get too long */
1002 defer_count = skb_queue_len(&wl->deferred_tx_queue) +
1003 skb_queue_len(&wl->deferred_rx_queue);
1004 if (defer_count > WL1271_DEFERRED_QUEUE_LIMIT)
1005 wl1271_flush_deferred_work(wl);
1008 if (intr & WL1271_ACX_INTR_EVENT_A) {
1009 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
1010 wl1271_event_handle(wl, 0);
1013 if (intr & WL1271_ACX_INTR_EVENT_B) {
1014 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
1015 wl1271_event_handle(wl, 1);
1018 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
1019 wl1271_debug(DEBUG_IRQ,
1020 "WL1271_ACX_INTR_INIT_COMPLETE");
1022 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
1023 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
1026 wl1271_ps_elp_sleep(wl);
1028 out:
1029 spin_lock_irqsave(&wl->wl_lock, flags);
1030 /* In case TX was not handled here, queue TX work */
1031 clear_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
1032 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
1033 wl1271_tx_total_queue_count(wl) > 0)
1034 ieee80211_queue_work(wl->hw, &wl->tx_work);
1035 spin_unlock_irqrestore(&wl->wl_lock, flags);
1037 mutex_unlock(&wl->mutex);
1039 return IRQ_HANDLED;
1042 static int wl1271_fetch_firmware(struct wl1271 *wl)
1044 const struct firmware *fw;
1045 const char *fw_name;
1046 int ret;
1048 if (wl->chip.id == CHIP_ID_1283_PG20)
1049 fw_name = WL128X_FW_NAME;
1050 else
1051 fw_name = WL127X_FW_NAME;
1053 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
1055 ret = request_firmware(&fw, fw_name, wl->dev);
1057 if (ret < 0) {
1058 wl1271_error("could not get firmware: %d", ret);
1059 return ret;
1062 if (fw->size % 4) {
1063 wl1271_error("firmware size is not multiple of 32 bits: %zu",
1064 fw->size);
1065 ret = -EILSEQ;
1066 goto out;
1069 vfree(wl->fw);
1070 wl->fw_len = fw->size;
1071 wl->fw = vmalloc(wl->fw_len);
1073 if (!wl->fw) {
1074 wl1271_error("could not allocate memory for the firmware");
1075 ret = -ENOMEM;
1076 goto out;
1079 memcpy(wl->fw, fw->data, wl->fw_len);
1080 ret = 0;
1082 out:
1083 release_firmware(fw);
1085 return ret;
1088 static int wl1271_fetch_nvs(struct wl1271 *wl)
1090 const struct firmware *fw;
1091 int ret;
1093 ret = request_firmware(&fw, WL12XX_NVS_NAME, wl->dev);
1095 if (ret < 0) {
1096 wl1271_error("could not get nvs file: %d", ret);
1097 return ret;
1100 wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
1102 if (!wl->nvs) {
1103 wl1271_error("could not allocate memory for the nvs file");
1104 ret = -ENOMEM;
1105 goto out;
1108 wl->nvs_len = fw->size;
1110 out:
1111 release_firmware(fw);
1113 return ret;
1116 void wl12xx_queue_recovery_work(struct wl1271 *wl)
1118 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1119 ieee80211_queue_work(wl->hw, &wl->recovery_work);
1122 size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
1124 size_t len = 0;
1126 /* The FW log is a length-value list, find where the log end */
1127 while (len < maxlen) {
1128 if (memblock[len] == 0)
1129 break;
1130 if (len + memblock[len] + 1 > maxlen)
1131 break;
1132 len += memblock[len] + 1;
1135 /* Make sure we have enough room */
1136 len = min(len, (size_t)(PAGE_SIZE - wl->fwlog_size));
1138 /* Fill the FW log file, consumed by the sysfs fwlog entry */
1139 memcpy(wl->fwlog + wl->fwlog_size, memblock, len);
1140 wl->fwlog_size += len;
1142 return len;
1145 static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
1147 u32 addr;
1148 u32 first_addr;
1149 u8 *block;
1151 if ((wl->quirks & WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED) ||
1152 (wl->conf.fwlog.mode != WL12XX_FWLOG_ON_DEMAND) ||
1153 (wl->conf.fwlog.mem_blocks == 0))
1154 return;
1156 wl1271_info("Reading FW panic log");
1158 block = kmalloc(WL12XX_HW_BLOCK_SIZE, GFP_KERNEL);
1159 if (!block)
1160 return;
1163 * Make sure the chip is awake and the logger isn't active.
1164 * This might fail if the firmware hanged.
1166 if (!wl1271_ps_elp_wakeup(wl))
1167 wl12xx_cmd_stop_fwlog(wl);
1169 /* Read the first memory block address */
1170 wl12xx_fw_status(wl, wl->fw_status);
1171 first_addr = le32_to_cpu(wl->fw_status->log_start_addr);
1172 if (!first_addr)
1173 goto out;
1175 /* Traverse the memory blocks linked list */
1176 addr = first_addr;
1177 do {
1178 memset(block, 0, WL12XX_HW_BLOCK_SIZE);
1179 wl1271_read_hwaddr(wl, addr, block, WL12XX_HW_BLOCK_SIZE,
1180 false);
1183 * Memory blocks are linked to one another. The first 4 bytes
1184 * of each memory block hold the hardware address of the next
1185 * one. The last memory block points to the first one.
1187 addr = le32_to_cpup((__le32 *)block);
1188 if (!wl12xx_copy_fwlog(wl, block + sizeof(addr),
1189 WL12XX_HW_BLOCK_SIZE - sizeof(addr)))
1190 break;
1191 } while (addr && (addr != first_addr));
1193 wake_up_interruptible(&wl->fwlog_waitq);
1195 out:
1196 kfree(block);
1199 static void wl1271_recovery_work(struct work_struct *work)
1201 struct wl1271 *wl =
1202 container_of(work, struct wl1271, recovery_work);
1203 struct wl12xx_vif *wlvif;
1204 struct ieee80211_vif *vif;
1206 mutex_lock(&wl->mutex);
1208 if (wl->state != WL1271_STATE_ON)
1209 goto out_unlock;
1211 /* Avoid a recursive recovery */
1212 set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
1214 wl12xx_read_fwlog_panic(wl);
1216 wl1271_info("Hardware recovery in progress. FW ver: %s pc: 0x%x",
1217 wl->chip.fw_ver_str, wl1271_read32(wl, SCR_PAD4));
1219 BUG_ON(bug_on_recovery);
1222 * Advance security sequence number to overcome potential progress
1223 * in the firmware during recovery. This doens't hurt if the network is
1224 * not encrypted.
1226 wl12xx_for_each_wlvif(wl, wlvif) {
1227 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
1228 test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
1229 wlvif->tx_security_seq +=
1230 WL1271_TX_SQN_POST_RECOVERY_PADDING;
1233 /* Prevent spurious TX during FW restart */
1234 ieee80211_stop_queues(wl->hw);
1236 if (wl->sched_scanning) {
1237 ieee80211_sched_scan_stopped(wl->hw);
1238 wl->sched_scanning = false;
1241 /* reboot the chipset */
1242 while (!list_empty(&wl->wlvif_list)) {
1243 wlvif = list_first_entry(&wl->wlvif_list,
1244 struct wl12xx_vif, list);
1245 vif = wl12xx_wlvif_to_vif(wlvif);
1246 __wl1271_op_remove_interface(wl, vif, false);
1248 mutex_unlock(&wl->mutex);
1249 wl1271_op_stop(wl->hw);
1251 clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
1253 ieee80211_restart_hw(wl->hw);
1256 * Its safe to enable TX now - the queues are stopped after a request
1257 * to restart the HW.
1259 ieee80211_wake_queues(wl->hw);
1260 return;
1261 out_unlock:
1262 mutex_unlock(&wl->mutex);
1265 static void wl1271_fw_wakeup(struct wl1271 *wl)
1267 u32 elp_reg;
1269 elp_reg = ELPCTRL_WAKE_UP;
1270 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
1273 static int wl1271_setup(struct wl1271 *wl)
1275 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
1276 if (!wl->fw_status)
1277 return -ENOMEM;
1279 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
1280 if (!wl->tx_res_if) {
1281 kfree(wl->fw_status);
1282 return -ENOMEM;
1285 return 0;
1288 static int wl1271_chip_wakeup(struct wl1271 *wl)
1290 struct wl1271_partition_set partition;
1291 int ret = 0;
1293 msleep(WL1271_PRE_POWER_ON_SLEEP);
1294 ret = wl1271_power_on(wl);
1295 if (ret < 0)
1296 goto out;
1297 msleep(WL1271_POWER_ON_SLEEP);
1298 wl1271_io_reset(wl);
1299 wl1271_io_init(wl);
1301 /* We don't need a real memory partition here, because we only want
1302 * to use the registers at this point. */
1303 memset(&partition, 0, sizeof(partition));
1304 partition.reg.start = REGISTERS_BASE;
1305 partition.reg.size = REGISTERS_DOWN_SIZE;
1306 wl1271_set_partition(wl, &partition);
1308 /* ELP module wake up */
1309 wl1271_fw_wakeup(wl);
1311 /* whal_FwCtrl_BootSm() */
1313 /* 0. read chip id from CHIP_ID */
1314 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
1316 /* 1. check if chip id is valid */
1318 switch (wl->chip.id) {
1319 case CHIP_ID_1271_PG10:
1320 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
1321 wl->chip.id);
1323 ret = wl1271_setup(wl);
1324 if (ret < 0)
1325 goto out;
1326 wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
1327 break;
1329 case CHIP_ID_1271_PG20:
1330 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
1331 wl->chip.id);
1333 ret = wl1271_setup(wl);
1334 if (ret < 0)
1335 goto out;
1336 wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
1337 break;
1339 case CHIP_ID_1283_PG20:
1340 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
1341 wl->chip.id);
1343 ret = wl1271_setup(wl);
1344 if (ret < 0)
1345 goto out;
1347 if (!wl1271_set_block_size(wl))
1348 wl->quirks |= WL12XX_QUIRK_NO_BLOCKSIZE_ALIGNMENT;
1349 break;
1350 case CHIP_ID_1283_PG10:
1351 default:
1352 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
1353 ret = -ENODEV;
1354 goto out;
1357 if (wl->fw == NULL) {
1358 ret = wl1271_fetch_firmware(wl);
1359 if (ret < 0)
1360 goto out;
1363 /* No NVS from netlink, try to get it from the filesystem */
1364 if (wl->nvs == NULL) {
1365 ret = wl1271_fetch_nvs(wl);
1366 if (ret < 0)
1367 goto out;
1370 out:
1371 return ret;
1374 int wl1271_plt_start(struct wl1271 *wl)
1376 int retries = WL1271_BOOT_RETRIES;
1377 struct wiphy *wiphy = wl->hw->wiphy;
1378 int ret;
1380 mutex_lock(&wl->mutex);
1382 wl1271_notice("power up");
1384 if (wl->state != WL1271_STATE_OFF) {
1385 wl1271_error("cannot go into PLT state because not "
1386 "in off state: %d", wl->state);
1387 ret = -EBUSY;
1388 goto out;
1391 while (retries) {
1392 retries--;
1393 ret = wl1271_chip_wakeup(wl);
1394 if (ret < 0)
1395 goto power_off;
1397 ret = wl1271_boot(wl);
1398 if (ret < 0)
1399 goto power_off;
1401 ret = wl1271_plt_init(wl);
1402 if (ret < 0)
1403 goto irq_disable;
1405 wl->state = WL1271_STATE_PLT;
1406 wl1271_notice("firmware booted in PLT mode (%s)",
1407 wl->chip.fw_ver_str);
1409 /* update hw/fw version info in wiphy struct */
1410 wiphy->hw_version = wl->chip.id;
1411 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
1412 sizeof(wiphy->fw_version));
1414 goto out;
1416 irq_disable:
1417 mutex_unlock(&wl->mutex);
1418 /* Unlocking the mutex in the middle of handling is
1419 inherently unsafe. In this case we deem it safe to do,
1420 because we need to let any possibly pending IRQ out of
1421 the system (and while we are WL1271_STATE_OFF the IRQ
1422 work function will not do anything.) Also, any other
1423 possible concurrent operations will fail due to the
1424 current state, hence the wl1271 struct should be safe. */
1425 wl1271_disable_interrupts(wl);
1426 wl1271_flush_deferred_work(wl);
1427 cancel_work_sync(&wl->netstack_work);
1428 mutex_lock(&wl->mutex);
1429 power_off:
1430 wl1271_power_off(wl);
1433 wl1271_error("firmware boot in PLT mode failed despite %d retries",
1434 WL1271_BOOT_RETRIES);
1435 out:
1436 mutex_unlock(&wl->mutex);
1438 return ret;
1441 static int __wl1271_plt_stop(struct wl1271 *wl)
1443 int ret = 0;
1445 wl1271_notice("power down");
1447 if (wl->state != WL1271_STATE_PLT) {
1448 wl1271_error("cannot power down because not in PLT "
1449 "state: %d", wl->state);
1450 ret = -EBUSY;
1451 goto out;
1454 wl1271_power_off(wl);
1456 wl->state = WL1271_STATE_OFF;
1457 wl->rx_counter = 0;
1459 mutex_unlock(&wl->mutex);
1460 wl1271_disable_interrupts(wl);
1461 wl1271_flush_deferred_work(wl);
1462 cancel_work_sync(&wl->netstack_work);
1463 cancel_work_sync(&wl->recovery_work);
1464 mutex_lock(&wl->mutex);
1465 out:
1466 return ret;
1469 int wl1271_plt_stop(struct wl1271 *wl)
1471 int ret;
1473 mutex_lock(&wl->mutex);
1474 ret = __wl1271_plt_stop(wl);
1475 mutex_unlock(&wl->mutex);
1476 return ret;
1479 static void wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
1481 struct wl1271 *wl = hw->priv;
1482 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1483 struct ieee80211_vif *vif = info->control.vif;
1484 struct wl12xx_vif *wlvif = NULL;
1485 unsigned long flags;
1486 int q, mapping;
1487 u8 hlid;
1489 if (vif)
1490 wlvif = wl12xx_vif_to_data(vif);
1492 mapping = skb_get_queue_mapping(skb);
1493 q = wl1271_tx_get_queue(mapping);
1495 hlid = wl12xx_tx_get_hlid(wl, wlvif, skb);
1497 spin_lock_irqsave(&wl->wl_lock, flags);
1499 /* queue the packet */
1500 if (hlid == WL12XX_INVALID_LINK_ID ||
1501 (wlvif && !test_bit(hlid, wlvif->links_map))) {
1502 wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q);
1503 dev_kfree_skb(skb);
1504 goto out;
1507 wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d", hlid, q);
1508 skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1510 wl->tx_queue_count[q]++;
1513 * The workqueue is slow to process the tx_queue and we need stop
1514 * the queue here, otherwise the queue will get too long.
1516 if (wl->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
1517 wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q);
1518 ieee80211_stop_queue(wl->hw, mapping);
1519 set_bit(q, &wl->stopped_queues_map);
1523 * The chip specific setup must run before the first TX packet -
1524 * before that, the tx_work will not be initialized!
1527 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
1528 !test_bit(WL1271_FLAG_TX_PENDING, &wl->flags))
1529 ieee80211_queue_work(wl->hw, &wl->tx_work);
1531 out:
1532 spin_unlock_irqrestore(&wl->wl_lock, flags);
1535 int wl1271_tx_dummy_packet(struct wl1271 *wl)
1537 unsigned long flags;
1538 int q;
1540 /* no need to queue a new dummy packet if one is already pending */
1541 if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags))
1542 return 0;
1544 q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet));
1546 spin_lock_irqsave(&wl->wl_lock, flags);
1547 set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
1548 wl->tx_queue_count[q]++;
1549 spin_unlock_irqrestore(&wl->wl_lock, flags);
1551 /* The FW is low on RX memory blocks, so send the dummy packet asap */
1552 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1553 wl1271_tx_work_locked(wl);
1556 * If the FW TX is busy, TX work will be scheduled by the threaded
1557 * interrupt handler function
1559 return 0;
1563 * The size of the dummy packet should be at least 1400 bytes. However, in
1564 * order to minimize the number of bus transactions, aligning it to 512 bytes
1565 * boundaries could be beneficial, performance wise
1567 #define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1569 static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl)
1571 struct sk_buff *skb;
1572 struct ieee80211_hdr_3addr *hdr;
1573 unsigned int dummy_packet_size;
1575 dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE -
1576 sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr);
1578 skb = dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE);
1579 if (!skb) {
1580 wl1271_warning("Failed to allocate a dummy packet skb");
1581 return NULL;
1584 skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));
1586 hdr = (struct ieee80211_hdr_3addr *) skb_put(skb, sizeof(*hdr));
1587 memset(hdr, 0, sizeof(*hdr));
1588 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
1589 IEEE80211_STYPE_NULLFUNC |
1590 IEEE80211_FCTL_TODS);
1592 memset(skb_put(skb, dummy_packet_size), 0, dummy_packet_size);
1594 /* Dummy packets require the TID to be management */
1595 skb->priority = WL1271_TID_MGMT;
1597 /* Initialize all fields that might be used */
1598 skb_set_queue_mapping(skb, 0);
1599 memset(IEEE80211_SKB_CB(skb), 0, sizeof(struct ieee80211_tx_info));
1601 return skb;
1605 static struct notifier_block wl1271_dev_notifier = {
1606 .notifier_call = wl1271_dev_notify,
1609 #ifdef CONFIG_PM
1610 static int wl1271_configure_suspend_sta(struct wl1271 *wl,
1611 struct wl12xx_vif *wlvif)
1613 int ret = 0;
1615 mutex_lock(&wl->mutex);
1617 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1618 goto out_unlock;
1620 ret = wl1271_ps_elp_wakeup(wl);
1621 if (ret < 0)
1622 goto out_unlock;
1624 /* enter psm if needed*/
1625 if (!test_bit(WLVIF_FLAG_PSM, &wlvif->flags)) {
1626 DECLARE_COMPLETION_ONSTACK(compl);
1628 wlvif->ps_compl = &compl;
1629 ret = wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE,
1630 wlvif->basic_rate, true);
1631 if (ret < 0)
1632 goto out_sleep;
1634 /* we must unlock here so we will be able to get events */
1635 wl1271_ps_elp_sleep(wl);
1636 mutex_unlock(&wl->mutex);
1638 ret = wait_for_completion_timeout(
1639 &compl, msecs_to_jiffies(WL1271_PS_COMPLETE_TIMEOUT));
1640 if (ret <= 0) {
1641 wl1271_warning("couldn't enter ps mode!");
1642 ret = -EBUSY;
1643 goto out;
1646 /* take mutex again, and wakeup */
1647 mutex_lock(&wl->mutex);
1649 ret = wl1271_ps_elp_wakeup(wl);
1650 if (ret < 0)
1651 goto out_unlock;
1653 out_sleep:
1654 wl1271_ps_elp_sleep(wl);
1655 out_unlock:
1656 mutex_unlock(&wl->mutex);
1657 out:
1658 return ret;
1662 static int wl1271_configure_suspend_ap(struct wl1271 *wl,
1663 struct wl12xx_vif *wlvif)
1665 int ret = 0;
1667 mutex_lock(&wl->mutex);
1669 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
1670 goto out_unlock;
1672 ret = wl1271_ps_elp_wakeup(wl);
1673 if (ret < 0)
1674 goto out_unlock;
1676 ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
1678 wl1271_ps_elp_sleep(wl);
1679 out_unlock:
1680 mutex_unlock(&wl->mutex);
1681 return ret;
1685 static int wl1271_configure_suspend(struct wl1271 *wl,
1686 struct wl12xx_vif *wlvif)
1688 if (wlvif->bss_type == BSS_TYPE_STA_BSS)
1689 return wl1271_configure_suspend_sta(wl, wlvif);
1690 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
1691 return wl1271_configure_suspend_ap(wl, wlvif);
1692 return 0;
1695 static void wl1271_configure_resume(struct wl1271 *wl,
1696 struct wl12xx_vif *wlvif)
1698 int ret;
1699 bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
1700 bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
1702 if (!is_sta && !is_ap)
1703 return;
1705 mutex_lock(&wl->mutex);
1706 ret = wl1271_ps_elp_wakeup(wl);
1707 if (ret < 0)
1708 goto out;
1710 if (is_sta) {
1711 /* exit psm if it wasn't configured */
1712 if (!test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags))
1713 wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE,
1714 wlvif->basic_rate, true);
1715 } else if (is_ap) {
1716 wl1271_acx_beacon_filter_opt(wl, wlvif, false);
1719 wl1271_ps_elp_sleep(wl);
1720 out:
1721 mutex_unlock(&wl->mutex);
1724 static int wl1271_op_suspend(struct ieee80211_hw *hw,
1725 struct cfg80211_wowlan *wow)
1727 struct wl1271 *wl = hw->priv;
1728 struct wl12xx_vif *wlvif;
1729 int ret;
1731 wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
1732 WARN_ON(!wow || !wow->any);
1734 wl->wow_enabled = true;
1735 wl12xx_for_each_wlvif(wl, wlvif) {
1736 ret = wl1271_configure_suspend(wl, wlvif);
1737 if (ret < 0) {
1738 wl1271_warning("couldn't prepare device to suspend");
1739 return ret;
1742 /* flush any remaining work */
1743 wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
1746 * disable and re-enable interrupts in order to flush
1747 * the threaded_irq
1749 wl1271_disable_interrupts(wl);
1752 * set suspended flag to avoid triggering a new threaded_irq
1753 * work. no need for spinlock as interrupts are disabled.
1755 set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1757 wl1271_enable_interrupts(wl);
1758 flush_work(&wl->tx_work);
1759 wl12xx_for_each_wlvif(wl, wlvif) {
1760 flush_delayed_work(&wlvif->pspoll_work);
1762 flush_delayed_work(&wl->elp_work);
1764 return 0;
1767 static int wl1271_op_resume(struct ieee80211_hw *hw)
1769 struct wl1271 *wl = hw->priv;
1770 struct wl12xx_vif *wlvif;
1771 unsigned long flags;
1772 bool run_irq_work = false;
1774 wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
1775 wl->wow_enabled);
1776 WARN_ON(!wl->wow_enabled);
1779 * re-enable irq_work enqueuing, and call irq_work directly if
1780 * there is a pending work.
1782 spin_lock_irqsave(&wl->wl_lock, flags);
1783 clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1784 if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
1785 run_irq_work = true;
1786 spin_unlock_irqrestore(&wl->wl_lock, flags);
1788 if (run_irq_work) {
1789 wl1271_debug(DEBUG_MAC80211,
1790 "run postponed irq_work directly");
1791 wl1271_irq(0, wl);
1792 wl1271_enable_interrupts(wl);
1794 wl12xx_for_each_wlvif(wl, wlvif) {
1795 wl1271_configure_resume(wl, wlvif);
1797 wl->wow_enabled = false;
1799 return 0;
1801 #endif
1803 static int wl1271_op_start(struct ieee80211_hw *hw)
1805 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1808 * We have to delay the booting of the hardware because
1809 * we need to know the local MAC address before downloading and
1810 * initializing the firmware. The MAC address cannot be changed
1811 * after boot, and without the proper MAC address, the firmware
1812 * will not function properly.
1814 * The MAC address is first known when the corresponding interface
1815 * is added. That is where we will initialize the hardware.
1818 return 0;
1821 static void wl1271_op_stop(struct ieee80211_hw *hw)
1823 struct wl1271 *wl = hw->priv;
1824 int i;
1826 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
1828 mutex_lock(&wl->mutex);
1829 if (wl->state == WL1271_STATE_OFF) {
1830 mutex_unlock(&wl->mutex);
1831 return;
1834 * this must be before the cancel_work calls below, so that the work
1835 * functions don't perform further work.
1837 wl->state = WL1271_STATE_OFF;
1838 mutex_unlock(&wl->mutex);
1840 mutex_lock(&wl_list_mutex);
1841 list_del(&wl->list);
1842 mutex_unlock(&wl_list_mutex);
1844 wl1271_disable_interrupts(wl);
1845 wl1271_flush_deferred_work(wl);
1846 cancel_delayed_work_sync(&wl->scan_complete_work);
1847 cancel_work_sync(&wl->netstack_work);
1848 cancel_work_sync(&wl->tx_work);
1849 cancel_delayed_work_sync(&wl->elp_work);
1851 /* let's notify MAC80211 about the remaining pending TX frames */
1852 wl12xx_tx_reset(wl, true);
1853 mutex_lock(&wl->mutex);
1855 wl1271_power_off(wl);
1857 wl->band = IEEE80211_BAND_2GHZ;
1859 wl->rx_counter = 0;
1860 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1861 wl->tx_blocks_available = 0;
1862 wl->tx_allocated_blocks = 0;
1863 wl->tx_results_count = 0;
1864 wl->tx_packets_count = 0;
1865 wl->time_offset = 0;
1866 wl->tx_spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
1867 wl->ap_fw_ps_map = 0;
1868 wl->ap_ps_map = 0;
1869 wl->sched_scanning = false;
1870 memset(wl->roles_map, 0, sizeof(wl->roles_map));
1871 memset(wl->links_map, 0, sizeof(wl->links_map));
1872 memset(wl->roc_map, 0, sizeof(wl->roc_map));
1873 wl->active_sta_count = 0;
1875 /* The system link is always allocated */
1876 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
1879 * this is performed after the cancel_work calls and the associated
1880 * mutex_lock, so that wl1271_op_add_interface does not accidentally
1881 * get executed before all these vars have been reset.
1883 wl->flags = 0;
1885 wl->tx_blocks_freed = 0;
1887 for (i = 0; i < NUM_TX_QUEUES; i++) {
1888 wl->tx_pkts_freed[i] = 0;
1889 wl->tx_allocated_pkts[i] = 0;
1892 wl1271_debugfs_reset(wl);
1894 kfree(wl->fw_status);
1895 wl->fw_status = NULL;
1896 kfree(wl->tx_res_if);
1897 wl->tx_res_if = NULL;
1898 kfree(wl->target_mem_map);
1899 wl->target_mem_map = NULL;
1901 mutex_unlock(&wl->mutex);
1904 static int wl12xx_allocate_rate_policy(struct wl1271 *wl, u8 *idx)
1906 u8 policy = find_first_zero_bit(wl->rate_policies_map,
1907 WL12XX_MAX_RATE_POLICIES);
1908 if (policy >= WL12XX_MAX_RATE_POLICIES)
1909 return -EBUSY;
1911 __set_bit(policy, wl->rate_policies_map);
1912 *idx = policy;
1913 return 0;
1916 static void wl12xx_free_rate_policy(struct wl1271 *wl, u8 *idx)
1918 if (WARN_ON(*idx >= WL12XX_MAX_RATE_POLICIES))
1919 return;
1921 __clear_bit(*idx, wl->rate_policies_map);
1922 *idx = WL12XX_MAX_RATE_POLICIES;
1925 static u8 wl12xx_get_role_type(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1927 switch (wlvif->bss_type) {
1928 case BSS_TYPE_AP_BSS:
1929 if (wlvif->p2p)
1930 return WL1271_ROLE_P2P_GO;
1931 else
1932 return WL1271_ROLE_AP;
1934 case BSS_TYPE_STA_BSS:
1935 if (wlvif->p2p)
1936 return WL1271_ROLE_P2P_CL;
1937 else
1938 return WL1271_ROLE_STA;
1940 case BSS_TYPE_IBSS:
1941 return WL1271_ROLE_IBSS;
1943 default:
1944 wl1271_error("invalid bss_type: %d", wlvif->bss_type);
1946 return WL12XX_INVALID_ROLE_TYPE;
1949 static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
1951 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
1952 int i;
1954 /* clear everything but the persistent data */
1955 memset(wlvif, 0, offsetof(struct wl12xx_vif, persistent));
1957 switch (ieee80211_vif_type_p2p(vif)) {
1958 case NL80211_IFTYPE_P2P_CLIENT:
1959 wlvif->p2p = 1;
1960 /* fall-through */
1961 case NL80211_IFTYPE_STATION:
1962 wlvif->bss_type = BSS_TYPE_STA_BSS;
1963 break;
1964 case NL80211_IFTYPE_ADHOC:
1965 wlvif->bss_type = BSS_TYPE_IBSS;
1966 break;
1967 case NL80211_IFTYPE_P2P_GO:
1968 wlvif->p2p = 1;
1969 /* fall-through */
1970 case NL80211_IFTYPE_AP:
1971 wlvif->bss_type = BSS_TYPE_AP_BSS;
1972 break;
1973 default:
1974 wlvif->bss_type = MAX_BSS_TYPE;
1975 return -EOPNOTSUPP;
1978 wlvif->role_id = WL12XX_INVALID_ROLE_ID;
1979 wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
1980 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
1982 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
1983 wlvif->bss_type == BSS_TYPE_IBSS) {
1984 /* init sta/ibss data */
1985 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
1986 wl12xx_allocate_rate_policy(wl, &wlvif->sta.basic_rate_idx);
1987 wl12xx_allocate_rate_policy(wl, &wlvif->sta.ap_rate_idx);
1988 wl12xx_allocate_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
1989 } else {
1990 /* init ap data */
1991 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
1992 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
1993 wl12xx_allocate_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
1994 wl12xx_allocate_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
1995 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
1996 wl12xx_allocate_rate_policy(wl,
1997 &wlvif->ap.ucast_rate_idx[i]);
2000 wlvif->bitrate_masks[IEEE80211_BAND_2GHZ] = wl->conf.tx.basic_rate;
2001 wlvif->bitrate_masks[IEEE80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5;
2002 wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2003 wlvif->basic_rate = CONF_TX_RATE_MASK_BASIC;
2004 wlvif->rate_set = CONF_TX_RATE_MASK_BASIC;
2005 wlvif->beacon_int = WL1271_DEFAULT_BEACON_INT;
2008 * mac80211 configures some values globally, while we treat them
2009 * per-interface. thus, on init, we have to copy them from wl
2011 wlvif->band = wl->band;
2012 wlvif->channel = wl->channel;
2013 wlvif->power_level = wl->power_level;
2015 INIT_WORK(&wlvif->rx_streaming_enable_work,
2016 wl1271_rx_streaming_enable_work);
2017 INIT_WORK(&wlvif->rx_streaming_disable_work,
2018 wl1271_rx_streaming_disable_work);
2019 INIT_DELAYED_WORK(&wlvif->pspoll_work, wl1271_pspoll_work);
2020 INIT_LIST_HEAD(&wlvif->list);
2022 setup_timer(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer,
2023 (unsigned long) wlvif);
2024 return 0;
2027 static bool wl12xx_init_fw(struct wl1271 *wl)
2029 int retries = WL1271_BOOT_RETRIES;
2030 bool booted = false;
2031 struct wiphy *wiphy = wl->hw->wiphy;
2032 int ret;
2034 while (retries) {
2035 retries--;
2036 ret = wl1271_chip_wakeup(wl);
2037 if (ret < 0)
2038 goto power_off;
2040 ret = wl1271_boot(wl);
2041 if (ret < 0)
2042 goto power_off;
2044 ret = wl1271_hw_init(wl);
2045 if (ret < 0)
2046 goto irq_disable;
2048 booted = true;
2049 break;
2051 irq_disable:
2052 mutex_unlock(&wl->mutex);
2053 /* Unlocking the mutex in the middle of handling is
2054 inherently unsafe. In this case we deem it safe to do,
2055 because we need to let any possibly pending IRQ out of
2056 the system (and while we are WL1271_STATE_OFF the IRQ
2057 work function will not do anything.) Also, any other
2058 possible concurrent operations will fail due to the
2059 current state, hence the wl1271 struct should be safe. */
2060 wl1271_disable_interrupts(wl);
2061 wl1271_flush_deferred_work(wl);
2062 cancel_work_sync(&wl->netstack_work);
2063 mutex_lock(&wl->mutex);
2064 power_off:
2065 wl1271_power_off(wl);
2068 if (!booted) {
2069 wl1271_error("firmware boot failed despite %d retries",
2070 WL1271_BOOT_RETRIES);
2071 goto out;
2074 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
2076 /* update hw/fw version info in wiphy struct */
2077 wiphy->hw_version = wl->chip.id;
2078 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
2079 sizeof(wiphy->fw_version));
2082 * Now we know if 11a is supported (info from the NVS), so disable
2083 * 11a channels if not supported
2085 if (!wl->enable_11a)
2086 wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
2088 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
2089 wl->enable_11a ? "" : "not ");
2091 wl->state = WL1271_STATE_ON;
2092 out:
2093 return booted;
2096 static int wl1271_op_add_interface(struct ieee80211_hw *hw,
2097 struct ieee80211_vif *vif)
2099 struct wl1271 *wl = hw->priv;
2100 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2101 int ret = 0;
2102 u8 role_type;
2103 bool booted = false;
2105 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
2106 ieee80211_vif_type_p2p(vif), vif->addr);
2108 mutex_lock(&wl->mutex);
2109 ret = wl1271_ps_elp_wakeup(wl);
2110 if (ret < 0)
2111 goto out_unlock;
2113 if (wl->vif) {
2114 wl1271_debug(DEBUG_MAC80211,
2115 "multiple vifs are not supported yet");
2116 ret = -EBUSY;
2117 goto out;
2121 * in some very corner case HW recovery scenarios its possible to
2122 * get here before __wl1271_op_remove_interface is complete, so
2123 * opt out if that is the case.
2125 if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) ||
2126 test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) {
2127 ret = -EBUSY;
2128 goto out;
2131 ret = wl12xx_init_vif_data(wl, vif);
2132 if (ret < 0)
2133 goto out;
2135 wlvif->wl = wl;
2136 role_type = wl12xx_get_role_type(wl, wlvif);
2137 if (role_type == WL12XX_INVALID_ROLE_TYPE) {
2138 ret = -EINVAL;
2139 goto out;
2143 * TODO: after the nvs issue will be solved, move this block
2144 * to start(), and make sure here the driver is ON.
2146 if (wl->state == WL1271_STATE_OFF) {
2148 * we still need this in order to configure the fw
2149 * while uploading the nvs
2151 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
2153 booted = wl12xx_init_fw(wl);
2154 if (!booted) {
2155 ret = -EINVAL;
2156 goto out;
2160 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2161 wlvif->bss_type == BSS_TYPE_IBSS) {
2163 * The device role is a special role used for
2164 * rx and tx frames prior to association (as
2165 * the STA role can get packets only from
2166 * its associated bssid)
2168 ret = wl12xx_cmd_role_enable(wl, vif->addr,
2169 WL1271_ROLE_DEVICE,
2170 &wlvif->dev_role_id);
2171 if (ret < 0)
2172 goto out;
2175 ret = wl12xx_cmd_role_enable(wl, vif->addr,
2176 role_type, &wlvif->role_id);
2177 if (ret < 0)
2178 goto out;
2180 ret = wl1271_init_vif_specific(wl, vif);
2181 if (ret < 0)
2182 goto out;
2184 wl->vif = vif;
2185 list_add(&wlvif->list, &wl->wlvif_list);
2186 set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags);
2188 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2189 wl->ap_count++;
2190 else
2191 wl->sta_count++;
2192 out:
2193 wl1271_ps_elp_sleep(wl);
2194 out_unlock:
2195 mutex_unlock(&wl->mutex);
2197 mutex_lock(&wl_list_mutex);
2198 if (!ret)
2199 list_add(&wl->list, &wl_list);
2200 mutex_unlock(&wl_list_mutex);
2202 return ret;
2205 static void __wl1271_op_remove_interface(struct wl1271 *wl,
2206 struct ieee80211_vif *vif,
2207 bool reset_tx_queues)
2209 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2210 int i, ret;
2212 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
2214 if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2215 return;
2217 wl->vif = NULL;
2219 /* because of hardware recovery, we may get here twice */
2220 if (wl->state != WL1271_STATE_ON)
2221 return;
2223 wl1271_info("down");
2225 /* enable dyn ps just in case (if left on due to fw crash etc) */
2226 if (wlvif->bss_type == BSS_TYPE_STA_BSS)
2227 ieee80211_enable_dyn_ps(vif);
2229 if (wl->scan.state != WL1271_SCAN_STATE_IDLE &&
2230 wl->scan_vif == vif) {
2231 wl->scan.state = WL1271_SCAN_STATE_IDLE;
2232 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
2233 wl->scan_vif = NULL;
2234 wl->scan.req = NULL;
2235 ieee80211_scan_completed(wl->hw, true);
2238 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
2239 /* disable active roles */
2240 ret = wl1271_ps_elp_wakeup(wl);
2241 if (ret < 0)
2242 goto deinit;
2244 if (wlvif->bss_type == BSS_TYPE_STA_BSS) {
2245 ret = wl12xx_cmd_role_disable(wl, &wlvif->dev_role_id);
2246 if (ret < 0)
2247 goto deinit;
2250 ret = wl12xx_cmd_role_disable(wl, &wlvif->role_id);
2251 if (ret < 0)
2252 goto deinit;
2254 wl1271_ps_elp_sleep(wl);
2256 deinit:
2257 /* clear all hlids (except system_hlid) */
2258 wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2260 if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2261 wlvif->bss_type == BSS_TYPE_IBSS) {
2262 wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2263 wl12xx_free_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2264 wl12xx_free_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2265 wl12xx_free_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2266 } else {
2267 wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2268 wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2269 wl12xx_free_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2270 wl12xx_free_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2271 for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2272 wl12xx_free_rate_policy(wl,
2273 &wlvif->ap.ucast_rate_idx[i]);
2276 wl12xx_tx_reset_wlvif(wl, wlvif);
2277 wl1271_free_ap_keys(wl, wlvif);
2278 if (wl->last_wlvif == wlvif)
2279 wl->last_wlvif = NULL;
2280 list_del(&wlvif->list);
2281 memset(wlvif->ap.sta_hlid_map, 0, sizeof(wlvif->ap.sta_hlid_map));
2282 wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2283 wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2285 if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2286 wl->ap_count--;
2287 else
2288 wl->sta_count--;
2290 mutex_unlock(&wl->mutex);
2291 del_timer_sync(&wlvif->rx_streaming_timer);
2292 cancel_work_sync(&wlvif->rx_streaming_enable_work);
2293 cancel_work_sync(&wlvif->rx_streaming_disable_work);
2294 cancel_delayed_work_sync(&wlvif->pspoll_work);
2296 mutex_lock(&wl->mutex);
2299 static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
2300 struct ieee80211_vif *vif)
2302 struct wl1271 *wl = hw->priv;
2303 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2304 struct wl12xx_vif *iter;
2306 mutex_lock(&wl->mutex);
2308 if (wl->state == WL1271_STATE_OFF ||
2309 !test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2310 goto out;
2313 * wl->vif can be null here if someone shuts down the interface
2314 * just when hardware recovery has been started.
2316 wl12xx_for_each_wlvif(wl, iter) {
2317 if (iter != wlvif)
2318 continue;
2320 __wl1271_op_remove_interface(wl, vif, true);
2321 break;
2323 WARN_ON(iter != wlvif);
2324 out:
2325 mutex_unlock(&wl->mutex);
2326 cancel_work_sync(&wl->recovery_work);
2329 static int wl1271_join(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2330 bool set_assoc)
2332 int ret;
2333 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
2336 * One of the side effects of the JOIN command is that is clears
2337 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
2338 * to a WPA/WPA2 access point will therefore kill the data-path.
2339 * Currently the only valid scenario for JOIN during association
2340 * is on roaming, in which case we will also be given new keys.
2341 * Keep the below message for now, unless it starts bothering
2342 * users who really like to roam a lot :)
2344 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2345 wl1271_info("JOIN while associated.");
2347 if (set_assoc)
2348 set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags);
2350 if (is_ibss)
2351 ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
2352 else
2353 ret = wl12xx_cmd_role_start_sta(wl, wlvif);
2354 if (ret < 0)
2355 goto out;
2357 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2358 goto out;
2361 * The join command disable the keep-alive mode, shut down its process,
2362 * and also clear the template config, so we need to reset it all after
2363 * the join. The acx_aid starts the keep-alive process, and the order
2364 * of the commands below is relevant.
2366 ret = wl1271_acx_keep_alive_mode(wl, wlvif, true);
2367 if (ret < 0)
2368 goto out;
2370 ret = wl1271_acx_aid(wl, wlvif, wlvif->aid);
2371 if (ret < 0)
2372 goto out;
2374 ret = wl12xx_cmd_build_klv_null_data(wl, wlvif);
2375 if (ret < 0)
2376 goto out;
2378 ret = wl1271_acx_keep_alive_config(wl, wlvif,
2379 CMD_TEMPL_KLV_IDX_NULL_DATA,
2380 ACX_KEEP_ALIVE_TPL_VALID);
2381 if (ret < 0)
2382 goto out;
2384 out:
2385 return ret;
2388 static int wl1271_unjoin(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2390 int ret;
2392 if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
2393 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2395 wl12xx_cmd_stop_channel_switch(wl);
2396 ieee80211_chswitch_done(vif, false);
2399 /* to stop listening to a channel, we disconnect */
2400 ret = wl12xx_cmd_role_stop_sta(wl, wlvif);
2401 if (ret < 0)
2402 goto out;
2404 /* reset TX security counters on a clean disconnect */
2405 wlvif->tx_security_last_seq_lsb = 0;
2406 wlvif->tx_security_seq = 0;
2408 out:
2409 return ret;
2412 static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2414 wlvif->basic_rate_set = wlvif->bitrate_masks[wlvif->band];
2415 wlvif->rate_set = wlvif->basic_rate_set;
2418 static bool wl12xx_is_roc(struct wl1271 *wl)
2420 u8 role_id;
2422 role_id = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
2423 if (role_id >= WL12XX_MAX_ROLES)
2424 return false;
2426 return true;
2429 static int wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2430 bool idle)
2432 int ret;
2434 if (idle) {
2435 /* no need to croc if we weren't busy (e.g. during boot) */
2436 if (wl12xx_is_roc(wl)) {
2437 ret = wl12xx_stop_dev(wl, wlvif);
2438 if (ret < 0)
2439 goto out;
2441 wlvif->rate_set =
2442 wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
2443 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
2444 if (ret < 0)
2445 goto out;
2446 ret = wl1271_acx_keep_alive_config(
2447 wl, wlvif, CMD_TEMPL_KLV_IDX_NULL_DATA,
2448 ACX_KEEP_ALIVE_TPL_INVALID);
2449 if (ret < 0)
2450 goto out;
2451 set_bit(WL1271_FLAG_IDLE, &wl->flags);
2452 } else {
2453 /* The current firmware only supports sched_scan in idle */
2454 if (wl->sched_scanning) {
2455 wl1271_scan_sched_scan_stop(wl);
2456 ieee80211_sched_scan_stopped(wl->hw);
2459 ret = wl12xx_start_dev(wl, wlvif);
2460 if (ret < 0)
2461 goto out;
2462 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
2465 out:
2466 return ret;
2469 static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2470 struct ieee80211_conf *conf, u32 changed)
2472 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
2473 int channel, ret;
2475 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
2477 /* if the channel changes while joined, join again */
2478 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
2479 ((wlvif->band != conf->channel->band) ||
2480 (wlvif->channel != channel))) {
2481 /* send all pending packets */
2482 wl1271_tx_work_locked(wl);
2483 wlvif->band = conf->channel->band;
2484 wlvif->channel = channel;
2486 if (!is_ap) {
2488 * FIXME: the mac80211 should really provide a fixed
2489 * rate to use here. for now, just use the smallest
2490 * possible rate for the band as a fixed rate for
2491 * association frames and other control messages.
2493 if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2494 wl1271_set_band_rate(wl, wlvif);
2496 wlvif->basic_rate =
2497 wl1271_tx_min_rate_get(wl,
2498 wlvif->basic_rate_set);
2499 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
2500 if (ret < 0)
2501 wl1271_warning("rate policy for channel "
2502 "failed %d", ret);
2504 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED,
2505 &wlvif->flags)) {
2506 if (wl12xx_is_roc(wl)) {
2507 /* roaming */
2508 ret = wl12xx_croc(wl,
2509 wlvif->dev_role_id);
2510 if (ret < 0)
2511 return ret;
2513 ret = wl1271_join(wl, wlvif, false);
2514 if (ret < 0)
2515 wl1271_warning("cmd join on channel "
2516 "failed %d", ret);
2517 } else {
2519 * change the ROC channel. do it only if we are
2520 * not idle. otherwise, CROC will be called
2521 * anyway.
2523 if (wl12xx_is_roc(wl) &&
2524 !(conf->flags & IEEE80211_CONF_IDLE)) {
2525 ret = wl12xx_stop_dev(wl, wlvif);
2526 if (ret < 0)
2527 return ret;
2529 ret = wl12xx_start_dev(wl, wlvif);
2530 if (ret < 0)
2531 return ret;
2537 if (changed & IEEE80211_CONF_CHANGE_IDLE && !is_ap) {
2538 ret = wl1271_sta_handle_idle(wl, wlvif,
2539 conf->flags & IEEE80211_CONF_IDLE);
2540 if (ret < 0)
2541 wl1271_warning("idle mode change failed %d", ret);
2545 * if mac80211 changes the PSM mode, make sure the mode is not
2546 * incorrectly changed after the pspoll failure active window.
2548 if (changed & IEEE80211_CONF_CHANGE_PS)
2549 clear_bit(WLVIF_FLAG_PSPOLL_FAILURE, &wlvif->flags);
2551 if (conf->flags & IEEE80211_CONF_PS &&
2552 !test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags)) {
2553 set_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags);
2556 * We enter PSM only if we're already associated.
2557 * If we're not, we'll enter it when joining an SSID,
2558 * through the bss_info_changed() hook.
2560 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
2561 wl1271_debug(DEBUG_PSM, "psm enabled");
2562 ret = wl1271_ps_set_mode(wl, wlvif,
2563 STATION_POWER_SAVE_MODE,
2564 wlvif->basic_rate, true);
2566 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
2567 test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags)) {
2568 wl1271_debug(DEBUG_PSM, "psm disabled");
2570 clear_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags);
2572 if (test_bit(WLVIF_FLAG_PSM, &wlvif->flags))
2573 ret = wl1271_ps_set_mode(wl, wlvif,
2574 STATION_ACTIVE_MODE,
2575 wlvif->basic_rate, true);
2578 if (conf->power_level != wlvif->power_level) {
2579 ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
2580 if (ret < 0)
2581 return ret;
2583 wlvif->power_level = conf->power_level;
2586 return 0;
2589 static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
2591 struct wl1271 *wl = hw->priv;
2592 struct wl12xx_vif *wlvif;
2593 struct ieee80211_conf *conf = &hw->conf;
2594 int channel, ret = 0;
2596 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
2598 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s"
2599 " changed 0x%x",
2600 channel,
2601 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
2602 conf->power_level,
2603 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
2604 changed);
2607 * mac80211 will go to idle nearly immediately after transmitting some
2608 * frames, such as the deauth. To make sure those frames reach the air,
2609 * wait here until the TX queue is fully flushed.
2611 if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
2612 (conf->flags & IEEE80211_CONF_IDLE))
2613 wl1271_tx_flush(wl);
2615 mutex_lock(&wl->mutex);
2617 /* we support configuring the channel and band even while off */
2618 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2619 wl->band = conf->channel->band;
2620 wl->channel = channel;
2623 if (changed & IEEE80211_CONF_CHANGE_POWER)
2624 wl->power_level = conf->power_level;
2626 if (unlikely(wl->state == WL1271_STATE_OFF))
2627 goto out;
2629 ret = wl1271_ps_elp_wakeup(wl);
2630 if (ret < 0)
2631 goto out;
2633 /* configure each interface */
2634 wl12xx_for_each_wlvif(wl, wlvif) {
2635 ret = wl12xx_config_vif(wl, wlvif, conf, changed);
2636 if (ret < 0)
2637 goto out_sleep;
2640 out_sleep:
2641 wl1271_ps_elp_sleep(wl);
2643 out:
2644 mutex_unlock(&wl->mutex);
2646 return ret;
2649 struct wl1271_filter_params {
2650 bool enabled;
2651 int mc_list_length;
2652 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
2655 static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
2656 struct netdev_hw_addr_list *mc_list)
2658 struct wl1271_filter_params *fp;
2659 struct netdev_hw_addr *ha;
2660 struct wl1271 *wl = hw->priv;
2662 if (unlikely(wl->state == WL1271_STATE_OFF))
2663 return 0;
2665 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
2666 if (!fp) {
2667 wl1271_error("Out of memory setting filters.");
2668 return 0;
2671 /* update multicast filtering parameters */
2672 fp->mc_list_length = 0;
2673 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
2674 fp->enabled = false;
2675 } else {
2676 fp->enabled = true;
2677 netdev_hw_addr_list_for_each(ha, mc_list) {
2678 memcpy(fp->mc_list[fp->mc_list_length],
2679 ha->addr, ETH_ALEN);
2680 fp->mc_list_length++;
2684 return (u64)(unsigned long)fp;
2687 #define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
2688 FIF_ALLMULTI | \
2689 FIF_FCSFAIL | \
2690 FIF_BCN_PRBRESP_PROMISC | \
2691 FIF_CONTROL | \
2692 FIF_OTHER_BSS)
2694 static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
2695 unsigned int changed,
2696 unsigned int *total, u64 multicast)
2698 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
2699 struct wl1271 *wl = hw->priv;
2700 struct wl12xx_vif *wlvif;
2702 int ret;
2704 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
2705 " total %x", changed, *total);
2707 mutex_lock(&wl->mutex);
2709 *total &= WL1271_SUPPORTED_FILTERS;
2710 changed &= WL1271_SUPPORTED_FILTERS;
2712 if (unlikely(wl->state == WL1271_STATE_OFF))
2713 goto out;
2715 ret = wl1271_ps_elp_wakeup(wl);
2716 if (ret < 0)
2717 goto out;
2719 wl12xx_for_each_wlvif(wl, wlvif) {
2720 if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
2721 if (*total & FIF_ALLMULTI)
2722 ret = wl1271_acx_group_address_tbl(wl, wlvif,
2723 false,
2724 NULL, 0);
2725 else if (fp)
2726 ret = wl1271_acx_group_address_tbl(wl, wlvif,
2727 fp->enabled,
2728 fp->mc_list,
2729 fp->mc_list_length);
2730 if (ret < 0)
2731 goto out_sleep;
2736 * the fw doesn't provide an api to configure the filters. instead,
2737 * the filters configuration is based on the active roles / ROC
2738 * state.
2741 out_sleep:
2742 wl1271_ps_elp_sleep(wl);
2744 out:
2745 mutex_unlock(&wl->mutex);
2746 kfree(fp);
2749 static int wl1271_record_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2750 u8 id, u8 key_type, u8 key_size,
2751 const u8 *key, u8 hlid, u32 tx_seq_32,
2752 u16 tx_seq_16)
2754 struct wl1271_ap_key *ap_key;
2755 int i;
2757 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
2759 if (key_size > MAX_KEY_SIZE)
2760 return -EINVAL;
2763 * Find next free entry in ap_keys. Also check we are not replacing
2764 * an existing key.
2766 for (i = 0; i < MAX_NUM_KEYS; i++) {
2767 if (wlvif->ap.recorded_keys[i] == NULL)
2768 break;
2770 if (wlvif->ap.recorded_keys[i]->id == id) {
2771 wl1271_warning("trying to record key replacement");
2772 return -EINVAL;
2776 if (i == MAX_NUM_KEYS)
2777 return -EBUSY;
2779 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
2780 if (!ap_key)
2781 return -ENOMEM;
2783 ap_key->id = id;
2784 ap_key->key_type = key_type;
2785 ap_key->key_size = key_size;
2786 memcpy(ap_key->key, key, key_size);
2787 ap_key->hlid = hlid;
2788 ap_key->tx_seq_32 = tx_seq_32;
2789 ap_key->tx_seq_16 = tx_seq_16;
2791 wlvif->ap.recorded_keys[i] = ap_key;
2792 return 0;
2795 static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2797 int i;
2799 for (i = 0; i < MAX_NUM_KEYS; i++) {
2800 kfree(wlvif->ap.recorded_keys[i]);
2801 wlvif->ap.recorded_keys[i] = NULL;
2805 static int wl1271_ap_init_hwenc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2807 int i, ret = 0;
2808 struct wl1271_ap_key *key;
2809 bool wep_key_added = false;
2811 for (i = 0; i < MAX_NUM_KEYS; i++) {
2812 u8 hlid;
2813 if (wlvif->ap.recorded_keys[i] == NULL)
2814 break;
2816 key = wlvif->ap.recorded_keys[i];
2817 hlid = key->hlid;
2818 if (hlid == WL12XX_INVALID_LINK_ID)
2819 hlid = wlvif->ap.bcast_hlid;
2821 ret = wl1271_cmd_set_ap_key(wl, wlvif, KEY_ADD_OR_REPLACE,
2822 key->id, key->key_type,
2823 key->key_size, key->key,
2824 hlid, key->tx_seq_32,
2825 key->tx_seq_16);
2826 if (ret < 0)
2827 goto out;
2829 if (key->key_type == KEY_WEP)
2830 wep_key_added = true;
2833 if (wep_key_added) {
2834 ret = wl12xx_cmd_set_default_wep_key(wl, wlvif->default_key,
2835 wlvif->ap.bcast_hlid);
2836 if (ret < 0)
2837 goto out;
2840 out:
2841 wl1271_free_ap_keys(wl, wlvif);
2842 return ret;
2845 static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2846 u16 action, u8 id, u8 key_type,
2847 u8 key_size, const u8 *key, u32 tx_seq_32,
2848 u16 tx_seq_16, struct ieee80211_sta *sta)
2850 int ret;
2851 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
2853 if (is_ap) {
2854 struct wl1271_station *wl_sta;
2855 u8 hlid;
2857 if (sta) {
2858 wl_sta = (struct wl1271_station *)sta->drv_priv;
2859 hlid = wl_sta->hlid;
2860 } else {
2861 hlid = wlvif->ap.bcast_hlid;
2864 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
2866 * We do not support removing keys after AP shutdown.
2867 * Pretend we do to make mac80211 happy.
2869 if (action != KEY_ADD_OR_REPLACE)
2870 return 0;
2872 ret = wl1271_record_ap_key(wl, wlvif, id,
2873 key_type, key_size,
2874 key, hlid, tx_seq_32,
2875 tx_seq_16);
2876 } else {
2877 ret = wl1271_cmd_set_ap_key(wl, wlvif, action,
2878 id, key_type, key_size,
2879 key, hlid, tx_seq_32,
2880 tx_seq_16);
2883 if (ret < 0)
2884 return ret;
2885 } else {
2886 const u8 *addr;
2887 static const u8 bcast_addr[ETH_ALEN] = {
2888 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2892 * A STA set to GEM cipher requires 2 tx spare blocks.
2893 * Return to default value when GEM cipher key is removed
2895 if (key_type == KEY_GEM) {
2896 if (action == KEY_ADD_OR_REPLACE)
2897 wl->tx_spare_blocks = 2;
2898 else if (action == KEY_REMOVE)
2899 wl->tx_spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
2902 addr = sta ? sta->addr : bcast_addr;
2904 if (is_zero_ether_addr(addr)) {
2905 /* We dont support TX only encryption */
2906 return -EOPNOTSUPP;
2909 /* The wl1271 does not allow to remove unicast keys - they
2910 will be cleared automatically on next CMD_JOIN. Ignore the
2911 request silently, as we dont want the mac80211 to emit
2912 an error message. */
2913 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
2914 return 0;
2916 /* don't remove key if hlid was already deleted */
2917 if (action == KEY_REMOVE &&
2918 wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)
2919 return 0;
2921 ret = wl1271_cmd_set_sta_key(wl, wlvif, action,
2922 id, key_type, key_size,
2923 key, addr, tx_seq_32,
2924 tx_seq_16);
2925 if (ret < 0)
2926 return ret;
2928 /* the default WEP key needs to be configured at least once */
2929 if (key_type == KEY_WEP) {
2930 ret = wl12xx_cmd_set_default_wep_key(wl,
2931 wlvif->default_key,
2932 wlvif->sta.hlid);
2933 if (ret < 0)
2934 return ret;
2938 return 0;
2941 static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2942 struct ieee80211_vif *vif,
2943 struct ieee80211_sta *sta,
2944 struct ieee80211_key_conf *key_conf)
2946 struct wl1271 *wl = hw->priv;
2947 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2948 int ret;
2949 u32 tx_seq_32 = 0;
2950 u16 tx_seq_16 = 0;
2951 u8 key_type;
2953 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
2955 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
2956 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
2957 key_conf->cipher, key_conf->keyidx,
2958 key_conf->keylen, key_conf->flags);
2959 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
2961 mutex_lock(&wl->mutex);
2963 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2964 ret = -EAGAIN;
2965 goto out_unlock;
2968 ret = wl1271_ps_elp_wakeup(wl);
2969 if (ret < 0)
2970 goto out_unlock;
2972 switch (key_conf->cipher) {
2973 case WLAN_CIPHER_SUITE_WEP40:
2974 case WLAN_CIPHER_SUITE_WEP104:
2975 key_type = KEY_WEP;
2977 key_conf->hw_key_idx = key_conf->keyidx;
2978 break;
2979 case WLAN_CIPHER_SUITE_TKIP:
2980 key_type = KEY_TKIP;
2982 key_conf->hw_key_idx = key_conf->keyidx;
2983 tx_seq_32 = WL1271_TX_SECURITY_HI32(wlvif->tx_security_seq);
2984 tx_seq_16 = WL1271_TX_SECURITY_LO16(wlvif->tx_security_seq);
2985 break;
2986 case WLAN_CIPHER_SUITE_CCMP:
2987 key_type = KEY_AES;
2989 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
2990 tx_seq_32 = WL1271_TX_SECURITY_HI32(wlvif->tx_security_seq);
2991 tx_seq_16 = WL1271_TX_SECURITY_LO16(wlvif->tx_security_seq);
2992 break;
2993 case WL1271_CIPHER_SUITE_GEM:
2994 key_type = KEY_GEM;
2995 tx_seq_32 = WL1271_TX_SECURITY_HI32(wlvif->tx_security_seq);
2996 tx_seq_16 = WL1271_TX_SECURITY_LO16(wlvif->tx_security_seq);
2997 break;
2998 default:
2999 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
3001 ret = -EOPNOTSUPP;
3002 goto out_sleep;
3005 switch (cmd) {
3006 case SET_KEY:
3007 ret = wl1271_set_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3008 key_conf->keyidx, key_type,
3009 key_conf->keylen, key_conf->key,
3010 tx_seq_32, tx_seq_16, sta);
3011 if (ret < 0) {
3012 wl1271_error("Could not add or replace key");
3013 goto out_sleep;
3015 break;
3017 case DISABLE_KEY:
3018 ret = wl1271_set_key(wl, wlvif, KEY_REMOVE,
3019 key_conf->keyidx, key_type,
3020 key_conf->keylen, key_conf->key,
3021 0, 0, sta);
3022 if (ret < 0) {
3023 wl1271_error("Could not remove key");
3024 goto out_sleep;
3026 break;
3028 default:
3029 wl1271_error("Unsupported key cmd 0x%x", cmd);
3030 ret = -EOPNOTSUPP;
3031 break;
3034 out_sleep:
3035 wl1271_ps_elp_sleep(wl);
3037 out_unlock:
3038 mutex_unlock(&wl->mutex);
3040 return ret;
3043 static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
3044 struct ieee80211_vif *vif,
3045 struct cfg80211_scan_request *req)
3047 struct wl1271 *wl = hw->priv;
3048 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3050 int ret;
3051 u8 *ssid = NULL;
3052 size_t len = 0;
3054 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
3056 if (req->n_ssids) {
3057 ssid = req->ssids[0].ssid;
3058 len = req->ssids[0].ssid_len;
3061 mutex_lock(&wl->mutex);
3063 if (wl->state == WL1271_STATE_OFF) {
3065 * We cannot return -EBUSY here because cfg80211 will expect
3066 * a call to ieee80211_scan_completed if we do - in this case
3067 * there won't be any call.
3069 ret = -EAGAIN;
3070 goto out;
3073 ret = wl1271_ps_elp_wakeup(wl);
3074 if (ret < 0)
3075 goto out;
3077 /* cancel ROC before scanning */
3078 if (wl12xx_is_roc(wl)) {
3079 if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
3080 /* don't allow scanning right now */
3081 ret = -EBUSY;
3082 goto out_sleep;
3084 wl12xx_stop_dev(wl, wlvif);
3087 ret = wl1271_scan(hw->priv, vif, ssid, len, req);
3088 out_sleep:
3089 wl1271_ps_elp_sleep(wl);
3090 out:
3091 mutex_unlock(&wl->mutex);
3093 return ret;
3096 static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw,
3097 struct ieee80211_vif *vif)
3099 struct wl1271 *wl = hw->priv;
3100 int ret;
3102 wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan");
3104 mutex_lock(&wl->mutex);
3106 if (wl->state == WL1271_STATE_OFF)
3107 goto out;
3109 if (wl->scan.state == WL1271_SCAN_STATE_IDLE)
3110 goto out;
3112 ret = wl1271_ps_elp_wakeup(wl);
3113 if (ret < 0)
3114 goto out;
3116 if (wl->scan.state != WL1271_SCAN_STATE_DONE) {
3117 ret = wl1271_scan_stop(wl);
3118 if (ret < 0)
3119 goto out_sleep;
3121 wl->scan.state = WL1271_SCAN_STATE_IDLE;
3122 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
3123 wl->scan_vif = NULL;
3124 wl->scan.req = NULL;
3125 ieee80211_scan_completed(wl->hw, true);
3127 out_sleep:
3128 wl1271_ps_elp_sleep(wl);
3129 out:
3130 mutex_unlock(&wl->mutex);
3132 cancel_delayed_work_sync(&wl->scan_complete_work);
3135 static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
3136 struct ieee80211_vif *vif,
3137 struct cfg80211_sched_scan_request *req,
3138 struct ieee80211_sched_scan_ies *ies)
3140 struct wl1271 *wl = hw->priv;
3141 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3142 int ret;
3144 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start");
3146 mutex_lock(&wl->mutex);
3148 ret = wl1271_ps_elp_wakeup(wl);
3149 if (ret < 0)
3150 goto out;
3152 ret = wl1271_scan_sched_scan_config(wl, wlvif, req, ies);
3153 if (ret < 0)
3154 goto out_sleep;
3156 ret = wl1271_scan_sched_scan_start(wl, wlvif);
3157 if (ret < 0)
3158 goto out_sleep;
3160 wl->sched_scanning = true;
3162 out_sleep:
3163 wl1271_ps_elp_sleep(wl);
3164 out:
3165 mutex_unlock(&wl->mutex);
3166 return ret;
3169 static void wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
3170 struct ieee80211_vif *vif)
3172 struct wl1271 *wl = hw->priv;
3173 int ret;
3175 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop");
3177 mutex_lock(&wl->mutex);
3179 ret = wl1271_ps_elp_wakeup(wl);
3180 if (ret < 0)
3181 goto out;
3183 wl1271_scan_sched_scan_stop(wl);
3185 wl1271_ps_elp_sleep(wl);
3186 out:
3187 mutex_unlock(&wl->mutex);
3190 static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3192 struct wl1271 *wl = hw->priv;
3193 int ret = 0;
3195 mutex_lock(&wl->mutex);
3197 if (unlikely(wl->state == WL1271_STATE_OFF)) {
3198 ret = -EAGAIN;
3199 goto out;
3202 ret = wl1271_ps_elp_wakeup(wl);
3203 if (ret < 0)
3204 goto out;
3206 ret = wl1271_acx_frag_threshold(wl, value);
3207 if (ret < 0)
3208 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
3210 wl1271_ps_elp_sleep(wl);
3212 out:
3213 mutex_unlock(&wl->mutex);
3215 return ret;
3218 static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3220 struct wl1271 *wl = hw->priv;
3221 struct wl12xx_vif *wlvif;
3222 int ret = 0;
3224 mutex_lock(&wl->mutex);
3226 if (unlikely(wl->state == WL1271_STATE_OFF)) {
3227 ret = -EAGAIN;
3228 goto out;
3231 ret = wl1271_ps_elp_wakeup(wl);
3232 if (ret < 0)
3233 goto out;
3235 wl12xx_for_each_wlvif(wl, wlvif) {
3236 ret = wl1271_acx_rts_threshold(wl, wlvif, value);
3237 if (ret < 0)
3238 wl1271_warning("set rts threshold failed: %d", ret);
3240 wl1271_ps_elp_sleep(wl);
3242 out:
3243 mutex_unlock(&wl->mutex);
3245 return ret;
3248 static int wl1271_ssid_set(struct ieee80211_vif *vif, struct sk_buff *skb,
3249 int offset)
3251 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3252 u8 ssid_len;
3253 const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset,
3254 skb->len - offset);
3256 if (!ptr) {
3257 wl1271_error("No SSID in IEs!");
3258 return -ENOENT;
3261 ssid_len = ptr[1];
3262 if (ssid_len > IEEE80211_MAX_SSID_LEN) {
3263 wl1271_error("SSID is too long!");
3264 return -EINVAL;
3267 wlvif->ssid_len = ssid_len;
3268 memcpy(wlvif->ssid, ptr+2, ssid_len);
3269 return 0;
3272 static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset)
3274 int len;
3275 const u8 *next, *end = skb->data + skb->len;
3276 u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset,
3277 skb->len - ieoffset);
3278 if (!ie)
3279 return;
3280 len = ie[1] + 2;
3281 next = ie + len;
3282 memmove(ie, next, end - next);
3283 skb_trim(skb, skb->len - len);
3286 static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
3287 unsigned int oui, u8 oui_type,
3288 int ieoffset)
3290 int len;
3291 const u8 *next, *end = skb->data + skb->len;
3292 u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
3293 skb->data + ieoffset,
3294 skb->len - ieoffset);
3295 if (!ie)
3296 return;
3297 len = ie[1] + 2;
3298 next = ie + len;
3299 memmove(ie, next, end - next);
3300 skb_trim(skb, skb->len - len);
3303 static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl,
3304 struct ieee80211_vif *vif,
3305 u8 *probe_rsp_data,
3306 size_t probe_rsp_len,
3307 u32 rates)
3309 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3310 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
3311 u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE];
3312 int ssid_ie_offset, ie_offset, templ_len;
3313 const u8 *ptr;
3315 /* no need to change probe response if the SSID is set correctly */
3316 if (wlvif->ssid_len > 0)
3317 return wl1271_cmd_template_set(wl,
3318 CMD_TEMPL_AP_PROBE_RESPONSE,
3319 probe_rsp_data,
3320 probe_rsp_len, 0,
3321 rates);
3323 if (probe_rsp_len + bss_conf->ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) {
3324 wl1271_error("probe_rsp template too big");
3325 return -EINVAL;
3328 /* start searching from IE offset */
3329 ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
3331 ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset,
3332 probe_rsp_len - ie_offset);
3333 if (!ptr) {
3334 wl1271_error("No SSID in beacon!");
3335 return -EINVAL;
3338 ssid_ie_offset = ptr - probe_rsp_data;
3339 ptr += (ptr[1] + 2);
3341 memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset);
3343 /* insert SSID from bss_conf */
3344 probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID;
3345 probe_rsp_templ[ssid_ie_offset + 1] = bss_conf->ssid_len;
3346 memcpy(probe_rsp_templ + ssid_ie_offset + 2,
3347 bss_conf->ssid, bss_conf->ssid_len);
3348 templ_len = ssid_ie_offset + 2 + bss_conf->ssid_len;
3350 memcpy(probe_rsp_templ + ssid_ie_offset + 2 + bss_conf->ssid_len,
3351 ptr, probe_rsp_len - (ptr - probe_rsp_data));
3352 templ_len += probe_rsp_len - (ptr - probe_rsp_data);
3354 return wl1271_cmd_template_set(wl,
3355 CMD_TEMPL_AP_PROBE_RESPONSE,
3356 probe_rsp_templ,
3357 templ_len, 0,
3358 rates);
3361 static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
3362 struct ieee80211_vif *vif,
3363 struct ieee80211_bss_conf *bss_conf,
3364 u32 changed)
3366 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3367 int ret = 0;
3369 if (changed & BSS_CHANGED_ERP_SLOT) {
3370 if (bss_conf->use_short_slot)
3371 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_SHORT);
3372 else
3373 ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_LONG);
3374 if (ret < 0) {
3375 wl1271_warning("Set slot time failed %d", ret);
3376 goto out;
3380 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3381 if (bss_conf->use_short_preamble)
3382 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_SHORT);
3383 else
3384 wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_LONG);
3387 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3388 if (bss_conf->use_cts_prot)
3389 ret = wl1271_acx_cts_protect(wl, wlvif,
3390 CTSPROTECT_ENABLE);
3391 else
3392 ret = wl1271_acx_cts_protect(wl, wlvif,
3393 CTSPROTECT_DISABLE);
3394 if (ret < 0) {
3395 wl1271_warning("Set ctsprotect failed %d", ret);
3396 goto out;
3400 out:
3401 return ret;
3404 static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
3405 struct ieee80211_vif *vif,
3406 struct ieee80211_bss_conf *bss_conf,
3407 u32 changed)
3409 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3410 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
3411 int ret = 0;
3413 if ((changed & BSS_CHANGED_BEACON_INT)) {
3414 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
3415 bss_conf->beacon_int);
3417 wlvif->beacon_int = bss_conf->beacon_int;
3420 if ((changed & BSS_CHANGED_BEACON)) {
3421 struct ieee80211_hdr *hdr;
3422 u32 min_rate;
3423 int ieoffset = offsetof(struct ieee80211_mgmt,
3424 u.beacon.variable);
3425 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
3426 u16 tmpl_id;
3428 if (!beacon)
3429 goto out;
3431 wl1271_debug(DEBUG_MASTER, "beacon updated");
3433 ret = wl1271_ssid_set(vif, beacon, ieoffset);
3434 if (ret < 0) {
3435 dev_kfree_skb(beacon);
3436 goto out;
3438 min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
3439 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
3440 CMD_TEMPL_BEACON;
3441 ret = wl1271_cmd_template_set(wl, tmpl_id,
3442 beacon->data,
3443 beacon->len, 0,
3444 min_rate);
3445 if (ret < 0) {
3446 dev_kfree_skb(beacon);
3447 goto out;
3450 /* remove TIM ie from probe response */
3451 wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset);
3454 * remove p2p ie from probe response.
3455 * the fw reponds to probe requests that don't include
3456 * the p2p ie. probe requests with p2p ie will be passed,
3457 * and will be responded by the supplicant (the spec
3458 * forbids including the p2p ie when responding to probe
3459 * requests that didn't include it).
3461 wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA,
3462 WLAN_OUI_TYPE_WFA_P2P, ieoffset);
3464 hdr = (struct ieee80211_hdr *) beacon->data;
3465 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
3466 IEEE80211_STYPE_PROBE_RESP);
3467 if (is_ap)
3468 ret = wl1271_ap_set_probe_resp_tmpl(wl, vif,
3469 beacon->data,
3470 beacon->len,
3471 min_rate);
3472 else
3473 ret = wl1271_cmd_template_set(wl,
3474 CMD_TEMPL_PROBE_RESPONSE,
3475 beacon->data,
3476 beacon->len, 0,
3477 min_rate);
3478 dev_kfree_skb(beacon);
3479 if (ret < 0)
3480 goto out;
3483 out:
3484 return ret;
3487 /* AP mode changes */
3488 static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
3489 struct ieee80211_vif *vif,
3490 struct ieee80211_bss_conf *bss_conf,
3491 u32 changed)
3493 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3494 int ret = 0;
3496 if ((changed & BSS_CHANGED_BASIC_RATES)) {
3497 u32 rates = bss_conf->basic_rates;
3499 wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
3500 wlvif->band);
3501 wlvif->basic_rate = wl1271_tx_min_rate_get(wl,
3502 wlvif->basic_rate_set);
3504 ret = wl1271_init_ap_rates(wl, wlvif);
3505 if (ret < 0) {
3506 wl1271_error("AP rate policy change failed %d", ret);
3507 goto out;
3510 ret = wl1271_ap_init_templates(wl, vif);
3511 if (ret < 0)
3512 goto out;
3515 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
3516 if (ret < 0)
3517 goto out;
3519 if ((changed & BSS_CHANGED_BEACON_ENABLED)) {
3520 if (bss_conf->enable_beacon) {
3521 if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
3522 ret = wl12xx_cmd_role_start_ap(wl, wlvif);
3523 if (ret < 0)
3524 goto out;
3526 ret = wl1271_ap_init_hwenc(wl, wlvif);
3527 if (ret < 0)
3528 goto out;
3530 set_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
3531 wl1271_debug(DEBUG_AP, "started AP");
3533 } else {
3534 if (test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
3535 ret = wl12xx_cmd_role_stop_ap(wl, wlvif);
3536 if (ret < 0)
3537 goto out;
3539 clear_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
3540 wl1271_debug(DEBUG_AP, "stopped AP");
3545 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
3546 if (ret < 0)
3547 goto out;
3549 /* Handle HT information change */
3550 if ((changed & BSS_CHANGED_HT) &&
3551 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
3552 ret = wl1271_acx_set_ht_information(wl, wlvif,
3553 bss_conf->ht_operation_mode);
3554 if (ret < 0) {
3555 wl1271_warning("Set ht information failed %d", ret);
3556 goto out;
3560 out:
3561 return;
3564 /* STA/IBSS mode changes */
3565 static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
3566 struct ieee80211_vif *vif,
3567 struct ieee80211_bss_conf *bss_conf,
3568 u32 changed)
3570 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3571 bool do_join = false, set_assoc = false;
3572 bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
3573 bool ibss_joined = false;
3574 u32 sta_rate_set = 0;
3575 int ret;
3576 struct ieee80211_sta *sta;
3577 bool sta_exists = false;
3578 struct ieee80211_sta_ht_cap sta_ht_cap;
3580 if (is_ibss) {
3581 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
3582 changed);
3583 if (ret < 0)
3584 goto out;
3587 if (changed & BSS_CHANGED_IBSS) {
3588 if (bss_conf->ibss_joined) {
3589 set_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags);
3590 ibss_joined = true;
3591 } else {
3592 if (test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED,
3593 &wlvif->flags)) {
3594 wl1271_unjoin(wl, wlvif);
3595 wl12xx_start_dev(wl, wlvif);
3600 if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined)
3601 do_join = true;
3603 /* Need to update the SSID (for filtering etc) */
3604 if ((changed & BSS_CHANGED_BEACON) && ibss_joined)
3605 do_join = true;
3607 if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) {
3608 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
3609 bss_conf->enable_beacon ? "enabled" : "disabled");
3611 do_join = true;
3614 if ((changed & BSS_CHANGED_CQM)) {
3615 bool enable = false;
3616 if (bss_conf->cqm_rssi_thold)
3617 enable = true;
3618 ret = wl1271_acx_rssi_snr_trigger(wl, wlvif, enable,
3619 bss_conf->cqm_rssi_thold,
3620 bss_conf->cqm_rssi_hyst);
3621 if (ret < 0)
3622 goto out;
3623 wlvif->rssi_thold = bss_conf->cqm_rssi_thold;
3626 if (changed & BSS_CHANGED_BSSID)
3627 if (!is_zero_ether_addr(bss_conf->bssid)) {
3628 ret = wl12xx_cmd_build_null_data(wl, wlvif);
3629 if (ret < 0)
3630 goto out;
3632 ret = wl1271_build_qos_null_data(wl, vif);
3633 if (ret < 0)
3634 goto out;
3636 /* Need to update the BSSID (for filtering etc) */
3637 do_join = true;
3640 if (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_HT)) {
3641 rcu_read_lock();
3642 sta = ieee80211_find_sta(vif, bss_conf->bssid);
3643 if (!sta)
3644 goto sta_not_found;
3646 /* save the supp_rates of the ap */
3647 sta_rate_set = sta->supp_rates[wl->hw->conf.channel->band];
3648 if (sta->ht_cap.ht_supported)
3649 sta_rate_set |=
3650 (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
3651 sta_ht_cap = sta->ht_cap;
3652 sta_exists = true;
3654 sta_not_found:
3655 rcu_read_unlock();
3658 if ((changed & BSS_CHANGED_ASSOC)) {
3659 if (bss_conf->assoc) {
3660 u32 rates;
3661 int ieoffset;
3662 wlvif->aid = bss_conf->aid;
3663 set_assoc = true;
3665 wlvif->ps_poll_failures = 0;
3668 * use basic rates from AP, and determine lowest rate
3669 * to use with control frames.
3671 rates = bss_conf->basic_rates;
3672 wlvif->basic_rate_set =
3673 wl1271_tx_enabled_rates_get(wl, rates,
3674 wlvif->band);
3675 wlvif->basic_rate =
3676 wl1271_tx_min_rate_get(wl,
3677 wlvif->basic_rate_set);
3678 if (sta_rate_set)
3679 wlvif->rate_set =
3680 wl1271_tx_enabled_rates_get(wl,
3681 sta_rate_set,
3682 wlvif->band);
3683 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
3684 if (ret < 0)
3685 goto out;
3688 * with wl1271, we don't need to update the
3689 * beacon_int and dtim_period, because the firmware
3690 * updates it by itself when the first beacon is
3691 * received after a join.
3693 ret = wl1271_cmd_build_ps_poll(wl, wlvif, wlvif->aid);
3694 if (ret < 0)
3695 goto out;
3698 * Get a template for hardware connection maintenance
3700 dev_kfree_skb(wlvif->probereq);
3701 wlvif->probereq = wl1271_cmd_build_ap_probe_req(wl,
3702 wlvif,
3703 NULL);
3704 ieoffset = offsetof(struct ieee80211_mgmt,
3705 u.probe_req.variable);
3706 wl1271_ssid_set(vif, wlvif->probereq, ieoffset);
3708 /* enable the connection monitoring feature */
3709 ret = wl1271_acx_conn_monit_params(wl, wlvif, true);
3710 if (ret < 0)
3711 goto out;
3712 } else {
3713 /* use defaults when not associated */
3714 bool was_assoc =
3715 !!test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED,
3716 &wlvif->flags);
3717 bool was_ifup =
3718 !!test_and_clear_bit(WLVIF_FLAG_STA_STATE_SENT,
3719 &wlvif->flags);
3720 wlvif->aid = 0;
3722 /* free probe-request template */
3723 dev_kfree_skb(wlvif->probereq);
3724 wlvif->probereq = NULL;
3726 /* re-enable dynamic ps - just in case */
3727 ieee80211_enable_dyn_ps(vif);
3729 /* revert back to minimum rates for the current band */
3730 wl1271_set_band_rate(wl, wlvif);
3731 wlvif->basic_rate =
3732 wl1271_tx_min_rate_get(wl,
3733 wlvif->basic_rate_set);
3734 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
3735 if (ret < 0)
3736 goto out;
3738 /* disable connection monitor features */
3739 ret = wl1271_acx_conn_monit_params(wl, wlvif, false);
3741 /* Disable the keep-alive feature */
3742 ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
3743 if (ret < 0)
3744 goto out;
3746 /* restore the bssid filter and go to dummy bssid */
3747 if (was_assoc) {
3748 u32 conf_flags = wl->hw->conf.flags;
3750 * we might have to disable roc, if there was
3751 * no IF_OPER_UP notification.
3753 if (!was_ifup) {
3754 ret = wl12xx_croc(wl, wlvif->role_id);
3755 if (ret < 0)
3756 goto out;
3759 * (we also need to disable roc in case of
3760 * roaming on the same channel. until we will
3761 * have a better flow...)
3763 if (test_bit(wlvif->dev_role_id, wl->roc_map)) {
3764 ret = wl12xx_croc(wl,
3765 wlvif->dev_role_id);
3766 if (ret < 0)
3767 goto out;
3770 wl1271_unjoin(wl, wlvif);
3771 if (!(conf_flags & IEEE80211_CONF_IDLE))
3772 wl12xx_start_dev(wl, wlvif);
3777 if (changed & BSS_CHANGED_IBSS) {
3778 wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d",
3779 bss_conf->ibss_joined);
3781 if (bss_conf->ibss_joined) {
3782 u32 rates = bss_conf->basic_rates;
3783 wlvif->basic_rate_set =
3784 wl1271_tx_enabled_rates_get(wl, rates,
3785 wlvif->band);
3786 wlvif->basic_rate =
3787 wl1271_tx_min_rate_get(wl,
3788 wlvif->basic_rate_set);
3790 /* by default, use 11b + OFDM rates */
3791 wlvif->rate_set = CONF_TX_IBSS_DEFAULT_RATES;
3792 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
3793 if (ret < 0)
3794 goto out;
3798 ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
3799 if (ret < 0)
3800 goto out;
3802 if (changed & BSS_CHANGED_ARP_FILTER) {
3803 __be32 addr = bss_conf->arp_addr_list[0];
3804 WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
3806 if (bss_conf->arp_addr_cnt == 1 &&
3807 bss_conf->arp_filter_enabled) {
3809 * The template should have been configured only upon
3810 * association. however, it seems that the correct ip
3811 * isn't being set (when sending), so we have to
3812 * reconfigure the template upon every ip change.
3814 ret = wl1271_cmd_build_arp_rsp(wl, wlvif, addr);
3815 if (ret < 0) {
3816 wl1271_warning("build arp rsp failed: %d", ret);
3817 goto out;
3820 ret = wl1271_acx_arp_ip_filter(wl, wlvif,
3821 ACX_ARP_FILTER_ARP_FILTERING,
3822 addr);
3823 } else
3824 ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
3826 if (ret < 0)
3827 goto out;
3830 if (do_join) {
3831 ret = wl1271_join(wl, wlvif, set_assoc);
3832 if (ret < 0) {
3833 wl1271_warning("cmd join failed %d", ret);
3834 goto out;
3837 /* ROC until connected (after EAPOL exchange) */
3838 if (!is_ibss) {
3839 ret = wl12xx_roc(wl, wlvif, wlvif->role_id);
3840 if (ret < 0)
3841 goto out;
3843 wl1271_check_operstate(wl, wlvif,
3844 ieee80211_get_operstate(vif));
3847 * stop device role if started (we might already be in
3848 * STA role). TODO: make it better.
3850 if (wlvif->dev_role_id != WL12XX_INVALID_ROLE_ID) {
3851 ret = wl12xx_stop_dev(wl, wlvif);
3852 if (ret < 0)
3853 goto out;
3856 /* If we want to go in PSM but we're not there yet */
3857 if (test_bit(WLVIF_FLAG_PSM_REQUESTED, &wlvif->flags) &&
3858 !test_bit(WLVIF_FLAG_PSM, &wlvif->flags)) {
3859 enum wl1271_cmd_ps_mode mode;
3861 mode = STATION_POWER_SAVE_MODE;
3862 ret = wl1271_ps_set_mode(wl, wlvif, mode,
3863 wlvif->basic_rate,
3864 true);
3865 if (ret < 0)
3866 goto out;
3870 /* Handle new association with HT. Do this after join. */
3871 if (sta_exists) {
3872 if ((changed & BSS_CHANGED_HT) &&
3873 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
3874 ret = wl1271_acx_set_ht_capabilities(wl,
3875 &sta_ht_cap,
3876 true,
3877 wlvif->sta.hlid);
3878 if (ret < 0) {
3879 wl1271_warning("Set ht cap true failed %d",
3880 ret);
3881 goto out;
3884 /* handle new association without HT and disassociation */
3885 else if (changed & BSS_CHANGED_ASSOC) {
3886 ret = wl1271_acx_set_ht_capabilities(wl,
3887 &sta_ht_cap,
3888 false,
3889 wlvif->sta.hlid);
3890 if (ret < 0) {
3891 wl1271_warning("Set ht cap false failed %d",
3892 ret);
3893 goto out;
3898 /* Handle HT information change. Done after join. */
3899 if ((changed & BSS_CHANGED_HT) &&
3900 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
3901 ret = wl1271_acx_set_ht_information(wl, wlvif,
3902 bss_conf->ht_operation_mode);
3903 if (ret < 0) {
3904 wl1271_warning("Set ht information failed %d", ret);
3905 goto out;
3909 out:
3910 return;
3913 static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
3914 struct ieee80211_vif *vif,
3915 struct ieee80211_bss_conf *bss_conf,
3916 u32 changed)
3918 struct wl1271 *wl = hw->priv;
3919 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3920 bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
3921 int ret;
3923 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed 0x%x",
3924 (int)changed);
3926 mutex_lock(&wl->mutex);
3928 if (unlikely(wl->state == WL1271_STATE_OFF))
3929 goto out;
3931 if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
3932 goto out;
3934 ret = wl1271_ps_elp_wakeup(wl);
3935 if (ret < 0)
3936 goto out;
3938 if (is_ap)
3939 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
3940 else
3941 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
3943 wl1271_ps_elp_sleep(wl);
3945 out:
3946 mutex_unlock(&wl->mutex);
3949 static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
3950 struct ieee80211_vif *vif, u16 queue,
3951 const struct ieee80211_tx_queue_params *params)
3953 struct wl1271 *wl = hw->priv;
3954 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3955 u8 ps_scheme;
3956 int ret = 0;
3958 mutex_lock(&wl->mutex);
3960 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
3962 if (params->uapsd)
3963 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
3964 else
3965 ps_scheme = CONF_PS_SCHEME_LEGACY;
3967 if (wl->state == WL1271_STATE_OFF) {
3969 * If the state is off, the parameters will be recorded and
3970 * configured on init. This happens in AP-mode.
3972 struct conf_tx_ac_category *conf_ac =
3973 &wl->conf.tx.ac_conf[wl1271_tx_get_queue(queue)];
3974 struct conf_tx_tid *conf_tid =
3975 &wl->conf.tx.tid_conf[wl1271_tx_get_queue(queue)];
3977 conf_ac->ac = wl1271_tx_get_queue(queue);
3978 conf_ac->cw_min = (u8)params->cw_min;
3979 conf_ac->cw_max = params->cw_max;
3980 conf_ac->aifsn = params->aifs;
3981 conf_ac->tx_op_limit = params->txop << 5;
3983 conf_tid->queue_id = wl1271_tx_get_queue(queue);
3984 conf_tid->channel_type = CONF_CHANNEL_TYPE_EDCF;
3985 conf_tid->tsid = wl1271_tx_get_queue(queue);
3986 conf_tid->ps_scheme = ps_scheme;
3987 conf_tid->ack_policy = CONF_ACK_POLICY_LEGACY;
3988 conf_tid->apsd_conf[0] = 0;
3989 conf_tid->apsd_conf[1] = 0;
3990 goto out;
3993 ret = wl1271_ps_elp_wakeup(wl);
3994 if (ret < 0)
3995 goto out;
3998 * the txop is confed in units of 32us by the mac80211,
3999 * we need us
4001 ret = wl1271_acx_ac_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4002 params->cw_min, params->cw_max,
4003 params->aifs, params->txop << 5);
4004 if (ret < 0)
4005 goto out_sleep;
4007 ret = wl1271_acx_tid_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4008 CONF_CHANNEL_TYPE_EDCF,
4009 wl1271_tx_get_queue(queue),
4010 ps_scheme, CONF_ACK_POLICY_LEGACY,
4011 0, 0);
4013 out_sleep:
4014 wl1271_ps_elp_sleep(wl);
4016 out:
4017 mutex_unlock(&wl->mutex);
4019 return ret;
4022 static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
4023 struct ieee80211_vif *vif)
4026 struct wl1271 *wl = hw->priv;
4027 u64 mactime = ULLONG_MAX;
4028 int ret;
4030 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
4032 mutex_lock(&wl->mutex);
4034 if (unlikely(wl->state == WL1271_STATE_OFF))
4035 goto out;
4037 ret = wl1271_ps_elp_wakeup(wl);
4038 if (ret < 0)
4039 goto out;
4041 ret = wl1271_acx_tsf_info(wl, &mactime);
4042 if (ret < 0)
4043 goto out_sleep;
4045 out_sleep:
4046 wl1271_ps_elp_sleep(wl);
4048 out:
4049 mutex_unlock(&wl->mutex);
4050 return mactime;
4053 static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
4054 struct survey_info *survey)
4056 struct wl1271 *wl = hw->priv;
4057 struct ieee80211_conf *conf = &hw->conf;
4059 if (idx != 0)
4060 return -ENOENT;
4062 survey->channel = conf->channel;
4063 survey->filled = SURVEY_INFO_NOISE_DBM;
4064 survey->noise = wl->noise;
4066 return 0;
4069 static int wl1271_allocate_sta(struct wl1271 *wl,
4070 struct wl12xx_vif *wlvif,
4071 struct ieee80211_sta *sta)
4073 struct wl1271_station *wl_sta;
4074 int ret;
4077 if (wl->active_sta_count >= AP_MAX_STATIONS) {
4078 wl1271_warning("could not allocate HLID - too much stations");
4079 return -EBUSY;
4082 wl_sta = (struct wl1271_station *)sta->drv_priv;
4083 ret = wl12xx_allocate_link(wl, wlvif, &wl_sta->hlid);
4084 if (ret < 0) {
4085 wl1271_warning("could not allocate HLID - too many links");
4086 return -EBUSY;
4089 set_bit(wl_sta->hlid, wlvif->ap.sta_hlid_map);
4090 memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
4091 wl->active_sta_count++;
4092 return 0;
4095 void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid)
4097 if (!test_bit(hlid, wlvif->ap.sta_hlid_map))
4098 return;
4100 clear_bit(hlid, wlvif->ap.sta_hlid_map);
4101 memset(wl->links[hlid].addr, 0, ETH_ALEN);
4102 wl->links[hlid].ba_bitmap = 0;
4103 wl1271_tx_reset_link_queues(wl, hlid);
4104 __clear_bit(hlid, &wl->ap_ps_map);
4105 __clear_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
4106 wl12xx_free_link(wl, wlvif, &hlid);
4107 wl->active_sta_count--;
4110 static int wl1271_op_sta_add(struct ieee80211_hw *hw,
4111 struct ieee80211_vif *vif,
4112 struct ieee80211_sta *sta)
4114 struct wl1271 *wl = hw->priv;
4115 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4116 struct wl1271_station *wl_sta;
4117 int ret = 0;
4118 u8 hlid;
4120 mutex_lock(&wl->mutex);
4122 if (unlikely(wl->state == WL1271_STATE_OFF))
4123 goto out;
4125 if (wlvif->bss_type != BSS_TYPE_AP_BSS)
4126 goto out;
4128 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
4130 ret = wl1271_allocate_sta(wl, wlvif, sta);
4131 if (ret < 0)
4132 goto out;
4134 wl_sta = (struct wl1271_station *)sta->drv_priv;
4135 hlid = wl_sta->hlid;
4137 ret = wl1271_ps_elp_wakeup(wl);
4138 if (ret < 0)
4139 goto out_free_sta;
4141 ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid);
4142 if (ret < 0)
4143 goto out_sleep;
4145 ret = wl12xx_cmd_set_peer_state(wl, hlid);
4146 if (ret < 0)
4147 goto out_sleep;
4149 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true, hlid);
4150 if (ret < 0)
4151 goto out_sleep;
4153 out_sleep:
4154 wl1271_ps_elp_sleep(wl);
4156 out_free_sta:
4157 if (ret < 0)
4158 wl1271_free_sta(wl, wlvif, hlid);
4160 out:
4161 mutex_unlock(&wl->mutex);
4162 return ret;
4165 static int wl1271_op_sta_remove(struct ieee80211_hw *hw,
4166 struct ieee80211_vif *vif,
4167 struct ieee80211_sta *sta)
4169 struct wl1271 *wl = hw->priv;
4170 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4171 struct wl1271_station *wl_sta;
4172 int ret = 0, id;
4174 mutex_lock(&wl->mutex);
4176 if (unlikely(wl->state == WL1271_STATE_OFF))
4177 goto out;
4179 if (wlvif->bss_type != BSS_TYPE_AP_BSS)
4180 goto out;
4182 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
4184 wl_sta = (struct wl1271_station *)sta->drv_priv;
4185 id = wl_sta->hlid;
4186 if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map)))
4187 goto out;
4189 ret = wl1271_ps_elp_wakeup(wl);
4190 if (ret < 0)
4191 goto out;
4193 ret = wl12xx_cmd_remove_peer(wl, wl_sta->hlid);
4194 if (ret < 0)
4195 goto out_sleep;
4197 wl1271_free_sta(wl, wlvif, wl_sta->hlid);
4199 out_sleep:
4200 wl1271_ps_elp_sleep(wl);
4202 out:
4203 mutex_unlock(&wl->mutex);
4204 return ret;
4207 static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
4208 struct ieee80211_vif *vif,
4209 enum ieee80211_ampdu_mlme_action action,
4210 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4211 u8 buf_size)
4213 struct wl1271 *wl = hw->priv;
4214 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4215 int ret;
4216 u8 hlid, *ba_bitmap;
4218 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action,
4219 tid);
4221 /* sanity check - the fields in FW are only 8bits wide */
4222 if (WARN_ON(tid > 0xFF))
4223 return -ENOTSUPP;
4225 mutex_lock(&wl->mutex);
4227 if (unlikely(wl->state == WL1271_STATE_OFF)) {
4228 ret = -EAGAIN;
4229 goto out;
4232 if (wlvif->bss_type == BSS_TYPE_STA_BSS) {
4233 hlid = wlvif->sta.hlid;
4234 ba_bitmap = &wlvif->sta.ba_rx_bitmap;
4235 } else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
4236 struct wl1271_station *wl_sta;
4238 wl_sta = (struct wl1271_station *)sta->drv_priv;
4239 hlid = wl_sta->hlid;
4240 ba_bitmap = &wl->links[hlid].ba_bitmap;
4241 } else {
4242 ret = -EINVAL;
4243 goto out;
4246 ret = wl1271_ps_elp_wakeup(wl);
4247 if (ret < 0)
4248 goto out;
4250 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d",
4251 tid, action);
4253 switch (action) {
4254 case IEEE80211_AMPDU_RX_START:
4255 if (!wlvif->ba_support || !wlvif->ba_allowed) {
4256 ret = -ENOTSUPP;
4257 break;
4260 if (wl->ba_rx_session_count >= RX_BA_MAX_SESSIONS) {
4261 ret = -EBUSY;
4262 wl1271_error("exceeded max RX BA sessions");
4263 break;
4266 if (*ba_bitmap & BIT(tid)) {
4267 ret = -EINVAL;
4268 wl1271_error("cannot enable RX BA session on active "
4269 "tid: %d", tid);
4270 break;
4273 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true,
4274 hlid);
4275 if (!ret) {
4276 *ba_bitmap |= BIT(tid);
4277 wl->ba_rx_session_count++;
4279 break;
4281 case IEEE80211_AMPDU_RX_STOP:
4282 if (!(*ba_bitmap & BIT(tid))) {
4283 ret = -EINVAL;
4284 wl1271_error("no active RX BA session on tid: %d",
4285 tid);
4286 break;
4289 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false,
4290 hlid);
4291 if (!ret) {
4292 *ba_bitmap &= ~BIT(tid);
4293 wl->ba_rx_session_count--;
4295 break;
4298 * The BA initiator session management in FW independently.
4299 * Falling break here on purpose for all TX APDU commands.
4301 case IEEE80211_AMPDU_TX_START:
4302 case IEEE80211_AMPDU_TX_STOP:
4303 case IEEE80211_AMPDU_TX_OPERATIONAL:
4304 ret = -EINVAL;
4305 break;
4307 default:
4308 wl1271_error("Incorrect ampdu action id=%x\n", action);
4309 ret = -EINVAL;
4312 wl1271_ps_elp_sleep(wl);
4314 out:
4315 mutex_unlock(&wl->mutex);
4317 return ret;
4320 static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
4321 struct ieee80211_vif *vif,
4322 const struct cfg80211_bitrate_mask *mask)
4324 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4325 struct wl1271 *wl = hw->priv;
4326 int i, ret = 0;
4328 wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x",
4329 mask->control[NL80211_BAND_2GHZ].legacy,
4330 mask->control[NL80211_BAND_5GHZ].legacy);
4332 mutex_lock(&wl->mutex);
4334 for (i = 0; i < IEEE80211_NUM_BANDS; i++)
4335 wlvif->bitrate_masks[i] =
4336 wl1271_tx_enabled_rates_get(wl,
4337 mask->control[i].legacy,
4340 if (unlikely(wl->state == WL1271_STATE_OFF))
4341 goto out;
4343 if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
4344 !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
4346 ret = wl1271_ps_elp_wakeup(wl);
4347 if (ret < 0)
4348 goto out;
4350 wl1271_set_band_rate(wl, wlvif);
4351 wlvif->basic_rate =
4352 wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4353 ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4355 wl1271_ps_elp_sleep(wl);
4357 out:
4358 mutex_unlock(&wl->mutex);
4360 return ret;
4363 static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
4364 struct ieee80211_channel_switch *ch_switch)
4366 struct wl1271 *wl = hw->priv;
4367 struct wl12xx_vif *wlvif;
4368 int ret;
4370 wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
4372 mutex_lock(&wl->mutex);
4374 if (unlikely(wl->state == WL1271_STATE_OFF)) {
4375 wl12xx_for_each_wlvif_sta(wl, wlvif) {
4376 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
4377 ieee80211_chswitch_done(vif, false);
4379 goto out;
4382 ret = wl1271_ps_elp_wakeup(wl);
4383 if (ret < 0)
4384 goto out;
4386 /* TODO: change mac80211 to pass vif as param */
4387 wl12xx_for_each_wlvif_sta(wl, wlvif) {
4388 ret = wl12xx_cmd_channel_switch(wl, ch_switch);
4390 if (!ret)
4391 set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
4394 wl1271_ps_elp_sleep(wl);
4396 out:
4397 mutex_unlock(&wl->mutex);
4400 static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
4402 struct wl1271 *wl = hw->priv;
4403 bool ret = false;
4405 mutex_lock(&wl->mutex);
4407 if (unlikely(wl->state == WL1271_STATE_OFF))
4408 goto out;
4410 /* packets are considered pending if in the TX queue or the FW */
4411 ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0);
4412 out:
4413 mutex_unlock(&wl->mutex);
4415 return ret;
4418 /* can't be const, mac80211 writes to this */
4419 static struct ieee80211_rate wl1271_rates[] = {
4420 { .bitrate = 10,
4421 .hw_value = CONF_HW_BIT_RATE_1MBPS,
4422 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
4423 { .bitrate = 20,
4424 .hw_value = CONF_HW_BIT_RATE_2MBPS,
4425 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
4426 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
4427 { .bitrate = 55,
4428 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
4429 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
4430 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
4431 { .bitrate = 110,
4432 .hw_value = CONF_HW_BIT_RATE_11MBPS,
4433 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
4434 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
4435 { .bitrate = 60,
4436 .hw_value = CONF_HW_BIT_RATE_6MBPS,
4437 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
4438 { .bitrate = 90,
4439 .hw_value = CONF_HW_BIT_RATE_9MBPS,
4440 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
4441 { .bitrate = 120,
4442 .hw_value = CONF_HW_BIT_RATE_12MBPS,
4443 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
4444 { .bitrate = 180,
4445 .hw_value = CONF_HW_BIT_RATE_18MBPS,
4446 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
4447 { .bitrate = 240,
4448 .hw_value = CONF_HW_BIT_RATE_24MBPS,
4449 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
4450 { .bitrate = 360,
4451 .hw_value = CONF_HW_BIT_RATE_36MBPS,
4452 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
4453 { .bitrate = 480,
4454 .hw_value = CONF_HW_BIT_RATE_48MBPS,
4455 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
4456 { .bitrate = 540,
4457 .hw_value = CONF_HW_BIT_RATE_54MBPS,
4458 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
4461 /* can't be const, mac80211 writes to this */
4462 static struct ieee80211_channel wl1271_channels[] = {
4463 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
4464 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
4465 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
4466 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
4467 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
4468 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
4469 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
4470 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
4471 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
4472 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
4473 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
4474 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
4475 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
4476 { .hw_value = 14, .center_freq = 2484, .max_power = 25 },
4479 /* mapping to indexes for wl1271_rates */
4480 static const u8 wl1271_rate_to_idx_2ghz[] = {
4481 /* MCS rates are used only with 11n */
4482 7, /* CONF_HW_RXTX_RATE_MCS7 */
4483 6, /* CONF_HW_RXTX_RATE_MCS6 */
4484 5, /* CONF_HW_RXTX_RATE_MCS5 */
4485 4, /* CONF_HW_RXTX_RATE_MCS4 */
4486 3, /* CONF_HW_RXTX_RATE_MCS3 */
4487 2, /* CONF_HW_RXTX_RATE_MCS2 */
4488 1, /* CONF_HW_RXTX_RATE_MCS1 */
4489 0, /* CONF_HW_RXTX_RATE_MCS0 */
4491 11, /* CONF_HW_RXTX_RATE_54 */
4492 10, /* CONF_HW_RXTX_RATE_48 */
4493 9, /* CONF_HW_RXTX_RATE_36 */
4494 8, /* CONF_HW_RXTX_RATE_24 */
4496 /* TI-specific rate */
4497 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
4499 7, /* CONF_HW_RXTX_RATE_18 */
4500 6, /* CONF_HW_RXTX_RATE_12 */
4501 3, /* CONF_HW_RXTX_RATE_11 */
4502 5, /* CONF_HW_RXTX_RATE_9 */
4503 4, /* CONF_HW_RXTX_RATE_6 */
4504 2, /* CONF_HW_RXTX_RATE_5_5 */
4505 1, /* CONF_HW_RXTX_RATE_2 */
4506 0 /* CONF_HW_RXTX_RATE_1 */
4509 /* 11n STA capabilities */
4510 #define HW_RX_HIGHEST_RATE 72
4512 #define WL12XX_HT_CAP { \
4513 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 | \
4514 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT), \
4515 .ht_supported = true, \
4516 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
4517 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
4518 .mcs = { \
4519 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
4520 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
4521 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
4522 }, \
4525 /* can't be const, mac80211 writes to this */
4526 static struct ieee80211_supported_band wl1271_band_2ghz = {
4527 .channels = wl1271_channels,
4528 .n_channels = ARRAY_SIZE(wl1271_channels),
4529 .bitrates = wl1271_rates,
4530 .n_bitrates = ARRAY_SIZE(wl1271_rates),
4531 .ht_cap = WL12XX_HT_CAP,
4534 /* 5 GHz data rates for WL1273 */
4535 static struct ieee80211_rate wl1271_rates_5ghz[] = {
4536 { .bitrate = 60,
4537 .hw_value = CONF_HW_BIT_RATE_6MBPS,
4538 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
4539 { .bitrate = 90,
4540 .hw_value = CONF_HW_BIT_RATE_9MBPS,
4541 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
4542 { .bitrate = 120,
4543 .hw_value = CONF_HW_BIT_RATE_12MBPS,
4544 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
4545 { .bitrate = 180,
4546 .hw_value = CONF_HW_BIT_RATE_18MBPS,
4547 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
4548 { .bitrate = 240,
4549 .hw_value = CONF_HW_BIT_RATE_24MBPS,
4550 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
4551 { .bitrate = 360,
4552 .hw_value = CONF_HW_BIT_RATE_36MBPS,
4553 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
4554 { .bitrate = 480,
4555 .hw_value = CONF_HW_BIT_RATE_48MBPS,
4556 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
4557 { .bitrate = 540,
4558 .hw_value = CONF_HW_BIT_RATE_54MBPS,
4559 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
4562 /* 5 GHz band channels for WL1273 */
4563 static struct ieee80211_channel wl1271_channels_5ghz[] = {
4564 { .hw_value = 7, .center_freq = 5035, .max_power = 25 },
4565 { .hw_value = 8, .center_freq = 5040, .max_power = 25 },
4566 { .hw_value = 9, .center_freq = 5045, .max_power = 25 },
4567 { .hw_value = 11, .center_freq = 5055, .max_power = 25 },
4568 { .hw_value = 12, .center_freq = 5060, .max_power = 25 },
4569 { .hw_value = 16, .center_freq = 5080, .max_power = 25 },
4570 { .hw_value = 34, .center_freq = 5170, .max_power = 25 },
4571 { .hw_value = 36, .center_freq = 5180, .max_power = 25 },
4572 { .hw_value = 38, .center_freq = 5190, .max_power = 25 },
4573 { .hw_value = 40, .center_freq = 5200, .max_power = 25 },
4574 { .hw_value = 42, .center_freq = 5210, .max_power = 25 },
4575 { .hw_value = 44, .center_freq = 5220, .max_power = 25 },
4576 { .hw_value = 46, .center_freq = 5230, .max_power = 25 },
4577 { .hw_value = 48, .center_freq = 5240, .max_power = 25 },
4578 { .hw_value = 52, .center_freq = 5260, .max_power = 25 },
4579 { .hw_value = 56, .center_freq = 5280, .max_power = 25 },
4580 { .hw_value = 60, .center_freq = 5300, .max_power = 25 },
4581 { .hw_value = 64, .center_freq = 5320, .max_power = 25 },
4582 { .hw_value = 100, .center_freq = 5500, .max_power = 25 },
4583 { .hw_value = 104, .center_freq = 5520, .max_power = 25 },
4584 { .hw_value = 108, .center_freq = 5540, .max_power = 25 },
4585 { .hw_value = 112, .center_freq = 5560, .max_power = 25 },
4586 { .hw_value = 116, .center_freq = 5580, .max_power = 25 },
4587 { .hw_value = 120, .center_freq = 5600, .max_power = 25 },
4588 { .hw_value = 124, .center_freq = 5620, .max_power = 25 },
4589 { .hw_value = 128, .center_freq = 5640, .max_power = 25 },
4590 { .hw_value = 132, .center_freq = 5660, .max_power = 25 },
4591 { .hw_value = 136, .center_freq = 5680, .max_power = 25 },
4592 { .hw_value = 140, .center_freq = 5700, .max_power = 25 },
4593 { .hw_value = 149, .center_freq = 5745, .max_power = 25 },
4594 { .hw_value = 153, .center_freq = 5765, .max_power = 25 },
4595 { .hw_value = 157, .center_freq = 5785, .max_power = 25 },
4596 { .hw_value = 161, .center_freq = 5805, .max_power = 25 },
4597 { .hw_value = 165, .center_freq = 5825, .max_power = 25 },
4600 /* mapping to indexes for wl1271_rates_5ghz */
4601 static const u8 wl1271_rate_to_idx_5ghz[] = {
4602 /* MCS rates are used only with 11n */
4603 7, /* CONF_HW_RXTX_RATE_MCS7 */
4604 6, /* CONF_HW_RXTX_RATE_MCS6 */
4605 5, /* CONF_HW_RXTX_RATE_MCS5 */
4606 4, /* CONF_HW_RXTX_RATE_MCS4 */
4607 3, /* CONF_HW_RXTX_RATE_MCS3 */
4608 2, /* CONF_HW_RXTX_RATE_MCS2 */
4609 1, /* CONF_HW_RXTX_RATE_MCS1 */
4610 0, /* CONF_HW_RXTX_RATE_MCS0 */
4612 7, /* CONF_HW_RXTX_RATE_54 */
4613 6, /* CONF_HW_RXTX_RATE_48 */
4614 5, /* CONF_HW_RXTX_RATE_36 */
4615 4, /* CONF_HW_RXTX_RATE_24 */
4617 /* TI-specific rate */
4618 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
4620 3, /* CONF_HW_RXTX_RATE_18 */
4621 2, /* CONF_HW_RXTX_RATE_12 */
4622 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
4623 1, /* CONF_HW_RXTX_RATE_9 */
4624 0, /* CONF_HW_RXTX_RATE_6 */
4625 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
4626 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
4627 CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
4630 static struct ieee80211_supported_band wl1271_band_5ghz = {
4631 .channels = wl1271_channels_5ghz,
4632 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
4633 .bitrates = wl1271_rates_5ghz,
4634 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
4635 .ht_cap = WL12XX_HT_CAP,
4638 static const u8 *wl1271_band_rate_to_idx[] = {
4639 [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
4640 [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
4643 static const struct ieee80211_ops wl1271_ops = {
4644 .start = wl1271_op_start,
4645 .stop = wl1271_op_stop,
4646 .add_interface = wl1271_op_add_interface,
4647 .remove_interface = wl1271_op_remove_interface,
4648 #ifdef CONFIG_PM
4649 .suspend = wl1271_op_suspend,
4650 .resume = wl1271_op_resume,
4651 #endif
4652 .config = wl1271_op_config,
4653 .prepare_multicast = wl1271_op_prepare_multicast,
4654 .configure_filter = wl1271_op_configure_filter,
4655 .tx = wl1271_op_tx,
4656 .set_key = wl1271_op_set_key,
4657 .hw_scan = wl1271_op_hw_scan,
4658 .cancel_hw_scan = wl1271_op_cancel_hw_scan,
4659 .sched_scan_start = wl1271_op_sched_scan_start,
4660 .sched_scan_stop = wl1271_op_sched_scan_stop,
4661 .bss_info_changed = wl1271_op_bss_info_changed,
4662 .set_frag_threshold = wl1271_op_set_frag_threshold,
4663 .set_rts_threshold = wl1271_op_set_rts_threshold,
4664 .conf_tx = wl1271_op_conf_tx,
4665 .get_tsf = wl1271_op_get_tsf,
4666 .get_survey = wl1271_op_get_survey,
4667 .sta_add = wl1271_op_sta_add,
4668 .sta_remove = wl1271_op_sta_remove,
4669 .ampdu_action = wl1271_op_ampdu_action,
4670 .tx_frames_pending = wl1271_tx_frames_pending,
4671 .set_bitrate_mask = wl12xx_set_bitrate_mask,
4672 .channel_switch = wl12xx_op_channel_switch,
4673 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
4677 u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
4679 u8 idx;
4681 BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
4683 if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
4684 wl1271_error("Illegal RX rate from HW: %d", rate);
4685 return 0;
4688 idx = wl1271_band_rate_to_idx[band][rate];
4689 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
4690 wl1271_error("Unsupported RX rate from HW: %d", rate);
4691 return 0;
4694 return idx;
4697 static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
4698 struct device_attribute *attr,
4699 char *buf)
4701 struct wl1271 *wl = dev_get_drvdata(dev);
4702 ssize_t len;
4704 len = PAGE_SIZE;
4706 mutex_lock(&wl->mutex);
4707 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
4708 wl->sg_enabled);
4709 mutex_unlock(&wl->mutex);
4711 return len;
4715 static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
4716 struct device_attribute *attr,
4717 const char *buf, size_t count)
4719 struct wl1271 *wl = dev_get_drvdata(dev);
4720 unsigned long res;
4721 int ret;
4723 ret = kstrtoul(buf, 10, &res);
4724 if (ret < 0) {
4725 wl1271_warning("incorrect value written to bt_coex_mode");
4726 return count;
4729 mutex_lock(&wl->mutex);
4731 res = !!res;
4733 if (res == wl->sg_enabled)
4734 goto out;
4736 wl->sg_enabled = res;
4738 if (wl->state == WL1271_STATE_OFF)
4739 goto out;
4741 ret = wl1271_ps_elp_wakeup(wl);
4742 if (ret < 0)
4743 goto out;
4745 wl1271_acx_sg_enable(wl, wl->sg_enabled);
4746 wl1271_ps_elp_sleep(wl);
4748 out:
4749 mutex_unlock(&wl->mutex);
4750 return count;
4753 static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
4754 wl1271_sysfs_show_bt_coex_state,
4755 wl1271_sysfs_store_bt_coex_state);
4757 static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
4758 struct device_attribute *attr,
4759 char *buf)
4761 struct wl1271 *wl = dev_get_drvdata(dev);
4762 ssize_t len;
4764 len = PAGE_SIZE;
4766 mutex_lock(&wl->mutex);
4767 if (wl->hw_pg_ver >= 0)
4768 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
4769 else
4770 len = snprintf(buf, len, "n/a\n");
4771 mutex_unlock(&wl->mutex);
4773 return len;
4776 static DEVICE_ATTR(hw_pg_ver, S_IRUGO,
4777 wl1271_sysfs_show_hw_pg_ver, NULL);
4779 static ssize_t wl1271_sysfs_read_fwlog(struct file *filp, struct kobject *kobj,
4780 struct bin_attribute *bin_attr,
4781 char *buffer, loff_t pos, size_t count)
4783 struct device *dev = container_of(kobj, struct device, kobj);
4784 struct wl1271 *wl = dev_get_drvdata(dev);
4785 ssize_t len;
4786 int ret;
4788 ret = mutex_lock_interruptible(&wl->mutex);
4789 if (ret < 0)
4790 return -ERESTARTSYS;
4792 /* Let only one thread read the log at a time, blocking others */
4793 while (wl->fwlog_size == 0) {
4794 DEFINE_WAIT(wait);
4796 prepare_to_wait_exclusive(&wl->fwlog_waitq,
4797 &wait,
4798 TASK_INTERRUPTIBLE);
4800 if (wl->fwlog_size != 0) {
4801 finish_wait(&wl->fwlog_waitq, &wait);
4802 break;
4805 mutex_unlock(&wl->mutex);
4807 schedule();
4808 finish_wait(&wl->fwlog_waitq, &wait);
4810 if (signal_pending(current))
4811 return -ERESTARTSYS;
4813 ret = mutex_lock_interruptible(&wl->mutex);
4814 if (ret < 0)
4815 return -ERESTARTSYS;
4818 /* Check if the fwlog is still valid */
4819 if (wl->fwlog_size < 0) {
4820 mutex_unlock(&wl->mutex);
4821 return 0;
4824 /* Seeking is not supported - old logs are not kept. Disregard pos. */
4825 len = min(count, (size_t)wl->fwlog_size);
4826 wl->fwlog_size -= len;
4827 memcpy(buffer, wl->fwlog, len);
4829 /* Make room for new messages */
4830 memmove(wl->fwlog, wl->fwlog + len, wl->fwlog_size);
4832 mutex_unlock(&wl->mutex);
4834 return len;
4837 static struct bin_attribute fwlog_attr = {
4838 .attr = {.name = "fwlog", .mode = S_IRUSR},
4839 .read = wl1271_sysfs_read_fwlog,
4842 static int wl1271_register_hw(struct wl1271 *wl)
4844 int ret;
4846 if (wl->mac80211_registered)
4847 return 0;
4849 ret = wl1271_fetch_nvs(wl);
4850 if (ret == 0) {
4851 /* NOTE: The wl->nvs->nvs element must be first, in
4852 * order to simplify the casting, we assume it is at
4853 * the beginning of the wl->nvs structure.
4855 u8 *nvs_ptr = (u8 *)wl->nvs;
4857 wl->mac_addr[0] = nvs_ptr[11];
4858 wl->mac_addr[1] = nvs_ptr[10];
4859 wl->mac_addr[2] = nvs_ptr[6];
4860 wl->mac_addr[3] = nvs_ptr[5];
4861 wl->mac_addr[4] = nvs_ptr[4];
4862 wl->mac_addr[5] = nvs_ptr[3];
4865 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
4867 ret = ieee80211_register_hw(wl->hw);
4868 if (ret < 0) {
4869 wl1271_error("unable to register mac80211 hw: %d", ret);
4870 return ret;
4873 wl->mac80211_registered = true;
4875 wl1271_debugfs_init(wl);
4877 register_netdevice_notifier(&wl1271_dev_notifier);
4879 wl1271_notice("loaded");
4881 return 0;
4884 static void wl1271_unregister_hw(struct wl1271 *wl)
4886 if (wl->state == WL1271_STATE_PLT)
4887 __wl1271_plt_stop(wl);
4889 unregister_netdevice_notifier(&wl1271_dev_notifier);
4890 ieee80211_unregister_hw(wl->hw);
4891 wl->mac80211_registered = false;
4895 static int wl1271_init_ieee80211(struct wl1271 *wl)
4897 static const u32 cipher_suites[] = {
4898 WLAN_CIPHER_SUITE_WEP40,
4899 WLAN_CIPHER_SUITE_WEP104,
4900 WLAN_CIPHER_SUITE_TKIP,
4901 WLAN_CIPHER_SUITE_CCMP,
4902 WL1271_CIPHER_SUITE_GEM,
4905 /* The tx descriptor buffer and the TKIP space. */
4906 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
4907 sizeof(struct wl1271_tx_hw_descr);
4909 /* unit us */
4910 /* FIXME: find a proper value */
4911 wl->hw->channel_change_time = 10000;
4912 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
4914 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
4915 IEEE80211_HW_BEACON_FILTER |
4916 IEEE80211_HW_SUPPORTS_PS |
4917 IEEE80211_HW_SUPPORTS_UAPSD |
4918 IEEE80211_HW_HAS_RATE_CONTROL |
4919 IEEE80211_HW_CONNECTION_MONITOR |
4920 IEEE80211_HW_SUPPORTS_CQM_RSSI |
4921 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
4922 IEEE80211_HW_SPECTRUM_MGMT |
4923 IEEE80211_HW_AP_LINK_PS |
4924 IEEE80211_HW_AMPDU_AGGREGATION |
4925 IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
4927 wl->hw->wiphy->cipher_suites = cipher_suites;
4928 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
4930 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
4931 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP) |
4932 BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO);
4933 wl->hw->wiphy->max_scan_ssids = 1;
4934 wl->hw->wiphy->max_sched_scan_ssids = 16;
4935 wl->hw->wiphy->max_match_sets = 16;
4937 * Maximum length of elements in scanning probe request templates
4938 * should be the maximum length possible for a template, without
4939 * the IEEE80211 header of the template
4941 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
4942 sizeof(struct ieee80211_header);
4944 wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
4945 sizeof(struct ieee80211_header);
4947 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4949 /* make sure all our channels fit in the scanned_ch bitmask */
4950 BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
4951 ARRAY_SIZE(wl1271_channels_5ghz) >
4952 WL1271_MAX_CHANNELS);
4954 * We keep local copies of the band structs because we need to
4955 * modify them on a per-device basis.
4957 memcpy(&wl->bands[IEEE80211_BAND_2GHZ], &wl1271_band_2ghz,
4958 sizeof(wl1271_band_2ghz));
4959 memcpy(&wl->bands[IEEE80211_BAND_5GHZ], &wl1271_band_5ghz,
4960 sizeof(wl1271_band_5ghz));
4962 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
4963 &wl->bands[IEEE80211_BAND_2GHZ];
4964 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
4965 &wl->bands[IEEE80211_BAND_5GHZ];
4967 wl->hw->queues = 4;
4968 wl->hw->max_rates = 1;
4970 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
4972 SET_IEEE80211_DEV(wl->hw, wl->dev);
4974 wl->hw->sta_data_size = sizeof(struct wl1271_station);
4975 wl->hw->vif_data_size = sizeof(struct wl12xx_vif);
4977 wl->hw->max_rx_aggregation_subframes = 8;
4979 return 0;
4982 #define WL1271_DEFAULT_CHANNEL 0
4984 static struct ieee80211_hw *wl1271_alloc_hw(void)
4986 struct ieee80211_hw *hw;
4987 struct wl1271 *wl;
4988 int i, j, ret;
4989 unsigned int order;
4991 BUILD_BUG_ON(AP_MAX_STATIONS > WL12XX_MAX_LINKS);
4993 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
4994 if (!hw) {
4995 wl1271_error("could not alloc ieee80211_hw");
4996 ret = -ENOMEM;
4997 goto err_hw_alloc;
5000 wl = hw->priv;
5001 memset(wl, 0, sizeof(*wl));
5003 INIT_LIST_HEAD(&wl->list);
5004 INIT_LIST_HEAD(&wl->wlvif_list);
5006 wl->hw = hw;
5008 for (i = 0; i < NUM_TX_QUEUES; i++)
5009 for (j = 0; j < WL12XX_MAX_LINKS; j++)
5010 skb_queue_head_init(&wl->links[j].tx_queue[i]);
5012 skb_queue_head_init(&wl->deferred_rx_queue);
5013 skb_queue_head_init(&wl->deferred_tx_queue);
5015 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
5016 INIT_WORK(&wl->netstack_work, wl1271_netstack_work);
5017 INIT_WORK(&wl->tx_work, wl1271_tx_work);
5018 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
5019 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
5021 wl->freezable_wq = create_freezable_workqueue("wl12xx_wq");
5022 if (!wl->freezable_wq) {
5023 ret = -ENOMEM;
5024 goto err_hw;
5027 wl->channel = WL1271_DEFAULT_CHANNEL;
5028 wl->rx_counter = 0;
5029 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
5030 wl->band = IEEE80211_BAND_2GHZ;
5031 wl->vif = NULL;
5032 wl->flags = 0;
5033 wl->sg_enabled = true;
5034 wl->hw_pg_ver = -1;
5035 wl->ap_ps_map = 0;
5036 wl->ap_fw_ps_map = 0;
5037 wl->quirks = 0;
5038 wl->platform_quirks = 0;
5039 wl->sched_scanning = false;
5040 wl->tx_spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
5041 wl->system_hlid = WL12XX_SYSTEM_HLID;
5042 wl->active_sta_count = 0;
5043 wl->fwlog_size = 0;
5044 init_waitqueue_head(&wl->fwlog_waitq);
5046 /* The system link is always allocated */
5047 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
5049 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
5050 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
5051 wl->tx_frames[i] = NULL;
5053 spin_lock_init(&wl->wl_lock);
5055 wl->state = WL1271_STATE_OFF;
5056 mutex_init(&wl->mutex);
5058 /* Apply default driver configuration. */
5059 wl1271_conf_init(wl);
5061 order = get_order(WL1271_AGGR_BUFFER_SIZE);
5062 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
5063 if (!wl->aggr_buf) {
5064 ret = -ENOMEM;
5065 goto err_wq;
5068 wl->dummy_packet = wl12xx_alloc_dummy_packet(wl);
5069 if (!wl->dummy_packet) {
5070 ret = -ENOMEM;
5071 goto err_aggr;
5074 /* Allocate one page for the FW log */
5075 wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL);
5076 if (!wl->fwlog) {
5077 ret = -ENOMEM;
5078 goto err_dummy_packet;
5081 return hw;
5083 err_dummy_packet:
5084 dev_kfree_skb(wl->dummy_packet);
5086 err_aggr:
5087 free_pages((unsigned long)wl->aggr_buf, order);
5089 err_wq:
5090 destroy_workqueue(wl->freezable_wq);
5092 err_hw:
5093 wl1271_debugfs_exit(wl);
5094 ieee80211_free_hw(hw);
5096 err_hw_alloc:
5098 return ERR_PTR(ret);
5101 static int wl1271_free_hw(struct wl1271 *wl)
5103 /* Unblock any fwlog readers */
5104 mutex_lock(&wl->mutex);
5105 wl->fwlog_size = -1;
5106 wake_up_interruptible_all(&wl->fwlog_waitq);
5107 mutex_unlock(&wl->mutex);
5109 device_remove_bin_file(wl->dev, &fwlog_attr);
5111 device_remove_file(wl->dev, &dev_attr_hw_pg_ver);
5113 device_remove_file(wl->dev, &dev_attr_bt_coex_state);
5114 free_page((unsigned long)wl->fwlog);
5115 dev_kfree_skb(wl->dummy_packet);
5116 free_pages((unsigned long)wl->aggr_buf,
5117 get_order(WL1271_AGGR_BUFFER_SIZE));
5119 wl1271_debugfs_exit(wl);
5121 vfree(wl->fw);
5122 wl->fw = NULL;
5123 kfree(wl->nvs);
5124 wl->nvs = NULL;
5126 kfree(wl->fw_status);
5127 kfree(wl->tx_res_if);
5128 destroy_workqueue(wl->freezable_wq);
5130 ieee80211_free_hw(wl->hw);
5132 return 0;
5135 static irqreturn_t wl12xx_hardirq(int irq, void *cookie)
5137 struct wl1271 *wl = cookie;
5138 unsigned long flags;
5140 wl1271_debug(DEBUG_IRQ, "IRQ");
5142 /* complete the ELP completion */
5143 spin_lock_irqsave(&wl->wl_lock, flags);
5144 set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
5145 if (wl->elp_compl) {
5146 complete(wl->elp_compl);
5147 wl->elp_compl = NULL;
5150 if (test_bit(WL1271_FLAG_SUSPENDED, &wl->flags)) {
5151 /* don't enqueue a work right now. mark it as pending */
5152 set_bit(WL1271_FLAG_PENDING_WORK, &wl->flags);
5153 wl1271_debug(DEBUG_IRQ, "should not enqueue work");
5154 disable_irq_nosync(wl->irq);
5155 pm_wakeup_event(wl->dev, 0);
5156 spin_unlock_irqrestore(&wl->wl_lock, flags);
5157 return IRQ_HANDLED;
5159 spin_unlock_irqrestore(&wl->wl_lock, flags);
5161 return IRQ_WAKE_THREAD;
5164 static int __devinit wl12xx_probe(struct platform_device *pdev)
5166 struct wl12xx_platform_data *pdata = pdev->dev.platform_data;
5167 struct ieee80211_hw *hw;
5168 struct wl1271 *wl;
5169 unsigned long irqflags;
5170 int ret = -ENODEV;
5172 hw = wl1271_alloc_hw();
5173 if (IS_ERR(hw)) {
5174 wl1271_error("can't allocate hw");
5175 ret = PTR_ERR(hw);
5176 goto out;
5179 wl = hw->priv;
5180 wl->irq = platform_get_irq(pdev, 0);
5181 wl->ref_clock = pdata->board_ref_clock;
5182 wl->tcxo_clock = pdata->board_tcxo_clock;
5183 wl->platform_quirks = pdata->platform_quirks;
5184 wl->set_power = pdata->set_power;
5185 wl->dev = &pdev->dev;
5186 wl->if_ops = pdata->ops;
5188 platform_set_drvdata(pdev, wl);
5190 if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
5191 irqflags = IRQF_TRIGGER_RISING;
5192 else
5193 irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT;
5195 ret = request_threaded_irq(wl->irq, wl12xx_hardirq, wl1271_irq,
5196 irqflags,
5197 pdev->name, wl);
5198 if (ret < 0) {
5199 wl1271_error("request_irq() failed: %d", ret);
5200 goto out_free_hw;
5203 ret = enable_irq_wake(wl->irq);
5204 if (!ret) {
5205 wl->irq_wake_enabled = true;
5206 device_init_wakeup(wl->dev, 1);
5207 if (pdata->pwr_in_suspend)
5208 hw->wiphy->wowlan.flags = WIPHY_WOWLAN_ANY;
5211 disable_irq(wl->irq);
5213 ret = wl1271_init_ieee80211(wl);
5214 if (ret)
5215 goto out_irq;
5217 ret = wl1271_register_hw(wl);
5218 if (ret)
5219 goto out_irq;
5221 /* Create sysfs file to control bt coex state */
5222 ret = device_create_file(wl->dev, &dev_attr_bt_coex_state);
5223 if (ret < 0) {
5224 wl1271_error("failed to create sysfs file bt_coex_state");
5225 goto out_irq;
5228 /* Create sysfs file to get HW PG version */
5229 ret = device_create_file(wl->dev, &dev_attr_hw_pg_ver);
5230 if (ret < 0) {
5231 wl1271_error("failed to create sysfs file hw_pg_ver");
5232 goto out_bt_coex_state;
5235 /* Create sysfs file for the FW log */
5236 ret = device_create_bin_file(wl->dev, &fwlog_attr);
5237 if (ret < 0) {
5238 wl1271_error("failed to create sysfs file fwlog");
5239 goto out_hw_pg_ver;
5242 return 0;
5244 out_hw_pg_ver:
5245 device_remove_file(wl->dev, &dev_attr_hw_pg_ver);
5247 out_bt_coex_state:
5248 device_remove_file(wl->dev, &dev_attr_bt_coex_state);
5250 out_irq:
5251 free_irq(wl->irq, wl);
5253 out_free_hw:
5254 wl1271_free_hw(wl);
5256 out:
5257 return ret;
5260 static int __devexit wl12xx_remove(struct platform_device *pdev)
5262 struct wl1271 *wl = platform_get_drvdata(pdev);
5264 if (wl->irq_wake_enabled) {
5265 device_init_wakeup(wl->dev, 0);
5266 disable_irq_wake(wl->irq);
5268 wl1271_unregister_hw(wl);
5269 free_irq(wl->irq, wl);
5270 wl1271_free_hw(wl);
5272 return 0;
5275 static const struct platform_device_id wl12xx_id_table[] __devinitconst = {
5276 { "wl12xx", 0 },
5277 { } /* Terminating Entry */
5279 MODULE_DEVICE_TABLE(platform, wl12xx_id_table);
5281 static struct platform_driver wl12xx_driver = {
5282 .probe = wl12xx_probe,
5283 .remove = __devexit_p(wl12xx_remove),
5284 .id_table = wl12xx_id_table,
5285 .driver = {
5286 .name = "wl12xx_driver",
5287 .owner = THIS_MODULE,
5291 static int __init wl12xx_init(void)
5293 return platform_driver_register(&wl12xx_driver);
5295 module_init(wl12xx_init);
5297 static void __exit wl12xx_exit(void)
5299 platform_driver_unregister(&wl12xx_driver);
5301 module_exit(wl12xx_exit);
5303 u32 wl12xx_debug_level = DEBUG_NONE;
5304 EXPORT_SYMBOL_GPL(wl12xx_debug_level);
5305 module_param_named(debug_level, wl12xx_debug_level, uint, S_IRUSR | S_IWUSR);
5306 MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
5308 module_param_named(fwlog, fwlog_param, charp, 0);
5309 MODULE_PARM_DESC(keymap,
5310 "FW logger options: continuous, ondemand, dbgpins or disable");
5312 module_param(bug_on_recovery, bool, S_IRUSR | S_IWUSR);
5313 MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
5315 MODULE_LICENSE("GPL");
5316 MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
5317 MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");