Merge branch 'master' of git://github.com/chunkeey/carl9170fw
[carl9170fw.git] / carlfw / src / wlan.c
index cc2505538884a73d210efea0f6a8b0cacce84038..b8d4ec436fca3f54ed5708c80407c4b9fc75e4cb 100644 (file)
@@ -345,6 +345,16 @@ static bool wlan_tx_status(struct dma_queue *queue,
        /* update hangcheck */
        fw.wlan.last_super_num[qidx] = 0;
 
+       /*
+        * Note:
+        * There could be a corner case when the TXFAIL is set
+        * even though the frame was properly ACKed by the peer:
+        *   a BlockAckReq with the immediate policy will cause
+        *   the receiving peer to produce a BlockACK unfortunately
+        *   the MAC in this chip seems to be expecting a legacy
+        *   ACK and marks the BAR as failed!
+        */
+
        if (!!(desc->ctrl & AR9170_CTRL_FAIL)) {
                txfail = !!(desc->ctrl & AR9170_CTRL_TXFAIL);
 
@@ -447,6 +457,18 @@ static bool wlan_tx_status(struct dma_queue *queue,
                fw.wlan.cab_queue_len[super->s.vif_id]--;
 #endif /* CONFIG_CARL9170FW_CAB_QUEUE */
 
+       if (unlikely(ieee80211_is_back_req(super->f.data.i3e.frame_control))) {
+               /*
+                * As explained above, the hardware seems to be
+                * incapable of matching BA to BARs. This is a
+                * problem especially with mac80211, because it
+                * does resent failed BARs which of course cause
+                * some mayhem in the receiver buffer at the HT
+                * peer on the other end.
+                */
+               success = true;
+       }
+
        wlan_tx_complete(super, success);
 
        /* recycle freed descriptors */