aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-2000.c7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-rxon.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-sta.c17
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c26
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c16
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-hcmd.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-pci.c20
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-tx.c25
13 files changed, 69 insertions, 74 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 2daca80f086f..e57fad9f1f09 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -34,6 +34,7 @@
34#include <net/mac80211.h> 34#include <net/mac80211.h>
35#include <linux/etherdevice.h> 35#include <linux/etherdevice.h>
36#include <asm/unaligned.h> 36#include <asm/unaligned.h>
37#include <linux/stringify.h>
37 38
38#include "iwl-eeprom.h" 39#include "iwl-eeprom.h"
39#include "iwl-dev.h" 40#include "iwl-dev.h"
@@ -53,10 +54,10 @@
53#define IWL100_UCODE_API_MIN 5 54#define IWL100_UCODE_API_MIN 5
54 55
55#define IWL1000_FW_PRE "iwlwifi-1000-" 56#define IWL1000_FW_PRE "iwlwifi-1000-"
56#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE #api ".ucode" 57#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE __stringify(api) ".ucode"
57 58
58#define IWL100_FW_PRE "iwlwifi-100-" 59#define IWL100_FW_PRE "iwlwifi-100-"
59#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE #api ".ucode" 60#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE __stringify(api) ".ucode"
60 61
61 62
62/* 63/*
diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c
index 1c1330035ca9..64ed1f247df0 100644
--- a/drivers/net/wireless/iwlwifi/iwl-2000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-2000.c
@@ -34,6 +34,7 @@
34#include <net/mac80211.h> 34#include <net/mac80211.h>
35#include <linux/etherdevice.h> 35#include <linux/etherdevice.h>
36#include <asm/unaligned.h> 36#include <asm/unaligned.h>
37#include <linux/stringify.h>
37 38
38#include "iwl-eeprom.h" 39#include "iwl-eeprom.h"
39#include "iwl-dev.h" 40#include "iwl-dev.h"
@@ -56,13 +57,13 @@
56#define IWL105_UCODE_API_MIN 5 57#define IWL105_UCODE_API_MIN 5
57 58
58#define IWL2030_FW_PRE "iwlwifi-2030-" 59#define IWL2030_FW_PRE "iwlwifi-2030-"
59#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE #api ".ucode" 60#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE __stringify(api) ".ucode"
60 61
61#define IWL2000_FW_PRE "iwlwifi-2000-" 62#define IWL2000_FW_PRE "iwlwifi-2000-"
62#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE #api ".ucode" 63#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE __stringify(api) ".ucode"
63 64
64#define IWL105_FW_PRE "iwlwifi-105-" 65#define IWL105_FW_PRE "iwlwifi-105-"
65#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE #api ".ucode" 66#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE __stringify(api) ".ucode"
66 67
67static void iwl2000_set_ct_threshold(struct iwl_priv *priv) 68static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
68{ 69{
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index 937a8f12afa7..269dfdb9fe1a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -35,6 +35,7 @@
35#include <net/mac80211.h> 35#include <net/mac80211.h>
36#include <linux/etherdevice.h> 36#include <linux/etherdevice.h>
37#include <asm/unaligned.h> 37#include <asm/unaligned.h>
38#include <linux/stringify.h>
38 39
39#include "iwl-eeprom.h" 40#include "iwl-eeprom.h"
40#include "iwl-dev.h" 41#include "iwl-dev.h"
@@ -55,10 +56,10 @@
55#define IWL5150_UCODE_API_MIN 1 56#define IWL5150_UCODE_API_MIN 1
56 57
57#define IWL5000_FW_PRE "iwlwifi-5000-" 58#define IWL5000_FW_PRE "iwlwifi-5000-"
58#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE #api ".ucode" 59#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE __stringify(api) ".ucode"
59 60
60#define IWL5150_FW_PRE "iwlwifi-5150-" 61#define IWL5150_FW_PRE "iwlwifi-5150-"
61#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE #api ".ucode" 62#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE __stringify(api) ".ucode"
62 63
63/* NIC configuration for 5000 series */ 64/* NIC configuration for 5000 series */
64static void iwl5000_nic_config(struct iwl_priv *priv) 65static void iwl5000_nic_config(struct iwl_priv *priv)
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index 3fcc0925d542..f1c1db76b9da 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -34,6 +34,7 @@
34#include <net/mac80211.h> 34#include <net/mac80211.h>
35#include <linux/etherdevice.h> 35#include <linux/etherdevice.h>
36#include <asm/unaligned.h> 36#include <asm/unaligned.h>
37#include <linux/stringify.h>
37 38
38#include "iwl-eeprom.h" 39#include "iwl-eeprom.h"
39#include "iwl-dev.h" 40#include "iwl-dev.h"
@@ -56,16 +57,16 @@
56#define IWL6000G2_UCODE_API_MIN 4 57#define IWL6000G2_UCODE_API_MIN 4
57 58
58#define IWL6000_FW_PRE "iwlwifi-6000-" 59#define IWL6000_FW_PRE "iwlwifi-6000-"
59#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode" 60#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
60 61
61#define IWL6050_FW_PRE "iwlwifi-6050-" 62#define IWL6050_FW_PRE "iwlwifi-6050-"
62#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode" 63#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode"
63 64
64#define IWL6005_FW_PRE "iwlwifi-6000g2a-" 65#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
65#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE #api ".ucode" 66#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode"
66 67
67#define IWL6030_FW_PRE "iwlwifi-6000g2b-" 68#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
68#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE #api ".ucode" 69#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode"
69 70
70static void iwl6000_set_ct_threshold(struct iwl_priv *priv) 71static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
71{ 72{
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
index a7c66c4e5f2a..8fa43d427811 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
@@ -210,6 +210,8 @@ static int iwlagn_rxon_disconn(struct iwl_priv *priv,
210 * keys, so we have to restore those afterwards. 210 * keys, so we have to restore those afterwards.
211 */ 211 */
212 iwl_clear_ucode_stations(priv, ctx); 212 iwl_clear_ucode_stations(priv, ctx);
213 /* update -- might need P2P now */
214 iwl_update_bcast_station(priv, ctx);
213 iwl_restore_stations(priv, ctx); 215 iwl_restore_stations(priv, ctx);
214 ret = iwl_restore_default_wep_keys(priv, ctx); 216 ret = iwl_restore_default_wep_keys(priv, ctx);
215 if (ret) { 217 if (ret) {
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
index 0bd722cee5ae..9b32f83f0b7f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-sta.c
@@ -35,7 +35,7 @@
35#include "iwl-agn.h" 35#include "iwl-agn.h"
36 36
37static struct iwl_link_quality_cmd * 37static struct iwl_link_quality_cmd *
38iwl_sta_alloc_lq(struct iwl_priv *priv, u8 sta_id) 38iwl_sta_alloc_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, u8 sta_id)
39{ 39{
40 int i, r; 40 int i, r;
41 struct iwl_link_quality_cmd *link_cmd; 41 struct iwl_link_quality_cmd *link_cmd;
@@ -47,10 +47,15 @@ iwl_sta_alloc_lq(struct iwl_priv *priv, u8 sta_id)
47 IWL_ERR(priv, "Unable to allocate memory for LQ cmd.\n"); 47 IWL_ERR(priv, "Unable to allocate memory for LQ cmd.\n");
48 return NULL; 48 return NULL;
49 } 49 }
50
51 lockdep_assert_held(&priv->mutex);
52
50 /* Set up the rate scaling to start at selected rate, fall back 53 /* Set up the rate scaling to start at selected rate, fall back
51 * all the way down to 1M in IEEE order, and then spin on 1M */ 54 * all the way down to 1M in IEEE order, and then spin on 1M */
52 if (priv->band == IEEE80211_BAND_5GHZ) 55 if (priv->band == IEEE80211_BAND_5GHZ)
53 r = IWL_RATE_6M_INDEX; 56 r = IWL_RATE_6M_INDEX;
57 else if (ctx && ctx->vif && ctx->vif->p2p)
58 r = IWL_RATE_6M_INDEX;
54 else 59 else
55 r = IWL_RATE_1M_INDEX; 60 r = IWL_RATE_1M_INDEX;
56 61
@@ -115,7 +120,7 @@ int iwlagn_add_bssid_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx
115 spin_unlock_irqrestore(&priv->sta_lock, flags); 120 spin_unlock_irqrestore(&priv->sta_lock, flags);
116 121
117 /* Set up default rate scaling table in device's station table */ 122 /* Set up default rate scaling table in device's station table */
118 link_cmd = iwl_sta_alloc_lq(priv, sta_id); 123 link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
119 if (!link_cmd) { 124 if (!link_cmd) {
120 IWL_ERR(priv, "Unable to initialize rate scaling for station %pM.\n", 125 IWL_ERR(priv, "Unable to initialize rate scaling for station %pM.\n",
121 addr); 126 addr);
@@ -554,7 +559,7 @@ int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
554 priv->stations[sta_id].used |= IWL_STA_BCAST; 559 priv->stations[sta_id].used |= IWL_STA_BCAST;
555 spin_unlock_irqrestore(&priv->sta_lock, flags); 560 spin_unlock_irqrestore(&priv->sta_lock, flags);
556 561
557 link_cmd = iwl_sta_alloc_lq(priv, sta_id); 562 link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
558 if (!link_cmd) { 563 if (!link_cmd) {
559 IWL_ERR(priv, 564 IWL_ERR(priv,
560 "Unable to initialize rate scaling for bcast station.\n"); 565 "Unable to initialize rate scaling for bcast station.\n");
@@ -574,14 +579,14 @@ int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
574 * Only used by iwlagn. Placed here to have all bcast station management 579 * Only used by iwlagn. Placed here to have all bcast station management
575 * code together. 580 * code together.
576 */ 581 */
577static int iwl_update_bcast_station(struct iwl_priv *priv, 582int iwl_update_bcast_station(struct iwl_priv *priv,
578 struct iwl_rxon_context *ctx) 583 struct iwl_rxon_context *ctx)
579{ 584{
580 unsigned long flags; 585 unsigned long flags;
581 struct iwl_link_quality_cmd *link_cmd; 586 struct iwl_link_quality_cmd *link_cmd;
582 u8 sta_id = ctx->bcast_sta_id; 587 u8 sta_id = ctx->bcast_sta_id;
583 588
584 link_cmd = iwl_sta_alloc_lq(priv, sta_id); 589 link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
585 if (!link_cmd) { 590 if (!link_cmd) {
586 IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n"); 591 IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n");
587 return -ENOMEM; 592 return -ENOMEM;
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 77ceb8deff75..e2f6b2ab0d45 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -132,6 +132,7 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
132 struct iwl_host_cmd cmd = { 132 struct iwl_host_cmd cmd = {
133 .id = REPLY_TX_BEACON, 133 .id = REPLY_TX_BEACON,
134 }; 134 };
135 struct ieee80211_tx_info *info;
135 u32 frame_size; 136 u32 frame_size;
136 u32 rate_flags; 137 u32 rate_flags;
137 u32 rate; 138 u32 rate;
@@ -172,14 +173,31 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
172 frame_size); 173 frame_size);
173 174
174 /* Set up packet rate and flags */ 175 /* Set up packet rate and flags */
175 rate = iwl_rate_get_lowest_plcp(priv, priv->beacon_ctx); 176 info = IEEE80211_SKB_CB(priv->beacon_skb);
177
178 /*
179 * Let's set up the rate at least somewhat correctly;
180 * it will currently not actually be used by the uCode,
181 * it uses the broadcast station's rate instead.
182 */
183 if (info->control.rates[0].idx < 0 ||
184 info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
185 rate = 0;
186 else
187 rate = info->control.rates[0].idx;
188
176 priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant, 189 priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
177 priv->hw_params.valid_tx_ant); 190 priv->hw_params.valid_tx_ant);
178 rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant); 191 rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
179 if ((rate >= IWL_FIRST_CCK_RATE) && (rate <= IWL_LAST_CCK_RATE)) 192
193 /* In mac80211, rates for 5 GHz start at 0 */
194 if (info->band == IEEE80211_BAND_5GHZ)
195 rate += IWL_FIRST_OFDM_RATE;
196 else if (rate >= IWL_FIRST_CCK_RATE && rate <= IWL_LAST_CCK_RATE)
180 rate_flags |= RATE_MCS_CCK_MSK; 197 rate_flags |= RATE_MCS_CCK_MSK;
181 tx_beacon_cmd->tx.rate_n_flags = iwl_hw_set_rate_n_flags(rate, 198
182 rate_flags); 199 tx_beacon_cmd->tx.rate_n_flags =
200 iwl_hw_set_rate_n_flags(rate, rate_flags);
183 201
184 /* Submit command */ 202 /* Submit command */
185 cmd.len[0] = sizeof(*tx_beacon_cmd); 203 cmd.len[0] = sizeof(*tx_beacon_cmd);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
index 6d5584ae5ebf..dcdf2259520f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
@@ -304,6 +304,8 @@ int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
304int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, 304int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
305 int tid); 305 int tid);
306void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt); 306void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt);
307int iwl_update_bcast_station(struct iwl_priv *priv,
308 struct iwl_rxon_context *ctx);
307int iwl_update_bcast_stations(struct iwl_priv *priv); 309int iwl_update_bcast_stations(struct iwl_priv *priv);
308void iwlagn_mac_sta_notify(struct ieee80211_hw *hw, 310void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
309 struct ieee80211_vif *vif, 311 struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index cde725326c32..7f16d1203057 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -526,19 +526,6 @@ int iwl_full_rxon_required(struct iwl_priv *priv,
526 return 0; 526 return 0;
527} 527}
528 528
529u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv,
530 struct iwl_rxon_context *ctx)
531{
532 /*
533 * Assign the lowest rate -- should really get this from
534 * the beacon skb from mac80211.
535 */
536 if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK)
537 return IWL_RATE_1M_PLCP;
538 else
539 return IWL_RATE_6M_PLCP;
540}
541
542static void _iwl_set_rxon_ht(struct iwl_priv *priv, 529static void _iwl_set_rxon_ht(struct iwl_priv *priv,
543 struct iwl_ht_config *ht_conf, 530 struct iwl_ht_config *ht_conf,
544 struct iwl_rxon_context *ctx) 531 struct iwl_rxon_context *ctx)
@@ -1717,6 +1704,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1717 struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif); 1704 struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
1718 struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 1705 struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
1719 struct iwl_rxon_context *tmp; 1706 struct iwl_rxon_context *tmp;
1707 enum nl80211_iftype newviftype = newtype;
1720 u32 interface_modes; 1708 u32 interface_modes;
1721 int err; 1709 int err;
1722 1710
@@ -1772,7 +1760,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1772 1760
1773 /* success */ 1761 /* success */
1774 iwl_teardown_interface(priv, vif, true); 1762 iwl_teardown_interface(priv, vif, true);
1775 vif->type = newtype; 1763 vif->type = newviftype;
1776 vif->p2p = newp2p; 1764 vif->p2p = newp2p;
1777 err = iwl_setup_interface(priv, ctx); 1765 err = iwl_setup_interface(priv, ctx);
1778 WARN_ON(err); 1766 WARN_ON(err);
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index adf9f9b2efb5..f881678be762 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -409,13 +409,6 @@ void iwl_setup_watchdog(struct iwl_priv *priv);
409int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force); 409int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force);
410 410
411/******************************************************************************* 411/*******************************************************************************
412 * Rate
413 ******************************************************************************/
414
415u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv,
416 struct iwl_rxon_context *ctx);
417
418/*******************************************************************************
419 * Scanning 412 * Scanning
420 ******************************************************************************/ 413 ******************************************************************************/
421void iwl_init_scan_params(struct iwl_priv *priv); 414void iwl_init_scan_params(struct iwl_priv *priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-hcmd.c
index 7cdb1ec73b54..e3e5fb614178 100644
--- a/drivers/net/wireless/iwlwifi/iwl-hcmd.c
+++ b/drivers/net/wireless/iwlwifi/iwl-hcmd.c
@@ -113,7 +113,7 @@ const char *get_cmd_string(u8 cmd)
113 } 113 }
114} 114}
115 115
116#define HOST_COMPLETE_TIMEOUT (HZ / 2) 116#define HOST_COMPLETE_TIMEOUT (2 * HZ)
117 117
118static void iwl_generic_cmd_callback(struct iwl_priv *priv, 118static void iwl_generic_cmd_callback(struct iwl_priv *priv,
119 struct iwl_device_cmd *cmd, 119 struct iwl_device_cmd *cmd,
diff --git a/drivers/net/wireless/iwlwifi/iwl-pci.c b/drivers/net/wireless/iwlwifi/iwl-pci.c
index 7328fbff7f7b..3b5844b60e7c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-pci.c
+++ b/drivers/net/wireless/iwlwifi/iwl-pci.c
@@ -383,7 +383,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
383{ 383{
384 struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data); 384 struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
385 struct iwl_pci_bus *bus; 385 struct iwl_pci_bus *bus;
386 u8 rev_id;
387 u16 pci_cmd; 386 u16 pci_cmd;
388 int err; 387 int err;
389 388
@@ -440,8 +439,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
440 (unsigned long long) pci_resource_len(pdev, 0)); 439 (unsigned long long) pci_resource_len(pdev, 0));
441 pr_info("pci_resource_base = %p\n", bus->hw_base); 440 pr_info("pci_resource_base = %p\n", bus->hw_base);
442 441
443 pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id); 442 pr_info("HW Revision ID = 0x%X\n", pdev->revision);
444 pr_info("HW Revision ID = 0x%X\n", rev_id);
445 443
446 /* We disable the RETRY_TIMEOUT register (0x41) to keep 444 /* We disable the RETRY_TIMEOUT register (0x41) to keep
447 * PCI Tx retries from interfering with C3 CPU state */ 445 * PCI Tx retries from interfering with C3 CPU state */
@@ -496,14 +494,11 @@ static void iwl_pci_down(void *bus)
496static void __devexit iwl_pci_remove(struct pci_dev *pdev) 494static void __devexit iwl_pci_remove(struct pci_dev *pdev)
497{ 495{
498 struct iwl_priv *priv = pci_get_drvdata(pdev); 496 struct iwl_priv *priv = pci_get_drvdata(pdev);
499 497 void *bus_specific = priv->bus.bus_specific;
500 /* This can happen if probe failed */
501 if (unlikely(!priv))
502 return;
503 498
504 iwl_remove(priv); 499 iwl_remove(priv);
505 500
506 iwl_pci_down(IWL_BUS_GET_PCI_BUS(&priv->bus)); 501 iwl_pci_down(bus_specific);
507} 502}
508 503
509#ifdef CONFIG_PM 504#ifdef CONFIG_PM
@@ -530,14 +525,7 @@ static int iwl_pci_resume(struct device *device)
530 return iwl_resume(priv); 525 return iwl_resume(priv);
531} 526}
532 527
533static const struct dev_pm_ops iwl_dev_pm_ops = { 528static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume);
534 .suspend = iwl_pci_suspend,
535 .resume = iwl_pci_resume,
536 .freeze = iwl_pci_suspend,
537 .thaw = iwl_pci_resume,
538 .poweroff = iwl_pci_suspend,
539 .restore = iwl_pci_resume,
540};
541 529
542#define IWL_PM_OPS (&iwl_dev_pm_ops) 530#define IWL_PM_OPS (&iwl_dev_pm_ops)
543 531
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
index fd8aee9972c1..e72d2279fc5d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
@@ -126,7 +126,7 @@ static inline u8 iwl_tfd_get_num_tbs(struct iwl_tfd *tfd)
126} 126}
127 127
128static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta, 128static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
129 struct iwl_tfd *tfd) 129 struct iwl_tfd *tfd, enum dma_data_direction dma_dir)
130{ 130{
131 int i; 131 int i;
132 int num_tbs; 132 int num_tbs;
@@ -150,7 +150,7 @@ static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
150 /* Unmap chunks, if any. */ 150 /* Unmap chunks, if any. */
151 for (i = 1; i < num_tbs; i++) 151 for (i = 1; i < num_tbs; i++)
152 dma_unmap_single(priv->bus.dev, iwl_tfd_tb_get_addr(tfd, i), 152 dma_unmap_single(priv->bus.dev, iwl_tfd_tb_get_addr(tfd, i),
153 iwl_tfd_tb_get_len(tfd, i), DMA_TO_DEVICE); 153 iwl_tfd_tb_get_len(tfd, i), dma_dir);
154} 154}
155 155
156/** 156/**
@@ -166,7 +166,8 @@ void iwlagn_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
166 struct iwl_tfd *tfd_tmp = txq->tfds; 166 struct iwl_tfd *tfd_tmp = txq->tfds;
167 int index = txq->q.read_ptr; 167 int index = txq->q.read_ptr;
168 168
169 iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index]); 169 iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index],
170 DMA_TO_DEVICE);
170 171
171 /* free SKB */ 172 /* free SKB */
172 if (txq->txb) { 173 if (txq->txb) {
@@ -309,9 +310,7 @@ void iwl_cmd_queue_unmap(struct iwl_priv *priv)
309 i = get_cmd_index(q, q->read_ptr); 310 i = get_cmd_index(q, q->read_ptr);
310 311
311 if (txq->meta[i].flags & CMD_MAPPED) { 312 if (txq->meta[i].flags & CMD_MAPPED) {
312 dma_unmap_single(priv->bus.dev, 313 iwlagn_unmap_tfd(priv, &txq->meta[i], &txq->tfds[i],
313 dma_unmap_addr(&txq->meta[i], mapping),
314 dma_unmap_len(&txq->meta[i], len),
315 DMA_BIDIRECTIONAL); 314 DMA_BIDIRECTIONAL);
316 txq->meta[i].flags = 0; 315 txq->meta[i].flags = 0;
317 } 316 }
@@ -534,12 +533,7 @@ out_free_arrays:
534void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq, 533void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
535 int slots_num, u32 txq_id) 534 int slots_num, u32 txq_id)
536{ 535{
537 int actual_slots = slots_num; 536 memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * slots_num);
538
539 if (txq_id == priv->cmd_queue)
540 actual_slots++;
541
542 memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * actual_slots);
543 537
544 txq->need_update = 0; 538 txq->need_update = 0;
545 539
@@ -699,10 +693,11 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
699 if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY)) 693 if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
700 continue; 694 continue;
701 phys_addr = dma_map_single(priv->bus.dev, (void *)cmd->data[i], 695 phys_addr = dma_map_single(priv->bus.dev, (void *)cmd->data[i],
702 cmd->len[i], DMA_TO_DEVICE); 696 cmd->len[i], DMA_BIDIRECTIONAL);
703 if (dma_mapping_error(priv->bus.dev, phys_addr)) { 697 if (dma_mapping_error(priv->bus.dev, phys_addr)) {
704 iwlagn_unmap_tfd(priv, out_meta, 698 iwlagn_unmap_tfd(priv, out_meta,
705 &txq->tfds[q->write_ptr]); 699 &txq->tfds[q->write_ptr],
700 DMA_BIDIRECTIONAL);
706 idx = -ENOMEM; 701 idx = -ENOMEM;
707 goto out; 702 goto out;
708 } 703 }
@@ -806,7 +801,7 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
806 cmd = txq->cmd[cmd_index]; 801 cmd = txq->cmd[cmd_index];
807 meta = &txq->meta[cmd_index]; 802 meta = &txq->meta[cmd_index];
808 803
809 iwlagn_unmap_tfd(priv, meta, &txq->tfds[index]); 804 iwlagn_unmap_tfd(priv, meta, &txq->tfds[index], DMA_BIDIRECTIONAL);
810 805
811 /* Input error checking is done when commands are added to queue. */ 806 /* Input error checking is done when commands are added to queue. */
812 if (meta->flags & CMD_WANT_SKB) { 807 if (meta->flags & CMD_WANT_SKB) {