}
 EXPORT_SYMBOL_GPL(rt2800_disable_wpdma);
 
+void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
+                              unsigned short *txwi_size,
+                              unsigned short *rxwi_size)
+{
+       switch (rt2x00dev->chip.rt) {
+       case RT3593:
+               *txwi_size = TXWI_DESC_SIZE_4WORDS;
+               *rxwi_size = RXWI_DESC_SIZE_5WORDS;
+               break;
+
+       case RT5592:
+               *txwi_size = TXWI_DESC_SIZE_5WORDS;
+               *rxwi_size = RXWI_DESC_SIZE_6WORDS;
+               break;
+
+       default:
+               *txwi_size = TXWI_DESC_SIZE_4WORDS;
+               *rxwi_size = RXWI_DESC_SIZE_4WORDS;
+               break;
+       }
+}
+EXPORT_SYMBOL_GPL(rt2800_get_txwi_rxwi_size);
+
 static bool rt2800_check_firmware_crc(const u8 *data, const size_t len)
 {
        u16 fw_crc;
 
                      struct survey_info *survey);
 void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev);
 
+void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
+                              unsigned short *txwi_size,
+                              unsigned short *rxwi_size);
+
 #endif /* RT2800LIB_H */
 
 
 static void rt2800pci_queue_init(struct data_queue *queue)
 {
+       struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
+       unsigned short txwi_size, rxwi_size;
+
+       rt2800_get_txwi_rxwi_size(rt2x00dev, &txwi_size, &rxwi_size);
+
        switch (queue->qid) {
        case QID_RX:
                queue->limit = 128;
                queue->data_size = AGGREGATION_SIZE;
                queue->desc_size = RXD_DESC_SIZE;
-               queue->winfo_size = RXWI_DESC_SIZE_4WORDS;
+               queue->winfo_size = rxwi_size;
                queue->priv_size = sizeof(struct queue_entry_priv_mmio);
                break;
 
                queue->limit = 64;
                queue->data_size = AGGREGATION_SIZE;
                queue->desc_size = TXD_DESC_SIZE;
-               queue->winfo_size = TXWI_DESC_SIZE_4WORDS;
+               queue->winfo_size = txwi_size;
                queue->priv_size = sizeof(struct queue_entry_priv_mmio);
                break;
 
                queue->limit = 8;
                queue->data_size = 0; /* No DMA required for beacons */
                queue->desc_size = TXD_DESC_SIZE;
-               queue->winfo_size = TXWI_DESC_SIZE_4WORDS;
+               queue->winfo_size = txwi_size;
                queue->priv_size = sizeof(struct queue_entry_priv_mmio);
                break;
 
 
        struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
        unsigned short txwi_size, rxwi_size;
 
-       if (rt2x00_rt(rt2x00dev, RT3593)) {
-               txwi_size = TXWI_DESC_SIZE_4WORDS;
-               rxwi_size = RXWI_DESC_SIZE_5WORDS;
-       } else if (rt2x00_rt(rt2x00dev, RT5592)) {
-               txwi_size = TXWI_DESC_SIZE_5WORDS;
-               rxwi_size = RXWI_DESC_SIZE_6WORDS;
-       } else {
-               txwi_size = TXWI_DESC_SIZE_4WORDS;
-               rxwi_size = RXWI_DESC_SIZE_4WORDS;
-       }
+       rt2800_get_txwi_rxwi_size(rt2x00dev, &txwi_size, &rxwi_size);
 
        switch (queue->qid) {
        case QID_RX: