aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c30
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.h9
-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.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.h4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.c7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sta.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c11
14 files changed, 66 insertions, 28 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 4d360d74b0cd..ebaf02d47e73 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -213,6 +213,7 @@ static struct iwl_lib_ops iwl1000_lib = {
213 .set_ct_kill = iwl1000_set_ct_threshold, 213 .set_ct_kill = iwl1000_set_ct_threshold,
214 }, 214 },
215 .add_bcast_station = iwl_add_bcast_station, 215 .add_bcast_station = iwl_add_bcast_station,
216 .manage_ibss_station = iwlagn_manage_ibss_station,
216 .debugfs_ops = { 217 .debugfs_ops = {
217 .rx_stats_read = iwl_ucode_rx_stats_read, 218 .rx_stats_read = iwl_ucode_rx_stats_read,
218 .tx_stats_read = iwl_ucode_tx_stats_read, 219 .tx_stats_read = iwl_ucode_tx_stats_read,
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index 360781326cb7..1e9593968c36 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -884,7 +884,8 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl_priv *priv,
884 tx_cmd->supp_rates[1], tx_cmd->supp_rates[0]); 884 tx_cmd->supp_rates[1], tx_cmd->supp_rates[0]);
885} 885}
886 886
887u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id, u16 tx_rate, u8 flags) 887static u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id,
888 u16 tx_rate, u8 flags)
888{ 889{
889 unsigned long flags_spin; 890 unsigned long flags_spin;
890 struct iwl_station_entry *station; 891 struct iwl_station_entry *station;
@@ -2395,6 +2396,32 @@ static u16 iwl3945_build_addsta_hcmd(const struct iwl_addsta_cmd *cmd, u8 *data)
2395 return (u16)sizeof(struct iwl3945_addsta_cmd); 2396 return (u16)sizeof(struct iwl3945_addsta_cmd);
2396} 2397}
2397 2398
2399static int iwl3945_manage_ibss_station(struct iwl_priv *priv,
2400 struct ieee80211_vif *vif, bool add)
2401{
2402 int ret;
2403
2404 /*
2405 * NB: this assumes that the station it gets will be
2406 * IWL_STA_ID, which will happen but isn't obvious.
2407 */
2408
2409 if (add) {
2410 ret = iwl_add_local_station(priv, vif->bss_conf.bssid, false);
2411 if (ret)
2412 return ret;
2413
2414 iwl3945_sync_sta(priv, IWL_STA_ID,
2415 (priv->band == IEEE80211_BAND_5GHZ) ?
2416 IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP,
2417 CMD_ASYNC);
2418 iwl3945_rate_scale_init(priv->hw, IWL_STA_ID);
2419
2420 return 0;
2421 }
2422
2423 return iwl_remove_station(priv, vif->bss_conf.bssid);
2424}
2398 2425
2399/** 2426/**
2400 * iwl3945_init_hw_rate_table - Initialize the hardware rate fallback table 2427 * iwl3945_init_hw_rate_table - Initialize the hardware rate fallback table
@@ -2802,6 +2829,7 @@ static struct iwl_lib_ops iwl3945_lib = {
2802 .post_associate = iwl3945_post_associate, 2829 .post_associate = iwl3945_post_associate,
2803 .isr = iwl_isr_legacy, 2830 .isr = iwl_isr_legacy,
2804 .config_ap = iwl3945_config_ap, 2831 .config_ap = iwl3945_config_ap,
2832 .manage_ibss_station = iwl3945_manage_ibss_station,
2805 .add_bcast_station = iwl3945_add_bcast_station, 2833 .add_bcast_station = iwl3945_add_bcast_station,
2806 2834
2807 .debugfs_ops = { 2835 .debugfs_ops = {
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h
index 643adb644bb8..cea824c15bc5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.h
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.h
@@ -211,13 +211,6 @@ extern int iwl3945_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
211 char **buf, bool display); 211 char **buf, bool display);
212extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv); 212extern void iwl3945_dump_nic_error_log(struct iwl_priv *priv);
213 213
214/*
215 * Currently used by iwl-3945-rs... look at restructuring so that it doesn't
216 * call this... todo... fix that.
217*/
218extern u8 iwl3945_sync_station(struct iwl_priv *priv, int sta_id,
219 u16 tx_rate, u8 flags);
220
221/****************************************************************************** 214/******************************************************************************
222 * 215 *
223 * Functions implemented in iwl-[34]*.c which are forward declared here 216 * Functions implemented in iwl-[34]*.c which are forward declared here
@@ -288,8 +281,6 @@ extern __le32 iwl3945_get_antenna_flags(const struct iwl_priv *priv);
288extern int iwl3945_init_hw_rate_table(struct iwl_priv *priv); 281extern int iwl3945_init_hw_rate_table(struct iwl_priv *priv);
289extern void iwl3945_reg_txpower_periodic(struct iwl_priv *priv); 282extern void iwl3945_reg_txpower_periodic(struct iwl_priv *priv);
290extern int iwl3945_txpower_set_from_eeprom(struct iwl_priv *priv); 283extern int iwl3945_txpower_set_from_eeprom(struct iwl_priv *priv);
291extern u8 iwl3945_sync_sta(struct iwl_priv *priv, int sta_id,
292 u16 tx_rate, u8 flags);
293 284
294extern const struct iwl_channel_info *iwl3945_get_channel_info( 285extern const struct iwl_channel_info *iwl3945_get_channel_info(
295 const struct iwl_priv *priv, enum ieee80211_band band, u16 channel); 286 const struct iwl_priv *priv, enum ieee80211_band band, u16 channel);
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 6b0ae74546dd..5904a1beac4d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -2219,6 +2219,7 @@ static struct iwl_lib_ops iwl4965_lib = {
2219 .set_ct_kill = iwl4965_set_ct_threshold, 2219 .set_ct_kill = iwl4965_set_ct_threshold,
2220 }, 2220 },
2221 .add_bcast_station = iwl_add_bcast_station, 2221 .add_bcast_station = iwl_add_bcast_station,
2222 .manage_ibss_station = iwlagn_manage_ibss_station,
2222 .debugfs_ops = { 2223 .debugfs_ops = {
2223 .rx_stats_read = iwl_ucode_rx_stats_read, 2224 .rx_stats_read = iwl_ucode_rx_stats_read,
2224 .tx_stats_read = iwl_ucode_tx_stats_read, 2225 .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 8ed616e59631..bde0f18cbae9 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -352,6 +352,7 @@ static struct iwl_lib_ops iwl5000_lib = {
352 .set_ct_kill = iwl5000_set_ct_threshold, 352 .set_ct_kill = iwl5000_set_ct_threshold,
353 }, 353 },
354 .add_bcast_station = iwl_add_bcast_station, 354 .add_bcast_station = iwl_add_bcast_station,
355 .manage_ibss_station = iwlagn_manage_ibss_station,
355 .debugfs_ops = { 356 .debugfs_ops = {
356 .rx_stats_read = iwl_ucode_rx_stats_read, 357 .rx_stats_read = iwl_ucode_rx_stats_read,
357 .tx_stats_read = iwl_ucode_tx_stats_read, 358 .tx_stats_read = iwl_ucode_tx_stats_read,
@@ -414,6 +415,7 @@ static struct iwl_lib_ops iwl5150_lib = {
414 .set_ct_kill = iwl5150_set_ct_threshold, 415 .set_ct_kill = iwl5150_set_ct_threshold,
415 }, 416 },
416 .add_bcast_station = iwl_add_bcast_station, 417 .add_bcast_station = iwl_add_bcast_station,
418 .manage_ibss_station = iwlagn_manage_ibss_station,
417 .debugfs_ops = { 419 .debugfs_ops = {
418 .rx_stats_read = iwl_ucode_rx_stats_read, 420 .rx_stats_read = iwl_ucode_rx_stats_read,
419 .tx_stats_read = iwl_ucode_tx_stats_read, 421 .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 b69fa36fb87a..5f0f58693104 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_ct_kill = iwl6000_set_ct_threshold, 318 .set_ct_kill = iwl6000_set_ct_threshold,
319 }, 319 },
320 .add_bcast_station = iwl_add_bcast_station, 320 .add_bcast_station = iwl_add_bcast_station,
321 .manage_ibss_station = iwlagn_manage_ibss_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,
@@ -391,6 +392,7 @@ static struct iwl_lib_ops iwl6050_lib = {
391 .set_calib_version = iwl6050_set_calib_version, 392 .set_calib_version = iwl6050_set_calib_version,
392 }, 393 },
393 .add_bcast_station = iwl_add_bcast_station, 394 .add_bcast_station = iwl_add_bcast_station,
395 .manage_ibss_station = iwlagn_manage_ibss_station,
394 .debugfs_ops = { 396 .debugfs_ops = {
395 .rx_stats_read = iwl_ucode_rx_stats_read, 397 .rx_stats_read = iwl_ucode_rx_stats_read,
396 .tx_stats_read = iwl_ucode_tx_stats_read, 398 .tx_stats_read = iwl_ucode_tx_stats_read,
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index a27347425968..50ff313c549c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -38,6 +38,7 @@
38#include "iwl-helpers.h" 38#include "iwl-helpers.h"
39#include "iwl-agn-hw.h" 39#include "iwl-agn-hw.h"
40#include "iwl-agn.h" 40#include "iwl-agn.h"
41#include "iwl-sta.h"
41 42
42static inline u32 iwlagn_get_scd_ssn(struct iwl5000_tx_resp *tx_resp) 43static inline u32 iwlagn_get_scd_ssn(struct iwl5000_tx_resp *tx_resp)
43{ 44{
@@ -1513,3 +1514,11 @@ void iwlagn_request_scan(struct iwl_priv *priv)
1513 /* inform mac80211 scan aborted */ 1514 /* inform mac80211 scan aborted */
1514 queue_work(priv->workqueue, &priv->scan_completed); 1515 queue_work(priv->workqueue, &priv->scan_completed);
1515} 1516}
1517
1518int iwlagn_manage_ibss_station(struct iwl_priv *priv,
1519 struct ieee80211_vif *vif, bool add)
1520{
1521 if (add)
1522 return iwl_add_local_station(priv, vif->bss_conf.bssid, true);
1523 return iwl_remove_station(priv, vif->bss_conf.bssid);
1524}
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 5cf38227c6c7..dd1324d6f4c0 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -2606,17 +2606,11 @@ void iwl_post_associate(struct iwl_priv *priv)
2606 switch (priv->iw_mode) { 2606 switch (priv->iw_mode) {
2607 case NL80211_IFTYPE_STATION: 2607 case NL80211_IFTYPE_STATION:
2608 break; 2608 break;
2609
2610 case NL80211_IFTYPE_ADHOC: 2609 case NL80211_IFTYPE_ADHOC:
2611
2612 /* assume default assoc id */ 2610 /* assume default assoc id */
2613 priv->assoc_id = 1; 2611 priv->assoc_id = 1;
2614
2615 iwl_add_local_station(priv, priv->bssid, true);
2616 iwl_send_beacon_cmd(priv); 2612 iwl_send_beacon_cmd(priv);
2617
2618 break; 2613 break;
2619
2620 default: 2614 default:
2621 IWL_ERR(priv, "%s Should not be called in %d mode\n", 2615 IWL_ERR(priv, "%s Should not be called in %d mode\n",
2622 __func__, priv->iw_mode); 2616 __func__, priv->iw_mode);
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
index cfee9994383e..a9ba9fc6740a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
@@ -174,4 +174,8 @@ static inline bool iwl_is_tx_success(u32 status)
174/* scan */ 174/* scan */
175void iwlagn_request_scan(struct iwl_priv *priv); 175void iwlagn_request_scan(struct iwl_priv *priv);
176 176
177/* station mgmt */
178int iwlagn_manage_ibss_station(struct iwl_priv *priv,
179 struct ieee80211_vif *vif, bool add);
180
177#endif /* __iwl_agn_h__ */ 181#endif /* __iwl_agn_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index e8c9bcafe564..5c6f25462a09 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1960,6 +1960,15 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
1960 iwl_set_no_assoc(priv); 1960 iwl_set_no_assoc(priv);
1961 } 1961 }
1962 1962
1963 if (changes & BSS_CHANGED_IBSS) {
1964 ret = priv->cfg->ops->lib->manage_ibss_station(priv, vif,
1965 bss_conf->ibss_joined);
1966 if (ret)
1967 IWL_ERR(priv, "failed to %s IBSS station %pM\n",
1968 bss_conf->ibss_joined ? "add" : "remove",
1969 bss_conf->bssid);
1970 }
1971
1963 mutex_unlock(&priv->mutex); 1972 mutex_unlock(&priv->mutex);
1964 1973
1965 IWL_DEBUG_MAC80211(priv, "leave\n"); 1974 IWL_DEBUG_MAC80211(priv, "leave\n");
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 8d53fc973a43..0fa99650f75a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -202,6 +202,8 @@ struct iwl_lib_ops {
202 struct iwl_temp_ops temp_ops; 202 struct iwl_temp_ops temp_ops;
203 /* station management */ 203 /* station management */
204 int (*add_bcast_station)(struct iwl_priv *priv); 204 int (*add_bcast_station)(struct iwl_priv *priv);
205 int (*manage_ibss_station)(struct iwl_priv *priv,
206 struct ieee80211_vif *vif, bool add);
205 /* recover from tx queue stall */ 207 /* recover from tx queue stall */
206 void (*recover_from_tx_stall)(unsigned long data); 208 void (*recover_from_tx_stall)(unsigned long data);
207 /* check for plcp health */ 209 /* check for plcp health */
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
index 354eb13a8515..7da8edeb5256 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
@@ -596,7 +596,7 @@ static int iwl_send_remove_station(struct iwl_priv *priv,
596/** 596/**
597 * iwl_remove_station - Remove driver's knowledge of station. 597 * iwl_remove_station - Remove driver's knowledge of station.
598 */ 598 */
599static int iwl_remove_station(struct iwl_priv *priv, const u8 *addr) 599int iwl_remove_station(struct iwl_priv *priv, const u8 *addr)
600{ 600{
601 int sta_id = IWL_INVALID_STATION; 601 int sta_id = IWL_INVALID_STATION;
602 int i, ret = -EINVAL; 602 int i, ret = -EINVAL;
@@ -647,6 +647,10 @@ static int iwl_remove_station(struct iwl_priv *priv, const u8 *addr)
647 goto out; 647 goto out;
648 } 648 }
649 649
650 if (priv->stations[sta_id].used & IWL_STA_LOCAL) {
651 kfree(priv->stations[sta_id].lq);
652 priv->stations[sta_id].lq = NULL;
653 }
650 654
651 priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; 655 priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE;
652 656
@@ -663,6 +667,7 @@ out:
663 spin_unlock_irqrestore(&priv->sta_lock, flags); 667 spin_unlock_irqrestore(&priv->sta_lock, flags);
664 return ret; 668 return ret;
665} 669}
670EXPORT_SYMBOL_GPL(iwl_remove_station);
666 671
667/** 672/**
668 * iwl_clear_ucode_stations() - clear entire station table driver and/or ucode 673 * iwl_clear_ucode_stations() - clear entire station table driver and/or ucode
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.h b/drivers/net/wireless/iwlwifi/iwl-sta.h
index b0ed2eb931fd..9a869f1031fd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sta.h
+++ b/drivers/net/wireless/iwlwifi/iwl-sta.h
@@ -74,6 +74,7 @@ int iwl_add_station_common(struct iwl_priv *priv, const u8 *addr,
74 bool is_ap, 74 bool is_ap,
75 struct ieee80211_sta_ht_cap *ht_info, 75 struct ieee80211_sta_ht_cap *ht_info,
76 u8 *sta_id_r); 76 u8 *sta_id_r);
77int iwl_remove_station(struct iwl_priv *priv, const u8 *addr);
77int iwl_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 78int iwl_mac_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
78 struct ieee80211_sta *sta); 79 struct ieee80211_sta *sta);
79void iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid); 80void iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid);
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 4f20cca06fb0..9486b3248245 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -3103,21 +3103,10 @@ void iwl3945_post_associate(struct iwl_priv *priv)
3103 case NL80211_IFTYPE_STATION: 3103 case NL80211_IFTYPE_STATION:
3104 iwl3945_rate_scale_init(priv->hw, IWL_AP_ID); 3104 iwl3945_rate_scale_init(priv->hw, IWL_AP_ID);
3105 break; 3105 break;
3106
3107 case NL80211_IFTYPE_ADHOC: 3106 case NL80211_IFTYPE_ADHOC:
3108
3109 priv->assoc_id = 1; 3107 priv->assoc_id = 1;
3110 iwl_add_local_station(priv, priv->bssid, false);
3111 iwl3945_sync_sta(priv, IWL_STA_ID,
3112 (priv->band == IEEE80211_BAND_5GHZ) ?
3113 IWL_RATE_6M_PLCP : IWL_RATE_1M_PLCP,
3114 CMD_ASYNC);
3115 iwl3945_rate_scale_init(priv->hw, IWL_STA_ID);
3116
3117 iwl3945_send_beacon_cmd(priv); 3108 iwl3945_send_beacon_cmd(priv);
3118
3119 break; 3109 break;
3120
3121 default: 3110 default:
3122 IWL_ERR(priv, "%s Should not be called in %d mode\n", 3111 IWL_ERR(priv, "%s Should not be called in %d mode\n",
3123 __func__, priv->iw_mode); 3112 __func__, priv->iw_mode);