On Fri, Jan 20, 2012 at 8:29 AM, Andreas Hartmann <andihartmann@xxxxxxxxxxxxxxx> wrote: > All in one: Your workaround was a good idea, but unfortunately it > doesn't "solve" / workaround the problem introduced with the patch > "mac80211: retry sending failed BAR frames later instead of tearing > down aggr" [1]. I don't know off any other solution at this time as to revert it. Ok, so we've got at least one hw issue here: rt2800 is not able to report correct ACK state of BARs :( The interesting bit is that the legacy drivers tear the BA session down as soon as the first AMPDU subframe failed. That's the same behavior as mac80211 had before the mentioned patch. So, let's assume the generic way Felix implemented works for other devices (like ath9k) we could go with a workaround inside rt2x00 to tear down the BA session as soon as the first AMPDU frame failed. Mind to try that one (not even compile tested though :) ). Signed-off-by: Helmut Schaa <helmut.schaa@xxxxxxxxxxxxxx> --- diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c930ce0..9038934 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -420,8 +420,16 @@ void rt2x00lib_txdone(struct queue_entry *entry, tx_info->status.ampdu_len = 1; tx_info->status.ampdu_ack_len = success ? 1 : 0; - if (!success) - tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; + if (!success && ieee80211_is_data_qos(hdr->frame_control)) { + /* + * Tear down BA session + */ + struct ieee80211_sta *sta = tx_info->control.sta; + u8 *qc = ieee80211_get_qos_ctl(hdr); + int tid = *qc & IEEE80211_QOS_CTL_TID_MASK; + + ieee80211_stop_tx_ba_session(sta, tid); + } } if (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) { -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html