Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 2 Jun 2010 19:36:51 +0000 (15:36 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 2 Jun 2010 19:36:51 +0000 (15:36 -0400)
1  2 
drivers/net/wireless/iwlwifi/iwl-3945.c
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-debugfs.c
drivers/net/wireless/iwlwifi/iwl-rx.c
drivers/net/wireless/iwlwifi/iwl-sta.c
drivers/net/wireless/iwlwifi/iwl-tx.c
drivers/net/wireless/iwlwifi/iwl3945-base.c

@@@ -27,7 -27,6 +27,7 @@@
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/init.h>
 +#include <linux/slab.h>
  #include <linux/pci.h>
  #include <linux/dma-mapping.h>
  #include <linux/delay.h>
@@@ -352,7 -351,7 +352,7 @@@ static void iwl3945_rx_reply_tx(struct 
   *  RX handler implementations
   *
   *****************************************************************************/
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
  /*
   *  based on the assumption of all statistics counter are in DWORD
   *  FIXME: This function is for debugging, do not deal with
@@@ -460,7 -459,7 +460,7 @@@ void iwl3945_hw_rx_statistics(struct iw
        IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
                     (int)sizeof(struct iwl3945_notif_statistics),
                     le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
        iwl3945_accumulative_statistics(priv, (__le32 *)&pkt->u.raw);
  #endif
        iwl_recover_from_statistics(priv, pkt);
@@@ -475,7 -474,7 +475,7 @@@ void iwl3945_reply_statistics(struct iw
        __le32 *flag = (__le32 *)&pkt->u.raw;
  
        if (le32_to_cpu(*flag) & UCODE_STATISTICS_CLEAR_MSK) {
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
                memset(&priv->_3945.accum_statistics, 0,
                        sizeof(struct iwl3945_notif_statistics));
                memset(&priv->_3945.delta_statistics, 0,
@@@ -947,8 -946,7 +947,7 @@@ void iwl3945_hw_build_tx_cmd_rate(struc
                       tx_cmd->supp_rates[1], tx_cmd->supp_rates[0]);
  }
  
- static u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id,
-                          u16 tx_rate, u8 flags)
+ static u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id, u16 tx_rate)
  {
        unsigned long flags_spin;
        struct iwl_station_entry *station;
        station->sta.sta.modify_mask = STA_MODIFY_TX_RATE_MSK;
        station->sta.rate_n_flags = cpu_to_le16(tx_rate);
        station->sta.mode = STA_CONTROL_MODIFY_MSK;
+       iwl_send_add_sta(priv, &station->sta, CMD_ASYNC);
        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
  
-       iwl_send_add_sta(priv, &station->sta, flags);
        IWL_DEBUG_RATE(priv, "SCALE sync station %d to rate %d\n",
                        sta_id, tx_rate);
        return sta_id;
@@@ -2473,8 -2470,7 +2471,7 @@@ static int iwl3945_manage_ibss_station(
  
                iwl3945_sync_sta(priv, vif_priv->ibss_bssid_sta_id,
                                 (priv->band == IEEE80211_BAND_5GHZ) ?
-                                IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP,
-                                CMD_ASYNC);
+                                IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP);
                iwl3945_rate_scale_init(priv->hw, vif_priv->ibss_bssid_sta_id);
  
                return 0;
@@@ -184,6 -184,7 +184,7 @@@ static void iwlagn_rx_reply_tx(struct i
        int tid;
        int sta_id;
        int freed;
+       unsigned long flags;
  
        if ((index >= txq->q.n_bd) || (iwl_queue_used(&txq->q, index) == 0)) {
                IWL_ERR(priv, "Read index for DMA queue txq_id (%d) index %d "
        tid = (tx_resp->ra_tid & IWL50_TX_RES_TID_MSK) >> IWL50_TX_RES_TID_POS;
        sta_id = (tx_resp->ra_tid & IWL50_TX_RES_RA_MSK) >> IWL50_TX_RES_RA_POS;
  
+       spin_lock_irqsave(&priv->sta_lock, flags);
        if (txq->sched_retry) {
                const u32 scd_ssn = iwlagn_get_scd_ssn(tx_resp);
-               struct iwl_ht_agg *agg = NULL;
+               struct iwl_ht_agg *agg;
  
                agg = &priv->stations[sta_id].tid[tid].agg;
  
        iwlagn_txq_check_empty(priv, sta_id, tid, txq_id);
  
        iwl_check_abort_status(priv, tx_resp->frame_count, status);
+       spin_unlock_irqrestore(&priv->sta_lock, flags);
  }
  
  void iwlagn_rx_handler_setup(struct iwl_priv *priv)
@@@ -319,7 -322,8 +322,8 @@@ int iwlagn_send_tx_power(struct iwl_pri
  void iwlagn_temperature(struct iwl_priv *priv)
  {
        /* store temperature from statistics (in Celsius) */
-       priv->temperature = le32_to_cpu(priv->statistics.general.temperature);
+       priv->temperature =
+               le32_to_cpu(priv->_agn.statistics.general.temperature);
        iwl_tt_handler(priv);
  }
  
@@@ -932,7 -936,7 +936,7 @@@ static u32 iwlagn_translate_rx_status(s
                else
                        decrypt_out |= RX_RES_STATUS_DECRYPT_OK;
                break;
 -      };
 +      }
  
        IWL_DEBUG_RX(priv, "decrypt_in:0x%x  decrypt_out = 0x%x\n",
                                        decrypt_in, decrypt_out);
@@@ -1528,3 -1532,18 +1532,18 @@@ int iwlagn_manage_ibss_station(struct i
        return iwl_remove_station(priv, vif_priv->ibss_bssid_sta_id,
                                  vif->bss_conf.bssid);
  }
+ void iwl_free_tfds_in_queue(struct iwl_priv *priv,
+                           int sta_id, int tid, int freed)
+ {
+       WARN_ON(!spin_is_locked(&priv->sta_lock));
+       if (priv->stations[sta_id].tid[tid].tfds_in_queue >= freed)
+               priv->stations[sta_id].tid[tid].tfds_in_queue -= freed;
+       else {
+               IWL_DEBUG_TX(priv, "free more than tfds_in_queue (%u:%d)\n",
+                       priv->stations[sta_id].tid[tid].tfds_in_queue,
+                       freed);
+               priv->stations[sta_id].tid[tid].tfds_in_queue = 0;
+       }
+ }
@@@ -31,7 -31,6 +31,7 @@@
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/pci.h>
 +#include <linux/slab.h>
  #include <linux/dma-mapping.h>
  #include <linux/delay.h>
  #include <linux/sched.h>
@@@ -1450,13 -1449,13 +1450,13 @@@ bool iwl_good_ack_health(struct iwl_pri
  
        actual_ack_cnt_delta =
                le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) -
-               le32_to_cpu(priv->statistics.tx.actual_ack_cnt);
+               le32_to_cpu(priv->_agn.statistics.tx.actual_ack_cnt);
        expected_ack_cnt_delta =
                le32_to_cpu(pkt->u.stats.tx.expected_ack_cnt) -
