summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/cw1200/queue.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/staging/cw1200/queue.c b/drivers/staging/cw1200/queue.c
index 19db63aa5bf..ba2cc436eaf 100644
--- a/drivers/staging/cw1200/queue.c
+++ b/drivers/staging/cw1200/queue.c
@@ -319,7 +319,13 @@ int cw1200_queue_put(struct cw1200_queue *queue,
++stats->link_map_cache[txpriv->link_id];
spin_unlock_bh(&stats->lock);
- if (queue->num_queued >= queue->capacity) {
+ /*
+ * TX may happen in parallel sometimes.
+ * Leave extra queue slots so we don't overflow.
+ */
+ if (queue->overfull == false &&
+ queue->num_queued >=
+ (queue->capacity - (num_present_cpus() - 1))) {
queue->overfull = true;
__cw1200_queue_lock(queue);
mod_timer(&queue->gc, jiffies);