|
@@ -112,15 +112,16 @@
|
|
|
*/
|
|
|
static int iwl_rxq_space(const struct iwl_rxq *rxq)
|
|
|
{
|
|
|
- int s = rxq->read - rxq->write;
|
|
|
-
|
|
|
- if (s <= 0)
|
|
|
- s += RX_QUEUE_SIZE;
|
|
|
- /* keep some buffer to not confuse full and empty queue */
|
|
|
- s -= 2;
|
|
|
- if (s < 0)
|
|
|
- s = 0;
|
|
|
- return s;
|
|
|
+ /* Make sure RX_QUEUE_SIZE is a power of 2 */
|
|
|
+ BUILD_BUG_ON(RX_QUEUE_SIZE & (RX_QUEUE_SIZE - 1));
|
|
|
+
|
|
|
+ /*
|
|
|
+ * There can be up to (RX_QUEUE_SIZE - 1) free slots, to avoid ambiguity
|
|
|
+ * between empty and completely full queues.
|
|
|
+ * The following is equivalent to modulo by RX_QUEUE_SIZE and is well
|
|
|
+ * defined for negative dividends.
|
|
|
+ */
|
|
|
+ return (rxq->read - rxq->write - 1) & (RX_QUEUE_SIZE - 1);
|
|
|
}
|
|
|
|
|
|
/*
|