Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
main.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Copyright(c) 2003 - 2012 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 <[email protected]>
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 
84 MODULE_LICENSE("GPL");
85 
86 static const struct iwl_op_mode_ops iwl_dvm_ops;
87 
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 */
100 static 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 
127 {
128  struct iwl_tx_beacon_cmd *tx_beacon_cmd;
129  struct iwl_host_cmd cmd = {
130  .id = REPLY_TX_BEACON,
131  .flags = CMD_SYNC,
132  };
133  struct ieee80211_tx_info *info;
134  u32 frame_size;
135  u32 rate_flags;
136  u32 rate;
137 
138  /*
139  * We have to set up the TX command, the TX Beacon command, and the
140  * beacon contents.
141  */
142 
143  lockdep_assert_held(&priv->mutex);
144 
145  if (!priv->beacon_ctx) {
146  IWL_ERR(priv, "trying to build beacon w/o beacon context!\n");
147  return 0;
148  }
149 
150  if (WARN_ON(!priv->beacon_skb))
151  return -EINVAL;
152 
153  /* Allocate beacon command */
154  if (!priv->beacon_cmd)
155  priv->beacon_cmd = kzalloc(sizeof(*tx_beacon_cmd), GFP_KERNEL);
156  tx_beacon_cmd = priv->beacon_cmd;
157  if (!tx_beacon_cmd)
158  return -ENOMEM;
159 
160  frame_size = priv->beacon_skb->len;
161 
162  /* Set up TX command fields */
163  tx_beacon_cmd->tx.len = cpu_to_le16((u16)frame_size);
164  tx_beacon_cmd->tx.sta_id = priv->beacon_ctx->bcast_sta_id;
165  tx_beacon_cmd->tx.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
166  tx_beacon_cmd->tx.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK |
168 
169  /* Set up TX beacon command fields */
170  iwl_set_beacon_tim(priv, tx_beacon_cmd, priv->beacon_skb->data,
171  frame_size);
172 
173  /* Set up packet rate and flags */
174  info = IEEE80211_SKB_CB(priv->beacon_skb);
175 
176  /*
177  * Let's set up the rate at least somewhat correctly;
178  * it will currently not actually be used by the uCode,
179  * it uses the broadcast station's rate instead.
180  */
181  if (info->control.rates[0].idx < 0 ||
182  info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
183  rate = 0;
184  else
185  rate = info->control.rates[0].idx;
186 
187  priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
188  priv->eeprom_data->valid_tx_ant);
189  rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
190 
191  /* In mac80211, rates for 5 GHz start at 0 */
192  if (info->band == IEEE80211_BAND_5GHZ)
193  rate += IWL_FIRST_OFDM_RATE;
194  else if (rate >= IWL_FIRST_CCK_RATE && rate <= IWL_LAST_CCK_RATE)
195  rate_flags |= RATE_MCS_CCK_MSK;
196 
197  tx_beacon_cmd->tx.rate_n_flags =
198  iwl_hw_set_rate_n_flags(rate, rate_flags);
199 
200  /* Submit command */
201  cmd.len[0] = sizeof(*tx_beacon_cmd);
202  cmd.data[0] = tx_beacon_cmd;
204  cmd.len[1] = frame_size;
205  cmd.data[1] = priv->beacon_skb->data;
207 
208  return iwl_dvm_send_cmd(priv, &cmd);
209 }
210 
211 static void iwl_bg_beacon_update(struct work_struct *work)
212 {
213  struct iwl_priv *priv =
214  container_of(work, struct iwl_priv, beacon_update);
215  struct sk_buff *beacon;
216 
217  mutex_lock(&priv->mutex);
218  if (!priv->beacon_ctx) {
219  IWL_ERR(priv, "updating beacon w/o beacon context!\n");
220  goto out;
221  }
222 
223  if (priv->beacon_ctx->vif->type != NL80211_IFTYPE_AP) {
224  /*
225  * The ucode will send beacon notifications even in
226  * IBSS mode, but we don't want to process them. But
227  * we need to defer the type check to here due to
228  * requiring locking around the beacon_ctx access.
229  */
230  goto out;
231  }
232 
233  /* Pull updated AP beacon from mac80211. will fail if not in AP mode */
234  beacon = ieee80211_beacon_get(priv->hw, priv->beacon_ctx->vif);
235  if (!beacon) {
236  IWL_ERR(priv, "update beacon failed -- keeping old\n");
237  goto out;
238  }
239 
240  /* new beacon skb is allocated every time; dispose previous.*/
241  dev_kfree_skb(priv->beacon_skb);
242 
243  priv->beacon_skb = beacon;
244 
246  out:
247  mutex_unlock(&priv->mutex);
248 }
249 
250 static void iwl_bg_bt_runtime_config(struct work_struct *work)
251 {
252  struct iwl_priv *priv =
253  container_of(work, struct iwl_priv, bt_runtime_config);
254 
255  if (test_bit(STATUS_EXIT_PENDING, &priv->status))
256  return;
257 
258  /* dont send host command if rf-kill is on */
259  if (!iwl_is_ready_rf(priv))
260  return;
262 }
263 
264 static void iwl_bg_bt_full_concurrency(struct work_struct *work)
265 {
266  struct iwl_priv *priv =
268  struct iwl_rxon_context *ctx;
269 
270  mutex_lock(&priv->mutex);
271 
272  if (test_bit(STATUS_EXIT_PENDING, &priv->status))
273  goto out;
274 
275  /* dont send host command if rf-kill is on */
276  if (!iwl_is_ready_rf(priv))
277  goto out;
278 
279  IWL_DEBUG_INFO(priv, "BT coex in %s mode\n",
280  priv->bt_full_concurrent ?
281  "full concurrency" : "3-wire");
282 
283  /*
284  * LQ & RXON updated cmds must be sent before BT Config cmd
285  * to avoid 3-wire collisions
286  */
287  for_each_context(priv, ctx) {
288  iwlagn_set_rxon_chain(priv, ctx);
289  iwlagn_commit_rxon(priv, ctx);
290  }
291 
293 out:
294  mutex_unlock(&priv->mutex);
295 }
296 
298 {
299  struct iwl_statistics_cmd statistics_cmd = {
301  clear ? IWL_STATS_CONF_CLEAR_STATS : 0,
302  };
303 
304  if (flags & CMD_ASYNC)
306  CMD_ASYNC,
307  sizeof(struct iwl_statistics_cmd),
308  &statistics_cmd);
309  else
311  CMD_SYNC,
312  sizeof(struct iwl_statistics_cmd),
313  &statistics_cmd);
314 }
315 
326 static void iwl_bg_statistics_periodic(unsigned long data)
327 {
328  struct iwl_priv *priv = (struct iwl_priv *)data;
329 
330  if (test_bit(STATUS_EXIT_PENDING, &priv->status))
331  return;
332 
333  /* dont send host command if rf-kill is on */
334  if (!iwl_is_ready_rf(priv))
335  return;
336 
338 }
339 
340 
341 static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
342  u32 start_idx, u32 num_events,
343  u32 capacity, u32 mode)
344 {
345  u32 i;
346  u32 ptr; /* SRAM byte address of log data */
347  u32 ev, time, data; /* event log data */
348  unsigned long reg_flags;
349 
350  if (mode == 0)
351  ptr = base + (4 * sizeof(u32)) + (start_idx * 2 * sizeof(u32));
352  else
353  ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32));
354 
355  /* Make sure device is powered up for SRAM reads */
356  spin_lock_irqsave(&priv->trans->reg_lock, reg_flags);
357  if (unlikely(!iwl_grab_nic_access(priv->trans))) {
358  spin_unlock_irqrestore(&priv->trans->reg_lock, reg_flags);
359  return;
360  }
361 
362  /* Set starting address; reads will auto-increment */
363  iwl_write32(priv->trans, HBUS_TARG_MEM_RADDR, ptr);
364 
365  /*
366  * Refuse to read more than would have fit into the log from
367  * the current start_idx. This used to happen due to the race
368  * described below, but now WARN because the code below should
369  * prevent it from happening here.
370  */
371  if (WARN_ON(num_events > capacity - start_idx))
372  num_events = capacity - start_idx;
373 
374  /*
375  * "time" is actually "data" for mode 0 (no timestamp).
376  * place event id # at far right for easier visual parsing.
377  */
378  for (i = 0; i < num_events; i++) {
379  ev = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
380  time = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
381  if (mode == 0) {
382  trace_iwlwifi_dev_ucode_cont_event(
383  priv->trans->dev, 0, time, ev);
384  } else {
385  data = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
386  trace_iwlwifi_dev_ucode_cont_event(
387  priv->trans->dev, time, data, ev);
388  }
389  }
390  /* Allow device to power down */
392  spin_unlock_irqrestore(&priv->trans->reg_lock, reg_flags);
393 }
394 
395 static void iwl_continuous_event_trace(struct iwl_priv *priv)
396 {
397  u32 capacity; /* event log capacity in # entries */
398  struct {
399  u32 capacity;
400  u32 mode;
401  u32 wrap_counter;
403  } __packed read;
404  u32 base; /* SRAM byte address of event log header */
405  u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */
406  u32 num_wraps; /* # times uCode wrapped to top of log */
407  u32 next_entry; /* index of next entry to be written by uCode */
408 
409  base = priv->device_pointers.log_event_table;
410  if (iwlagn_hw_valid_rtc_data_addr(base)) {
411  iwl_read_targ_mem_bytes(priv->trans, base, &read, sizeof(read));
412  capacity = read.capacity;
413  mode = read.mode;
414  num_wraps = read.wrap_counter;
415  next_entry = read.write_counter;
416  } else
417  return;
418 
419  /*
420  * Unfortunately, the uCode doesn't use temporary variables.
421  * Therefore, it can happen that we read next_entry == capacity,
422  * which really means next_entry == 0.
423  */
424  if (unlikely(next_entry == capacity))
425  next_entry = 0;
426  /*
427  * Additionally, the uCode increases the write pointer before
428  * the wraps counter, so if the write pointer is smaller than
429  * the old write pointer (wrap occurred) but we read that no
430  * wrap occurred, we actually read between the next_entry and
431  * num_wraps update (this does happen in practice!!) -- take
432  * that into account by increasing num_wraps.
433  */
434  if (unlikely(next_entry < priv->event_log.next_entry &&
435  num_wraps == priv->event_log.num_wraps))
436  num_wraps++;
437 
438  if (num_wraps == priv->event_log.num_wraps) {
439  iwl_print_cont_event_trace(
440  priv, base, priv->event_log.next_entry,
441  next_entry - priv->event_log.next_entry,
442  capacity, mode);
443 
444  priv->event_log.non_wraps_count++;
445  } else {
446  if (num_wraps - priv->event_log.num_wraps > 1)
447  priv->event_log.wraps_more_count++;
448  else
449  priv->event_log.wraps_once_count++;
450 
451  trace_iwlwifi_dev_ucode_wrap_event(priv->trans->dev,
452  num_wraps - priv->event_log.num_wraps,
453  next_entry, priv->event_log.next_entry);
454 
455  if (next_entry < priv->event_log.next_entry) {
456  iwl_print_cont_event_trace(
457  priv, base, priv->event_log.next_entry,
458  capacity - priv->event_log.next_entry,
459  capacity, mode);
460 
461  iwl_print_cont_event_trace(
462  priv, base, 0, next_entry, capacity, mode);
463  } else {
464  iwl_print_cont_event_trace(
465  priv, base, next_entry,
466  capacity - next_entry,
467  capacity, mode);
468 
469  iwl_print_cont_event_trace(
470  priv, base, 0, next_entry, capacity, mode);
471  }
472  }
473 
474  priv->event_log.num_wraps = num_wraps;
475  priv->event_log.next_entry = next_entry;
476 }
477 
486 static void iwl_bg_ucode_trace(unsigned long data)
487 {
488  struct iwl_priv *priv = (struct iwl_priv *)data;
489 
490  if (test_bit(STATUS_EXIT_PENDING, &priv->status))
491  return;
492 
493  if (priv->event_log.ucode_trace) {
494  iwl_continuous_event_trace(priv);
495  /* Reschedule the timer to occur in UCODE_TRACE_PERIOD */
496  mod_timer(&priv->ucode_trace,
498  }
499 }
500 
501 static void iwl_bg_tx_flush(struct work_struct *work)
502 {
503  struct iwl_priv *priv =
504  container_of(work, struct iwl_priv, tx_flush);
505 
506  if (test_bit(STATUS_EXIT_PENDING, &priv->status))
507  return;
508 
509  /* do nothing if rf-kill is on */
510  if (!iwl_is_ready_rf(priv))
511  return;
512 
513  IWL_DEBUG_INFO(priv, "device request: flush all tx frames\n");
515 }
516 
517 /*
518  * queue/FIFO/AC mapping definitions
519  */
520 
521 static const u8 iwlagn_bss_ac_to_fifo[] = {
526 };
527 
528 static const u8 iwlagn_bss_ac_to_queue[] = {
529  0, 1, 2, 3,
530 };
531 
532 static const u8 iwlagn_pan_ac_to_fifo[] = {
537 };
538 
539 static const u8 iwlagn_pan_ac_to_queue[] = {
540  7, 6, 5, 4,
541 };
542 
543 static void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
544 {
545  int i;
546 
547  /*
548  * The default context is always valid,
549  * the PAN context depends on uCode.
550  */
552  if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN)
554 
555  for (i = 0; i < NUM_IWL_RXON_CTX; i++)
556  priv->contexts[i].ctxid = i;
557 
558  priv->contexts[IWL_RXON_CTX_BSS].always_active = true;
559  priv->contexts[IWL_RXON_CTX_BSS].is_active = true;
560  priv->contexts[IWL_RXON_CTX_BSS].rxon_cmd = REPLY_RXON;
561  priv->contexts[IWL_RXON_CTX_BSS].rxon_timing_cmd = REPLY_RXON_TIMING;
562  priv->contexts[IWL_RXON_CTX_BSS].rxon_assoc_cmd = REPLY_RXON_ASSOC;
563  priv->contexts[IWL_RXON_CTX_BSS].qos_cmd = REPLY_QOS_PARAM;
564  priv->contexts[IWL_RXON_CTX_BSS].ap_sta_id = IWL_AP_ID;
565  priv->contexts[IWL_RXON_CTX_BSS].wep_key_cmd = REPLY_WEPKEY;
566  priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWLAGN_BROADCAST_ID;
567  priv->contexts[IWL_RXON_CTX_BSS].exclusive_interface_modes =
569  priv->contexts[IWL_RXON_CTX_BSS].interface_modes =
571  priv->contexts[IWL_RXON_CTX_BSS].ap_devtype = RXON_DEV_TYPE_AP;
572  priv->contexts[IWL_RXON_CTX_BSS].ibss_devtype = RXON_DEV_TYPE_IBSS;
573  priv->contexts[IWL_RXON_CTX_BSS].station_devtype = RXON_DEV_TYPE_ESS;
574  priv->contexts[IWL_RXON_CTX_BSS].unused_devtype = RXON_DEV_TYPE_ESS;
575  memcpy(priv->contexts[IWL_RXON_CTX_BSS].ac_to_queue,
576  iwlagn_bss_ac_to_queue, sizeof(iwlagn_bss_ac_to_queue));
577  memcpy(priv->contexts[IWL_RXON_CTX_BSS].ac_to_fifo,
578  iwlagn_bss_ac_to_fifo, sizeof(iwlagn_bss_ac_to_fifo));
579 
580  priv->contexts[IWL_RXON_CTX_PAN].rxon_cmd = REPLY_WIPAN_RXON;
581  priv->contexts[IWL_RXON_CTX_PAN].rxon_timing_cmd =
583  priv->contexts[IWL_RXON_CTX_PAN].rxon_assoc_cmd =
586  priv->contexts[IWL_RXON_CTX_PAN].ap_sta_id = IWL_AP_ID_PAN;
587  priv->contexts[IWL_RXON_CTX_PAN].wep_key_cmd = REPLY_WIPAN_WEPKEY;
588  priv->contexts[IWL_RXON_CTX_PAN].bcast_sta_id = IWLAGN_PAN_BCAST_ID;
589  priv->contexts[IWL_RXON_CTX_PAN].station_flags = STA_FLG_PAN_STATION;
590  priv->contexts[IWL_RXON_CTX_PAN].interface_modes =
592 
593  if (ucode_flags & IWL_UCODE_TLV_FLAGS_P2P)
594  priv->contexts[IWL_RXON_CTX_PAN].interface_modes |=
597 
598  priv->contexts[IWL_RXON_CTX_PAN].ap_devtype = RXON_DEV_TYPE_CP;
599  priv->contexts[IWL_RXON_CTX_PAN].station_devtype = RXON_DEV_TYPE_2STA;
600  priv->contexts[IWL_RXON_CTX_PAN].unused_devtype = RXON_DEV_TYPE_P2P;
601  memcpy(priv->contexts[IWL_RXON_CTX_PAN].ac_to_queue,
602  iwlagn_pan_ac_to_queue, sizeof(iwlagn_pan_ac_to_queue));
603  memcpy(priv->contexts[IWL_RXON_CTX_PAN].ac_to_fifo,
604  iwlagn_pan_ac_to_fifo, sizeof(iwlagn_pan_ac_to_fifo));
605  priv->contexts[IWL_RXON_CTX_PAN].mcast_queue = IWL_IPAN_MCAST_QUEUE;
606 
607  BUILD_BUG_ON(NUM_IWL_RXON_CTX != 2);
608 }
609 
610 static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
611 {
612  struct iwl_ct_kill_config cmd;
613  struct iwl_ct_kill_throttling_config adv_cmd;
614  int ret = 0;
615 
616  iwl_write32(priv->trans, CSR_UCODE_DRV_GP1_CLR,
618 
619  priv->thermal_throttle.ct_kill_toggle = false;
620 
621  if (priv->cfg->base_params->support_ct_kill_exit) {
622  adv_cmd.critical_temperature_enter =
623  cpu_to_le32(priv->hw_params.ct_kill_threshold);
624  adv_cmd.critical_temperature_exit =
625  cpu_to_le32(priv->hw_params.ct_kill_exit_threshold);
626 
627  ret = iwl_dvm_send_cmd_pdu(priv,
629  CMD_SYNC, sizeof(adv_cmd), &adv_cmd);
630  if (ret)
631  IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
632  else
633  IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
634  "succeeded, critical temperature enter is %d,"
635  "exit is %d\n",
636  priv->hw_params.ct_kill_threshold,
637  priv->hw_params.ct_kill_exit_threshold);
638  } else {
639  cmd.critical_temperature_R =
640  cpu_to_le32(priv->hw_params.ct_kill_threshold);
641 
642  ret = iwl_dvm_send_cmd_pdu(priv,
644  CMD_SYNC, sizeof(cmd), &cmd);
645  if (ret)
646  IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
647  else
648  IWL_DEBUG_INFO(priv, "REPLY_CT_KILL_CONFIG_CMD "
649  "succeeded, "
650  "critical temperature is %d\n",
651  priv->hw_params.ct_kill_threshold);
652  }
653 }
654 
655 static int iwlagn_send_calib_cfg_rt(struct iwl_priv *priv, u32 cfg)
656 {
657  struct iwl_calib_cfg_cmd calib_cfg_cmd;
658  struct iwl_host_cmd cmd = {
659  .id = CALIBRATION_CFG_CMD,
660  .len = { sizeof(struct iwl_calib_cfg_cmd), },
661  .data = { &calib_cfg_cmd, },
662  };
663 
664  memset(&calib_cfg_cmd, 0, sizeof(calib_cfg_cmd));
665  calib_cfg_cmd.ucd_calib_cfg.once.is_enable = IWL_CALIB_RT_CFG_ALL;
666  calib_cfg_cmd.ucd_calib_cfg.once.start = cpu_to_le32(cfg);
667 
668  return iwl_dvm_send_cmd(priv, &cmd);
669 }
670 
671 
672 static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
673 {
674  struct iwl_tx_ant_config_cmd tx_ant_cmd = {
675  .valid = cpu_to_le32(valid_tx_ant),
676  };
677 
678  if (IWL_UCODE_API(priv->fw->ucode_ver) > 1) {
679  IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant);
680  return iwl_dvm_send_cmd_pdu(priv,
682  CMD_SYNC,
683  sizeof(struct iwl_tx_ant_config_cmd),
684  &tx_ant_cmd);
685  } else {
686  IWL_DEBUG_HC(priv, "TX_ANT_CONFIGURATION_CMD not supported\n");
687  return -EOPNOTSUPP;
688  }
689 }
690 
691 static void iwl_send_bt_config(struct iwl_priv *priv)
692 {
693  struct iwl_bt_cmd bt_cmd = {
695  .max_kill = BT_MAX_KILL_DEF,
696  .kill_ack_mask = 0,
697  .kill_cts_mask = 0,
698  };
699 
700  if (!iwlwifi_mod_params.bt_coex_active)
701  bt_cmd.flags = BT_COEX_DISABLE;
702  else
703  bt_cmd.flags = BT_COEX_ENABLE;
704 
705  priv->bt_enable_flag = bt_cmd.flags;
706  IWL_DEBUG_INFO(priv, "BT coex %s\n",
707  (bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active");
708 
710  CMD_SYNC, sizeof(struct iwl_bt_cmd), &bt_cmd))
711  IWL_ERR(priv, "failed to send BT Coex Config\n");
712 }
713 
719 int iwl_alive_start(struct iwl_priv *priv)
720 {
721  int ret = 0;
722  struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
723 
724  IWL_DEBUG_INFO(priv, "Runtime Alive received.\n");
725 
726  /* After the ALIVE response, we can send host commands to the uCode */
727  set_bit(STATUS_ALIVE, &priv->status);
728 
729  if (iwl_is_rfkill(priv))
730  return -ERFKILL;
731 
732  if (priv->event_log.ucode_trace) {
733  /* start collecting data now */
734  mod_timer(&priv->ucode_trace, jiffies);
735  }
736 
737  /* download priority table before any calibration request */
738  if (priv->cfg->bt_params &&
739  priv->cfg->bt_params->advanced_bt_coexist) {
740  /* Configure Bluetooth device coexistence support */
741  if (priv->cfg->bt_params->bt_sco_disable)
742  priv->bt_enable_pspoll = false;
743  else
744  priv->bt_enable_pspoll = true;
745 
751  priv->cur_rssi_ctx = NULL;
752 
753  iwl_send_prio_tbl(priv);
754 
755  /* FIXME: w/a to force change uCode BT state machine */
758  if (ret)
759  return ret;
762  if (ret)
763  return ret;
764  } else {
765  /*
766  * default is 2-wire BT coexexistence support
767  */
768  iwl_send_bt_config(priv);
769  }
770 
771  /*
772  * Perform runtime calibrations, including DC calibration.
773  */
774  iwlagn_send_calib_cfg_rt(priv, IWL_CALIB_CFG_DC_IDX);
775 
776  ieee80211_wake_queues(priv->hw);
777 
778  /* Configure Tx antenna selection based on H/W config */
779  iwlagn_send_tx_ant_config(priv, priv->eeprom_data->valid_tx_ant);
780 
781  if (iwl_is_associated_ctx(ctx) && !priv->wowlan) {
782  struct iwl_rxon_cmd *active_rxon =
783  (struct iwl_rxon_cmd *)&ctx->active;
784  /* apply any changes in staging */
785  ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
786  active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
787  } else {
788  struct iwl_rxon_context *tmp;
789  /* Initialize our rx_config data */
790  for_each_context(priv, tmp)
792 
793  iwlagn_set_rxon_chain(priv, ctx);
794  }
795 
796  if (!priv->wowlan) {
797  /* WoWLAN ucode will not reply in the same way, skip it */
799  }
800 
801  set_bit(STATUS_READY, &priv->status);
802 
803  /* Configure the adapter for unassociated operation */
804  ret = iwlagn_commit_rxon(priv, ctx);
805  if (ret)
806  return ret;
807 
808  /* At this point, the NIC is initialized and operational */
809  iwl_rf_kill_ct_config(priv);
810 
811  IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
812 
813  return iwl_power_update_mode(priv, true);
814 }
815 
825 static void iwl_clear_driver_stations(struct iwl_priv *priv)
826 {
827  struct iwl_rxon_context *ctx;
828 
829  spin_lock_bh(&priv->sta_lock);
830  memset(priv->stations, 0, sizeof(priv->stations));
831  priv->num_stations = 0;
832 
833  priv->ucode_key_table = 0;
834 
835  for_each_context(priv, ctx) {
836  /*
837  * Remove all key information that is not stored as part
838  * of station information since mac80211 may not have had
839  * a chance to remove all the keys. When device is
840  * reconfigured by mac80211 after an error all keys will
841  * be reconfigured.
842  */
843  memset(ctx->wep_keys, 0, sizeof(ctx->wep_keys));
844  ctx->key_mapping_keys = 0;
845  }
846 
847  spin_unlock_bh(&priv->sta_lock);
848 }
849 
850 void iwl_down(struct iwl_priv *priv)
851 {
852  int exit_pending;
853 
854  IWL_DEBUG_INFO(priv, DRV_NAME " is going down\n");
855 
856  lockdep_assert_held(&priv->mutex);
857 
858  iwl_scan_cancel_timeout(priv, 200);
859 
860  /*
861  * If active, scanning won't cancel it, so say it expired.
862  * No race since we hold the mutex here and a new one
863  * can't come in at this time.
864  */
865  if (priv->ucode_loaded && priv->cur_ucode != IWL_UCODE_INIT)
867 
868  exit_pending =
870 
873  iwl_clear_driver_stations(priv);
874 
875  /* reset BT coex data */
876  priv->bt_status = 0;
877  priv->cur_rssi_ctx = NULL;
878  priv->bt_is_sco = 0;
879  if (priv->cfg->bt_params)
880  priv->bt_traffic_load =
881  priv->cfg->bt_params->bt_init_traffic_load;
882  else
883  priv->bt_traffic_load = 0;
884  priv->bt_full_concurrent = false;
885  priv->bt_ci_compliance = 0;
886 
887  /* Wipe out the EXIT_PENDING status bit if we are not actually
888  * exiting the module */
889  if (!exit_pending)
891 
892  if (priv->mac80211_registered)
893  ieee80211_stop_queues(priv->hw);
894 
895  priv->ucode_loaded = false;
896  iwl_trans_stop_device(priv->trans);
897 
898  /* Set num_aux_in_flight must be done after the transport is stopped */
899  atomic_set(&priv->num_aux_in_flight, 0);
900 
901  /* Clear out all status bits but a few that are stable across reset */
902  priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) <<
904  test_bit(STATUS_FW_ERROR, &priv->status) <<
908 
909  dev_kfree_skb(priv->beacon_skb);
910  priv->beacon_skb = NULL;
911 }
912 
913 /*****************************************************************************
914  *
915  * Workqueue callbacks
916  *
917  *****************************************************************************/
918 
919 static void iwl_bg_run_time_calib_work(struct work_struct *work)
920 {
921  struct iwl_priv *priv = container_of(work, struct iwl_priv,
923 
924  mutex_lock(&priv->mutex);
925 
926  if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
927  test_bit(STATUS_SCANNING, &priv->status)) {
928  mutex_unlock(&priv->mutex);
929  return;
930  }
931 
932  if (priv->start_calib) {
935  }
936 
937  mutex_unlock(&priv->mutex);
938 }
939 
941 {
942  bool bt_full_concurrent;
944  u8 bt_load;
945  u8 bt_status;
946  bool bt_is_sco;
947  int i;
948 
949  lockdep_assert_held(&priv->mutex);
950 
951  priv->is_open = 0;
952 
953  /*
954  * __iwl_down() will clear the BT status variables,
955  * which is correct, but when we restart we really
956  * want to keep them so restore them afterwards.
957  *
958  * The restart process will later pick them up and
959  * re-configure the hw when we reconfigure the BT
960  * command.
961  */
962  bt_full_concurrent = priv->bt_full_concurrent;
963  bt_ci_compliance = priv->bt_ci_compliance;
964  bt_load = priv->bt_traffic_load;
965  bt_status = priv->bt_status;
966  bt_is_sco = priv->bt_is_sco;
967 
968  iwl_down(priv);
969 
972  priv->bt_traffic_load = bt_load;
973  priv->bt_status = bt_status;
974  priv->bt_is_sco = bt_is_sco;
975 
976  /* reset aggregation queues */
977  for (i = IWLAGN_FIRST_AMPDU_QUEUE; i < IWL_MAX_HW_QUEUES; i++)
979  /* and stop counts */
980  for (i = 0; i < IWL_MAX_HW_QUEUES; i++)
981  atomic_set(&priv->queue_stop_count[i], 0);
982 
983  memset(priv->agg_q_alloc, 0, sizeof(priv->agg_q_alloc));
984 }
985 
986 static void iwl_bg_restart(struct work_struct *data)
987 {
988  struct iwl_priv *priv = container_of(data, struct iwl_priv, restart);
989 
990  if (test_bit(STATUS_EXIT_PENDING, &priv->status))
991  return;
992 
994  mutex_lock(&priv->mutex);
996  mutex_unlock(&priv->mutex);
998  if (priv->mac80211_registered)
999  ieee80211_restart_hw(priv->hw);
1000  else
1001  IWL_ERR(priv,
1002  "Cannot request restart before registrating with mac80211");
1003  } else {
1004  WARN_ON(1);
1005  }
1006 }
1007 
1008 
1009 
1010 
1011 void iwlagn_disable_roc(struct iwl_priv *priv)
1012 {
1013  struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_PAN];
1014 
1015  lockdep_assert_held(&priv->mutex);
1016 
1017  if (!priv->hw_roc_setup)
1018  return;
1019 
1020  ctx->staging.dev_type = RXON_DEV_TYPE_P2P;
1021  ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
1022 
1023  priv->hw_roc_channel = NULL;
1024 
1025  memset(ctx->staging.node_addr, 0, ETH_ALEN);
1026 
1027  iwlagn_commit_rxon(priv, ctx);
1028 
1029  ctx->is_active = false;
1030  priv->hw_roc_setup = false;
1031 }
1032 
1033 static void iwlagn_disable_roc_work(struct work_struct *work)
1034 {
1035  struct iwl_priv *priv = container_of(work, struct iwl_priv,
1036  hw_roc_disable_work.work);
1037 
1038  mutex_lock(&priv->mutex);
1039  iwlagn_disable_roc(priv);
1040  mutex_unlock(&priv->mutex);
1041 }
1042 
1043 /*****************************************************************************
1044  *
1045  * driver setup and teardown
1046  *
1047  *****************************************************************************/
1048 
1049 static void iwl_setup_deferred_work(struct iwl_priv *priv)
1050 {
1052 
1053  INIT_WORK(&priv->restart, iwl_bg_restart);
1054  INIT_WORK(&priv->beacon_update, iwl_bg_beacon_update);
1055  INIT_WORK(&priv->run_time_calib_work, iwl_bg_run_time_calib_work);
1056  INIT_WORK(&priv->tx_flush, iwl_bg_tx_flush);
1057  INIT_WORK(&priv->bt_full_concurrency, iwl_bg_bt_full_concurrency);
1058  INIT_WORK(&priv->bt_runtime_config, iwl_bg_bt_runtime_config);
1060  iwlagn_disable_roc_work);
1061 
1063 
1064  if (priv->cfg->bt_params)
1066 
1068  priv->statistics_periodic.data = (unsigned long)priv;
1069  priv->statistics_periodic.function = iwl_bg_statistics_periodic;
1070 
1071  init_timer(&priv->ucode_trace);
1072  priv->ucode_trace.data = (unsigned long)priv;
1073  priv->ucode_trace.function = iwl_bg_ucode_trace;
1074 }
1075 
1077 {
1078  if (priv->cfg->bt_params)
1080 
1083 
1085 
1089 
1091  del_timer_sync(&priv->ucode_trace);
1092 }
1093 
1094 static int iwl_init_drv(struct iwl_priv *priv)
1095 {
1096  spin_lock_init(&priv->sta_lock);
1097 
1098  mutex_init(&priv->mutex);
1099 
1100  INIT_LIST_HEAD(&priv->calib_results);
1101 
1102  priv->band = IEEE80211_BAND_2GHZ;
1103 
1104  priv->plcp_delta_threshold =
1105  priv->cfg->base_params->plcp_delta_threshold;
1106 
1110  priv->agg_tids_count = 0;
1111 
1113 
1115 
1116  /* Choose which receivers/antennas to use */
1118 
1119  iwl_init_scan_params(priv);
1120 
1121  /* init bt coex */
1122  if (priv->cfg->bt_params &&
1123  priv->cfg->bt_params->advanced_bt_coexist) {
1130  }
1131 
1132  return 0;
1133 }
1134 
1135 static void iwl_uninit_drv(struct iwl_priv *priv)
1136 {
1137  kfree(priv->scan_cmd);
1138  kfree(priv->beacon_cmd);
1140  iwl_calib_free_results(priv);
1141 #ifdef CONFIG_IWLWIFI_DEBUGFS
1142  kfree(priv->wowlan_sram);
1143 #endif
1144 }
1145 
1146 static void iwl_set_hw_params(struct iwl_priv *priv)
1147 {
1148  if (priv->cfg->ht_params)
1149  priv->hw_params.use_rts_for_aggregation =
1150  priv->cfg->ht_params->use_rts_for_aggregation;
1151 
1152  /* Device-specific setup */
1153  priv->lib->set_hw_params(priv);
1154 }
1155 
1156 
1157 
1158 /* show what optional capabilities we have */
1159 static void iwl_option_config(struct iwl_priv *priv)
1160 {
1161 #ifdef CONFIG_IWLWIFI_DEBUG
1162  IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUG enabled\n");
1163 #else
1164  IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUG disabled\n");
1165 #endif
1166 
1167 #ifdef CONFIG_IWLWIFI_DEBUGFS
1168  IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUGFS enabled\n");
1169 #else
1170  IWL_INFO(priv, "CONFIG_IWLWIFI_DEBUGFS disabled\n");
1171 #endif
1172 
1173 #ifdef CONFIG_IWLWIFI_DEVICE_TRACING
1174  IWL_INFO(priv, "CONFIG_IWLWIFI_DEVICE_TRACING enabled\n");
1175 #else
1176  IWL_INFO(priv, "CONFIG_IWLWIFI_DEVICE_TRACING disabled\n");
1177 #endif
1178 
1179 #ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
1180  IWL_INFO(priv, "CONFIG_IWLWIFI_DEVICE_TESTMODE enabled\n");
1181 #else
1182  IWL_INFO(priv, "CONFIG_IWLWIFI_DEVICE_TESTMODE disabled\n");
1183 #endif
1184 
1185 #ifdef CONFIG_IWLWIFI_P2P
1186  IWL_INFO(priv, "CONFIG_IWLWIFI_P2P enabled\n");
1187 #else
1188  IWL_INFO(priv, "CONFIG_IWLWIFI_P2P disabled\n");
1189 #endif
1190 }
1191 
1192 static int iwl_eeprom_init_hw_params(struct iwl_priv *priv)
1193 {
1194  u16 radio_cfg;
1195 
1196  priv->eeprom_data->sku = priv->eeprom_data->sku;
1197 
1198  if (priv->eeprom_data->sku & EEPROM_SKU_CAP_11N_ENABLE &&
1199  !priv->cfg->ht_params) {
1200  IWL_ERR(priv, "Invalid 11n configuration\n");
1201  return -EINVAL;
1202  }
1203 
1204  if (!priv->eeprom_data->sku) {
1205  IWL_ERR(priv, "Invalid device sku\n");
1206  return -EINVAL;
1207  }
1208 
1209  IWL_INFO(priv, "Device SKU: 0x%X\n", priv->eeprom_data->sku);
1210 
1211  radio_cfg = priv->eeprom_data->radio_cfg;
1212 
1213  priv->hw_params.tx_chains_num =
1214  num_of_ant(priv->eeprom_data->valid_tx_ant);
1215  if (priv->cfg->rx_with_siso_diversity)
1216  priv->hw_params.rx_chains_num = 1;
1217  else
1218  priv->hw_params.rx_chains_num =
1219  num_of_ant(priv->eeprom_data->valid_rx_ant);
1220 
1221  IWL_INFO(priv, "Valid Tx ant: 0x%X, Valid Rx ant: 0x%X\n",
1222  priv->eeprom_data->valid_tx_ant,
1223  priv->eeprom_data->valid_rx_ant);
1224 
1225  return 0;
1226 }
1227 
1228 static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1229  const struct iwl_cfg *cfg,
1230  const struct iwl_fw *fw,
1231  struct dentry *dbgfs_dir)
1232 {
1233  struct iwl_priv *priv;
1234  struct ieee80211_hw *hw;
1235  struct iwl_op_mode *op_mode;
1236  u16 num_mac;
1237  u32 ucode_flags;
1238  struct iwl_trans_config trans_cfg;
1239  static const u8 no_reclaim_cmds[] = {
1244  REPLY_TX,
1245  };
1246  int i;
1247 
1248  /************************
1249  * 1. Allocating HW data
1250  ************************/
1251  hw = iwl_alloc_all();
1252  if (!hw) {
1253  pr_err("%s: Cannot allocate network device\n", cfg->name);
1254  goto out;
1255  }
1256 
1257  op_mode = hw->priv;
1258  op_mode->ops = &iwl_dvm_ops;
1259  priv = IWL_OP_MODE_GET_DVM(op_mode);
1260  priv->trans = trans;
1261  priv->dev = trans->dev;
1262  priv->cfg = cfg;
1263  priv->fw = fw;
1264 
1265  switch (priv->cfg->device_family) {
1267  case IWL_DEVICE_FAMILY_100:
1268  priv->lib = &iwl1000_lib;
1269  break;
1271  case IWL_DEVICE_FAMILY_105:
1272  priv->lib = &iwl2000_lib;
1273  break;
1275  case IWL_DEVICE_FAMILY_135:
1276  priv->lib = &iwl2030_lib;
1277  break;
1279  priv->lib = &iwl5000_lib;
1280  break;
1282  priv->lib = &iwl5150_lib;
1283  break;
1289  priv->lib = &iwl6000_lib;
1290  break;
1292  priv->lib = &iwl6030_lib;
1293  break;
1294  default:
1295  break;
1296  }
1297 
1298  if (WARN_ON(!priv->lib))
1299  goto out_free_hw;
1300 
1301  /*
1302  * Populate the state variables that the transport layer needs
1303  * to know about.
1304  */
1305  trans_cfg.op_mode = op_mode;
1306  trans_cfg.no_reclaim_cmds = no_reclaim_cmds;
1307  trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds);
1308  trans_cfg.rx_buf_size_8k = iwlwifi_mod_params.amsdu_size_8K;
1309  if (!iwlwifi_mod_params.wd_disable)
1310  trans_cfg.queue_watchdog_timeout =
1311  priv->cfg->base_params->wd_timeout;
1312  else
1313  trans_cfg.queue_watchdog_timeout = IWL_WATCHDOG_DISABLED;
1314  trans_cfg.command_names = iwl_dvm_cmd_strings;
1315  trans_cfg.cmd_fifo = IWLAGN_CMD_FIFO_NUM;
1316 
1317  WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE <
1318  priv->cfg->base_params->num_of_queues);
1319 
1320  ucode_flags = fw->ucode_capa.flags;
1321 
1322 #ifndef CONFIG_IWLWIFI_P2P
1323  ucode_flags &= ~IWL_UCODE_TLV_FLAGS_P2P;
1324 #endif
1325 
1326  if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN) {
1328  trans_cfg.cmd_queue = IWL_IPAN_CMD_QUEUE_NUM;
1329  } else {
1331  trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
1332  }
1333 
1334  /* Configure transport layer */
1335  iwl_trans_configure(priv->trans, &trans_cfg);
1336 
1337  /* At this point both hw and priv are allocated. */
1338 
1339  SET_IEEE80211_DEV(priv->hw, priv->trans->dev);
1340 
1341  iwl_option_config(priv);
1342 
1343  IWL_DEBUG_INFO(priv, "*** LOAD DRIVER ***\n");
1344 
1345  /* is antenna coupling more than 35dB ? */
1346  priv->bt_ant_couple_ok =
1347  (iwlwifi_mod_params.ant_coupling >
1349  true : false;
1350 
1351  /* enable/disable bt channel inhibition */
1352  priv->bt_ch_announce = iwlwifi_mod_params.bt_ch_announce;
1353  IWL_DEBUG_INFO(priv, "BT channel inhibition is %s\n",
1354  (priv->bt_ch_announce) ? "On" : "Off");
1355 
1356  /* these spin locks will be used in apm_ops.init and EEPROM access
1357  * we should init now
1358  */
1359  spin_lock_init(&priv->statistics.lock);
1360 
1361  /***********************
1362  * 2. Read REV register
1363  ***********************/
1364  IWL_INFO(priv, "Detected %s, REV=0x%X\n",
1365  priv->cfg->name, priv->trans->hw_rev);
1366 
1367  if (iwl_trans_start_hw(priv->trans))
1368  goto out_free_hw;
1369 
1370  /* Read the EEPROM */
1371  if (iwl_read_eeprom(priv->trans, &priv->eeprom_blob,
1372  &priv->eeprom_blob_size)) {
1373  IWL_ERR(priv, "Unable to init EEPROM\n");
1374  goto out_free_hw;
1375  }
1376 
1377  /* Reset chip to save power until we load uCode during "up". */
1378  iwl_trans_stop_hw(priv->trans, false);
1379 
1380  priv->eeprom_data = iwl_parse_eeprom_data(priv->trans->dev, priv->cfg,
1381  priv->eeprom_blob,
1382  priv->eeprom_blob_size);
1383  if (!priv->eeprom_data)
1384  goto out_free_eeprom_blob;
1385 
1386  if (iwl_eeprom_check_version(priv->eeprom_data, priv->trans))
1387  goto out_free_eeprom;
1388 
1389  if (iwl_eeprom_init_hw_params(priv))
1390  goto out_free_eeprom;
1391 
1392  /* extract MAC Address */
1393  memcpy(priv->addresses[0].addr, priv->eeprom_data->hw_addr, ETH_ALEN);
1394  IWL_DEBUG_INFO(priv, "MAC address: %pM\n", priv->addresses[0].addr);
1395  priv->hw->wiphy->addresses = priv->addresses;
1396  priv->hw->wiphy->n_addresses = 1;
1397  num_mac = priv->eeprom_data->n_hw_addrs;
1398  if (num_mac > 1) {
1399  memcpy(priv->addresses[1].addr, priv->addresses[0].addr,
1400  ETH_ALEN);
1401  priv->addresses[1].addr[5]++;
1402  priv->hw->wiphy->n_addresses++;
1403  }
1404 
1405  /************************
1406  * 4. Setup HW constants
1407  ************************/
1408  iwl_set_hw_params(priv);
1409 
1410  if (!(priv->eeprom_data->sku & EEPROM_SKU_CAP_IPAN_ENABLE)) {
1411  IWL_DEBUG_INFO(priv, "Your EEPROM disabled PAN");
1412  ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
1413  /*
1414  * if not PAN, then don't support P2P -- might be a uCode
1415  * packaging bug or due to the eeprom check above
1416  */
1417  ucode_flags &= ~IWL_UCODE_TLV_FLAGS_P2P;
1419  trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
1420 
1421  /* Configure transport layer again*/
1422  iwl_trans_configure(priv->trans, &trans_cfg);
1423  }
1424 
1425  /*******************
1426  * 5. Setup priv
1427  *******************/
1428  for (i = 0; i < IWL_MAX_HW_QUEUES; i++) {
1430  if (i < IWLAGN_FIRST_AMPDU_QUEUE &&
1433  priv->queue_to_mac80211[i] = i;
1434  atomic_set(&priv->queue_stop_count[i], 0);
1435  }
1436 
1437  if (iwl_init_drv(priv))
1438  goto out_free_eeprom;
1439 
1440  /* At this point both hw and priv are initialized. */
1441 
1442  /********************
1443  * 6. Setup services
1444  ********************/
1445  iwl_setup_deferred_work(priv);
1446  iwl_setup_rx_handlers(priv);
1447  iwl_testmode_init(priv);
1448 
1449  iwl_power_initialize(priv);
1450  iwl_tt_initialize(priv);
1451 
1452  snprintf(priv->hw->wiphy->fw_version,
1453  sizeof(priv->hw->wiphy->fw_version),
1454  "%s", fw->fw_version);
1455 
1457  !!(ucode_flags & IWL_UCODE_TLV_FLAGS_NEWSCAN);
1458 
1460  fw->ucode_capa.standard_phy_calibration_size;
1462  fw->ucode_capa.standard_phy_calibration_size + 1;
1463 
1464  /* initialize all valid contexts */
1465  iwl_init_context(priv, ucode_flags);
1466 
1467  /**************************************************
1468  * This is still part of probe() in a sense...
1469  *
1470  * 7. Setup and register with mac80211 and debugfs
1471  **************************************************/
1472  if (iwlagn_mac_setup_register(priv, &fw->ucode_capa))
1473  goto out_destroy_workqueue;
1474 
1475  if (iwl_dbgfs_register(priv, dbgfs_dir))
1476  goto out_mac80211_unregister;
1477 
1478  return op_mode;
1479 
1480 out_mac80211_unregister:
1481  iwlagn_mac_unregister(priv);
1482 out_destroy_workqueue:
1483  iwl_tt_exit(priv);
1484  iwl_testmode_free(priv);
1487  priv->workqueue = NULL;
1488  iwl_uninit_drv(priv);
1489 out_free_eeprom_blob:
1490  kfree(priv->eeprom_blob);
1491 out_free_eeprom:
1492  iwl_free_eeprom_data(priv->eeprom_data);
1493 out_free_hw:
1494  ieee80211_free_hw(priv->hw);
1495 out:
1496  op_mode = NULL;
1497  return op_mode;
1498 }
1499 
1500 static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
1501 {
1502  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1503 
1504  IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n");
1505 
1506  iwl_testmode_free(priv);
1507  iwlagn_mac_unregister(priv);
1508 
1509  iwl_tt_exit(priv);
1510 
1511  /*This will stop the queues, move the device to low power state */
1512  priv->ucode_loaded = false;
1513  iwl_trans_stop_device(priv->trans);
1514 
1515  kfree(priv->eeprom_blob);
1516  iwl_free_eeprom_data(priv->eeprom_data);
1517 
1518  /*netif_stop_queue(dev); */
1519  flush_workqueue(priv->workqueue);
1520 
1521  /* ieee80211_unregister_hw calls iwlagn_mac_stop, which flushes
1522  * priv->workqueue... so we can't take down the workqueue
1523  * until now... */
1525  priv->workqueue = NULL;
1526 
1527  iwl_uninit_drv(priv);
1528 
1529  dev_kfree_skb(priv->beacon_skb);
1530 
1531  iwl_trans_stop_hw(priv->trans, true);
1532  ieee80211_free_hw(priv->hw);
1533 }
1534 
1535 static const char * const desc_lookup_text[] = {
1536  "OK",
1537  "FAIL",
1538  "BAD_PARAM",
1539  "BAD_CHECKSUM",
1540  "NMI_INTERRUPT_WDG",
1541  "SYSASSERT",
1542  "FATAL_ERROR",
1543  "BAD_COMMAND",
1544  "HW_ERROR_TUNE_LOCK",
1545  "HW_ERROR_TEMPERATURE",
1546  "ILLEGAL_CHAN_FREQ",
1547  "VCC_NOT_STABLE",
1548  "FH_ERROR",
1549  "NMI_INTERRUPT_HOST",
1550  "NMI_INTERRUPT_ACTION_PT",
1551  "NMI_INTERRUPT_UNKNOWN",
1552  "UCODE_VERSION_MISMATCH",
1553  "HW_ERROR_ABS_LOCK",
1554  "HW_ERROR_CAL_LOCK_FAIL",
1555  "NMI_INTERRUPT_INST_ACTION_PT",
1556  "NMI_INTERRUPT_DATA_ACTION_PT",
1557  "NMI_TRM_HW_ER",
1558  "NMI_INTERRUPT_TRM",
1559  "NMI_INTERRUPT_BREAK_POINT",
1560  "DEBUG_0",
1561  "DEBUG_1",
1562  "DEBUG_2",
1563  "DEBUG_3",
1564 };
1565 
1566 static struct { char *name; u8 num; } advanced_lookup[] = {
1567  { "NMI_INTERRUPT_WDG", 0x34 },
1568  { "SYSASSERT", 0x35 },
1569  { "UCODE_VERSION_MISMATCH", 0x37 },
1570  { "BAD_COMMAND", 0x38 },
1571  { "NMI_INTERRUPT_DATA_ACTION_PT", 0x3C },
1572  { "FATAL_ERROR", 0x3D },
1573  { "NMI_TRM_HW_ERR", 0x46 },
1574  { "NMI_INTERRUPT_TRM", 0x4C },
1575  { "NMI_INTERRUPT_BREAK_POINT", 0x54 },
1576  { "NMI_INTERRUPT_WDG_RXF_FULL", 0x5C },
1577  { "NMI_INTERRUPT_WDG_NO_RBD_RXF_FULL", 0x64 },
1578  { "NMI_INTERRUPT_HOST", 0x66 },
1579  { "NMI_INTERRUPT_ACTION_PT", 0x7C },
1580  { "NMI_INTERRUPT_UNKNOWN", 0x84 },
1581  { "NMI_INTERRUPT_INST_ACTION_PT", 0x86 },
1582  { "ADVANCED_SYSASSERT", 0 },
1583 };
1584 
1585 static const char *desc_lookup(u32 num)
1586 {
1587  int i;
1588  int max = ARRAY_SIZE(desc_lookup_text);
1589 
1590  if (num < max)
1591  return desc_lookup_text[num];
1592 
1593  max = ARRAY_SIZE(advanced_lookup) - 1;
1594  for (i = 0; i < max; i++) {
1595  if (advanced_lookup[i].num == num)
1596  break;
1597  }
1598  return advanced_lookup[i].name;
1599 }
1600 
1601 #define ERROR_START_OFFSET (1 * sizeof(u32))
1602 #define ERROR_ELEM_SIZE (7 * sizeof(u32))
1603 
1604 static void iwl_dump_nic_error_log(struct iwl_priv *priv)
1605 {
1606  struct iwl_trans *trans = priv->trans;
1607  u32 base;
1608  struct iwl_error_event_table table;
1609 
1610  base = priv->device_pointers.error_event_table;
1611  if (priv->cur_ucode == IWL_UCODE_INIT) {
1612  if (!base)
1613  base = priv->fw->init_errlog_ptr;
1614  } else {
1615  if (!base)
1616  base = priv->fw->inst_errlog_ptr;
1617  }
1618 
1619  if (!iwlagn_hw_valid_rtc_data_addr(base)) {
1620  IWL_ERR(priv,
1621  "Not valid error log pointer 0x%08X for %s uCode\n",
1622  base,
1623  (priv->cur_ucode == IWL_UCODE_INIT)
1624  ? "Init" : "RT");
1625  return;
1626  }
1627 
1628  /*TODO: Update dbgfs with ISR error stats obtained below */
1629  iwl_read_targ_mem_bytes(trans, base, &table, sizeof(table));
1630 
1631  if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
1632  IWL_ERR(trans, "Start IWL Error Log Dump:\n");
1633  IWL_ERR(trans, "Status: 0x%08lX, count: %d\n",
1634  priv->status, table.valid);
1635  }
1636 
1637  trace_iwlwifi_dev_ucode_error(trans->dev, table.error_id, table.tsf_low,
1638  table.data1, table.data2, table.line,
1639  table.blink1, table.blink2, table.ilink1,
1640  table.ilink2, table.bcon_time, table.gp1,
1641  table.gp2, table.gp3, table.ucode_ver,
1642  table.hw_ver, table.brd_ver);
1643  IWL_ERR(priv, "0x%08X | %-28s\n", table.error_id,
1644  desc_lookup(table.error_id));
1645  IWL_ERR(priv, "0x%08X | uPc\n", table.pc);
1646  IWL_ERR(priv, "0x%08X | branchlink1\n", table.blink1);
1647  IWL_ERR(priv, "0x%08X | branchlink2\n", table.blink2);
1648  IWL_ERR(priv, "0x%08X | interruptlink1\n", table.ilink1);
1649  IWL_ERR(priv, "0x%08X | interruptlink2\n", table.ilink2);
1650  IWL_ERR(priv, "0x%08X | data1\n", table.data1);
1651  IWL_ERR(priv, "0x%08X | data2\n", table.data2);
1652  IWL_ERR(priv, "0x%08X | line\n", table.line);
1653  IWL_ERR(priv, "0x%08X | beacon time\n", table.bcon_time);
1654  IWL_ERR(priv, "0x%08X | tsf low\n", table.tsf_low);
1655  IWL_ERR(priv, "0x%08X | tsf hi\n", table.tsf_hi);
1656  IWL_ERR(priv, "0x%08X | time gp1\n", table.gp1);
1657  IWL_ERR(priv, "0x%08X | time gp2\n", table.gp2);
1658  IWL_ERR(priv, "0x%08X | time gp3\n", table.gp3);
1659  IWL_ERR(priv, "0x%08X | uCode version\n", table.ucode_ver);
1660  IWL_ERR(priv, "0x%08X | hw version\n", table.hw_ver);
1661  IWL_ERR(priv, "0x%08X | board version\n", table.brd_ver);
1662  IWL_ERR(priv, "0x%08X | hcmd\n", table.hcmd);
1663  IWL_ERR(priv, "0x%08X | isr0\n", table.isr0);
1664  IWL_ERR(priv, "0x%08X | isr1\n", table.isr1);
1665  IWL_ERR(priv, "0x%08X | isr2\n", table.isr2);
1666  IWL_ERR(priv, "0x%08X | isr3\n", table.isr3);
1667  IWL_ERR(priv, "0x%08X | isr4\n", table.isr4);
1668  IWL_ERR(priv, "0x%08X | isr_pref\n", table.isr_pref);
1669  IWL_ERR(priv, "0x%08X | wait_event\n", table.wait_event);
1670  IWL_ERR(priv, "0x%08X | l2p_control\n", table.l2p_control);
1671  IWL_ERR(priv, "0x%08X | l2p_duration\n", table.l2p_duration);
1672  IWL_ERR(priv, "0x%08X | l2p_mhvalid\n", table.l2p_mhvalid);
1673  IWL_ERR(priv, "0x%08X | l2p_addr_match\n", table.l2p_addr_match);
1674  IWL_ERR(priv, "0x%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel);
1675  IWL_ERR(priv, "0x%08X | timestamp\n", table.u_timestamp);
1676  IWL_ERR(priv, "0x%08X | flow_handler\n", table.flow_handler);
1677 }
1678 
1679 #define EVENT_START_OFFSET (4 * sizeof(u32))
1680 
1685 static int iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
1686  u32 num_events, u32 mode,
1687  int pos, char **buf, size_t bufsz)
1688 {
1689  u32 i;
1690  u32 base; /* SRAM byte address of event log header */
1691  u32 event_size; /* 2 u32s, or 3 u32s if timestamp recorded */
1692  u32 ptr; /* SRAM byte address of log data */
1693  u32 ev, time, data; /* event log data */
1694  unsigned long reg_flags;
1695 
1696  struct iwl_trans *trans = priv->trans;
1697 
1698  if (num_events == 0)
1699  return pos;
1700 
1701  base = priv->device_pointers.log_event_table;
1702  if (priv->cur_ucode == IWL_UCODE_INIT) {
1703  if (!base)
1704  base = priv->fw->init_evtlog_ptr;
1705  } else {
1706  if (!base)
1707  base = priv->fw->inst_evtlog_ptr;
1708  }
1709 
1710  if (mode == 0)
1711  event_size = 2 * sizeof(u32);
1712  else
1713  event_size = 3 * sizeof(u32);
1714 
1715  ptr = base + EVENT_START_OFFSET + (start_idx * event_size);
1716 
1717  /* Make sure device is powered up for SRAM reads */
1718  spin_lock_irqsave(&trans->reg_lock, reg_flags);
1719  if (unlikely(!iwl_grab_nic_access(trans)))
1720  goto out_unlock;
1721 
1722  /* Set starting address; reads will auto-increment */
1723  iwl_write32(trans, HBUS_TARG_MEM_RADDR, ptr);
1724 
1725  /* "time" is actually "data" for mode 0 (no timestamp).
1726  * place event id # at far right for easier visual parsing. */
1727  for (i = 0; i < num_events; i++) {
1728  ev = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
1729  time = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
1730  if (mode == 0) {
1731  /* data, ev */
1732  if (bufsz) {
1733  pos += scnprintf(*buf + pos, bufsz - pos,
1734  "EVT_LOG:0x%08x:%04u\n",
1735  time, ev);
1736  } else {
1737  trace_iwlwifi_dev_ucode_event(trans->dev, 0,
1738  time, ev);
1739  IWL_ERR(priv, "EVT_LOG:0x%08x:%04u\n",
1740  time, ev);
1741  }
1742  } else {
1743  data = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
1744  if (bufsz) {
1745  pos += scnprintf(*buf + pos, bufsz - pos,
1746  "EVT_LOGT:%010u:0x%08x:%04u\n",
1747  time, data, ev);
1748  } else {
1749  IWL_ERR(priv, "EVT_LOGT:%010u:0x%08x:%04u\n",
1750  time, data, ev);
1751  trace_iwlwifi_dev_ucode_event(trans->dev, time,
1752  data, ev);
1753  }
1754  }
1755  }
1756 
1757  /* Allow device to power down */
1758  iwl_release_nic_access(trans);
1759 out_unlock:
1760  spin_unlock_irqrestore(&trans->reg_lock, reg_flags);
1761  return pos;
1762 }
1763 
1767 static int iwl_print_last_event_logs(struct iwl_priv *priv, u32 capacity,
1768  u32 num_wraps, u32 next_entry,
1769  u32 size, u32 mode,
1770  int pos, char **buf, size_t bufsz)
1771 {
1772  /*
1773  * display the newest DEFAULT_LOG_ENTRIES entries
1774  * i.e the entries just before the next ont that uCode would fill.
1775  */
1776  if (num_wraps) {
1777  if (next_entry < size) {
1778  pos = iwl_print_event_log(priv,
1779  capacity - (size - next_entry),
1780  size - next_entry, mode,
1781  pos, buf, bufsz);
1782  pos = iwl_print_event_log(priv, 0,
1783  next_entry, mode,
1784  pos, buf, bufsz);
1785  } else
1786  pos = iwl_print_event_log(priv, next_entry - size,
1787  size, mode, pos, buf, bufsz);
1788  } else {
1789  if (next_entry < size) {
1790  pos = iwl_print_event_log(priv, 0, next_entry,
1791  mode, pos, buf, bufsz);
1792  } else {
1793  pos = iwl_print_event_log(priv, next_entry - size,
1794  size, mode, pos, buf, bufsz);
1795  }
1796  }
1797  return pos;
1798 }
1799 
1800 #define DEFAULT_DUMP_EVENT_LOG_ENTRIES (20)
1801 
1802 int iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
1803  char **buf, bool display)
1804 {
1805  u32 base; /* SRAM byte address of event log header */
1806  u32 capacity; /* event log capacity in # entries */
1807  u32 mode; /* 0 - no timestamp, 1 - timestamp recorded */
1808  u32 num_wraps; /* # times uCode wrapped to top of log */
1809  u32 next_entry; /* index of next entry to be written by uCode */
1810  u32 size; /* # entries that we'll print */
1811  u32 logsize;
1812  int pos = 0;
1813  size_t bufsz = 0;
1814  struct iwl_trans *trans = priv->trans;
1815 
1816  base = priv->device_pointers.log_event_table;
1817  if (priv->cur_ucode == IWL_UCODE_INIT) {
1818  logsize = priv->fw->init_evtlog_size;
1819  if (!base)
1820  base = priv->fw->init_evtlog_ptr;
1821  } else {
1822  logsize = priv->fw->inst_evtlog_size;
1823  if (!base)
1824  base = priv->fw->inst_evtlog_ptr;
1825  }
1826 
1827  if (!iwlagn_hw_valid_rtc_data_addr(base)) {
1828  IWL_ERR(priv,
1829  "Invalid event log pointer 0x%08X for %s uCode\n",
1830  base,
1831  (priv->cur_ucode == IWL_UCODE_INIT)
1832  ? "Init" : "RT");
1833  return -EINVAL;
1834  }
1835 
1836  /* event log header */
1837  capacity = iwl_read_targ_mem(trans, base);
1838  mode = iwl_read_targ_mem(trans, base + (1 * sizeof(u32)));
1839  num_wraps = iwl_read_targ_mem(trans, base + (2 * sizeof(u32)));
1840  next_entry = iwl_read_targ_mem(trans, base + (3 * sizeof(u32)));
1841 
1842  if (capacity > logsize) {
1843  IWL_ERR(priv, "Log capacity %d is bogus, limit to %d "
1844  "entries\n", capacity, logsize);
1845  capacity = logsize;
1846  }
1847 
1848  if (next_entry > logsize) {
1849  IWL_ERR(priv, "Log write index %d is bogus, limit to %d\n",
1850  next_entry, logsize);
1851  next_entry = logsize;
1852  }
1853 
1854  size = num_wraps ? capacity : next_entry;
1855 
1856  /* bail out if nothing in log */
1857  if (size == 0) {
1858  IWL_ERR(trans, "Start IWL Event Log Dump: nothing in log\n");
1859  return pos;
1860  }
1861 
1862 #ifdef CONFIG_IWLWIFI_DEBUG
1863  if (!(iwl_have_debug_level(IWL_DL_FW_ERRORS)) && !full_log)
1864  size = (size > DEFAULT_DUMP_EVENT_LOG_ENTRIES)
1866 #else
1867  size = (size > DEFAULT_DUMP_EVENT_LOG_ENTRIES)
1869 #endif
1870  IWL_ERR(priv, "Start IWL Event Log Dump: display last %u entries\n",
1871  size);
1872 
1873 #ifdef CONFIG_IWLWIFI_DEBUG
1874  if (display) {
1875  if (full_log)
1876  bufsz = capacity * 48;
1877  else
1878  bufsz = size * 48;
1879  *buf = kmalloc(bufsz, GFP_KERNEL);
1880  if (!*buf)
1881  return -ENOMEM;
1882  }
1883  if (iwl_have_debug_level(IWL_DL_FW_ERRORS) || full_log) {
1884  /*
1885  * if uCode has wrapped back to top of log,
1886  * start at the oldest entry,
1887  * i.e the next one that uCode would fill.
1888  */
1889  if (num_wraps)
1890  pos = iwl_print_event_log(priv, next_entry,
1891  capacity - next_entry, mode,
1892  pos, buf, bufsz);
1893  /* (then/else) start at top of log */
1894  pos = iwl_print_event_log(priv, 0,
1895  next_entry, mode, pos, buf, bufsz);
1896  } else
1897  pos = iwl_print_last_event_logs(priv, capacity, num_wraps,
1898  next_entry, size, mode,
1899  pos, buf, bufsz);
1900 #else
1901  pos = iwl_print_last_event_logs(priv, capacity, num_wraps,
1902  next_entry, size, mode,
1903  pos, buf, bufsz);
1904 #endif
1905  return pos;
1906 }
1907 
1908 static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
1909 {
1910  unsigned int reload_msec;
1911  unsigned long reload_jiffies;
1912 
1913 #ifdef CONFIG_IWLWIFI_DEBUG
1914  if (iwl_have_debug_level(IWL_DL_FW_ERRORS))
1915  iwl_print_rx_config_cmd(priv, IWL_RXON_CTX_BSS);
1916 #endif
1917 
1918  /* uCode is no longer loaded. */
1919  priv->ucode_loaded = false;
1920 
1921  /* Set the FW error flag -- cleared on iwl_down */
1922  set_bit(STATUS_FW_ERROR, &priv->status);
1923 
1925 
1926  /* Keep the restart process from trying to send host
1927  * commands by clearing the ready bit */
1928  clear_bit(STATUS_READY, &priv->status);
1929 
1930  wake_up(&priv->trans->wait_command_queue);
1931 
1932  if (!ondemand) {
1933  /*
1934  * If firmware keep reloading, then it indicate something
1935  * serious wrong and firmware having problem to recover
1936  * from it. Instead of keep trying which will fill the syslog
1937  * and hang the system, let's just stop it
1938  */
1939  reload_jiffies = jiffies;
1940  reload_msec = jiffies_to_msecs((long) reload_jiffies -
1941  (long) priv->reload_jiffies);
1942  priv->reload_jiffies = reload_jiffies;
1943  if (reload_msec <= IWL_MIN_RELOAD_DURATION) {
1944  priv->reload_count++;
1946  IWL_ERR(priv, "BUG_ON, Stop restarting\n");
1947  return;
1948  }
1949  } else
1950  priv->reload_count = 0;
1951  }
1952 
1953  if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) {
1954  if (iwlwifi_mod_params.restart_fw) {
1955  IWL_DEBUG_FW_ERRORS(priv,
1956  "Restarting adapter due to uCode error.\n");
1957  queue_work(priv->workqueue, &priv->restart);
1958  } else
1959  IWL_DEBUG_FW_ERRORS(priv,
1960  "Detected FW error, but not restarting\n");
1961  }
1962 }
1963 
1964 static void iwl_nic_error(struct iwl_op_mode *op_mode)
1965 {
1966  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1967 
1968  IWL_ERR(priv, "Loaded firmware version: %s\n",
1969  priv->fw->fw_version);
1970 
1971  iwl_dump_nic_error_log(priv);
1972  iwl_dump_nic_event_log(priv, false, NULL, false);
1973 
1974  iwlagn_fw_error(priv, false);
1975 }
1976 
1977 static void iwl_cmd_queue_full(struct iwl_op_mode *op_mode)
1978 {
1979  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1980 
1981  if (!iwl_check_for_ct_kill(priv)) {
1982  IWL_ERR(priv, "Restarting adapter queue is full\n");
1983  iwlagn_fw_error(priv, false);
1984  }
1985 }
1986 
1987 #define EEPROM_RF_CONFIG_TYPE_MAX 0x3
1988 
1989 static void iwl_nic_config(struct iwl_op_mode *op_mode)
1990 {
1991  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
1992  u16 radio_cfg = priv->eeprom_data->radio_cfg;
1993 
1994  /* SKU Control */
1998  (CSR_HW_REV_STEP(priv->trans->hw_rev) <<
2000  (CSR_HW_REV_DASH(priv->trans->hw_rev) <<
2002 
2003  /* write radio config values to register */
2005  u32 reg_val =
2006  EEPROM_RF_CFG_TYPE_MSK(radio_cfg) <<
2008  EEPROM_RF_CFG_STEP_MSK(radio_cfg) <<
2010  EEPROM_RF_CFG_DASH_MSK(radio_cfg) <<
2012 
2017 
2018  IWL_INFO(priv, "Radio type=0x%x-0x%x-0x%x\n",
2019  EEPROM_RF_CFG_TYPE_MSK(radio_cfg),
2020  EEPROM_RF_CFG_STEP_MSK(radio_cfg),
2021  EEPROM_RF_CFG_DASH_MSK(radio_cfg));
2022  } else {
2023  WARN_ON(1);
2024  }
2025 
2026  /* set CSR_HW_CONFIG_REG for uCode use */
2030 
2031  /* W/A : NIC is stuck in a reset state after Early PCIe power off
2032  * (PCIe power is lost before PERST# is asserted),
2033  * causing ME FW to lose ownership and not being able to obtain it back.
2034  */
2038 
2039  if (priv->lib->nic_config)
2040  priv->lib->nic_config(priv);
2041 }
2042 
2043 static void iwl_wimax_active(struct iwl_op_mode *op_mode)
2044 {
2045  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2046 
2047  clear_bit(STATUS_READY, &priv->status);
2048  IWL_ERR(priv, "RF is used by WiMAX\n");
2049 }
2050 
2051 static void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, int queue)
2052 {
2053  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2054  int mq = priv->queue_to_mac80211[queue];
2055 
2057  return;
2058 
2059  if (atomic_inc_return(&priv->queue_stop_count[mq]) > 1) {
2060  IWL_DEBUG_TX_QUEUES(priv,
2061  "queue %d (mac80211 %d) already stopped\n",
2062  queue, mq);
2063  return;
2064  }
2065 
2066  set_bit(mq, &priv->transport_queue_stop);
2067  ieee80211_stop_queue(priv->hw, mq);
2068 }
2069 
2070 static void iwl_wake_sw_queue(struct iwl_op_mode *op_mode, int queue)
2071 {
2072  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2073  int mq = priv->queue_to_mac80211[queue];
2074 
2076  return;
2077 
2078  if (atomic_dec_return(&priv->queue_stop_count[mq]) > 0) {
2079  IWL_DEBUG_TX_QUEUES(priv,
2080  "queue %d (mac80211 %d) already awake\n",
2081  queue, mq);
2082  return;
2083  }
2084 
2085  clear_bit(mq, &priv->transport_queue_stop);
2086 
2087  if (!priv->passive_no_rx)
2088  ieee80211_wake_queue(priv->hw, mq);
2089 }
2090 
2092 {
2093  int mq;
2094 
2095  if (!priv->passive_no_rx)
2096  return;
2097 
2098  for (mq = 0; mq < IWLAGN_FIRST_AMPDU_QUEUE; mq++) {
2099  if (!test_bit(mq, &priv->transport_queue_stop)) {
2100  IWL_DEBUG_TX_QUEUES(priv, "Wake queue %d", mq);
2101  ieee80211_wake_queue(priv->hw, mq);
2102  } else {
2103  IWL_DEBUG_TX_QUEUES(priv, "Don't wake queue %d", mq);
2104  }
2105  }
2106 
2107  priv->passive_no_rx = false;
2108 }
2109 
2110 static void iwl_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb)
2111 {
2112  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2113  struct ieee80211_tx_info *info;
2114 
2115  info = IEEE80211_SKB_CB(skb);
2116  iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]);
2117  ieee80211_free_txskb(priv->hw, skb);
2118 }
2119 
2120 static void iwl_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)
2121 {
2122  struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2123 
2124  if (state)
2125  set_bit(STATUS_RF_KILL_HW, &priv->status);
2126  else
2128 
2129  wiphy_rfkill_set_hw_state(priv->hw->wiphy, state);
2130 }
2131 
2132 static const struct iwl_op_mode_ops iwl_dvm_ops = {
2133  .start = iwl_op_mode_dvm_start,
2134  .stop = iwl_op_mode_dvm_stop,
2135  .rx = iwl_rx_dispatch,
2136  .queue_full = iwl_stop_sw_queue,
2137  .queue_not_full = iwl_wake_sw_queue,
2138  .hw_rf_kill = iwl_set_hw_rfkill_state,
2139  .free_skb = iwl_free_skb,
2140  .nic_error = iwl_nic_error,
2141  .cmd_queue_full = iwl_cmd_queue_full,
2142  .nic_config = iwl_nic_config,
2143  .wimax_active = iwl_wimax_active,
2144 };
2145 
2146 /*****************************************************************************
2147  *
2148  * driver and module entry point
2149  *
2150  *****************************************************************************/
2151 static int __init iwl_init(void)
2152 {
2153 
2154  int ret;
2155  pr_info(DRV_DESCRIPTION ", " DRV_VERSION "\n");
2156  pr_info(DRV_COPYRIGHT "\n");
2157 
2159  if (ret) {
2160  pr_err("Unable to register rate control algorithm: %d\n", ret);
2161  return ret;
2162  }
2163 
2164  ret = iwl_opmode_register("iwldvm", &iwl_dvm_ops);
2165  if (ret) {
2166  pr_err("Unable to register op_mode: %d\n", ret);
2168  }
2169 
2170  return ret;
2171 }
2172 module_init(iwl_init);
2173 
2174 static void __exit iwl_exit(void)
2175 {
2176  iwl_opmode_deregister("iwldvm");
2178 }
2179 module_exit(iwl_exit);