diff options
-rw-r--r-- | drivers/staging/cw1200/queue.c | 8 |
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); |