|
@@ -260,44 +260,6 @@ EXPORT_SYMBOL_GPL(rt2x00usb_kick_tx_queue);
|
|
|
/*
|
|
|
* RX data handlers.
|
|
|
*/
|
|
|
-static struct sk_buff* rt2x00usb_alloc_rxskb(struct data_queue *queue)
|
|
|
-{
|
|
|
- struct sk_buff *skb;
|
|
|
- unsigned int frame_size;
|
|
|
- unsigned int reserved_size;
|
|
|
-
|
|
|
- /*
|
|
|
- * The frame size includes descriptor size, because the
|
|
|
- * hardware directly receive the frame into the skbuffer.
|
|
|
- */
|
|
|
- frame_size = queue->data_size + queue->desc_size;
|
|
|
-
|
|
|
- /*
|
|
|
- * For the allocation we should keep a few things in mind:
|
|
|
- * 1) 4byte alignment of 802.11 payload
|
|
|
- *
|
|
|
- * For (1) we need at most 4 bytes to guarentee the correct
|
|
|
- * alignment. We are going to optimize the fact that the chance
|
|
|
- * that the 802.11 header_size % 4 == 2 is much bigger then
|
|
|
- * anything else. However since we need to move the frame up
|
|
|
- * to 3 bytes to the front, which means we need to preallocate
|
|
|
- * 6 bytes.
|
|
|
- */
|
|
|
- reserved_size = 6;
|
|
|
-
|
|
|
- /*
|
|
|
- * Allocate skbuffer.
|
|
|
- */
|
|
|
- skb = dev_alloc_skb(frame_size + reserved_size);
|
|
|
- if (!skb)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- skb_reserve(skb, reserved_size);
|
|
|
- skb_put(skb, frame_size);
|
|
|
-
|
|
|
- return skb;
|
|
|
-}
|
|
|
-
|
|
|
static void rt2x00usb_interrupt_rxdone(struct urb *urb)
|
|
|
{
|
|
|
struct queue_entry *entry = (struct queue_entry *)urb->context;
|
|
@@ -305,8 +267,6 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
|
|
|
struct sk_buff *skb;
|
|
|
struct skb_frame_desc *skbdesc;
|
|
|
struct rxdone_entry_desc rxdesc;
|
|
|
- unsigned int header_size;
|
|
|
- unsigned int align;
|
|
|
|
|
|
if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) ||
|
|
|
!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
|
|
@@ -330,26 +290,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
|
|
|
memset(&rxdesc, 0, sizeof(rxdesc));
|
|
|
rt2x00dev->ops->lib->fill_rxdone(entry, &rxdesc);
|
|
|
|
|
|
- header_size = ieee80211_get_hdrlen_from_skb(entry->skb);
|
|
|
-
|
|
|
/*
|
|
|
- * The data behind the ieee80211 header must be
|
|
|
- * aligned on a 4 byte boundary. We already reserved
|
|
|
- * 2 bytes for header_size % 4 == 2 optimization.
|
|
|
- * To determine the number of bytes which the data
|
|
|
- * should be moved to the left, we must add these
|
|
|
- * 2 bytes to the header_size.
|
|
|
+ * Trim the skb to the correct size.
|
|
|
*/
|
|
|
- align = (header_size + 2) % 4;
|
|
|
-
|
|
|
- if (align) {
|
|
|
- skb_push(entry->skb, align);
|
|
|
- /* Move entire frame in 1 command */
|
|
|
- memmove(entry->skb->data, entry->skb->data + align,
|
|
|
- rxdesc.size);
|
|
|
- }
|
|
|
-
|
|
|
- /* Update data pointers, trim buffer to correct size */
|
|
|
skb_trim(entry->skb, rxdesc.size);
|
|
|
|
|
|
/*
|
|
@@ -357,7 +300,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
|
|
|
* If allocation fails, we should drop the current frame
|
|
|
* so we can recycle the existing sk buffer for the new frame.
|
|
|
*/
|
|
|
- skb = rt2x00usb_alloc_rxskb(entry->queue);
|
|
|
+ skb = rt2x00queue_alloc_rxskb(entry->queue);
|
|
|
if (!skb)
|
|
|
goto skip_entry;
|
|
|
|
|
@@ -529,7 +472,7 @@ int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev)
|
|
|
*/
|
|
|
entry_size = rt2x00dev->rx->data_size + rt2x00dev->rx->desc_size;
|
|
|
for (i = 0; i < rt2x00dev->rx->limit; i++) {
|
|
|
- skb = rt2x00usb_alloc_rxskb(rt2x00dev->rx);
|
|
|
+ skb = rt2x00queue_alloc_rxskb(rt2x00dev->rx);
|
|
|
if (!skb)
|
|
|
goto exit;
|
|
|
|