diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-11-16 06:00:38 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-11-18 17:09:15 -0500 |
commit | c951ad3550ab40071bb0f222ba6125845769c08a (patch) | |
tree | 9db1d3c110b359a34a3d706eaf40285cfa01550b /net | |
parent | 3b53fde8ac40c4321389def14d7f4a9e14092fd3 (diff) |
mac80211: convert aggregation to operate on vifs/stas
The entire aggregation code currently operates on the
hw pointer and station addresses, but that needs to
change to make stations purely per-vif; As one step
preparing for that make the aggregation code callable
with the station, or by the combination of virtual
interface and station address.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/agg-rx.c | 6 | ||||
-rw-r--r-- | net/mac80211/agg-tx.c | 96 | ||||
-rw-r--r-- | net/mac80211/driver-ops.h | 5 | ||||
-rw-r--r-- | net/mac80211/driver-trace.h | 9 | ||||
-rw-r--r-- | net/mac80211/ht.c | 3 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 3 | ||||
-rw-r--r-- | net/mac80211/main.c | 8 |
7 files changed, 58 insertions, 72 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index bc064d7933f..f3a5c9e0578 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -41,7 +41,8 @@ void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | |||
41 | sta->sta.addr, tid); | 41 | sta->sta.addr, tid); |
42 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 42 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
43 | 43 | ||
44 | if (drv_ampdu_action(local, IEEE80211_AMPDU_RX_STOP, | 44 | if (drv_ampdu_action(local, &sta->sdata->vif, |
45 | IEEE80211_AMPDU_RX_STOP, | ||
45 | &sta->sta, tid, NULL)) | 46 | &sta->sta, tid, NULL)) |
46 | printk(KERN_DEBUG "HW problem - can not stop rx " | 47 | printk(KERN_DEBUG "HW problem - can not stop rx " |
47 | "aggregation for tid %d\n", tid); | 48 | "aggregation for tid %d\n", tid); |
@@ -284,7 +285,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
284 | goto end; | 285 | goto end; |
285 | } | 286 | } |
286 | 287 | ||
287 | ret = drv_ampdu_action(local, IEEE80211_AMPDU_RX_START, | 288 | ret = drv_ampdu_action(local, &sta->sdata->vif, |
289 | IEEE80211_AMPDU_RX_START, | ||
288 | &sta->sta, tid, &start_seq_num); | 290 | &sta->sta, tid, &start_seq_num); |
289 | #ifdef CONFIG_MAC80211_HT_DEBUG | 291 | #ifdef CONFIG_MAC80211_HT_DEBUG |
290 | printk(KERN_DEBUG "Rx A-MPDU request on tid %d result %d\n", tid, ret); | 292 | printk(KERN_DEBUG "Rx A-MPDU request on tid %d result %d\n", tid, ret); |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index b09948ceec4..6ddd11466df 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -138,7 +138,8 @@ static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
138 | *state = HT_AGG_STATE_REQ_STOP_BA_MSK | | 138 | *state = HT_AGG_STATE_REQ_STOP_BA_MSK | |
139 | (initiator << HT_AGG_STATE_INITIATOR_SHIFT); | 139 | (initiator << HT_AGG_STATE_INITIATOR_SHIFT); |
140 | 140 | ||
141 | ret = drv_ampdu_action(local, IEEE80211_AMPDU_TX_STOP, | 141 | ret = drv_ampdu_action(local, &sta->sdata->vif, |
142 | IEEE80211_AMPDU_TX_STOP, | ||
142 | &sta->sta, tid, NULL); | 143 | &sta->sta, tid, NULL); |
143 | 144 | ||
144 | /* HW shall not deny going back to legacy */ | 145 | /* HW shall not deny going back to legacy */ |
@@ -196,11 +197,11 @@ static inline int ieee80211_ac_from_tid(int tid) | |||
196 | return ieee802_1d_to_ac[tid & 7]; | 197 | return ieee802_1d_to_ac[tid & 7]; |
197 | } | 198 | } |
198 | 199 | ||
199 | int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | 200 | int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid) |
200 | { | 201 | { |
201 | struct ieee80211_local *local = hw_to_local(hw); | 202 | struct sta_info *sta = container_of(pubsta, struct sta_info, sta); |
202 | struct sta_info *sta; | 203 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
203 | struct ieee80211_sub_if_data *sdata; | 204 | struct ieee80211_local *local = sdata->local; |
204 | u8 *state; | 205 | u8 *state; |
205 | int ret = 0; | 206 | int ret = 0; |
206 | u16 start_seq_num; | 207 | u16 start_seq_num; |
@@ -208,52 +209,37 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
208 | if (WARN_ON(!local->ops->ampdu_action)) | 209 | if (WARN_ON(!local->ops->ampdu_action)) |
209 | return -EINVAL; | 210 | return -EINVAL; |
210 | 211 | ||
211 | if ((tid >= STA_TID_NUM) || !(hw->flags & IEEE80211_HW_AMPDU_AGGREGATION)) | 212 | if ((tid >= STA_TID_NUM) || |
213 | !(local->hw.flags & IEEE80211_HW_AMPDU_AGGREGATION)) | ||
212 | return -EINVAL; | 214 | return -EINVAL; |
213 | 215 | ||
214 | #ifdef CONFIG_MAC80211_HT_DEBUG | 216 | #ifdef CONFIG_MAC80211_HT_DEBUG |
215 | printk(KERN_DEBUG "Open BA session requested for %pM tid %u\n", | 217 | printk(KERN_DEBUG "Open BA session requested for %pM tid %u\n", |
216 | ra, tid); | 218 | pubsta->addr, tid); |
217 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 219 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
218 | 220 | ||
219 | rcu_read_lock(); | ||
220 | |||
221 | sta = sta_info_get(local, ra); | ||
222 | if (!sta) { | ||
223 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
224 | printk(KERN_DEBUG "Could not find the station\n"); | ||
225 | #endif | ||
226 | ret = -ENOENT; | ||
227 | goto unlock; | ||
228 | } | ||
229 | |||
230 | /* | 221 | /* |
231 | * The aggregation code is not prepared to handle | 222 | * The aggregation code is not prepared to handle |
232 | * anything but STA/AP due to the BSSID handling. | 223 | * anything but STA/AP due to the BSSID handling. |
233 | * IBSS could work in the code but isn't supported | 224 | * IBSS could work in the code but isn't supported |
234 | * by drivers or the standard. | 225 | * by drivers or the standard. |
235 | */ | 226 | */ |
236 | if (sta->sdata->vif.type != NL80211_IFTYPE_STATION && | 227 | if (sdata->vif.type != NL80211_IFTYPE_STATION && |
237 | sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN && | 228 | sdata->vif.type != NL80211_IFTYPE_AP_VLAN && |
238 | sta->sdata->vif.type != NL80211_IFTYPE_AP) { | 229 | sdata->vif.type != NL80211_IFTYPE_AP) |
239 | ret = -EINVAL; | 230 | return -EINVAL; |
240 | goto unlock; | ||
241 | } | ||
242 | 231 | ||
243 | if (test_sta_flags(sta, WLAN_STA_SUSPEND)) { | 232 | if (test_sta_flags(sta, WLAN_STA_SUSPEND)) { |
244 | #ifdef CONFIG_MAC80211_HT_DEBUG | 233 | #ifdef CONFIG_MAC80211_HT_DEBUG |
245 | printk(KERN_DEBUG "Suspend in progress. " | 234 | printk(KERN_DEBUG "Suspend in progress. " |
246 | "Denying BA session request\n"); | 235 | "Denying BA session request\n"); |
247 | #endif | 236 | #endif |
248 | ret = -EINVAL; | 237 | return -EINVAL; |
249 | goto unlock; | ||
250 | } | 238 | } |
251 | 239 | ||
252 | spin_lock_bh(&sta->lock); | 240 | spin_lock_bh(&sta->lock); |
253 | spin_lock(&local->ampdu_lock); | 241 | spin_lock(&local->ampdu_lock); |
254 | 242 | ||
255 | sdata = sta->sdata; | ||
256 | |||
257 | /* we have tried too many times, receiver does not want A-MPDU */ | 243 | /* we have tried too many times, receiver does not want A-MPDU */ |
258 | if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { | 244 | if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { |
259 | ret = -EBUSY; | 245 | ret = -EBUSY; |
@@ -310,8 +296,9 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
310 | 296 | ||
311 | start_seq_num = sta->tid_seq[tid]; | 297 | start_seq_num = sta->tid_seq[tid]; |
312 | 298 | ||
313 | ret = drv_ampdu_action(local, IEEE80211_AMPDU_TX_START, | 299 | ret = drv_ampdu_action(local, &sdata->vif, |
314 | &sta->sta, tid, &start_seq_num); | 300 | IEEE80211_AMPDU_TX_START, |
301 | pubsta, tid, &start_seq_num); | ||
315 | 302 | ||
316 | if (ret) { | 303 | if (ret) { |
317 | #ifdef CONFIG_MAC80211_HT_DEBUG | 304 | #ifdef CONFIG_MAC80211_HT_DEBUG |
@@ -336,7 +323,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
336 | sta->ampdu_mlme.dialog_token_allocator; | 323 | sta->ampdu_mlme.dialog_token_allocator; |
337 | sta->ampdu_mlme.tid_tx[tid]->ssn = start_seq_num; | 324 | sta->ampdu_mlme.tid_tx[tid]->ssn = start_seq_num; |
338 | 325 | ||
339 | ieee80211_send_addba_request(sta->sdata, ra, tid, | 326 | ieee80211_send_addba_request(sdata, pubsta->addr, tid, |
340 | sta->ampdu_mlme.tid_tx[tid]->dialog_token, | 327 | sta->ampdu_mlme.tid_tx[tid]->dialog_token, |
341 | sta->ampdu_mlme.tid_tx[tid]->ssn, | 328 | sta->ampdu_mlme.tid_tx[tid]->ssn, |
342 | 0x40, 5000); | 329 | 0x40, 5000); |
@@ -348,7 +335,7 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
348 | #ifdef CONFIG_MAC80211_HT_DEBUG | 335 | #ifdef CONFIG_MAC80211_HT_DEBUG |
349 | printk(KERN_DEBUG "activated addBA response timer on tid %d\n", tid); | 336 | printk(KERN_DEBUG "activated addBA response timer on tid %d\n", tid); |
350 | #endif | 337 | #endif |
351 | goto unlock; | 338 | return 0; |
352 | 339 | ||
353 | err_free: | 340 | err_free: |
354 | kfree(sta->ampdu_mlme.tid_tx[tid]); | 341 | kfree(sta->ampdu_mlme.tid_tx[tid]); |
@@ -360,8 +347,6 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
360 | err_unlock_sta: | 347 | err_unlock_sta: |
361 | spin_unlock(&local->ampdu_lock); | 348 | spin_unlock(&local->ampdu_lock); |
362 | spin_unlock_bh(&sta->lock); | 349 | spin_unlock_bh(&sta->lock); |
363 | unlock: | ||
364 | rcu_read_unlock(); | ||
365 | return ret; | 350 | return ret; |
366 | } | 351 | } |
367 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); | 352 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); |
@@ -428,13 +413,15 @@ static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | |||
428 | ieee80211_agg_splice_finish(local, sta, tid); | 413 | ieee80211_agg_splice_finish(local, sta, tid); |
429 | spin_unlock(&local->ampdu_lock); | 414 | spin_unlock(&local->ampdu_lock); |
430 | 415 | ||
431 | drv_ampdu_action(local, IEEE80211_AMPDU_TX_OPERATIONAL, | 416 | drv_ampdu_action(local, &sta->sdata->vif, |
417 | IEEE80211_AMPDU_TX_OPERATIONAL, | ||
432 | &sta->sta, tid, NULL); | 418 | &sta->sta, tid, NULL); |
433 | } | 419 | } |
434 | 420 | ||
435 | void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid) | 421 | void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid) |
436 | { | 422 | { |
437 | struct ieee80211_local *local = hw_to_local(hw); | 423 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
424 | struct ieee80211_local *local = sdata->local; | ||
438 | struct sta_info *sta; | 425 | struct sta_info *sta; |
439 | u8 *state; | 426 | u8 *state; |
440 | 427 | ||
@@ -483,10 +470,11 @@ void ieee80211_start_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u16 tid) | |||
483 | } | 470 | } |
484 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb); | 471 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb); |
485 | 472 | ||
486 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, | 473 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, |
487 | const u8 *ra, u16 tid) | 474 | const u8 *ra, u16 tid) |
488 | { | 475 | { |
489 | struct ieee80211_local *local = hw_to_local(hw); | 476 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
477 | struct ieee80211_local *local = sdata->local; | ||
490 | struct ieee80211_ra_tid *ra_tid; | 478 | struct ieee80211_ra_tid *ra_tid; |
491 | struct sk_buff *skb = dev_alloc_skb(0); | 479 | struct sk_buff *skb = dev_alloc_skb(0); |
492 | 480 | ||
@@ -535,13 +523,12 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
535 | return ret; | 523 | return ret; |
536 | } | 524 | } |
537 | 525 | ||
538 | int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | 526 | int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid, |
539 | u8 *ra, u16 tid, | ||
540 | enum ieee80211_back_parties initiator) | 527 | enum ieee80211_back_parties initiator) |
541 | { | 528 | { |
542 | struct ieee80211_local *local = hw_to_local(hw); | 529 | struct sta_info *sta = container_of(pubsta, struct sta_info, sta); |
543 | struct sta_info *sta; | 530 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
544 | int ret = 0; | 531 | struct ieee80211_local *local = sdata->local; |
545 | 532 | ||
546 | if (WARN_ON(!local->ops->ampdu_action)) | 533 | if (WARN_ON(!local->ops->ampdu_action)) |
547 | return -EINVAL; | 534 | return -EINVAL; |
@@ -549,22 +536,14 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | |||
549 | if (tid >= STA_TID_NUM) | 536 | if (tid >= STA_TID_NUM) |
550 | return -EINVAL; | 537 | return -EINVAL; |
551 | 538 | ||
552 | rcu_read_lock(); | 539 | return __ieee80211_stop_tx_ba_session(sta, tid, initiator); |
553 | sta = sta_info_get(local, ra); | ||
554 | if (!sta) { | ||
555 | rcu_read_unlock(); | ||
556 | return -ENOENT; | ||
557 | } | ||
558 | |||
559 | ret = __ieee80211_stop_tx_ba_session(sta, tid, initiator); | ||
560 | rcu_read_unlock(); | ||
561 | return ret; | ||
562 | } | 540 | } |
563 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); | 541 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); |
564 | 542 | ||
565 | void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid) | 543 | void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid) |
566 | { | 544 | { |
567 | struct ieee80211_local *local = hw_to_local(hw); | 545 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
546 | struct ieee80211_local *local = sdata->local; | ||
568 | struct sta_info *sta; | 547 | struct sta_info *sta; |
569 | u8 *state; | 548 | u8 *state; |
570 | 549 | ||
@@ -627,10 +606,11 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_hw *hw, u8 *ra, u8 tid) | |||
627 | } | 606 | } |
628 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb); | 607 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb); |
629 | 608 | ||
630 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_hw *hw, | 609 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, |
631 | const u8 *ra, u16 tid) | 610 | const u8 *ra, u16 tid) |
632 | { | 611 | { |
633 | struct ieee80211_local *local = hw_to_local(hw); | 612 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
613 | struct ieee80211_local *local = sdata->local; | ||
634 | struct ieee80211_ra_tid *ra_tid; | 614 | struct ieee80211_ra_tid *ra_tid; |
635 | struct sk_buff *skb = dev_alloc_skb(0); | 615 | struct sk_buff *skb = dev_alloc_skb(0); |
636 | 616 | ||
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index 020a94a3110..921dd9c9ff6 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -239,15 +239,16 @@ static inline int drv_tx_last_beacon(struct ieee80211_local *local) | |||
239 | } | 239 | } |
240 | 240 | ||
241 | static inline int drv_ampdu_action(struct ieee80211_local *local, | 241 | static inline int drv_ampdu_action(struct ieee80211_local *local, |
242 | struct ieee80211_vif *vif, | ||
242 | enum ieee80211_ampdu_mlme_action action, | 243 | enum ieee80211_ampdu_mlme_action action, |
243 | struct ieee80211_sta *sta, u16 tid, | 244 | struct ieee80211_sta *sta, u16 tid, |
244 | u16 *ssn) | 245 | u16 *ssn) |
245 | { | 246 | { |
246 | int ret = -EOPNOTSUPP; | 247 | int ret = -EOPNOTSUPP; |
247 | if (local->ops->ampdu_action) | 248 | if (local->ops->ampdu_action) |
248 | ret = local->ops->ampdu_action(&local->hw, action, | 249 | ret = local->ops->ampdu_action(&local->hw, vif, action, |
249 | sta, tid, ssn); | 250 | sta, tid, ssn); |
250 | trace_drv_ampdu_action(local, action, sta, tid, ssn, ret); | 251 | trace_drv_ampdu_action(local, vif, action, sta, tid, ssn, ret); |
251 | return ret; | 252 | return ret; |
252 | } | 253 | } |
253 | 254 | ||
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h index 37b9051afcf..b8fef1d1136 100644 --- a/net/mac80211/driver-trace.h +++ b/net/mac80211/driver-trace.h | |||
@@ -634,11 +634,12 @@ TRACE_EVENT(drv_tx_last_beacon, | |||
634 | 634 | ||
635 | TRACE_EVENT(drv_ampdu_action, | 635 | TRACE_EVENT(drv_ampdu_action, |
636 | TP_PROTO(struct ieee80211_local *local, | 636 | TP_PROTO(struct ieee80211_local *local, |
637 | struct ieee80211_vif *vif, | ||
637 | enum ieee80211_ampdu_mlme_action action, | 638 | enum ieee80211_ampdu_mlme_action action, |
638 | struct ieee80211_sta *sta, u16 tid, | 639 | struct ieee80211_sta *sta, u16 tid, |
639 | u16 *ssn, int ret), | 640 | u16 *ssn, int ret), |
640 | 641 | ||
641 | TP_ARGS(local, action, sta, tid, ssn, ret), | 642 | TP_ARGS(local, vif, action, sta, tid, ssn, ret), |
642 | 643 | ||
643 | TP_STRUCT__entry( | 644 | TP_STRUCT__entry( |
644 | LOCAL_ENTRY | 645 | LOCAL_ENTRY |
@@ -647,10 +648,12 @@ TRACE_EVENT(drv_ampdu_action, | |||
647 | __field(u16, tid) | 648 | __field(u16, tid) |
648 | __field(u16, ssn) | 649 | __field(u16, ssn) |
649 | __field(int, ret) | 650 | __field(int, ret) |
651 | VIF_ENTRY | ||
650 | ), | 652 | ), |
651 | 653 | ||
652 | TP_fast_assign( | 654 | TP_fast_assign( |
653 | LOCAL_ASSIGN; | 655 | LOCAL_ASSIGN; |
656 | VIF_ASSIGN; | ||
654 | STA_ASSIGN; | 657 | STA_ASSIGN; |
655 | __entry->ret = ret; | 658 | __entry->ret = ret; |
656 | __entry->action = action; | 659 | __entry->action = action; |
@@ -659,8 +662,8 @@ TRACE_EVENT(drv_ampdu_action, | |||
659 | ), | 662 | ), |
660 | 663 | ||
661 | TP_printk( | 664 | TP_printk( |
662 | LOCAL_PR_FMT STA_PR_FMT " action:%d tid:%d ret:%d", | 665 | LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d ret:%d", |
663 | LOCAL_PR_ARG, STA_PR_ARG, __entry->action, __entry->tid, __entry->ret | 666 | LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->action, __entry->tid, __entry->ret |
664 | ) | 667 | ) |
665 | ); | 668 | ); |
666 | #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ | 669 | #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ |
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c index 48ef1a282b9..345c8ee5017 100644 --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c | |||
@@ -141,7 +141,6 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | |||
141 | struct sta_info *sta, | 141 | struct sta_info *sta, |
142 | struct ieee80211_mgmt *mgmt, size_t len) | 142 | struct ieee80211_mgmt *mgmt, size_t len) |
143 | { | 143 | { |
144 | struct ieee80211_local *local = sdata->local; | ||
145 | u16 tid, params; | 144 | u16 tid, params; |
146 | u16 initiator; | 145 | u16 initiator; |
147 | 146 | ||
@@ -164,7 +163,7 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | |||
164 | sta->ampdu_mlme.tid_state_tx[tid] = | 163 | sta->ampdu_mlme.tid_state_tx[tid] = |
165 | HT_AGG_STATE_OPERATIONAL; | 164 | HT_AGG_STATE_OPERATIONAL; |
166 | spin_unlock_bh(&sta->lock); | 165 | spin_unlock_bh(&sta->lock); |
167 | ieee80211_stop_tx_ba_session(&local->hw, sta->sta.addr, tid, | 166 | ieee80211_stop_tx_ba_session(&sta->sta, tid, |
168 | WLAN_BACK_RECIPIENT); | 167 | WLAN_BACK_RECIPIENT); |
169 | } | 168 | } |
170 | } | 169 | } |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index b63b99fb2fd..b7598db5ade 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -771,8 +771,9 @@ IEEE80211_DEV_TO_SUB_IF(struct net_device *dev) | |||
771 | return netdev_priv(dev); | 771 | return netdev_priv(dev); |
772 | } | 772 | } |
773 | 773 | ||
774 | /* this struct represents 802.11n's RA/TID combination */ | 774 | /* this struct represents 802.11n's RA/TID combination along with our vif */ |
775 | struct ieee80211_ra_tid { | 775 | struct ieee80211_ra_tid { |
776 | struct ieee80211_vif *vif; | ||
776 | u8 ra[ETH_ALEN]; | 777 | u8 ra[ETH_ALEN]; |
777 | u16 tid; | 778 | u16 tid; |
778 | }; | 779 | }; |
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index c74a6a1935b..f4be97c3b74 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -296,14 +296,14 @@ static void ieee80211_tasklet_handler(unsigned long data) | |||
296 | break; | 296 | break; |
297 | case IEEE80211_DELBA_MSG: | 297 | case IEEE80211_DELBA_MSG: |
298 | ra_tid = (struct ieee80211_ra_tid *) &skb->cb; | 298 | ra_tid = (struct ieee80211_ra_tid *) &skb->cb; |
299 | ieee80211_stop_tx_ba_cb(local_to_hw(local), | 299 | ieee80211_stop_tx_ba_cb(ra_tid->vif, ra_tid->ra, |
300 | ra_tid->ra, ra_tid->tid); | 300 | ra_tid->tid); |
301 | dev_kfree_skb(skb); | 301 | dev_kfree_skb(skb); |
302 | break; | 302 | break; |
303 | case IEEE80211_ADDBA_MSG: | 303 | case IEEE80211_ADDBA_MSG: |
304 | ra_tid = (struct ieee80211_ra_tid *) &skb->cb; | 304 | ra_tid = (struct ieee80211_ra_tid *) &skb->cb; |
305 | ieee80211_start_tx_ba_cb(local_to_hw(local), | 305 | ieee80211_start_tx_ba_cb(ra_tid->vif, ra_tid->ra, |
306 | ra_tid->ra, ra_tid->tid); | 306 | ra_tid->tid); |
307 | dev_kfree_skb(skb); | 307 | dev_kfree_skb(skb); |
308 | break ; | 308 | break ; |
309 | default: | 309 | default: |