|
@@ -259,6 +259,28 @@ static inline int prev_slot(struct bcm43xx_dmaring *ring, int slot)
|
|
|
return slot - 1;
|
|
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. */
|
|
/* Request a slot for usage. */
|
|
|
static inline
|
|
static inline
|
|
|
int request_slot(struct bcm43xx_dmaring *ring)
|
|
int request_slot(struct bcm43xx_dmaring *ring)
|
|
@@ -273,23 +295,11 @@ int request_slot(struct bcm43xx_dmaring *ring)
|
|
|
ring->current_slot = slot;
|
|
ring->current_slot = slot;
|
|
|
ring->used_slots++;
|
|
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 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 */
|
|
/* Mac80211-queue to bcm43xx-ring mapping */
|
|
|
static struct bcm43xx_dmaring * priority_to_txring(struct bcm43xx_wldev *dev,
|
|
static struct bcm43xx_dmaring * priority_to_txring(struct bcm43xx_wldev *dev,
|
|
|
int queue_priority)
|
|
int queue_priority)
|
|
@@ -1254,6 +1264,10 @@ int bcm43xx_dma_tx(struct bcm43xx_wldev *dev,
|
|
|
/* This TX ring is full. */
|
|
/* This TX ring is full. */
|
|
|
ieee80211_stop_queue(dev->wl->hw, txring_to_priority(ring));
|
|
ieee80211_stop_queue(dev->wl->hw, txring_to_priority(ring));
|
|
|
ring->stopped = 1;
|
|
ring->stopped = 1;
|
|
|
|
|
+ if (bcm43xx_debug(dev, BCM43xx_DBG_DMAVERBOSE)) {
|
|
|
|
|
+ dprintk(KERN_DEBUG PFX "Stopped TX ring %d\n",
|
|
|
|
|
+ ring->index);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
out_unlock:
|
|
out_unlock:
|
|
|
spin_unlock_irqrestore(&ring->lock, flags);
|
|
spin_unlock_irqrestore(&ring->lock, flags);
|
|
@@ -1305,10 +1319,9 @@ void bcm43xx_dma_handle_txstatus(struct bcm43xx_wldev *dev,
|
|
|
*/
|
|
*/
|
|
|
assert(meta->skb == NULL);
|
|
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)
|
|
if (meta->is_last_fragment)
|
|
|
break;
|
|
break;
|
|
@@ -1319,6 +1332,10 @@ void bcm43xx_dma_handle_txstatus(struct bcm43xx_wldev *dev,
|
|
|
assert(free_slots(ring) >= SLOTS_PER_PACKET);
|
|
assert(free_slots(ring) >= SLOTS_PER_PACKET);
|
|
|
ieee80211_wake_queue(dev->wl->hw, txring_to_priority(ring));
|
|
ieee80211_wake_queue(dev->wl->hw, txring_to_priority(ring));
|
|
|
ring->stopped = 0;
|
|
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);
|
|
spin_unlock(&ring->lock);
|
|
@@ -1445,9 +1462,7 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring)
|
|
|
{
|
|
{
|
|
|
const struct bcm43xx_dma_ops *ops = ring->ops;
|
|
const struct bcm43xx_dma_ops *ops = ring->ops;
|
|
|
int slot, current_slot;
|
|
int slot, current_slot;
|
|
|
-#ifdef CONFIG_BCM43XX_MAC80211_DEBUG
|
|
|
|
|
int used_slots = 0;
|
|
int used_slots = 0;
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
assert(!ring->tx);
|
|
assert(!ring->tx);
|
|
|
current_slot = ops->get_current_rxslot(ring);
|
|
current_slot = ops->get_current_rxslot(ring);
|
|
@@ -1456,10 +1471,7 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring)
|
|
|
slot = ring->current_slot;
|
|
slot = ring->current_slot;
|
|
|
for ( ; slot != current_slot; slot = next_slot(ring, slot)) {
|
|
for ( ; slot != current_slot; slot = next_slot(ring, slot)) {
|
|
|
dma_rx(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);
|
|
ops->set_current_rxslot(ring, slot);
|
|
|
ring->current_slot = slot;
|
|
ring->current_slot = slot;
|