diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 51 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 45 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00lib.h | 12 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.h | 11 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 31 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 47 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 3 |
13 files changed, 127 insertions, 135 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 42bd38ac7a1d..861577ece713 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
@@ -626,36 +626,47 @@ static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
626 | /* | 626 | /* |
627 | * Initialization functions. | 627 | * Initialization functions. |
628 | */ | 628 | */ |
629 | static void rt2400pci_init_rxentry(struct rt2x00_dev *rt2x00dev, | 629 | static bool rt2400pci_get_entry_state(struct queue_entry *entry) |
630 | struct queue_entry *entry) | ||
631 | { | 630 | { |
632 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 631 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
633 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
634 | u32 word; | 632 | u32 word; |
635 | 633 | ||
636 | rt2x00_desc_read(entry_priv->desc, 2, &word); | 634 | if (entry->queue->qid == QID_RX) { |
637 | rt2x00_set_field32(&word, RXD_W2_BUFFER_LENGTH, entry->skb->len); | 635 | rt2x00_desc_read(entry_priv->desc, 0, &word); |
638 | rt2x00_desc_write(entry_priv->desc, 2, word); | ||
639 | 636 | ||
640 | rt2x00_desc_read(entry_priv->desc, 1, &word); | 637 | return rt2x00_get_field32(word, RXD_W0_OWNER_NIC); |
641 | rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma); | 638 | } else { |
642 | rt2x00_desc_write(entry_priv->desc, 1, word); | 639 | rt2x00_desc_read(entry_priv->desc, 0, &word); |
643 | 640 | ||
644 | rt2x00_desc_read(entry_priv->desc, 0, &word); | 641 | return (rt2x00_get_field32(word, TXD_W0_OWNER_NIC) || |
645 | rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1); | 642 | rt2x00_get_field32(word, TXD_W0_VALID)); |
646 | rt2x00_desc_write(entry_priv->desc, 0, word); | 643 | } |
647 | } | 644 | } |
648 | 645 | ||
649 | static void rt2400pci_init_txentry(struct rt2x00_dev *rt2x00dev, | 646 | static void rt2400pci_clear_entry(struct queue_entry *entry) |
650 | struct queue_entry *entry) | ||
651 | { | 647 | { |
652 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 648 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
649 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
653 | u32 word; | 650 | u32 word; |
654 | 651 | ||
655 | rt2x00_desc_read(entry_priv->desc, 0, &word); | 652 | if (entry->queue->qid == QID_RX) { |
656 | rt2x00_set_field32(&word, TXD_W0_VALID, 0); | 653 | rt2x00_desc_read(entry_priv->desc, 2, &word); |
657 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0); | 654 | rt2x00_set_field32(&word, RXD_W2_BUFFER_LENGTH, entry->skb->len); |
658 | rt2x00_desc_write(entry_priv->desc, 0, word); | 655 | rt2x00_desc_write(entry_priv->desc, 2, word); |
656 | |||
657 | rt2x00_desc_read(entry_priv->desc, 1, &word); | ||
658 | rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma); | ||
659 | rt2x00_desc_write(entry_priv->desc, 1, word); | ||
660 | |||
661 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
662 | rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1); | ||
663 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
664 | } else { | ||
665 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
666 | rt2x00_set_field32(&word, TXD_W0_VALID, 0); | ||
667 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0); | ||
668 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
669 | } | ||
659 | } | 670 | } |
660 | 671 | ||
661 | static int rt2400pci_init_queues(struct rt2x00_dev *rt2x00dev) | 672 | static int rt2400pci_init_queues(struct rt2x00_dev *rt2x00dev) |
@@ -1570,8 +1581,8 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = { | |||
1570 | .probe_hw = rt2400pci_probe_hw, | 1581 | .probe_hw = rt2400pci_probe_hw, |
1571 | .initialize = rt2x00pci_initialize, | 1582 | .initialize = rt2x00pci_initialize, |
1572 | .uninitialize = rt2x00pci_uninitialize, | 1583 | .uninitialize = rt2x00pci_uninitialize, |
1573 | .init_rxentry = rt2400pci_init_rxentry, | 1584 | .get_entry_state = rt2400pci_get_entry_state, |
1574 | .init_txentry = rt2400pci_init_txentry, | 1585 | .clear_entry = rt2400pci_clear_entry, |
1575 | .set_device_state = rt2400pci_set_device_state, | 1586 | .set_device_state = rt2400pci_set_device_state, |
1576 | .rfkill_poll = rt2400pci_rfkill_poll, | 1587 | .rfkill_poll = rt2400pci_rfkill_poll, |
1577 | .link_stats = rt2400pci_link_stats, | 1588 | .link_stats = rt2400pci_link_stats, |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 928452f30c25..e43ff9c79063 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -722,32 +722,43 @@ dynamic_cca_tune: | |||
722 | /* | 722 | /* |
723 | * Initialization functions. | 723 | * Initialization functions. |
724 | */ | 724 | */ |
725 | static void rt2500pci_init_rxentry(struct rt2x00_dev *rt2x00dev, | 725 | static bool rt2500pci_get_entry_state(struct queue_entry *entry) |
726 | struct queue_entry *entry) | ||
727 | { | 726 | { |
728 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 727 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
729 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
730 | u32 word; | 728 | u32 word; |
731 | 729 | ||
732 | rt2x00_desc_read(entry_priv->desc, 1, &word); | 730 | if (entry->queue->qid == QID_RX) { |
733 | rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma); | 731 | rt2x00_desc_read(entry_priv->desc, 0, &word); |
734 | rt2x00_desc_write(entry_priv->desc, 1, word); | 732 | |
733 | return rt2x00_get_field32(word, RXD_W0_OWNER_NIC); | ||
734 | } else { | ||
735 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
735 | 736 | ||
736 | rt2x00_desc_read(entry_priv->desc, 0, &word); | 737 | return (rt2x00_get_field32(word, TXD_W0_OWNER_NIC) || |
737 | rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1); | 738 | rt2x00_get_field32(word, TXD_W0_VALID)); |
738 | rt2x00_desc_write(entry_priv->desc, 0, word); | 739 | } |
739 | } | 740 | } |
740 | 741 | ||
741 | static void rt2500pci_init_txentry(struct rt2x00_dev *rt2x00dev, | 742 | static void rt2500pci_clear_entry(struct queue_entry *entry) |
742 | struct queue_entry *entry) | ||
743 | { | 743 | { |
744 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 744 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
745 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
745 | u32 word; | 746 | u32 word; |
746 | 747 | ||
747 | rt2x00_desc_read(entry_priv->desc, 0, &word); | 748 | if (entry->queue->qid == QID_RX) { |
748 | rt2x00_set_field32(&word, TXD_W0_VALID, 0); | 749 | rt2x00_desc_read(entry_priv->desc, 1, &word); |
749 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0); | 750 | rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma); |
750 | rt2x00_desc_write(entry_priv->desc, 0, word); | 751 | rt2x00_desc_write(entry_priv->desc, 1, word); |
752 | |||
753 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
754 | rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1); | ||
755 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
756 | } else { | ||
757 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
758 | rt2x00_set_field32(&word, TXD_W0_VALID, 0); | ||
759 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0); | ||
760 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
761 | } | ||
751 | } | 762 | } |
752 | 763 | ||
753 | static int rt2500pci_init_queues(struct rt2x00_dev *rt2x00dev) | 764 | static int rt2500pci_init_queues(struct rt2x00_dev *rt2x00dev) |
@@ -1871,8 +1882,8 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { | |||
1871 | .probe_hw = rt2500pci_probe_hw, | 1882 | .probe_hw = rt2500pci_probe_hw, |
1872 | .initialize = rt2x00pci_initialize, | 1883 | .initialize = rt2x00pci_initialize, |
1873 | .uninitialize = rt2x00pci_uninitialize, | 1884 | .uninitialize = rt2x00pci_uninitialize, |
1874 | .init_rxentry = rt2500pci_init_rxentry, | 1885 | .get_entry_state = rt2500pci_get_entry_state, |
1875 | .init_txentry = rt2500pci_init_txentry, | 1886 | .clear_entry = rt2500pci_clear_entry, |
1876 | .set_device_state = rt2500pci_set_device_state, | 1887 | .set_device_state = rt2500pci_set_device_state, |
1877 | .rfkill_poll = rt2500pci_rfkill_poll, | 1888 | .rfkill_poll = rt2500pci_rfkill_poll, |
1878 | .link_stats = rt2500pci_link_stats, | 1889 | .link_stats = rt2500pci_link_stats, |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 639d5a2f84e2..3868e987438d 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1777,8 +1777,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { | |||
1777 | .probe_hw = rt2500usb_probe_hw, | 1777 | .probe_hw = rt2500usb_probe_hw, |
1778 | .initialize = rt2x00usb_initialize, | 1778 | .initialize = rt2x00usb_initialize, |
1779 | .uninitialize = rt2x00usb_uninitialize, | 1779 | .uninitialize = rt2x00usb_uninitialize, |
1780 | .init_rxentry = rt2x00usb_init_rxentry, | 1780 | .clear_entry = rt2x00usb_clear_entry, |
1781 | .init_txentry = rt2x00usb_init_txentry, | ||
1782 | .set_device_state = rt2500usb_set_device_state, | 1781 | .set_device_state = rt2500usb_set_device_state, |
1783 | .link_stats = rt2500usb_link_stats, | 1782 | .link_stats = rt2500usb_link_stats, |
1784 | .reset_tuner = rt2500usb_reset_tuner, | 1783 | .reset_tuner = rt2500usb_reset_tuner, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 8fa971ccfddd..4506f6cfc0c3 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -523,10 +523,8 @@ struct rt2x00lib_ops { | |||
523 | /* | 523 | /* |
524 | * queue initialization handlers | 524 | * queue initialization handlers |
525 | */ | 525 | */ |
526 | void (*init_rxentry) (struct rt2x00_dev *rt2x00dev, | 526 | bool (*get_entry_state) (struct queue_entry *entry); |
527 | struct queue_entry *entry); | 527 | void (*clear_entry) (struct queue_entry *entry); |
528 | void (*init_txentry) (struct rt2x00_dev *rt2x00dev, | ||
529 | struct queue_entry *entry); | ||
530 | 528 | ||
531 | /* | 529 | /* |
532 | * Radio control handlers. | 530 | * Radio control handlers. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index e8ca1cbfeb90..bb510a232d14 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -101,8 +101,7 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
101 | /* | 101 | /* |
102 | * Initialize all data queues. | 102 | * Initialize all data queues. |
103 | */ | 103 | */ |
104 | rt2x00queue_init_rx(rt2x00dev); | 104 | rt2x00queue_init_queues(rt2x00dev); |
105 | rt2x00queue_init_tx(rt2x00dev); | ||
106 | 105 | ||
107 | /* | 106 | /* |
108 | * Enable radio. | 107 | * Enable radio. |
@@ -576,7 +575,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
576 | entry->skb = NULL; | 575 | entry->skb = NULL; |
577 | entry->flags = 0; | 576 | entry->flags = 0; |
578 | 577 | ||
579 | rt2x00dev->ops->lib->init_txentry(rt2x00dev, entry); | 578 | rt2x00dev->ops->lib->clear_entry(entry); |
580 | 579 | ||
581 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 580 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
582 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | 581 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); |
@@ -708,7 +707,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev, | |||
708 | entry->skb = skb; | 707 | entry->skb = skb; |
709 | entry->flags = 0; | 708 | entry->flags = 0; |
710 | 709 | ||
711 | rt2x00dev->ops->lib->init_rxentry(rt2x00dev, entry); | 710 | rt2x00dev->ops->lib->clear_entry(entry); |
712 | 711 | ||
713 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | 712 | rt2x00queue_index_inc(entry->queue, Q_INDEX); |
714 | } | 713 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index 0c3a3559ba48..93997333d46d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
@@ -150,8 +150,16 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev, | |||
150 | */ | 150 | */ |
151 | void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index); | 151 | void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index); |
152 | 152 | ||
153 | void rt2x00queue_init_rx(struct rt2x00_dev *rt2x00dev); | 153 | /** |
154 | void rt2x00queue_init_tx(struct rt2x00_dev *rt2x00dev); | 154 | * rt2x00queue_init_queues - Initialize all data queues |
155 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
156 | * | ||
157 | * This function will loop through all available queues to clear all | ||
158 | * index numbers and set the queue entry to the correct initialization | ||
159 | * state. | ||
160 | */ | ||
161 | void rt2x00queue_init_queues(struct rt2x00_dev *rt2x00dev); | ||
162 | |||
155 | int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev); | 163 | int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev); |
156 | void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev); | 164 | void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev); |
157 | int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev); | 165 | int rt2x00queue_allocate(struct rt2x00_dev *rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 62449da577e5..e33bd0f150c5 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -36,20 +36,17 @@ | |||
36 | */ | 36 | */ |
37 | int rt2x00pci_write_tx_data(struct queue_entry *entry) | 37 | int rt2x00pci_write_tx_data(struct queue_entry *entry) |
38 | { | 38 | { |
39 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | ||
39 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 40 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
40 | struct skb_frame_desc *skbdesc; | 41 | struct skb_frame_desc *skbdesc; |
41 | u32 word; | ||
42 | |||
43 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
44 | 42 | ||
45 | /* | 43 | /* |
46 | * This should not happen, we already checked the entry | 44 | * This should not happen, we already checked the entry |
47 | * was ours. When the hardware disagrees there has been | 45 | * was ours. When the hardware disagrees there has been |
48 | * a queue corruption! | 46 | * a queue corruption! |
49 | */ | 47 | */ |
50 | if (unlikely(rt2x00_get_field32(word, TXD_ENTRY_OWNER_NIC) || | 48 | if (unlikely(rt2x00dev->ops->lib->get_entry_state(entry))) { |
51 | rt2x00_get_field32(word, TXD_ENTRY_VALID))) { | 49 | ERROR(rt2x00dev, |
52 | ERROR(entry->queue->rt2x00dev, | ||
53 | "Corrupt queue %d, accessing entry which is not ours.\n" | 50 | "Corrupt queue %d, accessing entry which is not ours.\n" |
54 | "Please file bug report to %s.\n", | 51 | "Please file bug report to %s.\n", |
55 | entry->queue->qid, DRV_PROJECT); | 52 | entry->queue->qid, DRV_PROJECT); |
@@ -76,14 +73,12 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev) | |||
76 | struct queue_entry *entry; | 73 | struct queue_entry *entry; |
77 | struct queue_entry_priv_pci *entry_priv; | 74 | struct queue_entry_priv_pci *entry_priv; |
78 | struct skb_frame_desc *skbdesc; | 75 | struct skb_frame_desc *skbdesc; |
79 | u32 word; | ||
80 | 76 | ||
81 | while (1) { | 77 | while (1) { |
82 | entry = rt2x00queue_get_entry(queue, Q_INDEX); | 78 | entry = rt2x00queue_get_entry(queue, Q_INDEX); |
83 | entry_priv = entry->priv_data; | 79 | entry_priv = entry->priv_data; |
84 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
85 | 80 | ||
86 | if (rt2x00_get_field32(word, RXD_ENTRY_OWNER_NIC)) | 81 | if (rt2x00dev->ops->lib->get_entry_state(entry)) |
87 | break; | 82 | break; |
88 | 83 | ||
89 | /* | 84 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.h b/drivers/net/wireless/rt2x00/rt2x00pci.h index a83f45f784f2..96a2082a3532 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.h +++ b/drivers/net/wireless/rt2x00/rt2x00pci.h | |||
@@ -44,17 +44,6 @@ | |||
44 | #define REGISTER_BUSY_DELAY 100 | 44 | #define REGISTER_BUSY_DELAY 100 |
45 | 45 | ||
46 | /* | 46 | /* |
47 | * Descriptor availability flags. | ||
48 | * All PCI device descriptors have these 2 flags | ||
49 | * with the exact same definition. | ||
50 | * By storing them here we can use them inside rt2x00pci | ||
51 | * for some simple entry availability checking. | ||
52 | */ | ||
53 | #define TXD_ENTRY_OWNER_NIC FIELD32(0x00000001) | ||
54 | #define TXD_ENTRY_VALID FIELD32(0x00000002) | ||
55 | #define RXD_ENTRY_OWNER_NIC FIELD32(0x00000001) | ||
56 | |||
57 | /* | ||
58 | * Register access. | 47 | * Register access. |
59 | */ | 48 | */ |
60 | static inline void rt2x00pci_register_read(struct rt2x00_dev *rt2x00dev, | 49 | static inline void rt2x00pci_register_read(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index e9f4261054bc..7fc9c6eff98b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -589,40 +589,18 @@ static void rt2x00queue_reset(struct data_queue *queue) | |||
589 | spin_unlock_irqrestore(&queue->lock, irqflags); | 589 | spin_unlock_irqrestore(&queue->lock, irqflags); |
590 | } | 590 | } |
591 | 591 | ||
592 | void rt2x00queue_init_rx(struct rt2x00_dev *rt2x00dev) | 592 | void rt2x00queue_init_queues(struct rt2x00_dev *rt2x00dev) |
593 | { | ||
594 | struct data_queue *queue = rt2x00dev->rx; | ||
595 | unsigned int i; | ||
596 | |||
597 | rt2x00queue_reset(queue); | ||
598 | |||
599 | if (!rt2x00dev->ops->lib->init_rxentry) | ||
600 | return; | ||
601 | |||
602 | for (i = 0; i < queue->limit; i++) { | ||
603 | queue->entries[i].flags = 0; | ||
604 | |||
605 | rt2x00dev->ops->lib->init_rxentry(rt2x00dev, | ||
606 | &queue->entries[i]); | ||
607 | } | ||
608 | } | ||
609 | |||
610 | void rt2x00queue_init_tx(struct rt2x00_dev *rt2x00dev) | ||
611 | { | 593 | { |
612 | struct data_queue *queue; | 594 | struct data_queue *queue; |
613 | unsigned int i; | 595 | unsigned int i; |
614 | 596 | ||
615 | txall_queue_for_each(rt2x00dev, queue) { | 597 | queue_for_each(rt2x00dev, queue) { |
616 | rt2x00queue_reset(queue); | 598 | rt2x00queue_reset(queue); |
617 | 599 | ||
618 | if (!rt2x00dev->ops->lib->init_txentry) | ||
619 | continue; | ||
620 | |||
621 | for (i = 0; i < queue->limit; i++) { | 600 | for (i = 0; i < queue->limit; i++) { |
622 | queue->entries[i].flags = 0; | 601 | queue->entries[i].flags = 0; |
623 | 602 | ||
624 | rt2x00dev->ops->lib->init_txentry(rt2x00dev, | 603 | rt2x00dev->ops->lib->clear_entry(&queue->entries[i]); |
625 | &queue->entries[i]); | ||
626 | } | 604 | } |
627 | } | 605 | } |
628 | } | 606 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index b73a7e0aeed4..4eb550fab2f6 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -351,28 +351,25 @@ EXPORT_SYMBOL_GPL(rt2x00usb_disable_radio); | |||
351 | /* | 351 | /* |
352 | * Device initialization handlers. | 352 | * Device initialization handlers. |
353 | */ | 353 | */ |
354 | void rt2x00usb_init_rxentry(struct rt2x00_dev *rt2x00dev, | 354 | void rt2x00usb_clear_entry(struct queue_entry *entry) |
355 | struct queue_entry *entry) | ||
356 | { | 355 | { |
357 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); | 356 | struct usb_device *usb_dev = |
357 | to_usb_device_intf(entry->queue->rt2x00dev->dev); | ||
358 | struct queue_entry_priv_usb *entry_priv = entry->priv_data; | 358 | struct queue_entry_priv_usb *entry_priv = entry->priv_data; |
359 | 359 | ||
360 | usb_fill_bulk_urb(entry_priv->urb, usb_dev, | 360 | if (entry->queue->qid == QID_RX) { |
361 | usb_rcvbulkpipe(usb_dev, 1), | 361 | usb_fill_bulk_urb(entry_priv->urb, usb_dev, |
362 | entry->skb->data, entry->skb->len, | 362 | usb_rcvbulkpipe(usb_dev, 1), |
363 | rt2x00usb_interrupt_rxdone, entry); | 363 | entry->skb->data, entry->skb->len, |
364 | rt2x00usb_interrupt_rxdone, entry); | ||
364 | 365 | ||
365 | set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 366 | set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
366 | usb_submit_urb(entry_priv->urb, GFP_ATOMIC); | 367 | usb_submit_urb(entry_priv->urb, GFP_ATOMIC); |
367 | } | 368 | } else { |
368 | EXPORT_SYMBOL_GPL(rt2x00usb_init_rxentry); | 369 | entry->flags = 0; |
369 | 370 | } | |
370 | void rt2x00usb_init_txentry(struct rt2x00_dev *rt2x00dev, | ||
371 | struct queue_entry *entry) | ||
372 | { | ||
373 | entry->flags = 0; | ||
374 | } | 371 | } |
375 | EXPORT_SYMBOL_GPL(rt2x00usb_init_txentry); | 372 | EXPORT_SYMBOL_GPL(rt2x00usb_clear_entry); |
376 | 373 | ||
377 | static int rt2x00usb_alloc_urb(struct rt2x00_dev *rt2x00dev, | 374 | static int rt2x00usb_alloc_urb(struct rt2x00_dev *rt2x00dev, |
378 | struct data_queue *queue) | 375 | struct data_queue *queue) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.h b/drivers/net/wireless/rt2x00/rt2x00usb.h index 3b4a67417f95..4104f0e8fa48 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.h +++ b/drivers/net/wireless/rt2x00/rt2x00usb.h | |||
@@ -286,10 +286,7 @@ void rt2x00usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | |||
286 | /* | 286 | /* |
287 | * Device initialization handlers. | 287 | * Device initialization handlers. |
288 | */ | 288 | */ |
289 | void rt2x00usb_init_rxentry(struct rt2x00_dev *rt2x00dev, | 289 | void rt2x00usb_clear_entry(struct queue_entry *entry); |
290 | struct queue_entry *entry); | ||
291 | void rt2x00usb_init_txentry(struct rt2x00_dev *rt2x00dev, | ||
292 | struct queue_entry *entry); | ||
293 | int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev); | 290 | int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev); |
294 | void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev); | 291 | void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev); |
295 | 292 | ||
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 3f272793412a..abfe33b5712a 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1261,33 +1261,44 @@ static int rt61pci_load_firmware(struct rt2x00_dev *rt2x00dev, const void *data, | |||
1261 | /* | 1261 | /* |
1262 | * Initialization functions. | 1262 | * Initialization functions. |
1263 | */ | 1263 | */ |
1264 | static void rt61pci_init_rxentry(struct rt2x00_dev *rt2x00dev, | 1264 | static bool rt61pci_get_entry_state(struct queue_entry *entry) |
1265 | struct queue_entry *entry) | ||
1266 | { | 1265 | { |
1267 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 1266 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
1268 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
1269 | u32 word; | 1267 | u32 word; |
1270 | 1268 | ||
1271 | rt2x00_desc_read(entry_priv->desc, 5, &word); | 1269 | if (entry->queue->qid == QID_RX) { |
1272 | rt2x00_set_field32(&word, RXD_W5_BUFFER_PHYSICAL_ADDRESS, | 1270 | rt2x00_desc_read(entry_priv->desc, 0, &word); |
1273 | skbdesc->skb_dma); | ||
1274 | rt2x00_desc_write(entry_priv->desc, 5, word); | ||
1275 | 1271 | ||
1276 | rt2x00_desc_read(entry_priv->desc, 0, &word); | 1272 | return rt2x00_get_field32(word, RXD_W0_OWNER_NIC); |
1277 | rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1); | 1273 | } else { |
1278 | rt2x00_desc_write(entry_priv->desc, 0, word); | 1274 | rt2x00_desc_read(entry_priv->desc, 0, &word); |
1275 | |||
1276 | return (rt2x00_get_field32(word, TXD_W0_OWNER_NIC) || | ||
1277 | rt2x00_get_field32(word, TXD_W0_VALID)); | ||
1278 | } | ||
1279 | } | 1279 | } |
1280 | 1280 | ||
1281 | static void rt61pci_init_txentry(struct rt2x00_dev *rt2x00dev, | 1281 | static void rt61pci_clear_entry(struct queue_entry *entry) |
1282 | struct queue_entry *entry) | ||
1283 | { | 1282 | { |
1284 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 1283 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
1284 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | ||
1285 | u32 word; | 1285 | u32 word; |
1286 | 1286 | ||
1287 | rt2x00_desc_read(entry_priv->desc, 0, &word); | 1287 | if (entry->queue->qid == QID_RX) { |
1288 | rt2x00_set_field32(&word, TXD_W0_VALID, 0); | 1288 | rt2x00_desc_read(entry_priv->desc, 5, &word); |
1289 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0); | 1289 | rt2x00_set_field32(&word, RXD_W5_BUFFER_PHYSICAL_ADDRESS, |
1290 | rt2x00_desc_write(entry_priv->desc, 0, word); | 1290 | skbdesc->skb_dma); |
1291 | rt2x00_desc_write(entry_priv->desc, 5, word); | ||
1292 | |||
1293 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
1294 | rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1); | ||
1295 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
1296 | } else { | ||
1297 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
1298 | rt2x00_set_field32(&word, TXD_W0_VALID, 0); | ||
1299 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0); | ||
1300 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
1301 | } | ||
1291 | } | 1302 | } |
1292 | 1303 | ||
1293 | static int rt61pci_init_queues(struct rt2x00_dev *rt2x00dev) | 1304 | static int rt61pci_init_queues(struct rt2x00_dev *rt2x00dev) |
@@ -2722,8 +2733,8 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = { | |||
2722 | .load_firmware = rt61pci_load_firmware, | 2733 | .load_firmware = rt61pci_load_firmware, |
2723 | .initialize = rt2x00pci_initialize, | 2734 | .initialize = rt2x00pci_initialize, |
2724 | .uninitialize = rt2x00pci_uninitialize, | 2735 | .uninitialize = rt2x00pci_uninitialize, |
2725 | .init_rxentry = rt61pci_init_rxentry, | 2736 | .get_entry_state = rt61pci_get_entry_state, |
2726 | .init_txentry = rt61pci_init_txentry, | 2737 | .clear_entry = rt61pci_clear_entry, |
2727 | .set_device_state = rt61pci_set_device_state, | 2738 | .set_device_state = rt61pci_set_device_state, |
2728 | .rfkill_poll = rt61pci_rfkill_poll, | 2739 | .rfkill_poll = rt61pci_rfkill_poll, |
2729 | .link_stats = rt61pci_link_stats, | 2740 | .link_stats = rt61pci_link_stats, |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 767e3c98184c..f2c8d9733c1d 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -2313,8 +2313,7 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { | |||
2313 | .load_firmware = rt73usb_load_firmware, | 2313 | .load_firmware = rt73usb_load_firmware, |
2314 | .initialize = rt2x00usb_initialize, | 2314 | .initialize = rt2x00usb_initialize, |
2315 | .uninitialize = rt2x00usb_uninitialize, | 2315 | .uninitialize = rt2x00usb_uninitialize, |
2316 | .init_rxentry = rt2x00usb_init_rxentry, | 2316 | .clear_entry = rt2x00usb_clear_entry, |
2317 | .init_txentry = rt2x00usb_init_txentry, | ||
2318 | .set_device_state = rt73usb_set_device_state, | 2317 | .set_device_state = rt73usb_set_device_state, |
2319 | .link_stats = rt73usb_link_stats, | 2318 | .link_stats = rt73usb_link_stats, |
2320 | .reset_tuner = rt73usb_reset_tuner, | 2319 | .reset_tuner = rt73usb_reset_tuner, |