rt2x00: Move direct access to queue->entries to rt2x00queue.c
All access to queue->entries through the Q_INDEX/Q_INDEX_DONE variables must be done using spinlock protection. It is best to manage this completely from rt2x00queue.c. For safely looping through all entries in the queue, the function rt2x00queue_for_each_entry is added which will walk from from a index range in a safe manner. This also fixes rt2x00usb which walked the entries list from 0 to length to kill each entry (killing entries must be done from Q_INDEX_DONE to Q_INDEX to enforce TX status reporting to occur in the correct order. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
ee1e755f84
commit
5eb7efe8a4
4 changed files with 87 additions and 61 deletions
|
@ -629,7 +629,7 @@ static void rt2800pci_write_tx_desc(struct queue_entry *entry,
|
|||
static void rt2800pci_kick_tx_queue(struct data_queue *queue)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
|
||||
unsigned int idx = queue->index[Q_INDEX];
|
||||
struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);
|
||||
unsigned int qidx = 0;
|
||||
|
||||
if (queue->qid == QID_MGMT)
|
||||
|
@ -637,7 +637,7 @@ static void rt2800pci_kick_tx_queue(struct data_queue *queue)
|
|||
else
|
||||
qidx = queue->qid;
|
||||
|
||||
rt2800_register_write(rt2x00dev, TX_CTX_IDX(qidx), idx);
|
||||
rt2800_register_write(rt2x00dev, TX_CTX_IDX(qidx), entry->entry_idx);
|
||||
}
|
||||
|
||||
static void rt2800pci_kill_tx_queue(struct data_queue *queue)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue