diff options
| author | Johannes Berg <johannes@sipsolutions.net> | 2009-02-10 15:25:54 -0500 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2009-02-13 13:45:48 -0500 |
| commit | 849b7967818995a32c3017542e33eb3155944368 (patch) | |
| tree | afd0a98e50c3b9a851a2b46682f6a3767df2ca04 | |
| parent | d75636ef9c1af224f1097941879d5a8db7cd04e5 (diff) | |
mac80211: further cleanups to stopping BA sessions
Essentially consisting of passing the sta_info pointer around,
instead of repeatedly doing hash lookups.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | net/mac80211/agg-rx.c | 6 | ||||
| -rw-r--r-- | net/mac80211/agg-tx.c | 63 | ||||
| -rw-r--r-- | net/mac80211/ht.c | 9 | ||||
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 5 |
4 files changed, 44 insertions, 39 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index bb1f8740cbd5..3112bfd441b6 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #include <net/mac80211.h> | 17 | #include <net/mac80211.h> |
| 18 | #include "ieee80211_i.h" | 18 | #include "ieee80211_i.h" |
| 19 | 19 | ||
| 20 | static void __ieee80211_sta_stop_rx_ba_session(struct sta_info *sta, u16 tid, | 20 | void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, |
| 21 | u16 initiator, u16 reason) | 21 | u16 initiator, u16 reason) |
| 22 | { | 22 | { |
| 23 | struct ieee80211_local *local = sta->local; | 23 | struct ieee80211_local *local = sta->local; |
| 24 | struct ieee80211_hw *hw = &local->hw; | 24 | struct ieee80211_hw *hw = &local->hw; |
| @@ -96,7 +96,7 @@ void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *r | |||
| 96 | return; | 96 | return; |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | __ieee80211_sta_stop_rx_ba_session(sta, tid, initiator, reason); | 99 | __ieee80211_stop_rx_ba_session(sta, tid, initiator, reason); |
| 100 | 100 | ||
| 101 | rcu_read_unlock(); | 101 | rcu_read_unlock(); |
| 102 | } | 102 | } |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index a49b76f61da3..1232d9f01ca9 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
| @@ -123,10 +123,10 @@ void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u1 | |||
| 123 | ieee80211_tx_skb(sdata, skb, 0); | 123 | ieee80211_tx_skb(sdata, skb, 0); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | static int __ieee80211_stop_tx_ba_session(struct ieee80211_local *local, | 126 | static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
| 127 | struct sta_info *sta, u16 tid, | 127 | enum ieee80211_back_parties initiator) |
| 128 | enum ieee80211_back_parties initiator) | ||
| 129 | { | 128 | { |
| 129 | struct ieee80211_local *local = sta->local; | ||
| 130 | int ret; | 130 | int ret; |
| 131 | u8 *state; | 131 | u8 *state; |
| 132 | 132 | ||
| @@ -165,7 +165,6 @@ static void sta_addba_resp_timer_expired(unsigned long data) | |||
| 165 | u16 tid = *(u8 *)data; | 165 | u16 tid = *(u8 *)data; |
| 166 | struct sta_info *sta = container_of((void *)data, | 166 | struct sta_info *sta = container_of((void *)data, |
| 167 | struct sta_info, timer_to_tid[tid]); | 167 | struct sta_info, timer_to_tid[tid]); |
| 168 | struct ieee80211_local *local = sta->local; | ||
| 169 | u8 *state; | 168 | u8 *state; |
| 170 | 169 | ||
| 171 | state = &sta->ampdu_mlme.tid_state_tx[tid]; | 170 | state = &sta->ampdu_mlme.tid_state_tx[tid]; |
| @@ -186,7 +185,7 @@ static void sta_addba_resp_timer_expired(unsigned long data) | |||
| 186 | printk(KERN_DEBUG "addBA response timer expired on tid %d\n", tid); | 185 | printk(KERN_DEBUG "addBA response timer expired on tid %d\n", tid); |
| 187 | #endif | 186 | #endif |
| 188 | 187 | ||
| 189 | __ieee80211_stop_tx_ba_session(local, sta, tid, WLAN_BACK_INITIATOR); | 188 | ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR); |
| 190 | spin_unlock_bh(&sta->lock); | 189 | spin_unlock_bh(&sta->lock); |
| 191 | } | 190 | } |
| 192 | 191 | ||
| @@ -427,6 +426,32 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, | |||
| 427 | } | 426 | } |
| 428 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb_irqsafe); | 427 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb_irqsafe); |
| 429 | 428 | ||
| 429 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
| 430 | enum ieee80211_back_parties initiator) | ||
| 431 | { | ||
| 432 | u8 *state; | ||
| 433 | int ret; | ||
| 434 | |||
| 435 | /* check if the TID is in aggregation */ | ||
| 436 | state = &sta->ampdu_mlme.tid_state_tx[tid]; | ||
| 437 | spin_lock_bh(&sta->lock); | ||
| 438 | |||
| 439 | if (*state != HT_AGG_STATE_OPERATIONAL) { | ||
| 440 | ret = -ENOENT; | ||
| 441 | goto unlock; | ||
| 442 | } | ||
| 443 | |||
| 444 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
| 445 | printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", | ||
| 446 | sta->sta.addr, tid); | ||
| 447 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
| 448 | |||
| 449 | ret = ___ieee80211_stop_tx_ba_session(sta, tid, initiator); | ||
| 450 | |||
| 451 | unlock: | ||
| 452 | spin_unlock_bh(&sta->lock); | ||
| 453 | return ret; | ||
| 454 | } | ||
| 430 | 455 | ||
| 431 | int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | 456 | int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, |
| 432 | u8 *ra, u16 tid, | 457 | u8 *ra, u16 tid, |
| @@ -434,7 +459,6 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | |||
| 434 | { | 459 | { |
| 435 | struct ieee80211_local *local = hw_to_local(hw); | 460 | struct ieee80211_local *local = hw_to_local(hw); |
| 436 | struct sta_info *sta; | 461 | struct sta_info *sta; |
| 437 | u8 *state; | ||
| 438 | int ret = 0; | 462 | int ret = 0; |
| 439 | 463 | ||
| 440 | if (WARN_ON(!local->ops->ampdu_action)) | 464 | if (WARN_ON(!local->ops->ampdu_action)) |
| @@ -450,27 +474,8 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | |||
| 450 | return -ENOENT; | 474 | return -ENOENT; |
| 451 | } | 475 | } |
| 452 | 476 | ||
| 453 | /* check if the TID is in aggregation */ | 477 | ret = __ieee80211_stop_tx_ba_session(sta, tid, initiator); |
| 454 | state = &sta->ampdu_mlme.tid_state_tx[tid]; | ||
| 455 | spin_lock_bh(&sta->lock); | ||
| 456 | |||
| 457 | if (*state != HT_AGG_STATE_OPERATIONAL) { | ||
| 458 | ret = -ENOENT; | ||
| 459 | goto unlock; | ||
| 460 | } | ||
| 461 | |||
| 462 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
| 463 | printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", | ||
| 464 | ra, tid); | ||
| 465 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
| 466 | |||
| 467 | ret = __ieee80211_stop_tx_ba_session(local, sta, tid, initiator); | ||
| 468 | |||
| 469 | unlock: | ||
| 470 | spin_unlock_bh(&sta->lock); | ||
| 471 | |||
| 472 | rcu_read_unlock(); | 478 | rcu_read_unlock(); |
| 473 | |||
| 474 | return ret; | 479 | return ret; |
| 475 | } | 480 | } |
| 476 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); | 481 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); |
| @@ -623,11 +628,9 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, | |||
| 623 | #ifdef CONFIG_MAC80211_HT_DEBUG | 628 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| 624 | printk(KERN_DEBUG "Resuming TX aggregation for tid %d\n", tid); | 629 | printk(KERN_DEBUG "Resuming TX aggregation for tid %d\n", tid); |
| 625 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 630 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
| 626 | spin_unlock_bh(&sta->lock); | ||
| 627 | } else { | 631 | } else { |
| 628 | sta->ampdu_mlme.addba_req_num[tid]++; | 632 | sta->ampdu_mlme.addba_req_num[tid]++; |
| 629 | __ieee80211_stop_tx_ba_session(local, sta, tid, | 633 | ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR); |
| 630 | WLAN_BACK_INITIATOR); | ||
| 631 | spin_unlock_bh(&sta->lock); | ||
| 632 | } | 634 | } |
| 635 | spin_unlock_bh(&sta->lock); | ||
| 633 | } | 636 | } |
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c index 1b503f3cc54c..82ea0b63a386 100644 --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c | |||
| @@ -155,15 +155,12 @@ u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, | |||
| 155 | 155 | ||
| 156 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta) | 156 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta) |
| 157 | { | 157 | { |
| 158 | struct ieee80211_local *local = sta->local; | ||
| 159 | int i; | 158 | int i; |
| 160 | 159 | ||
| 161 | for (i = 0; i < STA_TID_NUM; i++) { | 160 | for (i = 0; i < STA_TID_NUM; i++) { |
| 162 | ieee80211_stop_tx_ba_session(&local->hw, sta->sta.addr, i, | 161 | __ieee80211_stop_tx_ba_session(sta, i, WLAN_BACK_INITIATOR); |
| 163 | WLAN_BACK_INITIATOR); | 162 | __ieee80211_stop_rx_ba_session(sta, i, WLAN_BACK_RECIPIENT, |
| 164 | ieee80211_sta_stop_rx_ba_session(sta->sdata, sta->sta.addr, i, | 163 | WLAN_REASON_QSTA_LEAVE_QBSS); |
| 165 | WLAN_BACK_RECIPIENT, | ||
| 166 | WLAN_REASON_QSTA_LEAVE_QBSS); | ||
| 167 | } | 164 | } |
| 168 | } | 165 | } |
| 169 | 166 | ||
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index c6858ecde312..9122416fd6af 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -993,6 +993,8 @@ void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, | |||
| 993 | 993 | ||
| 994 | void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *da, | 994 | void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *da, |
| 995 | u16 tid, u16 initiator, u16 reason); | 995 | u16 tid, u16 initiator, u16 reason); |
| 996 | void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | ||
| 997 | u16 initiator, u16 reason); | ||
| 996 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta); | 998 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta); |
| 997 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | 999 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, |
| 998 | struct sta_info *sta, | 1000 | struct sta_info *sta, |
| @@ -1006,6 +1008,9 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
| 1006 | struct ieee80211_mgmt *mgmt, | 1008 | struct ieee80211_mgmt *mgmt, |
| 1007 | size_t len); | 1009 | size_t len); |
| 1008 | 1010 | ||
| 1011 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
| 1012 | enum ieee80211_back_parties initiator); | ||
| 1013 | |||
| 1009 | /* Spectrum management */ | 1014 | /* Spectrum management */ |
| 1010 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, | 1015 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, |
| 1011 | struct ieee80211_mgmt *mgmt, | 1016 | struct ieee80211_mgmt *mgmt, |
