aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c21
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c21
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c21
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.c14
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00pci.c9
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c10
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00usb.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c20
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c21
10 files changed, 72 insertions, 81 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 1eff6ec88457..def3fa45ae7a 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1006,15 +1006,15 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1006{ 1006{
1007 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 1007 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
1008 struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data; 1008 struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data;
1009 __le32 *txd = skbdesc->desc; 1009 __le32 *txd = entry_priv->desc;
1010 u32 word; 1010 u32 word;
1011 1011
1012 /* 1012 /*
1013 * Start writing the descriptor words. 1013 * Start writing the descriptor words.
1014 */ 1014 */
1015 rt2x00_desc_read(entry_priv->desc, 1, &word); 1015 rt2x00_desc_read(txd, 1, &word);
1016 rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma); 1016 rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma);
1017 rt2x00_desc_write(entry_priv->desc, 1, word); 1017 rt2x00_desc_write(txd, 1, word);
1018 1018
1019 rt2x00_desc_read(txd, 2, &word); 1019 rt2x00_desc_read(txd, 2, &word);
1020 rt2x00_set_field32(&word, TXD_W2_BUFFER_LENGTH, txdesc->length); 1020 rt2x00_set_field32(&word, TXD_W2_BUFFER_LENGTH, txdesc->length);
@@ -1059,6 +1059,12 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1059 rt2x00_set_field32(&word, TXD_W0_RETRY_MODE, 1059 rt2x00_set_field32(&word, TXD_W0_RETRY_MODE,
1060 test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags)); 1060 test_bit(ENTRY_TXD_RETRY_MODE, &txdesc->flags));
1061 rt2x00_desc_write(txd, 0, word); 1061 rt2x00_desc_write(txd, 0, word);
1062
1063 /*
1064 * Register descriptor details in skb frame descriptor.
1065 */
1066 skbdesc->desc = txd;
1067 skbdesc->desc_len = TXD_DESC_SIZE;
1062} 1068}
1063 1069
1064/* 1070/*
@@ -1081,15 +1087,6 @@ static void rt2400pci_write_beacon(struct queue_entry *entry,
1081 rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0); 1087 rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
1082 rt2x00pci_register_write(rt2x00dev, CSR14, reg); 1088 rt2x00pci_register_write(rt2x00dev, CSR14, reg);
1083 1089
1084 /*
1085 * Replace rt2x00lib allocated descriptor with the
1086 * pointer to the _real_ hardware descriptor.
1087 * After that, map the beacon to DMA and update the
1088 * descriptor.
1089 */
1090 memcpy(entry_priv->desc, skbdesc->desc, skbdesc->desc_len);
1091 skbdesc->desc = entry_priv->desc;
1092
1093 rt2x00queue_map_txskb(rt2x00dev, entry->skb); 1090 rt2x00queue_map_txskb(rt2x00dev, entry->skb);
1094 1091
1095 rt2x00_desc_read(entry_priv->desc, 1, &word); 1092 rt2x00_desc_read(entry_priv->desc, 1, &word);
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 8d3e95e0dcfe..070c23ed4013 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1164,15 +1164,15 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1164{ 1164{
1165 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 1165 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
1166 struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data; 1166 struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data;
1167 __le32 *txd = skbdesc->desc; 1167 __le32 *txd = entry_priv->desc;
1168 u32 word; 1168 u32 word;
1169 1169
1170 /* 1170 /*
1171 * Start writing the descriptor words. 1171 * Start writing the descriptor words.
1172 */ 1172 */
1173 rt2x00_desc_read(entry_priv->desc, 1, &word); 1173 rt2x00_desc_read(txd, 1, &word);
1174 rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma); 1174 rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS, skbdesc->skb_dma);
1175 rt2x00_desc_write(entry_priv->desc, 1, word); 1175 rt2x00_desc_write(txd, 1, word);
1176 1176
1177 rt2x00_desc_read(txd, 2, &word); 1177 rt2x00_desc_read(txd, 2, &word);
1178 rt2x00_set_field32(&word, TXD_W2_IV_OFFSET, IEEE80211_HEADER); 1178 rt2x00_set_field32(&word, TXD_W2_IV_OFFSET, IEEE80211_HEADER);
@@ -1216,6 +1216,12 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1216 rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length); 1216 rt2x00_set_field32(&word, TXD_W0_DATABYTE_COUNT, txdesc->length);
1217 rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE); 1217 rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, CIPHER_NONE);
1218 rt2x00_desc_write(txd, 0, word); 1218 rt2x00_desc_write(txd, 0, word);
1219
1220 /*
1221 * Register descriptor details in skb frame descriptor.
1222 */
1223 skbdesc->desc = txd;
1224 skbdesc->desc_len = TXD_DESC_SIZE;
1219} 1225}
1220 1226
1221/* 1227/*
@@ -1238,15 +1244,6 @@ static void rt2500pci_write_beacon(struct queue_entry *entry,
1238 rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0); 1244 rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
1239 rt2x00pci_register_write(rt2x00dev, CSR14, reg); 1245 rt2x00pci_register_write(rt2x00dev, CSR14, reg);
1240 1246
1241 /*
1242 * Replace rt2x00lib allocated descriptor with the
1243 * pointer to the _real_ hardware descriptor.
1244 * After that, map the beacon to DMA and update the
1245 * descriptor.
1246 */
1247 memcpy(entry_priv->desc, skbdesc->desc, skbdesc->desc_len);
1248 skbdesc->desc = entry_priv->desc;
1249
1250 rt2x00queue_map_txskb(rt2x00dev, entry->skb); 1247 rt2x00queue_map_txskb(rt2x00dev, entry->skb);
1251 1248
1252 rt2x00_desc_read(entry_priv->desc, 1, &word); 1249 rt2x00_desc_read(entry_priv->desc, 1, &word);
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 9a915be547b3..b985d8f8cc6e 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1033,7 +1033,7 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1033 struct txentry_desc *txdesc) 1033 struct txentry_desc *txdesc)
1034{ 1034{
1035 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 1035 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
1036 __le32 *txd = skbdesc->desc; 1036 __le32 *txd = (__le32 *)(skb->data - TXD_DESC_SIZE);
1037 u32 word; 1037 u32 word;
1038 1038
1039 /* 1039 /*
@@ -1075,6 +1075,12 @@ static void rt2500usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1075 _rt2x00_desc_write(txd, 3, skbdesc->iv[0]); 1075 _rt2x00_desc_write(txd, 3, skbdesc->iv[0]);
1076 _rt2x00_desc_write(txd, 4, skbdesc->iv[1]); 1076 _rt2x00_desc_write(txd, 4, skbdesc->iv[1]);
1077 } 1077 }
1078
1079 /*
1080 * Register descriptor details in skb frame descriptor.
1081 */
1082 skbdesc->desc = txd;
1083 skbdesc->desc_len = TXD_DESC_SIZE;
1078} 1084}
1079 1085
1080/* 1086/*
@@ -1088,19 +1094,11 @@ static void rt2500usb_write_beacon(struct queue_entry *entry,
1088 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 1094 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1089 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 1095 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
1090 struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data; 1096 struct queue_entry_priv_usb_bcn *bcn_priv = entry->priv_data;
1091 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
1092 int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint); 1097 int pipe = usb_sndbulkpipe(usb_dev, entry->queue->usb_endpoint);
1093 int length; 1098 int length;
1094 u16 reg, reg0; 1099 u16 reg, reg0;
1095 1100
1096 /* 1101 /*
1097 * Add the descriptor in front of the skb.
1098 */
1099 skb_push(entry->skb, entry->queue->desc_size);
1100 memcpy(entry->skb->data, skbdesc->desc, skbdesc->desc_len);
1101 skbdesc->desc = entry->skb->data;
1102
1103 /*
1104 * Disable beaconing while we are reloading the beacon data, 1102 * Disable beaconing while we are reloading the beacon data,
1105 * otherwise we might be sending out invalid data. 1103 * otherwise we might be sending out invalid data.
1106 */ 1104 */
@@ -1109,6 +1107,11 @@ static void rt2500usb_write_beacon(struct queue_entry *entry,
1109 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); 1107 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1110 1108
1111 /* 1109 /*
1110 * Take the descriptor in front of the skb into account.
1111 */
1112 skb_push(entry->skb, TXD_DESC_SIZE);
1113
1114 /*
1112 * USB devices cannot blindly pass the skb->len as the 1115 * USB devices cannot blindly pass the skb->len as the
1113 * length of the data to usb_fill_bulk_urb. Pass the skb 1116 * length of the data to usb_fill_bulk_urb. Pass the skb
1114 * to the driver to determine what the length should be. 1117 * to the driver to determine what the length should be.
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 7d4778d66e77..b2f23272c3aa 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -633,7 +633,8 @@ static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
633 struct txentry_desc *txdesc) 633 struct txentry_desc *txdesc)
634{ 634{
635 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 635 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
636 __le32 *txd = skbdesc->desc; 636 struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data;
637 __le32 *txd = entry_priv->desc;
637 u32 word; 638 u32 word;
638 639
639 /* 640 /*
@@ -657,15 +658,14 @@ static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
657 !test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags)); 658 !test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
658 rt2x00_set_field32(&word, TXD_W1_BURST, 659 rt2x00_set_field32(&word, TXD_W1_BURST,
659 test_bit(ENTRY_TXD_BURST, &txdesc->flags)); 660 test_bit(ENTRY_TXD_BURST, &txdesc->flags));
660 rt2x00_set_field32(&word, TXD_W1_SD_LEN0, 661 rt2x00_set_field32(&word, TXD_W1_SD_LEN0, TXWI_DESC_SIZE);
661 rt2x00dev->ops->extra_tx_headroom);
662 rt2x00_set_field32(&word, TXD_W1_LAST_SEC0, 0); 662 rt2x00_set_field32(&word, TXD_W1_LAST_SEC0, 0);
663 rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 0); 663 rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 0);
664 rt2x00_desc_write(txd, 1, word); 664 rt2x00_desc_write(txd, 1, word);
665 665
666 rt2x00_desc_read(txd, 2, &word); 666 rt2x00_desc_read(txd, 2, &word);
667 rt2x00_set_field32(&word, TXD_W2_SD_PTR1, 667 rt2x00_set_field32(&word, TXD_W2_SD_PTR1,
668 skbdesc->skb_dma + rt2x00dev->ops->extra_tx_headroom); 668 skbdesc->skb_dma + TXWI_DESC_SIZE);
669 rt2x00_desc_write(txd, 2, word); 669 rt2x00_desc_write(txd, 2, word);
670 670
671 rt2x00_desc_read(txd, 3, &word); 671 rt2x00_desc_read(txd, 3, &word);
@@ -673,6 +673,12 @@ static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
673 !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags)); 673 !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
674 rt2x00_set_field32(&word, TXD_W3_QSEL, 2); 674 rt2x00_set_field32(&word, TXD_W3_QSEL, 2);
675 rt2x00_desc_write(txd, 3, word); 675 rt2x00_desc_write(txd, 3, word);
676
677 /*
678 * Register descriptor details in skb frame descriptor.
679 */
680 skbdesc->desc = txd;
681 skbdesc->desc_len = TXD_DESC_SIZE;
676} 682}
677 683
678/* 684/*
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index d48d705d1808..1b87daa19456 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -400,7 +400,7 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
400 struct txentry_desc *txdesc) 400 struct txentry_desc *txdesc)
401{ 401{
402 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 402 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
403 __le32 *txi = skbdesc->desc; 403 __le32 *txi = (__le32 *)(skb->data - TXWI_DESC_SIZE - TXINFO_DESC_SIZE);
404 u32 word; 404 u32 word;
405 405
406 /* 406 /*
@@ -422,6 +422,12 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
422 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_BURST, 422 rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_BURST,
423 test_bit(ENTRY_TXD_BURST, &txdesc->flags)); 423 test_bit(ENTRY_TXD_BURST, &txdesc->flags));
424 rt2x00_desc_write(txi, 0, word); 424 rt2x00_desc_write(txi, 0, word);
425
426 /*
427 * Register descriptor details in skb frame descriptor.
428 */
429 skbdesc->desc = txi;
430 skbdesc->desc_len = TXINFO_DESC_SIZE + TXWI_DESC_SIZE;
425} 431}
426 432
427/* 433/*
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c
index 2fe9f295351f..ff80ef710d4e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00pci.c
+++ b/drivers/net/wireless/rt2x00/rt2x00pci.c
@@ -66,8 +66,6 @@ int rt2x00pci_write_tx_data(struct queue_entry *entry,
66 struct txentry_desc *txdesc) 66 struct txentry_desc *txdesc)
67{ 67{
68 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 68 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
69 struct queue_entry_priv_pci *entry_priv = entry->priv_data;
70 struct skb_frame_desc *skbdesc;
71 69
72 /* 70 /*
73 * This should not happen, we already checked the entry 71 * This should not happen, we already checked the entry
@@ -82,13 +80,6 @@ int rt2x00pci_write_tx_data(struct queue_entry *entry,
82 return -EINVAL; 80 return -EINVAL;
83 } 81 }
84 82
85 /*
86 * Fill in skb descriptor
87 */
88 skbdesc = get_skb_frame_desc(entry->skb);
89 skbdesc->desc = entry_priv->desc;
90 skbdesc->desc_len = entry->queue->desc_size;
91
92 return 0; 83 return 0;
93} 84}
94EXPORT_SYMBOL_GPL(rt2x00pci_write_tx_data); 85EXPORT_SYMBOL_GPL(rt2x00pci_write_tx_data);
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 97b2c7650656..891d5f72716e 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -552,7 +552,6 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
552 struct rt2x00_intf *intf = vif_to_intf(vif); 552 struct rt2x00_intf *intf = vif_to_intf(vif);
553 struct skb_frame_desc *skbdesc; 553 struct skb_frame_desc *skbdesc;
554 struct txentry_desc txdesc; 554 struct txentry_desc txdesc;
555 __le32 desc[16];
556 555
557 if (unlikely(!intf->beacon)) 556 if (unlikely(!intf->beacon))
558 return -ENOBUFS; 557 return -ENOBUFS;
@@ -585,19 +584,10 @@ int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
585 rt2x00queue_create_tx_descriptor(intf->beacon, &txdesc); 584 rt2x00queue_create_tx_descriptor(intf->beacon, &txdesc);
586 585
587 /* 586 /*
588 * For the descriptor we use a local array from where the
589 * driver can move it to the correct location required for
590 * the hardware.
591 */
592 memset(desc, 0, sizeof(desc));
593
594 /*
595 * Fill in skb descriptor 587 * Fill in skb descriptor
596 */ 588 */
597 skbdesc = get_skb_frame_desc(intf->beacon->skb); 589 skbdesc = get_skb_frame_desc(intf->beacon->skb);
598 memset(skbdesc, 0, sizeof(*skbdesc)); 590 memset(skbdesc, 0, sizeof(*skbdesc));
599 skbdesc->desc = desc;
600 skbdesc->desc_len = intf->beacon->queue->desc_size;
601 skbdesc->entry = intf->beacon; 591 skbdesc->entry = intf->beacon;
602 592
603 /* 593 /*
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
index acf3282fc13e..a4f0551422ae 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.c
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
@@ -221,7 +221,6 @@ int rt2x00usb_write_tx_data(struct queue_entry *entry,
221 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 221 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
222 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); 222 struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev);
223 struct queue_entry_priv_usb *entry_priv = entry->priv_data; 223 struct queue_entry_priv_usb *entry_priv = entry->priv_data;
224 struct skb_frame_desc *skbdesc;
225 u32 length; 224 u32 length;
226 225
227 /* 226 /*
@@ -231,13 +230,6 @@ int rt2x00usb_write_tx_data(struct queue_entry *entry,
231 memset(entry->skb->data, 0, entry->queue->desc_size); 230 memset(entry->skb->data, 0, entry->queue->desc_size);
232 231
233 /* 232 /*
234 * Fill in skb descriptor
235 */
236 skbdesc = get_skb_frame_desc(entry->skb);
237 skbdesc->desc = entry->skb->data;
238 skbdesc->desc_len = entry->queue->desc_size;
239
240 /*
241 * USB devices cannot blindly pass the skb->len as the 233 * USB devices cannot blindly pass the skb->len as the
242 * length of the data to usb_fill_bulk_urb. Pass the skb 234 * length of the data to usb_fill_bulk_urb. Pass the skb
243 * to the driver to determine what the length should be. 235 * to the driver to determine what the length should be.
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 55aa010aeee2..1be1d7d585d8 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1763,7 +1763,8 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1763 struct txentry_desc *txdesc) 1763 struct txentry_desc *txdesc)
1764{ 1764{
1765 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 1765 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
1766 __le32 *txd = skbdesc->desc; 1766 struct queue_entry_priv_pci *entry_priv = skbdesc->entry->priv_data;
1767 __le32 *txd = entry_priv->desc;
1767 u32 word; 1768 u32 word;
1768 1769
1769 /* 1770 /*
@@ -1842,6 +1843,13 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1842 test_bit(ENTRY_TXD_BURST, &txdesc->flags)); 1843 test_bit(ENTRY_TXD_BURST, &txdesc->flags));
1843 rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher); 1844 rt2x00_set_field32(&word, TXD_W0_CIPHER_ALG, txdesc->cipher);
1844 rt2x00_desc_write(txd, 0, word); 1845 rt2x00_desc_write(txd, 0, word);
1846
1847 /*
1848 * Register descriptor details in skb frame descriptor.
1849 */
1850 skbdesc->desc = txd;
1851 skbdesc->desc_len =
1852 (txdesc->queue == QID_BEACON) ? TXINFO_SIZE : TXD_DESC_SIZE;
1845} 1853}
1846 1854
1847/* 1855/*
@@ -1851,7 +1859,7 @@ static void rt61pci_write_beacon(struct queue_entry *entry,
1851 struct txentry_desc *txdesc) 1859 struct txentry_desc *txdesc)
1852{ 1860{
1853 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 1861 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1854 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); 1862 struct queue_entry_priv_pci *entry_priv = entry->priv_data;
1855 unsigned int beacon_base; 1863 unsigned int beacon_base;
1856 u32 reg; 1864 u32 reg;
1857 1865
@@ -1867,11 +1875,9 @@ static void rt61pci_write_beacon(struct queue_entry *entry,
1867 * Write entire beacon with descriptor to register. 1875 * Write entire beacon with descriptor to register.
1868 */ 1876 */
1869 beacon_base = HW_BEACON_OFFSET(entry->entry_idx); 1877 beacon_base = HW_BEACON_OFFSET(entry->entry_idx);
1870 rt2x00pci_register_multiwrite(rt2x00dev, 1878 rt2x00pci_register_multiwrite(rt2x00dev, beacon_base,
1871 beacon_base, 1879 entry_priv->desc, TXINFO_SIZE);
1872 skbdesc->desc, skbdesc->desc_len); 1880 rt2x00pci_register_multiwrite(rt2x00dev, beacon_base + TXINFO_SIZE,
1873 rt2x00pci_register_multiwrite(rt2x00dev,
1874 beacon_base + skbdesc->desc_len,
1875 entry->skb->data, entry->skb->len); 1881 entry->skb->data, entry->skb->len);
1876 1882
1877 /* 1883 /*
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index fa40d434e729..fca661c2e2a3 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1440,7 +1440,7 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1440 struct txentry_desc *txdesc) 1440 struct txentry_desc *txdesc)
1441{ 1441{
1442 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); 1442 struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
1443 __le32 *txd = skbdesc->desc; 1443 __le32 *txd = (__le32 *)(skb->data - TXD_DESC_SIZE);
1444 u32 word; 1444 u32 word;
1445 1445
1446 /* 1446 /*
@@ -1499,6 +1499,12 @@ static void rt73usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
1499 TXPOWER_TO_DEV(rt2x00dev->tx_power)); 1499 TXPOWER_TO_DEV(rt2x00dev->tx_power));
1500 rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); 1500 rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1);
1501 rt2x00_desc_write(txd, 5, word); 1501 rt2x00_desc_write(txd, 5, word);
1502
1503 /*
1504 * Register descriptor details in skb frame descriptor.
1505 */
1506 skbdesc->desc = txd;
1507 skbdesc->desc_len = TXD_DESC_SIZE;
1502} 1508}
1503 1509
1504/* 1510/*
@@ -1508,18 +1514,10 @@ static void rt73usb_write_beacon(struct queue_entry *entry,
1508 struct txentry_desc *txdesc) 1514 struct txentry_desc *txdesc)
1509{ 1515{
1510 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; 1516 struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1511 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
1512 unsigned int beacon_base; 1517 unsigned int beacon_base;
1513 u32 reg; 1518 u32 reg;
1514 1519
1515 /* 1520 /*
1516 * Add the descriptor in front of the skb.
1517 */
1518 skb_push(entry->skb, entry->queue->desc_size);
1519 memcpy(entry->skb->data, skbdesc->desc, skbdesc->desc_len);
1520 skbdesc->desc = entry->skb->data;
1521
1522 /*
1523 * Disable beaconing while we are reloading the beacon data, 1521 * Disable beaconing while we are reloading the beacon data,
1524 * otherwise we might be sending out invalid data. 1522 * otherwise we might be sending out invalid data.
1525 */ 1523 */
@@ -1528,6 +1526,11 @@ static void rt73usb_write_beacon(struct queue_entry *entry,
1528 rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg); 1526 rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
1529 1527
1530 /* 1528 /*
1529 * Take the descriptor in front of the skb into account.
1530 */
1531 skb_push(entry->skb, TXD_DESC_SIZE);
1532
1533 /*
1531 * Write entire beacon with descriptor to register. 1534 * Write entire beacon with descriptor to register.
1532 */ 1535 */
1533 beacon_base = HW_BEACON_OFFSET(entry->entry_idx); 1536 beacon_base = HW_BEACON_OFFSET(entry->entry_idx);