|
@@ -1366,15 +1366,25 @@ int b43legacy_dma_tx(struct b43legacy_wldev *dev,
|
|
|
ring = priority_to_txring(dev, skb_get_queue_mapping(skb));
|
|
|
spin_lock_irqsave(&ring->lock, flags);
|
|
|
B43legacy_WARN_ON(!ring->tx);
|
|
|
- if (unlikely(free_slots(ring) < SLOTS_PER_PACKET)) {
|
|
|
- b43legacywarn(dev->wl, "DMA queue overflow\n");
|
|
|
+
|
|
|
+ if (unlikely(ring->stopped)) {
|
|
|
+ /* We get here only because of a bug in mac80211.
|
|
|
+ * Because of a race, one packet may be queued after
|
|
|
+ * the queue is stopped, thus we got called when we shouldn't.
|
|
|
+ * For now, just refuse the transmit. */
|
|
|
+ if (b43legacy_debug(dev, B43legacy_DBG_DMAVERBOSE))
|
|
|
+ b43legacyerr(dev->wl, "Packet after queue stopped\n");
|
|
|
+ err = -ENOSPC;
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (unlikely(WARN_ON(free_slots(ring) < SLOTS_PER_PACKET))) {
|
|
|
+ /* If we get here, we have a real error with the queue
|
|
|
+ * full, but queues not stopped. */
|
|
|
+ b43legacyerr(dev->wl, "DMA queue overflow\n");
|
|
|
err = -ENOSPC;
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
- /* Check if the queue was stopped in mac80211,
|
|
|
- * but we got called nevertheless.
|
|
|
- * That would be a mac80211 bug. */
|
|
|
- B43legacy_BUG_ON(ring->stopped);
|
|
|
|
|
|
err = dma_tx_fragment(ring, skb);
|
|
|
if (unlikely(err == -ENOKEY)) {
|