Some clients seem to rely upon the reception of BlockAckReqs to flush
their rx reorder buffer. In order to fix aggregation for these clients
rt2x00 should send a BlockAckReq if the transmission of an AMPDU
subframe fails.
Introduce a new flag TXDONE_AMPDU to indicate that this is an AMPDU
subframe and pass IEEE80211_TX_STAT_AMPDU_NO_BACK to mac80211 if an
AMPDU subframe failed during transmission.
This fixes aggregation problems with Intel 5100 Windows STAs (and maybe
others as well).
Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
                mcs = real_mcs;
        }
 
+       if (aggr == 1 || ampdu == 1)
+               __set_bit(TXDONE_AMPDU, &txdesc.flags);
+
        /*
         * Ralink has a retry mechanism using a global fallback
         * table. We setup this fallback table to try the immediate
 
         * which would allow the rc algorithm to better decide on
         * which rates are suitable.
         */
-       if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
+       if (test_bit(TXDONE_AMPDU, &txdesc->flags) ||
+           tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
                tx_info->flags |= IEEE80211_TX_STAT_AMPDU;
                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 (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) {
 
        TXDONE_FALLBACK,
        TXDONE_FAILURE,
        TXDONE_EXCESSIVE_RETRY,
+       TXDONE_AMPDU,
 };
 
 /**