* Convert descriptor AGC value to RSSI value.
         */
        rxdesc->rssi = rt2800_agc_to_rssi(entry->queue->rt2x00dev, word);
+       /*
+        * Remove RXWI descriptor from start of the buffer.
+        */
+       skb_pull(entry->skb, entry->queue->winfo_size);
 }
 EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
 
        unsigned int beacon_base;
        unsigned int padding_len;
        u32 orig_reg, reg;
+       const int txwi_desc_size = entry->queue->winfo_size;
 
        /*
         * Disable beaconing while we are reloading the beacon data,
        /*
         * Add space for the TXWI in front of the skb.
         */
-       memset(skb_push(entry->skb, TXWI_DESC_SIZE), 0, TXWI_DESC_SIZE);
+       memset(skb_push(entry->skb, txwi_desc_size), 0, txwi_desc_size);
 
        /*
         * Register descriptor details in skb frame descriptor.
         */
        skbdesc->flags |= SKBDESC_DESC_IN_SKB;
        skbdesc->desc = entry->skb->data;
-       skbdesc->desc_len = TXWI_DESC_SIZE;
+       skbdesc->desc_len = txwi_desc_size;
 
        /*
         * Add the TXWI for the beacon to the skb.
                                                unsigned int beacon_base)
 {
        int i;
+       const int txwi_desc_size = rt2x00dev->ops->bcn->winfo_size;
 
        /*
         * For the Beacon base registers we only need to clear
         * the whole TXWI which (when set to 0) will invalidate
         * the entire beacon.
         */
-       for (i = 0; i < TXWI_DESC_SIZE; i += sizeof(__le32))
+       for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
                rt2800_register_write(rt2x00dev, beacon_base + i, 0);
 }
 
 
         * Process the RXWI structure that is at the start of the buffer.
         */
        rt2800_process_rxwi(entry, rxdesc);
-
-       /*
-        * Remove RXWI descriptor from start of buffer.
-        */
-       skb_pull(entry->skb, RXWI_DESC_SIZE);
 }
 
 /*
        .entry_num              = 128,
        .data_size              = AGGREGATION_SIZE,
        .desc_size              = RXD_DESC_SIZE,
+       .winfo_size             = RXWI_DESC_SIZE,
        .priv_size              = sizeof(struct queue_entry_priv_mmio),
 };
 
        .entry_num              = 64,
        .data_size              = AGGREGATION_SIZE,
        .desc_size              = TXD_DESC_SIZE,
+       .winfo_size             = TXWI_DESC_SIZE,
        .priv_size              = sizeof(struct queue_entry_priv_mmio),
 };
 
 static const struct data_queue_desc rt2800pci_queue_bcn = {
        .entry_num              = 8,
        .data_size              = 0, /* No DMA required for beacons */
-       .desc_size              = TXWI_DESC_SIZE,
+       .desc_size              = TXD_DESC_SIZE,
+       .winfo_size             = TXWI_DESC_SIZE,
        .priv_size              = sizeof(struct queue_entry_priv_mmio),
 };
 
 
         */
        skbdesc->flags |= SKBDESC_DESC_IN_SKB;
        skbdesc->desc = txi;
-       skbdesc->desc_len = entry->queue->desc_size;
+       skbdesc->desc_len = TXINFO_DESC_SIZE + entry->queue->winfo_size;
 }
 
 /*
         * Process the RXWI structure.
         */
        rt2800_process_rxwi(entry, rxdesc);
