iwlwifi: pcie: Refactor iwl_queue_space

Reduce the ambiguity spares to a single element if the window size is not
smaller than the queue size. If smaller, no spares are required at all.

Signed-off-by: Ido Yariv <ido@wizery.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Ido Yariv 2013-07-15 11:51:48 -04:00 committed by Johannes Berg
parent f4f3c65984
commit a9b2924643
1 changed files with 22 additions and 10 deletions

View File

@ -65,18 +65,30 @@
***************************************************/
static int iwl_queue_space(const struct iwl_queue *q)
{
int s = q->read_ptr - q->write_ptr;
unsigned int max;
unsigned int used;
if (q->read_ptr > q->write_ptr)
s -= q->n_bd;
/*
* To avoid ambiguity between empty and completely full queues, there
* should always be less than q->n_bd elements in the queue.
* If q->n_window is smaller than q->n_bd, there is no need to reserve
* any queue entries for this purpose.
*/
if (q->n_window < q->n_bd)
max = q->n_window;
else
max = q->n_bd - 1;
if (s <= 0)
s += q->n_window;
/* keep some reserve to not confuse empty and full situations */
s -= 2;
if (s < 0)
s = 0;
return s;
/*
* q->n_bd is a power of 2, so the following is equivalent to modulo by
* q->n_bd and is well defined for negative dividends.
*/
used = (q->write_ptr - q->read_ptr) & (q->n_bd - 1);
if (WARN_ON(used > max))
return 0;
return max - used;
}
/*