aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-08-27 11:55:52 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2010-08-27 11:59:14 -0400
commitdcef732c72fbe960de5069d3921bb6ce6847be58 (patch)
tree5bee7ebd3e00856302dd8243490f83bacb0d1ffb /drivers
parenta194e3249baf954dc34c67cdad5b8bed36f49e72 (diff)
iwlwifi: contextify-stations-completely
The microcode tracks stations per context, so the driver needs to do that as well for adding, deleting and restoring them, especially in the implicit removal case when we send an RXON. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.c11
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c2
6 files changed, 25 insertions, 15 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index 905575c840cc..ba3a9f9d519e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -1832,8 +1832,9 @@ static int iwl3945_commit_rxon(struct iwl_priv *priv,
1832 "configuration (%d).\n", rc); 1832 "configuration (%d).\n", rc);
1833 return rc; 1833 return rc;
1834 } 1834 }
1835 iwl_clear_ucode_stations(priv); 1835 iwl_clear_ucode_stations(priv,
1836 iwl_restore_stations(priv); 1836 &priv->contexts[IWL_RXON_CTX_BSS]);
1837 iwl_restore_stations(priv, &priv->contexts[IWL_RXON_CTX_BSS]);
1837 } 1838 }
1838 1839
1839 IWL_DEBUG_INFO(priv, "Sending RXON\n" 1840 IWL_DEBUG_INFO(priv, "Sending RXON\n"
@@ -1865,8 +1866,9 @@ static int iwl3945_commit_rxon(struct iwl_priv *priv,
1865 memcpy(active_rxon, staging_rxon, sizeof(*active_rxon)); 1866 memcpy(active_rxon, staging_rxon, sizeof(*active_rxon));
1866 1867
1867 if (!new_assoc) { 1868 if (!new_assoc) {
1868 iwl_clear_ucode_stations(priv); 1869 iwl_clear_ucode_stations(priv,
1869 iwl_restore_stations(priv); 1870 &priv->contexts[IWL_RXON_CTX_BSS]);
1871 iwl_restore_stations(priv, &priv->contexts[IWL_RXON_CTX_BSS]);
1870 } 1872 }
1871 1873
1872 /* If we issue a new RXON command which required a tune then we must 1874 /* If we issue a new RXON command which required a tune then we must
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index d2222782f46c..23db6c3e9aee 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -163,8 +163,8 @@ int iwl_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
163 IWL_ERR(priv, "Error clearing ASSOC_MSK (%d)\n", ret); 163 IWL_ERR(priv, "Error clearing ASSOC_MSK (%d)\n", ret);
164 return ret; 164 return ret;
165 } 165 }
166 iwl_clear_ucode_stations(priv); 166 iwl_clear_ucode_stations(priv, ctx);
167 iwl_restore_stations(priv); 167 iwl_restore_stations(priv, ctx);
168 ret = iwl_restore_default_wep_keys(priv); 168 ret = iwl_restore_default_wep_keys(priv);
169 if (ret) { 169 if (ret) {
170 IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret); 170 IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
@@ -195,8 +195,8 @@ int iwl_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
195 } 195 }
196 IWL_DEBUG_INFO(priv, "Return from !new_assoc RXON.\n"); 196 IWL_DEBUG_INFO(priv, "Return from !new_assoc RXON.\n");
197 memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon)); 197 memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
198 iwl_clear_ucode_stations(priv); 198 iwl_clear_ucode_stations(priv, ctx);
199 iwl_restore_stations(priv); 199 iwl_restore_stations(priv, ctx);
200 ret = iwl_restore_default_wep_keys(priv); 200 ret = iwl_restore_default_wep_keys(priv);
201 if (ret) { 201 if (ret) {
202 IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret); 202 IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
@@ -2830,7 +2830,7 @@ static void __iwl_down(struct iwl_priv *priv)
2830 if (priv->cfg->ops->lib->recover_from_tx_stall) 2830 if (priv->cfg->ops->lib->recover_from_tx_stall)
2831 del_timer_sync(&priv->monitor_recover); 2831 del_timer_sync(&priv->monitor_recover);
2832 2832
2833 iwl_clear_ucode_stations(priv); 2833 iwl_clear_ucode_stations(priv, NULL);
2834 iwl_dealloc_bcast_stations(priv); 2834 iwl_dealloc_bcast_stations(priv);
2835 iwl_clear_driver_stations(priv); 2835 iwl_clear_driver_stations(priv);
2836 2836
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index f51c07c078cc..da54bd53c99d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -495,7 +495,7 @@ struct iwl_qos_info {
495struct iwl_station_entry { 495struct iwl_station_entry {
496 struct iwl_addsta_cmd sta; 496 struct iwl_addsta_cmd sta;
497 struct iwl_tid_data tid[MAX_TID_COUNT]; 497 struct iwl_tid_data tid[MAX_TID_COUNT];
498 u8 used; 498 u8 used, ctxid;
499 struct iwl_hw_key keyinfo; 499 struct iwl_hw_key keyinfo;
500 struct iwl_link_quality_cmd *lq; 500 struct iwl_link_quality_cmd *lq;
501}; 501};
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
index b1275e34520d..29235626ac0b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
@@ -290,6 +290,7 @@ static u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
290 station->sta.mode = 0; 290 station->sta.mode = 0;
291 station->sta.sta.sta_id = sta_id; 291 station->sta.sta.sta_id = sta_id;
292 station->sta.station_flags = 0; 292 station->sta.station_flags = 0;
293 station->ctxid = ctx->ctxid;
293 294
294 /* 295 /*
295 * OK to call unconditionally, since local stations (IBSS BSSID 296 * OK to call unconditionally, since local stations (IBSS BSSID
@@ -615,7 +616,8 @@ EXPORT_SYMBOL_GPL(iwl_remove_station);
615 * other than explicit station management would cause this in 616 * other than explicit station management would cause this in
616 * the ucode, e.g. unassociated RXON. 617 * the ucode, e.g. unassociated RXON.
617 */ 618 */
618void iwl_clear_ucode_stations(struct iwl_priv *priv) 619void iwl_clear_ucode_stations(struct iwl_priv *priv,
620 struct iwl_rxon_context *ctx)
619{ 621{
620 int i; 622 int i;
621 unsigned long flags_spin; 623 unsigned long flags_spin;
@@ -625,6 +627,9 @@ void iwl_clear_ucode_stations(struct iwl_priv *priv)
625 627
626 spin_lock_irqsave(&priv->sta_lock, flags_spin); 628 spin_lock_irqsave(&priv->sta_lock, flags_spin);
627 for (i = 0; i < priv->hw_params.max_stations; i++) { 629 for (i = 0; i < priv->hw_params.max_stations; i++) {
630 if (ctx && ctx->ctxid != priv->stations[i].ctxid)
631 continue;
632
628 if (priv->stations[i].used & IWL_STA_UCODE_ACTIVE) { 633 if (priv->stations[i].used & IWL_STA_UCODE_ACTIVE) {
629 IWL_DEBUG_INFO(priv, "Clearing ucode active for station %d\n", i); 634 IWL_DEBUG_INFO(priv, "Clearing ucode active for station %d\n", i);
630 priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE; 635 priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE;
@@ -646,7 +651,7 @@ EXPORT_SYMBOL(iwl_clear_ucode_stations);
646 * 651 *
647 * Function sleeps. 652 * Function sleeps.
648 */ 653 */
649void iwl_restore_stations(struct iwl_priv *priv) 654void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
650{ 655{
651 struct iwl_addsta_cmd sta_cmd; 656 struct iwl_addsta_cmd sta_cmd;
652 struct iwl_link_quality_cmd lq; 657 struct iwl_link_quality_cmd lq;
@@ -664,6 +669,8 @@ void iwl_restore_stations(struct iwl_priv *priv)
664 IWL_DEBUG_ASSOC(priv, "Restoring all known stations ... start.\n"); 669 IWL_DEBUG_ASSOC(priv, "Restoring all known stations ... start.\n");
665 spin_lock_irqsave(&priv->sta_lock, flags_spin); 670 spin_lock_irqsave(&priv->sta_lock, flags_spin);
666 for (i = 0; i < priv->hw_params.max_stations; i++) { 671 for (i = 0; i < priv->hw_params.max_stations; i++) {
672 if (ctx->ctxid != priv->stations[i].ctxid)
673 continue;
667 if ((priv->stations[i].used & IWL_STA_DRIVER_ACTIVE) && 674 if ((priv->stations[i].used & IWL_STA_DRIVER_ACTIVE) &&
668 !(priv->stations[i].used & IWL_STA_UCODE_ACTIVE)) { 675 !(priv->stations[i].used & IWL_STA_UCODE_ACTIVE)) {
669 IWL_DEBUG_ASSOC(priv, "Restoring sta %pM\n", 676 IWL_DEBUG_ASSOC(priv, "Restoring sta %pM\n",
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.h b/drivers/net/wireless/iwlwifi/iwl-sta.h
index 8a978c6e105f..269a3ed0f3fb 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.h
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.h
@@ -57,8 +57,9 @@ void iwl_update_tkip_key(struct iwl_priv *priv,
57 struct ieee80211_key_conf *keyconf, 57 struct ieee80211_key_conf *keyconf,
58 struct ieee80211_sta *sta, u32 iv32, u16 *phase1key); 58 struct ieee80211_sta *sta, u32 iv32, u16 *phase1key);
59 59
60void iwl_restore_stations(struct iwl_priv *priv); 60void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx);
61void iwl_clear_ucode_stations(struct iwl_priv *priv); 61void iwl_clear_ucode_stations(struct iwl_priv *priv,
62 struct iwl_rxon_context *ctx);
62int iwl_alloc_bcast_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 63int iwl_alloc_bcast_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
63 bool init_lq); 64 bool init_lq);
64void iwl_dealloc_bcast_stations(struct iwl_priv *priv); 65void iwl_dealloc_bcast_stations(struct iwl_priv *priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 8b0763264141..630b8d641720 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -2581,7 +2581,7 @@ static void __iwl3945_down(struct iwl_priv *priv)
2581 del_timer_sync(&priv->monitor_recover); 2581 del_timer_sync(&priv->monitor_recover);
2582 2582
2583 /* Station information will now be cleared in device */ 2583 /* Station information will now be cleared in device */
2584 iwl_clear_ucode_stations(priv); 2584 iwl_clear_ucode_stations(priv, NULL);
2585 iwl_dealloc_bcast_stations(priv); 2585 iwl_dealloc_bcast_stations(priv);
2586 iwl_clear_driver_stations(priv); 2586 iwl_clear_driver_stations(priv);
2587 2587