[go: nahoru, domu]

1/******************************************************************************
2 *
3 * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
4 *
5 * Portions of this file are derived from the ipw3945 project, as well
6 * as portions of the ieee80211 subsystem header files.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of version 2 of the GNU General Public License as
10 * published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
20 *
21 * The full GNU General Public License is included in this distribution in the
22 * file called LICENSE.
23 *
24 * Contact Information:
25 *  Intel Linux Wireless <ilw@linux.intel.com>
26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *
28 *****************************************************************************/
29
30#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
31
32#include <linux/kernel.h>
33#include <linux/module.h>
34#include <linux/init.h>
35#include <linux/slab.h>
36#include <linux/delay.h>
37#include <linux/sched.h>
38#include <linux/skbuff.h>
39#include <linux/netdevice.h>
40#include <linux/etherdevice.h>
41#include <linux/if_arp.h>
42
43#include <net/mac80211.h>
44
45#include <asm/div64.h>
46
47#include "iwl-eeprom-read.h"
48#include "iwl-eeprom-parse.h"
49#include "iwl-io.h"
50#include "iwl-trans.h"
51#include "iwl-op-mode.h"
52#include "iwl-drv.h"
53#include "iwl-modparams.h"
54#include "iwl-prph.h"
55
56#include "dev.h"
57#include "calib.h"
58#include "agn.h"
59
60
61/******************************************************************************
62 *
63 * module boiler plate
64 *
65 ******************************************************************************/
66
67/*
68 * module name, copyright, version, etc.
69 */
70#define DRV_DESCRIPTION	"Intel(R) Wireless WiFi Link AGN driver for Linux"
71
72#ifdef CONFIG_IWLWIFI_DEBUG
73#define VD "d"
74#else
75#define VD
76#endif
77
78#define DRV_VERSION     IWLWIFI_VERSION VD
79
80
81MODULE_DESCRIPTION(DRV_DESCRIPTION);
82MODULE_VERSION(DRV_VERSION);
83MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
84MODULE_LICENSE("GPL");
85
86static const struct iwl_op_mode_ops iwl_dvm_ops;
87
88void iwl_update_chain_flags(struct iwl_priv *priv)
89{
90	struct iwl_rxon_context *ctx;
91
92	for_each_context(priv, ctx) {
93		iwlagn_set_rxon_chain(priv, ctx);
94		if (ctx->active.rx_chain != ctx->staging.rx_chain)
95			iwlagn_commit_rxon(priv, ctx);
96	}
97}
98
99/* Parse the beacon frame to find the TIM element and set tim_idx & tim_size */
100static void iwl_set_beacon_tim(struct iwl_priv *priv,
101			       struct iwl_tx_beacon_cmd *tx_beacon_cmd,
102			       u8 *beacon, u32 frame_size)
103{
104	u16 tim_idx;
105	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)beacon;
106
107	/*
108	 * The index is relative to frame start but we start looking at the
109	 * variable-length part of the beacon.
110	 */
111	tim_idx = mgmt->u.beacon.variable - beacon;
112
113	/* Parse variable-length elements of beacon to find WLAN_EID_TIM */
114	while ((tim_idx < (frame_size - 2)) &&
115			(beacon[tim_idx] != WLAN_EID_TIM))
116		tim_idx += beacon[tim_idx+1] + 2;
117
118	/* If TIM field was found, set variables */
119	if ((tim_idx < (frame_size - 1)) && (beacon[tim_idx] == WLAN_EID_TIM)) {
120		tx_beacon_cmd->tim_idx = cpu_to_le16(tim_idx);
121		tx_beacon_cmd->tim_size = beacon[tim_idx+1];
122	} else
123		IWL_WARN(priv, "Unable to find TIM Element in beacon\n");
124}
125
126int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
127{
128	struct iwl_tx_beacon_cmd *tx_beacon_cmd;
129	struct iwl_host_cmd cmd = {
130		.id = REPLY_TX_BEACON,
131	};
132	struct ieee80211_tx_info *info;
133	u32 frame_size;
134	u32 rate_flags;
135	u32 rate;
136
137	/*
138	 * We have to set up the TX command, the TX Beacon command, and the
139	 * beacon contents.
140	 */
141
142	lockdep_assert_held(&priv->mutex);
143
144	if (!priv->beacon_ctx) {
145		IWL_ERR(priv, "trying to build beacon w/o beacon context!\n");
146		return 0;
147	}
148
149	if (WARN_ON(!priv->beacon_skb))
150		return -EINVAL;
151
152	/* Allocate beacon command */
153	if (!priv->beacon_cmd)
154		priv->beacon_cmd = kzalloc(sizeof(*tx_beacon_cmd), GFP_KERNEL);
155	tx_beacon_cmd = priv->beacon_cmd;
156	if (!tx_beacon_cmd)
157		return -ENOMEM;
158
159	frame_size = priv->beacon_skb->len;
160
161	/* Set up TX command fields */
162	tx_beacon_cmd->tx.len = cpu_to_le16((u16)frame_size);
163	tx_beacon_cmd->tx.sta_id = priv->beacon_ctx->bcast_sta_id;
164	tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
165	tx_beacon_cmd->tx.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK |
166		TX_CMD_FLG_TSF_MSK | TX_CMD_FLG_STA_RATE_MSK;
167
168	/* Set up TX beacon command fields */
169	iwl_set_beacon_tim(priv, tx_beacon_cmd, priv->beacon_skb->data,
170			   frame_size);
171
172	/* Set up packet rate and flags */
173	info = IEEE80211_SKB_CB(priv->beacon_skb);
174
175	/*
176	 * Let's set up the rate at least somewhat correctly;
177	 * it will currently not actually be used by the uCode,
178	 * it uses the broadcast station's rate instead.
179	 */
180	if (info->control.rates[0].idx < 0 ||
181	    info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
182		rate = 0;
183	else
184		rate = info->control.rates[0].idx;
185
186	priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
187					      priv->nvm_data->valid_tx_ant);
188	rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
189
190	/* In mac80211, rates for 5 GHz start at 0 */
191	if (info->band == IEEE80211_BAND_5GHZ)
192		rate += IWL_FIRST_OFDM_RATE;
193	else if (rate >= IWL_FIRST_CCK_RATE && rate <= IWL_LAST_CCK_RATE)
194		rate_flags |= RATE_MCS_CCK_MSK;
195
196	tx_beacon_cmd->tx.rate_n_flags =
197			iwl_hw_set_rate_n_flags(rate, rate_flags);
198
199	/* Submit command */
200	cmd.len[0] = sizeof(*tx_beacon_cmd);
201	cmd.data[0] = tx_beacon_cmd;
202	cmd.dataflags[0] = IWL_HCMD_DFL_NOCOPY;
203	cmd.len[1] = frame_size;
204	cmd.data[1] = priv->beacon_skb->data;
205	cmd.dataflags[1] = IWL_HCMD_DFL_NOCOPY;
206
207	return iwl_dvm_send_cmd(priv, &cmd);
208}
209
210static void iwl_bg_beacon_update(struct work_struct *work)
211{
212	struct iwl_priv *priv =
213		container_of(work, struct iwl_priv, beacon_update);
214	struct sk_buff *beacon;
215
216	mutex_lock(&priv->mutex);
217	if (!priv->beacon_ctx) {
218		IWL_ERR(priv, "updating beacon w/o beacon context!\n");
219		goto out;
220	}
221
222	if (priv->beacon_ctx->vif->type != NL80211_IFTYPE_AP) {
223		/*
224		 * The ucode will send beacon notifications even in
225		 * IBSS mode, but we don't want to process them. But
226		 * we need to defer the type check to here due to
227		 * requiring locking around the beacon_ctx access.
228		 */
229		goto out;
230	}
231
232	/* Pull updated AP beacon from mac80211. will fail if not in AP mode */
233	beacon = ieee80211_beacon_get(priv->hw, priv->beacon_ctx->vif);
234	if (!beacon) {
235		IWL_ERR(priv, "update beacon failed -- keeping old\n");
236		goto out;
237	}
238
239	/* new beacon skb is allocated every time; dispose previous.*/
240	dev_kfree_skb(priv->beacon_skb);
241
242	priv->beacon_skb = beacon;
243
244	iwlagn_send_beacon_cmd(priv);
245 out:
246	mutex_unlock(&priv->mutex);
247}
248
249static void iwl_bg_bt_runtime_config(struct work_struct *work)
250{
251	struct iwl_priv *priv =
252		container_of(work, struct iwl_priv, bt_runtime_config);
253
254	mutex_lock(&priv->mutex);
255	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
256		goto out;
257
258	/* dont send host command if rf-kill is on */
259	if (!iwl_is_ready_rf(priv))
260		goto out;
261
262	iwlagn_send_advance_bt_config(priv);
263out:
264	mutex_unlock(&priv->mutex);
265}
266
267static void iwl_bg_bt_full_concurrency(struct work_struct *work)
268{
269	struct iwl_priv *priv =
270		container_of(work, struct iwl_priv, bt_full_concurrency);
271	struct iwl_rxon_context *ctx;
272
273	mutex_lock(&priv->mutex);
274
275	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
276		goto out;
277
278	/* dont send host command if rf-kill is on */
279	if (!iwl_is_ready_rf(priv))
280		goto out;
281
282	IWL_DEBUG_INFO(priv, "BT coex in %s mode\n",
283		       priv->bt_full_concurrent ?
284		       "full concurrency" : "3-wire");
285
286	/*
287	 * LQ & RXON updated cmds must be sent before BT Config cmd
288	 * to avoid 3-wire collisions
289	 */
290	for_each_context(priv, ctx) {
291		iwlagn_set_rxon_chain(priv, ctx);
292		iwlagn_commit_rxon(priv, ctx);
293	}
294
295	iwlagn_send_advance_bt_config(priv);
296out:
297	mutex_unlock(&priv->mutex);
298}
299
300int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear)
301{
302	struct iwl_statistics_cmd statistics_cmd = {
303		.configuration_flags =
304			clear ? IWL_STATS_CONF_CLEAR_STATS : 0,
305	};
306
307	if (flags & CMD_ASYNC)
308		return iwl_dvm_send_cmd_pdu(priv, REPLY_STATISTICS_CMD,
309					CMD_ASYNC,
310					sizeof(struct iwl_statistics_cmd),
311					&statistics_cmd);
312	else
313		return iwl_dvm_send_cmd_pdu(priv, REPLY_STATISTICS_CMD, 0,
314					sizeof(struct iwl_statistics_cmd),
315					&statistics_cmd);
316}
317
318/**
319 * iwl_bg_statistics_periodic - Timer callback to queue statistics
320 *
321 * This callback is provided in order to send a statistics request.
322 *
323 * This timer function is continually reset to execute within
324 * REG_RECALIB_PERIOD seconds since the last STATISTICS_NOTIFICATION
325 * was received.  We need to ensure we receive the statistics in order
326 * to update the temperature used for calibrating the TXPOWER.
327 */
328static void iwl_bg_statistics_periodic(unsigned long data)
329{
330	struct iwl_priv *priv = (struct iwl_priv *)data;
331
332	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
333		return;
334
335	/* dont send host command if rf-kill is on */
336	if (!iwl_is_ready_rf(priv))
337		return;
338
339	iwl_send_statistics_request(priv, CMD_ASYNC, false);
340}
341
342
343static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
344					u32 start_idx, u32 num_events,
345					u32 capacity, u32 mode)
346{
347	u32 i;
348	u32 ptr;        /* SRAM byte address of log data */
349	u32 ev, time, data; /* event log data */
350	unsigned long reg_flags;
351
352	if (mode == 0)
353		ptr = base + (4 * sizeof(u32)) + (start_idx * 2 * sizeof(u32));
354	else
355		ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32));
356
357	/* Make sure device is powered up for SRAM reads */
358	if (!iwl_trans_grab_nic_access(priv->trans, false, &reg_flags))
359		return;
360
361	/* Set starting address; reads will auto-increment */
362	iwl_write32(priv->trans, HBUS_TARG_MEM_RADDR, ptr);
363
364	/*
365	 * Refuse to read more than would have fit into the log from
366	 * the current start_idx. This used to happen due to the race
367	 * described below, but now WARN because the code below should
368	 * prevent it from happening here.
369	 */
370	if (WARN_ON(num_events > capacity - start_idx))
371		num_events = capacity - start_idx;
372
373	/*
374	 * "time" is actually "data" for mode 0 (no timestamp).
375	 * place event id # at far right for easier visual parsing.
376	 */
377	for (i = 0; i < num_events; i++) {
378		ev = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
379		time = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
380		if (mode == 0) {
381			trace_iwlwifi_dev_ucode_cont_event(
382					priv->trans->dev, 0, time, ev);
383		} else {
384			data = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
385			trace_iwlwifi_dev_ucode_cont_event(
386					priv->trans->dev, time, data, ev);
387		}
388	}
389	/* Allow device to power down */
390	iwl_trans_release_nic_access(priv->trans, &reg_flags);
391}
392
393static void iwl_continuous_event_trace(struct iwl_priv *priv)
394{
395	u32 capacity;   /* event log capacity in # entries */
396	struct {
397		u32 capacity;
398		u32 mode;
399		u32 wrap_counter;
400		u32 write_counter;
401	} __packed read;
402	u32 base;       /* SRAM byte address of event log header */
403	u32 mode;       /* 0 - no timestamp, 1 - timestamp recorded */
404	u32 num_wraps;  /* # times uCode wrapped to top of log */
405	u32 next_entry; /* index of next entry to be written by uCode */
406
407	base = priv->device_pointers.log_event_table;
408	if (iwlagn_hw_valid_rtc_data_addr(base)) {
409		iwl_trans_read_mem_bytes(priv->trans, base,
410					 &read, sizeof(read));
411		capacity = read.capacity;
412		mode = read.mode;
413		num_wraps = read.wrap_counter;
414		next_entry = read.write_counter;
415	} else
416		return;
417
418	/*
419	 * Unfortunately, the uCode doesn't use temporary variables.
420	 * Therefore, it can happen that we read next_entry == capacity,
421	 * which really means next_entry == 0.
422	 */
423	if (unlikely(next_entry == capacity))
424		next_entry = 0;
425	/*
426	 * Additionally, the uCode increases the write pointer before
427	 * the wraps counter, so if the write pointer is smaller than
428	 * the old write pointer (wrap occurred) but we read that no
429	 * wrap occurred, we actually read between the next_entry and
430	 * num_wraps update (this does happen in practice!!) -- take
431	 * that into account by increasing num_wraps.
432	 */
433	if (unlikely(next_entry < priv->event_log.next_entry &&
434		     num_wraps == priv->event_log.num_wraps))
435		num_wraps++;
436
437	if (num_wraps == priv->event_log.num_wraps) {
438		iwl_print_cont_event_trace(
439			priv, base, priv->event_log.next_entry,
440			next_entry - priv->event_log.next_entry,
441			capacity, mode);
442
443		priv->event_log.non_wraps_count++;
444	} else {
445		if (num_wraps - priv->event_log.num_wraps > 1)
446			priv->event_log.wraps_more_count++;
447		else
448			priv->event_log.wraps_once_count++;
449
450		trace_iwlwifi_dev_ucode_wrap_event(priv->trans->dev,
451				num_wraps - priv->event_log.num_wraps,
452				next_entry, priv->event_log.next_entry);
453
454		if (next_entry < priv->event_log.next_entry) {
455			iwl_print_cont_event_trace(
456				priv, base, priv->event_log.next_entry,
457				capacity - priv->event_log.next_entry,
458				capacity, mode);
459
460			iwl_print_cont_event_trace(
461				priv, base, 0, next_entry, capacity, mode);
462		} else {
463			iwl_print_cont_event_trace(
464				priv, base, next_entry,
465				capacity - next_entry,
466				capacity, mode);
467
468			iwl_print_cont_event_trace(
469				priv, base, 0, next_entry, capacity, mode);
470		}
471	}
472
473	priv->event_log.num_wraps = num_wraps;
474	priv->event_log.next_entry = next_entry;
475}
476
477/**
478 * iwl_bg_ucode_trace - Timer callback to log ucode event
479 *
480 * The timer is continually set to execute every
481 * UCODE_TRACE_PERIOD milliseconds after the last timer expired
482 * this function is to perform continuous uCode event logging operation
483 * if enabled
484 */
485static void iwl_bg_ucode_trace(unsigned long data)
486{
487	struct iwl_priv *priv = (struct iwl_priv *)data;
488
489	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
490		return;
491
492	if (priv->event_log.ucode_trace) {
493		iwl_continuous_event_trace(priv);
494		/* Reschedule the timer to occur in UCODE_TRACE_PERIOD */
495		mod_timer(&priv->ucode_trace,
496			 jiffies + msecs_to_jiffies(UCODE_TRACE_PERIOD));
497	}
498}
499
500static void iwl_bg_tx_flush(struct work_struct *work)
501{
502	struct iwl_priv *priv =
503		container_of(work, struct iwl_priv, tx_flush);
504
505	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
506		return;
507
508	/* do nothing if rf-kill is on */
509	if (!iwl_is_ready_rf(priv))
510		return;
511
512	IWL_DEBUG_INFO(priv, "device request: flush all tx frames\n");
513	iwlagn_dev_txfifo_flush(priv);
514}
515
516/*
517 * queue/FIFO/AC mapping definitions
518 */
519
520static const u8 iwlagn_bss_ac_to_fifo[] = {
521	IWL_TX_FIFO_VO,
522	IWL_TX_FIFO_VI,
523	IWL_TX_FIFO_BE,
524	IWL_TX_FIFO_BK,
525};
526
527static const u8 iwlagn_bss_ac_to_queue[] = {
528	0, 1, 2, 3,
529};
530
531static const u8 iwlagn_pan_ac_to_fifo[] = {
532	IWL_TX_FIFO_VO_IPAN,
533	IWL_TX_FIFO_VI_IPAN,
534	IWL_TX_FIFO_BE_IPAN,
535	IWL_TX_FIFO_BK_IPAN,
536};
537
538static const u8 iwlagn_pan_ac_to_queue[] = {
539	7, 6, 5, 4,
540};
541
542static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
543{
544	int i;
545
546	/*
547	 * The default context is always valid,
548	 * the PAN context depends on uCode.
549	 */
550	priv->valid_contexts = BIT(IWL_RXON_CTX_BSS);
551	if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN)
552		priv->valid_contexts |= BIT(IWL_RXON_CTX_PAN);
553
554	for (i = 0; i < NUM_IWL_RXON_CTX; i++)
555		priv->contexts[i].ctxid = i;
556
557	priv->contexts[IWL_RXON_CTX_BSS].always_active = true;
558	priv->contexts[IWL_RXON_CTX_BSS].is_active = true;
559	priv->contexts[IWL_RXON_CTX_BSS].rxon_cmd = REPLY_RXON;
560	priv->contexts[IWL_RXON_CTX_BSS].rxon_timing_cmd = REPLY_RXON_TIMING;
561	priv->contexts[IWL_RXON_CTX_BSS].rxon_assoc_cmd = REPLY_RXON_ASSOC;
562	priv->contexts[IWL_RXON_CTX_BSS].qos_cmd = REPLY_QOS_PARAM;
563	priv->contexts[IWL_RXON_CTX_BSS].ap_sta_id = IWL_AP_ID;
564	priv->contexts[IWL_RXON_CTX_BSS].wep_key_cmd = REPLY_WEPKEY;
565	priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
566	priv->contexts[IWL_RXON_CTX_BSS].exclusive_interface_modes =
567		BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_MONITOR);
568	priv->contexts[IWL_RXON_CTX_BSS].interface_modes =
569		BIT(NL80211_IFTYPE_STATION);
570	priv->contexts[IWL_RXON_CTX_BSS].ap_devtype = RXON_DEV_TYPE_AP;
571	priv->contexts[IWL_RXON_CTX_BSS].ibss_devtype = RXON_DEV_TYPE_IBSS;
572	priv->contexts[IWL_RXON_CTX_BSS].station_devtype = RXON_DEV_TYPE_ESS;
573	priv->contexts[IWL_RXON_CTX_BSS].unused_devtype = RXON_DEV_TYPE_ESS;
574	memcpy(priv->contexts[IWL_RXON_CTX_BSS].ac_to_queue,
575	       iwlagn_bss_ac_to_queue, sizeof(iwlagn_bss_ac_to_queue));
576	memcpy(priv->contexts[IWL_RXON_CTX_BSS].ac_to_fifo,
577	       iwlagn_bss_ac_to_fifo, sizeof(iwlagn_bss_ac_to_fifo));
578
579	priv->contexts[IWL_RXON_CTX_PAN].rxon_cmd = REPLY_WIPAN_RXON;
580	priv->contexts[IWL_RXON_CTX_PAN].rxon_timing_cmd =
581		REPLY_WIPAN_RXON_TIMING;
582	priv->contexts[IWL_RXON_CTX_PAN].rxon_assoc_cmd =
583		REPLY_WIPAN_RXON_ASSOC;
584	priv->contexts[IWL_RXON_CTX_PAN].qos_cmd = REPLY_WIPAN_QOS_PARAM;
585	priv->contexts[IWL_RXON_CTX_PAN].ap_sta_id = IWL_AP_ID_PAN;
586	priv->contexts[IWL_RXON_CTX_PAN].wep_key_cmd = REPLY_WIPAN_WEPKEY;
587	priv->contexts[IWL_RXON_CTX_PAN].bcast_sta_id = IWLAGN_PAN_BCAST_ID;
588	priv->contexts[IWL_RXON_CTX_PAN].station_flags = STA_FLG_PAN_STATION;
589	priv->contexts[IWL_RXON_CTX_PAN].interface_modes =
590		BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP);
591
592	priv->contexts[IWL_RXON_CTX_PAN].ap_devtype = RXON_DEV_TYPE_CP;
593	priv->contexts[IWL_RXON_CTX_PAN].station_devtype = RXON_DEV_TYPE_2STA;
594	priv->contexts[IWL_RXON_CTX_PAN].unused_devtype = RXON_DEV_TYPE_P2P;
595	memcpy(priv->contexts[IWL_RXON_CTX_PAN].ac_to_queue,
596	       iwlagn_pan_ac_to_queue, sizeof(iwlagn_pan_ac_to_queue));
597	memcpy(priv->contexts[IWL_RXON_CTX_PAN].ac_to_fifo,
598	       iwlagn_pan_ac_to_fifo, sizeof(iwlagn_pan_ac_to_fifo));
599	priv->contexts[IWL_RXON_CTX_PAN].mcast_queue = IWL_IPAN_MCAST_QUEUE;
600
601	BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
602}
603
604static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
605{
606	struct iwl_ct_kill_config cmd;
607	struct iwl_ct_kill_throttling_config adv_cmd;
608	int ret = 0;
609
610	iwl_write32(priv->trans, CSR_UCODE_DRV_GP1_CLR,
611		    CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
612
613	priv->thermal_throttle.ct_kill_toggle = false;
614
615	if (priv->lib->support_ct_kill_exit) {
616		adv_cmd.critical_temperature_enter =
617			cpu_to_le32(priv->hw_params.ct_kill_threshold);
618		adv_cmd.critical_temperature_exit =
619			cpu_to_le32(priv->hw_params.ct_kill_exit_threshold);
620
621		ret = iwl_dvm_send_cmd_pdu(priv,
622				       REPLY_CT_KILL_CONFIG_CMD,
623				       0, sizeof(adv_cmd), &adv_cmd);
624		if (ret)
625			IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
626		else
627			IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
628				"succeeded, critical temperature enter is %d,"
629				"exit is %d\n",
630				priv->hw_params.ct_kill_threshold,
631				priv->hw_params.ct_kill_exit_threshold);
632	} else {
633		cmd.critical_temperature_R =
634			cpu_to_le32(priv->hw_params.ct_kill_threshold);
635
636		ret = iwl_dvm_send_cmd_pdu(priv,
637				       REPLY_CT_KILL_CONFIG_CMD,
638				       0, sizeof(cmd), &cmd);
639		if (ret)
640			IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
641		else
642			IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
643				"succeeded, "
644				"critical temperature is %d\n",
645				priv->hw_params.ct_kill_threshold);
646	}
647}
648
649static int iwlagn_send_calib_cfg_rt(struct iwl_priv *priv, u32 cfg)
650{
651	struct iwl_calib_cfg_cmd calib_cfg_cmd;
652	struct iwl_host_cmd cmd = {
653		.id = CALIBRATION_CFG_CMD,
654		.len = { sizeof(struct iwl_calib_cfg_cmd), },
655		.data = { &calib_cfg_cmd, },
656	};
657
658	memset(&calib_cfg_cmd, 0, sizeof(calib_cfg_cmd));
659	calib_cfg_cmd.ucd_calib_cfg.once.is_enable = IWL_CALIB_RT_CFG_ALL;
660	calib_cfg_cmd.ucd_calib_cfg.once.start = cpu_to_le32(cfg);
661
662	return iwl_dvm_send_cmd(priv, &cmd);
663}
664
665
666static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
667{
668	struct iwl_tx_ant_config_cmd tx_ant_cmd = {
669	  .valid = cpu_to_le32(valid_tx_ant),
670	};
671
672	if (IWL_UCODE_API(priv->fw->ucode_ver) > 1) {
673		IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant);
674		return iwl_dvm_send_cmd_pdu(priv, TX_ANT_CONFIGURATION_CMD, 0,
675					sizeof(struct iwl_tx_ant_config_cmd),
676					&tx_ant_cmd);
677	} else {
678		IWL_DEBUG_HC(priv, "TX_ANT_CONFIGURATION_CMD not supported\n");
679		return -EOPNOTSUPP;
680	}
681}
682
683static void iwl_send_bt_config(struct iwl_priv *priv)
684{
685	struct iwl_bt_cmd bt_cmd = {
686		.lead_time = BT_LEAD_TIME_DEF,
687		.max_kill = BT_MAX_KILL_DEF,
688		.kill_ack_mask = 0,
689		.kill_cts_mask = 0,
690	};
691
692	if (!iwlwifi_mod_params.bt_coex_active)
693		bt_cmd.flags = BT_COEX_DISABLE;
694	else
695		bt_cmd.flags = BT_COEX_ENABLE;
696
697	priv->bt_enable_flag = bt_cmd.flags;
698	IWL_DEBUG_INFO(priv, "BT coex %s\n",
699		(bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active");
700
701	if (iwl_dvm_send_cmd_pdu(priv, REPLY_BT_CONFIG,
702			     0, sizeof(struct iwl_bt_cmd), &bt_cmd))
703		IWL_ERR(priv, "failed to send BT Coex Config\n");
704}
705
706/**
707 * iwl_alive_start - called after REPLY_ALIVE notification received
708 *                   from protocol/runtime uCode (initialization uCode's
709 *                   Alive gets handled by iwl_init_alive_start()).
710 */
711int iwl_alive_start(struct iwl_priv *priv)
712{
713	int ret = 0;
714	struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
715
716	IWL_DEBUG_INFO(priv, "Runtime Alive received.\n");
717
718	/* After the ALIVE response, we can send host commands to the uCode */
719	set_bit(STATUS_ALIVE, &priv->status);
720
721	if (iwl_is_rfkill(priv))
722		return -ERFKILL;
723
724	if (priv->event_log.ucode_trace) {
725		/* start collecting data now */
726		mod_timer(&priv->ucode_trace, jiffies);
727	}
728
729	/* download priority table before any calibration request */
730	if (priv->lib->bt_params &&
731	    priv->lib->bt_params->advanced_bt_coexist) {
732		/* Configure Bluetooth device coexistence support */
733		if (priv->lib->bt_params->bt_sco_disable)
734			priv->bt_enable_pspoll = false;
735		else
736			priv->bt_enable_pspoll = true;
737
738		priv->bt_valid = IWLAGN_BT_ALL_VALID_MSK;
739		priv->kill_ack_mask = IWLAGN_BT_KILL_ACK_MASK_DEFAULT;
740		priv->kill_cts_mask = IWLAGN_BT_KILL_CTS_MASK_DEFAULT;
741		iwlagn_send_advance_bt_config(priv);
742		priv->bt_valid = IWLAGN_BT_VALID_ENABLE_FLAGS;
743		priv->cur_rssi_ctx = NULL;
744
745		iwl_send_prio_tbl(priv);
746
747		/* FIXME: w/a to force change uCode BT state machine */
748		ret = iwl_send_bt_env(priv, IWL_BT_COEX_ENV_OPEN,
749					 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2);
750		if (ret)
751			return ret;
752		ret = iwl_send_bt_env(priv, IWL_BT_COEX_ENV_CLOSE,
753					 BT_COEX_PRIO_TBL_EVT_INIT_CALIB2);
754		if (ret)
755			return ret;
756	} else if (priv->lib->bt_params) {
757		/*
758		 * default is 2-wire BT coexexistence support
759		 */
760		iwl_send_bt_config(priv);
761	}
762
763	/*
764	 * Perform runtime calibrations, including DC calibration.
765	 */
766	iwlagn_send_calib_cfg_rt(priv, IWL_CALIB_CFG_DC_IDX);
767
768	ieee80211_wake_queues(priv->hw);
769
770	/* Configure Tx antenna selection based on H/W config */
771	iwlagn_send_tx_ant_config(priv, priv->nvm_data->valid_tx_ant);
772
773	if (iwl_is_associated_ctx(ctx) && !priv->wowlan) {
774		struct iwl_rxon_cmd *active_rxon =
775				(struct iwl_rxon_cmd *)&ctx->active;
776		/* apply any changes in staging */
777		ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
778		active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
779	} else {
780		struct iwl_rxon_context *tmp;
781		/* Initialize our rx_config data */
782		for_each_context(priv, tmp)
783			iwl_connection_init_rx_config(priv, tmp);
784
785		iwlagn_set_rxon_chain(priv, ctx);
786	}
787
788	if (!priv->wowlan) {
789		/* WoWLAN ucode will not reply in the same way, skip it */
790		iwl_reset_run_time_calib(priv);
791	}
792
793	set_bit(STATUS_READY, &priv->status);
794
795	/* Configure the adapter for unassociated operation */
796	ret = iwlagn_commit_rxon(priv, ctx);
797	if (ret)
798		return ret;
799
800	/* At this point, the NIC is initialized and operational */
801	iwl_rf_kill_ct_config(priv);
802
803	IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
804
805	return iwl_power_update_mode(priv, true);
806}
807
808/**
809 * iwl_clear_driver_stations - clear knowledge of all stations from driver
810 * @priv: iwl priv struct
811 *
812 * This is called during iwl_down() to make sure that in the case
813 * we're coming there from a hardware restart mac80211 will be
814 * able to reconfigure stations -- if we're getting there in the
815 * normal down flow then the stations will already be cleared.
816 */
817static void iwl_clear_driver_stations(struct iwl_priv *priv)
818{
819	struct iwl_rxon_context *ctx;
820
821	spin_lock_bh(&priv->sta_lock);
822	memset(priv->stations, 0, sizeof(priv->stations));
823	priv->num_stations = 0;
824
825	priv->ucode_key_table = 0;
826
827	for_each_context(priv, ctx) {
828		/*
829		 * Remove all key information that is not stored as part
830		 * of station information since mac80211 may not have had
831		 * a chance to remove all the keys. When device is
832		 * reconfigured by mac80211 after an error all keys will
833		 * be reconfigured.
834		 */
835		memset(ctx->wep_keys, 0, sizeof(ctx->wep_keys));
836		ctx->key_mapping_keys = 0;
837	}
838
839	spin_unlock_bh(&priv->sta_lock);
840}
841
842void iwl_down(struct iwl_priv *priv)
843{
844	int exit_pending;
845
846	IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
847
848	lockdep_assert_held(&priv->mutex);
849
850	iwl_scan_cancel_timeout(priv, 200);
851
852	exit_pending =
853		test_and_set_bit(STATUS_EXIT_PENDING, &priv->status);
854
855	iwl_clear_ucode_stations(priv, NULL);
856	iwl_dealloc_bcast_stations(priv);
857	iwl_clear_driver_stations(priv);
858
859	/* reset BT coex data */
860	priv->bt_status = 0;
861	priv->cur_rssi_ctx = NULL;
862	priv->bt_is_sco = 0;
863	if (priv->lib->bt_params)
864		priv->bt_traffic_load =
865			 priv->lib->bt_params->bt_init_traffic_load;
866	else
867		priv->bt_traffic_load = 0;
868	priv->bt_full_concurrent = false;
869	priv->bt_ci_compliance = 0;
870
871	/* Wipe out the EXIT_PENDING status bit if we are not actually
872	 * exiting the module */
873	if (!exit_pending)
874		clear_bit(STATUS_EXIT_PENDING, &priv->status);
875
876	if (priv->mac80211_registered)
877		ieee80211_stop_queues(priv->hw);
878
879	priv->ucode_loaded = false;
880	iwl_trans_stop_device(priv->trans);
881
882	/* Set num_aux_in_flight must be done after the transport is stopped */
883	atomic_set(&priv->num_aux_in_flight, 0);
884
885	/* Clear out all status bits but a few that are stable across reset */
886	priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) <<
887				STATUS_RF_KILL_HW |
888			test_bit(STATUS_FW_ERROR, &priv->status) <<
889				STATUS_FW_ERROR |
890			test_bit(STATUS_EXIT_PENDING, &priv->status) <<
891				STATUS_EXIT_PENDING;
892
893	dev_kfree_skb(priv->beacon_skb);
894	priv->beacon_skb = NULL;
895}
896
897/*****************************************************************************
898 *
899 * Workqueue callbacks
900 *
901 *****************************************************************************/
902
903static void iwl_bg_run_time_calib_work(struct work_struct *work)
904{
905	struct iwl_priv *priv = container_of(work, struct iwl_priv,
906			run_time_calib_work);
907
908	mutex_lock(&priv->mutex);
909
910	if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
911	    test_bit(STATUS_SCANNING, &priv->status)) {
912		mutex_unlock(&priv->mutex);
913		return;
914	}
915
916	if (priv->start_calib) {
917		iwl_chain_noise_calibration(priv);
918		iwl_sensitivity_calibration(priv);
919	}
920
921	mutex_unlock(&priv->mutex);
922}
923
924void iwlagn_prepare_restart(struct iwl_priv *priv)
925{
926	bool bt_full_concurrent;
927	u8 bt_ci_compliance;
928	u8 bt_load;
929	u8 bt_status;
930	bool bt_is_sco;
931	int i;
932
933	lockdep_assert_held(&priv->mutex);
934
935	priv->is_open = 0;
936
937	/*
938	 * __iwl_down() will clear the BT status variables,
939	 * which is correct, but when we restart we really
940	 * want to keep them so restore them afterwards.
941	 *
942	 * The restart process will later pick them up and
943	 * re-configure the hw when we reconfigure the BT
944	 * command.
945	 */
946	bt_full_concurrent = priv->bt_full_concurrent;
947	bt_ci_compliance = priv->bt_ci_compliance;
948	bt_load = priv->bt_traffic_load;
949	bt_status = priv->bt_status;
950	bt_is_sco = priv->bt_is_sco;
951
952	iwl_down(priv);
953
954	priv->bt_full_concurrent = bt_full_concurrent;
955	priv->bt_ci_compliance = bt_ci_compliance;
956	priv->bt_traffic_load = bt_load;
957	priv->bt_status = bt_status;
958	priv->bt_is_sco = bt_is_sco;
959
960	/* reset aggregation queues */
961	for (i = IWLAGN_FIRST_AMPDU_QUEUE; i < IWL_MAX_HW_QUEUES; i++)
962		priv->queue_to_mac80211[i] = IWL_INVALID_MAC80211_QUEUE;
963	/* and stop counts */
964	for (i = 0; i < IWL_MAX_HW_QUEUES; i++)
965		atomic_set(&priv->queue_stop_count[i], 0);
966
967	memset(priv->agg_q_alloc, 0, sizeof(priv->agg_q_alloc));
968}
969
970static void iwl_bg_restart(struct work_struct *data)
971{
972	struct iwl_priv *priv = container_of(data, struct iwl_priv, restart);
973
974	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
975		return;
976
977	if (test_and_clear_bit(STATUS_FW_ERROR, &priv->status)) {
978		mutex_lock(&priv->mutex);
979		iwlagn_prepare_restart(priv);
980		mutex_unlock(&priv->mutex);
981		iwl_cancel_deferred_work(priv);
982		if (priv->mac80211_registered)
983			ieee80211_restart_hw(priv->hw);
984		else
985			IWL_ERR(priv,
986				"Cannot request restart before registrating with mac80211\n");
987	} else {
988		WARN_ON(1);
989	}
990}
991
992/*****************************************************************************
993 *
994 * driver setup and teardown
995 *
996 *****************************************************************************/
997
998static void iwl_setup_deferred_work(struct iwl_priv *priv)
999{
1000	priv->workqueue = create_singlethread_workqueue(DRV_NAME);
1001
1002	INIT_WORK(&priv->restart, iwl_bg_restart);
1003	INIT_WORK(&priv->beacon_update, iwl_bg_beacon_update);
1004	INIT_WORK(&priv->run_time_calib_work, iwl_bg_run_time_calib_work);
1005	INIT_WORK(&priv->tx_flush, iwl_bg_tx_flush);
1006	INIT_WORK(&priv->bt_full_concurrency, iwl_bg_bt_full_concurrency);
1007	INIT_WORK(&priv->bt_runtime_config, iwl_bg_bt_runtime_config);
1008
1009	iwl_setup_scan_deferred_work(priv);
1010
1011	if (priv->lib->bt_params)
1012		iwlagn_bt_setup_deferred_work(priv);
1013
1014	init_timer(&priv->statistics_periodic);
1015	priv->statistics_periodic.data = (unsigned long)priv;
1016	priv->statistics_periodic.function = iwl_bg_statistics_periodic;
1017
1018	init_timer(&priv->ucode_trace);
1019	priv->ucode_trace.data = (unsigned long)priv;
1020	priv->ucode_trace.function = iwl_bg_ucode_trace;
1021}
1022
1023void iwl_cancel_deferred_work(struct iwl_priv *priv)
1024{
1025	if (priv->lib->bt_params)
1026		iwlagn_bt_cancel_deferred_work(priv);
1027
1028	cancel_work_sync(&priv->run_time_calib_work);
1029	cancel_work_sync(&priv->beacon_update);
1030
1031	iwl_cancel_scan_deferred_work(priv);
1032
1033	cancel_work_sync(&priv->bt_full_concurrency);
1034	cancel_work_sync(&priv->bt_runtime_config);
1035
1036	del_timer_sync(&priv->statistics_periodic);
1037	del_timer_sync(&priv->ucode_trace);
1038}
1039
1040static int iwl_init_drv(struct iwl_priv *priv)
1041{
1042	spin_lock_init(&priv->sta_lock);
1043
1044	mutex_init(&priv->mutex);
1045
1046	INIT_LIST_HEAD(&priv->calib_results);
1047
1048	priv->band = IEEE80211_BAND_2GHZ;
1049
1050	priv->plcp_delta_threshold = priv->lib->plcp_delta_threshold;
1051
1052	priv->iw_mode = NL80211_IFTYPE_STATION;
1053	priv->current_ht_config.smps = IEEE80211_SMPS_STATIC;
1054	priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
1055	priv->agg_tids_count = 0;
1056
1057	priv->rx_statistics_jiffies = jiffies;
1058
1059	/* Choose which receivers/antennas to use */
1060	iwlagn_set_rxon_chain(priv, &priv->contexts[IWL_RXON_CTX_BSS]);
1061
1062	iwl_init_scan_params(priv);
1063
1064	/* init bt coex */
1065	if (priv->lib->bt_params &&
1066	    priv->lib->bt_params->advanced_bt_coexist) {
1067		priv->kill_ack_mask = IWLAGN_BT_KILL_ACK_MASK_DEFAULT;
1068		priv->kill_cts_mask = IWLAGN_BT_KILL_CTS_MASK_DEFAULT;
1069		priv->bt_valid = IWLAGN_BT_ALL_VALID_MSK;
1070		priv->bt_on_thresh = BT_ON_THRESHOLD_DEF;
1071		priv->bt_duration = BT_DURATION_LIMIT_DEF;
1072		priv->dynamic_frag_thresh = BT_FRAG_THRESHOLD_DEF;
1073	}
1074
1075	return 0;
1076}
1077
1078static void iwl_uninit_drv(struct iwl_priv *priv)
1079{
1080	kfree(priv->scan_cmd);
1081	kfree(priv->beacon_cmd);
1082	kfree(rcu_dereference_raw(priv->noa_data));
1083	iwl_calib_free_results(priv);
1084#ifdef CONFIG_IWLWIFI_DEBUGFS
1085	kfree(priv->wowlan_sram);
1086#endif
1087}
1088
1089static void iwl_set_hw_params(struct iwl_priv *priv)
1090{
1091	if (priv->cfg->ht_params)
1092		priv->hw_params.use_rts_for_aggregation =
1093			priv->cfg->ht_params->use_rts_for_aggregation;
1094
1095	/* Device-specific setup */
1096	priv->lib->set_hw_params(priv);
1097}
1098
1099
1100
1101/* show what optional capabilities we have */
1102static void iwl_option_config(struct iwl_priv *priv)
1103{
1104#ifdef CONFIG_IWLWIFI_DEBUG
1105	IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUG enabled\n");
1106#else
1107	IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUG disabled\n");
1108#endif
1109
1110#ifdef CONFIG_IWLWIFI_DEBUGFS
1111	IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUGFS enabled\n");
1112#else
1113	IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUGFS disabled\n");
1114#endif
1115
1116#ifdef CONFIG_IWLWIFI_DEVICE_TRACING
1117	IWL_INFO(priv, "CONFIG_IWLWIFI_DEVICE_TRACING enabled\n");
1118#else
1119	IWL_INFO(priv, "CONFIG_IWLWIFI_DEVICE_TRACING disabled\n");
1120#endif
1121}
1122
1123static int iwl_eeprom_init_hw_params(struct iwl_priv *priv)
1124{
1125	struct iwl_nvm_data *data = priv->nvm_data;
1126
1127	if (data->sku_cap_11n_enable &&
1128	    !priv->cfg->ht_params) {
1129		IWL_ERR(priv, "Invalid 11n configuration\n");
1130		return -EINVAL;
1131	}
1132
1133	if (!data->sku_cap_11n_enable && !data->sku_cap_band_24GHz_enable &&
1134	    !data->sku_cap_band_52GHz_enable) {
1135		IWL_ERR(priv, "Invalid device sku\n");
1136		return -EINVAL;
1137	}
1138
1139	IWL_DEBUG_INFO(priv,
1140		       "Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s\n",
1141		       data->sku_cap_band_24GHz_enable ? "" : "NOT", "enabled",
1142		       data->sku_cap_band_52GHz_enable ? "" : "NOT", "enabled",
1143		       data->sku_cap_11n_enable ? "" : "NOT", "enabled");
1144
1145	priv->hw_params.tx_chains_num =
1146		num_of_ant(data->valid_tx_ant);
1147	if (priv->cfg->rx_with_siso_diversity)
1148		priv->hw_params.rx_chains_num = 1;
1149	else
1150		priv->hw_params.rx_chains_num =
1151			num_of_ant(data->valid_rx_ant);
1152
1153	IWL_DEBUG_INFO(priv, "Valid Tx ant: 0x%X, Valid Rx ant: 0x%X\n",
1154		       data->valid_tx_ant,
1155		       data->valid_rx_ant);
1156
1157	return 0;
1158}
1159
1160static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1161						 const struct iwl_cfg *cfg,
1162						 const struct iwl_fw *fw,
1163						 struct dentry *dbgfs_dir)
1164{
1165	struct iwl_priv *priv;
1166	struct ieee80211_hw *hw;
1167	struct iwl_op_mode *op_mode;
1168	u16 num_mac;
1169	u32 ucode_flags;
1170	struct iwl_trans_config trans_cfg = {};
1171	static const u8 no_reclaim_cmds[] = {
1172		REPLY_RX_PHY_CMD,
1173		REPLY_RX_MPDU_CMD,
1174		REPLY_COMPRESSED_BA,
1175		STATISTICS_NOTIFICATION,
1176		REPLY_TX,
1177	};
1178	int i;
1179
1180	/************************
1181	 * 1. Allocating HW data
1182	 ************************/
1183	hw = iwl_alloc_all();
1184	if (!hw) {
1185		pr_err("%s: Cannot allocate network device\n", cfg->name);
1186		goto out;
1187	}
1188
1189	op_mode = hw->priv;
1190	op_mode->ops = &iwl_dvm_ops;
1191	priv = IWL_OP_MODE_GET_DVM(op_mode);
1192	priv->trans = trans;
1193	priv->dev = trans->dev;
1194	priv->cfg = cfg;
1195	priv->fw = fw;
1196
1197	switch (priv->cfg->device_family) {
1198	case IWL_DEVICE_FAMILY_1000:
1199	case IWL_DEVICE_FAMILY_100:
1200		priv->lib = &iwl_dvm_1000_cfg;
1201		break;
1202	case IWL_DEVICE_FAMILY_2000:
1203		priv->lib = &iwl_dvm_2000_cfg;
1204		break;
1205	case IWL_DEVICE_FAMILY_105:
1206		priv->lib = &iwl_dvm_105_cfg;
1207		break;
1208	case IWL_DEVICE_FAMILY_2030:
1209	case IWL_DEVICE_FAMILY_135:
1210		priv->lib = &iwl_dvm_2030_cfg;
1211		break;
1212	case IWL_DEVICE_FAMILY_5000:
1213		priv->lib = &iwl_dvm_5000_cfg;
1214		break;
1215	case IWL_DEVICE_FAMILY_5150:
1216		priv->lib = &iwl_dvm_5150_cfg;
1217		break;
1218	case IWL_DEVICE_FAMILY_6000:
1219	case IWL_DEVICE_FAMILY_6000i:
1220		priv->lib = &iwl_dvm_6000_cfg;
1221		break;
1222	case IWL_DEVICE_FAMILY_6005:
1223		priv->lib = &iwl_dvm_6005_cfg;
1224		break;
1225	case IWL_DEVICE_FAMILY_6050:
1226	case IWL_DEVICE_FAMILY_6150:
1227		priv->lib = &iwl_dvm_6050_cfg;
1228		break;
1229	case IWL_DEVICE_FAMILY_6030:
1230		priv->lib = &iwl_dvm_6030_cfg;
1231		break;
1232	default:
1233		break;
1234	}
1235
1236	if (WARN_ON(!priv->lib))
1237		goto out_free_hw;
1238
1239	/*
1240	 * Populate the state variables that the transport layer needs
1241	 * to know about.
1242	 */
1243	trans_cfg.op_mode = op_mode;
1244	trans_cfg.no_reclaim_cmds = no_reclaim_cmds;
1245	trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds);
1246	trans_cfg.rx_buf_size_8k = iwlwifi_mod_params.amsdu_size_8K;
1247	if (!iwlwifi_mod_params.wd_disable)
1248		trans_cfg.queue_watchdog_timeout =
1249			priv->cfg->base_params->wd_timeout;
1250	else
1251		trans_cfg.queue_watchdog_timeout = IWL_WATCHDOG_DISABLED;
1252	trans_cfg.command_names = iwl_dvm_cmd_strings;
1253	trans_cfg.cmd_fifo = IWLAGN_CMD_FIFO_NUM;
1254
1255	WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE <
1256		priv->cfg->base_params->num_of_queues);
1257
1258	ucode_flags = fw->ucode_capa.flags;
1259
1260	if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN) {
1261		priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN;
1262		trans_cfg.cmd_queue = IWL_IPAN_CMD_QUEUE_NUM;
1263	} else {
1264		priv->sta_key_max_num = STA_KEY_MAX_NUM;
1265		trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
1266	}
1267
1268	/* Configure transport layer */
1269	iwl_trans_configure(priv->trans, &trans_cfg);
1270
1271	trans->rx_mpdu_cmd = REPLY_RX_MPDU_CMD;
1272	trans->rx_mpdu_cmd_hdr_size = sizeof(struct iwl_rx_mpdu_res_start);
1273
1274	/* At this point both hw and priv are allocated. */
1275
1276	SET_IEEE80211_DEV(priv->hw, priv->trans->dev);
1277
1278	iwl_option_config(priv);
1279
1280	IWL_DEBUG_INFO(priv, "*** LOAD DRIVER ***\n");
1281
1282	/* is antenna coupling more than 35dB ? */
1283	priv->bt_ant_couple_ok =
1284		(iwlwifi_mod_params.ant_coupling >
1285			IWL_BT_ANTENNA_COUPLING_THRESHOLD) ?
1286			true : false;
1287
1288	/* bt channel inhibition enabled*/
1289	priv->bt_ch_announce = true;
1290	IWL_DEBUG_INFO(priv, "BT channel inhibition is %s\n",
1291		       (priv->bt_ch_announce) ? "On" : "Off");
1292
1293	/* these spin locks will be used in apm_ops.init and EEPROM access
1294	 * we should init now
1295	 */
1296	spin_lock_init(&priv->statistics.lock);
1297
1298	/***********************
1299	 * 2. Read REV register
1300	 ***********************/
1301	IWL_INFO(priv, "Detected %s, REV=0x%X\n",
1302		priv->cfg->name, priv->trans->hw_rev);
1303
1304	if (iwl_trans_start_hw(priv->trans))
1305		goto out_free_hw;
1306
1307	/* Read the EEPROM */
1308	if (iwl_read_eeprom(priv->trans, &priv->eeprom_blob,
1309			    &priv->eeprom_blob_size)) {
1310		IWL_ERR(priv, "Unable to init EEPROM\n");
1311		goto out_free_hw;
1312	}
1313
1314	/* Reset chip to save power until we load uCode during "up". */
1315	iwl_trans_stop_device(priv->trans);
1316
1317	priv->nvm_data = iwl_parse_eeprom_data(priv->trans->dev, priv->cfg,
1318						  priv->eeprom_blob,
1319						  priv->eeprom_blob_size);
1320	if (!priv->nvm_data)
1321		goto out_free_eeprom_blob;
1322
1323	if (iwl_nvm_check_version(priv->nvm_data, priv->trans))
1324		goto out_free_eeprom;
1325
1326	if (iwl_eeprom_init_hw_params(priv))
1327		goto out_free_eeprom;
1328
1329	/* extract MAC Address */
1330	memcpy(priv->addresses[0].addr, priv->nvm_data->hw_addr, ETH_ALEN);
1331	IWL_DEBUG_INFO(priv, "MAC address: %pM\n", priv->addresses[0].addr);
1332	priv->hw->wiphy->addresses = priv->addresses;
1333	priv->hw->wiphy->n_addresses = 1;
1334	num_mac = priv->nvm_data->n_hw_addrs;
1335	if (num_mac > 1) {
1336		memcpy(priv->addresses[1].addr, priv->addresses[0].addr,
1337		       ETH_ALEN);
1338		priv->addresses[1].addr[5]++;
1339		priv->hw->wiphy->n_addresses++;
1340	}
1341
1342	/************************
1343	 * 4. Setup HW constants
1344	 ************************/
1345	iwl_set_hw_params(priv);
1346
1347	if (!(priv->nvm_data->sku_cap_ipan_enable)) {
1348		IWL_DEBUG_INFO(priv, "Your EEPROM disabled PAN\n");
1349		ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
1350		/*
1351		 * if not PAN, then don't support P2P -- might be a uCode
1352		 * packaging bug or due to the eeprom check above
1353		 */
1354		priv->sta_key_max_num = STA_KEY_MAX_NUM;
1355		trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
1356
1357		/* Configure transport layer again*/
1358		iwl_trans_configure(priv->trans, &trans_cfg);
1359	}
1360
1361	/*******************
1362	 * 5. Setup priv
1363	 *******************/
1364	for (i = 0; i < IWL_MAX_HW_QUEUES; i++) {
1365		priv->queue_to_mac80211[i] = IWL_INVALID_MAC80211_QUEUE;
1366		if (i < IWLAGN_FIRST_AMPDU_QUEUE &&
1367		    i != IWL_DEFAULT_CMD_QUEUE_NUM &&
1368		    i != IWL_IPAN_CMD_QUEUE_NUM)
1369			priv->queue_to_mac80211[i] = i;
1370		atomic_set(&priv->queue_stop_count[i], 0);
1371	}
1372
1373	if (iwl_init_drv(priv))
1374		goto out_free_eeprom;
1375
1376	/* At this point both hw and priv are initialized. */
1377
1378	/********************
1379	 * 6. Setup services
1380	 ********************/
1381	iwl_setup_deferred_work(priv);
1382	iwl_setup_rx_handlers(priv);
1383
1384	iwl_power_initialize(priv);
1385	iwl_tt_initialize(priv);
1386
1387	snprintf(priv->hw->wiphy->fw_version,
1388		 sizeof(priv->hw->wiphy->fw_version),
1389		 "%s", fw->fw_version);
1390
1391	priv->new_scan_threshold_behaviour =
1392		!!(ucode_flags & IWL_UCODE_TLV_FLAGS_NEWSCAN);
1393
1394	priv->phy_calib_chain_noise_reset_cmd =
1395		fw->ucode_capa.standard_phy_calibration_size;
1396	priv->phy_calib_chain_noise_gain_cmd =
1397		fw->ucode_capa.standard_phy_calibration_size + 1;
1398
1399	/* initialize all valid contexts */
1400	iwl_init_context(priv, ucode_flags);
1401
1402	/**************************************************
1403	 * This is still part of probe() in a sense...
1404	 *
1405	 * 7. Setup and register with mac80211 and debugfs
1406	 **************************************************/
1407	if (iwlagn_mac_setup_register(priv, &fw->ucode_capa))
1408		goto out_destroy_workqueue;
1409
1410	if (iwl_dbgfs_register(priv, dbgfs_dir))
1411		goto out_mac80211_unregister;
1412
1413	return op_mode;
1414
1415out_mac80211_unregister:
1416	iwlagn_mac_unregister(priv);
1417out_destroy_workqueue:
1418	iwl_tt_exit(priv);
1419	iwl_cancel_deferred_work(priv);
1420	destroy_workqueue(priv->workqueue);
1421	priv->workqueue = NULL;
1422	iwl_uninit_drv(priv);
1423out_free_eeprom_blob:
1424	kfree(priv->eeprom_blob);
1425out_free_eeprom:
1426	iwl_free_nvm_data(priv->nvm_data);
1427out_free_hw:
1428	ieee80211_free_hw(priv->hw);
1429out:
1430	op_mode = NULL;
1431	return op_mode;
1432}
1433
1434static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
1435{
1436	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1437
1438	IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n");
1439
1440	iwlagn_mac_unregister(priv);
1441
1442	iwl_tt_exit(priv);
1443
1444	kfree(priv->eeprom_blob);
1445	iwl_free_nvm_data(priv->nvm_data);
1446
1447	/*netif_stop_queue(dev); */
1448	flush_workqueue(priv->workqueue);
1449
1450	/* ieee80211_unregister_hw calls iwlagn_mac_stop, which flushes
1451	 * priv->workqueue... so we can't take down the workqueue
1452	 * until now... */
1453	destroy_workqueue(priv->workqueue);
1454	priv->workqueue = NULL;
1455
1456	iwl_uninit_drv(priv);
1457
1458	dev_kfree_skb(priv->beacon_skb);
1459
1460	iwl_trans_op_mode_leave(priv->trans);
1461	ieee80211_free_hw(priv->hw);
1462}
1463
1464static const char * const desc_lookup_text[] = {
1465	"OK",
1466	"FAIL",
1467	"BAD_PARAM",
1468	"BAD_CHECKSUM",
1469	"NMI_INTERRUPT_WDG",
1470	"SYSASSERT",
1471	"FATAL_ERROR",
1472	"BAD_COMMAND",
1473	"HW_ERROR_TUNE_LOCK",
1474	"HW_ERROR_TEMPERATURE",
1475	"ILLEGAL_CHAN_FREQ",
1476	"VCC_NOT_STABLE",
1477	"FH_ERROR",
1478	"NMI_INTERRUPT_HOST",
1479	"NMI_INTERRUPT_ACTION_PT",
1480	"NMI_INTERRUPT_UNKNOWN",
1481	"UCODE_VERSION_MISMATCH",
1482	"HW_ERROR_ABS_LOCK",
1483	"HW_ERROR_CAL_LOCK_FAIL",
1484	"NMI_INTERRUPT_INST_ACTION_PT",
1485	"NMI_INTERRUPT_DATA_ACTION_PT",
1486	"NMI_TRM_HW_ER",
1487	"NMI_INTERRUPT_TRM",
1488	"NMI_INTERRUPT_BREAK_POINT",
1489	"DEBUG_0",
1490	"DEBUG_1",
1491	"DEBUG_2",
1492	"DEBUG_3",
1493};
1494
1495static struct { char *name; u8 num; } advanced_lookup[] = {
1496	{ "NMI_INTERRUPT_WDG", 0x34 },
1497	{ "SYSASSERT", 0x35 },
1498	{ "UCODE_VERSION_MISMATCH", 0x37 },
1499	{ "BAD_COMMAND", 0x38 },
1500	{ "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C },
1501	{ "FATAL_ERROR", 0x3D },
1502	{ "NMI_TRM_HW_ERR", 0x46 },
1503	{ "NMI_INTERRUPT_TRM", 0x4C },
1504	{ "NMI_INTERRUPT_BREAK_POINT", 0x54 },
1505	{ "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C },
1506	{ "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 },
1507	{ "NMI_INTERRUPT_HOST", 0x66 },
1508	{ "NMI_INTERRUPT_ACTION_PT", 0x7C },
1509	{ "NMI_INTERRUPT_UNKNOWN", 0x84 },
1510	{ "NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
1511	{ "ADVANCED_SYSASSERT", 0 },
1512};
1513
1514static const char *desc_lookup(u32 num)
1515{
1516	int i;
1517	int max = ARRAY_SIZE(desc_lookup_text);
1518
1519	if (num < max)
1520		return desc_lookup_text[num];
1521
1522	max = ARRAY_SIZE(advanced_lookup) - 1;
1523	for (i = 0; i < max; i++) {
1524		if (advanced_lookup[i].num == num)
1525			break;
1526	}
1527	return advanced_lookup[i].name;
1528}
1529
1530#define ERROR_START_OFFSET  (1 * sizeof(u32))
1531#define ERROR_ELEM_SIZE     (7 * sizeof(u32))
1532
1533static void iwl_dump_nic_error_log(struct iwl_priv *priv)
1534{
1535	struct iwl_trans *trans = priv->trans;
1536	u32 base;
1537	struct iwl_error_event_table table;
1538
1539	base = priv->device_pointers.error_event_table;
1540	if (priv->cur_ucode == IWL_UCODE_INIT) {
1541		if (!base)
1542			base = priv->fw->init_errlog_ptr;
1543	} else {
1544		if (!base)
1545			base = priv->fw->inst_errlog_ptr;
1546	}
1547
1548	if (!iwlagn_hw_valid_rtc_data_addr(base)) {
1549		IWL_ERR(priv,
1550			"Not valid error log pointer 0x%08X for %s uCode\n",
1551			base,
1552			(priv->cur_ucode == IWL_UCODE_INIT)
1553					? "Init" : "RT");
1554		return;
1555	}
1556
1557	/*TODO: Update dbgfs with ISR error stats obtained below */
1558	iwl_trans_read_mem_bytes(trans, base, &table, sizeof(table));
1559
1560	if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
1561		IWL_ERR(trans, "Start IWL Error Log Dump:\n");
1562		IWL_ERR(trans, "Status: 0x%08lX, count: %d\n",
1563			priv->status, table.valid);
1564	}
1565
1566	trace_iwlwifi_dev_ucode_error(trans->dev, table.error_id, table.tsf_low,
1567				      table.data1, table.data2, table.line,
1568				      table.blink1, table.blink2, table.ilink1,
1569				      table.ilink2, table.bcon_time, table.gp1,
1570				      table.gp2, table.gp3, table.ucode_ver,
1571				      table.hw_ver, table.brd_ver);
1572	IWL_ERR(priv, "0x%08X | %-28s\n", table.error_id,
1573		desc_lookup(table.error_id));
1574	IWL_ERR(priv, "0x%08X | uPc\n", table.pc);
1575	IWL_ERR(priv, "0x%08X | branchlink1\n", table.blink1);
1576	IWL_ERR(priv, "0x%08X | branchlink2\n", table.blink2);
1577	IWL_ERR(priv, "0x%08X | interruptlink1\n", table.ilink1);
1578	IWL_ERR(priv, "0x%08X | interruptlink2\n", table.ilink2);
1579	IWL_ERR(priv, "0x%08X | data1\n", table.data1);
1580	IWL_ERR(priv, "0x%08X | data2\n", table.data2);
1581	IWL_ERR(priv, "0x%08X | line\n", table.line);
1582	IWL_ERR(priv, "0x%08X | beacon time\n", table.bcon_time);
1583	IWL_ERR(priv, "0x%08X | tsf low\n", table.tsf_low);
1584	IWL_ERR(priv, "0x%08X | tsf hi\n", table.tsf_hi);
1585	IWL_ERR(priv, "0x%08X | time gp1\n", table.gp1);
1586	IWL_ERR(priv, "0x%08X | time gp2\n", table.gp2);
1587	IWL_ERR(priv, "0x%08X | time gp3\n", table.gp3);
1588	IWL_ERR(priv, "0x%08X | uCode version\n", table.ucode_ver);
1589	IWL_ERR(priv, "0x%08X | hw version\n", table.hw_ver);
1590	IWL_ERR(priv, "0x%08X | board version\n", table.brd_ver);
1591	IWL_ERR(priv, "0x%08X | hcmd\n", table.hcmd);
1592	IWL_ERR(priv, "0x%08X | isr0\n", table.isr0);
1593	IWL_ERR(priv, "0x%08X | isr1\n", table.isr1);
1594	IWL_ERR(priv, "0x%08X | isr2\n", table.isr2);
1595	IWL_ERR(priv, "0x%08X | isr3\n", table.isr3);
1596	IWL_ERR(priv, "0x%08X | isr4\n", table.isr4);
1597	IWL_ERR(priv, "0x%08X | isr_pref\n", table.isr_pref);
1598	IWL_ERR(priv, "0x%08X | wait_event\n", table.wait_event);
1599	IWL_ERR(priv, "0x%08X | l2p_control\n", table.l2p_control);
1600	IWL_ERR(priv, "0x%08X | l2p_duration\n", table.l2p_duration);
1601	IWL_ERR(priv, "0x%08X | l2p_mhvalid\n", table.l2p_mhvalid);
1602	IWL_ERR(priv, "0x%08X | l2p_addr_match\n", table.l2p_addr_match);
1603	IWL_ERR(priv, "0x%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel);
1604	IWL_ERR(priv, "0x%08X | timestamp\n", table.u_timestamp);
1605	IWL_ERR(priv, "0x%08X | flow_handler\n", table.flow_handler);
1606}
1607
1608#define EVENT_START_OFFSET  (4 * sizeof(u32))
1609
1610/**
1611 * iwl_print_event_log - Dump error event log to syslog
1612 *
1613 */
1614static int iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
1615			       u32 num_events, u32 mode,
1616			       int pos, char **buf, size_t bufsz)
1617{
1618	u32 i;
1619	u32 base;       /* SRAM byte address of event log header */
1620	u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
1621	u32 ptr;        /* SRAM byte address of log data */
1622	u32 ev, time, data; /* event log data */
1623	unsigned long reg_flags;
1624
1625	struct iwl_trans *trans = priv->trans;
1626
1627	if (num_events == 0)
1628		return pos;
1629
1630	base = priv->device_pointers.log_event_table;
1631	if (priv->cur_ucode == IWL_UCODE_INIT) {
1632		if (!base)
1633			base = priv->fw->init_evtlog_ptr;
1634	} else {
1635		if (!base)
1636			base = priv->fw->inst_evtlog_ptr;
1637	}
1638
1639	if (mode == 0)
1640		event_size = 2 * sizeof(u32);
1641	else
1642		event_size = 3 * sizeof(u32);
1643
1644	ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
1645
1646	/* Make sure device is powered up for SRAM reads */
1647	if (!iwl_trans_grab_nic_access(trans, false, &reg_flags))
1648		return pos;
1649
1650	/* Set starting address; reads will auto-increment */
1651	iwl_write32(trans, HBUS_TARG_MEM_RADDR, ptr);
1652
1653	/* "time" is actually "data" for mode 0 (no timestamp).
1654	* place event id # at far right for easier visual parsing. */
1655	for (i = 0; i < num_events; i++) {
1656		ev = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
1657		time = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
1658		if (mode == 0) {
1659			/* data, ev */
1660			if (bufsz) {
1661				pos += scnprintf(*buf + pos, bufsz - pos,
1662						"EVT_LOG:0x%08x:%04u\n",
1663						time, ev);
1664			} else {
1665				trace_iwlwifi_dev_ucode_event(trans->dev, 0,
1666					time, ev);
1667				IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n",
1668					time, ev);
1669			}
1670		} else {
1671			data = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
1672			if (bufsz) {
1673				pos += scnprintf(*buf + pos, bufsz - pos,
1674						"EVT_LOGT:%010u:0x%08x:%04u\n",
1675						 time, data, ev);
1676			} else {
1677				IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
1678					time, data, ev);
1679				trace_iwlwifi_dev_ucode_event(trans->dev, time,
1680					data, ev);
1681			}
1682		}
1683	}
1684
1685	/* Allow device to power down */
1686	iwl_trans_release_nic_access(trans, &reg_flags);
1687	return pos;
1688}
1689
1690/**
1691 * iwl_print_last_event_logs - Dump the newest # of event log to syslog
1692 */
1693static int iwl_print_last_event_logs(struct iwl_priv *priv, u32 capacity,
1694				    u32 num_wraps, u32 next_entry,
1695				    u32 size, u32 mode,
1696				    int pos, char **buf, size_t bufsz)
1697{
1698	/*
1699	 * display the newest DEFAULT_LOG_ENTRIES entries
1700	 * i.e the entries just before the next ont that uCode would fill.
1701	 */
1702	if (num_wraps) {
1703		if (next_entry < size) {
1704			pos = iwl_print_event_log(priv,
1705						capacity - (size - next_entry),
1706						size - next_entry, mode,
1707						pos, buf, bufsz);
1708			pos = iwl_print_event_log(priv, 0,
1709						  next_entry, mode,
1710						  pos, buf, bufsz);
1711		} else
1712			pos = iwl_print_event_log(priv, next_entry - size,
1713						  size, mode, pos, buf, bufsz);
1714	} else {
1715		if (next_entry < size) {
1716			pos = iwl_print_event_log(priv, 0, next_entry,
1717						  mode, pos, buf, bufsz);
1718		} else {
1719			pos = iwl_print_event_log(priv, next_entry - size,
1720						  size, mode, pos, buf, bufsz);
1721		}
1722	}
1723	return pos;
1724}
1725
1726#define DEFAULT_DUMP_EVENT_LOG_ENTRIES (20)
1727
1728int iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
1729			    char **buf)
1730{
1731	u32 base;       /* SRAM byte address of event log header */
1732	u32 capacity;   /* event log capacity in # entries */
1733	u32 mode;       /* 0 - no timestamp, 1 - timestamp recorded */
1734	u32 num_wraps;  /* # times uCode wrapped to top of log */
1735	u32 next_entry; /* index of next entry to be written by uCode */
1736	u32 size;       /* # entries that we'll print */
1737	u32 logsize;
1738	int pos = 0;
1739	size_t bufsz = 0;
1740	struct iwl_trans *trans = priv->trans;
1741
1742	base = priv->device_pointers.log_event_table;
1743	if (priv->cur_ucode == IWL_UCODE_INIT) {
1744		logsize = priv->fw->init_evtlog_size;
1745		if (!base)
1746			base = priv->fw->init_evtlog_ptr;
1747	} else {
1748		logsize = priv->fw->inst_evtlog_size;
1749		if (!base)
1750			base = priv->fw->inst_evtlog_ptr;
1751	}
1752
1753	if (!iwlagn_hw_valid_rtc_data_addr(base)) {
1754		IWL_ERR(priv,
1755			"Invalid event log pointer 0x%08X for %s uCode\n",
1756			base,
1757			(priv->cur_ucode == IWL_UCODE_INIT)
1758					? "Init" : "RT");
1759		return -EINVAL;
1760	}
1761
1762	/* event log header */
1763	capacity = iwl_trans_read_mem32(trans, base);
1764	mode = iwl_trans_read_mem32(trans, base + (1 * sizeof(u32)));
1765	num_wraps = iwl_trans_read_mem32(trans, base + (2 * sizeof(u32)));
1766	next_entry = iwl_trans_read_mem32(trans, base + (3 * sizeof(u32)));
1767
1768	if (capacity > logsize) {
1769		IWL_ERR(priv, "Log capacity %d is bogus, limit to %d "
1770			"entries\n", capacity, logsize);
1771		capacity = logsize;
1772	}
1773
1774	if (next_entry > logsize) {
1775		IWL_ERR(priv, "Log write index %d is bogus, limit to %d\n",
1776			next_entry, logsize);
1777		next_entry = logsize;
1778	}
1779
1780	size = num_wraps ? capacity : next_entry;
1781
1782	/* bail out if nothing in log */
1783	if (size == 0) {
1784		IWL_ERR(trans, "Start IWL Event Log Dump: nothing in log\n");
1785		return pos;
1786	}
1787
1788	if (!(iwl_have_debug_level(IWL_DL_FW_ERRORS)) && !full_log)
1789		size = (size > DEFAULT_DUMP_EVENT_LOG_ENTRIES)
1790			? DEFAULT_DUMP_EVENT_LOG_ENTRIES : size;
1791	IWL_ERR(priv, "Start IWL Event Log Dump: display last %u entries\n",
1792		size);
1793
1794#ifdef CONFIG_IWLWIFI_DEBUG
1795	if (buf) {
1796		if (full_log)
1797			bufsz = capacity * 48;
1798		else
1799			bufsz = size * 48;
1800		*buf = kmalloc(bufsz, GFP_KERNEL);
1801		if (!*buf)
1802			return -ENOMEM;
1803	}
1804	if (iwl_have_debug_level(IWL_DL_FW_ERRORS) || full_log) {
1805		/*
1806		 * if uCode has wrapped back to top of log,
1807		 * start at the oldest entry,
1808		 * i.e the next one that uCode would fill.
1809		 */
1810		if (num_wraps)
1811			pos = iwl_print_event_log(priv, next_entry,
1812						capacity - next_entry, mode,
1813						pos, buf, bufsz);
1814		/* (then/else) start at top of log */
1815		pos = iwl_print_event_log(priv, 0,
1816					  next_entry, mode, pos, buf, bufsz);
1817	} else
1818		pos = iwl_print_last_event_logs(priv, capacity, num_wraps,
1819						next_entry, size, mode,
1820						pos, buf, bufsz);
1821#else
1822	pos = iwl_print_last_event_logs(priv, capacity, num_wraps,
1823					next_entry, size, mode,
1824					pos, buf, bufsz);
1825#endif
1826	return pos;
1827}
1828
1829static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
1830{
1831	unsigned int reload_msec;
1832	unsigned long reload_jiffies;
1833
1834	if (iwl_have_debug_level(IWL_DL_FW_ERRORS))
1835		iwl_print_rx_config_cmd(priv, IWL_RXON_CTX_BSS);
1836
1837	/* uCode is no longer loaded. */
1838	priv->ucode_loaded = false;
1839
1840	/* Set the FW error flag -- cleared on iwl_down */
1841	set_bit(STATUS_FW_ERROR, &priv->status);
1842
1843	iwl_abort_notification_waits(&priv->notif_wait);
1844
1845	/* Keep the restart process from trying to send host
1846	 * commands by clearing the ready bit */
1847	clear_bit(STATUS_READY, &priv->status);
1848
1849	if (!ondemand) {
1850		/*
1851		 * If firmware keep reloading, then it indicate something
1852		 * serious wrong and firmware having problem to recover
1853		 * from it. Instead of keep trying which will fill the syslog
1854		 * and hang the system, let's just stop it
1855		 */
1856		reload_jiffies = jiffies;
1857		reload_msec = jiffies_to_msecs((long) reload_jiffies -
1858					(long) priv->reload_jiffies);
1859		priv->reload_jiffies = reload_jiffies;
1860		if (reload_msec <= IWL_MIN_RELOAD_DURATION) {
1861			priv->reload_count++;
1862			if (priv->reload_count >= IWL_MAX_CONTINUE_RELOAD_CNT) {
1863				IWL_ERR(priv, "BUG_ON, Stop restarting\n");
1864				return;
1865			}
1866		} else
1867			priv->reload_count = 0;
1868	}
1869
1870	if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) {
1871		if (iwlwifi_mod_params.restart_fw) {
1872			IWL_DEBUG_FW_ERRORS(priv,
1873				  "Restarting adapter due to uCode error.\n");
1874			queue_work(priv->workqueue, &priv->restart);
1875		} else
1876			IWL_DEBUG_FW_ERRORS(priv,
1877				  "Detected FW error, but not restarting\n");
1878	}
1879}
1880
1881static void iwl_nic_error(struct iwl_op_mode *op_mode)
1882{
1883	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1884
1885	IWL_ERR(priv, "Loaded firmware version: %s\n",
1886		priv->fw->fw_version);
1887
1888	iwl_dump_nic_error_log(priv);
1889	iwl_dump_nic_event_log(priv, false, NULL);
1890
1891	iwlagn_fw_error(priv, false);
1892}
1893
1894static void iwl_cmd_queue_full(struct iwl_op_mode *op_mode)
1895{
1896	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1897
1898	if (!iwl_check_for_ct_kill(priv)) {
1899		IWL_ERR(priv, "Restarting adapter queue is full\n");
1900		iwlagn_fw_error(priv, false);
1901	}
1902}
1903
1904#define EEPROM_RF_CONFIG_TYPE_MAX      0x3
1905
1906static void iwl_nic_config(struct iwl_op_mode *op_mode)
1907{
1908	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1909
1910	/* SKU Control */
1911	iwl_trans_set_bits_mask(priv->trans, CSR_HW_IF_CONFIG_REG,
1912				CSR_HW_IF_CONFIG_REG_MSK_MAC_DASH |
1913				CSR_HW_IF_CONFIG_REG_MSK_MAC_STEP,
1914				(CSR_HW_REV_STEP(priv->trans->hw_rev) <<
1915					CSR_HW_IF_CONFIG_REG_POS_MAC_STEP) |
1916				(CSR_HW_REV_DASH(priv->trans->hw_rev) <<
1917					CSR_HW_IF_CONFIG_REG_POS_MAC_DASH));
1918
1919	/* write radio config values to register */
1920	if (priv->nvm_data->radio_cfg_type <= EEPROM_RF_CONFIG_TYPE_MAX) {
1921		u32 reg_val =
1922			priv->nvm_data->radio_cfg_type <<
1923				CSR_HW_IF_CONFIG_REG_POS_PHY_TYPE |
1924			priv->nvm_data->radio_cfg_step <<
1925				CSR_HW_IF_CONFIG_REG_POS_PHY_STEP |
1926			priv->nvm_data->radio_cfg_dash <<
1927				CSR_HW_IF_CONFIG_REG_POS_PHY_DASH;
1928
1929		iwl_trans_set_bits_mask(priv->trans, CSR_HW_IF_CONFIG_REG,
1930					CSR_HW_IF_CONFIG_REG_MSK_PHY_TYPE |
1931					CSR_HW_IF_CONFIG_REG_MSK_PHY_STEP |
1932					CSR_HW_IF_CONFIG_REG_MSK_PHY_DASH,
1933					reg_val);
1934
1935		IWL_INFO(priv, "Radio type=0x%x-0x%x-0x%x\n",
1936			 priv->nvm_data->radio_cfg_type,
1937			 priv->nvm_data->radio_cfg_step,
1938			 priv->nvm_data->radio_cfg_dash);
1939	} else {
1940		WARN_ON(1);
1941	}
1942
1943	/* set CSR_HW_CONFIG_REG for uCode use */
1944	iwl_set_bit(priv->trans, CSR_HW_IF_CONFIG_REG,
1945		    CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI |
1946		    CSR_HW_IF_CONFIG_REG_BIT_MAC_SI);
1947
1948	/* W/A : NIC is stuck in a reset state after Early PCIe power off
1949	 * (PCIe power is lost before PERST# is asserted),
1950	 * causing ME FW to lose ownership and not being able to obtain it back.
1951	 */
1952	iwl_set_bits_mask_prph(priv->trans, APMG_PS_CTRL_REG,
1953			       APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS,
1954			       ~APMG_PS_CTRL_EARLY_PWR_OFF_RESET_DIS);
1955
1956	if (priv->lib->nic_config)
1957		priv->lib->nic_config(priv);
1958}
1959
1960static void iwl_wimax_active(struct iwl_op_mode *op_mode)
1961{
1962	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1963
1964	clear_bit(STATUS_READY, &priv->status);
1965	IWL_ERR(priv, "RF is used by WiMAX\n");
1966}
1967
1968static void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, int queue)
1969{
1970	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1971	int mq = priv->queue_to_mac80211[queue];
1972
1973	if (WARN_ON_ONCE(mq == IWL_INVALID_MAC80211_QUEUE))
1974		return;
1975
1976	if (atomic_inc_return(&priv->queue_stop_count[mq]) > 1) {
1977		IWL_DEBUG_TX_QUEUES(priv,
1978			"queue %d (mac80211 %d) already stopped\n",
1979			queue, mq);
1980		return;
1981	}
1982
1983	set_bit(mq, &priv->transport_queue_stop);
1984	ieee80211_stop_queue(priv->hw, mq);
1985}
1986
1987static void iwl_wake_sw_queue(struct iwl_op_mode *op_mode, int queue)
1988{
1989	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1990	int mq = priv->queue_to_mac80211[queue];
1991
1992	if (WARN_ON_ONCE(mq == IWL_INVALID_MAC80211_QUEUE))
1993		return;
1994
1995	if (atomic_dec_return(&priv->queue_stop_count[mq]) > 0) {
1996		IWL_DEBUG_TX_QUEUES(priv,
1997			"queue %d (mac80211 %d) already awake\n",
1998			queue, mq);
1999		return;
2000	}
2001
2002	clear_bit(mq, &priv->transport_queue_stop);
2003
2004	if (!priv->passive_no_rx)
2005		ieee80211_wake_queue(priv->hw, mq);
2006}
2007
2008void iwlagn_lift_passive_no_rx(struct iwl_priv *priv)
2009{
2010	int mq;
2011
2012	if (!priv->passive_no_rx)
2013		return;
2014
2015	for (mq = 0; mq < IWLAGN_FIRST_AMPDU_QUEUE; mq++) {
2016		if (!test_bit(mq, &priv->transport_queue_stop)) {
2017			IWL_DEBUG_TX_QUEUES(priv, "Wake queue %d\n", mq);
2018			ieee80211_wake_queue(priv->hw, mq);
2019		} else {
2020			IWL_DEBUG_TX_QUEUES(priv, "Don't wake queue %d\n", mq);
2021		}
2022	}
2023
2024	priv->passive_no_rx = false;
2025}
2026
2027static void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb)
2028{
2029	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2030	struct ieee80211_tx_info *info;
2031
2032	info = IEEE80211_SKB_CB(skb);
2033	iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]);
2034	ieee80211_free_txskb(priv->hw, skb);
2035}
2036
2037static bool iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)
2038{
2039	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2040
2041	if (state)
2042		set_bit(STATUS_RF_KILL_HW, &priv->status);
2043	else
2044		clear_bit(STATUS_RF_KILL_HW, &priv->status);
2045
2046	wiphy_rfkill_set_hw_state(priv->hw->wiphy, state);
2047
2048	return false;
2049}
2050
2051static void iwl_napi_add(struct iwl_op_mode *op_mode,
2052			 struct napi_struct *napi,
2053			 struct net_device *napi_dev,
2054			 int (*poll)(struct napi_struct *, int),
2055			 int weight)
2056{
2057	struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2058
2059	ieee80211_napi_add(priv->hw, napi, napi_dev, poll, weight);
2060}
2061
2062static const struct iwl_op_mode_ops iwl_dvm_ops = {
2063	.start = iwl_op_mode_dvm_start,
2064	.stop = iwl_op_mode_dvm_stop,
2065	.rx = iwl_rx_dispatch,
2066	.queue_full = iwl_stop_sw_queue,
2067	.queue_not_full = iwl_wake_sw_queue,
2068	.hw_rf_kill = iwl_set_hw_rfkill_state,
2069	.free_skb = iwl_free_skb,
2070	.nic_error = iwl_nic_error,
2071	.cmd_queue_full = iwl_cmd_queue_full,
2072	.nic_config = iwl_nic_config,
2073	.wimax_active = iwl_wimax_active,
2074	.napi_add = iwl_napi_add,
2075};
2076
2077/*****************************************************************************
2078 *
2079 * driver and module entry point
2080 *
2081 *****************************************************************************/
2082static int __init iwl_init(void)
2083{
2084
2085	int ret;
2086
2087	ret = iwlagn_rate_control_register();
2088	if (ret) {
2089		pr_err("Unable to register rate control algorithm: %d\n", ret);
2090		return ret;
2091	}
2092
2093	ret = iwl_opmode_register("iwldvm", &iwl_dvm_ops);
2094	if (ret) {
2095		pr_err("Unable to register op_mode: %d\n", ret);
2096		iwlagn_rate_control_unregister();
2097	}
2098
2099	return ret;
2100}
2101module_init(iwl_init);
2102
2103static void __exit iwl_exit(void)
2104{
2105	iwl_opmode_deregister("iwldvm");
2106	iwlagn_rate_control_unregister();
2107}
2108module_exit(iwl_exit);
2109