aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/sta_info.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-06-10 04:21:42 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-14 15:39:27 -0400
commit0ab337032a0dfcd5f2527d3306d3deeba5f95b59 (patch)
tree88795edc149fd88574fece0c8f23774ee8a9155c /net/mac80211/sta_info.h
parenta6a67db2bc89d2b1ff07e0817f11235c20d2c329 (diff)
mac80211: make TX aggregation start/stop request async
When the driver or rate control requests starting or stopping an aggregation session, that currently causes a direct callback into the driver, which could potentially cause locking problems. Also, the functions need to be callable from contexts that cannot sleep, and thus will interfere with making the ampdu_action callback sleeping. To address these issues, add a new work item for each station that will process any start or stop requests out of line. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/sta_info.h')
-rw-r--r--net/mac80211/sta_info.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 05278e6288c9..040cbb0ac3af 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -67,6 +67,8 @@ enum ieee80211_sta_info_flags {
67#define HT_AGG_STATE_RESPONSE_RECEIVED 1 67#define HT_AGG_STATE_RESPONSE_RECEIVED 1
68#define HT_AGG_STATE_OPERATIONAL 2 68#define HT_AGG_STATE_OPERATIONAL 2
69#define HT_AGG_STATE_STOPPING 3 69#define HT_AGG_STATE_STOPPING 3
70#define HT_AGG_STATE_WANT_START 4
71#define HT_AGG_STATE_WANT_STOP 5
70 72
71/** 73/**
72 * struct tid_ampdu_tx - TID aggregation information (Tx). 74 * struct tid_ampdu_tx - TID aggregation information (Tx).
@@ -74,7 +76,6 @@ enum ieee80211_sta_info_flags {
74 * @rcu_head: rcu head for freeing structure 76 * @rcu_head: rcu head for freeing structure
75 * @addba_resp_timer: timer for peer's response to addba request 77 * @addba_resp_timer: timer for peer's response to addba request
76 * @pending: pending frames queue -- use sta's spinlock to protect 78 * @pending: pending frames queue -- use sta's spinlock to protect
77 * @ssn: Starting Sequence Number expected to be aggregated.
78 * @dialog_token: dialog token for aggregation session 79 * @dialog_token: dialog token for aggregation session
79 * @state: session state (see above) 80 * @state: session state (see above)
80 * @stop_initiator: initiator of a session stop 81 * @stop_initiator: initiator of a session stop
@@ -92,7 +93,6 @@ struct tid_ampdu_tx {
92 struct timer_list addba_resp_timer; 93 struct timer_list addba_resp_timer;
93 struct sk_buff_head pending; 94 struct sk_buff_head pending;
94 unsigned long state; 95 unsigned long state;
95 u16 ssn;
96 u8 dialog_token; 96 u8 dialog_token;
97 u8 stop_initiator; 97 u8 stop_initiator;
98}; 98};
@@ -139,11 +139,13 @@ struct tid_ampdu_rx {
139 * @tid_tx: aggregation info for Tx per TID 139 * @tid_tx: aggregation info for Tx per TID
140 * @addba_req_num: number of times addBA request has been sent. 140 * @addba_req_num: number of times addBA request has been sent.
141 * @dialog_token_allocator: dialog token enumerator for each new session; 141 * @dialog_token_allocator: dialog token enumerator for each new session;
142 * @work: work struct for starting/stopping aggregation
142 */ 143 */
143struct sta_ampdu_mlme { 144struct sta_ampdu_mlme {
144 /* rx */ 145 /* rx */
145 struct tid_ampdu_rx *tid_rx[STA_TID_NUM]; 146 struct tid_ampdu_rx *tid_rx[STA_TID_NUM];
146 /* tx */ 147 /* tx */
148 struct work_struct work;
147 struct tid_ampdu_tx *tid_tx[STA_TID_NUM]; 149 struct tid_ampdu_tx *tid_tx[STA_TID_NUM];
148 u8 addba_req_num[STA_TID_NUM]; 150 u8 addba_req_num[STA_TID_NUM];
149 u8 dialog_token_allocator; 151 u8 dialog_token_allocator;