diff options
author | John W. Linville <linville@tuxdriver.com> | 2010-05-17 13:57:43 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-05-17 13:57:43 -0400 |
commit | 6fe70aae0d128339febfabc073ba4c4a03de4f45 (patch) | |
tree | 711dff90df5ca4e07b5bddf11b2819e5cf2b7a93 /drivers/net/wireless/rt2x00/rt61pci.c | |
parent | 278554bd6579206921f5d8a523649a7a57f8850d (diff) | |
parent | 0c348d7c1422d59a86d6fb37b53d75788043e50b (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt61pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 86c75b9c3f25..2e3076f67535 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1764,7 +1764,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1764 | struct txentry_desc *txdesc) | 1764 | struct txentry_desc *txdesc) |
1765 | { | 1765 | { |
1766 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 1766 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); |
1767 | __le32 *txd = skbdesc->desc; | 1767 | struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data; |
1768 | __le32 *txd = entry_priv->desc; | ||
1768 | u32 word; | 1769 | u32 word; |
1769 | 1770 | ||
1770 | /* | 1771 | /* |
@@ -1802,18 +1803,23 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1802 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); | 1803 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); |
1803 | rt2x00_desc_write(txd, 5, word); | 1804 | rt2x00_desc_write(txd, 5, word); |
1804 | 1805 | ||
1805 | rt2x00_desc_read(txd, 6, &word); | 1806 | if (txdesc->queue != QID_BEACON) { |
1806 | rt2x00_set_field32(&word, TXD_W6_BUFFER_PHYSICAL_ADDRESS, | 1807 | rt2x00_desc_read(txd, 6, &word); |
1807 | skbdesc->skb_dma); | 1808 | rt2x00_set_field32(&word, TXD_W6_BUFFER_PHYSICAL_ADDRESS, |
1808 | rt2x00_desc_write(txd, 6, word); | 1809 | skbdesc->skb_dma); |
1810 | rt2x00_desc_write(txd, 6, word); | ||
1809 | 1811 | ||
1810 | if (skbdesc->desc_len > TXINFO_SIZE) { | ||
1811 | rt2x00_desc_read(txd, 11, &word); | 1812 | rt2x00_desc_read(txd, 11, &word); |
1812 | rt2x00_set_field32(&word, TXD_W11_BUFFER_LENGTH0, | 1813 | rt2x00_set_field32(&word, TXD_W11_BUFFER_LENGTH0, |
1813 | txdesc->length); | 1814 | txdesc->length); |
1814 | rt2x00_desc_write(txd, 11, word); | 1815 | rt2x00_desc_write(txd, 11, word); |
1815 | } | 1816 | } |
1816 | 1817 | ||
1818 | /* | ||
1819 | * Writing TXD word 0 must the last to prevent a race condition with | ||
1820 | * the device, whereby the device may take hold of the TXD before we | ||
1821 | * finished updating it. | ||
1822 | */ | ||
1817 | rt2x00_desc_read(txd, 0, &word); | 1823 | rt2x00_desc_read(txd, 0, &word); |
1818 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 1); | 1824 | rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 1); |
1819 | rt2x00_set_field32(&word, TXD_W0_VALID, 1); | 1825 | rt2x00_set_field32(&word, TXD_W0_VALID, 1); |
@@ -1838,6 +1844,13 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1838 | test_bit(ENTRY_TXD_BURST, &txdesc->flags)); | 1844 | test_bit(ENTRY_TXD_BURST, &txdesc->flags)); |
1839 | rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher); | 1845 | rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher); |
1840 | rt2x00_desc_write(txd, 0, word); | 1846 | rt2x00_desc_write(txd, 0, word); |
1847 | |||
1848 | /* | ||
1849 | * Register descriptor details in skb frame descriptor. | ||
1850 | */ | ||
1851 | skbdesc->desc = txd; | ||
1852 | skbdesc->desc_len = | ||
1853 | (txdesc->queue == QID_BEACON) ? TXINFO_SIZE : TXD_DESC_SIZE; | ||
1841 | } | 1854 | } |
1842 | 1855 | ||
1843 | /* | 1856 | /* |
@@ -1847,7 +1860,7 @@ static void rt61pci_write_beacon(struct queue_entry *entry, | |||
1847 | struct txentry_desc *txdesc) | 1860 | struct txentry_desc *txdesc) |
1848 | { | 1861 | { |
1849 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 1862 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
1850 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | 1863 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
1851 | unsigned int beacon_base; | 1864 | unsigned int beacon_base; |
1852 | u32 reg; | 1865 | u32 reg; |
1853 | 1866 | ||
@@ -1863,11 +1876,9 @@ static void rt61pci_write_beacon(struct queue_entry *entry, | |||
1863 | * Write entire beacon with descriptor to register. | 1876 | * Write entire beacon with descriptor to register. |
1864 | */ | 1877 | */ |
1865 | beacon_base = HW_BEACON_OFFSET(entry->entry_idx); | 1878 | beacon_base = HW_BEACON_OFFSET(entry->entry_idx); |
1866 | rt2x00pci_register_multiwrite(rt2x00dev, | 1879 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, |
1867 | beacon_base, | 1880 | entry_priv->desc, TXINFO_SIZE); |
1868 | skbdesc->desc, skbdesc->desc_len); | 1881 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base + TXINFO_SIZE, |
1869 | rt2x00pci_register_multiwrite(rt2x00dev, | ||
1870 | beacon_base + skbdesc->desc_len, | ||
1871 | entry->skb->data, entry->skb->len); | 1882 | entry->skb->data, entry->skb->len); |
1872 | 1883 | ||
1873 | /* | 1884 | /* |