diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-1000.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-2000.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rxon.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-sta.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 26 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-hcmd.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-pci.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 25 |
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 | ||
67 | static void iwl2000_set_ct_threshold(struct iwl_priv *priv) | 68 | static 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 */ |
64 | static void iwl5000_nic_config(struct iwl_priv *priv) | 65 | static 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 | ||
70 | static void iwl6000_set_ct_threshold(struct iwl_priv *priv) | 71 | static 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 | ||
37 | static struct iwl_link_quality_cmd * | 37 | static struct iwl_link_quality_cmd * |
38 | iwl_sta_alloc_lq(struct iwl_priv *priv, u8 sta_id) | 38 | iwl_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 | */ |
577 | static int iwl_update_bcast_station(struct iwl_priv *priv, | 582 | int 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, | |||
304 | int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, | 304 | int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, |
305 | int tid); | 305 | int tid); |
306 | void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt); | 306 | void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt); |
307 | int iwl_update_bcast_station(struct iwl_priv *priv, | ||
308 | struct iwl_rxon_context *ctx); | ||
307 | int iwl_update_bcast_stations(struct iwl_priv *priv); | 309 | int iwl_update_bcast_stations(struct iwl_priv *priv); |
308 | void iwlagn_mac_sta_notify(struct ieee80211_hw *hw, | 310 | void 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 | ||
529 | u8 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 | |||
542 | static void _iwl_set_rxon_ht(struct iwl_priv *priv, | 529 | static 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); | |||
409 | int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force); | 409 | int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force); |
410 | 410 | ||
411 | /******************************************************************************* | 411 | /******************************************************************************* |
412 | * Rate | ||
413 | ******************************************************************************/ | ||
414 | |||
415 | u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv, | ||
416 | struct iwl_rxon_context *ctx); | ||
417 | |||
418 | /******************************************************************************* | ||
419 | * Scanning | 412 | * Scanning |
420 | ******************************************************************************/ | 413 | ******************************************************************************/ |
421 | void iwl_init_scan_params(struct iwl_priv *priv); | 414 | void 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 | ||
118 | static void iwl_generic_cmd_callback(struct iwl_priv *priv, | 118 | static 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) | |||
496 | static void __devexit iwl_pci_remove(struct pci_dev *pdev) | 494 | static 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 | ||
533 | static const struct dev_pm_ops iwl_dev_pm_ops = { | 528 | static 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 | ||
128 | static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta, | 128 | static 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: | |||
534 | void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq, | 533 | void 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) { |