diff options
-rw-r--r-- | net/mac80211/agg-tx.c | 17 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 9 |
2 files changed, 10 insertions, 16 deletions
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index e90911819ed4..13b7683de5a4 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -296,7 +296,7 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
296 | IEEE80211_AMPDU_TX_STOP_FLUSH_CONT, | 296 | IEEE80211_AMPDU_TX_STOP_FLUSH_CONT, |
297 | &sta->sta, tid, NULL, 0); | 297 | &sta->sta, tid, NULL, 0); |
298 | WARN_ON_ONCE(ret); | 298 | WARN_ON_ONCE(ret); |
299 | goto remove_tid_tx; | 299 | return 0; |
300 | } | 300 | } |
301 | 301 | ||
302 | if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) { | 302 | if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) { |
@@ -354,12 +354,15 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
354 | */ | 354 | */ |
355 | } | 355 | } |
356 | 356 | ||
357 | if (reason == AGG_STOP_DESTROY_STA) { | 357 | /* |
358 | remove_tid_tx: | 358 | * In the case of AGG_STOP_DESTROY_STA, the driver won't |
359 | spin_lock_bh(&sta->lock); | 359 | * necessarily call ieee80211_stop_tx_ba_cb(), so this may |
360 | ieee80211_remove_tid_tx(sta, tid); | 360 | * seem like we can leave the tid_tx data pending forever. |
361 | spin_unlock_bh(&sta->lock); | 361 | * This is true, in a way, but "forever" is only until the |
362 | } | 362 | * station struct is actually destroyed. In the meantime, |
363 | * leaving it around ensures that we don't transmit packets | ||
364 | * to the driver on this TID which might confuse it. | ||
365 | */ | ||
363 | 366 | ||
364 | return 0; | 367 | return 0; |
365 | } | 368 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 344ef7d47c1a..62e8f890fed6 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1487,7 +1487,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1487 | { | 1487 | { |
1488 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 1488 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
1489 | struct ieee80211_local *local = sdata->local; | 1489 | struct ieee80211_local *local = sdata->local; |
1490 | struct sta_info *sta; | ||
1491 | u32 changed = 0; | 1490 | u32 changed = 0; |
1492 | 1491 | ||
1493 | ASSERT_MGD_MTX(ifmgd); | 1492 | ASSERT_MGD_MTX(ifmgd); |
@@ -1519,14 +1518,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1519 | netif_tx_stop_all_queues(sdata->dev); | 1518 | netif_tx_stop_all_queues(sdata->dev); |
1520 | netif_carrier_off(sdata->dev); | 1519 | netif_carrier_off(sdata->dev); |
1521 | 1520 | ||
1522 | mutex_lock(&local->sta_mtx); | ||
1523 | sta = sta_info_get(sdata, ifmgd->bssid); | ||
1524 | if (sta) { | ||
1525 | set_sta_flag(sta, WLAN_STA_BLOCK_BA); | ||
1526 | ieee80211_sta_tear_down_BA_sessions(sta, AGG_STOP_DESTROY_STA); | ||
1527 | } | ||
1528 | mutex_unlock(&local->sta_mtx); | ||
1529 | |||
1530 | /* | 1521 | /* |
1531 | * if we want to get out of ps before disassoc (why?) we have | 1522 | * if we want to get out of ps before disassoc (why?) we have |
1532 | * to do it before sending disassoc, as otherwise the null-packet | 1523 | * to do it before sending disassoc, as otherwise the null-packet |