return entry;
 }
 
-static bool brcmf_fws_mac_desc_ready(struct brcmf_fws_mac_descriptor *entry,
-                                    int fifo)
+static bool brcmf_fws_mac_desc_closed(struct brcmf_fws_mac_descriptor *entry,
+                                     int fifo)
 {
-       bool ready;
+       bool closed;
 
-       /*
-        * destination entry is ready when firmware says it is OPEN
-        * and there are no packets enqueued for it.
+       /* an entry is closed when the state is closed and
+        * the firmware did not request anything.
         */
-       ready = entry->state == BRCMF_FWS_STATE_OPEN &&
-               !entry->suppressed &&
-               brcmu_pktq_mlen(&entry->psq, 3 << (fifo * 2)) == 0;
+       closed = entry->state == BRCMF_FWS_STATE_CLOSE &&
+                !entry->requested_credit && !entry->requested_packet;
 
-       /*
-        * Or when the destination entry is CLOSED, but firmware has
-        * specifically requested packets for this entry.
-        */
-       ready = ready || (entry->state == BRCMF_FWS_STATE_CLOSE &&
-               (entry->requested_credit + entry->requested_packet));
-       return ready;
+       /* Or firmware does not allow traffic for given fifo */
+       return closed || !(entry->ac_bitmap & BIT(fifo));
 }
 
 static void brcmf_fws_mac_desc_cleanup(struct brcmf_fws_info *fws,
 
        for (i = 0; i < num_nodes; i++) {
                entry = &table[(node_pos + i) % num_nodes];
-               if (!entry->occupied)
+               if (!entry->occupied || brcmf_fws_mac_desc_closed(entry, fifo))
                        continue;
 
                if (entry->suppressed)
                  multicast, fifo);
 
        brcmf_fws_lock(drvr, flags);
-       if (!brcmf_fws_mac_desc_ready(skcb->mac, fifo) ||
+       if (skcb->mac->suppressed ||
+           brcmf_fws_mac_desc_closed(skcb->mac, fifo) ||
+           brcmu_pktq_mlen(&skcb->mac->psq, 3 << (fifo * 2)) ||
            (!multicast &&
             brcmf_fws_consume_credit(drvr->fws, fifo, skb) < 0)) {
                /* enqueue the packet in delayQ */