diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 37 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 39 |
3 files changed, 49 insertions, 44 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 9f59db91cfc2..86cd9a5eee2b 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1117,11 +1117,24 @@ static void rt2500usb_fill_rxdone(struct queue_entry *entry, | |||
1117 | __le32 *rxd = | 1117 | __le32 *rxd = |
1118 | (__le32 *)(entry->skb->data + | 1118 | (__le32 *)(entry->skb->data + |
1119 | (priv_rx->urb->actual_length - entry->queue->desc_size)); | 1119 | (priv_rx->urb->actual_length - entry->queue->desc_size)); |
1120 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)entry->skb->data; | 1120 | unsigned int offset = entry->queue->desc_size + 2; |
1121 | int header_size = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); | ||
1122 | u32 word0; | 1121 | u32 word0; |
1123 | u32 word1; | 1122 | u32 word1; |
1124 | 1123 | ||
1124 | /* | ||
1125 | * Copy descriptor to the available headroom inside the skbuffer. | ||
1126 | * Remove the original copy by trimming the skbuffer. | ||
1127 | */ | ||
1128 | skb_push(entry->skb, offset); | ||
1129 | memcpy(entry->skb->data, rxd, entry->queue->desc_size); | ||
1130 | rxd = (__le32 *)entry->skb->data; | ||
1131 | skb_pull(entry->skb, offset); | ||
1132 | skb_trim(entry->skb, rxdesc->size); | ||
1133 | |||
1134 | /* | ||
1135 | * The descriptor is now aligned to 4 bytes and thus it is | ||
1136 | * now safe to read it on all architectures. | ||
1137 | */ | ||
1125 | rt2x00_desc_read(rxd, 0, &word0); | 1138 | rt2x00_desc_read(rxd, 0, &word0); |
1126 | rt2x00_desc_read(rxd, 1, &word1); | 1139 | rt2x00_desc_read(rxd, 1, &word1); |
1127 | 1140 | ||
@@ -1142,28 +1155,12 @@ static void rt2500usb_fill_rxdone(struct queue_entry *entry, | |||
1142 | rxdesc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS); | 1155 | rxdesc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS); |
1143 | 1156 | ||
1144 | /* | 1157 | /* |
1145 | * The data behind the ieee80211 header must be | 1158 | * Set descriptor and data pointer. |
1146 | * aligned on a 4 byte boundary. | ||
1147 | */ | ||
1148 | if (header_size % 4 == 0) { | ||
1149 | skb_push(entry->skb, 2); | ||
1150 | memmove(entry->skb->data, entry->skb->data + 2, | ||
1151 | entry->skb->len - 2); | ||
1152 | } | ||
1153 | |||
1154 | /* | ||
1155 | * Set descriptor pointer. | ||
1156 | */ | 1159 | */ |
1157 | skbdesc->data = entry->skb->data; | 1160 | skbdesc->data = entry->skb->data; |
1158 | skbdesc->data_len = rxdesc->size; | 1161 | skbdesc->data_len = rxdesc->size; |
1159 | skbdesc->desc = entry->skb->data + rxdesc->size; | 1162 | skbdesc->desc = entry->skb->data - offset; |
1160 | skbdesc->desc_len = entry->queue->desc_size; | 1163 | skbdesc->desc_len = entry->queue->desc_size; |
1161 | |||
1162 | /* | ||
1163 | * Remove descriptor from skb buffer and trim the whole thing | ||
1164 | * down to only contain data. | ||
1165 | */ | ||
1166 | skb_trim(entry->skb, rxdesc->size); | ||
1167 | } | 1164 | } |
1168 | 1165 | ||
1169 | /* | 1166 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 063b167da31e..512ff3914813 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -247,11 +247,11 @@ static struct sk_buff* rt2x00usb_alloc_rxskb(struct data_queue *queue) | |||
247 | * advance. | 247 | * advance. |
248 | */ | 248 | */ |
249 | frame_size = queue->data_size + queue->desc_size; | 249 | frame_size = queue->data_size + queue->desc_size; |
250 | skb = dev_alloc_skb(frame_size + 2); | 250 | skb = dev_alloc_skb(queue->desc_size + frame_size + 2); |
251 | if (!skb) | 251 | if (!skb) |
252 | return NULL; | 252 | return NULL; |
253 | 253 | ||
254 | skb_reserve(skb, 2); | 254 | skb_reserve(skb, queue->desc_size + 2); |
255 | skb_put(skb, frame_size); | 255 | skb_put(skb, frame_size); |
256 | 256 | ||
257 | return skb; | 257 | return skb; |
@@ -264,6 +264,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) | |||
264 | struct sk_buff *skb; | 264 | struct sk_buff *skb; |
265 | struct skb_frame_desc *skbdesc; | 265 | struct skb_frame_desc *skbdesc; |
266 | struct rxdone_entry_desc rxdesc; | 266 | struct rxdone_entry_desc rxdesc; |
267 | int header_size; | ||
267 | 268 | ||
268 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || | 269 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || |
269 | !test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) | 270 | !test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) |
@@ -288,6 +289,18 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) | |||
288 | rt2x00dev->ops->lib->fill_rxdone(entry, &rxdesc); | 289 | rt2x00dev->ops->lib->fill_rxdone(entry, &rxdesc); |
289 | 290 | ||
290 | /* | 291 | /* |
292 | * The data behind the ieee80211 header must be | ||
293 | * aligned on a 4 byte boundary. | ||
294 | */ | ||
295 | header_size = ieee80211_get_hdrlen_from_skb(entry->skb); | ||
296 | if (header_size % 4 == 0) { | ||
297 | skb_push(entry->skb, 2); | ||
298 | memmove(entry->skb->data, entry->skb->data + 2, | ||
299 | entry->skb->len - 2); | ||
300 | skbdesc->data = entry->skb->data; | ||
301 | } | ||
302 | |||
303 | /* | ||
291 | * Allocate a new sk buffer to replace the current one. | 304 | * Allocate a new sk buffer to replace the current one. |
292 | * If allocation fails, we should drop the current frame | 305 | * If allocation fails, we should drop the current frame |
293 | * so we can recycle the existing sk buffer for the new frame. | 306 | * so we can recycle the existing sk buffer for the new frame. |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 6546b0d607b9..b4b70850edfc 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -1370,12 +1370,24 @@ static void rt73usb_fill_rxdone(struct queue_entry *entry, | |||
1370 | { | 1370 | { |
1371 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | 1371 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); |
1372 | __le32 *rxd = (__le32 *)entry->skb->data; | 1372 | __le32 *rxd = (__le32 *)entry->skb->data; |
1373 | struct ieee80211_hdr *hdr = | 1373 | unsigned int offset = entry->queue->desc_size + 2; |
1374 | (struct ieee80211_hdr *)entry->skb->data + entry->queue->desc_size; | ||
1375 | int header_size = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); | ||
1376 | u32 word0; | 1374 | u32 word0; |
1377 | u32 word1; | 1375 | u32 word1; |
1378 | 1376 | ||
1377 | /* | ||
1378 | * Copy descriptor to the available headroom inside the skbuffer. | ||
1379 | * Remove the original copy by pulling the skbuffer. | ||
1380 | */ | ||
1381 | skb_push(entry->skb, offset); | ||
1382 | memcpy(entry->skb->data, rxd, entry->queue->desc_size); | ||
1383 | rxd = (__le32 *)entry->skb->data; | ||
1384 | skb_pull(entry->skb, offset + skbdesc->desc_len); | ||
1385 | skb_trim(entry->skb, rxdesc->size); | ||
1386 | |||
1387 | /* | ||
1388 | * The descriptor is now aligned to 4 bytes and thus it is | ||
1389 | * now safe to read it on all architectures. | ||
1390 | */ | ||
1379 | rt2x00_desc_read(rxd, 0, &word0); | 1391 | rt2x00_desc_read(rxd, 0, &word0); |
1380 | rt2x00_desc_read(rxd, 1, &word1); | 1392 | rt2x00_desc_read(rxd, 1, &word1); |
1381 | 1393 | ||
@@ -1393,29 +1405,12 @@ static void rt73usb_fill_rxdone(struct queue_entry *entry, | |||
1393 | rxdesc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS); | 1405 | rxdesc->my_bss = !!rt2x00_get_field32(word0, RXD_W0_MY_BSS); |
1394 | 1406 | ||
1395 | /* | 1407 | /* |
1396 | * The data behind the ieee80211 header must be | ||
1397 | * aligned on a 4 byte boundary. | ||
1398 | */ | ||
1399 | if (header_size % 4 == 0) { | ||
1400 | skb_push(entry->skb, 2); | ||
1401 | memmove(entry->skb->data, entry->skb->data + 2, | ||
1402 | entry->skb->len - 2); | ||
1403 | } | ||
1404 | |||
1405 | /* | ||
1406 | * Set descriptor and data pointer. | 1408 | * Set descriptor and data pointer. |
1407 | */ | 1409 | */ |
1408 | skbdesc->data = entry->skb->data + entry->queue->desc_size; | 1410 | skbdesc->data = entry->skb->data; |
1409 | skbdesc->data_len = rxdesc->size; | 1411 | skbdesc->data_len = rxdesc->size; |
1410 | skbdesc->desc = entry->skb->data; | 1412 | skbdesc->desc = entry->skb->data - offset; |
1411 | skbdesc->desc_len = entry->queue->desc_size; | 1413 | skbdesc->desc_len = entry->queue->desc_size; |
1412 | |||
1413 | /* | ||
1414 | * Remove descriptor from skb buffer and trim the whole thing | ||
1415 | * down to only contain data. | ||
1416 | */ | ||
1417 | skb_pull(entry->skb, skbdesc->desc_len); | ||
1418 | skb_trim(entry->skb, rxdesc->size); | ||
1419 | } | 1414 | } |
1420 | 1415 | ||
1421 | /* | 1416 | /* |