aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Halperin <dhalperi@cs.washington.edu>2010-06-14 16:10:29 -0400
committerReinette Chatre <reinette.chatre@intel.com>2010-06-25 17:53:49 -0400
commit278c2f6faafebe28b9776918ce5fbaef9795c141 (patch)
tree1638c2ca7928658f850acc40950fb78af3ff0be5 /drivers
parent680788aca3dcc24b932eb7a4219ab921ac5bf2d0 (diff)
iwlwifi: update LQ for bcast station on channel change
The rate table in the bcast LQ is computed only when the station is allocated, and chooses the lowest rate for the band. Because of when this occurs, this is the 2.4 GHz band and uses the 0x420a (CCK, 1 Mbps) rate. In 5 GHz beaconing mode, this rate will prevent beacons from being sent and any other packets from being received. We can fix this by re-initializing the bcast station's LQ command when the channel is changed. Signed-off-by: Daniel Halperin <dhalperi@cs.washington.edu> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.c30
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.h1
8 files changed, 40 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 24743b97ba35..1daf159914ad 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -217,6 +217,7 @@ static struct iwl_lib_ops iwl1000_lib = {
217 .set_ct_kill = iwl1000_set_ct_threshold, 217 .set_ct_kill = iwl1000_set_ct_threshold,
218 }, 218 },
219 .manage_ibss_station = iwlagn_manage_ibss_station, 219 .manage_ibss_station = iwlagn_manage_ibss_station,
220 .update_bcast_station = iwl_update_bcast_station,
220 .debugfs_ops = { 221 .debugfs_ops = {
221 .rx_stats_read = iwl_ucode_rx_stats_read, 222 .rx_stats_read = iwl_ucode_rx_stats_read,
222 .tx_stats_read = iwl_ucode_tx_stats_read, 223 .tx_stats_read = iwl_ucode_tx_stats_read,
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 67526a1be025..1dd3bc4c107e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -2280,6 +2280,7 @@ static struct iwl_lib_ops iwl4965_lib = {
2280 .set_ct_kill = iwl4965_set_ct_threshold, 2280 .set_ct_kill = iwl4965_set_ct_threshold,
2281 }, 2281 },
2282 .manage_ibss_station = iwlagn_manage_ibss_station, 2282 .manage_ibss_station = iwlagn_manage_ibss_station,
2283 .update_bcast_station = iwl_update_bcast_station,
2283 .debugfs_ops = { 2284 .debugfs_ops = {
2284 .rx_stats_read = iwl_ucode_rx_stats_read, 2285 .rx_stats_read = iwl_ucode_rx_stats_read,
2285 .tx_stats_read = iwl_ucode_tx_stats_read, 2286 .tx_stats_read = iwl_ucode_tx_stats_read,
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index fa2dbb56177c..b8f3e20f2c80 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -393,6 +393,7 @@ static struct iwl_lib_ops iwl5000_lib = {
393 .set_ct_kill = iwl5000_set_ct_threshold, 393 .set_ct_kill = iwl5000_set_ct_threshold,
394 }, 394 },
395 .manage_ibss_station = iwlagn_manage_ibss_station, 395 .manage_ibss_station = iwlagn_manage_ibss_station,
396 .update_bcast_station = iwl_update_bcast_station,
396 .debugfs_ops = { 397 .debugfs_ops = {
397 .rx_stats_read = iwl_ucode_rx_stats_read, 398 .rx_stats_read = iwl_ucode_rx_stats_read,
398 .tx_stats_read = iwl_ucode_tx_stats_read, 399 .tx_stats_read = iwl_ucode_tx_stats_read,
@@ -455,6 +456,7 @@ static struct iwl_lib_ops iwl5150_lib = {
455 .set_ct_kill = iwl5150_set_ct_threshold, 456 .set_ct_kill = iwl5150_set_ct_threshold,
456 }, 457 },
457 .manage_ibss_station = iwlagn_manage_ibss_station, 458 .manage_ibss_station = iwlagn_manage_ibss_station,
459 .update_bcast_station = iwl_update_bcast_station,
458 .debugfs_ops = { 460 .debugfs_ops = {
459 .rx_stats_read = iwl_ucode_rx_stats_read, 461 .rx_stats_read = iwl_ucode_rx_stats_read,
460 .tx_stats_read = iwl_ucode_tx_stats_read, 462 .tx_stats_read = iwl_ucode_tx_stats_read,
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index c909a9c5e5e1..61cf0b3e88c2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -318,6 +318,7 @@ static struct iwl_lib_ops iwl6000_lib = {
318 .set_calib_version = iwl6000_set_calib_version, 318 .set_calib_version = iwl6000_set_calib_version,
319 }, 319 },
320 .manage_ibss_station = iwlagn_manage_ibss_station, 320 .manage_ibss_station = iwlagn_manage_ibss_station,
321 .update_bcast_station = iwl_update_bcast_station,
321 .debugfs_ops = { 322 .debugfs_ops = {
322 .rx_stats_read = iwl_ucode_rx_stats_read, 323 .rx_stats_read = iwl_ucode_rx_stats_read,
323 .tx_stats_read = iwl_ucode_tx_stats_read, 324 .tx_stats_read = iwl_ucode_tx_stats_read,
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 329e5107b5c3..f47a58ff3252 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -2110,6 +2110,9 @@ int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
2110 iwl_set_flags_for_band(priv, conf->channel->band, priv->vif); 2110 iwl_set_flags_for_band(priv, conf->channel->band, priv->vif);
2111 spin_unlock_irqrestore(&priv->lock, flags); 2111 spin_unlock_irqrestore(&priv->lock, flags);
2112 2112
2113 if (priv->cfg->ops->lib->update_bcast_station)
2114 ret = priv->cfg->ops->lib->update_bcast_station(priv);
2115
2113 set_ch_out: 2116 set_ch_out:
2114 /* The list of supported rates and rate mask can be different 2117 /* The list of supported rates and rate mask can be different
2115 * for each band; since the band may have changed, reset 2118 * for each band; since the band may have changed, reset
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index cdcb51d8bc21..15930e064022 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -196,6 +196,7 @@ struct iwl_lib_ops {
196 /* station management */ 196 /* station management */
197 int (*manage_ibss_station)(struct iwl_priv *priv, 197 int (*manage_ibss_station)(struct iwl_priv *priv,
198 struct ieee80211_vif *vif, bool add); 198 struct ieee80211_vif *vif, bool add);
199 int (*update_bcast_station)(struct iwl_priv *priv);
199 /* recover from tx queue stall */ 200 /* recover from tx queue stall */
200 void (*recover_from_tx_stall)(unsigned long data); 201 void (*recover_from_tx_stall)(unsigned long data);
201 /* check for plcp health */ 202 /* check for plcp health */
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
index 6a9cd08bd449..9511f03f07e0 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
@@ -1259,6 +1259,36 @@ int iwl_alloc_bcast_station(struct iwl_priv *priv, bool init_lq)
1259} 1259}
1260EXPORT_SYMBOL_GPL(iwl_alloc_bcast_station); 1260EXPORT_SYMBOL_GPL(iwl_alloc_bcast_station);
1261 1261
1262/**
1263 * iwl_update_bcast_station - update broadcast station's LQ command
1264 *
1265 * Only used by iwlagn. Placed here to have all bcast station management
1266 * code together.
1267 */
1268int iwl_update_bcast_station(struct iwl_priv *priv)
1269{
1270 unsigned long flags;
1271 struct iwl_link_quality_cmd *link_cmd;
1272 u8 sta_id = priv->hw_params.bcast_sta_id;
1273
1274 link_cmd = iwl_sta_alloc_lq(priv, sta_id);
1275 if (!link_cmd) {
1276 IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n");
1277 return -ENOMEM;
1278 }
1279
1280 spin_lock_irqsave(&priv->sta_lock, flags);
1281 if (priv->stations[sta_id].lq)
1282 kfree(priv->stations[sta_id].lq);
1283 else
1284 IWL_DEBUG_INFO(priv, "Bcast station rate scaling has not been initialized yet.\n");
1285 priv->stations[sta_id].lq = link_cmd;
1286 spin_unlock_irqrestore(&priv->sta_lock, flags);
1287
1288 return 0;
1289}
1290EXPORT_SYMBOL_GPL(iwl_update_bcast_station);
1291
1262void iwl_dealloc_bcast_station(struct iwl_priv *priv) 1292void iwl_dealloc_bcast_station(struct iwl_priv *priv)
1263{ 1293{
1264 unsigned long flags; 1294 unsigned long flags;
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.h b/drivers/net/wireless/iwlwifi/iwl-sta.h
index 619bb99d85cf..ba95b1a590a5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.h
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.h
@@ -60,6 +60,7 @@ void iwl_restore_stations(struct iwl_priv *priv);
60void iwl_clear_ucode_stations(struct iwl_priv *priv); 60void iwl_clear_ucode_stations(struct iwl_priv *priv);
61int iwl_alloc_bcast_station(struct iwl_priv *priv, bool init_lq); 61int iwl_alloc_bcast_station(struct iwl_priv *priv, bool init_lq);
62void iwl_dealloc_bcast_station(struct iwl_priv *priv); 62void iwl_dealloc_bcast_station(struct iwl_priv *priv);
63int iwl_update_bcast_station(struct iwl_priv *priv);
63int iwl_get_free_ucode_key_index(struct iwl_priv *priv); 64int iwl_get_free_ucode_key_index(struct iwl_priv *priv);
64int iwl_send_add_sta(struct iwl_priv *priv, 65int iwl_send_add_sta(struct iwl_priv *priv,
65 struct iwl_addsta_cmd *sta, u8 flags); 66 struct iwl_addsta_cmd *sta, u8 flags);