diff options
Diffstat (limited to 'package/bcm43xx-mac80211/src/bcm43xx/bcm43xx_dma.c')
-rw-r--r-- | package/bcm43xx-mac80211/src/bcm43xx/bcm43xx_dma.c | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/package/bcm43xx-mac80211/src/bcm43xx/bcm43xx_dma.c b/package/bcm43xx-mac80211/src/bcm43xx/bcm43xx_dma.c index c8b5cddc3..814e1ad07 100644 --- a/package/bcm43xx-mac80211/src/bcm43xx/bcm43xx_dma.c +++ b/package/bcm43xx-mac80211/src/bcm43xx/bcm43xx_dma.c @@ -259,6 +259,28 @@ static inline int prev_slot(struct bcm43xx_dmaring *ring, int slot) return slot - 1; } +#ifdef CONFIG_BCM43XX_MAC80211_DEBUG +static void update_max_used_slots(struct bcm43xx_dmaring *ring, + int current_used_slots) +{ + if (current_used_slots <= ring->max_used_slots) + return; + ring->max_used_slots = current_used_slots; + if (bcm43xx_debug(ring->dev, BCM43xx_DBG_DMAVERBOSE)) { + dprintk(KERN_DEBUG PFX + "max_used_slots increased to %d on %s ring %d\n", + ring->max_used_slots, + ring->tx ? "TX" : "RX", + ring->index); + } +} +#else +static inline +void update_max_used_slots(struct bcm43xx_dmaring *ring, + int current_used_slots) +{ } +#endif /* DEBUG */ + /* Request a slot for usage. */ static inline int request_slot(struct bcm43xx_dmaring *ring) @@ -273,23 +295,11 @@ int request_slot(struct bcm43xx_dmaring *ring) ring->current_slot = slot; ring->used_slots++; -#ifdef CONFIG_BCM43XX_MAC80211_DEBUG - if (ring->used_slots > ring->max_used_slots) - ring->max_used_slots = ring->used_slots; -#endif /* CONFIG_BCM43XX_MAC80211_DEBUG*/ + update_max_used_slots(ring, ring->used_slots); return slot; } -/* Return a slot to the free slots. */ -static inline -void return_slot(struct bcm43xx_dmaring *ring, int slot) -{ - assert(ring->tx); - - ring->used_slots--; -} - /* Mac80211-queue to bcm43xx-ring mapping */ static struct bcm43xx_dmaring * priority_to_txring(struct bcm43xx_wldev *dev, int queue_priority) @@ -1254,6 +1264,10 @@ int bcm43xx_dma_tx(struct bcm43xx_wldev *dev, /* This TX ring is full. */ ieee80211_stop_queue(dev->wl->hw, txring_to_priority(ring)); ring->stopped = 1; + if (bcm43xx_debug(dev, BCM43xx_DBG_DMAVERBOSE)) { + dprintk(KERN_DEBUG PFX "Stopped TX ring %d\n", + ring->index); + } } out_unlock: spin_unlock_irqrestore(&ring->lock, flags); @@ -1305,10 +1319,9 @@ void bcm43xx_dma_handle_txstatus(struct bcm43xx_wldev *dev, */ assert(meta->skb == NULL); } - /* Everything belonging to the slot is unmapped - * and freed, so we can return it. - */ - return_slot(ring, slot); + + /* Everything unmapped and free'd. So it's not used anymore. */ + ring->used_slots--; if (meta->is_last_fragment) break; @@ -1319,6 +1332,10 @@ void bcm43xx_dma_handle_txstatus(struct bcm43xx_wldev *dev, assert(free_slots(ring) >= SLOTS_PER_PACKET); ieee80211_wake_queue(dev->wl->hw, txring_to_priority(ring)); ring->stopped = 0; + if (bcm43xx_debug(dev, BCM43xx_DBG_DMAVERBOSE)) { + dprintk(KERN_DEBUG PFX "Woke up TX ring %d\n", + ring->index); + } } spin_unlock(&ring->lock); @@ -1445,9 +1462,7 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring) { const struct bcm43xx_dma_ops *ops = ring->ops; int slot, current_slot; -#ifdef CONFIG_BCM43XX_MAC80211_DEBUG int used_slots = 0; -#endif assert(!ring->tx); current_slot = ops->get_current_rxslot(ring); @@ -1456,10 +1471,7 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring) slot = ring->current_slot; for ( ; slot != current_slot; slot = next_slot(ring, slot)) { dma_rx(ring, &slot); -#ifdef CONFIG_BCM43XX_MAC80211_DEBUG - if (++used_slots > ring->max_used_slots) - ring->max_used_slots = used_slots; -#endif + update_max_used_slots(ring, ++used_slots); } ops->set_current_rxslot(ring, slot); ring->current_slot = slot; |