diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00lib.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.h | 23 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 20 |
5 files changed, 43 insertions, 25 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index af25b0152cbc..2e490e0998da 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -225,7 +225,7 @@ EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt); | |||
225 | void rt2x00lib_dmastart(struct queue_entry *entry) | 225 | void rt2x00lib_dmastart(struct queue_entry *entry) |
226 | { | 226 | { |
227 | set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 227 | set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
228 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | 228 | rt2x00queue_index_inc(entry, Q_INDEX); |
229 | } | 229 | } |
230 | EXPORT_SYMBOL_GPL(rt2x00lib_dmastart); | 230 | EXPORT_SYMBOL_GPL(rt2x00lib_dmastart); |
231 | 231 | ||
@@ -233,7 +233,7 @@ void rt2x00lib_dmadone(struct queue_entry *entry) | |||
233 | { | 233 | { |
234 | set_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags); | 234 | set_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags); |
235 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 235 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
236 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DMA_DONE); | 236 | rt2x00queue_index_inc(entry, Q_INDEX_DMA_DONE); |
237 | } | 237 | } |
238 | EXPORT_SYMBOL_GPL(rt2x00lib_dmadone); | 238 | EXPORT_SYMBOL_GPL(rt2x00lib_dmadone); |
239 | 239 | ||
@@ -392,7 +392,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
392 | 392 | ||
393 | rt2x00dev->ops->lib->clear_entry(entry); | 393 | rt2x00dev->ops->lib->clear_entry(entry); |
394 | 394 | ||
395 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | 395 | rt2x00queue_index_inc(entry, Q_INDEX_DONE); |
396 | 396 | ||
397 | /* | 397 | /* |
398 | * If the data queue was below the threshold before the txdone | 398 | * If the data queue was below the threshold before the txdone |
@@ -559,7 +559,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry) | |||
559 | 559 | ||
560 | submit_entry: | 560 | submit_entry: |
561 | entry->flags = 0; | 561 | entry->flags = 0; |
562 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | 562 | rt2x00queue_index_inc(entry, Q_INDEX_DONE); |
563 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && | 563 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && |
564 | test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | 564 | test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
565 | rt2x00dev->ops->lib->clear_entry(entry); | 565 | rt2x00dev->ops->lib->clear_entry(entry); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index bbee2cd40993..57ede6ccf40c 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
@@ -175,14 +175,14 @@ int rt2x00queue_clear_beacon(struct rt2x00_dev *rt2x00dev, | |||
175 | 175 | ||
176 | /** | 176 | /** |
177 | * rt2x00queue_index_inc - Index incrementation function | 177 | * rt2x00queue_index_inc - Index incrementation function |
178 | * @queue: Queue (&struct data_queue) to perform the action on. | 178 | * @entry: Queue entry (&struct queue_entry) to perform the action on. |
179 | * @index: Index type (&enum queue_index) to perform the action on. | 179 | * @index: Index type (&enum queue_index) to perform the action on. |
180 | * | 180 | * |
181 | * This function will increase the requested index on the queue, | 181 | * This function will increase the requested index on the entry's queue, |
182 | * it will grab the appropriate locks and handle queue overflow events by | 182 | * it will grab the appropriate locks and handle queue overflow events by |
183 | * resetting the index to the start of the queue. | 183 | * resetting the index to the start of the queue. |
184 | */ | 184 | */ |
185 | void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index); | 185 | void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index); |
186 | 186 | ||
187 | /** | 187 | /** |
188 | * rt2x00queue_init_queues - Initialize all data queues | 188 | * rt2x00queue_init_queues - Initialize all data queues |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 458bb489bc7c..df8817fed09e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -561,7 +561,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
561 | 561 | ||
562 | set_bit(ENTRY_DATA_PENDING, &entry->flags); | 562 | set_bit(ENTRY_DATA_PENDING, &entry->flags); |
563 | 563 | ||
564 | rt2x00queue_index_inc(queue, Q_INDEX); | 564 | rt2x00queue_index_inc(entry, Q_INDEX); |
565 | rt2x00queue_write_tx_descriptor(entry, &txdesc); | 565 | rt2x00queue_write_tx_descriptor(entry, &txdesc); |
566 | rt2x00queue_kick_tx_queue(queue, &txdesc); | 566 | rt2x00queue_kick_tx_queue(queue, &txdesc); |
567 | 567 | ||
@@ -727,8 +727,9 @@ struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue, | |||
727 | } | 727 | } |
728 | EXPORT_SYMBOL_GPL(rt2x00queue_get_entry); | 728 | EXPORT_SYMBOL_GPL(rt2x00queue_get_entry); |
729 | 729 | ||
730 | void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index) | 730 | void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index) |
731 | { | 731 | { |
732 | struct data_queue *queue = entry->queue; | ||
732 | unsigned long irqflags; | 733 | unsigned long irqflags; |
733 | 734 | ||
734 | if (unlikely(index >= Q_INDEX_MAX)) { | 735 | if (unlikely(index >= Q_INDEX_MAX)) { |
@@ -743,7 +744,7 @@ void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index) | |||
743 | if (queue->index[index] >= queue->limit) | 744 | if (queue->index[index] >= queue->limit) |
744 | queue->index[index] = 0; | 745 | queue->index[index] = 0; |
745 | 746 | ||
746 | queue->last_action[index] = jiffies; | 747 | entry->last_action = jiffies; |
747 | 748 | ||
748 | if (index == Q_INDEX) { | 749 | if (index == Q_INDEX) { |
749 | queue->length++; | 750 | queue->length++; |
@@ -969,10 +970,8 @@ static void rt2x00queue_reset(struct data_queue *queue) | |||
969 | queue->count = 0; | 970 | queue->count = 0; |
970 | queue->length = 0; | 971 | queue->length = 0; |
971 | 972 | ||
972 | for (i = 0; i < Q_INDEX_MAX; i++) { | 973 | for (i = 0; i < Q_INDEX_MAX; i++) |
973 | queue->index[i] = 0; | 974 | queue->index[i] = 0; |
974 | queue->last_action[i] = jiffies; | ||
975 | } | ||
976 | 975 | ||
977 | spin_unlock_irqrestore(&queue->index_lock, irqflags); | 976 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
978 | } | 977 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h index 6b664525135d..36f4d03eff61 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h | |||
@@ -364,6 +364,7 @@ enum queue_entry_flags { | |||
364 | * struct queue_entry: Entry inside the &struct data_queue | 364 | * struct queue_entry: Entry inside the &struct data_queue |
365 | * | 365 | * |
366 | * @flags: Entry flags, see &enum queue_entry_flags. | 366 | * @flags: Entry flags, see &enum queue_entry_flags. |
367 | * @last_action: Timestamp of last change. | ||
367 | * @queue: The data queue (&struct data_queue) to which this entry belongs. | 368 | * @queue: The data queue (&struct data_queue) to which this entry belongs. |
368 | * @skb: The buffer which is currently being transmitted (for TX queue), | 369 | * @skb: The buffer which is currently being transmitted (for TX queue), |
369 | * or used to directly recieve data in (for RX queue). | 370 | * or used to directly recieve data in (for RX queue). |
@@ -373,6 +374,7 @@ enum queue_entry_flags { | |||
373 | */ | 374 | */ |
374 | struct queue_entry { | 375 | struct queue_entry { |
375 | unsigned long flags; | 376 | unsigned long flags; |
377 | unsigned long last_action; | ||
376 | 378 | ||
377 | struct data_queue *queue; | 379 | struct data_queue *queue; |
378 | 380 | ||
@@ -463,7 +465,6 @@ struct data_queue { | |||
463 | unsigned short threshold; | 465 | unsigned short threshold; |
464 | unsigned short length; | 466 | unsigned short length; |
465 | unsigned short index[Q_INDEX_MAX]; | 467 | unsigned short index[Q_INDEX_MAX]; |
466 | unsigned long last_action[Q_INDEX_MAX]; | ||
467 | 468 | ||
468 | unsigned short txop; | 469 | unsigned short txop; |
469 | unsigned short aifs; | 470 | unsigned short aifs; |
@@ -635,22 +636,24 @@ static inline int rt2x00queue_threshold(struct data_queue *queue) | |||
635 | 636 | ||
636 | /** | 637 | /** |
637 | * rt2x00queue_status_timeout - Check if a timeout occured for STATUS reports | 638 | * rt2x00queue_status_timeout - Check if a timeout occured for STATUS reports |
638 | * @queue: Queue to check. | 639 | * @entry: Queue entry to check. |
639 | */ | 640 | */ |
640 | static inline int rt2x00queue_status_timeout(struct data_queue *queue) | 641 | static inline int rt2x00queue_status_timeout(struct queue_entry *entry) |
641 | { | 642 | { |
642 | return time_after(queue->last_action[Q_INDEX_DMA_DONE], | 643 | if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) |
643 | queue->last_action[Q_INDEX_DONE] + (HZ / 10)); | 644 | return false; |
645 | return time_after(jiffies, entry->last_action + msecs_to_jiffies(100)); | ||
644 | } | 646 | } |
645 | 647 | ||
646 | /** | 648 | /** |
647 | * rt2x00queue_timeout - Check if a timeout occured for DMA transfers | 649 | * rt2x00queuedma__timeout - Check if a timeout occured for DMA transfers |
648 | * @queue: Queue to check. | 650 | * @entry: Queue entry to check. |
649 | */ | 651 | */ |
650 | static inline int rt2x00queue_dma_timeout(struct data_queue *queue) | 652 | static inline int rt2x00queue_dma_timeout(struct queue_entry *entry) |
651 | { | 653 | { |
652 | return time_after(queue->last_action[Q_INDEX], | 654 | if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) |
653 | queue->last_action[Q_INDEX_DMA_DONE] + (HZ / 10)); | 655 | return false; |
656 | return time_after(jiffies, entry->last_action + msecs_to_jiffies(100)); | ||
654 | } | 657 | } |
655 | 658 | ||
656 | /** | 659 | /** |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 5fbab6f19706..14736e217947 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -521,15 +521,31 @@ static void rt2x00usb_watchdog_tx_status(struct data_queue *queue) | |||
521 | queue_work(queue->rt2x00dev->workqueue, &queue->rt2x00dev->txdone_work); | 521 | queue_work(queue->rt2x00dev->workqueue, &queue->rt2x00dev->txdone_work); |
522 | } | 522 | } |
523 | 523 | ||
524 | static int rt2x00usb_status_timeout(struct data_queue *queue) | ||
525 | { | ||
526 | struct queue_entry *entry; | ||
527 | |||
528 | entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); | ||
529 | return rt2x00queue_status_timeout(entry); | ||
530 | } | ||
531 | |||
532 | static int rt2x00usb_dma_timeout(struct data_queue *queue) | ||
533 | { | ||
534 | struct queue_entry *entry; | ||
535 | |||
536 | entry = rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE); | ||
537 | return rt2x00queue_dma_timeout(entry); | ||
538 | } | ||
539 | |||
524 | void rt2x00usb_watchdog(struct rt2x00_dev *rt2x00dev) | 540 | void rt2x00usb_watchdog(struct rt2x00_dev *rt2x00dev) |
525 | { | 541 | { |
526 | struct data_queue *queue; | 542 | struct data_queue *queue; |
527 | 543 | ||
528 | tx_queue_for_each(rt2x00dev, queue) { | 544 | tx_queue_for_each(rt2x00dev, queue) { |
529 | if (!rt2x00queue_empty(queue)) { | 545 | if (!rt2x00queue_empty(queue)) { |
530 | if (rt2x00queue_dma_timeout(queue)) | 546 | if (rt2x00usb_dma_timeout(queue)) |
531 | rt2x00usb_watchdog_tx_dma(queue); | 547 | rt2x00usb_watchdog_tx_dma(queue); |
532 | if (rt2x00queue_status_timeout(queue)) | 548 | if (rt2x00usb_status_timeout(queue)) |
533 | rt2x00usb_watchdog_tx_status(queue); | 549 | rt2x00usb_watchdog_tx_status(queue); |
534 | } | 550 | } |
535 | } | 551 | } |