-               le32_to_cpu(priv->statistics.tx.expected_ack_cnt);
+               le32_to_cpu(priv->_agn.statistics.tx.expected_ack_cnt);
        ba_timeout_delta =
                le32_to_cpu(pkt->u.stats.tx.agg.ba_timeout) -
-               le32_to_cpu(priv->statistics.tx.agg.ba_timeout);
+               le32_to_cpu(priv->_agn.statistics.tx.agg.ba_timeout);
        if ((priv->_agn.agg_tids_count > 0) &&
            (expected_ack_cnt_delta > 0) &&
            (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta)
                                " expected_ack_cnt = %d\n",
                                actual_ack_cnt_delta, expected_ack_cnt_delta);
  
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
+               /*
+                * This is ifdef'ed on DEBUGFS because otherwise the
+                * statistics aren't available. If DEBUGFS is set but
+                * DEBUG is not, these will just compile out.
+                */
                IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n",
-                               priv->delta_statistics.tx.rx_detected_cnt);
+                               priv->_agn.delta_statistics.tx.rx_detected_cnt);
                IWL_DEBUG_RADIO(priv,
                                "ack_or_ba_timeout_collision delta = %d\n",
-                               priv->delta_statistics.tx.
+                               priv->_agn.delta_statistics.tx.
                                ack_or_ba_timeout_collision);
  #endif
                IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
@@@ -1544,6 -1548,9 +1549,9 @@@ struct iwlagn_firmware_pieces 
        size_t inst_size, data_size, init_size, init_data_size, boot_size;
  
        u32 build;
+       u32 init_evtlog_ptr, init_evtlog_size, init_errlog_ptr;
+       u32 inst_evtlog_ptr, inst_evtlog_size, inst_errlog_ptr;
  };
  
  static int iwlagn_load_legacy_firmware(struct iwl_priv *priv,
@@@ -1721,6 -1728,42 +1729,42 @@@ static int iwlagn_load_firmware(struct 
                        capa->max_probe_length =
                                le32_to_cpup((__le32 *)tlv_data);
                        break;
+               case IWL_UCODE_TLV_INIT_EVTLOG_PTR:
+                       if (tlv_len != 4)
+                               return -EINVAL;
+                       pieces->init_evtlog_ptr =
+                               le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_INIT_EVTLOG_SIZE:
+                       if (tlv_len != 4)
+                               return -EINVAL;
+                       pieces->init_evtlog_size =
+                               le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_INIT_ERRLOG_PTR:
+                       if (tlv_len != 4)
+                               return -EINVAL;
+                       pieces->init_errlog_ptr =
+                               le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_RUNT_EVTLOG_PTR:
+                       if (tlv_len != 4)
+                               return -EINVAL;
+                       pieces->inst_evtlog_ptr =
+                               le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_RUNT_EVTLOG_SIZE:
+                       if (tlv_len != 4)
+                               return -EINVAL;
+                       pieces->inst_evtlog_size =
+                               le32_to_cpup((__le32 *)tlv_data);
+                       break;
+               case IWL_UCODE_TLV_RUNT_ERRLOG_PTR:
+                       if (tlv_len != 4)
+                               return -EINVAL;
+                       pieces->inst_errlog_ptr =
+                               le32_to_cpup((__le32 *)tlv_data);
+                       break;
                default:
                        break;
                }
@@@ -1913,6 -1956,26 +1957,26 @@@ static void iwl_ucode_callback(const st
                        goto err_pci_alloc;
        }
  
+       /* Now that we can no longer fail, copy information */
+       /*
+        * The (size - 16) / 12 formula is based on the information recorded
+        * for each event, which is of mode 1 (including timestamp) for all
+        * new microcodes that include this information.
+        */
+       priv->_agn.init_evtlog_ptr = pieces.init_evtlog_ptr;
+       if (pieces.init_evtlog_size)
+               priv->_agn.init_evtlog_size = (pieces.init_evtlog_size - 16)/12;
+       else
+               priv->_agn.init_evtlog_size = priv->cfg->max_event_log_size;
+       priv->_agn.init_errlog_ptr = pieces.init_errlog_ptr;
+       priv->_agn.inst_evtlog_ptr = pieces.inst_evtlog_ptr;
+       if (pieces.inst_evtlog_size)
+               priv->_agn.inst_evtlog_size = (pieces.inst_evtlog_size - 16)/12;
+       else
+               priv->_agn.inst_evtlog_size = priv->cfg->max_event_log_size;
+       priv->_agn.inst_errlog_ptr = pieces.inst_errlog_ptr;
        /* Copy images into buffers for card's bus-master reads ... */
  
        /* Runtime instructions (first block of data in file) */
@@@ -2038,10 -2101,15 +2102,15 @@@ void iwl_dump_nic_error_log(struct iwl_
        u32 blink1, blink2, ilink1, ilink2;
        u32 pc, hcmd;
  
-       if (priv->ucode_type == UCODE_INIT)
+       if (priv->ucode_type == UCODE_INIT) {
                base = le32_to_cpu(priv->card_alive_init.error_event_table_ptr);
-       else
+               if (!base)
+                       base = priv->_agn.init_errlog_ptr;
+       } else {
                base = le32_to_cpu(priv->card_alive.error_event_table_ptr);
+               if (!base)
+                       base = priv->_agn.inst_errlog_ptr;
+       }
  
        if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
                IWL_ERR(priv,
@@@ -2101,10 -2169,16 +2170,16 @@@ static int iwl_print_event_log(struct i
  
        if (num_events == 0)
                return pos;
-       if (priv->ucode_type == UCODE_INIT)
+       if (priv->ucode_type == UCODE_INIT) {
                base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
-       else
+               if (!base)
+                       base = priv->_agn.init_evtlog_ptr;
+       } else {
                base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
+               if (!base)
+                       base = priv->_agn.inst_evtlog_ptr;
+       }
  
        if (mode == 0)
                event_size = 2 * sizeof(u32);
@@@ -2206,13 -2280,21 +2281,21 @@@ int iwl_dump_nic_event_log(struct iwl_p
        u32 num_wraps;  /* # times uCode wrapped to top of log */
        u32 next_entry; /* index of next entry to be written by uCode */
        u32 size;       /* # entries that we'll print */
+       u32 logsize;
        int pos = 0;
        size_t bufsz = 0;
  
-       if (priv->ucode_type == UCODE_INIT)
+       if (priv->ucode_type == UCODE_INIT) {
                base = le32_to_cpu(priv->card_alive_init.log_event_table_ptr);
-       else
+               logsize = priv->_agn.init_evtlog_size;
+               if (!base)
+                       base = priv->_agn.init_evtlog_ptr;
+       } else {
                base = le32_to_cpu(priv->card_alive.log_event_table_ptr);
+               logsize = priv->_agn.inst_evtlog_size;
+               if (!base)
+                       base = priv->_agn.inst_evtlog_ptr;
+       }
  
        if (!priv->cfg->ops->lib->is_valid_rtc_data_addr(base)) {
                IWL_ERR(priv,
        num_wraps = iwl_read_targ_mem(priv, base + (2 * sizeof(u32)));
        next_entry = iwl_read_targ_mem(priv, base + (3 * sizeof(u32)));
  
-       if (capacity > priv->cfg->max_event_log_size) {
+       if (capacity > logsize) {
                IWL_ERR(priv, "Log capacity %d is bogus, limit to %d entries\n",
-                       capacity, priv->cfg->max_event_log_size);
-               capacity = priv->cfg->max_event_log_size;
+                       capacity, logsize);
+               capacity = logsize;
        }
  
-       if (next_entry > priv->cfg->max_event_log_size) {
+       if (next_entry > logsize) {
                IWL_ERR(priv, "Log write index %d is bogus, limit to %d\n",
-                       next_entry, priv->cfg->max_event_log_size);
-               next_entry = priv->cfg->max_event_log_size;
+                       next_entry, logsize);
+               next_entry = logsize;
        }
  
        size = num_wraps ? capacity : next_entry;
@@@ -2686,12 -2768,13 +2769,12 @@@ static void iwl_bg_run_time_calib_work(
        }
  
        if (priv->start_calib) {
-               iwl_chain_noise_calibration(priv, &priv->statistics);
+               iwl_chain_noise_calibration(priv, &priv->_agn.statistics);
  
-               iwl_sensitivity_calibration(priv, &priv->statistics);
+               iwl_sensitivity_calibration(priv, &priv->_agn.statistics);
        }
  
        mutex_unlock(&priv->mutex);
 -      return;
  }
  
  static void iwl_bg_restart(struct work_struct *data)
@@@ -2777,20 -2860,16 +2860,16 @@@ void iwl_post_associate(struct iwl_pri
        IWL_DEBUG_ASSOC(priv, "assoc id %d beacon interval %d\n",
                        vif->bss_conf.aid, vif->bss_conf.beacon_int);
  
-       if (vif->bss_conf.assoc_capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
+       if (vif->bss_conf.use_short_preamble)
                priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
        else
                priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
  
        if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) {
-               if (vif->bss_conf.assoc_capability &
-                                       WLAN_CAPABILITY_SHORT_SLOT_TIME)
+               if (vif->bss_conf.use_short_slot)
                        priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
                else
                        priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
-               if (vif->type == NL80211_IFTYPE_ADHOC)
-                       priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
        }
  
        iwlcore_commit_rxon(priv);
@@@ -3016,8 -3095,7 +3095,7 @@@ void iwl_config_ap(struct iwl_priv *pri
  
                priv->staging_rxon.assoc_id = 0;
  
-               if (vif->bss_conf.assoc_capability &
-                                               WLAN_CAPABILITY_SHORT_PREAMBLE)
+               if (vif->bss_conf.use_short_preamble)
                        priv->staging_rxon.flags |=
                                RXON_FLG_SHORT_PREAMBLE_MSK;
                else
                                ~RXON_FLG_SHORT_PREAMBLE_MSK;
  
                if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) {
-                       if (vif->bss_conf.assoc_capability &
-                                               WLAN_CAPABILITY_SHORT_SLOT_TIME)
+                       if (vif->bss_conf.use_short_slot)
                                priv->staging_rxon.flags |=
                                        RXON_FLG_SHORT_SLOT_MSK;
                        else
                                priv->staging_rxon.flags &=
                                        ~RXON_FLG_SHORT_SLOT_MSK;
-                       if (vif->type == NL80211_IFTYPE_ADHOC)
-                               priv->staging_rxon.flags &=
-                                       ~RXON_FLG_SHORT_SLOT_MSK;
                }
                /* restore RXON assoc */
                priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
@@@ -3081,17 -3154,9 +3154,9 @@@ static int iwl_mac_set_key(struct ieee8
                return -EOPNOTSUPP;
        }
  
-       if (sta) {
-               sta_id = iwl_sta_id(sta);
-               if (sta_id == IWL_INVALID_STATION) {
-                       IWL_DEBUG_MAC80211(priv, "leave - %pM not in station map.\n",
-                                          sta->addr);
-                       return -EINVAL;
-               }
-       } else {
-               sta_id = priv->hw_params.bcast_sta_id;
-       }
+       sta_id = iwl_sta_id_or_broadcast(priv, sta);
+       if (sta_id == IWL_INVALID_STATION)
+               return -EINVAL;
  
        mutex_lock(&priv->mutex);
        iwl_scan_cancel_timeout(priv, 100);
@@@ -3989,6 -4054,47 +4054,47 @@@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_c
        {IWL_PCI_DEVICE(0x0082, 0x1201, iwl6000g2a_2agn_cfg)},
        {IWL_PCI_DEVICE(0x0085, 0x1211, iwl6000g2a_2agn_cfg)},
        {IWL_PCI_DEVICE(0x0082, 0x1221, iwl6000g2a_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1206, iwl6000g2a_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0085, 0x1216, iwl6000g2a_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1226, iwl6000g2a_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1207, iwl6000g2a_2bg_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1301, iwl6000g2a_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1306, iwl6000g2a_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1307, iwl6000g2a_2bg_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1321, iwl6000g2a_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0082, 0x1326, iwl6000g2a_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0085, 0x1311, iwl6000g2a_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0085, 0x1316, iwl6000g2a_2abg_cfg)},
+ /* 6x00 Series Gen2b */
+       {IWL_PCI_DEVICE(0x008F, 0x5105, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x0090, 0x5115, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5125, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5107, iwl6000g2b_bg_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5201, iwl6000g2b_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0090, 0x5211, iwl6000g2b_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5221, iwl6000g2b_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5206, iwl6000g2b_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0090, 0x5216, iwl6000g2b_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5226, iwl6000g2b_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x008F, 0x5207, iwl6000g2b_2bg_cfg)},
+       {IWL_PCI_DEVICE(0x008A, 0x5301, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008A, 0x5305, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008A, 0x5307, iwl6000g2b_bg_cfg)},
+       {IWL_PCI_DEVICE(0x008A, 0x5321, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008A, 0x5325, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008B, 0x5311, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x008B, 0x5315, iwl6000g2b_bgn_cfg)},
+       {IWL_PCI_DEVICE(0x0090, 0x5211, iwl6000g2b_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0090, 0x5215, iwl6000g2b_2bgn_cfg)},
+       {IWL_PCI_DEVICE(0x0090, 0x5216, iwl6000g2b_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5201, iwl6000g2b_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5205, iwl6000g2b_2bgn_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5206, iwl6000g2b_2abg_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5207, iwl6000g2b_2bg_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5221, iwl6000g2b_2agn_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5225, iwl6000g2b_2bgn_cfg)},
+       {IWL_PCI_DEVICE(0x0091, 0x5226, iwl6000g2b_2abg_cfg)},
  
  /* 6x50 WiFi/WiMax Series */
        {IWL_PCI_DEVICE(0x0087, 0x1301, iwl6050_2agn_cfg)},
@@@ -30,7 -30,6 +30,7 @@@
  #include <linux/module.h>
  #include <linux/etherdevice.h>
  #include <linux/sched.h>
 +#include <linux/slab.h>
  #include <net/mac80211.h>
  
  #include "iwl-eeprom.h"
@@@ -457,7 -456,7 +457,7 @@@ u8 iwl_is_ht40_tx_allowed(struct iwl_pr
                if (!sta_ht_inf->ht_supported)
                        return 0;
        }
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
        if (priv->disable_ht40)
                return 0;
  #endif
@@@ -737,6 -736,7 +737,6 @@@ void iwl_set_rxon_ht(struct iwl_priv *p
                        "extension channel offset 0x%x\n",
                        le32_to_cpu(rxon->flags), ht_conf->ht_protection,
                        ht_conf->extension_chan_offset);
 -      return;
  }
  EXPORT_SYMBOL(iwl_set_rxon_ht);
  
@@@ -904,14 -904,11 +904,11 @@@ static void iwl_set_flags_for_band(stru
                priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
        } else {
                /* Copied from iwl_post_associate() */
-               if (vif && vif->bss_conf.assoc_capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
+               if (vif && vif->bss_conf.use_short_slot)
                        priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
                else
                        priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
  
-               if (vif && vif->type == NL80211_IFTYPE_ADHOC)
-                       priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
                priv->staging_rxon.flags |= RXON_FLG_BAND_24G_MSK;
                priv->staging_rxon.flags |= RXON_FLG_AUTO_DETECT_MSK;
                priv->staging_rxon.flags &= ~RXON_FLG_CCK_MSK;
@@@ -1463,130 -1460,6 +1460,6 @@@ int iwl_send_statistics_request(struct 
  }
  EXPORT_SYMBOL(iwl_send_statistics_request);
  
- /**
-  * iwl_verify_inst_sparse - verify runtime uCode image in card vs. host,
-  *   using sample data 100 bytes apart.  If these sample points are good,
-  *   it's a pretty good bet that everything between them is good, too.
-  */
- static int iwlcore_verify_inst_sparse(struct iwl_priv *priv, __le32 *image, u32 len)
- {
-       u32 val;
-       int ret = 0;
-       u32 errcnt = 0;
-       u32 i;
-       IWL_DEBUG_INFO(priv, "ucode inst image size is %u\n", len);
-       for (i = 0; i < len; i += 100, image += 100/sizeof(u32)) {
-               /* read data comes through single port, auto-incr addr */
-               /* NOTE: Use the debugless read so we don't flood kernel log
-                * if IWL_DL_IO is set */
-               iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR,
-                       i + IWL49_RTC_INST_LOWER_BOUND);
-               val = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
-               if (val != le32_to_cpu(*image)) {
-                       ret = -EIO;
-                       errcnt++;
-                       if (errcnt >= 3)
-                               break;
-               }
-       }
-       return ret;
- }
- /**
-  * iwlcore_verify_inst_full - verify runtime uCode image in card vs. host,
-  *     looking at all data.
-  */
- static int iwl_verify_inst_full(struct iwl_priv *priv, __le32 *image,
-                                u32 len)
- {
-       u32 val;
-       u32 save_len = len;
-       int ret = 0;
-       u32 errcnt;
-       IWL_DEBUG_INFO(priv, "ucode inst image size is %u\n", len);
-       iwl_write_direct32(priv, HBUS_TARG_MEM_RADDR,
-                          IWL49_RTC_INST_LOWER_BOUND);
-       errcnt = 0;
-       for (; len > 0; len -= sizeof(u32), image++) {
-               /* read data comes through single port, auto-incr addr */
-               /* NOTE: Use the debugless read so we don't flood kernel log
-                * if IWL_DL_IO is set */
-               val = _iwl_read_direct32(priv, HBUS_TARG_MEM_RDAT);
-               if (val != le32_to_cpu(*image)) {
-                       IWL_ERR(priv, "uCode INST section is invalid at "
-                                 "offset 0x%x, is 0x%x, s/b 0x%x\n",
-                                 save_len - len, val, le32_to_cpu(*image));
-                       ret = -EIO;
-                       errcnt++;
-                       if (errcnt >= 20)
-                               break;
-               }
-       }
-       if (!errcnt)
-               IWL_DEBUG_INFO(priv,
-                   "ucode image in INSTRUCTION memory is good\n");
-       return ret;
- }
- /**
-  * iwl_verify_ucode - determine which instruction image is in SRAM,
-  *    and verify its contents
-  */
- int iwl_verify_ucode(struct iwl_priv *priv)
- {
-       __le32 *image;
-       u32 len;
-       int ret;
-       /* Try bootstrap */
-       image = (__le32 *)priv->ucode_boot.v_addr;
-       len = priv->ucode_boot.len;
-       ret = iwlcore_verify_inst_sparse(priv, image, len);
-       if (!ret) {
-               IWL_DEBUG_INFO(priv, "Bootstrap uCode is good in inst SRAM\n");
-               return 0;
-       }
-       /* Try initialize */
-       image = (__le32 *)priv->ucode_init.v_addr;
-       len = priv->ucode_init.len;
-       ret = iwlcore_verify_inst_sparse(priv, image, len);
-       if (!ret) {
-               IWL_DEBUG_INFO(priv, "Initialize uCode is good in inst SRAM\n");
-               return 0;
-       }
-       /* Try runtime/protocol */
-       image = (__le32 *)priv->ucode_code.v_addr;
-       len = priv->ucode_code.len;
-       ret = iwlcore_verify_inst_sparse(priv, image, len);
-       if (!ret) {
-               IWL_DEBUG_INFO(priv, "Runtime uCode is good in inst SRAM\n");
-               return 0;
-       }
-       IWL_ERR(priv, "NO VALID UCODE IMAGE IN INSTRUCTION SRAM!!\n");
-       /* Since nothing seems to match, show first several data entries in
-        * instruction SRAM, so maybe visual inspection will give a clue.
-        * Selection of bootstrap image (vs. other images) is arbitrary. */
-       image = (__le32 *)priv->ucode_boot.v_addr;
-       len = priv->ucode_boot.len;
-       ret = iwl_verify_inst_full(priv, image, len);
-       return ret;
- }
- EXPORT_SYMBOL(iwl_verify_ucode);
  void iwl_rf_kill_ct_config(struct iwl_priv *priv)
  {
        struct iwl_ct_kill_config cmd;
   *  Intel Linux Wireless <ilw@linux.intel.com>
   * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
   *****************************************************************************/
 +
 +#include <linux/slab.h>
 +#include <linux/kernel.h>
 +#include <linux/module.h>
 +#include <linux/debugfs.h>
 +
  #include <linux/ieee80211.h>
  #include <net/mac80211.h>
  
@@@ -106,27 -100,6 +106,6 @@@ static const struct file_operations iwl
        .open = iwl_dbgfs_open_file_generic,                            \
  };
  
- int iwl_dbgfs_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz)
- {
-       int p = 0;
-       p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n",
-                      le32_to_cpu(priv->statistics.flag));
-       if (le32_to_cpu(priv->statistics.flag) & UCODE_STATISTICS_CLEAR_MSK)
-               p += scnprintf(buf + p, bufsz - p,
-                              "\tStatistics have been cleared\n");
-       p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n",
-                      (le32_to_cpu(priv->statistics.flag) &
-                       UCODE_STATISTICS_FREQUENCY_MSK)
-                       ? "2.4 GHz" : "5.2 GHz");
-       p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n",
-                      (le32_to_cpu(priv->statistics.flag) &
-                       UCODE_STATISTICS_NARROW_BAND_MSK)
-                       ? "enabled" : "disabled");
-       return p;
- }
- EXPORT_SYMBOL(iwl_dbgfs_statistics_flag);
  static ssize_t iwl_dbgfs_tx_statistics_read(struct file *file,
                                                char __user *user_buf,
                                                size_t count, loff_t *ppos) {
@@@ -330,45 -303,35 +309,35 @@@ static ssize_t iwl_dbgfs_stations_read(
  
        for (i = 0; i < max_sta; i++) {
                station = &priv->stations[i];
-               if (station->used) {
-                       pos += scnprintf(buf + pos, bufsz - pos,
-                                       "station %d:\ngeneral data:\n", i+1);
-                       pos += scnprintf(buf + pos, bufsz - pos, "id: %u\n",
-                                       station->sta.sta.sta_id);
-                       pos += scnprintf(buf + pos, bufsz - pos, "mode: %u\n",
-                                       station->sta.mode);
-                       pos += scnprintf(buf + pos, bufsz - pos,
-                                       "flags: 0x%x\n",
-                                       station->sta.station_flags_msk);
-                       pos += scnprintf(buf + pos, bufsz - pos, "tid data:\n");
-                       pos += scnprintf(buf + pos, bufsz - pos,
-                                       "seq_num\t\ttxq_id");
-                       pos += scnprintf(buf + pos, bufsz - pos,
-                                       "\tframe_count\twait_for_ba\t");
-                       pos += scnprintf(buf + pos, bufsz - pos,
-                                       "start_idx\tbitmap0\t");
-                       pos += scnprintf(buf + pos, bufsz - pos,
-                                       "bitmap1\trate_n_flags");
-                       pos += scnprintf(buf + pos, bufsz - pos, "\n");
+               if (!station->used)
+                       continue;
+               pos += scnprintf(buf + pos, bufsz - pos,
+                                "station %d - addr: %pM, flags: %#x\n",
+                                i, station->sta.sta.addr,
+                                station->sta.station_flags_msk);
+               pos += scnprintf(buf + pos, bufsz - pos,
+                               "TID\tseq_num\ttxq_id\tframes\ttfds\t");
+               pos += scnprintf(buf + pos, bufsz - pos,
+                               "start_idx\tbitmap\t\t\trate_n_flags\n");
  
-                       for (j = 0; j < MAX_TID_COUNT; j++) {
-                               pos += scnprintf(buf + pos, bufsz - pos,
-                                               "[%d]:\t\t%u", j,
-                                               station->tid[j].seq_number);
-                               pos += scnprintf(buf + pos, bufsz - pos,
-                                               "\t%u\t\t%u\t\t%u\t\t",
-                                               station->tid[j].agg.txq_id,
-                                               station->tid[j].agg.frame_count,
-                                               station->tid[j].agg.wait_for_ba);
+               for (j = 0; j < MAX_TID_COUNT; j++) {
+                       pos += scnprintf(buf + pos, bufsz - pos,
+                               "%d:\t%#x\t%#x\t%u\t%u\t%u\t\t%#.16llx\t%#x",
+                               j, station->tid[j].seq_number,
+                               station->tid[j].agg.txq_id,
+                               station->tid[j].agg.frame_count,
+                               station->tid[j].tfds_in_queue,
+                               station->tid[j].agg.start_idx,
+                               station->tid[j].agg.bitmap,
+                               station->tid[j].agg.rate_n_flags);
+                       if (station->tid[j].agg.wait_for_ba)
                                pos += scnprintf(buf + pos, bufsz - pos,
-                                               "%u\t%llu\t%u",
-                                               station->tid[j].agg.start_idx,
-                                               (unsigned long long)station->tid[j].agg.bitmap,
-                                               station->tid[j].agg.rate_n_flags);
-                               pos += scnprintf(buf + pos, bufsz - pos, "\n");
-                       }
+                                                " - waitforba");
                        pos += scnprintf(buf + pos, bufsz - pos, "\n");
                }
+               pos += scnprintf(buf + pos, bufsz - pos, "\n");
        }
  
        ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
@@@ -28,7 -28,6 +28,7 @@@
   *****************************************************************************/
  
  #include <linux/etherdevice.h>
 +#include <linux/slab.h>
  #include <net/mac80211.h>
  #include <asm/unaligned.h>
  #include "iwl-eeprom.h"
@@@ -251,7 -250,7 +251,7 @@@ EXPORT_SYMBOL(iwl_rx_spectrum_measure_n
  static void iwl_rx_calc_noise(struct iwl_priv *priv)
  {
        struct statistics_rx_non_phy *rx_info
-                               = &(priv->statistics.rx.general);
+                               = &(priv->_agn.statistics.rx.general);
        int num_active_rx = 0;
        int total_silence = 0;
        int bcn_silence_a =
                        last_rx_noise);
  }
  
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
  /*
   *  based on the assumption of all statistics counter are in DWORD
   *  FIXME: This function is for debugging, do not deal with
@@@ -300,10 -299,10 +300,10 @@@ static void iwl_accumulative_statistics
        u32 *accum_stats;
        u32 *delta, *max_delta;
  
-       prev_stats = (__le32 *)&priv->statistics;
-       accum_stats = (u32 *)&priv->accum_statistics;
-       delta = (u32 *)&priv->delta_statistics;
-       max_delta = (u32 *)&priv->max_delta;
+       prev_stats = (__le32 *)&priv->_agn.statistics;
+       accum_stats = (u32 *)&priv->_agn.accum_statistics;
+       delta = (u32 *)&priv->_agn.delta_statistics;
+       max_delta = (u32 *)&priv->_agn.max_delta;
  
        for (i = sizeof(__le32); i < sizeof(struct iwl_notif_statistics);
             i += sizeof(__le32), stats++, prev_stats++, delta++,
        }
  
        /* reset accumulative statistics for "no-counter" type statistics */
-       priv->accum_statistics.general.temperature =
-               priv->statistics.general.temperature;
-       priv->accum_statistics.general.temperature_m =
-               priv->statistics.general.temperature_m;
-       priv->accum_statistics.general.ttl_timestamp =
-               priv->statistics.general.ttl_timestamp;
-       priv->accum_statistics.tx.tx_power.ant_a =
-               priv->statistics.tx.tx_power.ant_a;
-       priv->accum_statistics.tx.tx_power.ant_b =
-               priv->statistics.tx.tx_power.ant_b;
-       priv->accum_statistics.tx.tx_power.ant_c =
-               priv->statistics.tx.tx_power.ant_c;
+       priv->_agn.accum_statistics.general.temperature =
+               priv->_agn.statistics.general.temperature;
+       priv->_agn.accum_statistics.general.temperature_m =
+               priv->_agn.statistics.general.temperature_m;
+       priv->_agn.accum_statistics.general.ttl_timestamp =
+               priv->_agn.statistics.general.ttl_timestamp;
+       priv->_agn.accum_statistics.tx.tx_power.ant_a =
+               priv->_agn.statistics.tx.tx_power.ant_a;
+       priv->_agn.accum_statistics.tx.tx_power.ant_b =
+               priv->_agn.statistics.tx.tx_power.ant_b;
+       priv->_agn.accum_statistics.tx.tx_power.ant_c =
+               priv->_agn.statistics.tx.tx_power.ant_c;
  }
  #endif
  
@@@ -364,9 -363,9 +364,9 @@@ bool iwl_good_plcp_health(struct iwl_pr
        if (plcp_msec) {
                combined_plcp_delta =
                        (le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err) -
-                       le32_to_cpu(priv->statistics.rx.ofdm.plcp_err)) +
+                       le32_to_cpu(priv->_agn.statistics.rx.ofdm.plcp_err)) +
                        (le32_to_cpu(pkt->u.stats.rx.ofdm_ht.plcp_err) -
-                       le32_to_cpu(priv->statistics.rx.ofdm_ht.plcp_err));
+                       le32_to_cpu(priv->_agn.statistics.rx.ofdm_ht.plcp_err));
  
                if ((combined_plcp_delta > 0) &&
                    ((combined_plcp_delta * 100) / plcp_msec) >
                                "%u, %u, %u, %u, %d, %u mSecs\n",
                                priv->cfg->plcp_delta_threshold,
                                le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err),
-                               le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
+                               le32_to_cpu(priv->_agn.statistics.rx.ofdm.plcp_err),
                                le32_to_cpu(pkt->u.stats.rx.ofdm_ht.plcp_err),
                                le32_to_cpu(
-                                 priv->statistics.rx.ofdm_ht.plcp_err),
+                                 priv->_agn.statistics.rx.ofdm_ht.plcp_err),
                                combined_plcp_delta, plcp_msec);
                        rc = false;
                }
