wl12xx: replace wl->mac_addr with vif->addr
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / net / wireless / wl12xx / main.c
CommitLineData
f5fc0f86
LC
1/*
2 * This file is part of wl1271
3 *
8bf29b0e 4 * Copyright (C) 2008-2010 Nokia Corporation
f5fc0f86
LC
5 *
6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
7 *
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.
11 *
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.
16 *
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
21 *
22 */
23
24#include <linux/module.h>
f5fc0f86
LC
25#include <linux/firmware.h>
26#include <linux/delay.h>
f5fc0f86
LC
27#include <linux/spi/spi.h>
28#include <linux/crc32.h>
29#include <linux/etherdevice.h>
1fba4974 30#include <linux/vmalloc.h>
a1dd8187 31#include <linux/platform_device.h>
5a0e3ad6 32#include <linux/slab.h>
341b7cde 33#include <linux/wl12xx.h>
95dac04f 34#include <linux/sched.h>
f5fc0f86 35
00d20100 36#include "wl12xx.h"
f5fc0f86 37#include "wl12xx_80211.h"
00d20100
SL
38#include "reg.h"
39#include "io.h"
40#include "event.h"
41#include "tx.h"
42#include "rx.h"
43#include "ps.h"
44#include "init.h"
45#include "debugfs.h"
46#include "cmd.h"
47#include "boot.h"
48#include "testmode.h"
49#include "scan.h"
f5fc0f86 50
9ccd9217
JO
51#define WL1271_BOOT_RETRIES 3
52
8a08048a
JO
53static struct conf_drv_settings default_conf = {
54 .sg = {
3be4112c
EP
55 .params = {
56 [CONF_SG_ACL_BT_MASTER_MIN_BR] = 10,
57 [CONF_SG_ACL_BT_MASTER_MAX_BR] = 180,
58 [CONF_SG_ACL_BT_SLAVE_MIN_BR] = 10,
59 [CONF_SG_ACL_BT_SLAVE_MAX_BR] = 180,
60 [CONF_SG_ACL_BT_MASTER_MIN_EDR] = 10,
61 [CONF_SG_ACL_BT_MASTER_MAX_EDR] = 80,
62 [CONF_SG_ACL_BT_SLAVE_MIN_EDR] = 10,
63 [CONF_SG_ACL_BT_SLAVE_MAX_EDR] = 80,
64 [CONF_SG_ACL_WLAN_PS_MASTER_BR] = 8,
65 [CONF_SG_ACL_WLAN_PS_SLAVE_BR] = 8,
66 [CONF_SG_ACL_WLAN_PS_MASTER_EDR] = 20,
67 [CONF_SG_ACL_WLAN_PS_SLAVE_EDR] = 20,
68 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR] = 20,
69 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR] = 35,
70 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR] = 16,
71 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR] = 35,
72 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR] = 32,
73 [CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR] = 50,
74 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR] = 28,
75 [CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR] = 50,
76 [CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR] = 10,
77 [CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR] = 20,
78 [CONF_SG_ACL_PASSIVE_SCAN_BT_BR] = 75,
79 [CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR] = 15,
80 [CONF_SG_ACL_PASSIVE_SCAN_BT_EDR] = 27,
81 [CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR] = 17,
82 /* active scan params */
83 [CONF_SG_AUTO_SCAN_PROBE_REQ] = 170,
84 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3] = 50,
85 [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP] = 100,
86 /* passive scan params */
87 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR] = 800,
88 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR] = 200,
89 [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3] = 200,
90 /* passive scan in dual antenna params */
91 [CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN] = 0,
92 [CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN] = 0,
93 [CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN] = 0,
94 /* general params */
95 [CONF_SG_STA_FORCE_PS_IN_BT_SCO] = 1,
96 [CONF_SG_ANTENNA_CONFIGURATION] = 0,
97 [CONF_SG_BEACON_MISS_PERCENT] = 60,
98 [CONF_SG_DHCP_TIME] = 5000,
99 [CONF_SG_RXT] = 1200,
100 [CONF_SG_TXT] = 1000,
101 [CONF_SG_ADAPTIVE_RXT_TXT] = 1,
102 [CONF_SG_GENERAL_USAGE_BIT_MAP] = 3,
103 [CONF_SG_HV3_MAX_SERVED] = 6,
104 [CONF_SG_PS_POLL_TIMEOUT] = 10,
105 [CONF_SG_UPSD_TIMEOUT] = 10,
106 [CONF_SG_CONSECUTIVE_CTS_THRESHOLD] = 2,
107 [CONF_SG_STA_RX_WINDOW_AFTER_DTIM] = 5,
108 [CONF_SG_STA_CONNECTION_PROTECTION_TIME] = 30,
109 /* AP params */
110 [CONF_AP_BEACON_MISS_TX] = 3,
111 [CONF_AP_RX_WINDOW_AFTER_BEACON] = 10,
112 [CONF_AP_BEACON_WINDOW_INTERVAL] = 2,
113 [CONF_AP_CONNECTION_PROTECTION_TIME] = 0,
114 [CONF_AP_BT_ACL_VAL_BT_SERVE_TIME] = 25,
115 [CONF_AP_BT_ACL_VAL_WL_SERVE_TIME] = 25,
801f870b 116 },
1b00f546 117 .state = CONF_SG_PROTECTIVE,
8a08048a
JO
118 },
119 .rx = {
120 .rx_msdu_life_time = 512000,
121 .packet_detection_threshold = 0,
122 .ps_poll_timeout = 15,
123 .upsd_timeout = 15,
5f704d18 124 .rts_threshold = IEEE80211_MAX_RTS_THRESHOLD,
3ed8f2c6
LC
125 .rx_cca_threshold = 0,
126 .irq_blk_threshold = 0xFFFF,
127 .irq_pkt_threshold = 0,
128 .irq_timeout = 600,
8a08048a
JO
129 .queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
130 },
131 .tx = {
132 .tx_energy_detection = 0,
1e05a818 133 .sta_rc_conf = {
ebba60c6 134 .enabled_rates = 0,
8a08048a
JO
135 .short_retry_limit = 10,
136 .long_retry_limit = 10,
1e05a818 137 .aflags = 0,
45b531a8 138 },
8a08048a
JO
139 .ac_conf_count = 4,
140 .ac_conf = {
9987a9da 141 [CONF_TX_AC_BE] = {
8a08048a
JO
142 .ac = CONF_TX_AC_BE,
143 .cw_min = 15,
144 .cw_max = 63,
145 .aifsn = 3,
146 .tx_op_limit = 0,
45b531a8 147 },
9987a9da 148 [CONF_TX_AC_BK] = {
8a08048a
JO
149 .ac = CONF_TX_AC_BK,
150 .cw_min = 15,
151 .cw_max = 63,
152 .aifsn = 7,
153 .tx_op_limit = 0,
45b531a8 154 },
9987a9da 155 [CONF_TX_AC_VI] = {
8a08048a
JO
156 .ac = CONF_TX_AC_VI,
157 .cw_min = 15,
158 .cw_max = 63,
159 .aifsn = CONF_TX_AIFS_PIFS,
160 .tx_op_limit = 3008,
161 },
9987a9da 162 [CONF_TX_AC_VO] = {
8a08048a
JO
163 .ac = CONF_TX_AC_VO,
164 .cw_min = 15,
165 .cw_max = 63,
166 .aifsn = CONF_TX_AIFS_PIFS,
167 .tx_op_limit = 1504,
45b531a8 168 },
51f2be24 169 },
3618f30f
AN
170 .max_tx_retries = 100,
171 .ap_aging_period = 300,
9987a9da 172 .tid_conf_count = 4,
8a08048a 173 .tid_conf = {
9987a9da
JO
174 [CONF_TX_AC_BE] = {
175 .queue_id = CONF_TX_AC_BE,
176 .channel_type = CONF_CHANNEL_TYPE_EDCF,
8a08048a
JO
177 .tsid = CONF_TX_AC_BE,
178 .ps_scheme = CONF_PS_SCHEME_LEGACY,
179 .ack_policy = CONF_ACK_POLICY_LEGACY,
180 .apsd_conf = {0, 0},
51f2be24 181 },
9987a9da
JO
182 [CONF_TX_AC_BK] = {
183 .queue_id = CONF_TX_AC_BK,
184 .channel_type = CONF_CHANNEL_TYPE_EDCF,
185 .tsid = CONF_TX_AC_BK,
8a08048a
JO
186 .ps_scheme = CONF_PS_SCHEME_LEGACY,
187 .ack_policy = CONF_ACK_POLICY_LEGACY,
188 .apsd_conf = {0, 0},
189 },
9987a9da
JO
190 [CONF_TX_AC_VI] = {
191 .queue_id = CONF_TX_AC_VI,
192 .channel_type = CONF_CHANNEL_TYPE_EDCF,
193 .tsid = CONF_TX_AC_VI,
8a08048a
JO
194 .ps_scheme = CONF_PS_SCHEME_LEGACY,
195 .ack_policy = CONF_ACK_POLICY_LEGACY,
196 .apsd_conf = {0, 0},
197 },
9987a9da
JO
198 [CONF_TX_AC_VO] = {
199 .queue_id = CONF_TX_AC_VO,
200 .channel_type = CONF_CHANNEL_TYPE_EDCF,
201 .tsid = CONF_TX_AC_VO,
8a08048a
JO
202 .ps_scheme = CONF_PS_SCHEME_LEGACY,
203 .ack_policy = CONF_ACK_POLICY_LEGACY,
204 .apsd_conf = {0, 0},
205 },
8a08048a
JO
206 },
207 .frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD,
3ed8f2c6 208 .tx_compl_timeout = 700,
ebba60c6
JO
209 .tx_compl_threshold = 4,
210 .basic_rate = CONF_HW_BIT_RATE_1MBPS,
211 .basic_rate_5 = CONF_HW_BIT_RATE_6MBPS,
1e05a818
AN
212 .tmpl_short_retry_limit = 10,
213 .tmpl_long_retry_limit = 10,
8a08048a
JO
214 },
215 .conn = {
216 .wake_up_event = CONF_WAKE_UP_EVENT_DTIM,
50c500ad 217 .listen_interval = 1,
8a08048a 218 .bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED,
bc76b940 219 .bcn_filt_ie_count = 2,
8a08048a
JO
220 .bcn_filt_ie = {
221 [0] = {
222 .ie = WLAN_EID_CHANNEL_SWITCH,
223 .rule = CONF_BCN_RULE_PASS_ON_APPEARANCE,
bc76b940
SL
224 },
225 [1] = {
226 .ie = WLAN_EID_HT_INFORMATION,
227 .rule = CONF_BCN_RULE_PASS_ON_CHANGE,
228 },
47fab7d5 229 },
3ed8f2c6 230 .synch_fail_thold = 10,
8a08048a
JO
231 .bss_lose_timeout = 100,
232 .beacon_rx_timeout = 10000,
233 .broadcast_timeout = 20000,
234 .rx_broadcast_in_ps = 1,
90494a90
JO
235 .ps_poll_threshold = 10,
236 .ps_poll_recovery_period = 700,
11f70f97 237 .bet_enable = CONF_BET_MODE_ENABLE,
958b20e0 238 .bet_max_consecutive = 50,
a879ed79 239 .psm_entry_retries = 8,
2370841b 240 .psm_exit_retries = 16,
8eab7b47 241 .psm_entry_nullfunc_retries = 3,
50c500ad
JO
242 .keep_alive_interval = 55000,
243 .max_listen_interval = 20,
8a08048a 244 },
6e92b416
LC
245 .itrim = {
246 .enable = false,
247 .timeout = 50000,
38ad2d87
JO
248 },
249 .pm_config = {
250 .host_clk_settling_time = 5000,
251 .host_fast_wakeup_support = false
00236aed
JO
252 },
253 .roam_trigger = {
00236aed
JO
254 .trigger_pacing = 1,
255 .avg_weight_rssi_beacon = 20,
256 .avg_weight_rssi_data = 10,
257 .avg_weight_snr_beacon = 20,
4b7fac77 258 .avg_weight_snr_data = 10,
bea39d6a
JO
259 },
260 .scan = {
261 .min_dwell_time_active = 7500,
262 .max_dwell_time_active = 30000,
ea45b2cb
JO
263 .min_dwell_time_passive = 100000,
264 .max_dwell_time_passive = 100000,
bea39d6a
JO
265 .num_probe_reqs = 2,
266 },
3a9d60e5
LC
267 .sched_scan = {
268 /* sched_scan requires dwell times in TU instead of TU/1000 */
221737d2
LC
269 .min_dwell_time_active = 30,
270 .max_dwell_time_active = 60,
3a9d60e5 271 .dwell_time_passive = 100,
50a66d7f 272 .dwell_time_dfs = 150,
3a9d60e5
LC
273 .num_probe_reqs = 2,
274 .rssi_threshold = -90,
275 .snr_threshold = 0,
276 },
644a4860
JO
277 .rf = {
278 .tx_per_channel_power_compensation_2 = {
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280 },
281 .tx_per_channel_power_compensation_5 = {
282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
285 },
286 },
4b7fac77 287 .ht = {
0f9c8250 288 .rx_ba_win_size = 8,
4b7fac77
LS
289 .tx_ba_win_size = 64,
290 .inactivity_timeout = 10000,
0f9c8250 291 .tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP,
4b7fac77 292 },
13b107dd 293 .mem_wl127x = {
fe5ef090
EP
294 .num_stations = 1,
295 .ssid_profiles = 1,
296 .rx_block_num = 70,
297 .tx_min_block_num = 40,
4cf557fc 298 .dynamic_memory = 1,
b16d4b68 299 .min_req_tx_blocks = 100,
c8bde243
EP
300 .min_req_rx_blocks = 22,
301 .tx_min = 27,
13b107dd
SL
302 },
303 .mem_wl128x = {
304 .num_stations = 1,
305 .ssid_profiles = 1,
306 .rx_block_num = 40,
307 .tx_min_block_num = 40,
308 .dynamic_memory = 1,
309 .min_req_tx_blocks = 45,
310 .min_req_rx_blocks = 22,
311 .tx_min = 27,
312 },
ff86843d
SL
313 .fm_coex = {
314 .enable = true,
315 .swallow_period = 5,
316 .n_divider_fref_set_1 = 0xff, /* default */
317 .n_divider_fref_set_2 = 12,
318 .m_divider_fref_set_1 = 148,
319 .m_divider_fref_set_2 = 0xffff, /* default */
320 .coex_pll_stabilization_time = 0xffffffff, /* default */
321 .ldo_stabilization_time = 0xffff, /* default */
322 .fm_disturbed_band_margin = 0xff, /* default */
323 .swallow_clk_diff = 0xff, /* default */
324 },
f84673d5
EP
325 .rx_streaming = {
326 .duration = 150,
327 .queues = 0x1,
328 .interval = 20,
77ddaa10 329 .always = 0,
f84673d5 330 },
95dac04f
IY
331 .fwlog = {
332 .mode = WL12XX_FWLOG_ON_DEMAND,
333 .mem_blocks = 2,
334 .severity = 0,
335 .timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED,
336 .output = WL12XX_FWLOG_OUTPUT_HOST,
337 .threshold = 0,
338 },
afb7d3cd 339 .hci_io_ds = HCI_IO_DS_6MA,
fa6ad9f0
EP
340 .rate = {
341 .rate_retry_score = 32000,
342 .per_add = 8192,
343 .per_th1 = 2048,
344 .per_th2 = 4096,
345 .max_per = 8100,
346 .inverse_curiosity_factor = 5,
347 .tx_fail_low_th = 4,
348 .tx_fail_high_th = 10,
349 .per_alpha_shift = 4,
350 .per_add_shift = 13,
351 .per_beta1_shift = 10,
352 .per_beta2_shift = 8,
353 .rate_check_up = 2,
354 .rate_check_down = 12,
355 .rate_retry_policy = {
356 0x00, 0x00, 0x00, 0x00, 0x00,
357 0x00, 0x00, 0x00, 0x00, 0x00,
358 0x00, 0x00, 0x00,
359 },
360 },
9487775c
EP
361 .hangover = {
362 .recover_time = 0,
363 .hangover_period = 20,
364 .dynamic_mode = 1,
365 .early_termination_mode = 1,
366 .max_period = 20,
367 .min_period = 1,
368 .increase_delta = 1,
369 .decrease_delta = 2,
370 .quiet_time = 4,
371 .increase_time = 1,
372 .window_size = 16,
373 },
8a08048a
JO
374};
375
95dac04f 376static char *fwlog_param;
2a5bff09 377static bool bug_on_recovery;
95dac04f 378
7dece1c8
AN
379static void __wl1271_op_remove_interface(struct wl1271 *wl,
380 bool reset_tx_queues);
7f179b46 381static void wl1271_free_ap_keys(struct wl1271 *wl);
52b0e7a6
JO
382
383
a1dd8187
JO
384static void wl1271_device_release(struct device *dev)
385{
386
387}
388
389static struct platform_device wl1271_device = {
390 .name = "wl1271",
391 .id = -1,
392
393 /* device model insists to have a release function */
394 .dev = {
395 .release = wl1271_device_release,
396 },
397};
398
f9f774c1 399static DEFINE_MUTEX(wl_list_mutex);
01c09162
JO
400static LIST_HEAD(wl_list);
401
ef4b29e9
EP
402static int wl1271_check_operstate(struct wl1271 *wl, unsigned char operstate)
403{
404 int ret;
405 if (operstate != IF_OPER_UP)
406 return 0;
407
408 if (test_and_set_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags))
409 return 0;
410
b67476ef 411 ret = wl12xx_cmd_set_peer_state(wl, wl->sta_hlid);
ef4b29e9
EP
412 if (ret < 0)
413 return ret;
414
251c177f
EP
415 wl12xx_croc(wl, wl->role_id);
416
ef4b29e9
EP
417 wl1271_info("Association completed.");
418 return 0;
419}
c2c192ac
JO
420static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
421 void *arg)
422{
423 struct net_device *dev = arg;
424 struct wireless_dev *wdev;
425 struct wiphy *wiphy;
426 struct ieee80211_hw *hw;
427 struct wl1271 *wl;
428 struct wl1271 *wl_temp;
429 int ret = 0;
430
431 /* Check that this notification is for us. */
432 if (what != NETDEV_CHANGE)
433 return NOTIFY_DONE;
434
435 wdev = dev->ieee80211_ptr;
436 if (wdev == NULL)
437 return NOTIFY_DONE;
438
439 wiphy = wdev->wiphy;
440 if (wiphy == NULL)
441 return NOTIFY_DONE;
442
443 hw = wiphy_priv(wiphy);
444 if (hw == NULL)
445 return NOTIFY_DONE;
446
447 wl_temp = hw->priv;
f9f774c1 448 mutex_lock(&wl_list_mutex);
c2c192ac
JO
449 list_for_each_entry(wl, &wl_list, list) {
450 if (wl == wl_temp)
451 break;
452 }
f9f774c1 453 mutex_unlock(&wl_list_mutex);
c2c192ac
JO
454 if (wl != wl_temp)
455 return NOTIFY_DONE;
456
457 mutex_lock(&wl->mutex);
458
459 if (wl->state == WL1271_STATE_OFF)
460 goto out;
461
462 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
463 goto out;
464
a620865e 465 ret = wl1271_ps_elp_wakeup(wl);
c2c192ac
JO
466 if (ret < 0)
467 goto out;
468
ef4b29e9 469 wl1271_check_operstate(wl, dev->operstate);
c2c192ac
JO
470
471 wl1271_ps_elp_sleep(wl);
472
473out:
474 mutex_unlock(&wl->mutex);
475
476 return NOTIFY_OK;
477}
478
b7417d93 479static int wl1271_reg_notify(struct wiphy *wiphy,
573c67cf
LC
480 struct regulatory_request *request)
481{
b7417d93
JO
482 struct ieee80211_supported_band *band;
483 struct ieee80211_channel *ch;
484 int i;
485
486 band = wiphy->bands[IEEE80211_BAND_5GHZ];
487 for (i = 0; i < band->n_channels; i++) {
488 ch = &band->channels[i];
489 if (ch->flags & IEEE80211_CHAN_DISABLED)
490 continue;
491
492 if (ch->flags & IEEE80211_CHAN_RADAR)
493 ch->flags |= IEEE80211_CHAN_NO_IBSS |
494 IEEE80211_CHAN_PASSIVE_SCAN;
495
496 }
497
498 return 0;
499}
500
77ddaa10
EP
501static int wl1271_set_rx_streaming(struct wl1271 *wl, bool enable)
502{
503 int ret = 0;
504
505 /* we should hold wl->mutex */
506 ret = wl1271_acx_ps_rx_streaming(wl, enable);
507 if (ret < 0)
508 goto out;
509
510 if (enable)
511 set_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags);
512 else
513 clear_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags);
514out:
515 return ret;
516}
517
518/*
519 * this function is being called when the rx_streaming interval
520 * has beed changed or rx_streaming should be disabled
521 */
522int wl1271_recalc_rx_streaming(struct wl1271 *wl)
523{
524 int ret = 0;
525 int period = wl->conf.rx_streaming.interval;
526
527 /* don't reconfigure if rx_streaming is disabled */
528 if (!test_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags))
529 goto out;
530
531 /* reconfigure/disable according to new streaming_period */
532 if (period &&
533 test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags) &&
534 (wl->conf.rx_streaming.always ||
535 test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
536 ret = wl1271_set_rx_streaming(wl, true);
537 else {
538 ret = wl1271_set_rx_streaming(wl, false);
539 /* don't cancel_work_sync since we might deadlock */
540 del_timer_sync(&wl->rx_streaming_timer);
541 }
542out:
543 return ret;
544}
545
546static void wl1271_rx_streaming_enable_work(struct work_struct *work)
547{
548 int ret;
549 struct wl1271 *wl =
550 container_of(work, struct wl1271, rx_streaming_enable_work);
551
552 mutex_lock(&wl->mutex);
553
554 if (test_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags) ||
555 !test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags) ||
556 (!wl->conf.rx_streaming.always &&
557 !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
558 goto out;
559
560 if (!wl->conf.rx_streaming.interval)
561 goto out;
562
563 ret = wl1271_ps_elp_wakeup(wl);
564 if (ret < 0)
565 goto out;
566
567 ret = wl1271_set_rx_streaming(wl, true);
568 if (ret < 0)
569 goto out_sleep;
570
571 /* stop it after some time of inactivity */
572 mod_timer(&wl->rx_streaming_timer,
573 jiffies + msecs_to_jiffies(wl->conf.rx_streaming.duration));
574
575out_sleep:
576 wl1271_ps_elp_sleep(wl);
577out:
578 mutex_unlock(&wl->mutex);
579}
580
581static void wl1271_rx_streaming_disable_work(struct work_struct *work)
582{
583 int ret;
584 struct wl1271 *wl =
585 container_of(work, struct wl1271, rx_streaming_disable_work);
586
587 mutex_lock(&wl->mutex);
588
589 if (!test_bit(WL1271_FLAG_RX_STREAMING_STARTED, &wl->flags))
590 goto out;
591
592 ret = wl1271_ps_elp_wakeup(wl);
593 if (ret < 0)
594 goto out;
595
596 ret = wl1271_set_rx_streaming(wl, false);
597 if (ret)
598 goto out_sleep;
599
600out_sleep:
601 wl1271_ps_elp_sleep(wl);
602out:
603 mutex_unlock(&wl->mutex);
604}
605
606static void wl1271_rx_streaming_timer(unsigned long data)
607{
608 struct wl1271 *wl = (struct wl1271 *)data;
609 ieee80211_queue_work(wl->hw, &wl->rx_streaming_disable_work);
610}
611
8a08048a
JO
612static void wl1271_conf_init(struct wl1271 *wl)
613{
2b60100b
JO
614
615 /*
616 * This function applies the default configuration to the driver. This
617 * function is invoked upon driver load (spi probe.)
618 *
619 * The configuration is stored in a run-time structure in order to
620 * facilitate for run-time adjustment of any of the parameters. Making
621 * changes to the configuration structure will apply the new values on
622 * the next interface up (wl1271_op_start.)
623 */
624
625 /* apply driver default configuration */
8a08048a 626 memcpy(&wl->conf, &default_conf, sizeof(default_conf));
2b60100b 627
95dac04f
IY
628 /* Adjust settings according to optional module parameters */
629 if (fwlog_param) {
630 if (!strcmp(fwlog_param, "continuous")) {
631 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
632 } else if (!strcmp(fwlog_param, "ondemand")) {
633 wl->conf.fwlog.mode = WL12XX_FWLOG_ON_DEMAND;
634 } else if (!strcmp(fwlog_param, "dbgpins")) {
635 wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
636 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_DBG_PINS;
637 } else if (!strcmp(fwlog_param, "disable")) {
638 wl->conf.fwlog.mem_blocks = 0;
639 wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_NONE;
640 } else {
641 wl1271_error("Unknown fwlog parameter %s", fwlog_param);
642 }
643 }
644}
2b60100b 645
f5fc0f86
LC
646static int wl1271_plt_init(struct wl1271 *wl)
647{
12419cce
LC
648 struct conf_tx_ac_category *conf_ac;
649 struct conf_tx_tid *conf_tid;
650 int ret, i;
f5fc0f86 651
49d750ca
SL
652 if (wl->chip.id == CHIP_ID_1283_PG20)
653 ret = wl128x_cmd_general_parms(wl);
654 else
655 ret = wl1271_cmd_general_parms(wl);
4a90406b 656 if (ret < 0)
cc7defa3
LC
657 return ret;
658
49d750ca
SL
659 if (wl->chip.id == CHIP_ID_1283_PG20)
660 ret = wl128x_cmd_radio_parms(wl);
661 else
662 ret = wl1271_cmd_radio_parms(wl);
4a90406b 663 if (ret < 0)
cc7defa3
LC
664 return ret;
665
49d750ca
SL
666 if (wl->chip.id != CHIP_ID_1283_PG20) {
667 ret = wl1271_cmd_ext_radio_parms(wl);
668 if (ret < 0)
669 return ret;
670 }
644a4860
JO
671 if (ret < 0)
672 return ret;
673
48a61477
SL
674 /* Chip-specific initializations */
675 ret = wl1271_chip_specific_init(wl);
676 if (ret < 0)
677 return ret;
678
e0fe371b 679 ret = wl1271_sta_init_templates_config(wl);
12419cce
LC
680 if (ret < 0)
681 return ret;
682
f5fc0f86
LC
683 ret = wl1271_acx_init_mem_config(wl);
684 if (ret < 0)
685 return ret;
686
12419cce
LC
687 /* PHY layer config */
688 ret = wl1271_init_phy_config(wl);
689 if (ret < 0)
690 goto out_free_memmap;
691
692 ret = wl1271_acx_dco_itrim_params(wl);
693 if (ret < 0)
694 goto out_free_memmap;
695
696 /* Initialize connection monitoring thresholds */
6ccbb92e 697 ret = wl1271_acx_conn_monit_params(wl, false);
12419cce
LC
698 if (ret < 0)
699 goto out_free_memmap;
700
701 /* Bluetooth WLAN coexistence */
702 ret = wl1271_init_pta(wl);
703 if (ret < 0)
704 goto out_free_memmap;
705
ff86843d
SL
706 /* FM WLAN coexistence */
707 ret = wl1271_acx_fm_coex(wl);
708 if (ret < 0)
709 goto out_free_memmap;
710
12419cce
LC
711 /* Energy detection */
712 ret = wl1271_init_energy_detection(wl);
713 if (ret < 0)
714 goto out_free_memmap;
715
7f097988 716 ret = wl12xx_acx_mem_cfg(wl);
1ec610eb
GK
717 if (ret < 0)
718 goto out_free_memmap;
719
12419cce 720 /* Default fragmentation threshold */
68d069c4 721 ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
12419cce
LC
722 if (ret < 0)
723 goto out_free_memmap;
724
9987a9da
JO
725 /* Default TID/AC configuration */
726 BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
12419cce 727 for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
9987a9da
JO
728 conf_ac = &wl->conf.tx.ac_conf[i];
729 ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
730 conf_ac->cw_max, conf_ac->aifsn,
731 conf_ac->tx_op_limit);
732 if (ret < 0)
733 goto out_free_memmap;
734
12419cce
LC
735 conf_tid = &wl->conf.tx.tid_conf[i];
736 ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
737 conf_tid->channel_type,
738 conf_tid->tsid,
739 conf_tid->ps_scheme,
740 conf_tid->ack_policy,
741 conf_tid->apsd_conf[0],
742 conf_tid->apsd_conf[1]);
743 if (ret < 0)
744 goto out_free_memmap;
745 }
746
12419cce 747 /* Enable data path */
94210897 748 ret = wl1271_cmd_data_path(wl, 1);
f5fc0f86 749 if (ret < 0)
12419cce
LC
750 goto out_free_memmap;
751
752 /* Configure for CAM power saving (ie. always active) */
753 ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
754 if (ret < 0)
755 goto out_free_memmap;
756
757 /* configure PM */
758 ret = wl1271_acx_pm_config(wl);
759 if (ret < 0)
760 goto out_free_memmap;
f5fc0f86
LC
761
762 return 0;
12419cce
LC
763
764 out_free_memmap:
765 kfree(wl->target_mem_map);
766 wl->target_mem_map = NULL;
767
768 return ret;
f5fc0f86
LC
769}
770
9b17f1b3 771static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl, u8 hlid, u8 tx_pkts)
b622d992 772{
da03209e 773 bool fw_ps, single_sta;
b622d992
AN
774
775 /* only regulate station links */
776 if (hlid < WL1271_AP_STA_HLID_START)
777 return;
778
779 fw_ps = test_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
da03209e 780 single_sta = (wl->active_sta_count == 1);
b622d992
AN
781
782 /*
783 * Wake up from high level PS if the STA is asleep with too little
9b17f1b3 784 * packets in FW or if the STA is awake.
b622d992 785 */
9b17f1b3 786 if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS)
b622d992
AN
787 wl1271_ps_link_end(wl, hlid);
788
da03209e
AN
789 /*
790 * Start high-level PS if the STA is asleep with enough blocks in FW.
791 * Make an exception if this is the only connected station. In this
792 * case FW-memory congestion is not a problem.
793 */
794 else if (!single_sta && fw_ps && tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
b622d992
AN
795 wl1271_ps_link_start(wl, hlid, true);
796}
797
9b17f1b3
AN
798bool wl1271_is_active_sta(struct wl1271 *wl, u8 hlid)
799{
04216da3
AN
800 int id;
801
802 /* global/broadcast "stations" are always active */
803 if (hlid < WL1271_AP_STA_HLID_START)
804 return true;
805
806 id = hlid - WL1271_AP_STA_HLID_START;
9b17f1b3
AN
807 return test_bit(id, wl->ap_hlid_map);
808}
809
810static void wl12xx_irq_update_links_status(struct wl1271 *wl,
811 struct wl12xx_fw_status *status)
b622d992
AN
812{
813 u32 cur_fw_ps_map;
9b17f1b3
AN
814 u8 hlid, cnt;
815
816 /* TODO: also use link_fast_bitmap here */
b622d992
AN
817
818 cur_fw_ps_map = le32_to_cpu(status->link_ps_bitmap);
819 if (wl->ap_fw_ps_map != cur_fw_ps_map) {
820 wl1271_debug(DEBUG_PSM,
821 "link ps prev 0x%x cur 0x%x changed 0x%x",
822 wl->ap_fw_ps_map, cur_fw_ps_map,
823 wl->ap_fw_ps_map ^ cur_fw_ps_map);
824
825 wl->ap_fw_ps_map = cur_fw_ps_map;
826 }
827
828 for (hlid = WL1271_AP_STA_HLID_START; hlid < AP_MAX_LINKS; hlid++) {
9b17f1b3
AN
829 if (!wl1271_is_active_sta(wl, hlid))
830 continue;
b622d992 831
9b17f1b3
AN
832 cnt = status->tx_lnk_free_pkts[hlid] -
833 wl->links[hlid].prev_freed_pkts;
b622d992 834
9b17f1b3
AN
835 wl->links[hlid].prev_freed_pkts =
836 status->tx_lnk_free_pkts[hlid];
837 wl->links[hlid].allocated_pkts -= cnt;
838
839 wl12xx_irq_ps_regulate_link(wl, hlid,
840 wl->links[hlid].allocated_pkts);
b622d992
AN
841 }
842}
843
4d56ad9c
EP
844static void wl12xx_fw_status(struct wl1271 *wl,
845 struct wl12xx_fw_status *status)
f5fc0f86 846{
ac5e1e39 847 struct timespec ts;
13b107dd 848 u32 old_tx_blk_count = wl->tx_blocks_available;
4d56ad9c 849 int avail, freed_blocks;
bf54e301 850 int i;
f5fc0f86 851
4d56ad9c 852 wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
13b107dd 853
f5fc0f86
LC
854 wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
855 "drv_rx_counter = %d, tx_results_counter = %d)",
856 status->intr,
857 status->fw_rx_counter,
858 status->drv_rx_counter,
859 status->tx_results_counter);
860
bf54e301
AN
861 for (i = 0; i < NUM_TX_QUEUES; i++) {
862 /* prevent wrap-around in freed-packets counter */
742246f8 863 wl->tx_allocated_pkts[i] -=
bf54e301
AN
864 (status->tx_released_pkts[i] -
865 wl->tx_pkts_freed[i]) & 0xff;
866
867 wl->tx_pkts_freed[i] = status->tx_released_pkts[i];
868 }
869
bdf91cfa
AN
870 /* prevent wrap-around in total blocks counter */
871 if (likely(wl->tx_blocks_freed <=
872 le32_to_cpu(status->total_released_blks)))
873 freed_blocks = le32_to_cpu(status->total_released_blks) -
874 wl->tx_blocks_freed;
875 else
876 freed_blocks = 0x100000000LL - wl->tx_blocks_freed +
877 le32_to_cpu(status->total_released_blks);
878
4d56ad9c 879 wl->tx_blocks_freed = le32_to_cpu(status->total_released_blks);
13b107dd 880
7bb5d6ce
AN
881 wl->tx_allocated_blocks -= freed_blocks;
882
4d56ad9c 883 avail = le32_to_cpu(status->tx_total) - wl->tx_allocated_blocks;
13b107dd 884
4d56ad9c
EP
885 /*
886 * The FW might change the total number of TX memblocks before
887 * we get a notification about blocks being released. Thus, the
888 * available blocks calculation might yield a temporary result
889 * which is lower than the actual available blocks. Keeping in
890 * mind that only blocks that were allocated can be moved from
891 * TX to RX, tx_blocks_available should never decrease here.
892 */
893 wl->tx_blocks_available = max((int)wl->tx_blocks_available,
894 avail);
f5fc0f86 895
a522550a 896 /* if more blocks are available now, tx work can be scheduled */
13b107dd 897 if (wl->tx_blocks_available > old_tx_blk_count)
a522550a 898 clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
f5fc0f86 899
4d56ad9c 900 /* for AP update num of allocated TX blocks per link and ps status */
9b17f1b3
AN
901 if (wl->bss_type == BSS_TYPE_AP_BSS)
902 wl12xx_irq_update_links_status(wl, status);
4d56ad9c 903
f5fc0f86 904 /* update the host-chipset time offset */
ac5e1e39
JO
905 getnstimeofday(&ts);
906 wl->time_offset = (timespec_to_ns(&ts) >> 10) -
907 (s64)le32_to_cpu(status->fw_localtime);
f5fc0f86
LC
908}
909
a620865e
IY
910static void wl1271_flush_deferred_work(struct wl1271 *wl)
911{
912 struct sk_buff *skb;
913
914 /* Pass all received frames to the network stack */
915 while ((skb = skb_dequeue(&wl->deferred_rx_queue)))
916 ieee80211_rx_ni(wl->hw, skb);
917
918 /* Return sent skbs to the network stack */
919 while ((skb = skb_dequeue(&wl->deferred_tx_queue)))
c27d3acc 920 ieee80211_tx_status_ni(wl->hw, skb);
a620865e
IY
921}
922
923static void wl1271_netstack_work(struct work_struct *work)
924{
925 struct wl1271 *wl =
926 container_of(work, struct wl1271, netstack_work);
927
928 do {
929 wl1271_flush_deferred_work(wl);
930 } while (skb_queue_len(&wl->deferred_rx_queue));
931}
1e73eb62 932
a620865e
IY
933#define WL1271_IRQ_MAX_LOOPS 256
934
935irqreturn_t wl1271_irq(int irq, void *cookie)
f5fc0f86 936{
f5fc0f86 937 int ret;
c15f63bf 938 u32 intr;
1e73eb62 939 int loopcount = WL1271_IRQ_MAX_LOOPS;
a620865e
IY
940 struct wl1271 *wl = (struct wl1271 *)cookie;
941 bool done = false;
942 unsigned int defer_count;
b07d4037
IY
943 unsigned long flags;
944
945 /* TX might be handled here, avoid redundant work */
946 set_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
947 cancel_work_sync(&wl->tx_work);
f5fc0f86 948
341b7cde
IY
949 /*
950 * In case edge triggered interrupt must be used, we cannot iterate
951 * more than once without introducing race conditions with the hardirq.
952 */
953 if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
954 loopcount = 1;
955
f5fc0f86
LC
956 mutex_lock(&wl->mutex);
957
958 wl1271_debug(DEBUG_IRQ, "IRQ work");
959
1e73eb62 960 if (unlikely(wl->state == WL1271_STATE_OFF))
f5fc0f86
LC
961 goto out;
962
a620865e 963 ret = wl1271_ps_elp_wakeup(wl);
f5fc0f86
LC
964 if (ret < 0)
965 goto out;
966
a620865e
IY
967 while (!done && loopcount--) {
968 /*
969 * In order to avoid a race with the hardirq, clear the flag
970 * before acknowledging the chip. Since the mutex is held,
971 * wl1271_ps_elp_wakeup cannot be called concurrently.
972 */
973 clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
974 smp_mb__after_clear_bit();
1e73eb62 975
4d56ad9c
EP
976 wl12xx_fw_status(wl, wl->fw_status);
977 intr = le32_to_cpu(wl->fw_status->intr);
a620865e 978 intr &= WL1271_INTR_MASK;
1e73eb62 979 if (!intr) {
a620865e 980 done = true;
1e73eb62
JO
981 continue;
982 }
f5fc0f86 983
ccc83b04
EP
984 if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
985 wl1271_error("watchdog interrupt received! "
986 "starting recovery.");
baacb9ae 987 wl12xx_queue_recovery_work(wl);
ccc83b04
EP
988
989 /* restarting the chip. ignore any other interrupt. */
990 goto out;
991 }
992
a620865e 993 if (likely(intr & WL1271_ACX_INTR_DATA)) {
1e73eb62 994 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
1fd2794f 995
4d56ad9c 996 wl12xx_rx(wl, wl->fw_status);
f5fc0f86 997
a522550a 998 /* Check if any tx blocks were freed */
b07d4037 999 spin_lock_irqsave(&wl->wl_lock, flags);
a522550a 1000 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
f1a46384 1001 wl1271_tx_total_queue_count(wl) > 0) {
b07d4037 1002 spin_unlock_irqrestore(&wl->wl_lock, flags);
a522550a
IY
1003 /*
1004 * In order to avoid starvation of the TX path,
1005 * call the work function directly.
1006 */
1007 wl1271_tx_work_locked(wl);
b07d4037
IY
1008 } else {
1009 spin_unlock_irqrestore(&wl->wl_lock, flags);
a522550a
IY
1010 }
1011
8aad2464 1012 /* check for tx results */
4d56ad9c 1013 if (wl->fw_status->tx_results_counter !=
8aad2464
IY
1014 (wl->tx_results_count & 0xff))
1015 wl1271_tx_complete(wl);
a620865e
IY
1016
1017 /* Make sure the deferred queues don't get too long */
1018 defer_count = skb_queue_len(&wl->deferred_tx_queue) +
1019 skb_queue_len(&wl->deferred_rx_queue);
1020 if (defer_count > WL1271_DEFERRED_QUEUE_LIMIT)
1021 wl1271_flush_deferred_work(wl);
1e73eb62 1022 }
f5fc0f86 1023
1e73eb62
JO
1024 if (intr & WL1271_ACX_INTR_EVENT_A) {
1025 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
1026 wl1271_event_handle(wl, 0);
1027 }
f5fc0f86 1028
1e73eb62
JO
1029 if (intr & WL1271_ACX_INTR_EVENT_B) {
1030 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
1031 wl1271_event_handle(wl, 1);
1032 }
f5fc0f86 1033
1e73eb62
JO
1034 if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
1035 wl1271_debug(DEBUG_IRQ,
1036 "WL1271_ACX_INTR_INIT_COMPLETE");
f5fc0f86 1037
1e73eb62
JO
1038 if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
1039 wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
c15f63bf 1040 }
f5fc0f86 1041
f5fc0f86
LC
1042 wl1271_ps_elp_sleep(wl);
1043
1044out:
b07d4037
IY
1045 spin_lock_irqsave(&wl->wl_lock, flags);
1046 /* In case TX was not handled here, queue TX work */
1047 clear_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
1048 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
f1a46384 1049 wl1271_tx_total_queue_count(wl) > 0)
b07d4037
IY
1050 ieee80211_queue_work(wl->hw, &wl->tx_work);
1051 spin_unlock_irqrestore(&wl->wl_lock, flags);
1052
f5fc0f86 1053 mutex_unlock(&wl->mutex);
a620865e
IY
1054
1055 return IRQ_HANDLED;
f5fc0f86 1056}
a620865e 1057EXPORT_SYMBOL_GPL(wl1271_irq);
f5fc0f86 1058
f5fc0f86
LC
1059static int wl1271_fetch_firmware(struct wl1271 *wl)
1060{
1061 const struct firmware *fw;
166d504e 1062 const char *fw_name;
f5fc0f86
LC
1063 int ret;
1064
c302b2c9
AN
1065 if (wl->chip.id == CHIP_ID_1283_PG20)
1066 fw_name = WL128X_FW_NAME;
1067 else
1068 fw_name = WL127X_FW_NAME;
166d504e
AN
1069
1070 wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
1071
1072 ret = request_firmware(&fw, fw_name, wl1271_wl_to_dev(wl));
f5fc0f86
LC
1073
1074 if (ret < 0) {
1075 wl1271_error("could not get firmware: %d", ret);
1076 return ret;
1077 }
1078
1079 if (fw->size % 4) {
1080 wl1271_error("firmware size is not multiple of 32 bits: %zu",
1081 fw->size);
1082 ret = -EILSEQ;
1083 goto out;
1084 }
1085
166d504e 1086 vfree(wl->fw);
f5fc0f86 1087 wl->fw_len = fw->size;
1fba4974 1088 wl->fw = vmalloc(wl->fw_len);
f5fc0f86
LC
1089
1090 if (!wl->fw) {
1091 wl1271_error("could not allocate memory for the firmware");
1092 ret = -ENOMEM;
1093 goto out;
1094 }
1095
1096 memcpy(wl->fw, fw->data, wl->fw_len);
f5fc0f86
LC
1097 ret = 0;
1098
1099out:
1100 release_firmware(fw);
1101
1102 return ret;
1103}
1104
1105static int wl1271_fetch_nvs(struct wl1271 *wl)
1106{
1107 const struct firmware *fw;
1108 int ret;
1109
5aa42346 1110 ret = request_firmware(&fw, WL12XX_NVS_NAME, wl1271_wl_to_dev(wl));
f5fc0f86
LC
1111
1112 if (ret < 0) {
1113 wl1271_error("could not get nvs file: %d", ret);
1114 return ret;
1115 }
1116
bc765bf3 1117 wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
f5fc0f86
LC
1118
1119 if (!wl->nvs) {
1120 wl1271_error("could not allocate memory for the nvs file");
1121 ret = -ENOMEM;
1122 goto out;
1123 }
1124
02fabb0e
JO
1125 wl->nvs_len = fw->size;
1126
f5fc0f86
LC
1127out:
1128 release_firmware(fw);
1129
1130 return ret;
1131}
1132
baacb9ae
IY
1133void wl12xx_queue_recovery_work(struct wl1271 *wl)
1134{
1135 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1136 ieee80211_queue_work(wl->hw, &wl->recovery_work);
1137}
1138
95dac04f
IY
1139size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
1140{
1141 size_t len = 0;
1142
1143 /* The FW log is a length-value list, find where the log end */
1144 while (len < maxlen) {
1145 if (memblock[len] == 0)
1146 break;
1147 if (len + memblock[len] + 1 > maxlen)
1148 break;
1149 len += memblock[len] + 1;
1150 }
1151
1152 /* Make sure we have enough room */
1153 len = min(len, (size_t)(PAGE_SIZE - wl->fwlog_size));
1154
1155 /* Fill the FW log file, consumed by the sysfs fwlog entry */
1156 memcpy(wl->fwlog + wl->fwlog_size, memblock, len);
1157 wl->fwlog_size += len;
1158
1159 return len;
1160}
1161
1162static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
1163{
1164 u32 addr;
1165 u32 first_addr;
1166 u8 *block;
1167
1168 if ((wl->quirks & WL12XX_QUIRK_FWLOG_NOT_IMPLEMENTED) ||
1169 (wl->conf.fwlog.mode != WL12XX_FWLOG_ON_DEMAND) ||
1170 (wl->conf.fwlog.mem_blocks == 0))
1171 return;
1172
1173 wl1271_info("Reading FW panic log");
1174
1175 block = kmalloc(WL12XX_HW_BLOCK_SIZE, GFP_KERNEL);
1176 if (!block)
1177 return;
1178
1179 /*
1180 * Make sure the chip is awake and the logger isn't active.
1181 * This might fail if the firmware hanged.
1182 */
1183 if (!wl1271_ps_elp_wakeup(wl))
1184 wl12xx_cmd_stop_fwlog(wl);
1185
1186 /* Read the first memory block address */
4d56ad9c
EP
1187 wl12xx_fw_status(wl, wl->fw_status);
1188 first_addr = le32_to_cpu(wl->fw_status->log_start_addr);
95dac04f
IY
1189 if (!first_addr)
1190 goto out;
1191
1192 /* Traverse the memory blocks linked list */
1193 addr = first_addr;
1194 do {
1195 memset(block, 0, WL12XX_HW_BLOCK_SIZE);
1196 wl1271_read_hwaddr(wl, addr, block, WL12XX_HW_BLOCK_SIZE,
1197 false);
1198
1199 /*
1200 * Memory blocks are linked to one another. The first 4 bytes
1201 * of each memory block hold the hardware address of the next
1202 * one. The last memory block points to the first one.
1203 */
4d56ad9c 1204 addr = le32_to_cpup((__le32 *)block);
95dac04f
IY
1205 if (!wl12xx_copy_fwlog(wl, block + sizeof(addr),
1206 WL12XX_HW_BLOCK_SIZE - sizeof(addr)))
1207 break;
1208 } while (addr && (addr != first_addr));
1209
1210 wake_up_interruptible(&wl->fwlog_waitq);
1211
1212out:
1213 kfree(block);
1214}
1215
52b0e7a6
JO
1216static void wl1271_recovery_work(struct work_struct *work)
1217{
1218 struct wl1271 *wl =
1219 container_of(work, struct wl1271, recovery_work);
1220
1221 mutex_lock(&wl->mutex);
1222
1223 if (wl->state != WL1271_STATE_ON)
1224 goto out;
1225
baacb9ae
IY
1226 /* Avoid a recursive recovery */
1227 set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
1228
95dac04f
IY
1229 wl12xx_read_fwlog_panic(wl);
1230
52dcaf57
AN
1231 wl1271_info("Hardware recovery in progress. FW ver: %s pc: 0x%x",
1232 wl->chip.fw_ver_str, wl1271_read32(wl, SCR_PAD4));
52b0e7a6 1233
2a5bff09
EP
1234 BUG_ON(bug_on_recovery);
1235
b992c682
OK
1236 /*
1237 * Advance security sequence number to overcome potential progress
1238 * in the firmware during recovery. This doens't hurt if the network is
1239 * not encrypted.
1240 */
1241 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags) ||
1242 test_bit(WL1271_FLAG_AP_STARTED, &wl->flags))
1243 wl->tx_security_seq += WL1271_TX_SQN_POST_RECOVERY_PADDING;
1244
7dece1c8
AN
1245 /* Prevent spurious TX during FW restart */
1246 ieee80211_stop_queues(wl->hw);
1247
33c2c06c
LC
1248 if (wl->sched_scanning) {
1249 ieee80211_sched_scan_stopped(wl->hw);
1250 wl->sched_scanning = false;
1251 }
1252
52b0e7a6 1253 /* reboot the chipset */
7dece1c8 1254 __wl1271_op_remove_interface(wl, false);
baacb9ae
IY
1255
1256 clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
1257
52b0e7a6
JO
1258 ieee80211_restart_hw(wl->hw);
1259
7dece1c8
AN
1260 /*
1261 * Its safe to enable TX now - the queues are stopped after a request
1262 * to restart the HW.
1263 */
1264 ieee80211_wake_queues(wl->hw);
1265
52b0e7a6
JO
1266out:
1267 mutex_unlock(&wl->mutex);
1268}
1269
f5fc0f86
LC
1270static void wl1271_fw_wakeup(struct wl1271 *wl)
1271{
1272 u32 elp_reg;
1273
1274 elp_reg = ELPCTRL_WAKE_UP;
74621417 1275 wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
f5fc0f86
LC
1276}
1277
1278static int wl1271_setup(struct wl1271 *wl)
1279{
1280 wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
1281 if (!wl->fw_status)
1282 return -ENOMEM;
1283
1284 wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
1285 if (!wl->tx_res_if) {
1286 kfree(wl->fw_status);
1287 return -ENOMEM;
1288 }
1289
f5fc0f86
LC
1290 return 0;
1291}
1292
1293static int wl1271_chip_wakeup(struct wl1271 *wl)
1294{
451de97a 1295 struct wl1271_partition_set partition;
f5fc0f86
LC
1296 int ret = 0;
1297
01ac17ec 1298 msleep(WL1271_PRE_POWER_ON_SLEEP);
2cc78ff7
OBC
1299 ret = wl1271_power_on(wl);
1300 if (ret < 0)
1301 goto out;
f5fc0f86 1302 msleep(WL1271_POWER_ON_SLEEP);
9b280722
TP
1303 wl1271_io_reset(wl);
1304 wl1271_io_init(wl);
f5fc0f86
LC
1305
1306 /* We don't need a real memory partition here, because we only want
1307 * to use the registers at this point. */
451de97a
JO
1308 memset(&partition, 0, sizeof(partition));
1309 partition.reg.start = REGISTERS_BASE;
1310 partition.reg.size = REGISTERS_DOWN_SIZE;
1311 wl1271_set_partition(wl, &partition);
f5fc0f86
LC
1312
1313 /* ELP module wake up */
1314 wl1271_fw_wakeup(wl);
1315
1316 /* whal_FwCtrl_BootSm() */
1317
1318 /* 0. read chip id from CHIP_ID */
7b048c52 1319 wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
f5fc0f86
LC
1320
1321 /* 1. check if chip id is valid */
1322
1323 switch (wl->chip.id) {
1324 case CHIP_ID_1271_PG10:
1325 wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
1326 wl->chip.id);
1327
1328 ret = wl1271_setup(wl);
1329 if (ret < 0)
9ccd9217 1330 goto out;
f5fc0f86
LC
1331 break;
1332 case CHIP_ID_1271_PG20:
1333 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
1334 wl->chip.id);
1335
1336 ret = wl1271_setup(wl);
1337 if (ret < 0)
9ccd9217 1338 goto out;
f5fc0f86 1339 break;
0830ceed
SL
1340 case CHIP_ID_1283_PG20:
1341 wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1283 PG20)",
1342 wl->chip.id);
1343
1344 ret = wl1271_setup(wl);
1345 if (ret < 0)
1346 goto out;
0c005048 1347
0da13da7
IY
1348 if (wl1271_set_block_size(wl))
1349 wl->quirks |= WL12XX_QUIRK_BLOCKSIZE_ALIGNMENT;
0830ceed
SL
1350 break;
1351 case CHIP_ID_1283_PG10:
f5fc0f86 1352 default:
9ccd9217 1353 wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
f5fc0f86 1354 ret = -ENODEV;
9ccd9217 1355 goto out;
f5fc0f86
LC
1356 }
1357
c302b2c9 1358 if (wl->fw == NULL) {
f5fc0f86
LC
1359 ret = wl1271_fetch_firmware(wl);
1360 if (ret < 0)
9ccd9217 1361 goto out;
f5fc0f86
LC
1362 }
1363
1364 /* No NVS from netlink, try to get it from the filesystem */
1365 if (wl->nvs == NULL) {
1366 ret = wl1271_fetch_nvs(wl);
1367 if (ret < 0)
9ccd9217 1368 goto out;
f5fc0f86
LC
1369 }
1370
1371out:
1372 return ret;
1373}
1374
f5fc0f86
LC
1375int wl1271_plt_start(struct wl1271 *wl)
1376{
9ccd9217 1377 int retries = WL1271_BOOT_RETRIES;
6f07b72a 1378 struct wiphy *wiphy = wl->hw->wiphy;
f5fc0f86
LC
1379 int ret;
1380
1381 mutex_lock(&wl->mutex);
1382
1383 wl1271_notice("power up");
1384
1385 if (wl->state != WL1271_STATE_OFF) {
1386 wl1271_error("cannot go into PLT state because not "
1387 "in off state: %d", wl->state);
1388 ret = -EBUSY;
1389 goto out;
1390 }
1391
166d504e
AN
1392 wl->bss_type = BSS_TYPE_STA_BSS;
1393
9ccd9217
JO
1394 while (retries) {
1395 retries--;
1396 ret = wl1271_chip_wakeup(wl);
1397 if (ret < 0)
1398 goto power_off;
f5fc0f86 1399
9ccd9217
JO
1400 ret = wl1271_boot(wl);
1401 if (ret < 0)
1402 goto power_off;
eb5b28d0 1403
9ccd9217
JO
1404 ret = wl1271_plt_init(wl);
1405 if (ret < 0)
1406 goto irq_disable;
bd5ea18f 1407
9ccd9217
JO
1408 wl->state = WL1271_STATE_PLT;
1409 wl1271_notice("firmware booted in PLT mode (%s)",
4b7fac77 1410 wl->chip.fw_ver_str);
e7ddf549 1411
6f07b72a
GK
1412 /* update hw/fw version info in wiphy struct */
1413 wiphy->hw_version = wl->chip.id;
1414 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
1415 sizeof(wiphy->fw_version));
1416
9ccd9217 1417 goto out;
eb5b28d0 1418
9ccd9217 1419irq_disable:
9ccd9217
JO
1420 mutex_unlock(&wl->mutex);
1421 /* Unlocking the mutex in the middle of handling is
1422 inherently unsafe. In this case we deem it safe to do,
1423 because we need to let any possibly pending IRQ out of
1424 the system (and while we are WL1271_STATE_OFF the IRQ
1425 work function will not do anything.) Also, any other
1426 possible concurrent operations will fail due to the
1427 current state, hence the wl1271 struct should be safe. */
a620865e
IY
1428 wl1271_disable_interrupts(wl);
1429 wl1271_flush_deferred_work(wl);
1430 cancel_work_sync(&wl->netstack_work);
9ccd9217
JO
1431 mutex_lock(&wl->mutex);
1432power_off:
1433 wl1271_power_off(wl);
1434 }
f5fc0f86 1435
9ccd9217
JO
1436 wl1271_error("firmware boot in PLT mode failed despite %d retries",
1437 WL1271_BOOT_RETRIES);
f5fc0f86
LC
1438out:
1439 mutex_unlock(&wl->mutex);
1440
1441 return ret;
1442}
1443
4623ec7d 1444static int __wl1271_plt_stop(struct wl1271 *wl)
f5fc0f86
LC
1445{
1446 int ret = 0;
1447
f5fc0f86
LC
1448 wl1271_notice("power down");
1449
1450 if (wl->state != WL1271_STATE_PLT) {
1451 wl1271_error("cannot power down because not in PLT "
1452 "state: %d", wl->state);
1453 ret = -EBUSY;
1454 goto out;
1455 }
1456
f5fc0f86
LC
1457 wl1271_power_off(wl);
1458
1459 wl->state = WL1271_STATE_OFF;
bd5ea18f 1460 wl->rx_counter = 0;
f5fc0f86 1461
f5fc0f86 1462 mutex_unlock(&wl->mutex);
a620865e
IY
1463 wl1271_disable_interrupts(wl);
1464 wl1271_flush_deferred_work(wl);
1465 cancel_work_sync(&wl->netstack_work);
52b0e7a6 1466 cancel_work_sync(&wl->recovery_work);
4ae3fa87
JO
1467 mutex_lock(&wl->mutex);
1468out:
1469 return ret;
1470}
1471
1472int wl1271_plt_stop(struct wl1271 *wl)
1473{
1474 int ret;
8c7f4f31 1475
4ae3fa87
JO
1476 mutex_lock(&wl->mutex);
1477 ret = __wl1271_plt_stop(wl);
1478 mutex_unlock(&wl->mutex);
f5fc0f86
LC
1479 return ret;
1480}
1481
7bb45683 1482static void wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
f5fc0f86
LC
1483{
1484 struct wl1271 *wl = hw->priv;
830fb67b 1485 unsigned long flags;
708bb3cf 1486 int q, mapping;
a8c0ddb5 1487 u8 hlid = 0;
f5fc0f86 1488
708bb3cf
AN
1489 mapping = skb_get_queue_mapping(skb);
1490 q = wl1271_tx_get_queue(mapping);
b07d4037
IY
1491
1492 if (wl->bss_type == BSS_TYPE_AP_BSS)
f4df1bd5 1493 hlid = wl12xx_tx_get_hlid_ap(wl, skb);
b07d4037 1494
830fb67b 1495 spin_lock_irqsave(&wl->wl_lock, flags);
b07d4037 1496
830fb67b 1497 /* queue the packet */
a8c0ddb5 1498 if (wl->bss_type == BSS_TYPE_AP_BSS) {
04216da3
AN
1499 if (!wl1271_is_active_sta(wl, hlid)) {
1500 wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d",
1501 hlid, q);
1502 dev_kfree_skb(skb);
1503 goto out;
1504 }
1505
a8c0ddb5
AN
1506 wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d", hlid, q);
1507 skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1508 } else {
1509 skb_queue_tail(&wl->tx_queue[q], skb);
1510 }
f5fc0f86 1511
04b4d69c
AN
1512 wl->tx_queue_count[q]++;
1513
1514 /*
1515 * The workqueue is slow to process the tx_queue and we need stop
1516 * the queue here, otherwise the queue will get too long.
1517 */
1518 if (wl->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
1519 wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q);
1520 ieee80211_stop_queue(wl->hw, mapping);
1521 set_bit(q, &wl->stopped_queues_map);
1522 }
1523
f5fc0f86
LC
1524 /*
1525 * The chip specific setup must run before the first TX packet -
1526 * before that, the tx_work will not be initialized!
1527 */
1528
b07d4037
IY
1529 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
1530 !test_bit(WL1271_FLAG_TX_PENDING, &wl->flags))
a522550a 1531 ieee80211_queue_work(wl->hw, &wl->tx_work);
b07d4037 1532
04216da3 1533out:
b07d4037 1534 spin_unlock_irqrestore(&wl->wl_lock, flags);
f5fc0f86
LC
1535}
1536
ae47c45f
SL
1537int wl1271_tx_dummy_packet(struct wl1271 *wl)
1538{
990f5de7 1539 unsigned long flags;
14623787
AN
1540 int q;
1541
1542 /* no need to queue a new dummy packet if one is already pending */
1543 if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags))
1544 return 0;
1545
1546 q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet));
990f5de7
IY
1547
1548 spin_lock_irqsave(&wl->wl_lock, flags);
1549 set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
f1a46384 1550 wl->tx_queue_count[q]++;
990f5de7
IY
1551 spin_unlock_irqrestore(&wl->wl_lock, flags);
1552
1553 /* The FW is low on RX memory blocks, so send the dummy packet asap */
1554 if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1555 wl1271_tx_work_locked(wl);
1556
1557 /*
1558 * If the FW TX is busy, TX work will be scheduled by the threaded
1559 * interrupt handler function
1560 */
1561 return 0;
1562}
1563
1564/*
1565 * The size of the dummy packet should be at least 1400 bytes. However, in
1566 * order to minimize the number of bus transactions, aligning it to 512 bytes
1567 * boundaries could be beneficial, performance wise
1568 */
1569#define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1570
cf27d867 1571static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl)
990f5de7
IY
1572{
1573 struct sk_buff *skb;
ae47c45f 1574 struct ieee80211_hdr_3addr *hdr;
990f5de7
IY
1575 unsigned int dummy_packet_size;
1576
1577 dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE -
1578 sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr);
ae47c45f 1579
990f5de7 1580 skb = dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE);
ae47c45f 1581 if (!skb) {
990f5de7
IY
1582 wl1271_warning("Failed to allocate a dummy packet skb");
1583 return NULL;
ae47c45f
SL
1584 }
1585
1586 skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));
1587
1588 hdr = (struct ieee80211_hdr_3addr *) skb_put(skb, sizeof(*hdr));
1589 memset(hdr, 0, sizeof(*hdr));
1590 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
990f5de7
IY
1591 IEEE80211_STYPE_NULLFUNC |
1592 IEEE80211_FCTL_TODS);
ae47c45f 1593
990f5de7 1594 memset(skb_put(skb, dummy_packet_size), 0, dummy_packet_size);
ae47c45f 1595
18b92ffa
LC
1596 /* Dummy packets require the TID to be management */
1597 skb->priority = WL1271_TID_MGMT;
ae47c45f 1598
990f5de7 1599 /* Initialize all fields that might be used */
86c438f4 1600 skb_set_queue_mapping(skb, 0);
990f5de7 1601 memset(IEEE80211_SKB_CB(skb), 0, sizeof(struct ieee80211_tx_info));
ae47c45f 1602
990f5de7 1603 return skb;
ae47c45f
SL
1604}
1605
990f5de7 1606
c2c192ac
JO
1607static struct notifier_block wl1271_dev_notifier = {
1608 .notifier_call = wl1271_dev_notify,
1609};
1610
f634a4e7 1611#ifdef CONFIG_PM
8a7cf3fe 1612static int wl1271_configure_suspend_sta(struct wl1271 *wl)
9439064c 1613{
e85d1629 1614 int ret = 0;
9439064c 1615
9439064c
EP
1616 mutex_lock(&wl->mutex);
1617
e85d1629
EP
1618 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1619 goto out_unlock;
1620
9439064c
EP
1621 ret = wl1271_ps_elp_wakeup(wl);
1622 if (ret < 0)
1623 goto out_unlock;
1624
1625 /* enter psm if needed*/
1626 if (!test_bit(WL1271_FLAG_PSM, &wl->flags)) {
1627 DECLARE_COMPLETION_ONSTACK(compl);
1628
1629 wl->ps_compl = &compl;
1630 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1631 wl->basic_rate, true);
1632 if (ret < 0)
1633 goto out_sleep;
1634
1635 /* we must unlock here so we will be able to get events */
1636 wl1271_ps_elp_sleep(wl);
1637 mutex_unlock(&wl->mutex);
1638
1639 ret = wait_for_completion_timeout(
1640 &compl, msecs_to_jiffies(WL1271_PS_COMPLETE_TIMEOUT));
1641 if (ret <= 0) {
1642 wl1271_warning("couldn't enter ps mode!");
1643 ret = -EBUSY;
1644 goto out;
1645 }
1646
1647 /* take mutex again, and wakeup */
1648 mutex_lock(&wl->mutex);
1649
1650 ret = wl1271_ps_elp_wakeup(wl);
1651 if (ret < 0)
1652 goto out_unlock;
1653 }
1654out_sleep:
1655 wl1271_ps_elp_sleep(wl);
1656out_unlock:
1657 mutex_unlock(&wl->mutex);
1658out:
1659 return ret;
1660
1661}
1662
8a7cf3fe
EP
1663static int wl1271_configure_suspend_ap(struct wl1271 *wl)
1664{
e85d1629 1665 int ret = 0;
8a7cf3fe
EP
1666
1667 mutex_lock(&wl->mutex);
1668
e85d1629
EP
1669 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags))
1670 goto out_unlock;
1671
8a7cf3fe
EP
1672 ret = wl1271_ps_elp_wakeup(wl);
1673 if (ret < 0)
1674 goto out_unlock;
1675
f42bd2cb 1676 ret = wl1271_acx_beacon_filter_opt(wl, true);
8a7cf3fe
EP
1677
1678 wl1271_ps_elp_sleep(wl);
1679out_unlock:
1680 mutex_unlock(&wl->mutex);
1681 return ret;
1682
1683}
1684
1685static int wl1271_configure_suspend(struct wl1271 *wl)
1686{
1687 if (wl->bss_type == BSS_TYPE_STA_BSS)
1688 return wl1271_configure_suspend_sta(wl);
1689 if (wl->bss_type == BSS_TYPE_AP_BSS)
1690 return wl1271_configure_suspend_ap(wl);
1691 return 0;
1692}
1693
9439064c
EP
1694static void wl1271_configure_resume(struct wl1271 *wl)
1695{
1696 int ret;
8a7cf3fe
EP
1697 bool is_sta = wl->bss_type == BSS_TYPE_STA_BSS;
1698 bool is_ap = wl->bss_type == BSS_TYPE_AP_BSS;
9439064c 1699
8a7cf3fe 1700 if (!is_sta && !is_ap)
9439064c
EP
1701 return;
1702
1703 mutex_lock(&wl->mutex);
1704 ret = wl1271_ps_elp_wakeup(wl);
1705 if (ret < 0)
1706 goto out;
1707
8a7cf3fe
EP
1708 if (is_sta) {
1709 /* exit psm if it wasn't configured */
1710 if (!test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags))
1711 wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1712 wl->basic_rate, true);
1713 } else if (is_ap) {
f42bd2cb 1714 wl1271_acx_beacon_filter_opt(wl, false);
8a7cf3fe 1715 }
9439064c
EP
1716
1717 wl1271_ps_elp_sleep(wl);
1718out:
1719 mutex_unlock(&wl->mutex);
1720}
1721
402e4861
EP
1722static int wl1271_op_suspend(struct ieee80211_hw *hw,
1723 struct cfg80211_wowlan *wow)
1724{
1725 struct wl1271 *wl = hw->priv;
4a859df8
EP
1726 int ret;
1727
402e4861 1728 wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
4a859df8 1729 WARN_ON(!wow || !wow->any);
f44e5868 1730
4a859df8
EP
1731 wl->wow_enabled = true;
1732 ret = wl1271_configure_suspend(wl);
1733 if (ret < 0) {
1734 wl1271_warning("couldn't prepare device to suspend");
1735 return ret;
1736 }
1737 /* flush any remaining work */
1738 wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
f44e5868 1739
4a859df8
EP
1740 /*
1741 * disable and re-enable interrupts in order to flush
1742 * the threaded_irq
1743 */
1744 wl1271_disable_interrupts(wl);
1745
1746 /*
1747 * set suspended flag to avoid triggering a new threaded_irq
1748 * work. no need for spinlock as interrupts are disabled.
1749 */
1750 set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1751
1752 wl1271_enable_interrupts(wl);
1753 flush_work(&wl->tx_work);
1754 flush_delayed_work(&wl->pspoll_work);
1755 flush_delayed_work(&wl->elp_work);
f44e5868 1756
402e4861
EP
1757 return 0;
1758}
1759
1760static int wl1271_op_resume(struct ieee80211_hw *hw)
1761{
1762 struct wl1271 *wl = hw->priv;
4a859df8
EP
1763 unsigned long flags;
1764 bool run_irq_work = false;
1765
402e4861
EP
1766 wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
1767 wl->wow_enabled);
4a859df8 1768 WARN_ON(!wl->wow_enabled);
f44e5868
EP
1769
1770 /*
1771 * re-enable irq_work enqueuing, and call irq_work directly if
1772 * there is a pending work.
1773 */
4a859df8
EP
1774 spin_lock_irqsave(&wl->wl_lock, flags);
1775 clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1776 if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
1777 run_irq_work = true;
1778 spin_unlock_irqrestore(&wl->wl_lock, flags);
9439064c 1779
4a859df8
EP
1780 if (run_irq_work) {
1781 wl1271_debug(DEBUG_MAC80211,
1782 "run postponed irq_work directly");
1783 wl1271_irq(0, wl);
1784 wl1271_enable_interrupts(wl);
f44e5868 1785 }
4a859df8 1786 wl1271_configure_resume(wl);
ff91afc9 1787 wl->wow_enabled = false;
f44e5868 1788
402e4861
EP
1789 return 0;
1790}
f634a4e7 1791#endif
402e4861 1792
f5fc0f86 1793static int wl1271_op_start(struct ieee80211_hw *hw)
1b72aecd
JO
1794{
1795 wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1796
1797 /*
1798 * We have to delay the booting of the hardware because
1799 * we need to know the local MAC address before downloading and
1800 * initializing the firmware. The MAC address cannot be changed
1801 * after boot, and without the proper MAC address, the firmware
1802 * will not function properly.
1803 *
1804 * The MAC address is first known when the corresponding interface
1805 * is added. That is where we will initialize the hardware.
1806 */
1807
1808 return 0;
1809}
1810
1811static void wl1271_op_stop(struct ieee80211_hw *hw)
1812{
1813 wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
1814}
1815
b78b47eb
EP
1816static u8 wl12xx_get_role_type(struct wl1271 *wl)
1817{
1818 switch (wl->bss_type) {
1819 case BSS_TYPE_AP_BSS:
045c745f
EP
1820 if (wl->p2p)
1821 return WL1271_ROLE_P2P_GO;
1822 else
1823 return WL1271_ROLE_AP;
b78b47eb
EP
1824
1825 case BSS_TYPE_STA_BSS:
045c745f
EP
1826 if (wl->p2p)
1827 return WL1271_ROLE_P2P_CL;
1828 else
1829 return WL1271_ROLE_STA;
b78b47eb 1830
227e81e1
EP
1831 case BSS_TYPE_IBSS:
1832 return WL1271_ROLE_IBSS;
1833
b78b47eb
EP
1834 default:
1835 wl1271_error("invalid bss_type: %d", wl->bss_type);
1836 }
1837 return WL12XX_INVALID_ROLE_TYPE;
1838}
1839
1b72aecd
JO
1840static int wl1271_op_add_interface(struct ieee80211_hw *hw,
1841 struct ieee80211_vif *vif)
f5fc0f86
LC
1842{
1843 struct wl1271 *wl = hw->priv;
ac01e948 1844 struct wiphy *wiphy = hw->wiphy;
9ccd9217 1845 int retries = WL1271_BOOT_RETRIES;
f5fc0f86 1846 int ret = 0;
b78b47eb 1847 u8 role_type;
71125abd 1848 bool booted = false;
f5fc0f86 1849
1b72aecd 1850 wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
045c745f 1851 ieee80211_vif_type_p2p(vif), vif->addr);
f5fc0f86
LC
1852
1853 mutex_lock(&wl->mutex);
1b72aecd 1854 if (wl->vif) {
71125abd
EP
1855 wl1271_debug(DEBUG_MAC80211,
1856 "multiple vifs are not supported yet");
1b72aecd
JO
1857 ret = -EBUSY;
1858 goto out;
1859 }
1860
13026dec
JO
1861 /*
1862 * in some very corner case HW recovery scenarios its possible to
1863 * get here before __wl1271_op_remove_interface is complete, so
1864 * opt out if that is the case.
1865 */
1866 if (test_bit(WL1271_FLAG_IF_INITIALIZED, &wl->flags)) {
1867 ret = -EBUSY;
1868 goto out;
1869 }
1870
045c745f
EP
1871 switch (ieee80211_vif_type_p2p(vif)) {
1872 case NL80211_IFTYPE_P2P_CLIENT:
1873 wl->p2p = 1;
1874 /* fall-through */
1b72aecd
JO
1875 case NL80211_IFTYPE_STATION:
1876 wl->bss_type = BSS_TYPE_STA_BSS;
5da11dcd 1877 wl->set_bss_type = BSS_TYPE_STA_BSS;
1b72aecd
JO
1878 break;
1879 case NL80211_IFTYPE_ADHOC:
1880 wl->bss_type = BSS_TYPE_IBSS;
5da11dcd 1881 wl->set_bss_type = BSS_TYPE_STA_BSS;
1b72aecd 1882 break;
045c745f
EP
1883 case NL80211_IFTYPE_P2P_GO:
1884 wl->p2p = 1;
1885 /* fall-through */
038d925b
AN
1886 case NL80211_IFTYPE_AP:
1887 wl->bss_type = BSS_TYPE_AP_BSS;
1888 break;
1b72aecd
JO
1889 default:
1890 ret = -EOPNOTSUPP;
1891 goto out;
1892 }
1893
b78b47eb
EP
1894 role_type = wl12xx_get_role_type(wl);
1895 if (role_type == WL12XX_INVALID_ROLE_TYPE) {
1896 ret = -EINVAL;
1897 goto out;
1898 }
784f694d
EP
1899 /*
1900 * we still need this in order to configure the fw
1901 * while uploading the nvs
1902 */
1b72aecd 1903 memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
f5fc0f86
LC
1904
1905 if (wl->state != WL1271_STATE_OFF) {
1906 wl1271_error("cannot start because not in off state: %d",
1907 wl->state);
1908 ret = -EBUSY;
1909 goto out;
1910 }
1911
9ccd9217
JO
1912 while (retries) {
1913 retries--;
1914 ret = wl1271_chip_wakeup(wl);
1915 if (ret < 0)
1916 goto power_off;
f5fc0f86 1917
9ccd9217
JO
1918 ret = wl1271_boot(wl);
1919 if (ret < 0)
1920 goto power_off;
f5fc0f86 1921
227e81e1
EP
1922 if (wl->bss_type == BSS_TYPE_STA_BSS ||
1923 wl->bss_type == BSS_TYPE_IBSS) {
04e8079c
EP
1924 /*
1925 * The device role is a special role used for
1926 * rx and tx frames prior to association (as
1927 * the STA role can get packets only from
1928 * its associated bssid)
1929 */
784f694d 1930 ret = wl12xx_cmd_role_enable(wl, vif->addr,
04e8079c
EP
1931 WL1271_ROLE_DEVICE,
1932 &wl->dev_role_id);
1933 if (ret < 0)
1934 goto irq_disable;
1935 }
1936
784f694d
EP
1937 ret = wl12xx_cmd_role_enable(wl, vif->addr,
1938 role_type, &wl->role_id);
b78b47eb
EP
1939 if (ret < 0)
1940 goto irq_disable;
1941
784f694d 1942 ret = wl1271_hw_init(wl, vif);
9ccd9217
JO
1943 if (ret < 0)
1944 goto irq_disable;
f5fc0f86 1945
71125abd
EP
1946 booted = true;
1947 break;
eb5b28d0 1948
9ccd9217 1949irq_disable:
9ccd9217
JO
1950 mutex_unlock(&wl->mutex);
1951 /* Unlocking the mutex in the middle of handling is
1952 inherently unsafe. In this case we deem it safe to do,
1953 because we need to let any possibly pending IRQ out of
1954 the system (and while we are WL1271_STATE_OFF the IRQ
1955 work function will not do anything.) Also, any other
1956 possible concurrent operations will fail due to the
1957 current state, hence the wl1271 struct should be safe. */
a620865e
IY
1958 wl1271_disable_interrupts(wl);
1959 wl1271_flush_deferred_work(wl);
1960 cancel_work_sync(&wl->netstack_work);
9ccd9217
JO
1961 mutex_lock(&wl->mutex);
1962power_off:
1963 wl1271_power_off(wl);
1964 }
eb5b28d0 1965
71125abd
EP
1966 if (!booted) {
1967 wl1271_error("firmware boot failed despite %d retries",
1968 WL1271_BOOT_RETRIES);
1969 goto out;
1970 }
1971
1972 wl->vif = vif;
1973 wl->state = WL1271_STATE_ON;
13026dec 1974 set_bit(WL1271_FLAG_IF_INITIALIZED, &wl->flags);
4b7fac77 1975 wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
71125abd
EP
1976
1977 /* update hw/fw version info in wiphy struct */
1978 wiphy->hw_version = wl->chip.id;
4b7fac77 1979 strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
71125abd
EP
1980 sizeof(wiphy->fw_version));
1981
fb6a6819
LC
1982 /*
1983 * Now we know if 11a is supported (info from the NVS), so disable
1984 * 11a channels if not supported
1985 */
1986 if (!wl->enable_11a)
1987 wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
1988
1989 wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
1990 wl->enable_11a ? "" : "not ");
1991
eb5b28d0 1992out:
f5fc0f86
LC
1993 mutex_unlock(&wl->mutex);
1994
f9f774c1 1995 mutex_lock(&wl_list_mutex);
eb887dfd 1996 if (!ret)
01c09162 1997 list_add(&wl->list, &wl_list);
f9f774c1 1998 mutex_unlock(&wl_list_mutex);
01c09162 1999
f5fc0f86
LC
2000 return ret;
2001}
2002
7dece1c8
AN
2003static void __wl1271_op_remove_interface(struct wl1271 *wl,
2004 bool reset_tx_queues)
f5fc0f86 2005{
bf54e301 2006 int ret, i;
f5fc0f86 2007
1b72aecd 2008 wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
f5fc0f86 2009
13026dec
JO
2010 /* because of hardware recovery, we may get here twice */
2011 if (wl->state != WL1271_STATE_ON)
2012 return;
2013
1b72aecd 2014 wl1271_info("down");
f5fc0f86 2015
f9f774c1 2016 mutex_lock(&wl_list_mutex);
01c09162 2017 list_del(&wl->list);
f9f774c1 2018 mutex_unlock(&wl_list_mutex);
01c09162 2019
8d2ef7bd 2020 /* enable dyn ps just in case (if left on due to fw crash etc) */
9a547bf9 2021 if (wl->bss_type == BSS_TYPE_STA_BSS)
f532be6d 2022 ieee80211_enable_dyn_ps(wl->vif);
8d2ef7bd 2023
08688d6b 2024 if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
08688d6b 2025 wl->scan.state = WL1271_SCAN_STATE_IDLE;
4a31c11c 2026 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
784f694d 2027 wl->scan_vif = NULL;
b739a42c 2028 wl->scan.req = NULL;
76a029fb 2029 ieee80211_scan_completed(wl->hw, true);
f5fc0f86
LC
2030 }
2031
b78b47eb
EP
2032 if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
2033 /* disable active roles */
2034 ret = wl1271_ps_elp_wakeup(wl);
2035 if (ret < 0)
2036 goto deinit;
2037
04e8079c
EP
2038 if (wl->bss_type == BSS_TYPE_STA_BSS) {
2039 ret = wl12xx_cmd_role_disable(wl, &wl->dev_role_id);
2040 if (ret < 0)
2041 goto deinit;
2042 }
2043
b78b47eb
EP
2044 ret = wl12xx_cmd_role_disable(wl, &wl->role_id);
2045 if (ret < 0)
2046 goto deinit;
2047
2048 wl1271_ps_elp_sleep(wl);
2049 }
2050deinit:
e51ae9be 2051 /* clear all hlids (except system_hlid) */
b78b47eb 2052 wl->sta_hlid = WL12XX_INVALID_LINK_ID;
04e8079c 2053 wl->dev_hlid = WL12XX_INVALID_LINK_ID;
e51ae9be
AN
2054 wl->ap_bcast_hlid = WL12XX_INVALID_LINK_ID;
2055 wl->ap_global_hlid = WL12XX_INVALID_LINK_ID;
b78b47eb 2056
13026dec
JO
2057 /*
2058 * this must be before the cancel_work calls below, so that the work
2059 * functions don't perform further work.
2060 */
f5fc0f86
LC
2061 wl->state = WL1271_STATE_OFF;
2062
f5fc0f86
LC
2063 mutex_unlock(&wl->mutex);
2064
a620865e
IY
2065 wl1271_disable_interrupts(wl);
2066 wl1271_flush_deferred_work(wl);
78abd320 2067 cancel_delayed_work_sync(&wl->scan_complete_work);
a620865e 2068 cancel_work_sync(&wl->netstack_work);
f5fc0f86 2069 cancel_work_sync(&wl->tx_work);
77ddaa10
EP
2070 del_timer_sync(&wl->rx_streaming_timer);
2071 cancel_work_sync(&wl->rx_streaming_enable_work);
2072 cancel_work_sync(&wl->rx_streaming_disable_work);
90494a90 2073 cancel_delayed_work_sync(&wl->pspoll_work);
8c7f4f31 2074 cancel_delayed_work_sync(&wl->elp_work);
f5fc0f86
LC
2075
2076 mutex_lock(&wl->mutex);
2077
2078 /* let's notify MAC80211 about the remaining pending TX frames */
7dece1c8 2079 wl1271_tx_reset(wl, reset_tx_queues);
f5fc0f86
LC
2080 wl1271_power_off(wl);
2081
2082 memset(wl->bssid, 0, ETH_ALEN);
3b40c040 2083 memset(wl->ssid, 0, IEEE80211_MAX_SSID_LEN + 1);
f5fc0f86 2084 wl->ssid_len = 0;
f5fc0f86 2085 wl->bss_type = MAX_BSS_TYPE;
5da11dcd 2086 wl->set_bss_type = MAX_BSS_TYPE;
045c745f 2087 wl->p2p = 0;
8a5a37a6 2088 wl->band = IEEE80211_BAND_2GHZ;
f5fc0f86
LC
2089
2090 wl->rx_counter = 0;
19ad0715 2091 wl->psm_entry_retry = 0;
f5fc0f86
LC
2092 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2093 wl->tx_blocks_available = 0;
7bb5d6ce 2094 wl->tx_allocated_blocks = 0;
f5fc0f86
LC
2095 wl->tx_results_count = 0;
2096 wl->tx_packets_count = 0;
2097 wl->time_offset = 0;
2098 wl->session_counter = 0;
830fb67b 2099 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
af7fbb28
EP
2100 wl->bitrate_masks[IEEE80211_BAND_2GHZ] = wl->conf.tx.basic_rate;
2101 wl->bitrate_masks[IEEE80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5;
1b72aecd 2102 wl->vif = NULL;
e9eb8cbe 2103 wl->tx_spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
7f179b46 2104 wl1271_free_ap_keys(wl);
f84f7d78 2105 memset(wl->ap_hlid_map, 0, sizeof(wl->ap_hlid_map));
b622d992
AN
2106 wl->ap_fw_ps_map = 0;
2107 wl->ap_ps_map = 0;
33c2c06c 2108 wl->sched_scanning = false;
7f097988 2109 wl->role_id = WL12XX_INVALID_ROLE_ID;
04e8079c 2110 wl->dev_role_id = WL12XX_INVALID_ROLE_ID;
c690ec81
EP
2111 memset(wl->roles_map, 0, sizeof(wl->roles_map));
2112 memset(wl->links_map, 0, sizeof(wl->links_map));
251c177f 2113 memset(wl->roc_map, 0, sizeof(wl->roc_map));
da03209e 2114 wl->active_sta_count = 0;
d6e19d13 2115
f4df1bd5
EP
2116 /* The system link is always allocated */
2117 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
2118
13026dec
JO
2119 /*
2120 * this is performed after the cancel_work calls and the associated
2121 * mutex_lock, so that wl1271_op_add_interface does not accidentally
2122 * get executed before all these vars have been reset.
2123 */
2124 wl->flags = 0;
2125
4d56ad9c 2126 wl->tx_blocks_freed = 0;
f5fc0f86 2127
742246f8 2128 for (i = 0; i < NUM_TX_QUEUES; i++) {
bf54e301 2129 wl->tx_pkts_freed[i] = 0;
742246f8
AN
2130 wl->tx_allocated_pkts[i] = 0;
2131 }
bf54e301 2132
f5fc0f86 2133 wl1271_debugfs_reset(wl);
bd9dc49c
JO
2134
2135 kfree(wl->fw_status);
2136 wl->fw_status = NULL;
2137 kfree(wl->tx_res_if);
2138 wl->tx_res_if = NULL;
2139 kfree(wl->target_mem_map);
2140 wl->target_mem_map = NULL;
52a2a375 2141}
bd9dc49c 2142
52a2a375
JO
2143static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
2144 struct ieee80211_vif *vif)
2145{
2146 struct wl1271 *wl = hw->priv;
2147
2148 mutex_lock(&wl->mutex);
67353299
JO
2149 /*
2150 * wl->vif can be null here if someone shuts down the interface
2151 * just when hardware recovery has been started.
2152 */
2153 if (wl->vif) {
2154 WARN_ON(wl->vif != vif);
7dece1c8 2155 __wl1271_op_remove_interface(wl, true);
67353299 2156 }
52b0e7a6 2157
67353299 2158 mutex_unlock(&wl->mutex);
52b0e7a6 2159 cancel_work_sync(&wl->recovery_work);
f5fc0f86
LC
2160}
2161
69e5434c 2162static int wl1271_join(struct wl1271 *wl, bool set_assoc)
82429d32
JO
2163{
2164 int ret;
227e81e1 2165 bool is_ibss = (wl->bss_type == BSS_TYPE_IBSS);
82429d32 2166
69e5434c
JO
2167 /*
2168 * One of the side effects of the JOIN command is that is clears
2169 * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
2170 * to a WPA/WPA2 access point will therefore kill the data-path.
8bf69aae
OBC
2171 * Currently the only valid scenario for JOIN during association
2172 * is on roaming, in which case we will also be given new keys.
2173 * Keep the below message for now, unless it starts bothering
2174 * users who really like to roam a lot :)
69e5434c
JO
2175 */
2176 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
2177 wl1271_info("JOIN while associated.");
2178
2179 if (set_assoc)
2180 set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
2181
227e81e1
EP
2182 if (is_ibss)
2183 ret = wl12xx_cmd_role_start_ibss(wl);
2184 else
2185 ret = wl12xx_cmd_role_start_sta(wl);
82429d32
JO
2186 if (ret < 0)
2187 goto out;
2188
82429d32
JO
2189 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
2190 goto out;
2191
2192 /*
2193 * The join command disable the keep-alive mode, shut down its process,
2194 * and also clear the template config, so we need to reset it all after
2195 * the join. The acx_aid starts the keep-alive process, and the order
2196 * of the commands below is relevant.
2197 */
2198 ret = wl1271_acx_keep_alive_mode(wl, true);
2199 if (ret < 0)
2200 goto out;
2201
2202 ret = wl1271_acx_aid(wl, wl->aid);
2203 if (ret < 0)
2204 goto out;
2205
2206 ret = wl1271_cmd_build_klv_null_data(wl);
2207 if (ret < 0)
2208 goto out;
2209
2210 ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
2211 ACX_KEEP_ALIVE_TPL_VALID);
2212 if (ret < 0)
2213 goto out;
2214
2215out:
2216 return ret;
2217}
2218
2219static int wl1271_unjoin(struct wl1271 *wl)
c7f43e45
LC
2220{
2221 int ret;
2222
6d158ff3
SL
2223 if (test_and_clear_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags)) {
2224 wl12xx_cmd_stop_channel_switch(wl);
2225 ieee80211_chswitch_done(wl->vif, false);
2226 }
2227
c7f43e45 2228 /* to stop listening to a channel, we disconnect */
c690ec81 2229 ret = wl12xx_cmd_role_stop_sta(wl);
c7f43e45
LC
2230 if (ret < 0)
2231 goto out;
2232
c7f43e45 2233 memset(wl->bssid, 0, ETH_ALEN);
14b228a0 2234
b992c682
OK
2235 /* reset TX security counters on a clean disconnect */
2236 wl->tx_security_last_seq_lsb = 0;
2237 wl->tx_security_seq = 0;
2238
c7f43e45
LC
2239out:
2240 return ret;
2241}
2242
ebba60c6
JO
2243static void wl1271_set_band_rate(struct wl1271 *wl)
2244{
af7fbb28
EP
2245 wl->basic_rate_set = wl->bitrate_masks[wl->band];
2246 wl->rate_set = wl->basic_rate_set;
ebba60c6
JO
2247}
2248
251c177f
EP
2249static bool wl12xx_is_roc(struct wl1271 *wl)
2250{
2251 u8 role_id;
2252
2253 role_id = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
2254 if (role_id >= WL12XX_MAX_ROLES)
2255 return false;
2256
2257 return true;
2258}
2259
bee0ffec 2260static int wl1271_sta_handle_idle(struct wl1271 *wl, bool idle)
0d58cbff
JO
2261{
2262 int ret;
2263
2264 if (idle) {
251c177f
EP
2265 /* no need to croc if we weren't busy (e.g. during boot) */
2266 if (wl12xx_is_roc(wl)) {
2267 ret = wl12xx_croc(wl, wl->dev_role_id);
2268 if (ret < 0)
2269 goto out;
2270
2271 ret = wl12xx_cmd_role_stop_dev(wl);
0d58cbff
JO
2272 if (ret < 0)
2273 goto out;
2274 }
af7fbb28 2275 wl->rate_set = wl1271_tx_min_rate_get(wl, wl->basic_rate_set);
79b223f4 2276 ret = wl1271_acx_sta_rate_policies(wl);
0d58cbff
JO
2277 if (ret < 0)
2278 goto out;
2279 ret = wl1271_acx_keep_alive_config(
2280 wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
2281 ACX_KEEP_ALIVE_TPL_INVALID);
2282 if (ret < 0)
2283 goto out;
2284 set_bit(WL1271_FLAG_IDLE, &wl->flags);
2285 } else {
33c2c06c
LC
2286 /* The current firmware only supports sched_scan in idle */
2287 if (wl->sched_scanning) {
2288 wl1271_scan_sched_scan_stop(wl);
2289 ieee80211_sched_scan_stopped(wl->hw);
2290 }
2291
251c177f
EP
2292 ret = wl12xx_cmd_role_start_dev(wl);
2293 if (ret < 0)
2294 goto out;
2295
2296 ret = wl12xx_roc(wl, wl->dev_role_id);
0d58cbff
JO
2297 if (ret < 0)
2298 goto out;
2299 clear_bit(WL1271_FLAG_IDLE, &wl->flags);
2300 }
2301
2302out:
2303 return ret;
2304}
2305
f5fc0f86
LC
2306static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
2307{
2308 struct wl1271 *wl = hw->priv;
2309 struct ieee80211_conf *conf = &hw->conf;
2310 int channel, ret = 0;
bee0ffec 2311 bool is_ap;
f5fc0f86
LC
2312
2313 channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
2314
bee0ffec
AN
2315 wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s"
2316 " changed 0x%x",
f5fc0f86
LC
2317 channel,
2318 conf->flags & IEEE80211_CONF_PS ? "on" : "off",
c7f43e45 2319 conf->power_level,
bee0ffec
AN
2320 conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
2321 changed);
f5fc0f86 2322
781608c4
JO
2323 /*
2324 * mac80211 will go to idle nearly immediately after transmitting some
2325 * frames, such as the deauth. To make sure those frames reach the air,
2326 * wait here until the TX queue is fully flushed.
2327 */
2328 if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
2329 (conf->flags & IEEE80211_CONF_IDLE))
2330 wl1271_tx_flush(wl);
2331
f5fc0f86
LC
2332 mutex_lock(&wl->mutex);
2333
f8d9802f 2334 if (unlikely(wl->state == WL1271_STATE_OFF)) {
17e672d6
AN
2335 /* we support configuring the channel and band while off */
2336 if ((changed & IEEE80211_CONF_CHANGE_CHANNEL)) {
2337 wl->band = conf->channel->band;
2338 wl->channel = channel;
2339 }
2340
097f8821
AN
2341 if ((changed & IEEE80211_CONF_CHANGE_POWER))
2342 wl->power_level = conf->power_level;
2343
2c10bb9c 2344 goto out;
f8d9802f 2345 }
8a5a37a6 2346
bee0ffec
AN
2347 is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
2348
a620865e 2349 ret = wl1271_ps_elp_wakeup(wl);
f5fc0f86
LC
2350 if (ret < 0)
2351 goto out;
2352
ebba60c6 2353 /* if the channel changes while joined, join again */
69e5434c
JO
2354 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
2355 ((wl->band != conf->channel->band) ||
2356 (wl->channel != channel))) {
c6930b07
EP
2357 /* send all pending packets */
2358 wl1271_tx_work_locked(wl);
ebba60c6
JO
2359 wl->band = conf->channel->band;
2360 wl->channel = channel;
2361
bee0ffec
AN
2362 if (!is_ap) {
2363 /*
2364 * FIXME: the mac80211 should really provide a fixed
2365 * rate to use here. for now, just use the smallest
2366 * possible rate for the band as a fixed rate for
2367 * association frames and other control messages.
2368 */
2369 if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
2370 wl1271_set_band_rate(wl);
2371
af7fbb28
EP
2372 wl->basic_rate =
2373 wl1271_tx_min_rate_get(wl, wl->basic_rate_set);
bee0ffec 2374 ret = wl1271_acx_sta_rate_policies(wl);
ebba60c6 2375 if (ret < 0)
bee0ffec 2376 wl1271_warning("rate policy for channel "
ebba60c6 2377 "failed %d", ret);
bee0ffec 2378
251c177f
EP
2379 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
2380 if (wl12xx_is_roc(wl)) {
2381 /* roaming */
2382 ret = wl12xx_croc(wl, wl->dev_role_id);
2383 if (ret < 0)
2384 goto out_sleep;
2385 }
bee0ffec
AN
2386 ret = wl1271_join(wl, false);
2387 if (ret < 0)
2388 wl1271_warning("cmd join on channel "
2389 "failed %d", ret);
251c177f
EP
2390 } else {
2391 /*
2392 * change the ROC channel. do it only if we are
2393 * not idle. otherwise, CROC will be called
2394 * anyway.
2395 */
2396 if (wl12xx_is_roc(wl) &&
2397 !(conf->flags & IEEE80211_CONF_IDLE)) {
2398 ret = wl12xx_croc(wl, wl->dev_role_id);
2399 if (ret < 0)
2400 goto out_sleep;
2401
2402 ret = wl12xx_roc(wl, wl->dev_role_id);
2403 if (ret < 0)
2404 wl1271_warning("roc failed %d",
2405 ret);
2406 }
bee0ffec 2407 }
ebba60c6
JO
2408 }
2409 }
2410
bee0ffec
AN
2411 if (changed & IEEE80211_CONF_CHANGE_IDLE && !is_ap) {
2412 ret = wl1271_sta_handle_idle(wl,
2413 conf->flags & IEEE80211_CONF_IDLE);
0d58cbff
JO
2414 if (ret < 0)
2415 wl1271_warning("idle mode change failed %d", ret);
f5fc0f86
LC
2416 }
2417
90494a90
JO
2418 /*
2419 * if mac80211 changes the PSM mode, make sure the mode is not
2420 * incorrectly changed after the pspoll failure active window.
2421 */
2422 if (changed & IEEE80211_CONF_CHANGE_PS)
2423 clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
2424
71449f8d
JO
2425 if (conf->flags & IEEE80211_CONF_PS &&
2426 !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
2427 set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
f5fc0f86
LC
2428
2429 /*
2430 * We enter PSM only if we're already associated.
2431 * If we're not, we'll enter it when joining an SSID,
2432 * through the bss_info_changed() hook.
2433 */
830fb67b 2434 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
18f8d468 2435 wl1271_debug(DEBUG_PSM, "psm enabled");
d8c42c0c 2436 ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
8eab7b47 2437 wl->basic_rate, true);
af5e084b 2438 }
f5fc0f86 2439 } else if (!(conf->flags & IEEE80211_CONF_PS) &&
71449f8d 2440 test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
18f8d468 2441 wl1271_debug(DEBUG_PSM, "psm disabled");
f5fc0f86 2442
71449f8d 2443 clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
f5fc0f86 2444
71449f8d 2445 if (test_bit(WL1271_FLAG_PSM, &wl->flags))
d8c42c0c 2446 ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
8eab7b47 2447 wl->basic_rate, true);
f5fc0f86
LC
2448 }
2449
2450 if (conf->power_level != wl->power_level) {
2451 ret = wl1271_acx_tx_power(wl, conf->power_level);
2452 if (ret < 0)
c6317a54 2453 goto out_sleep;
f5fc0f86
LC
2454
2455 wl->power_level = conf->power_level;
2456 }
2457
2458out_sleep:
2459 wl1271_ps_elp_sleep(wl);
2460
2461out:
2462 mutex_unlock(&wl->mutex);
2463
2464 return ret;
2465}
2466
b54853f1
JO
2467struct wl1271_filter_params {
2468 bool enabled;
2469 int mc_list_length;
2470 u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
2471};
2472
22bedad3
JP
2473static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
2474 struct netdev_hw_addr_list *mc_list)
c87dec9f 2475{
c87dec9f 2476 struct wl1271_filter_params *fp;
22bedad3 2477 struct netdev_hw_addr *ha;
2c10bb9c 2478 struct wl1271 *wl = hw->priv;
c87dec9f 2479
2c10bb9c
SD
2480 if (unlikely(wl->state == WL1271_STATE_OFF))
2481 return 0;
c87dec9f 2482
74441130 2483 fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
c87dec9f
JO
2484 if (!fp) {
2485 wl1271_error("Out of memory setting filters.");
2486 return 0;
2487 }
2488
2489 /* update multicast filtering parameters */
c87dec9f 2490 fp->mc_list_length = 0;
22bedad3
JP
2491 if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
2492 fp->enabled = false;
2493 } else {
2494 fp->enabled = true;
2495 netdev_hw_addr_list_for_each(ha, mc_list) {
c87dec9f 2496 memcpy(fp->mc_list[fp->mc_list_length],
22bedad3 2497 ha->addr, ETH_ALEN);
c87dec9f 2498 fp->mc_list_length++;
22bedad3 2499 }
c87dec9f
JO
2500 }
2501
b54853f1 2502 return (u64)(unsigned long)fp;
c87dec9f 2503}
f5fc0f86 2504
b54853f1
JO
2505#define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
2506 FIF_ALLMULTI | \
2507 FIF_FCSFAIL | \
2508 FIF_BCN_PRBRESP_PROMISC | \
2509 FIF_CONTROL | \
2510 FIF_OTHER_BSS)
2511
f5fc0f86
LC
2512static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
2513 unsigned int changed,
c87dec9f 2514 unsigned int *total, u64 multicast)
f5fc0f86 2515{
b54853f1 2516 struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
f5fc0f86 2517 struct wl1271 *wl = hw->priv;
b54853f1 2518 int ret;
f5fc0f86 2519
7d057869
AN
2520 wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
2521 " total %x", changed, *total);
f5fc0f86 2522
b54853f1
JO
2523 mutex_lock(&wl->mutex);
2524
2c10bb9c
SD
2525 *total &= WL1271_SUPPORTED_FILTERS;
2526 changed &= WL1271_SUPPORTED_FILTERS;
2527
2528 if (unlikely(wl->state == WL1271_STATE_OFF))
b54853f1
JO
2529 goto out;
2530
a620865e 2531 ret = wl1271_ps_elp_wakeup(wl);
b54853f1
JO
2532 if (ret < 0)
2533 goto out;
2534
7d057869
AN
2535 if (wl->bss_type != BSS_TYPE_AP_BSS) {
2536 if (*total & FIF_ALLMULTI)
2537 ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
2538 else if (fp)
2539 ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
2540 fp->mc_list,
2541 fp->mc_list_length);
2542 if (ret < 0)
2543 goto out_sleep;
2544 }
f5fc0f86 2545
08c1d1c7
EP
2546 /*
2547 * the fw doesn't provide an api to configure the filters. instead,
2548 * the filters configuration is based on the active roles / ROC
2549 * state.
2550 */
b54853f1
JO
2551
2552out_sleep:
2553 wl1271_ps_elp_sleep(wl);
2554
2555out:
2556 mutex_unlock(&wl->mutex);
14b228a0 2557 kfree(fp);
f5fc0f86
LC
2558}
2559
7f179b46
AN
2560static int wl1271_record_ap_key(struct wl1271 *wl, u8 id, u8 key_type,
2561 u8 key_size, const u8 *key, u8 hlid, u32 tx_seq_32,
2562 u16 tx_seq_16)
2563{
2564 struct wl1271_ap_key *ap_key;
2565 int i;
2566
2567 wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
2568
2569 if (key_size > MAX_KEY_SIZE)
2570 return -EINVAL;
2571
2572 /*
2573 * Find next free entry in ap_keys. Also check we are not replacing
2574 * an existing key.
2575 */
2576 for (i = 0; i < MAX_NUM_KEYS; i++) {
2577 if (wl->recorded_ap_keys[i] == NULL)
2578 break;
2579
2580 if (wl->recorded_ap_keys[i]->id == id) {
2581 wl1271_warning("trying to record key replacement");
2582 return -EINVAL;
2583 }
2584 }
2585
2586 if (i == MAX_NUM_KEYS)
2587 return -EBUSY;
2588
2589 ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
2590 if (!ap_key)
2591 return -ENOMEM;
2592
2593 ap_key->id = id;
2594 ap_key->key_type = key_type;
2595 ap_key->key_size = key_size;
2596 memcpy(ap_key->key, key, key_size);
2597 ap_key->hlid = hlid;
2598 ap_key->tx_seq_32 = tx_seq_32;
2599 ap_key->tx_seq_16 = tx_seq_16;
2600
2601 wl->recorded_ap_keys[i] = ap_key;
2602 return 0;
2603}
2604
2605static void wl1271_free_ap_keys(struct wl1271 *wl)
2606{
2607 int i;
2608
2609 for (i = 0; i < MAX_NUM_KEYS; i++) {
2610 kfree(wl->recorded_ap_keys[i]);
2611 wl->recorded_ap_keys[i] = NULL;
2612 }
2613}
2614
2615static int wl1271_ap_init_hwenc(struct wl1271 *wl)
2616{
2617 int i, ret = 0;
2618 struct wl1271_ap_key *key;
2619 bool wep_key_added = false;
2620
2621 for (i = 0; i < MAX_NUM_KEYS; i++) {
7f97b487 2622 u8 hlid;
7f179b46
AN
2623 if (wl->recorded_ap_keys[i] == NULL)
2624 break;
2625
2626 key = wl->recorded_ap_keys[i];
7f97b487
EP
2627 hlid = key->hlid;
2628 if (hlid == WL12XX_INVALID_LINK_ID)
2629 hlid = wl->ap_bcast_hlid;
2630
7f179b46
AN
2631 ret = wl1271_cmd_set_ap_key(wl, KEY_ADD_OR_REPLACE,
2632 key->id, key->key_type,
2633 key->key_size, key->key,
7f97b487 2634 hlid, key->tx_seq_32,
7f179b46
AN
2635 key->tx_seq_16);
2636 if (ret < 0)
2637 goto out;
2638
2639 if (key->key_type == KEY_WEP)
2640 wep_key_added = true;
2641 }
2642
2643 if (wep_key_added) {
c690ec81 2644 ret = wl12xx_cmd_set_default_wep_key(wl, wl->default_key,
e51ae9be 2645 wl->ap_bcast_hlid);
7f179b46
AN
2646 if (ret < 0)
2647 goto out;
2648 }
2649
2650out:
2651 wl1271_free_ap_keys(wl);
2652 return ret;
2653}
2654
2655static int wl1271_set_key(struct wl1271 *wl, u16 action, u8 id, u8 key_type,
2656 u8 key_size, const u8 *key, u32 tx_seq_32,
2657 u16 tx_seq_16, struct ieee80211_sta *sta)
2658{
2659 int ret;
2660 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
2661
2662 if (is_ap) {
2663 struct wl1271_station *wl_sta;
2664 u8 hlid;
2665
2666 if (sta) {
2667 wl_sta = (struct wl1271_station *)sta->drv_priv;
2668 hlid = wl_sta->hlid;
2669 } else {
e51ae9be 2670 hlid = wl->ap_bcast_hlid;
7f179b46
AN
2671 }
2672
2673 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
2674 /*
2675 * We do not support removing keys after AP shutdown.
2676 * Pretend we do to make mac80211 happy.
2677 */
2678 if (action != KEY_ADD_OR_REPLACE)
2679 return 0;
2680
2681 ret = wl1271_record_ap_key(wl, id,
2682 key_type, key_size,
2683 key, hlid, tx_seq_32,
2684 tx_seq_16);
2685 } else {
2686 ret = wl1271_cmd_set_ap_key(wl, action,
2687 id, key_type, key_size,
2688 key, hlid, tx_seq_32,
2689 tx_seq_16);
2690 }
2691
2692 if (ret < 0)
2693 return ret;
2694 } else {
2695 const u8 *addr;
2696 static const u8 bcast_addr[ETH_ALEN] = {
2697 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2698 };
2699
e9eb8cbe
GE
2700 /*
2701 * A STA set to GEM cipher requires 2 tx spare blocks.
2702 * Return to default value when GEM cipher key is removed
2703 */
2704 if (key_type == KEY_GEM) {
2705 if (action == KEY_ADD_OR_REPLACE)
2706 wl->tx_spare_blocks = 2;
2707 else if (action == KEY_REMOVE)
2708 wl->tx_spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
2709 }
2710
7f179b46
AN
2711 addr = sta ? sta->addr : bcast_addr;
2712
2713 if (is_zero_ether_addr(addr)) {
2714 /* We dont support TX only encryption */
2715 return -EOPNOTSUPP;
2716 }
2717
2718 /* The wl1271 does not allow to remove unicast keys - they
2719 will be cleared automatically on next CMD_JOIN. Ignore the
2720 request silently, as we dont want the mac80211 to emit
2721 an error message. */
2722 if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
2723 return 0;
2724
010d3d30
EP
2725 /* don't remove key if hlid was already deleted */
2726 if (action == KEY_REMOVE &&
2727 wl->sta_hlid == WL12XX_INVALID_LINK_ID)
2728 return 0;
2729
7f179b46
AN
2730 ret = wl1271_cmd_set_sta_key(wl, action,
2731 id, key_type, key_size,
2732 key, addr, tx_seq_32,
2733 tx_seq_16);
2734 if (ret < 0)
2735 return ret;
2736
2737 /* the default WEP key needs to be configured at least once */
2738 if (key_type == KEY_WEP) {
c690ec81
EP
2739 ret = wl12xx_cmd_set_default_wep_key(wl,
2740 wl->default_key,
2741 wl->sta_hlid);
7f179b46
AN
2742 if (ret < 0)
2743 return ret;
2744 }
2745 }
2746
2747 return 0;
2748}
2749
f5fc0f86
LC
2750static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
2751 struct ieee80211_vif *vif,
2752 struct ieee80211_sta *sta,
2753 struct ieee80211_key_conf *key_conf)
2754{
2755 struct wl1271 *wl = hw->priv;
f5fc0f86 2756 int ret;
ac4e4ce5
JO
2757 u32 tx_seq_32 = 0;
2758 u16 tx_seq_16 = 0;
f5fc0f86
LC
2759 u8 key_type;
2760
f5fc0f86
LC
2761 wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
2762
7f179b46 2763 wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
f5fc0f86 2764 wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
97359d12 2765 key_conf->cipher, key_conf->keyidx,
f5fc0f86
LC
2766 key_conf->keylen, key_conf->flags);
2767 wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
2768
f5fc0f86
LC
2769 mutex_lock(&wl->mutex);
2770
f8d9802f
JO
2771 if (unlikely(wl->state == WL1271_STATE_OFF)) {
2772 ret = -EAGAIN;
2773 goto out_unlock;
2774 }
2775
a620865e 2776 ret = wl1271_ps_elp_wakeup(wl);
f5fc0f86
LC
2777 if (ret < 0)
2778 goto out_unlock;
2779
97359d12
JB
2780 switch (key_conf->cipher) {
2781 case WLAN_CIPHER_SUITE_WEP40:
2782 case WLAN_CIPHER_SUITE_WEP104:
f5fc0f86
LC
2783 key_type = KEY_WEP;
2784
2785 key_conf->hw_key_idx = key_conf->keyidx;
2786 break;
97359d12 2787 case WLAN_CIPHER_SUITE_TKIP:
f5fc0f86
LC
2788 key_type = KEY_TKIP;
2789
2790 key_conf->hw_key_idx = key_conf->keyidx;
04e36fc5
JO
2791 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
2792 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
f5fc0f86 2793 break;
97359d12 2794 case WLAN_CIPHER_SUITE_CCMP:
f5fc0f86
LC
2795 key_type = KEY_AES;
2796
2797 key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
04e36fc5
JO
2798 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
2799 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
f5fc0f86 2800 break;
7a55724e
JO
2801 case WL1271_CIPHER_SUITE_GEM:
2802 key_type = KEY_GEM;
2803 tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
2804 tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
2805 break;
f5fc0f86 2806 default:
97359d12 2807 wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
f5fc0f86
LC
2808
2809 ret = -EOPNOTSUPP;
2810 goto out_sleep;
2811 }
2812
2813 switch (cmd) {
2814 case SET_KEY:
7f179b46
AN
2815 ret = wl1271_set_key(wl, KEY_ADD_OR_REPLACE,
2816 key_conf->keyidx, key_type,
2817 key_conf->keylen, key_conf->key,
2818 tx_seq_32, tx_seq_16, sta);
f5fc0f86
LC
2819 if (ret < 0) {
2820 wl1271_error("Could not add or replace key");
2821 goto out_sleep;
2822 }
2823 break;
2824
2825 case DISABLE_KEY:
7f179b46
AN
2826 ret = wl1271_set_key(wl, KEY_REMOVE,
2827 key_conf->keyidx, key_type,
2828 key_conf->keylen, key_conf->key,
2829 0, 0, sta);
f5fc0f86
LC
2830 if (ret < 0) {
2831 wl1271_error("Could not remove key");
2832 goto out_sleep;
2833 }
2834 break;
2835
2836 default:
2837 wl1271_error("Unsupported key cmd 0x%x", cmd);
2838 ret = -EOPNOTSUPP;
f5fc0f86
LC
2839 break;
2840 }
2841
2842out_sleep:
2843 wl1271_ps_elp_sleep(wl);
2844
2845out_unlock:
2846 mutex_unlock(&wl->mutex);
2847
f5fc0f86
LC
2848 return ret;
2849}
2850
2851static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
a060bbfe 2852 struct ieee80211_vif *vif,
f5fc0f86
LC
2853 struct cfg80211_scan_request *req)
2854{
2855 struct wl1271 *wl = hw->priv;
2856 int ret;
2857 u8 *ssid = NULL;
abb0b3bf 2858 size_t len = 0;
f5fc0f86
LC
2859
2860 wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
2861
2862 if (req->n_ssids) {
2863 ssid = req->ssids[0].ssid;
abb0b3bf 2864 len = req->ssids[0].ssid_len;
f5fc0f86
LC
2865 }
2866
2867 mutex_lock(&wl->mutex);
2868
b739a42c
JO
2869 if (wl->state == WL1271_STATE_OFF) {
2870 /*
2871 * We cannot return -EBUSY here because cfg80211 will expect
2872 * a call to ieee80211_scan_completed if we do - in this case
2873 * there won't be any call.
2874 */
2875 ret = -EAGAIN;
2876 goto out;
2877 }
2878
a620865e 2879 ret = wl1271_ps_elp_wakeup(wl);
f5fc0f86
LC
2880 if (ret < 0)
2881 goto out;
2882
251c177f
EP
2883 /* cancel ROC before scanning */
2884 if (wl12xx_is_roc(wl)) {
2885 if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
2886 /* don't allow scanning right now */
2887 ret = -EBUSY;
2888 goto out_sleep;
2889 }
2890 wl12xx_croc(wl, wl->dev_role_id);
2891 wl12xx_cmd_role_stop_dev(wl);
2892 }
f5fc0f86 2893
784f694d 2894 ret = wl1271_scan(hw->priv, vif, ssid, len, req);
251c177f 2895out_sleep:
f5fc0f86 2896 wl1271_ps_elp_sleep(wl);
f5fc0f86
LC
2897out:
2898 mutex_unlock(&wl->mutex);
2899
2900 return ret;
2901}
2902
73ecce31
EP
2903static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw,
2904 struct ieee80211_vif *vif)
2905{
2906 struct wl1271 *wl = hw->priv;
2907 int ret;
2908
2909 wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan");
2910
2911 mutex_lock(&wl->mutex);
2912
2913 if (wl->state == WL1271_STATE_OFF)
2914 goto out;
2915
2916 if (wl->scan.state == WL1271_SCAN_STATE_IDLE)
2917 goto out;
2918
2919 ret = wl1271_ps_elp_wakeup(wl);
2920 if (ret < 0)
2921 goto out;
2922
2923 if (wl->scan.state != WL1271_SCAN_STATE_DONE) {
2924 ret = wl1271_scan_stop(wl);
2925 if (ret < 0)
2926 goto out_sleep;
2927 }
2928 wl->scan.state = WL1271_SCAN_STATE_IDLE;
2929 memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
784f694d 2930 wl->scan_vif = NULL;
73ecce31
EP
2931 wl->scan.req = NULL;
2932 ieee80211_scan_completed(wl->hw, true);
2933
2934out_sleep:
2935 wl1271_ps_elp_sleep(wl);
2936out:
2937 mutex_unlock(&wl->mutex);
2938
2939 cancel_delayed_work_sync(&wl->scan_complete_work);
2940}
2941
33c2c06c
LC
2942static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
2943 struct ieee80211_vif *vif,
2944 struct cfg80211_sched_scan_request *req,
2945 struct ieee80211_sched_scan_ies *ies)
2946{
2947 struct wl1271 *wl = hw->priv;
2948 int ret;
2949
2950 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start");
2951
2952 mutex_lock(&wl->mutex);
2953
2954 ret = wl1271_ps_elp_wakeup(wl);
2955 if (ret < 0)
2956 goto out;
2957
2958 ret = wl1271_scan_sched_scan_config(wl, req, ies);
2959 if (ret < 0)
2960 goto out_sleep;
2961
2962 ret = wl1271_scan_sched_scan_start(wl);
2963 if (ret < 0)
2964 goto out_sleep;
2965
2966 wl->sched_scanning = true;
2967
2968out_sleep:
2969 wl1271_ps_elp_sleep(wl);
2970out:
2971 mutex_unlock(&wl->mutex);
2972 return ret;
2973}
2974
2975static void wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
2976 struct ieee80211_vif *vif)
2977{
2978 struct wl1271 *wl = hw->priv;
2979 int ret;
2980
2981 wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop");
2982
2983 mutex_lock(&wl->mutex);
2984
2985 ret = wl1271_ps_elp_wakeup(wl);
2986 if (ret < 0)
2987 goto out;
2988
2989 wl1271_scan_sched_scan_stop(wl);
2990
2991 wl1271_ps_elp_sleep(wl);
2992out:
2993 mutex_unlock(&wl->mutex);
2994}
2995
68d069c4
AN
2996static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
2997{
2998 struct wl1271 *wl = hw->priv;
2999 int ret = 0;
3000
3001 mutex_lock(&wl->mutex);
3002
3003 if (unlikely(wl->state == WL1271_STATE_OFF)) {
3004 ret = -EAGAIN;
3005 goto out;
3006 }
3007
a620865e 3008 ret = wl1271_ps_elp_wakeup(wl);
68d069c4
AN
3009 if (ret < 0)
3010 goto out;
3011
5f704d18 3012 ret = wl1271_acx_frag_threshold(wl, value);
68d069c4
AN
3013 if (ret < 0)
3014 wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
3015
3016 wl1271_ps_elp_sleep(wl);
3017
3018out:
3019 mutex_unlock(&wl->mutex);
3020
3021 return ret;
3022}
3023
f5fc0f86
LC
3024static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3025{
3026 struct wl1271 *wl = hw->priv;
aecb0565 3027 int ret = 0;
f5fc0f86
LC
3028
3029 mutex_lock(&wl->mutex);
3030
f8d9802f
JO
3031 if (unlikely(wl->state == WL1271_STATE_OFF)) {
3032 ret = -EAGAIN;
aecb0565 3033 goto out;
f8d9802f 3034 }
aecb0565 3035
a620865e 3036 ret = wl1271_ps_elp_wakeup(wl);
f5fc0f86
LC
3037 if (ret < 0)
3038 goto out;
3039
5f704d18 3040 ret = wl1271_acx_rts_threshold(wl, value);
f5fc0f86
LC
3041 if (ret < 0)
3042 wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
3043
3044 wl1271_ps_elp_sleep(wl);
3045
3046out:
3047 mutex_unlock(&wl->mutex);
3048
3049 return ret;
3050}
3051
e78a287a 3052static int wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *skb,
2f6724b2 3053 int offset)
30240fc7 3054{
889cb360
EP
3055 u8 ssid_len;
3056 const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset,
3057 skb->len - offset);
30240fc7 3058
889cb360
EP
3059 if (!ptr) {
3060 wl1271_error("No SSID in IEs!");
3061 return -ENOENT;
3062 }
3063
3064 ssid_len = ptr[1];
3065 if (ssid_len > IEEE80211_MAX_SSID_LEN) {
3066 wl1271_error("SSID is too long!");
3067 return -EINVAL;
30240fc7 3068 }
e78a287a 3069
889cb360
EP
3070 wl->ssid_len = ssid_len;
3071 memcpy(wl->ssid, ptr+2, ssid_len);
3072 return 0;
30240fc7
JO
3073}
3074
d48055d9
EP
3075static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset)
3076{
3077 int len;
3078 const u8 *next, *end = skb->data + skb->len;
3079 u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset,
3080 skb->len - ieoffset);
3081 if (!ie)
3082 return;
3083 len = ie[1] + 2;
3084 next = ie + len;
3085 memmove(ie, next, end - next);
3086 skb_trim(skb, skb->len - len);
3087}
3088
26b4bf2e
EP
3089static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
3090 unsigned int oui, u8 oui_type,
3091 int ieoffset)
3092{
3093 int len;
3094 const u8 *next, *end = skb->data + skb->len;
3095 u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
3096 skb->data + ieoffset,
3097 skb->len - ieoffset);
3098 if (!ie)
3099 return;
3100 len = ie[1] + 2;
3101 next = ie + len;
3102 memmove(ie, next, end - next);
3103 skb_trim(skb, skb->len - len);
3104}
3105
68eaaf6e
AN
3106static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl,
3107 u8 *probe_rsp_data,
3108 size_t probe_rsp_len,
3109 u32 rates)
3110{
3111 struct ieee80211_bss_conf *bss_conf = &wl->vif->bss_conf;
3112 u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE];
3113 int ssid_ie_offset, ie_offset, templ_len;
3114 const u8 *ptr;
3115
3116 /* no need to change probe response if the SSID is set correctly */
3117 if (wl->ssid_len > 0)
3118 return wl1271_cmd_template_set(wl,
3119 CMD_TEMPL_AP_PROBE_RESPONSE,
3120 probe_rsp_data,
3121 probe_rsp_len, 0,
3122 rates);
3123
3124 if (probe_rsp_len + bss_conf->ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) {
3125 wl1271_error("probe_rsp template too big");
3126 return -EINVAL;
3127 }
3128
3129 /* start searching from IE offset */
3130 ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
3131
3132 ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset,
3133 probe_rsp_len - ie_offset);
3134 if (!ptr) {
3135 wl1271_error("No SSID in beacon!");
3136 return -EINVAL;
3137 }
3138
3139 ssid_ie_offset = ptr - probe_rsp_data;
3140 ptr += (ptr[1] + 2);
3141
3142 memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset);
3143
3144 /* insert SSID from bss_conf */
3145 probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID;
3146 probe_rsp_templ[ssid_ie_offset + 1] = bss_conf->ssid_len;
3147 memcpy(probe_rsp_templ + ssid_ie_offset + 2,
3148 bss_conf->ssid, bss_conf->ssid_len);
3149 templ_len = ssid_ie_offset + 2 + bss_conf->ssid_len;
3150
3151 memcpy(probe_rsp_templ + ssid_ie_offset + 2 + bss_conf->ssid_len,
3152 ptr, probe_rsp_len - (ptr - probe_rsp_data));
3153 templ_len += probe_rsp_len - (ptr - probe_rsp_data);
3154
3155 return wl1271_cmd_template_set(wl,
3156 CMD_TEMPL_AP_PROBE_RESPONSE,
3157 probe_rsp_templ,
3158 templ_len, 0,
3159 rates);
3160}
3161
e78a287a 3162static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
f5fc0f86
LC
3163 struct ieee80211_bss_conf *bss_conf,
3164 u32 changed)
3165{
e78a287a 3166 int ret = 0;
f5fc0f86 3167
e78a287a
AN
3168 if (changed & BSS_CHANGED_ERP_SLOT) {
3169 if (bss_conf->use_short_slot)
3170 ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
3171 else
3172 ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
3173 if (ret < 0) {
3174 wl1271_warning("Set slot time failed %d", ret);
3175 goto out;
3176 }
3177 }
f5fc0f86 3178
e78a287a
AN
3179 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3180 if (bss_conf->use_short_preamble)
3181 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
3182 else
3183 wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
3184 }
f5fc0f86 3185
e78a287a
AN
3186 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
3187 if (bss_conf->use_cts_prot)
3188 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
3189 else
3190 ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
3191 if (ret < 0) {
3192 wl1271_warning("Set ctsprotect failed %d", ret);
3193 goto out;
3194 }
3195 }
f8d9802f 3196
e78a287a
AN
3197out:
3198 return ret;
3199}
f5fc0f86 3200
e78a287a
AN
3201static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
3202 struct ieee80211_vif *vif,
3203 struct ieee80211_bss_conf *bss_conf,
3204 u32 changed)
3205{
3206 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
3207 int ret = 0;
3208
3209 if ((changed & BSS_CHANGED_BEACON_INT)) {
3210 wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
60e84c2e
JO
3211 bss_conf->beacon_int);
3212
3213 wl->beacon_int = bss_conf->beacon_int;
60e84c2e
JO
3214 }
3215
e78a287a
AN
3216 if ((changed & BSS_CHANGED_BEACON)) {
3217 struct ieee80211_hdr *hdr;
af7fbb28 3218 u32 min_rate;
e78a287a
AN
3219 int ieoffset = offsetof(struct ieee80211_mgmt,
3220 u.beacon.variable);
3221 struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
3222 u16 tmpl_id;
3223
3224 if (!beacon)
3225 goto out;
3226
3227 wl1271_debug(DEBUG_MASTER, "beacon updated");
3228
3229 ret = wl1271_ssid_set(wl, beacon, ieoffset);
3230 if (ret < 0) {
3231 dev_kfree_skb(beacon);
3232 goto out;
3233 }
af7fbb28 3234 min_rate = wl1271_tx_min_rate_get(wl, wl->basic_rate_set);
e78a287a
AN
3235 tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
3236 CMD_TEMPL_BEACON;
3237 ret = wl1271_cmd_template_set(wl, tmpl_id,
3238 beacon->data,
3239 beacon->len, 0,
af7fbb28 3240 min_rate);
e78a287a
AN
3241 if (ret < 0) {
3242 dev_kfree_skb(beacon);
3243 goto out;
3244 }
3245
d48055d9
EP
3246 /* remove TIM ie from probe response */
3247 wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset);
3248
26b4bf2e
EP
3249 /*
3250 * remove p2p ie from probe response.
3251 * the fw reponds to probe requests that don't include
3252 * the p2p ie. probe requests with p2p ie will be passed,
3253 * and will be responded by the supplicant (the spec
3254 * forbids including the p2p ie when responding to probe
3255 * requests that didn't include it).
3256 */
3257 wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA,
3258 WLAN_OUI_TYPE_WFA_P2P, ieoffset);
3259
e78a287a
AN
3260 hdr = (struct ieee80211_hdr *) beacon->data;
3261 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
3262 IEEE80211_STYPE_PROBE_RESP);
68eaaf6e
AN
3263 if (is_ap)
3264 ret = wl1271_ap_set_probe_resp_tmpl(wl,
3265 beacon->data,
3266 beacon->len,
af7fbb28 3267 min_rate);
68eaaf6e
AN
3268 else
3269 ret = wl1271_cmd_template_set(wl,
3270 CMD_TEMPL_PROBE_RESPONSE,
3271 beacon->data,
3272 beacon->len, 0,
af7fbb28 3273 min_rate);
e78a287a
AN
3274 dev_kfree_skb(beacon);
3275 if (ret < 0)
3276 goto out;
3277 }
3278
3279out:
3280 return ret;
3281}
3282
3283/* AP mode changes */
3284static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
3285 struct ieee80211_vif *vif,
3286 struct ieee80211_bss_conf *bss_conf,
3287 u32 changed)
3288{
3289 int ret = 0;
e0d8bbf0 3290
e78a287a
AN
3291 if ((changed & BSS_CHANGED_BASIC_RATES)) {
3292 u32 rates = bss_conf->basic_rates;
5da11dcd 3293
af7fbb28
EP
3294 wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
3295 wl->band);
3296 wl->basic_rate = wl1271_tx_min_rate_get(wl,
3297 wl->basic_rate_set);
70f47424
AN
3298
3299 ret = wl1271_init_ap_rates(wl);
e78a287a 3300 if (ret < 0) {
70f47424 3301 wl1271_error("AP rate policy change failed %d", ret);
e78a287a
AN
3302 goto out;
3303 }
c45a85b5 3304
784f694d 3305 ret = wl1271_ap_init_templates(wl, vif);
c45a85b5
AN
3306 if (ret < 0)
3307 goto out;
e78a287a 3308 }
2f6724b2 3309
e78a287a
AN
3310 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
3311 if (ret < 0)
3312 goto out;
30240fc7 3313
e78a287a
AN
3314 if ((changed & BSS_CHANGED_BEACON_ENABLED)) {
3315 if (bss_conf->enable_beacon) {
3316 if (!test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
c690ec81 3317 ret = wl12xx_cmd_role_start_ap(wl);
e78a287a
AN
3318 if (ret < 0)
3319 goto out;
e0d8bbf0 3320
7f179b46
AN
3321 ret = wl1271_ap_init_hwenc(wl);
3322 if (ret < 0)
3323 goto out;
cf42039f
AN
3324
3325 set_bit(WL1271_FLAG_AP_STARTED, &wl->flags);
3326 wl1271_debug(DEBUG_AP, "started AP");
e0d8bbf0 3327 }
e78a287a
AN
3328 } else {
3329 if (test_bit(WL1271_FLAG_AP_STARTED, &wl->flags)) {
c690ec81 3330 ret = wl12xx_cmd_role_stop_ap(wl);
e78a287a
AN
3331 if (ret < 0)
3332 goto out;
e0d8bbf0 3333
e78a287a
AN
3334 clear_bit(WL1271_FLAG_AP_STARTED, &wl->flags);
3335 wl1271_debug(DEBUG_AP, "stopped AP");
3336 }
3337 }
3338 }
e0d8bbf0 3339
e78a287a
AN
3340 ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
3341 if (ret < 0)
3342 goto out;
0b932ab9
AN
3343
3344 /* Handle HT information change */
3345 if ((changed & BSS_CHANGED_HT) &&
3346 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
3347 ret = wl1271_acx_set_ht_information(wl,
3348 bss_conf->ht_operation_mode);
3349 if (ret < 0) {
3350 wl1271_warning("Set ht information failed %d", ret);
3351 goto out;
3352 }
3353 }
3354
e78a287a
AN
3355out:
3356 return;
3357}
8bf29b0e 3358
e78a287a
AN
3359/* STA/IBSS mode changes */
3360static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
3361 struct ieee80211_vif *vif,
3362 struct ieee80211_bss_conf *bss_conf,
3363 u32 changed)
3364{
3365 bool do_join = false, set_assoc = false;
3366 bool is_ibss = (wl->bss_type == BSS_TYPE_IBSS);
227e81e1 3367 bool ibss_joined = false;
72c2d9e5 3368 u32 sta_rate_set = 0;
e78a287a 3369 int ret;
2d6e4e76 3370 struct ieee80211_sta *sta;
a100885d
AN
3371 bool sta_exists = false;
3372 struct ieee80211_sta_ht_cap sta_ht_cap;
e78a287a
AN
3373
3374 if (is_ibss) {
3375 ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
3376 changed);
3377 if (ret < 0)
3378 goto out;
e0d8bbf0
JO
3379 }
3380
227e81e1
EP
3381 if (changed & BSS_CHANGED_IBSS) {
3382 if (bss_conf->ibss_joined) {
3383 set_bit(WL1271_FLAG_IBSS_JOINED, &wl->flags);
3384 ibss_joined = true;
3385 } else {
3386 if (test_and_clear_bit(WL1271_FLAG_IBSS_JOINED,
3387 &wl->flags)) {
3388 wl1271_unjoin(wl);
3389 wl12xx_cmd_role_start_dev(wl);
3390 wl12xx_roc(wl, wl->dev_role_id);
3391 }
3392 }
3393 }
3394
3395 if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined)
e78a287a
AN
3396 do_join = true;
3397
3398 /* Need to update the SSID (for filtering etc) */
227e81e1 3399 if ((changed & BSS_CHANGED_BEACON) && ibss_joined)
e78a287a
AN
3400 do_join = true;
3401
227e81e1 3402 if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) {
5da11dcd
JO
3403 wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
3404 bss_conf->enable_beacon ? "enabled" : "disabled");
3405
3406 if (bss_conf->enable_beacon)
3407 wl->set_bss_type = BSS_TYPE_IBSS;
3408 else
3409 wl->set_bss_type = BSS_TYPE_STA_BSS;
3410 do_join = true;
3411 }
3412
e78a287a 3413 if ((changed & BSS_CHANGED_CQM)) {
00236aed
JO
3414 bool enable = false;
3415 if (bss_conf->cqm_rssi_thold)
3416 enable = true;
3417 ret = wl1271_acx_rssi_snr_trigger(wl, enable,
3418 bss_conf->cqm_rssi_thold,
3419 bss_conf->cqm_rssi_hyst);
3420 if (ret < 0)
3421 goto out;
3422 wl->rssi_thold = bss_conf->cqm_rssi_thold;
3423 }
3424
30240fc7
JO
3425 if ((changed & BSS_CHANGED_BSSID) &&
3426 /*
3427 * Now we know the correct bssid, so we send a new join command
3428 * and enable the BSSID filter
3429 */
3430 memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
e78a287a 3431 memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
a0cb7be4 3432
fa287b8f
EP
3433 if (!is_zero_ether_addr(wl->bssid)) {
3434 ret = wl1271_cmd_build_null_data(wl);
3435 if (ret < 0)
3436 goto out;
30240fc7 3437
784f694d 3438 ret = wl1271_build_qos_null_data(wl, vif);
fa287b8f
EP
3439 if (ret < 0)
3440 goto out;
30240fc7 3441
fa287b8f
EP
3442 /* Need to update the BSSID (for filtering etc) */
3443 do_join = true;
3444 }
30240fc7
JO
3445 }
3446
0f9c8250
AN
3447 if (changed & (BSS_CHANGED_ASSOC | BSS_CHANGED_HT)) {
3448 rcu_read_lock();
3449 sta = ieee80211_find_sta(vif, bss_conf->bssid);
3450 if (!sta)
3451 goto sta_not_found;
3452
72c2d9e5
EP
3453 /* save the supp_rates of the ap */
3454 sta_rate_set = sta->supp_rates[wl->hw->conf.channel->band];
3455 if (sta->ht_cap.ht_supported)
3456 sta_rate_set |=
3457 (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
a100885d
AN
3458 sta_ht_cap = sta->ht_cap;
3459 sta_exists = true;
72c2d9e5 3460
0f9c8250
AN
3461sta_not_found:
3462 rcu_read_unlock();
72c2d9e5 3463 }
72c2d9e5 3464
e78a287a 3465 if ((changed & BSS_CHANGED_ASSOC)) {
f5fc0f86 3466 if (bss_conf->assoc) {
ebba60c6 3467 u32 rates;
2f6724b2 3468 int ieoffset;
f5fc0f86 3469 wl->aid = bss_conf->aid;
69e5434c 3470 set_assoc = true;
f5fc0f86 3471
90494a90
JO
3472 wl->ps_poll_failures = 0;
3473
ebba60c6
JO
3474 /*
3475 * use basic rates from AP, and determine lowest rate
3476 * to use with control frames.
3477 */
3478 rates = bss_conf->basic_rates;
af7fbb28
EP
3479 wl->basic_rate_set =
3480 wl1271_tx_enabled_rates_get(wl, rates,
3481 wl->band);
3482 wl->basic_rate =
3483 wl1271_tx_min_rate_get(wl, wl->basic_rate_set);
72c2d9e5
EP
3484 if (sta_rate_set)
3485 wl->rate_set = wl1271_tx_enabled_rates_get(wl,
af7fbb28
EP
3486 sta_rate_set,
3487 wl->band);
79b223f4 3488 ret = wl1271_acx_sta_rate_policies(wl);
ebba60c6 3489 if (ret < 0)
e78a287a 3490 goto out;
ebba60c6 3491
ae751bab
LC
3492 /*
3493 * with wl1271, we don't need to update the
3494 * beacon_int and dtim_period, because the firmware
3495 * updates it by itself when the first beacon is
3496 * received after a join.
3497 */
f5fc0f86
LC
3498 ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
3499 if (ret < 0)
e78a287a 3500 goto out;
f5fc0f86 3501
c2b2d99b 3502 /*
2f6724b2 3503 * Get a template for hardware connection maintenance
c2b2d99b 3504 */
2f6724b2
JO
3505 dev_kfree_skb(wl->probereq);
3506 wl->probereq = wl1271_cmd_build_ap_probe_req(wl, NULL);
3507 ieoffset = offsetof(struct ieee80211_mgmt,
3508 u.probe_req.variable);
3509 wl1271_ssid_set(wl, wl->probereq, ieoffset);
c2b2d99b 3510
6ccbb92e
JO
3511 /* enable the connection monitoring feature */
3512 ret = wl1271_acx_conn_monit_params(wl, true);
f5fc0f86 3513 if (ret < 0)
e78a287a 3514 goto out;
d94cd297
JO
3515 } else {
3516 /* use defaults when not associated */
30df14d0
EP
3517 bool was_assoc =
3518 !!test_and_clear_bit(WL1271_FLAG_STA_ASSOCIATED,
3519 &wl->flags);
251c177f
EP
3520 bool was_ifup =
3521 !!test_and_clear_bit(WL1271_FLAG_STA_STATE_SENT,
3522 &wl->flags);
d94cd297 3523 wl->aid = 0;
6ccbb92e 3524
2f6724b2
JO
3525 /* free probe-request template */
3526 dev_kfree_skb(wl->probereq);
3527 wl->probereq = NULL;
3528
8d2ef7bd 3529 /* re-enable dynamic ps - just in case */
f532be6d 3530 ieee80211_enable_dyn_ps(wl->vif);
8d2ef7bd 3531
ebba60c6
JO
3532 /* revert back to minimum rates for the current band */
3533 wl1271_set_band_rate(wl);
af7fbb28
EP
3534 wl->basic_rate =
3535 wl1271_tx_min_rate_get(wl, wl->basic_rate_set);
79b223f4 3536 ret = wl1271_acx_sta_rate_policies(wl);
ebba60c6 3537 if (ret < 0)
e78a287a 3538 goto out;
ebba60c6 3539
6ccbb92e
JO
3540 /* disable connection monitor features */
3541 ret = wl1271_acx_conn_monit_params(wl, false);
c1899554
JO
3542
3543 /* Disable the keep-alive feature */
3544 ret = wl1271_acx_keep_alive_mode(wl, false);
6ccbb92e 3545 if (ret < 0)
e78a287a 3546 goto out;
b84a7d3d
JO
3547
3548 /* restore the bssid filter and go to dummy bssid */
30df14d0 3549 if (was_assoc) {
251c177f
EP
3550 u32 conf_flags = wl->hw->conf.flags;
3551 /*
3552 * we might have to disable roc, if there was
3553 * no IF_OPER_UP notification.
3554 */
3555 if (!was_ifup) {
3556 ret = wl12xx_croc(wl, wl->role_id);
3557 if (ret < 0)
3558 goto out;
3559 }
3560 /*
3561 * (we also need to disable roc in case of
3562 * roaming on the same channel. until we will
3563 * have a better flow...)
3564 */
3565 if (test_bit(wl->dev_role_id, wl->roc_map)) {
3566 ret = wl12xx_croc(wl, wl->dev_role_id);
3567 if (ret < 0)
3568 goto out;
3569 }
3570
30df14d0 3571 wl1271_unjoin(wl);
251c177f
EP
3572 if (!(conf_flags & IEEE80211_CONF_IDLE)) {
3573 wl12xx_cmd_role_start_dev(wl);
3574 wl12xx_roc(wl, wl->dev_role_id);
3575 }
30df14d0 3576 }
f5fc0f86 3577 }
f5fc0f86
LC
3578 }
3579
d192d268
EP
3580 if (changed & BSS_CHANGED_IBSS) {
3581 wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d",
3582 bss_conf->ibss_joined);
3583
3584 if (bss_conf->ibss_joined) {
3585 u32 rates = bss_conf->basic_rates;
af7fbb28
EP
3586 wl->basic_rate_set =
3587 wl1271_tx_enabled_rates_get(wl, rates,
3588 wl->band);
3589 wl->basic_rate =
3590 wl1271_tx_min_rate_get(wl, wl->basic_rate_set);
d192d268 3591
06b660e1 3592 /* by default, use 11b + OFDM rates */
d192d268
EP
3593 wl->rate_set = CONF_TX_IBSS_DEFAULT_RATES;
3594 ret = wl1271_acx_sta_rate_policies(wl);
3595 if (ret < 0)
3596 goto out;
3597 }
3598 }
3599
e78a287a
AN
3600 ret = wl1271_bss_erp_info_changed(wl, bss_conf, changed);
3601 if (ret < 0)
3602 goto out;
f5fc0f86 3603
ca52a5eb
JO
3604 if (changed & BSS_CHANGED_ARP_FILTER) {
3605 __be32 addr = bss_conf->arp_addr_list[0];
3606 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
3607
c5312772
EP
3608 if (bss_conf->arp_addr_cnt == 1 &&
3609 bss_conf->arp_filter_enabled) {
3610 /*
3611 * The template should have been configured only upon
3612 * association. however, it seems that the correct ip
3613 * isn't being set (when sending), so we have to
3614 * reconfigure the template upon every ip change.
3615 */
3616 ret = wl1271_cmd_build_arp_rsp(wl, addr);
3617 if (ret < 0) {
3618 wl1271_warning("build arp rsp failed: %d", ret);
e78a287a 3619 goto out;
c5312772
EP
3620 }
3621
3622 ret = wl1271_acx_arp_ip_filter(wl,
e5e2f24b 3623 ACX_ARP_FILTER_ARP_FILTERING,
c5312772
EP
3624 addr);
3625 } else
3626 ret = wl1271_acx_arp_ip_filter(wl, 0, addr);
ca52a5eb
JO
3627
3628 if (ret < 0)
e78a287a 3629 goto out;
ca52a5eb
JO
3630 }
3631
8bf29b0e 3632 if (do_join) {
69e5434c 3633 ret = wl1271_join(wl, set_assoc);
8bf29b0e
JO
3634 if (ret < 0) {
3635 wl1271_warning("cmd join failed %d", ret);
e78a287a 3636 goto out;
8bf29b0e 3637 }
251c177f
EP
3638
3639 /* ROC until connected (after EAPOL exchange) */
3640 if (!is_ibss) {
3641 ret = wl12xx_roc(wl, wl->role_id);
3642 if (ret < 0)
3643 goto out;
3644
3645 wl1271_check_operstate(wl,
3646 ieee80211_get_operstate(vif));
3647 }
3648 /*
3649 * stop device role if started (we might already be in
3650 * STA role). TODO: make it better.
3651 */
3652 if (wl->dev_role_id != WL12XX_INVALID_ROLE_ID) {
3653 ret = wl12xx_croc(wl, wl->dev_role_id);
3654 if (ret < 0)
3655 goto out;
3656
3657 ret = wl12xx_cmd_role_stop_dev(wl);
3658 if (ret < 0)
3659 goto out;
3660 }
05dba355
EP
3661
3662 /* If we want to go in PSM but we're not there yet */
3663 if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
3664 !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
3665 enum wl1271_cmd_ps_mode mode;
3666
3667 mode = STATION_POWER_SAVE_MODE;
3668 ret = wl1271_ps_set_mode(wl, mode,
3669 wl->basic_rate,
3670 true);
3671 if (ret < 0)
3672 goto out;
3673 }
c1899554
JO
3674 }
3675
0b932ab9 3676 /* Handle new association with HT. Do this after join. */
0f9c8250
AN
3677 if (sta_exists) {
3678 if ((changed & BSS_CHANGED_HT) &&
3679 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
0b932ab9
AN
3680 ret = wl1271_acx_set_ht_capabilities(wl,
3681 &sta_ht_cap,
3682 true,
3683 wl->sta_hlid);
0f9c8250
AN
3684 if (ret < 0) {
3685 wl1271_warning("Set ht cap true failed %d",
3686 ret);
3687 goto out;
3688 }
3689 }
3690 /* handle new association without HT and disassociation */
3691 else if (changed & BSS_CHANGED_ASSOC) {
0b932ab9
AN
3692 ret = wl1271_acx_set_ht_capabilities(wl,
3693 &sta_ht_cap,
3694 false,
3695 wl->sta_hlid);
0f9c8250
AN
3696 if (ret < 0) {
3697 wl1271_warning("Set ht cap false failed %d",
3698 ret);
3699 goto out;
3700 }
3701 }
3702 }
3703
0b932ab9
AN
3704 /* Handle HT information change. Done after join. */
3705 if ((changed & BSS_CHANGED_HT) &&
0f9c8250
AN
3706 (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
3707 ret = wl1271_acx_set_ht_information(wl,
3708 bss_conf->ht_operation_mode);
3709 if (ret < 0) {
3710 wl1271_warning("Set ht information failed %d", ret);
3711 goto out;
3712 }
3713 }
3714
e78a287a
AN
3715out:
3716 return;
3717}
3718
3719static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
3720 struct ieee80211_vif *vif,
3721 struct ieee80211_bss_conf *bss_conf,
3722 u32 changed)
3723{
3724 struct wl1271 *wl = hw->priv;
3725 bool is_ap = (wl->bss_type == BSS_TYPE_AP_BSS);
3726 int ret;
3727
3728 wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed 0x%x",
3729 (int)changed);
3730
3731 mutex_lock(&wl->mutex);
3732
3733 if (unlikely(wl->state == WL1271_STATE_OFF))
3734 goto out;
3735
a620865e 3736 ret = wl1271_ps_elp_wakeup(wl);
e78a287a
AN
3737 if (ret < 0)
3738 goto out;
3739
3740 if (is_ap)
3741 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
3742 else
3743 wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
3744
f5fc0f86
LC
3745 wl1271_ps_elp_sleep(wl);
3746
3747out:
3748 mutex_unlock(&wl->mutex);
3749}
3750
8a3a3c85
EP
3751static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
3752 struct ieee80211_vif *vif, u16 queue,
c6999d83
KV
3753 const struct ieee80211_tx_queue_params *params)
3754{
3755 struct wl1271 *wl = hw->priv;
4695dc91 3756 u8 ps_scheme;
488fc540 3757 int ret = 0;
c6999d83
KV
3758
3759 mutex_lock(&wl->mutex);
3760
3761 wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
3762
4695dc91
KV
3763 if (params->uapsd)
3764 ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
3765 else
3766 ps_scheme = CONF_PS_SCHEME_LEGACY;
3767
488fc540
AN
3768 if (wl->state == WL1271_STATE_OFF) {
3769 /*
3770 * If the state is off, the parameters will be recorded and
3771 * configured on init. This happens in AP-mode.
3772 */
3773 struct conf_tx_ac_category *conf_ac =
3774 &wl->conf.tx.ac_conf[wl1271_tx_get_queue(queue)];
3775 struct conf_tx_tid *conf_tid =
3776 &wl->conf.tx.tid_conf[wl1271_tx_get_queue(queue)];
3777
3778 conf_ac->ac = wl1271_tx_get_queue(queue);
3779 conf_ac->cw_min = (u8)params->cw_min;
3780 conf_ac->cw_max = params->cw_max;
3781 conf_ac->aifsn = params->aifs;
3782 conf_ac->tx_op_limit = params->txop << 5;
3783
3784 conf_tid->queue_id = wl1271_tx_get_queue(queue);
3785 conf_tid->channel_type = CONF_CHANNEL_TYPE_EDCF;
3786 conf_tid->tsid = wl1271_tx_get_queue(queue);
3787 conf_tid->ps_scheme = ps_scheme;
3788 conf_tid->ack_policy = CONF_ACK_POLICY_LEGACY;
3789 conf_tid->apsd_conf[0] = 0;
3790 conf_tid->apsd_conf[1] = 0;
c1b193eb
EP
3791 goto out;
3792 }
488fc540 3793
c1b193eb
EP
3794 ret = wl1271_ps_elp_wakeup(wl);
3795 if (ret < 0)
3796 goto out;
488fc540 3797
c1b193eb
EP
3798 /*
3799 * the txop is confed in units of 32us by the mac80211,
3800 * we need us
3801 */
3802 ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
3803 params->cw_min, params->cw_max,
3804 params->aifs, params->txop << 5);
3805 if (ret < 0)
3806 goto out_sleep;
3807
3808 ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
3809 CONF_CHANNEL_TYPE_EDCF,
3810 wl1271_tx_get_queue(queue),
3811 ps_scheme, CONF_ACK_POLICY_LEGACY,
3812 0, 0);
c82c1dde
KV
3813
3814out_sleep:
c1b193eb 3815 wl1271_ps_elp_sleep(wl);
c6999d83
KV
3816
3817out:
3818 mutex_unlock(&wl->mutex);
3819
3820 return ret;
3821}
3822
37a41b4a
EP
3823static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
3824 struct ieee80211_vif *vif)
bbbb538e
JO
3825{
3826
3827 struct wl1271 *wl = hw->priv;
3828 u64 mactime = ULLONG_MAX;
3829 int ret;
3830
3831 wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
3832
3833 mutex_lock(&wl->mutex);
3834
f8d9802f
JO
3835 if (unlikely(wl->state == WL1271_STATE_OFF))
3836 goto out;
3837
a620865e 3838 ret = wl1271_ps_elp_wakeup(wl);
bbbb538e
JO
3839 if (ret < 0)
3840 goto out;
3841
3842 ret = wl1271_acx_tsf_info(wl, &mactime);
3843 if (ret < 0)
3844 goto out_sleep;
3845
3846out_sleep:
3847 wl1271_ps_elp_sleep(wl);
3848
3849out:
3850 mutex_unlock(&wl->mutex);
3851 return mactime;
3852}
f5fc0f86 3853
ece550d0
JL
3854static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
3855 struct survey_info *survey)
3856{
3857 struct wl1271 *wl = hw->priv;
3858 struct ieee80211_conf *conf = &hw->conf;
b739a42c 3859
ece550d0
JL
3860 if (idx != 0)
3861 return -ENOENT;
b739a42c 3862
ece550d0
JL
3863 survey->channel = conf->channel;
3864 survey->filled = SURVEY_INFO_NOISE_DBM;
3865 survey->noise = wl->noise;
b739a42c 3866
ece550d0
JL
3867 return 0;
3868}
3869
409622ec 3870static int wl1271_allocate_sta(struct wl1271 *wl,
f84f7d78
AN
3871 struct ieee80211_sta *sta,
3872 u8 *hlid)
3873{
3874 struct wl1271_station *wl_sta;
3875 int id;
3876
3877 id = find_first_zero_bit(wl->ap_hlid_map, AP_MAX_STATIONS);
3878 if (id >= AP_MAX_STATIONS) {
3879 wl1271_warning("could not allocate HLID - too much stations");
3880 return -EBUSY;
3881 }
3882
3883 wl_sta = (struct wl1271_station *)sta->drv_priv;
04216da3 3884 set_bit(id, wl->ap_hlid_map);
f84f7d78
AN
3885 wl_sta->hlid = WL1271_AP_STA_HLID_START + id;
3886 *hlid = wl_sta->hlid;
b622d992 3887 memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
da03209e 3888 wl->active_sta_count++;
f84f7d78
AN
3889 return 0;
3890}
3891
f1acea9a 3892void wl1271_free_sta(struct wl1271 *wl, u8 hlid)
f84f7d78
AN
3893{
3894 int id = hlid - WL1271_AP_STA_HLID_START;
3895
f1acea9a
AN
3896 if (hlid < WL1271_AP_STA_HLID_START)
3897 return;
3898
3899 if (!test_bit(id, wl->ap_hlid_map))
409622ec
AN
3900 return;
3901
04216da3 3902 clear_bit(id, wl->ap_hlid_map);
b622d992 3903 memset(wl->links[hlid].addr, 0, ETH_ALEN);
0f9c8250 3904 wl->links[hlid].ba_bitmap = 0;
a8c0ddb5 3905 wl1271_tx_reset_link_queues(wl, hlid);
b622d992
AN
3906 __clear_bit(hlid, &wl->ap_ps_map);
3907 __clear_bit(hlid, (unsigned long *)&wl->ap_fw_ps_map);
da03209e 3908 wl->active_sta_count--;
f84f7d78
AN
3909}
3910
3911static int wl1271_op_sta_add(struct ieee80211_hw *hw,
3912 struct ieee80211_vif *vif,
3913 struct ieee80211_sta *sta)
3914{
3915 struct wl1271 *wl = hw->priv;
3916 int ret = 0;
3917 u8 hlid;
3918
3919 mutex_lock(&wl->mutex);
3920
3921 if (unlikely(wl->state == WL1271_STATE_OFF))
3922 goto out;
3923
3924 if (wl->bss_type != BSS_TYPE_AP_BSS)
3925 goto out;
3926
3927 wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
3928
409622ec 3929 ret = wl1271_allocate_sta(wl, sta, &hlid);
f84f7d78
AN
3930 if (ret < 0)
3931 goto out;
3932
a620865e 3933 ret = wl1271_ps_elp_wakeup(wl);
f84f7d78 3934 if (ret < 0)
409622ec 3935 goto out_free_sta;
f84f7d78 3936
c690ec81 3937 ret = wl12xx_cmd_add_peer(wl, sta, hlid);
f84f7d78
AN
3938 if (ret < 0)
3939 goto out_sleep;
3940
b67476ef
EP
3941 ret = wl12xx_cmd_set_peer_state(wl, hlid);
3942 if (ret < 0)
3943 goto out_sleep;
3944
0b932ab9
AN
3945 ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true, hlid);
3946 if (ret < 0)
3947 goto out_sleep;
3948
f84f7d78
AN
3949out_sleep:
3950 wl1271_ps_elp_sleep(wl);
3951
409622ec
AN
3952out_free_sta:
3953 if (ret < 0)
3954 wl1271_free_sta(wl, hlid);
3955
f84f7d78
AN
3956out:
3957 mutex_unlock(&wl->mutex);
3958 return ret;
3959}
3960
3961static int wl1271_op_sta_remove(struct ieee80211_hw *hw,
3962 struct ieee80211_vif *vif,
3963 struct ieee80211_sta *sta)
3964{
3965 struct wl1271 *wl = hw->priv;
3966 struct wl1271_station *wl_sta;
3967 int ret = 0, id;
3968
3969 mutex_lock(&wl->mutex);
3970
3971 if (unlikely(wl->state == WL1271_STATE_OFF))
3972 goto out;
3973
3974 if (wl->bss_type != BSS_TYPE_AP_BSS)
3975 goto out;
3976
3977 wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
3978
3979 wl_sta = (struct wl1271_station *)sta->drv_priv;
3980 id = wl_sta->hlid - WL1271_AP_STA_HLID_START;
3981 if (WARN_ON(!test_bit(id, wl->ap_hlid_map)))
3982 goto out;
3983
a620865e 3984 ret = wl1271_ps_elp_wakeup(wl);
f84f7d78
AN
3985 if (ret < 0)
3986 goto out;
3987
c690ec81 3988 ret = wl12xx_cmd_remove_peer(wl, wl_sta->hlid);
f84f7d78
AN
3989 if (ret < 0)
3990 goto out_sleep;
3991
409622ec 3992 wl1271_free_sta(wl, wl_sta->hlid);
f84f7d78
AN
3993
3994out_sleep:
3995 wl1271_ps_elp_sleep(wl);
3996
3997out:
3998 mutex_unlock(&wl->mutex);
3999 return ret;
4000}
4001
4623ec7d
LC
4002static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
4003 struct ieee80211_vif *vif,
4004 enum ieee80211_ampdu_mlme_action action,
4005 struct ieee80211_sta *sta, u16 tid, u16 *ssn,
4006 u8 buf_size)
bbba3e68
LS
4007{
4008 struct wl1271 *wl = hw->priv;
4009 int ret;
0f9c8250
AN
4010 u8 hlid, *ba_bitmap;
4011
4012 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action,
4013 tid);
4014
4015 /* sanity check - the fields in FW are only 8bits wide */
4016 if (WARN_ON(tid > 0xFF))
4017 return -ENOTSUPP;
bbba3e68
LS
4018
4019 mutex_lock(&wl->mutex);
4020
4021 if (unlikely(wl->state == WL1271_STATE_OFF)) {
4022 ret = -EAGAIN;
4023 goto out;
4024 }
4025
0f9c8250
AN
4026 if (wl->bss_type == BSS_TYPE_STA_BSS) {
4027 hlid = wl->sta_hlid;
4028 ba_bitmap = &wl->ba_rx_bitmap;
4029 } else if (wl->bss_type == BSS_TYPE_AP_BSS) {
4030 struct wl1271_station *wl_sta;
4031
4032 wl_sta = (struct wl1271_station *)sta->drv_priv;
4033 hlid = wl_sta->hlid;
4034 ba_bitmap = &wl->links[hlid].ba_bitmap;
4035 } else {
4036 ret = -EINVAL;
4037 goto out;
4038 }
4039
a620865e 4040 ret = wl1271_ps_elp_wakeup(wl);
bbba3e68
LS
4041 if (ret < 0)
4042 goto out;
4043
70559a06
SL
4044 wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d",
4045 tid, action);
4046
bbba3e68
LS
4047 switch (action) {
4048 case IEEE80211_AMPDU_RX_START:
0f9c8250 4049 if (!wl->ba_support || !wl->ba_allowed) {
bbba3e68 4050 ret = -ENOTSUPP;
0f9c8250
AN
4051 break;
4052 }
4053
4054 if (wl->ba_rx_session_count >= RX_BA_MAX_SESSIONS) {
4055 ret = -EBUSY;
4056 wl1271_error("exceeded max RX BA sessions");
4057 break;
4058 }
4059
4060 if (*ba_bitmap & BIT(tid)) {
4061 ret = -EINVAL;
4062 wl1271_error("cannot enable RX BA session on active "
4063 "tid: %d", tid);
4064 break;
4065 }
4066
4067 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true,
4068 hlid);
4069 if (!ret) {
4070 *ba_bitmap |= BIT(tid);
4071 wl->ba_rx_session_count++;
bbba3e68
LS
4072 }
4073 break;
4074
4075 case IEEE80211_AMPDU_RX_STOP:
0f9c8250
AN
4076 if (!(*ba_bitmap & BIT(tid))) {
4077 ret = -EINVAL;
4078 wl1271_error("no active RX BA session on tid: %d",
4079 tid);
4080 break;
4081 }
4082
4083 ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false,
4084 hlid);
4085 if (!ret) {
4086 *ba_bitmap &= ~BIT(tid);
4087 wl->ba_rx_session_count--;
4088 }
bbba3e68
LS
4089 break;
4090
4091 /*
4092 * The BA initiator session management in FW independently.
4093 * Falling break here on purpose for all TX APDU commands.
4094 */
4095 case IEEE80211_AMPDU_TX_START:
4096 case IEEE80211_AMPDU_TX_STOP:
4097 case IEEE80211_AMPDU_TX_OPERATIONAL:
4098 ret = -EINVAL;
4099 break;
4100
4101 default:
4102 wl1271_error("Incorrect ampdu action id=%x\n", action);
4103 ret = -EINVAL;
4104 }
4105
4106 wl1271_ps_elp_sleep(wl);
4107
4108out:
4109 mutex_unlock(&wl->mutex);
4110
4111 return ret;
4112}
4113
af7fbb28
EP
4114static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
4115 struct ieee80211_vif *vif,
4116 const struct cfg80211_bitrate_mask *mask)
4117{
4118 struct wl1271 *wl = hw->priv;
4119 int i;
4120
4121 wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x",
4122 mask->control[NL80211_BAND_2GHZ].legacy,
4123 mask->control[NL80211_BAND_5GHZ].legacy);
4124
4125 mutex_lock(&wl->mutex);
4126
4127 for (i = 0; i < IEEE80211_NUM_BANDS; i++)
4128 wl->bitrate_masks[i] =
4129 wl1271_tx_enabled_rates_get(wl,
4130 mask->control[i].legacy,
4131 i);
4132 mutex_unlock(&wl->mutex);
4133
4134 return 0;
4135}
4136
6d158ff3
SL
4137static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
4138 struct ieee80211_channel_switch *ch_switch)
4139{
4140 struct wl1271 *wl = hw->priv;
4141 int ret;
4142
4143 wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
4144
4145 mutex_lock(&wl->mutex);
4146
4147 if (unlikely(wl->state == WL1271_STATE_OFF)) {
4148 mutex_unlock(&wl->mutex);
4149 ieee80211_chswitch_done(wl->vif, false);
4150 return;
4151 }
4152
4153 ret = wl1271_ps_elp_wakeup(wl);
4154 if (ret < 0)
4155 goto out;
4156
4157 ret = wl12xx_cmd_channel_switch(wl, ch_switch);
4158
4159 if (!ret)
4160 set_bit(WL1271_FLAG_CS_PROGRESS, &wl->flags);
4161
4162 wl1271_ps_elp_sleep(wl);
4163
4164out:
4165 mutex_unlock(&wl->mutex);
4166}
4167
33437893
AN
4168static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
4169{
4170 struct wl1271 *wl = hw->priv;
4171 bool ret = false;
4172
4173 mutex_lock(&wl->mutex);
4174
4175 if (unlikely(wl->state == WL1271_STATE_OFF))
4176 goto out;
4177
4178 /* packets are considered pending if in the TX queue or the FW */
f1a46384 4179 ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0);
33437893
AN
4180
4181 /* the above is appropriate for STA mode for PS purposes */
4182 WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
4183
4184out:
4185 mutex_unlock(&wl->mutex);
4186
4187 return ret;
4188}
4189
f5fc0f86
LC
4190/* can't be const, mac80211 writes to this */
4191static struct ieee80211_rate wl1271_rates[] = {
4192 { .bitrate = 10,
2b60100b
JO
4193 .hw_value = CONF_HW_BIT_RATE_1MBPS,
4194 .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
f5fc0f86 4195 { .bitrate = 20,
2b60100b
JO
4196 .hw_value = CONF_HW_BIT_RATE_2MBPS,
4197 .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
f5fc0f86
LC
4198 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
4199 { .bitrate = 55,
2b60100b
JO
4200 .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
4201 .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
f5fc0f86
LC
4202 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
4203 { .bitrate = 110,
2b60100b
JO
4204 .hw_value = CONF_HW_BIT_RATE_11MBPS,
4205 .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
f5fc0f86
LC
4206 .flags = IEEE80211_RATE_SHORT_PREAMBLE },
4207 { .bitrate = 60,
2b60100b
JO
4208 .hw_value = CONF_HW_BIT_RATE_6MBPS,
4209 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
f5fc0f86 4210 { .bitrate = 90,
2b60100b
JO
4211 .hw_value = CONF_HW_BIT_RATE_9MBPS,
4212 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
f5fc0f86 4213 { .bitrate = 120,
2b60100b
JO
4214 .hw_value = CONF_HW_BIT_RATE_12MBPS,
4215 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
f5fc0f86 4216 { .bitrate = 180,
2b60100b
JO
4217 .hw_value = CONF_HW_BIT_RATE_18MBPS,
4218 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
f5fc0f86 4219 { .bitrate = 240,
2b60100b
JO
4220 .hw_value = CONF_HW_BIT_RATE_24MBPS,
4221 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
f5fc0f86 4222 { .bitrate = 360,
2b60100b
JO
4223 .hw_value = CONF_HW_BIT_RATE_36MBPS,
4224 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
f5fc0f86 4225 { .bitrate = 480,
2b60100b
JO
4226 .hw_value = CONF_HW_BIT_RATE_48MBPS,
4227 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
f5fc0f86 4228 { .bitrate = 540,
2b60100b
JO
4229 .hw_value = CONF_HW_BIT_RATE_54MBPS,
4230 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
f5fc0f86
LC
4231};
4232
fa97f46b 4233/* can't be const, mac80211 writes to this */
f5fc0f86 4234static struct ieee80211_channel wl1271_channels[] = {
a2d0e3f1 4235 { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
fa21c7a9 4236 { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
fa97f46b
JO
4237 { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
4238 { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
4239 { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
fa21c7a9 4240 { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
fa97f46b
JO
4241 { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
4242 { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
4243 { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
fa21c7a9 4244 { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
fa97f46b
JO
4245 { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
4246 { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
4247 { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
6c89b7b2 4248 { .hw_value = 14, .center_freq = 2484, .max_power = 25 },
f5fc0f86
LC
4249};
4250
f876bb9a 4251/* mapping to indexes for wl1271_rates */
a0ea9493 4252static const u8 wl1271_rate_to_idx_2ghz[] = {
f876bb9a 4253 /* MCS rates are used only with 11n */
18357850
SL
4254 7, /* CONF_HW_RXTX_RATE_MCS7 */
4255 6, /* CONF_HW_RXTX_RATE_MCS6 */
4256 5, /* CONF_HW_RXTX_RATE_MCS5 */
4257 4, /* CONF_HW_RXTX_RATE_MCS4 */
4258 3, /* CONF_HW_RXTX_RATE_MCS3 */
4259 2, /* CONF_HW_RXTX_RATE_MCS2 */
4260 1, /* CONF_HW_RXTX_RATE_MCS1 */
4261 0, /* CONF_HW_RXTX_RATE_MCS0 */
f876bb9a
JO
4262
4263 11, /* CONF_HW_RXTX_RATE_54 */
4264 10, /* CONF_HW_RXTX_RATE_48 */
4265 9, /* CONF_HW_RXTX_RATE_36 */
4266 8, /* CONF_HW_RXTX_RATE_24 */
4267
4268 /* TI-specific rate */
4269 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
4270
4271 7, /* CONF_HW_RXTX_RATE_18 */
4272 6, /* CONF_HW_RXTX_RATE_12 */
4273 3, /* CONF_HW_RXTX_RATE_11 */
4274 5, /* CONF_HW_RXTX_RATE_9 */
4275 4, /* CONF_HW_RXTX_RATE_6 */
4276 2, /* CONF_HW_RXTX_RATE_5_5 */
4277 1, /* CONF_HW_RXTX_RATE_2 */
4278 0 /* CONF_HW_RXTX_RATE_1 */
4279};
4280
e8b03a2b
SL
4281/* 11n STA capabilities */
4282#define HW_RX_HIGHEST_RATE 72
4283
00d20100 4284#define WL12XX_HT_CAP { \
871d0c3b
SL
4285 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 | \
4286 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT), \
e8b03a2b
SL
4287 .ht_supported = true, \
4288 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
4289 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
4290 .mcs = { \
4291 .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
4292 .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
4293 .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
4294 }, \
4295}
4296
f5fc0f86
LC
4297/* can't be const, mac80211 writes to this */
4298static struct ieee80211_supported_band wl1271_band_2ghz = {
4299 .channels = wl1271_channels,
4300 .n_channels = ARRAY_SIZE(wl1271_channels),
4301 .bitrates = wl1271_rates,
4302 .n_bitrates = ARRAY_SIZE(wl1271_rates),
00d20100 4303 .ht_cap = WL12XX_HT_CAP,
f5fc0f86
LC
4304};
4305
1ebec3d7
TP
4306/* 5 GHz data rates for WL1273 */
4307static struct ieee80211_rate wl1271_rates_5ghz[] = {
4308 { .bitrate = 60,
4309 .hw_value = CONF_HW_BIT_RATE_6MBPS,
4310 .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
4311 { .bitrate = 90,
4312 .hw_value = CONF_HW_BIT_RATE_9MBPS,
4313 .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
4314 { .bitrate = 120,
4315 .hw_value = CONF_HW_BIT_RATE_12MBPS,
4316 .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
4317 { .bitrate = 180,
4318 .hw_value = CONF_HW_BIT_RATE_18MBPS,
4319 .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
4320 { .bitrate = 240,
4321 .hw_value = CONF_HW_BIT_RATE_24MBPS,
4322 .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
4323 { .bitrate = 360,
4324 .hw_value = CONF_HW_BIT_RATE_36MBPS,
4325 .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
4326 { .bitrate = 480,
4327 .hw_value = CONF_HW_BIT_RATE_48MBPS,
4328 .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
4329 { .bitrate = 540,
4330 .hw_value = CONF_HW_BIT_RATE_54MBPS,
4331 .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
4332};
4333
fa97f46b 4334/* 5 GHz band channels for WL1273 */
1ebec3d7 4335static struct ieee80211_channel wl1271_channels_5ghz[] = {
6cfa5cff
AN
4336 { .hw_value = 7, .center_freq = 5035, .max_power = 25 },
4337 { .hw_value = 8, .center_freq = 5040, .max_power = 25 },
4338 { .hw_value = 9, .center_freq = 5045, .max_power = 25 },
4339 { .hw_value = 11, .center_freq = 5055, .max_power = 25 },
4340 { .hw_value = 12, .center_freq = 5060, .max_power = 25 },
4341 { .hw_value = 16, .center_freq = 5080, .max_power = 25 },
4342 { .hw_value = 34, .center_freq = 5170, .max_power = 25 },
4343 { .hw_value = 36, .center_freq = 5180, .max_power = 25 },
4344 { .hw_value = 38, .center_freq = 5190, .max_power = 25 },
4345 { .hw_value = 40, .center_freq = 5200, .max_power = 25 },
4346 { .hw_value = 42, .center_freq = 5210, .max_power = 25 },
4347 { .hw_value = 44, .center_freq = 5220, .max_power = 25 },
4348 { .hw_value = 46, .center_freq = 5230, .max_power = 25 },
4349 { .hw_value = 48, .center_freq = 5240, .max_power = 25 },
4350 { .hw_value = 52, .center_freq = 5260, .max_power = 25 },
4351 { .hw_value = 56, .center_freq = 5280, .max_power = 25 },
4352 { .hw_value = 60, .center_freq = 5300, .max_power = 25 },
4353 { .hw_value = 64, .center_freq = 5320, .max_power = 25 },
4354 { .hw_value = 100, .center_freq = 5500, .max_power = 25 },
4355 { .hw_value = 104, .center_freq = 5520, .max_power = 25 },
4356 { .hw_value = 108, .center_freq = 5540, .max_power = 25 },
4357 { .hw_value = 112, .center_freq = 5560, .max_power = 25 },
4358 { .hw_value = 116, .center_freq = 5580, .max_power = 25 },
4359 { .hw_value = 120, .center_freq = 5600, .max_power = 25 },
4360 { .hw_value = 124, .center_freq = 5620, .max_power = 25 },
4361 { .hw_value = 128, .center_freq = 5640, .max_power = 25 },
4362 { .hw_value = 132, .center_freq = 5660, .max_power = 25 },
4363 { .hw_value = 136, .center_freq = 5680, .max_power = 25 },
4364 { .hw_value = 140, .center_freq = 5700, .max_power = 25 },
4365 { .hw_value = 149, .center_freq = 5745, .max_power = 25 },
4366 { .hw_value = 153, .center_freq = 5765, .max_power = 25 },
4367 { .hw_value = 157, .center_freq = 5785, .max_power = 25 },
4368 { .hw_value = 161, .center_freq = 5805, .max_power = 25 },
4369 { .hw_value = 165, .center_freq = 5825, .max_power = 25 },
1ebec3d7
TP
4370};
4371
f876bb9a 4372/* mapping to indexes for wl1271_rates_5ghz */
a0ea9493 4373static const u8 wl1271_rate_to_idx_5ghz[] = {
f876bb9a 4374 /* MCS rates are used only with 11n */
18357850
SL
4375 7, /* CONF_HW_RXTX_RATE_MCS7 */
4376 6, /* CONF_HW_RXTX_RATE_MCS6 */
4377 5, /* CONF_HW_RXTX_RATE_MCS5 */
4378 4, /* CONF_HW_RXTX_RATE_MCS4 */
4379 3, /* CONF_HW_RXTX_RATE_MCS3 */
4380 2, /* CONF_HW_RXTX_RATE_MCS2 */
4381 1, /* CONF_HW_RXTX_RATE_MCS1 */
4382 0, /* CONF_HW_RXTX_RATE_MCS0 */
f876bb9a
JO
4383
4384 7, /* CONF_HW_RXTX_RATE_54 */
4385 6, /* CONF_HW_RXTX_RATE_48 */
4386 5, /* CONF_HW_RXTX_RATE_36 */
4387 4, /* CONF_HW_RXTX_RATE_24 */
4388
4389 /* TI-specific rate */
4390 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
4391
4392 3, /* CONF_HW_RXTX_RATE_18 */
4393 2, /* CONF_HW_RXTX_RATE_12 */
4394 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
4395 1, /* CONF_HW_RXTX_RATE_9 */
4396 0, /* CONF_HW_RXTX_RATE_6 */
4397 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
4398 CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
4399 CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
4400};
1ebec3d7
TP
4401
4402static struct ieee80211_supported_band wl1271_band_5ghz = {
4403 .channels = wl1271_channels_5ghz,
4404 .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
4405 .bitrates = wl1271_rates_5ghz,
4406 .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
00d20100 4407 .ht_cap = WL12XX_HT_CAP,
1ebec3d7
TP
4408};
4409
a0ea9493 4410static const u8 *wl1271_band_rate_to_idx[] = {
f876bb9a
JO
4411 [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
4412 [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
4413};
4414
f5fc0f86
LC
4415static const struct ieee80211_ops wl1271_ops = {
4416 .start = wl1271_op_start,
4417 .stop = wl1271_op_stop,
4418 .add_interface = wl1271_op_add_interface,
4419 .remove_interface = wl1271_op_remove_interface,
f634a4e7 4420#ifdef CONFIG_PM
402e4861
EP
4421 .suspend = wl1271_op_suspend,
4422 .resume = wl1271_op_resume,
f634a4e7 4423#endif
f5fc0f86 4424 .config = wl1271_op_config,
c87dec9f 4425 .prepare_multicast = wl1271_op_prepare_multicast,
f5fc0f86
LC
4426 .configure_filter = wl1271_op_configure_filter,
4427 .tx = wl1271_op_tx,
4428 .set_key = wl1271_op_set_key,
4429 .hw_scan = wl1271_op_hw_scan,
73ecce31 4430 .cancel_hw_scan = wl1271_op_cancel_hw_scan,
33c2c06c
LC
4431 .sched_scan_start = wl1271_op_sched_scan_start,
4432 .sched_scan_stop = wl1271_op_sched_scan_stop,
f5fc0f86 4433 .bss_info_changed = wl1271_op_bss_info_changed,
68d069c4 4434 .set_frag_threshold = wl1271_op_set_frag_threshold,
f5fc0f86 4435 .set_rts_threshold = wl1271_op_set_rts_threshold,
c6999d83 4436 .conf_tx = wl1271_op_conf_tx,
bbbb538e 4437 .get_tsf = wl1271_op_get_tsf,
ece550d0 4438 .get_survey = wl1271_op_get_survey,
f84f7d78
AN
4439 .sta_add = wl1271_op_sta_add,
4440 .sta_remove = wl1271_op_sta_remove,
bbba3e68 4441 .ampdu_action = wl1271_op_ampdu_action,
33437893 4442 .tx_frames_pending = wl1271_tx_frames_pending,
af7fbb28 4443 .set_bitrate_mask = wl12xx_set_bitrate_mask,
6d158ff3 4444 .channel_switch = wl12xx_op_channel_switch,
c8c90873 4445 CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
f5fc0f86
LC
4446};
4447
f876bb9a 4448
6a2de93b 4449u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
f876bb9a
JO
4450{
4451 u8 idx;
4452
6a2de93b 4453 BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
f876bb9a
JO
4454
4455 if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
4456 wl1271_error("Illegal RX rate from HW: %d", rate);
4457 return 0;
4458 }
4459
6a2de93b 4460 idx = wl1271_band_rate_to_idx[band][rate];
f876bb9a
JO
4461 if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
4462 wl1271_error("Unsupported RX rate from HW: %d", rate);
4463 return 0;
4464 }
4465
4466 return idx;
4467}
4468
7fc3a864
JO
4469static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
4470 struct device_attribute *attr,
4471 char *buf)
4472{
4473 struct wl1271 *wl = dev_get_drvdata(dev);
4474 ssize_t len;
4475
2f63b011 4476 len = PAGE_SIZE;
7fc3a864
JO
4477
4478 mutex_lock(&wl->mutex);
4479 len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
4480 wl->sg_enabled);
4481 mutex_unlock(&wl->mutex);
4482
4483 return len;
4484
4485}
4486
4487static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
4488 struct device_attribute *attr,
4489 const char *buf, size_t count)
4490{
4491 struct wl1271 *wl = dev_get_drvdata(dev);
4492 unsigned long res;
4493 int ret;
4494
6277ed65 4495 ret = kstrtoul(buf, 10, &res);
7fc3a864
JO
4496 if (ret < 0) {
4497 wl1271_warning("incorrect value written to bt_coex_mode");
4498 return count;
4499 }
4500
4501 mutex_lock(&wl->mutex);
4502
4503 res = !!res;
4504
4505 if (res == wl->sg_enabled)
4506 goto out;
4507
4508 wl->sg_enabled = res;
4509
4510 if (wl->state == WL1271_STATE_OFF)
4511 goto out;
4512
a620865e 4513 ret = wl1271_ps_elp_wakeup(wl);
7fc3a864
JO
4514 if (ret < 0)
4515 goto out;
4516
4517 wl1271_acx_sg_enable(wl, wl->sg_enabled);
4518 wl1271_ps_elp_sleep(wl);
4519
4520 out:
4521 mutex_unlock(&wl->mutex);
4522 return count;
4523}
4524
4525static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
4526 wl1271_sysfs_show_bt_coex_state,
4527 wl1271_sysfs_store_bt_coex_state);
4528
d717fd61
JO
4529static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
4530 struct device_attribute *attr,
4531 char *buf)
4532{
4533 struct wl1271 *wl = dev_get_drvdata(dev);
4534 ssize_t len;
4535
2f63b011 4536 len = PAGE_SIZE;
d717fd61
JO
4537
4538 mutex_lock(&wl->mutex);
4539 if (wl->hw_pg_ver >= 0)
4540 len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
4541 else
4542 len = snprintf(buf, len, "n/a\n");
4543 mutex_unlock(&wl->mutex);
4544
4545 return len;
4546}
4547
6f07b72a 4548static DEVICE_ATTR(hw_pg_ver, S_IRUGO,
d717fd61
JO
4549 wl1271_sysfs_show_hw_pg_ver, NULL);
4550
95dac04f
IY
4551static ssize_t wl1271_sysfs_read_fwlog(struct file *filp, struct kobject *kobj,
4552 struct bin_attribute *bin_attr,
4553 char *buffer, loff_t pos, size_t count)
4554{
4555 struct device *dev = container_of(kobj, struct device, kobj);
4556 struct wl1271 *wl = dev_get_drvdata(dev);
4557 ssize_t len;
4558 int ret;
4559
4560 ret = mutex_lock_interruptible(&wl->mutex);
4561 if (ret < 0)
4562 return -ERESTARTSYS;
4563
4564 /* Let only one thread read the log at a time, blocking others */
4565 while (wl->fwlog_size == 0) {
4566 DEFINE_WAIT(wait);
4567
4568 prepare_to_wait_exclusive(&wl->fwlog_waitq,
4569 &wait,
4570 TASK_INTERRUPTIBLE);
4571
4572 if (wl->fwlog_size != 0) {
4573 finish_wait(&wl->fwlog_waitq, &wait);
4574 break;
4575 }
4576
4577 mutex_unlock(&wl->mutex);
4578
4579 schedule();
4580 finish_wait(&wl->fwlog_waitq, &wait);
4581
4582 if (signal_pending(current))
4583 return -ERESTARTSYS;
4584
4585 ret = mutex_lock_interruptible(&wl->mutex);
4586 if (ret < 0)
4587 return -ERESTARTSYS;
4588 }
4589
4590 /* Check if the fwlog is still valid */
4591 if (wl->fwlog_size < 0) {
4592 mutex_unlock(&wl->mutex);
4593 return 0;
4594 }
4595
4596 /* Seeking is not supported - old logs are not kept. Disregard pos. */
4597 len = min(count, (size_t)wl->fwlog_size);
4598 wl->fwlog_size -= len;
4599 memcpy(buffer, wl->fwlog, len);
4600
4601 /* Make room for new messages */
4602 memmove(wl->fwlog, wl->fwlog + len, wl->fwlog_size);
4603
4604 mutex_unlock(&wl->mutex);
4605
4606 return len;
4607}
4608
4609static struct bin_attribute fwlog_attr = {
4610 .attr = {.name = "fwlog", .mode = S_IRUSR},
4611 .read = wl1271_sysfs_read_fwlog,
4612};
4613
2d5e82b8 4614int wl1271_register_hw(struct wl1271 *wl)
f5fc0f86
LC
4615{
4616 int ret;
4617
4618 if (wl->mac80211_registered)
4619 return 0;
4620
31d26ec6
AN
4621 ret = wl1271_fetch_nvs(wl);
4622 if (ret == 0) {
bc765bf3
SL
4623 /* NOTE: The wl->nvs->nvs element must be first, in
4624 * order to simplify the casting, we assume it is at
4625 * the beginning of the wl->nvs structure.
4626 */
4627 u8 *nvs_ptr = (u8 *)wl->nvs;
31d26ec6
AN
4628
4629 wl->mac_addr[0] = nvs_ptr[11];
4630 wl->mac_addr[1] = nvs_ptr[10];
4631 wl->mac_addr[2] = nvs_ptr[6];
4632 wl->mac_addr[3] = nvs_ptr[5];
4633 wl->mac_addr[4] = nvs_ptr[4];
4634 wl->mac_addr[5] = nvs_ptr[3];
4635 }
4636
f5fc0f86
LC
4637 SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
4638
4639 ret = ieee80211_register_hw(wl->hw);
4640 if (ret < 0) {
4641 wl1271_error("unable to register mac80211 hw: %d", ret);
4642 return ret;
4643 }
4644
4645 wl->mac80211_registered = true;
4646
d60080ae
EP
4647 wl1271_debugfs_init(wl);
4648
c2c192ac
JO
4649 register_netdevice_notifier(&wl1271_dev_notifier);
4650
f5fc0f86
LC
4651 wl1271_notice("loaded");
4652
4653 return 0;
4654}
50b3eb4b 4655EXPORT_SYMBOL_GPL(wl1271_register_hw);
f5fc0f86 4656
3b56dd6a
TP
4657void wl1271_unregister_hw(struct wl1271 *wl)
4658{
4ae3fa87
JO
4659 if (wl->state == WL1271_STATE_PLT)
4660 __wl1271_plt_stop(wl);
4661
c2c192ac 4662 unregister_netdevice_notifier(&wl1271_dev_notifier);
3b56dd6a
TP
4663 ieee80211_unregister_hw(wl->hw);
4664 wl->mac80211_registered = false;
4665
4666}
4667EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
4668
2d5e82b8 4669int wl1271_init_ieee80211(struct wl1271 *wl)
f5fc0f86 4670{
7a55724e
JO
4671 static const u32 cipher_suites[] = {
4672 WLAN_CIPHER_SUITE_WEP40,
4673 WLAN_CIPHER_SUITE_WEP104,
4674 WLAN_CIPHER_SUITE_TKIP,
4675 WLAN_CIPHER_SUITE_CCMP,
4676 WL1271_CIPHER_SUITE_GEM,
4677 };
4678
1e2b7976
JO
4679 /* The tx descriptor buffer and the TKIP space. */
4680 wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
4681 sizeof(struct wl1271_tx_hw_descr);
f5fc0f86
LC
4682
4683 /* unit us */
4684 /* FIXME: find a proper value */
4685 wl->hw->channel_change_time = 10000;
50c500ad 4686 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
f5fc0f86
LC
4687
4688 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
03442a33 4689 IEEE80211_HW_BEACON_FILTER |
0a34332f 4690 IEEE80211_HW_SUPPORTS_PS |
4695dc91 4691 IEEE80211_HW_SUPPORTS_UAPSD |
a9af092b 4692 IEEE80211_HW_HAS_RATE_CONTROL |
00236aed 4693 IEEE80211_HW_CONNECTION_MONITOR |
62c0740c 4694 IEEE80211_HW_SUPPORTS_CQM_RSSI |
25eaea30 4695 IEEE80211_HW_REPORTS_TX_ACK_STATUS |
fcd23b63 4696 IEEE80211_HW_SPECTRUM_MGMT |
93f8c8e0
AN
4697 IEEE80211_HW_AP_LINK_PS |
4698 IEEE80211_HW_AMPDU_AGGREGATION |
4699 IEEE80211_HW_TX_AMPDU_SETUP_IN_HW;
f5fc0f86 4700
7a55724e
JO
4701 wl->hw->wiphy->cipher_suites = cipher_suites;
4702 wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
4703
e0d8bbf0 4704 wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
045c745f
EP
4705 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP) |
4706 BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO);
f5fc0f86 4707 wl->hw->wiphy->max_scan_ssids = 1;
221737d2
LC
4708 wl->hw->wiphy->max_sched_scan_ssids = 16;
4709 wl->hw->wiphy->max_match_sets = 16;
ea559b46
GE
4710 /*
4711 * Maximum length of elements in scanning probe request templates
4712 * should be the maximum length possible for a template, without
4713 * the IEEE80211 header of the template
4714 */
154037d1 4715 wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
ea559b46 4716 sizeof(struct ieee80211_header);
a8aaaf53 4717
c9e79a47
LC
4718 wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_DFLT_SIZE -
4719 sizeof(struct ieee80211_header);
4720
1ec23f7f
EP
4721 wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
4722
4a31c11c
LC
4723 /* make sure all our channels fit in the scanned_ch bitmask */
4724 BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
4725 ARRAY_SIZE(wl1271_channels_5ghz) >
4726 WL1271_MAX_CHANNELS);
a8aaaf53
LC
4727 /*
4728 * We keep local copies of the band structs because we need to
4729 * modify them on a per-device basis.
4730 */
4731 memcpy(&wl->bands[IEEE80211_BAND_2GHZ], &wl1271_band_2ghz,
4732 sizeof(wl1271_band_2ghz));
4733 memcpy(&wl->bands[IEEE80211_BAND_5GHZ], &wl1271_band_5ghz,
4734 sizeof(wl1271_band_5ghz));
4735
4736 wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
4737 &wl->bands[IEEE80211_BAND_2GHZ];
4738 wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
4739 &wl->bands[IEEE80211_BAND_5GHZ];
1ebec3d7 4740
12bd8949 4741 wl->hw->queues = 4;
31627dc5 4742 wl->hw->max_rates = 1;
12bd8949 4743
b7417d93
JO
4744 wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
4745
8197b711 4746 SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
f5fc0f86 4747
f84f7d78
AN
4748 wl->hw->sta_data_size = sizeof(struct wl1271_station);
4749
4c9cfa78
LC
4750 wl->hw->max_rx_aggregation_subframes = 8;
4751
f5fc0f86
LC
4752 return 0;
4753}
50b3eb4b 4754EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
f5fc0f86 4755
f5fc0f86 4756#define WL1271_DEFAULT_CHANNEL 0
c332a4b8 4757
2d5e82b8 4758struct ieee80211_hw *wl1271_alloc_hw(void)
f5fc0f86 4759{
f5fc0f86 4760 struct ieee80211_hw *hw;
3b56dd6a 4761 struct platform_device *plat_dev = NULL;
f5fc0f86 4762 struct wl1271 *wl;
a8c0ddb5 4763 int i, j, ret;
1f37cbc9 4764 unsigned int order;
f5fc0f86 4765
f80c2d12
AN
4766 BUILD_BUG_ON(AP_MAX_LINKS > WL12XX_MAX_LINKS);
4767
f5fc0f86
LC
4768 hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
4769 if (!hw) {
4770 wl1271_error("could not alloc ieee80211_hw");
a1dd8187 4771 ret = -ENOMEM;
3b56dd6a
TP
4772 goto err_hw_alloc;
4773 }
4774
929ebd30 4775 plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
3b56dd6a
TP
4776 if (!plat_dev) {
4777 wl1271_error("could not allocate platform_device");
4778 ret = -ENOMEM;
4779 goto err_plat_alloc;
f5fc0f86
LC
4780 }
4781
4782 wl = hw->priv;
4783 memset(wl, 0, sizeof(*wl));
4784
01c09162
JO
4785 INIT_LIST_HEAD(&wl->list);
4786
f5fc0f86 4787 wl->hw = hw;
3b56dd6a 4788 wl->plat_dev = plat_dev;
f5fc0f86 4789
6742f554
JO
4790 for (i = 0; i < NUM_TX_QUEUES; i++)
4791 skb_queue_head_init(&wl->tx_queue[i]);
f5fc0f86 4792
a8c0ddb5
AN
4793 for (i = 0; i < NUM_TX_QUEUES; i++)
4794 for (j = 0; j < AP_MAX_LINKS; j++)
4795 skb_queue_head_init(&wl->links[j].tx_queue[i]);
4796
a620865e
IY
4797 skb_queue_head_init(&wl->deferred_rx_queue);
4798 skb_queue_head_init(&wl->deferred_tx_queue);
4799
37b70a81 4800 INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
90494a90 4801 INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
a620865e 4802 INIT_WORK(&wl->netstack_work, wl1271_netstack_work);
117b38d0
JO
4803 INIT_WORK(&wl->tx_work, wl1271_tx_work);
4804 INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
4805 INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
77ddaa10
EP
4806 INIT_WORK(&wl->rx_streaming_enable_work,
4807 wl1271_rx_streaming_enable_work);
4808 INIT_WORK(&wl->rx_streaming_disable_work,
4809 wl1271_rx_streaming_disable_work);
4810
92ef8960
EP
4811 wl->freezable_wq = create_freezable_workqueue("wl12xx_wq");
4812 if (!wl->freezable_wq) {
4813 ret = -ENOMEM;
4814 goto err_hw;
4815 }
4816
f5fc0f86 4817 wl->channel = WL1271_DEFAULT_CHANNEL;
60e84c2e 4818 wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
f5fc0f86 4819 wl->default_key = 0;
f5fc0f86 4820 wl->rx_counter = 0;
19ad0715 4821 wl->psm_entry_retry = 0;
f5fc0f86 4822 wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
a6fe2313 4823 wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
ebba60c6 4824 wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
830fb67b 4825 wl->rate_set = CONF_TX_RATE_MASK_BASIC;
8a5a37a6 4826 wl->band = IEEE80211_BAND_2GHZ;
b771eee5 4827 wl->vif = NULL;
830fb67b 4828 wl->flags = 0;
7fc3a864 4829 wl->sg_enabled = true;
d717fd61 4830 wl->hw_pg_ver = -1;
166d504e
AN
4831 wl->bss_type = MAX_BSS_TYPE;
4832 wl->set_bss_type = MAX_BSS_TYPE;
a8c0ddb5 4833 wl->last_tx_hlid = 0;
b622d992
AN
4834 wl->ap_ps_map = 0;
4835 wl->ap_fw_ps_map = 0;
606ea9fa 4836 wl->quirks = 0;
341b7cde 4837 wl->platform_quirks = 0;
33c2c06c 4838 wl->sched_scanning = false;
b992c682
OK
4839 wl->tx_security_seq = 0;
4840 wl->tx_security_last_seq_lsb = 0;
e9eb8cbe 4841 wl->tx_spare_blocks = TX_HW_BLOCK_SPARE_DEFAULT;
7f097988 4842 wl->role_id = WL12XX_INVALID_ROLE_ID;
f4df1bd5 4843 wl->system_hlid = WL12XX_SYSTEM_HLID;
7f097988 4844 wl->sta_hlid = WL12XX_INVALID_LINK_ID;
04e8079c
EP
4845 wl->dev_role_id = WL12XX_INVALID_ROLE_ID;
4846 wl->dev_hlid = WL12XX_INVALID_LINK_ID;
712e9bf7 4847 wl->session_counter = 0;
e51ae9be
AN
4848 wl->ap_bcast_hlid = WL12XX_INVALID_LINK_ID;
4849 wl->ap_global_hlid = WL12XX_INVALID_LINK_ID;
da03209e 4850 wl->active_sta_count = 0;
77ddaa10
EP
4851 setup_timer(&wl->rx_streaming_timer, wl1271_rx_streaming_timer,
4852 (unsigned long) wl);
95dac04f
IY
4853 wl->fwlog_size = 0;
4854 init_waitqueue_head(&wl->fwlog_waitq);
f5fc0f86 4855
f4df1bd5
EP
4856 /* The system link is always allocated */
4857 __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
4858
25eeb9e3 4859 memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
be7078c2 4860 for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
f5fc0f86
LC
4861 wl->tx_frames[i] = NULL;
4862
4863 spin_lock_init(&wl->wl_lock);
4864
f5fc0f86
LC
4865 wl->state = WL1271_STATE_OFF;
4866 mutex_init(&wl->mutex);
4867
c332a4b8
TP
4868 /* Apply default driver configuration. */
4869 wl1271_conf_init(wl);
af7fbb28
EP
4870 wl->bitrate_masks[IEEE80211_BAND_2GHZ] = wl->conf.tx.basic_rate;
4871 wl->bitrate_masks[IEEE80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5;
c332a4b8 4872
1f37cbc9
IY
4873 order = get_order(WL1271_AGGR_BUFFER_SIZE);
4874 wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
4875 if (!wl->aggr_buf) {
4876 ret = -ENOMEM;
92ef8960 4877 goto err_wq;
1f37cbc9
IY
4878 }
4879
990f5de7
IY
4880 wl->dummy_packet = wl12xx_alloc_dummy_packet(wl);
4881 if (!wl->dummy_packet) {
4882 ret = -ENOMEM;
4883 goto err_aggr;
4884 }
4885
95dac04f
IY
4886 /* Allocate one page for the FW log */
4887 wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL);
4888 if (!wl->fwlog) {
4889 ret = -ENOMEM;
4890 goto err_dummy_packet;
4891 }
4892
a1dd8187 4893 /* Register platform device */
3b56dd6a 4894 ret = platform_device_register(wl->plat_dev);
a1dd8187
JO
4895 if (ret) {
4896 wl1271_error("couldn't register platform device");
95dac04f 4897 goto err_fwlog;
a1dd8187 4898 }
3b56dd6a 4899 dev_set_drvdata(&wl->plat_dev->dev, wl);
a1dd8187 4900
7fc3a864 4901 /* Create sysfs file to control bt coex state */
3b56dd6a 4902 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
7fc3a864
JO
4903 if (ret < 0) {
4904 wl1271_error("failed to create sysfs file bt_coex_state");
4905 goto err_platform;
4906 }
a1dd8187 4907
d717fd61
JO
4908 /* Create sysfs file to get HW PG version */
4909 ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
4910 if (ret < 0) {
4911 wl1271_error("failed to create sysfs file hw_pg_ver");
4912 goto err_bt_coex_state;
4913 }
4914
95dac04f
IY
4915 /* Create sysfs file for the FW log */
4916 ret = device_create_bin_file(&wl->plat_dev->dev, &fwlog_attr);
4917 if (ret < 0) {
4918 wl1271_error("failed to create sysfs file fwlog");
4919 goto err_hw_pg_ver;
4920 }
4921
c332a4b8 4922 return hw;
a1dd8187 4923
95dac04f
IY
4924err_hw_pg_ver:
4925 device_remove_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
4926
d717fd61
JO
4927err_bt_coex_state:
4928 device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
4929
7fc3a864 4930err_platform:
3b56dd6a 4931 platform_device_unregister(wl->plat_dev);
7fc3a864 4932
95dac04f
IY
4933err_fwlog:
4934 free_page((unsigned long)wl->fwlog);
4935
990f5de7
IY
4936err_dummy_packet:
4937 dev_kfree_skb(wl->dummy_packet);
4938
1f37cbc9
IY
4939err_aggr:
4940 free_pages((unsigned long)wl->aggr_buf, order);
4941
92ef8960
EP
4942err_wq:
4943 destroy_workqueue(wl->freezable_wq);
4944
a1dd8187 4945err_hw:
3b56dd6a
TP
4946 wl1271_debugfs_exit(wl);
4947 kfree(plat_dev);
4948
4949err_plat_alloc:
4950 ieee80211_free_hw(hw);
4951
4952err_hw_alloc:
a1dd8187 4953
a1dd8187 4954 return ERR_PTR(ret);
c332a4b8 4955}
50b3eb4b 4956EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
c332a4b8
TP
4957
4958int wl1271_free_hw(struct wl1271 *wl)
4959{
95dac04f
IY
4960 /* Unblock any fwlog readers */
4961 mutex_lock(&wl->mutex);
4962 wl->fwlog_size = -1;
4963 wake_up_interruptible_all(&wl->fwlog_waitq);
4964 mutex_unlock(&wl->mutex);
4965
4966 device_remove_bin_file(&wl->plat_dev->dev, &fwlog_attr);
6f07b72a
GK
4967
4968 device_remove_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
4969
4970 device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
3b56dd6a 4971 platform_device_unregister(wl->plat_dev);
95dac04f 4972 free_page((unsigned long)wl->fwlog);
990f5de7 4973 dev_kfree_skb(wl->dummy_packet);
1f37cbc9
IY
4974 free_pages((unsigned long)wl->aggr_buf,
4975 get_order(WL1271_AGGR_BUFFER_SIZE));
3b56dd6a 4976 kfree(wl->plat_dev);
c332a4b8
TP
4977
4978 wl1271_debugfs_exit(wl);
4979
c332a4b8
TP
4980 vfree(wl->fw);
4981 wl->fw = NULL;
4982 kfree(wl->nvs);
4983 wl->nvs = NULL;
4984
4985 kfree(wl->fw_status);
4986 kfree(wl->tx_res_if);
92ef8960 4987 destroy_workqueue(wl->freezable_wq);
c332a4b8
TP
4988
4989 ieee80211_free_hw(wl->hw);
4990
4991 return 0;
4992}
50b3eb4b
TP
4993EXPORT_SYMBOL_GPL(wl1271_free_hw);
4994
491bbd6b 4995u32 wl12xx_debug_level = DEBUG_NONE;
17c1755c 4996EXPORT_SYMBOL_GPL(wl12xx_debug_level);
491bbd6b 4997module_param_named(debug_level, wl12xx_debug_level, uint, S_IRUSR | S_IWUSR);
17c1755c
EP
4998MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
4999
95dac04f
IY
5000module_param_named(fwlog, fwlog_param, charp, 0);
5001MODULE_PARM_DESC(keymap,
5002 "FW logger options: continuous, ondemand, dbgpins or disable");
5003
2a5bff09
EP
5004module_param(bug_on_recovery, bool, S_IRUSR | S_IWUSR);
5005MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
5006
50b3eb4b 5007MODULE_LICENSE("GPL");
b1a48cab 5008MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
50b3eb4b 5009MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");