-
-       /*
-        * Remove RXWI descriptor from start of buffer.
-        */
-       skb_pull(entry->skb, entry->queue->desc_size - RXINFO_DESC_SIZE);
 }
 
 /*
 static const struct data_queue_desc rt2800usb_queue_rx = {
        .entry_num              = 128,
        .data_size              = AGGREGATION_SIZE,
-       .desc_size              = RXINFO_DESC_SIZE + RXWI_DESC_SIZE,
+       .desc_size              = RXINFO_DESC_SIZE,
+       .winfo_size             = RXWI_DESC_SIZE,
        .priv_size              = sizeof(struct queue_entry_priv_usb),
 };
 
 static const struct data_queue_desc rt2800usb_queue_tx = {
        .entry_num              = 16,
        .data_size              = AGGREGATION_SIZE,
-       .desc_size              = TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
+       .desc_size              = TXINFO_DESC_SIZE,
+       .winfo_size             = TXWI_DESC_SIZE,
        .priv_size              = sizeof(struct queue_entry_priv_usb),
 };
 
 static const struct data_queue_desc rt2800usb_queue_bcn = {
        .entry_num              = 8,
        .data_size              = MGMT_FRAME_SIZE,
-       .desc_size              = TXINFO_DESC_SIZE + TXWI_DESC_SIZE,
+       .desc_size              = TXINFO_DESC_SIZE,
+       .winfo_size             = TXWI_DESC_SIZE,
        .priv_size              = sizeof(struct queue_entry_priv_usb),
 };
 
 static const struct data_queue_desc rt2800usb_queue_rx_5592 = {
        .entry_num              = 128,
        .data_size              = AGGREGATION_SIZE,
-       .desc_size              = RXINFO_DESC_SIZE + RXWI_DESC_SIZE_5592,
+       .desc_size              = RXINFO_DESC_SIZE,
+       .winfo_size             = RXWI_DESC_SIZE_5592,
        .priv_size              = sizeof(struct queue_entry_priv_usb),
 };
 
 static const struct data_queue_desc rt2800usb_queue_tx_5592 = {
        .entry_num              = 16,
        .data_size              = AGGREGATION_SIZE,
-       .desc_size              = TXINFO_DESC_SIZE + TXWI_DESC_SIZE_5592,
+       .desc_size              = TXINFO_DESC_SIZE,
+       .winfo_size             = TXWI_DESC_SIZE_5592,
        .priv_size              = sizeof(struct queue_entry_priv_usb),
 };
 
 static const struct data_queue_desc rt2800usb_queue_bcn_5592 = {
        .entry_num              = 8,
        .data_size              = MGMT_FRAME_SIZE,
-       .desc_size              = TXINFO_DESC_SIZE + TXWI_DESC_SIZE_5592,
+       .desc_size              = TXINFO_DESC_SIZE,
+       .winfo_size             = TXWI_DESC_SIZE_5592,
        .priv_size              = sizeof(struct queue_entry_priv_usb),
 };
 
 
 
 struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
 {
-       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
+       struct data_queue *queue = entry->queue;
+       struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
        struct sk_buff *skb;
        struct skb_frame_desc *skbdesc;
        unsigned int frame_size;
         * The frame size includes descriptor size, because the
         * hardware directly receive the frame into the skbuffer.
         */
-       frame_size = entry->queue->data_size + entry->queue->desc_size;
+       frame_size = queue->data_size + queue->desc_size + queue->winfo_size;
 
        /*
         * The payload should be aligned to a 4-byte boundary,
        queue->threshold = DIV_ROUND_UP(qdesc->entry_num, 10);
        queue->data_size = qdesc->data_size;
        queue->desc_size = qdesc->desc_size;
+       queue->winfo_size = qdesc->winfo_size;
 
        /*
         * Allocate all queue entries.
 
        unsigned short cw_max;
 
        unsigned short data_size;
-       unsigned short desc_size;
+       unsigned char  desc_size;
+       unsigned char  winfo_size;
 
        unsigned short usb_endpoint;
        unsigned short usb_maxpacket;
 struct data_queue_desc {
        unsigned short entry_num;
        unsigned short data_size;
-       unsigned short desc_size;
+       unsigned char  desc_size;
+       unsigned char  winfo_size;
        unsigned short priv_size;
 };