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