carl9170 firmware: double check if unlinked desc matches head desc
[carl9170fw.git] / carlfw / src / wlan.c
index 26a2425f5afdd6e78c72ff484dab6378eb050739..a7c805b588908267541bd994f6c878a0abea16c2 100644 (file)
@@ -343,8 +343,6 @@ static void _wlan_tx(struct dma_desc *desc)
                            get(AR9170_MAC_REG_AMPDU_FACTOR),
                            8 << super->s.ampdu_factor));
        }
-
-       __wlan_tx(desc);
 }
 
 /* propagate transmission status back to the driver */
@@ -410,7 +408,11 @@ static bool wlan_tx_status(struct dma_queue *queue,
                                 * be aware of this so the frames don't get lost.
                                 */
 
+#ifndef CONFIG_CARL9170FW_DEBUG
                                dma_unlink_head(queue);
+#else /* CONFIG_CARL9170FW_DEBUG */
+                               BUG_ON(dma_unlink_head(queue) != desc);
+#endif /* CONFIG_CARL9170FW_DEBUG */
                                dma_put(&fw.wlan.tx_retry, desc);
                                return true;
                        }
@@ -420,7 +422,11 @@ static bool wlan_tx_status(struct dma_queue *queue,
                }
        }
 
+#ifndef CONFIG_CARL9170FW_DEBUG
        dma_unlink_head(queue);
+#else /* CONFIG_CARL9170FW_DEBUG */
+       BUG_ON(dma_unlink_head(queue) != desc);
+#endif /* CONFIG_CARL9170FW_DEBUG */
        if (txfail) {
                /*
                 * Issue the queue bump,
@@ -498,6 +504,7 @@ void __hot wlan_tx(struct dma_desc *desc)
 #endif /* CONFIG_CARL9170FW_CAB_QUEUE */
 
        _wlan_tx(desc);
+       __wlan_tx(desc);
        wlan_trigger(BIT(super->s.queue));
 }
 
@@ -759,6 +766,7 @@ void wlan_cab_flush_queue(const unsigned int vif)
 
                /* ready to roll! */
                _wlan_tx(desc);
+               __wlan_tx(desc);
                wlan_trigger(BIT(super->s.queue));
        }
 }