@@@ -439,21 -438,22 +439,22 @@@ void iwl_rx_statistics(struct iwl_priv 
  
  
        IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
-                    (int)sizeof(priv->statistics),
+                    (int)sizeof(priv->_agn.statistics),
                     le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
  
-       change = ((priv->statistics.general.temperature !=
+       change = ((priv->_agn.statistics.general.temperature !=
                   pkt->u.stats.general.temperature) ||
-                 ((priv->statistics.flag &
+                 ((priv->_agn.statistics.flag &
                    STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
                   (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
  
- #ifdef CONFIG_IWLWIFI_DEBUG
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
        iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
  #endif
        iwl_recover_from_statistics(priv, pkt);
  
-       memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
+       memcpy(&priv->_agn.statistics, &pkt->u.stats,
+               sizeof(priv->_agn.statistics));
  
        set_bit(STATUS_STATISTICS, &priv->status);
  
@@@ -480,12 -480,12 +481,12 @@@ void iwl_reply_statistics(struct iwl_pr
        struct iwl_rx_packet *pkt = rxb_addr(rxb);
  
        if (le32_to_cpu(pkt->u.stats.flag) & UCODE_STATISTICS_CLEAR_MSK) {
- #ifdef CONFIG_IWLWIFI_DEBUG
-               memset(&priv->accum_statistics, 0,
+ #ifdef CONFIG_IWLWIFI_DEBUGFS
+               memset(&priv->_agn.accum_statistics, 0,
                        sizeof(struct iwl_notif_statistics));
-               memset(&priv->delta_statistics, 0,
+               memset(&priv->_agn.delta_statistics, 0,
                        sizeof(struct iwl_notif_statistics));
-               memset(&priv->max_delta, 0,
+               memset(&priv->_agn.max_delta, 0,
                        sizeof(struct iwl_notif_statistics));
  #endif
                IWL_DEBUG_RX(priv, "Statistics have been cleared\n");
@@@ -311,10 -311,10 +311,10 @@@ int iwl_add_station_common(struct iwl_p
                                  struct ieee80211_sta_ht_cap *ht_info,
                                  u8 *sta_id_r)
  {
-       struct iwl_station_entry *station;
        unsigned long flags_spin;
        int ret = 0;
        u8 sta_id;
+       struct iwl_addsta_cmd sta_cmd;
  
        *sta_id_r = 0;
        spin_lock_irqsave(&priv->sta_lock, flags_spin);
        }
  
        priv->stations[sta_id].used |= IWL_STA_UCODE_INPROGRESS;
-       station = &priv->stations[sta_id];
+       memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
  
        /* Add station to device's station table */
-       ret = iwl_send_add_sta(priv, &station->sta, CMD_SYNC);
+       ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
        if (ret) {
-               IWL_ERR(priv, "Adding station %pM failed.\n", station->sta.sta.addr);
                spin_lock_irqsave(&priv->sta_lock, flags_spin);
+               IWL_ERR(priv, "Adding station %pM failed.\n",
+                       priv->stations[sta_id].sta.sta.addr);
                priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
                priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS;
                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
@@@ -431,7 -432,7 +432,7 @@@ int iwl_add_bssid_station(struct iwl_pr
        struct iwl_link_quality_cmd *link_cmd;
        unsigned long flags;
  
 -      if (*sta_id_r)
 +      if (sta_id_r)
                *sta_id_r = IWL_INVALID_STATION;
  
        ret = iwl_add_station_common(priv, addr, 0, NULL, &sta_id);
@@@ -488,7 -489,7 +489,7 @@@ static void iwl_sta_ucode_deactivate(st
  }
  
  static int iwl_send_remove_station(struct iwl_priv *priv,
-                                  struct iwl_station_entry *station)
+                                  const u8 *addr, int sta_id)
  {
        struct iwl_rx_packet *pkt;
        int ret;
  
        memset(&rm_sta_cmd, 0, sizeof(rm_sta_cmd));
        rm_sta_cmd.num_sta = 1;
-       memcpy(&rm_sta_cmd.addr, &station->sta.sta.addr , ETH_ALEN);
+       memcpy(&rm_sta_cmd.addr, addr, ETH_ALEN);
  
        cmd.flags |= CMD_WANT_SKB;
  
                switch (pkt->u.rem_sta.status) {
                case REM_STA_SUCCESS_MSK:
                        spin_lock_irqsave(&priv->sta_lock, flags_spin);
-                       iwl_sta_ucode_deactivate(priv, station->sta.sta.sta_id);
+                       iwl_sta_ucode_deactivate(priv, sta_id);
                        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
                        IWL_DEBUG_ASSOC(priv, "REPLY_REMOVE_STA PASSED\n");
                        break;
  int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id,
                       const u8 *addr)
  {
-       struct iwl_station_entry *station;
        unsigned long flags;
  
        if (!iwl_is_ready(priv)) {
  
        BUG_ON(priv->num_stations < 0);
  
-       station = &priv->stations[sta_id];
        spin_unlock_irqrestore(&priv->sta_lock, flags);
  
-       return iwl_send_remove_station(priv, station);
+       return iwl_send_remove_station(priv, addr, sta_id);
  out_err:
        spin_unlock_irqrestore(&priv->sta_lock, flags);
        return -EINVAL;
@@@ -643,11 -642,13 +642,13 @@@ EXPORT_SYMBOL(iwl_clear_ucode_stations)
   */
  void iwl_restore_stations(struct iwl_priv *priv)
  {
-       struct iwl_station_entry *station;
+       struct iwl_addsta_cmd sta_cmd;
+       struct iwl_link_quality_cmd lq;
        unsigned long flags_spin;
        int i;
        bool found = false;
        int ret;
+       bool send_lq;
  
        if (!iwl_is_ready(priv)) {
                IWL_DEBUG_INFO(priv, "Not ready yet, not restoring any stations.\n");
  
        for (i = 0; i < priv->hw_params.max_stations; i++) {
                if ((priv->stations[i].used & IWL_STA_UCODE_INPROGRESS)) {
+                       memcpy(&sta_cmd, &priv->stations[i].sta,
+                              sizeof(struct iwl_addsta_cmd));
+                       send_lq = false;
+                       if (priv->stations[i].lq) {
+                               memcpy(&lq, priv->stations[i].lq,
+                                      sizeof(struct iwl_link_quality_cmd));
+                               send_lq = true;
+                       }
                        spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
-                       station = &priv->stations[i];
-                       ret = iwl_send_add_sta(priv, &priv->stations[i].sta, CMD_SYNC);
+                       ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
                        if (ret) {
-                               IWL_ERR(priv, "Adding station %pM failed.\n",
-                                       station->sta.sta.addr);
                                spin_lock_irqsave(&priv->sta_lock, flags_spin);
+                               IWL_ERR(priv, "Adding station %pM failed.\n",
+                                       priv->stations[i].sta.sta.addr);
                                priv->stations[i].used &= ~IWL_STA_DRIVER_ACTIVE;
                                priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
                                spin_unlock_irqrestore(&priv->sta_lock, flags_spin);
                         * Rate scaling has already been initialized, send
                         * current LQ command
                         */
-                       if (station->lq)
-                               iwl_send_lq_cmd(priv, station->lq, CMD_SYNC, true);
+                       if (send_lq)
+                               iwl_send_lq_cmd(priv, &lq, CMD_SYNC, true);
                        spin_lock_irqsave(&priv->sta_lock, flags_spin);
                        priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
                }
@@@ -972,24 -980,16 +980,16 @@@ void iwl_update_tkip_key(struct iwl_pri
        unsigned long flags;
        int i;
  
-       if (sta) {
-               sta_id = iwl_sta_id(sta);
-               if (sta_id == IWL_INVALID_STATION) {
-                       IWL_DEBUG_MAC80211(priv, "leave - %pM not initialised.\n",
-                                          sta->addr);
-                       return;
-               }
-       } else
-               sta_id = priv->hw_params.bcast_sta_id;
        if (iwl_scan_cancel(priv)) {
                /* cancel scan failed, just live w/ bad key and rely
                   briefly on SW decryption */
                return;
        }
  
+       sta_id = iwl_sta_id_or_broadcast(priv, sta);
+       if (sta_id == IWL_INVALID_STATION)
+               return;
        spin_lock_irqsave(&priv->sta_lock, flags);
  
        priv->stations[sta_id].sta.key.tkip_rx_tsc_byte2 = (u8) iv32;
@@@ -1277,9 -1277,8 +1277,8 @@@ void iwl_sta_tx_modify_enable_tid(struc
        priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX;
        priv->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid));
        priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
-       spin_unlock_irqrestore(&priv->sta_lock, flags);
        iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
+       spin_unlock_irqrestore(&priv->sta_lock, flags);
  }
  EXPORT_SYMBOL(iwl_sta_tx_modify_enable_tid);
  
@@@ -1310,7 -1309,7 +1309,7 @@@ int iwl_sta_rx_agg_stop(struct iwl_pri
                        int tid)
  {
        unsigned long flags;
-       int sta_id;
+       int sta_id, ret;
  
        sta_id = iwl_sta_id(sta);
        if (sta_id == IWL_INVALID_STATION) {
        priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK;
        priv->stations[sta_id].sta.remove_immediate_ba_tid = (u8)tid;
        priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+       ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
        spin_unlock_irqrestore(&priv->sta_lock, flags);
  
-       return iwl_send_add_sta(priv, &priv->stations[sta_id].sta,
-                                       CMD_ASYNC);
+       return ret;
  }
  EXPORT_SYMBOL(iwl_sta_rx_agg_stop);
  
@@@ -1340,9 -1340,9 +1340,9 @@@ void iwl_sta_modify_ps_wake(struct iwl_
        priv->stations[sta_id].sta.sta.modify_mask = 0;
        priv->stations[sta_id].sta.sleep_tx_count = 0;
        priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+       iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
        spin_unlock_irqrestore(&priv->sta_lock, flags);
  
-       iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
  }
  EXPORT_SYMBOL(iwl_sta_modify_ps_wake);
  
@@@ -1357,9 -1357,9 +1357,9 @@@ void iwl_sta_modify_sleep_tx_count(stru
                                        STA_MODIFY_SLEEP_TX_COUNT_MSK;
        priv->stations[sta_id].sta.sleep_tx_count = cpu_to_le16(cnt);
        priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+       iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
        spin_unlock_irqrestore(&priv->sta_lock, flags);
  
-       iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
  }
  EXPORT_SYMBOL(iwl_sta_modify_sleep_tx_count);
  
@@@ -29,7 -29,6 +29,7 @@@
  
  #include <linux/etherdevice.h>
  #include <linux/sched.h>
 +#include <linux/slab.h>
  #include <net/mac80211.h>
  #include "iwl-eeprom.h"
  #include "iwl-dev.h"
@@@ -77,21 -76,6 +77,6 @@@ void iwl_txq_update_write_ptr(struct iw
  }
  EXPORT_SYMBOL(iwl_txq_update_write_ptr);
  
- void iwl_free_tfds_in_queue(struct iwl_priv *priv,
-                           int sta_id, int tid, int freed)
- {
-       if (priv->stations[sta_id].tid[tid].tfds_in_queue >= freed)
-               priv->stations[sta_id].tid[tid].tfds_in_queue -= freed;
-       else {
-               IWL_DEBUG_TX(priv, "free more than tfds_in_queue (%u:%d)\n",
-                       priv->stations[sta_id].tid[tid].tfds_in_queue,
-                       freed);
-               priv->stations[sta_id].tid[tid].tfds_in_queue = 0;
-       }
- }
- EXPORT_SYMBOL(iwl_free_tfds_in_queue);
  /**
   * iwl_tx_queue_free - Deallocate DMA queue.
   * @txq: Transmit queue to deallocate.
@@@ -31,7 -31,6 +31,7 @@@
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/pci.h>
 +#include <linux/slab.h>
  #include <linux/dma-mapping.h>
  #include <linux/delay.h>
  #include <linux/sched.h>
@@@ -197,6 -196,7 +197,7 @@@ static int iwl3945_set_wep_dynamic_key_
  static int iwl3945_clear_sta_key_info(struct iwl_priv *priv, u8 sta_id)
  {
        unsigned long flags;
+       struct iwl_addsta_cmd sta_cmd;
  
        spin_lock_irqsave(&priv->sta_lock, flags);
        memset(&priv->stations[sta_id].keyinfo, 0, sizeof(struct iwl_hw_key));
        priv->stations[sta_id].sta.key.key_flags = STA_KEY_FLG_NO_ENC;
        priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
        priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+       memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
        spin_unlock_irqrestore(&priv->sta_lock, flags);
  
        IWL_DEBUG_INFO(priv, "hwcrypto: clear ucode station key info\n");
-       iwl_send_add_sta(priv, &priv->stations[sta_id].sta, 0);
-       return 0;
+       return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
  }
  
  static int iwl3945_set_dynamic_key(struct iwl_priv *priv,
@@@ -474,10 -474,8 +475,8 @@@ static int iwl3945_tx_skb(struct iwl_pr
        u8 unicast;
        u8 sta_id;
        u8 tid = 0;
-       u16 seq_number = 0;
        __le16 fc;
        u8 wait_write_ptr = 0;
-       u8 *qc = NULL;
        unsigned long flags;
  
        spin_lock_irqsave(&priv->lock, flags);
        hdr_len = ieee80211_hdrlen(fc);
  
        /* Find index into station table for destination station */
-       if (!info->control.sta)
-               sta_id = priv->hw_params.bcast_sta_id;
-       else
-               sta_id = iwl_sta_id(info->control.sta);
+       sta_id = iwl_sta_id_or_broadcast(priv, info->control.sta);
        if (sta_id == IWL_INVALID_STATION) {
                IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
                               hdr->addr1);
        IWL_DEBUG_RATE(priv, "station Id %d\n", sta_id);
  
        if (ieee80211_is_data_qos(fc)) {
-               qc = ieee80211_get_qos_ctl(hdr);
+               u8 *qc = ieee80211_get_qos_ctl(hdr);
                tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
                if (unlikely(tid >= MAX_TID_COUNT))
                        goto drop;
-               seq_number = priv->stations[sta_id].tid[tid].seq_number &
-                               IEEE80211_SCTL_SEQ;
-               hdr->seq_ctrl = cpu_to_le16(seq_number) |
-                       (hdr->seq_ctrl &
-                               cpu_to_le16(IEEE80211_SCTL_FRAG));
-               seq_number += 0x10;
        }
  
        /* Descriptor for chosen Tx queue */
  
        if (!ieee80211_has_morefrags(hdr->frame_control)) {
                txq->need_update = 1;
-               if (qc)
-                       priv->stations[sta_id].tid[tid].seq_number = seq_number;
        } else {
                wait_write_ptr = 1;
                txq->need_update = 0;
@@@ -848,6 -835,7 +836,6 @@@ static void iwl3945_rx_reply_add_sta(st
  #endif
  
        IWL_DEBUG_RX(priv, "Received REPLY_ADD_STA: 0x%02X\n", pkt->u.status);
 -      return;
  }
  
  static void iwl3945_bg_beacon_update(struct work_struct *work)
@@@ -3108,19 -3096,16 +3096,16 @@@ void iwl3945_post_associate(struct iwl_
        IWL_DEBUG_ASSOC(priv, "assoc id %d beacon interval %d\n",
                        vif->bss_conf.aid, vif->bss_conf.beacon_int);
  
-       if (vif->bss_conf.assoc_capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
+       if (vif->bss_conf.use_short_preamble)
                priv->staging_rxon.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
        else
                priv->staging_rxon.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
  
        if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) {
-               if (vif->bss_conf.assoc_capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
+               if (vif->bss_conf.use_short_slot)
                        priv->staging_rxon.flags |= RXON_FLG_SHORT_SLOT_MSK;
                else
                        priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
-               if (vif->type == NL80211_IFTYPE_ADHOC)
-                       priv->staging_rxon.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
        }
  
        iwlcore_commit_rxon(priv);
@@@ -3284,8 -3269,7 +3269,7 @@@ void iwl3945_config_ap(struct iwl_priv 
  
                priv->staging_rxon.assoc_id = 0;
  
-               if (vif->bss_conf.assoc_capability &
-                                       WLAN_CAPABILITY_SHORT_PREAMBLE)
+               if (vif->bss_conf.use_short_preamble)
                        priv->staging_rxon.flags |=
                                RXON_FLG_SHORT_PREAMBLE_MSK;
                else
                                ~RXON_FLG_SHORT_PREAMBLE_MSK;
  
                if (priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) {
-                       if (vif->bss_conf.assoc_capability &
-                                       WLAN_CAPABILITY_SHORT_SLOT_TIME)
+                       if (vif->bss_conf.use_short_slot)
                                priv->staging_rxon.flags |=
                                        RXON_FLG_SHORT_SLOT_MSK;
                        else
                                priv->staging_rxon.flags &=
                                        ~RXON_FLG_SHORT_SLOT_MSK;
-                       if (vif->type == NL80211_IFTYPE_ADHOC)
-                               priv->staging_rxon.flags &=
-                                       ~RXON_FLG_SHORT_SLOT_MSK;
                }
                /* restore RXON assoc */
                priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
@@@ -3336,17 -3315,9 +3315,9 @@@ static int iwl3945_mac_set_key(struct i
        static_key = !iwl_is_associated(priv);
  
        if (!static_key) {
-               if (!sta) {
-                       sta_id = priv->hw_params.bcast_sta_id;
-               } else {
-                       sta_id = iwl_sta_id(sta);
-                       if (sta_id == IWL_INVALID_STATION) {
-                               IWL_DEBUG_MAC80211(priv,
-                                                  "leave - %pM not in station map.\n",
-                                                  sta->addr);
-                               return -EINVAL;
-                       }
-               }
+               sta_id = iwl_sta_id_or_broadcast(priv, sta);
+               if (sta_id == IWL_INVALID_STATION)
+                       return -EINVAL;
        }
  
        mutex_lock(&priv->mutex);