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