From: Ping-Ke Shih <pks...@realtek.com>

1. Both 32-bit and 64-bit use the same TX/RX buffer desc layout
2. Extend set_desc() and get_desc() to set and get 64-bit address
3. Remove directive DMA_IS_64BIT
4. Add module parameter to turn on 64-bit dma

Signed-off-by: Ping-Ke Shih <pks...@realtek.com>
Signed-off-by: Larry Finger <larry.fin...@lwfinger.net>
Cc: Yan-Hsuan Chuang <yhchu...@realtek.com>
Cc: Birming Chiu <birm...@realtek.com>
Cc: Shaofu <sha...@realtek.com>
Cc: Steven Ting <stevent...@realtek.com>
---
v2 - no changes
---
 drivers/net/wireless/realtek/rtlwifi/pci.c         |  49 ++++++--
 drivers/net/wireless/realtek/rtlwifi/pci.h         |  10 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/hw.c    |   1 +
 .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.c   |   5 +-
 .../net/wireless/realtek/rtlwifi/rtl8188ee/trx.h   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/trx.c   |   5 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ce/trx.h   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/fw.c    |   2 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/trx.c   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8192de/trx.h   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/hw.c    |  31 ++++-
 .../net/wireless/realtek/rtlwifi/rtl8192ee/sw.c    |   3 +
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.c   |  49 ++++----
 .../net/wireless/realtek/rtlwifi/rtl8192ee/trx.h   | 140 ++++-----------------
 .../net/wireless/realtek/rtlwifi/rtl8192se/sw.c    |   2 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/trx.c   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8192se/trx.h   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.c   |   5 +-
 .../net/wireless/realtek/rtlwifi/rtl8723ae/trx.h   |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/hw.c    |   1 +
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.c   |   5 +-
 .../net/wireless/realtek/rtlwifi/rtl8723be/trx.h   |   3 +-
 .../realtek/rtlwifi/rtl8723com/fw_common.c         |   3 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/hw.c    |   1 +
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.c   |   5 +-
 .../net/wireless/realtek/rtlwifi/rtl8821ae/trx.h   |   3 +-
 drivers/net/wireless/realtek/rtlwifi/wifi.h        |  11 +-
 27 files changed, 166 insertions(+), 189 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.c 
b/drivers/net/wireless/realtek/rtlwifi/pci.c
index 4e245feae11e..578422ea3f9b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.c
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.c
@@ -586,7 +586,7 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int 
prio)
                skb = __skb_dequeue(&ring->queue);
                pci_unmap_single(rtlpci->pdev,
                                 rtlpriv->cfg->ops->
-                                            get_desc((u8 *)entry, true,
+                                            get_desc(hw, (u8 *)entry, true,
                                                      HW_DESC_TXBUFF_ADDR),
                                 skb->len, PCI_DMA_TODEVICE);
 
@@ -691,9 +691,10 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw 
*hw,
                return 0;
        rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
        if (rtlpriv->use_new_trx_flow) {
+               /* skb->cb may be 64 bit address */
                rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
                                            HW_DESC_RX_PREPARE,
-                                           (u8 *)&bufferaddress);
+                                           (u8 *)(dma_addr_t *)skb->cb);
        } else {
                rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
                                            HW_DESC_RXBUFF_ADDR,
@@ -798,7 +799,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
                        pdesc = &rtlpci->rx_ring[rxring_idx].desc[
                                rtlpci->rx_ring[rxring_idx].idx];
 
-                       own = (u8)rtlpriv->cfg->ops->get_desc((u8 *)pdesc,
+                       own = (u8)rtlpriv->cfg->ops->get_desc(hw, (u8 *)pdesc,
                                                              false,
                                                              HW_DESC_OWN);
                        if (own) /* wait data to be filled by hardware */
@@ -825,7 +826,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
                                                           (u8 *)buffer_desc,
                                                           hw_queue);
 
-               len = rtlpriv->cfg->ops->get_desc((u8 *)pdesc, false,
+               len = rtlpriv->cfg->ops->get_desc(hw, (u8 *)pdesc, false,
                                                  HW_DESC_RXPKT_LEN);
 
                if (skb->end - skb->tail > len) {
@@ -1122,7 +1123,7 @@ static void _rtl_pci_prepare_bcn_tasklet(struct 
ieee80211_hw *hw)
        if (pskb) {
                pci_unmap_single(rtlpci->pdev,
                                 rtlpriv->cfg->ops->get_desc(
-                                (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
+                                hw, (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
                                 pskb->len, PCI_DMA_TODEVICE);
                kfree_skb(pskb);
        }
@@ -1378,7 +1379,8 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
 
                pci_unmap_single(rtlpci->pdev,
                                 rtlpriv->cfg->
-                                            ops->get_desc((u8 *)entry, true,
+                                            ops->get_desc(hw, (u8 *)entry,
+                                                  true,
                                                   HW_DESC_TXBUFF_ADDR),
                                 skb->len, PCI_DMA_TODEVICE);
                kfree_skb(skb);
@@ -1507,7 +1509,7 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
                        for (i = 0; i < rtlpci->rxringcount; i++) {
                                entry = &rtlpci->rx_ring[rxring_idx].desc[i];
                                bufferaddress =
-                                 rtlpriv->cfg->ops->get_desc((u8 *)entry,
+                                 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
                                  false , HW_DESC_RXBUFF_ADDR);
                                memset((u8 *)entry , 0 ,
                                       sizeof(*rtlpci->rx_ring
@@ -1560,7 +1562,7 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
 
                                pci_unmap_single(rtlpci->pdev,
                                                 rtlpriv->cfg->ops->
-                                                        get_desc((u8 *)
+                                                        get_desc(hw, (u8 *)
                                                         entry,
                                                         true,
                                                         HW_DESC_TXBUFF_ADDR),
@@ -1673,7 +1675,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
        if (rtlpriv->use_new_trx_flow) {
                ptx_bd_desc = &ring->buffer_desc[idx];
        } else {
-               own = (u8) rtlpriv->cfg->ops->get_desc((u8 *)pdesc,
+               own = (u8)rtlpriv->cfg->ops->get_desc(hw, (u8 *)pdesc,
                                true, HW_DESC_OWN);
 
                if ((own == 1) && (hw_queue != BEACON_QUEUE)) {
@@ -2163,6 +2165,21 @@ static int rtl_pci_intr_mode_decide(struct ieee80211_hw 
*hw)
        return ret;
 }
 
+static void platform_enable_dma64(struct pci_dev *pdev, bool dma64)
+{
+       u8      value;
+
+       pci_read_config_byte(pdev, 0x719, &value);
+
+       /* 0x719 Bit5 is DMA64 bit fetch. */
+       if (dma64)
+               value |= BIT(5);
+       else
+               value &= ~BIT(5);
+
+       pci_write_config_byte(pdev, 0x719, value);
+}
+
 int rtl_pci_probe(struct pci_dev *pdev,
                            const struct pci_device_id *id)
 {
@@ -2181,13 +2198,25 @@ int rtl_pci_probe(struct pci_dev *pdev,
                return err;
        }
 
-       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
+       if (((struct rtl_hal_cfg *)(id->driver_data))->mod_params->dma64 &&
+           !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
+                       WARN_ONCE(true,
+                                 "Unable to obtain 64bit DMA for consistent 
allocations\n");
+                       err = -ENOMEM;
+                       goto fail1;
+               }
+
+               platform_enable_dma64(pdev, true);
+       } else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
                        WARN_ONCE(true,
                                  "rtlwifi: Unable to obtain 32bit DMA for 
consistent allocations\n");
                        err = -ENOMEM;
                        goto fail1;
                }
+
+               platform_enable_dma64(pdev, false);
        }
 
        pci_set_master(pdev);
diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.h 
b/drivers/net/wireless/realtek/rtlwifi/pci.h
index d9039ea10ba4..1af92b34979d 100644
--- a/drivers/net/wireless/realtek/rtlwifi/pci.h
+++ b/drivers/net/wireless/realtek/rtlwifi/pci.h
@@ -143,13 +143,7 @@ struct rtl_pci_capabilities_header {
  * RX wifi info == RX descriptor in old flow
  */
 struct rtl_tx_buffer_desc {
-#if (RTL8192EE_SEG_NUM == 2)
-       u32 dword[2*(DMA_IS_64BIT + 1)*8]; /*seg = 8*/
-#elif (RTL8192EE_SEG_NUM == 1)
-       u32 dword[2*(DMA_IS_64BIT + 1)*4]; /*seg = 4*/
-#elif (RTL8192EE_SEG_NUM == 0)
-       u32 dword[2*(DMA_IS_64BIT + 1)*2]; /*seg = 2*/
-#endif
+       u32 dword[4 * (1 << (BUFDESC_SEG_NUM + 1))];
 } __packed;
 
 struct rtl_tx_desc {
@@ -157,7 +151,7 @@ struct rtl_tx_desc {
 } __packed;
 
 struct rtl_rx_buffer_desc { /*rx buffer desc*/
-       u32 dword[2];
+       u32 dword[4];
 } __packed;
 
 struct rtl_rx_desc { /*old: rx desc new: rx wifi info*/
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
index 0ba26d27d11c..5b939935eb56 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
@@ -99,6 +99,7 @@ static void _rtl88ee_return_beacon_queue_skb(struct 
ieee80211_hw *hw)
 
                pci_unmap_single(rtlpci->pdev,
                                 rtlpriv->cfg->ops->get_desc(
+                                hw,
                                 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
                                 skb->len, PCI_DMA_TODEVICE);
                kfree_skb(skb);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c
index dd3e12b74447..9670732b2bc6 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.c
@@ -786,7 +786,8 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
        }
 }
 
-u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
+u64 rtl88ee_get_desc(struct ieee80211_hw *hw,
+                    u8 *pdesc, bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
@@ -828,7 +829,7 @@ bool rtl88ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 
hw_queue, u16 index)
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
        u8 *entry = (u8 *)(&ring->desc[ring->idx]);
-       u8 own = (u8)rtl88ee_get_desc(entry, true, HW_DESC_OWN);
+       u8 own = (u8)rtl88ee_get_desc(hw, entry, true, HW_DESC_OWN);
 
        /*beacon packet will only use the first
         *descriptor defautly,and the own may not
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h
index 9a1c2087adee..f902d6769aa8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8188ee/trx.h
@@ -782,7 +782,8 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
                           u8 *pdesc, struct sk_buff *skb);
 void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
                      bool istx, u8 desc_name, u8 *val);
-u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl88ee_get_desc(struct ieee80211_hw *hw,
+                    u8 *pdesc, bool istx, u8 desc_name);
 bool rtl88ee_is_tx_desc_closed(struct ieee80211_hw *hw,
                               u8 hw_queue, u16 index);
 void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.c
index 94a4b39437cd..d36e0060cc7a 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.c
@@ -697,7 +697,8 @@ void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, 
bool istx,
        }
 }
 
-u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
+u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc,
+                    bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
@@ -740,7 +741,7 @@ bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
        u8 *entry = (u8 *)(&ring->desc[ring->idx]);
-       u8 own = (u8)rtl92ce_get_desc(entry, true, HW_DESC_OWN);
+       u8 own = (u8)rtl92ce_get_desc(hw, entry, true, HW_DESC_OWN);
 
        /*beacon packet will only use the first
         *descriptor defautly,and the own may not
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.h
index 66291fc341e7..91f0bd6b752f 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ce/trx.h
@@ -718,7 +718,8 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
                           u8 *pdesc, struct sk_buff *skb);
 void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
                      u8 desc_name, u8 *val);
-u32 rtl92ce_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc,
+                    bool istx, u8 desc_name);
 bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
                               u8 hw_queue, u16 index);
 void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c
index f4129cf96e7c..85cedd083d2b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/fw.c
@@ -490,7 +490,7 @@ static bool _rtl92d_cmd_send_packet(struct ieee80211_hw *hw,
        spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
        pdesc = &ring->desc[idx];
        /* discard output from call below */
-       rtlpriv->cfg->ops->get_desc((u8 *) pdesc, true, HW_DESC_OWN);
+       rtlpriv->cfg->ops->get_desc(hw, (u8 *)pdesc, true, HW_DESC_OWN);
        rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb);
        __skb_queue_tail(&ring->queue, skb);
        spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
index 86019f654428..d7b023cf7400 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.c
@@ -821,7 +821,8 @@ void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, 
bool istx,
        }
 }
 
-u32 rtl92de_get_desc(u8 *p_desc, bool istx, u8 desc_name)
+u64 rtl92de_get_desc(struct ieee80211_hw *hw,
+                    u8 *p_desc, bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
index 9bb6cc648590..f7f776539438 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192de/trx.h
@@ -735,7 +735,8 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,
                           u8 *pdesc, struct sk_buff *skb);
 void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
                      u8 desc_name, u8 *val);
-u32 rtl92de_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl92de_get_desc(struct ieee80211_hw *hw,
+                    u8 *p_desc, bool istx, u8 desc_name);
 void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
                             bool b_firstseg, bool b_lastseg,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
index ef9394be7016..6b0d42a93971 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
@@ -840,6 +840,31 @@ static bool _rtl92ee_init_mac(struct ieee80211_hw *hw)
        /* Set TCR register */
        rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
 
+       /* Set TX/RX descriptor physical address -- HI part */
+       if (!rtlpriv->cfg->mod_params->dma64)
+               goto dma64_end;
+
+       rtl_write_dword(rtlpriv, REG_BCNQ_DESA + 4,
+                       ((u64)rtlpci->tx_ring[BEACON_QUEUE].buffer_desc_dma) >>
+                               32);
+       rtl_write_dword(rtlpriv, REG_MGQ_DESA + 4,
+                       (u64)rtlpci->tx_ring[MGNT_QUEUE].buffer_desc_dma >> 32);
+       rtl_write_dword(rtlpriv, REG_VOQ_DESA + 4,
+                       (u64)rtlpci->tx_ring[VO_QUEUE].buffer_desc_dma >> 32);
+       rtl_write_dword(rtlpriv, REG_VIQ_DESA + 4,
+                       (u64)rtlpci->tx_ring[VI_QUEUE].buffer_desc_dma >> 32);
+       rtl_write_dword(rtlpriv, REG_BEQ_DESA + 4,
+                       (u64)rtlpci->tx_ring[BE_QUEUE].buffer_desc_dma >> 32);
+       rtl_write_dword(rtlpriv, REG_BKQ_DESA + 4,
+                       (u64)rtlpci->tx_ring[BK_QUEUE].buffer_desc_dma >> 32);
+       rtl_write_dword(rtlpriv, REG_HQ0_DESA + 4,
+                       (u64)rtlpci->tx_ring[HIGH_QUEUE].buffer_desc_dma >> 32);
+
+       rtl_write_dword(rtlpriv, REG_RX_DESA + 4,
+                       (u64)rtlpci->rx_ring[RX_MPDU_QUEUE].dma >> 32);
+
+dma64_end:
+
        /* Set TX/RX descriptor physical address(from OS API). */
        rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
                        ((u64)rtlpci->tx_ring[BEACON_QUEUE].buffer_desc_dma) &
@@ -913,15 +938,9 @@ static bool _rtl92ee_init_mac(struct ieee80211_hw *hw)
        rtl_write_word(rtlpriv, REG_HI7Q_TXBD_NUM,
                       TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
        /*Rx*/
-#if (DMA_IS_64BIT == 1)
        rtl_write_word(rtlpriv, REG_RX_RXBD_NUM,
                       RX_DESC_NUM_92E |
                       ((RTL8192EE_SEG_NUM << 13) & 0x6000) | 0x8000);
-#else
-       rtl_write_word(rtlpriv, REG_RX_RXBD_NUM,
-                      RX_DESC_NUM_92E |
-                      ((RTL8192EE_SEG_NUM << 13) & 0x6000) | 0x0000);
-#endif
 
        rtl_write_dword(rtlpriv, REG_TSFTIMER_HCI, 0XFFFFFFFF);
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
index eaa503b7c4b4..ffee7b3b5af7 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/sw.c
@@ -257,6 +257,7 @@ static struct rtl_mod_params rtl92ee_mod_params = {
        .swctrl_lps = false,
        .fwctrl_lps = true,
        .msi_support = true,
+       .dma64 = false,
        .debug_level = 0,
        .debug_mask = 0,
 };
@@ -374,6 +375,7 @@ module_param_named(ips, rtl92ee_mod_params.inactiveps, 
bool, 0444);
 module_param_named(swlps, rtl92ee_mod_params.swctrl_lps, bool, 0444);
 module_param_named(fwlps, rtl92ee_mod_params.fwctrl_lps, bool, 0444);
 module_param_named(msi, rtl92ee_mod_params.msi_support, bool, 0444);
+module_param_named(dma64, rtl92ee_mod_params.dma64, bool, 0444);
 module_param_named(disable_watchdog, rtl92ee_mod_params.disable_watchdog,
                   bool, 0444);
 MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
@@ -381,6 +383,7 @@ MODULE_PARM_DESC(ips, "Set to 0 to not use link power save 
(default 1)\n");
 MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
 MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
 MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
+MODULE_PARM_DESC(dma64, "Set to 1 to use DMA 64 (default 0)\n");
 MODULE_PARM_DESC(debug_level, "Set debug level (0-5) (default 0)");
 MODULE_PARM_DESC(debug_mask, "Set debug mask (default 0)");
 MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 
0)\n");
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
index 55f238a2a310..c39effdc64b5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.c
@@ -583,13 +583,9 @@ void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
        u8 i = 0;
        u16 real_desc_size = 0x28;
        u16     append_early_mode_size = 0;
-#if (RTL8192EE_SEG_NUM == 0)
-       u8 segmentnum = 2;
-#elif (RTL8192EE_SEG_NUM == 1)
-       u8 segmentnum = 4;
-#elif (RTL8192EE_SEG_NUM == 2)
-       u8 segmentnum = 8;
-#endif
+       u8 segmentnum = 1 << (RTL8192EE_SEG_NUM + 1);
+       dma_addr_t desc_dma_addr;
+       bool dma64 = rtlpriv->cfg->mod_params->dma64;
 
        tx_page_size = 2;
        current_bd_desc = rtlpci->tx_ring[queue_index].cur_tx_wp;
@@ -611,6 +607,10 @@ void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
                        psblen += 1;
        }
 
+       /* tx desc addr */
+       desc_dma_addr = rtlpci->tx_ring[queue_index].dma +
+                       (current_bd_desc * TX_DESC_SIZE);
+
        /* Reset */
        SET_TX_BUFF_DESC_LEN_0(tx_bd_desc, 0);
        SET_TX_BUFF_DESC_PSB(tx_bd_desc, 0);
@@ -620,17 +620,9 @@ void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
                SET_TXBUFFER_DESC_LEN_WITH_OFFSET(tx_bd_desc, i, 0);
                SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(tx_bd_desc, i, 0);
                SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(tx_bd_desc, i, 0);
-#if (DMA_IS_64BIT == 1)
-               SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(tx_bd_desc, i, 0);
-#endif
+               SET_TXBUFFER_DESC_ADD_HIGH_WITH_OFFSET(tx_bd_desc, i, 0, dma64);
        }
-       SET_TX_BUFF_DESC_LEN_1(tx_bd_desc, 0);
-       SET_TX_BUFF_DESC_AMSDU_1(tx_bd_desc, 0);
 
-       SET_TX_BUFF_DESC_LEN_2(tx_bd_desc, 0);
-       SET_TX_BUFF_DESC_AMSDU_2(tx_bd_desc, 0);
-       SET_TX_BUFF_DESC_LEN_3(tx_bd_desc, 0);
-       SET_TX_BUFF_DESC_AMSDU_3(tx_bd_desc, 0);
        /* Clear all status */
        CLEAR_PCI_TX_DESC_CONTENT(desc, TX_DESC_SIZE);
 
@@ -645,14 +637,16 @@ void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
                SET_TX_BUFF_DESC_LEN_0(tx_bd_desc, desc_size);
        }
        SET_TX_BUFF_DESC_PSB(tx_bd_desc, psblen);
-       SET_TX_BUFF_DESC_ADDR_LOW_0(tx_bd_desc,
-                                   rtlpci->tx_ring[queue_index].dma +
-                                   (current_bd_desc * TX_DESC_SIZE));
+       SET_TX_BUFF_DESC_ADDR_LOW_0(tx_bd_desc, desc_dma_addr);
+       SET_TX_BUFF_DESC_ADDR_HIGH_0(tx_bd_desc, ((u64)desc_dma_addr >> 32),
+                                    dma64);
 
        SET_TXBUFFER_DESC_LEN_WITH_OFFSET(tx_bd_desc, 1, pkt_len);
        /* don't using extendsion mode. */
        SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(tx_bd_desc, 1, 0);
        SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(tx_bd_desc, 1, addr);
+       SET_TXBUFFER_DESC_ADD_HIGH_WITH_OFFSET(tx_bd_desc, 1,
+                                              ((u64)addr >> 32), dma64);
 
        SET_TX_DESC_PKT_SIZE(desc, (u16)(pkt_len));
        SET_TX_DESC_TX_BUFFER_SIZE(desc, (u16)(pkt_len));
@@ -921,6 +915,7 @@ void rtl92ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, 
bool istx,
        static bool over_run;
        u32 tmp = 0;
        u8 q_idx = *val;
+       bool dma64 = rtlpriv->cfg->mod_params->dma64;
 
        if (istx) {
                switch (desc_name) {
@@ -988,7 +983,12 @@ void rtl92ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, 
bool istx,
                                                       MAX_RECEIVE_BUFFER_SIZE +
                                                       RX_DESC_SIZE);
 
-                       SET_RX_BUFFER_PHYSICAL_LOW(pdesc, *(u32 *)val);
+                       SET_RX_BUFFER_PHYSICAL_LOW(pdesc, (*(dma_addr_t *)val) &
+                                                  DMA_BIT_MASK(32));
+                       SET_RX_BUFFER_PHYSICAL_HIGH(pdesc,
+                                                   ((u64)(*(dma_addr_t *)val)
+                                                   >> 32),
+                                                   dma64);
                        break;
                case HW_DESC_RXERO:
                        SET_RX_DESC_EOR(pdesc, 1);
@@ -1002,9 +1002,12 @@ void rtl92ee_set_desc(struct ieee80211_hw *hw, u8 
*pdesc, bool istx,
        }
 }
 
-u32 rtl92ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
+u64 rtl92ee_get_desc(struct ieee80211_hw *hw,
+                    u8 *pdesc, bool istx, u8 desc_name)
 {
-       u32 ret = 0;
+       struct rtl_priv *rtlpriv = rtl_priv(hw);
+       u64 ret = 0;
+       bool dma64 = rtlpriv->cfg->mod_params->dma64;
 
        if (istx) {
                switch (desc_name) {
@@ -1013,6 +1016,8 @@ u32 rtl92ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
                        break;
                case HW_DESC_TXBUFF_ADDR:
                        ret = GET_TXBUFFER_DESC_ADDR_LOW(pdesc, 1);
+                       ret |= (u64)GET_TXBUFFER_DESC_ADDR_HIGH(pdesc, 1,
+                                                               dma64) << 32;
                        break;
                default:
                        WARN_ONCE(true,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h
index b0105c529010..48c16fff20c6 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/trx.h
@@ -26,24 +26,6 @@
 #ifndef __RTL92E_TRX_H__
 #define __RTL92E_TRX_H__
 
-#if (DMA_IS_64BIT == 1)
-#if (RTL8192EE_SEG_NUM == 2)
-#define TX_BD_DESC_SIZE                                        128
-#elif (RTL8192EE_SEG_NUM == 1)
-#define TX_BD_DESC_SIZE                                        64
-#elif (RTL8192EE_SEG_NUM == 0)
-#define TX_BD_DESC_SIZE                                        32
-#endif
-#else
-#if (RTL8192EE_SEG_NUM == 2)
-#define TX_BD_DESC_SIZE                                        64
-#elif (RTL8192EE_SEG_NUM == 1)
-#define TX_BD_DESC_SIZE                                        32
-#elif (RTL8192EE_SEG_NUM == 0)
-#define TX_BD_DESC_SIZE                                        16
-#endif
-#endif
-
 #define TX_DESC_SIZE                                   64
 
 #define RX_DRV_INFO_SIZE_UNIT                          8
@@ -331,111 +313,34 @@
        SET_BITS_TO_LE_4BYTE(__pdesc+(__set*16)+8, 0, 32, __val)
 
 /* for Txfilldescroptor92ee, fill the desc content. */
-#if (DMA_IS_64BIT == 1)
-#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pdesc, __offset, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16), 0, 16, __val)
-#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pdesc, __offset, __val)  \
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16), 31, 1, __val)
-#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pdesc, __offset, __val) \
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16)+4, 0, 32, __val)
-#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pdesc, __offset, __val)\
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16)+8, 0, 32, __val)
-#define GET_TXBUFFER_DESC_ADDR_LOW(__pdesc, __offset)                  \
-       LE_BITS_TO_4BYTE(__pdesc+(__offset*16)+4, 0, 32)
-#else
-#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pdesc, __offset, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*8), 0, 16, __val)
-#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pdesc, __offset, __val)  \
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*8), 31, 1, __val)
-#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pdesc, __offset, __val)        
\
-       SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*8)+4, 0, 32, __val)
-#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pdesc, __offset, __val)
-#define GET_TXBUFFER_DESC_ADDR_LOW(__pdesc, __offset)                  \
-       LE_BITS_TO_4BYTE(__pdesc+(__offset*8)+4, 0, 32)
-#endif
+#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pdesc, __offset, __val)            
\
+       SET_BITS_TO_LE_4BYTE((__pdesc) + ((__offset) * 16), 0, 16, __val)
+#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pdesc, __offset, __val)          
\
+       SET_BITS_TO_LE_4BYTE((__pdesc) + ((__offset) * 16), 31, 1, __val)
+#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pdesc, __offset, __val)        
\
+       SET_BITS_TO_LE_4BYTE((__pdesc) + ((__offset) * 16) + 4, 0, 32, __val)
+#define SET_TXBUFFER_DESC_ADD_HIGH_WITH_OFFSET(pbd, off, val, dma64)          \
+       (dma64 ? SET_BITS_TO_LE_4BYTE((pbd) + ((off) * 16) + 8, 0, 32, val) : 0)
+#define GET_TXBUFFER_DESC_ADDR_LOW(__pdesc, __offset)                          
\
+       LE_BITS_TO_4BYTE((__pdesc) + ((__offset) * 16) + 4, 0, 32)
+#define GET_TXBUFFER_DESC_ADDR_HIGH(pbd, off, dma64)                          \
+       (dma64 ? LE_BITS_TO_4BYTE((pbd) + ((off) * 16) + 8, 0, 32) : 0)
 
 /* Dword 0 */
-#define SET_TX_BUFF_DESC_LEN_0(__pdesc, __val)         \
+#define SET_TX_BUFF_DESC_LEN_0(__pdesc, __val)                                 
\
        SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val)
-#define SET_TX_BUFF_DESC_PSB(__pdesc, __val)           \
+#define SET_TX_BUFF_DESC_PSB(__pdesc, __val)                                   
\
        SET_BITS_TO_LE_4BYTE(__pdesc, 16, 15, __val)
-#define SET_TX_BUFF_DESC_OWN(__pdesc, __val)           \
+#define SET_TX_BUFF_DESC_OWN(__pdesc, __val)                                   
\
        SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
 
 /* Dword 1 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_0(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 32, __val)
-#if (DMA_IS_64BIT == 1)
+#define SET_TX_BUFF_DESC_ADDR_LOW_0(__pdesc, __val)                            
\
+       SET_BITS_TO_LE_4BYTE((__pdesc) + 4, 0, 32, __val)
 /* Dword 2 */
-#define SET_TX_BUFF_DESC_ADDR_HIGH_0(__pdesc, __val)   \
-       SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 32, __val)
+#define SET_TX_BUFF_DESC_ADDR_HIGH_0(bdesc, val, dma64)                        
       \
+       SET_TXBUFFER_DESC_ADD_HIGH_WITH_OFFSET(bdesc, 0, val, dma64)
 /* Dword 3 / RESERVED 0 */
-/* Dword 4 */
-#define SET_TX_BUFF_DESC_LEN_1(__pdesc, __val)         \
-       SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 16, __val)
-#define SET_TX_BUFF_DESC_AMSDU_1(__pdesc, __val)       \
-       SET_BITS_TO_LE_4BYTE(__pdesc+16, 31, 1, __val)
-/* Dword 5 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_1(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 32, __val)
-/* Dword 6 */
-#define SET_TX_BUFF_DESC_ADDR_HIGH_1(__pdesc, __val)   \
-       SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val)
-/* Dword 7 / RESERVED 0 */
-/* Dword 8 */
-#define SET_TX_BUFF_DESC_LEN_2(__pdesc, __val)         \
-       SET_BITS_TO_LE_4BYTE(__pdesc+32, 0, 16, __val)
-#define SET_TX_BUFF_DESC_AMSDU_2(__pdesc, __val)       \
-       SET_BITS_TO_LE_4BYTE(__pdesc+32, 31, 1, __val)
-/* Dword 9 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_2(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+36, 0, 32, __val)
-/* Dword 10 */
-#define SET_TX_BUFF_DESC_ADDR_HIGH_2(__pdesc, __val)   \
-       SET_BITS_TO_LE_4BYTE(__pdesc+40, 0, 32, __val)
-/* Dword 11 / RESERVED 0 */
-/* Dword 12 */
-#define SET_TX_BUFF_DESC_LEN_3(__pdesc, __val)         \
-       SET_BITS_TO_LE_4BYTE(__pdesc+48, 0, 16, __val)
-#define SET_TX_BUFF_DESC_AMSDU_3(__pdesc, __val)       \
-       SET_BITS_TO_LE_4BYTE(__pdesc+48, 31, 1, __val)
-/* Dword 13 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_3(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+52, 0, 32, __val)
-/* Dword 14 */
-#define SET_TX_BUFF_DESC_ADDR_HIGH_3(__pdesc, __val)   \
-       SET_BITS_TO_LE_4BYTE(__pdesc+56, 0, 32, __val)
-/* Dword 15 / RESERVED 0 */
-#else
-#define SET_TX_BUFF_DESC_ADDR_HIGH_0(__pdesc, __val)
-/* Dword 2 */
-#define SET_TX_BUFF_DESC_LEN_1(__pdesc, __val)         \
-       SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 16, __val)
-#define SET_TX_BUFF_DESC_AMSDU_1(__pdesc, __val)       \
-       SET_BITS_TO_LE_4BYTE(__pdesc+8, 31, 1, __val)
-/* Dword 3 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_1(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 32, __val)
-#define SET_TX_BUFF_DESC_ADDR_HIGH_1(__pdesc, __val)
-/* Dword 4 */
-#define SET_TX_BUFF_DESC_LEN_2(__pdesc, __val)         \
-       SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 16, __val)
-#define SET_TX_BUFF_DESC_AMSDU_2(__pdesc, __val)       \
-       SET_BITS_TO_LE_4BYTE(__pdesc+16, 31, 1, __val)
-/* Dword 5 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_2(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 32, __val)
-#define SET_TX_BUFF_DESC_ADDR_HIGH_2(__pdesc, __val)
-/* Dword 6 */
-#define SET_TX_BUFF_DESC_LEN_3(__pdesc, __val)         \
-       SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 16, __val)
-#define SET_TX_BUFF_DESC_AMSDU_3(__pdesc, __val)       \
-       SET_BITS_TO_LE_4BYTE(__pdesc+24, 31, 1, __val)
-/* Dword 7 */
-#define SET_TX_BUFF_DESC_ADDR_LOW_3(__pdesc, __val)    \
-       SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val)
-#define SET_TX_BUFF_DESC_ADDR_HIGH_3(__pdesc, __val)
-#endif
 
 /* RX buffer  */
 
@@ -463,8 +368,8 @@
        SET_BITS_TO_LE_4BYTE(__status+4, 0, 32, __val)
 
 /* DWORD 2 */
-#define SET_RX_BUFFER_PHYSICAL_HIGH(__status, __val)   \
-       SET_BITS_TO_LE_4BYTE(__status+8, 0, 32, __val)
+#define SET_RX_BUFFER_PHYSICAL_HIGH(__rx_status_desc, __val, dma64)            
\
+       (dma64 ? SET_BITS_TO_LE_4BYTE((__rx_status_desc) + 8, 0, 32, __val) : 0)
 
 #define GET_RX_DESC_PKT_LEN(__pdesc)                   \
        LE_BITS_TO_4BYTE(__pdesc, 0, 14)
@@ -850,7 +755,8 @@ bool rtl92ee_rx_query_desc(struct ieee80211_hw *hw,
 void rtl92ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
                      u8 desc_name, u8 *val);
 
-u32 rtl92ee_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl92ee_get_desc(struct ieee80211_hw *hw,
+                    u8 *pdesc, bool istx, u8 desc_name);
 bool rtl92ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue, u16 
index);
 void rtl92ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 void rtl92ee_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c
index 2006b09ea74f..e7a37ee8ca5d 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/sw.c
@@ -238,7 +238,7 @@ static bool rtl92se_is_tx_desc_closed(struct ieee80211_hw 
*hw, u8 hw_queue,
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
        u8 *entry = (u8 *)(&ring->desc[ring->idx]);
-       u8 own = (u8)rtl92se_get_desc(entry, true, HW_DESC_OWN);
+       u8 own = (u8)rtl92se_get_desc(hw, entry, true, HW_DESC_OWN);
 
        if (own)
                return false;
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.c
index a01dbd31d1b4..e1904c39f147 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.c
@@ -610,7 +610,8 @@ void rtl92se_set_desc(struct ieee80211_hw *hw, u8 *pdesc, 
bool istx,
        }
 }
 
-u32 rtl92se_get_desc(u8 *desc, bool istx, u8 desc_name)
+u64 rtl92se_get_desc(struct ieee80211_hw *hw,
+                    u8 *desc, bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.h
index 728589138072..81a5445c04a3 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192se/trx.h
@@ -38,7 +38,8 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct 
rtl_stats *stats,
                           struct sk_buff *skb);
 void rtl92se_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
                      u8 desc_name, u8 *val);
-u32 rtl92se_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl92se_get_desc(struct ieee80211_hw *hw,
+                    u8 *desc, bool istx, u8 desc_name);
 void rtl92se_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
 
 #endif
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c
index f713c7249fed..23485602a9a1 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.c
@@ -643,7 +643,8 @@ void rtl8723e_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
        }
 }
 
-u32 rtl8723e_get_desc(u8 *pdesc, bool istx, u8 desc_name)
+u64 rtl8723e_get_desc(struct ieee80211_hw *hw,
+                     u8 *pdesc, bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
@@ -686,7 +687,7 @@ bool rtl8723e_is_tx_desc_closed(struct ieee80211_hw *hw,
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
        u8 *entry = (u8 *)(&ring->desc[ring->idx]);
-       u8 own = (u8)rtl8723e_get_desc(entry, true, HW_DESC_OWN);
+       u8 own = (u8)rtl8723e_get_desc(hw, entry, true, HW_DESC_OWN);
 
        /**
         *beacon packet will only use the first
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h
index 43d4c791d563..985ce0b77ea5 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723ae/trx.h
@@ -708,7 +708,8 @@ bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
                            u8 *pdesc, struct sk_buff *skb);
 void rtl8723e_set_desc(struct ieee80211_hw *hw,
                       u8 *pdesc, bool istx, u8 desc_name, u8 *val);
-u32 rtl8723e_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl8723e_get_desc(struct ieee80211_hw *hw,
+                     u8 *pdesc, bool istx, u8 desc_name);
 bool rtl8723e_is_tx_desc_closed(struct ieee80211_hw *hw,
                                u8 hw_queue, u16 index);
 void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
index 0b9366e7acbd..f07ab578ef88 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
@@ -60,6 +60,7 @@ static void _rtl8723be_return_beacon_queue_skb(struct 
ieee80211_hw *hw)
 
                pci_unmap_single(rtlpci->pdev,
                                 rtlpriv->cfg->ops->get_desc(
+                                hw,
                                 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
                                 skb->len, PCI_DMA_TODEVICE);
                kfree_skb(skb);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
index 0e8944119652..fd9b38aa08a1 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.c
@@ -695,7 +695,8 @@ void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
        }
 }
 
-u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name)
+u64 rtl8723be_get_desc(struct ieee80211_hw *hw,
+                      u8 *pdesc, bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
@@ -738,7 +739,7 @@ bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw,
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
        u8 *entry = (u8 *)(&ring->desc[ring->idx]);
-       u8 own = (u8)rtl8723be_get_desc(entry, true, HW_DESC_OWN);
+       u8 own = (u8)rtl8723be_get_desc(hw, entry, true, HW_DESC_OWN);
 
        /*beacon packet will only use the first
         *descriptor defautly,and the own may not
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h
index 0274659f48ed..988bf0586674 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/trx.h
@@ -624,7 +624,8 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
                             u8 *pdesc, struct sk_buff *skb);
 void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
                        bool istx, u8 desc_name, u8 *val);
-u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl8723be_get_desc(struct ieee80211_hw *hw,
+                      u8 *pdesc, bool istx, u8 desc_name);
 bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw,
                                 u8 hw_queue, u16 index);
 void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.c
index ac573d69f6d6..efa7e1262461 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723com/fw_common.c
@@ -253,7 +253,8 @@ bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw,
        spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
 
        pdesc = &ring->desc[0];
-       own = (u8) rtlpriv->cfg->ops->get_desc((u8 *)pdesc, true, HW_DESC_OWN);
+       own = (u8)rtlpriv->cfg->ops->get_desc(hw, (u8 *)pdesc, true,
+                                             HW_DESC_OWN);
 
        rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
 
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
index 8f4abb3d7669..8bad6d1fb1b7 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
@@ -57,6 +57,7 @@ static void _rtl8821ae_return_beacon_queue_skb(struct 
ieee80211_hw *hw)
 
                pci_unmap_single(rtlpci->pdev,
                                 rtlpriv->cfg->ops->get_desc(
+                                hw,
                                 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
                                 skb->len, PCI_DMA_TODEVICE);
                kfree_skb(skb);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c 
b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
index 749818929e8f..1e1bacf562f3 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.c
@@ -935,7 +935,8 @@ void rtl8821ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
        }
 }
 
-u32 rtl8821ae_get_desc(u8 *pdesc, bool istx, u8 desc_name)
+u64 rtl8821ae_get_desc(struct ieee80211_hw *hw,
+                      u8 *pdesc, bool istx, u8 desc_name)
 {
        u32 ret = 0;
 
@@ -980,7 +981,7 @@ bool rtl8821ae_is_tx_desc_closed(struct ieee80211_hw *hw,
        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
        struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
        u8 *entry = (u8 *)(&ring->desc[ring->idx]);
-       u8 own = (u8)rtl8821ae_get_desc(entry, true, HW_DESC_OWN);
+       u8 own = (u8)rtl8821ae_get_desc(hw, entry, true, HW_DESC_OWN);
 
        /**
         *beacon packet will only use the first
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h 
b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h
index 9843a616dcec..221dd2b29d3b 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/trx.h
@@ -620,7 +620,8 @@ bool rtl8821ae_rx_query_desc(struct ieee80211_hw *hw,
                             u8 *pdesc, struct sk_buff *skb);
 void rtl8821ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
                        bool istx, u8 desc_name, u8 *val);
-u32 rtl8821ae_get_desc(u8 *pdesc, bool istx, u8 desc_name);
+u64 rtl8821ae_get_desc(struct ieee80211_hw *hw,
+                      u8 *pdesc, bool istx, u8 desc_name);
 bool rtl8821ae_is_tx_desc_closed(struct ieee80211_hw *hw,
                                 u8 hw_queue, u16 index);
 void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h 
b/drivers/net/wireless/realtek/rtlwifi/wifi.h
index cdf3944715ee..90f3c019bc04 100644
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
@@ -169,7 +169,7 @@ enum rtl8192c_h2c_cmd {
 #define MAX_BASE_NUM_IN_PHY_REG_PG_24G  6
 #define MAX_BASE_NUM_IN_PHY_REG_PG_5G  5
 
-#define RTL8192EE_SEG_NUM              1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
+#define BUFDESC_SEG_NUM                1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
 
 #define DEL_SW_IDX_SZ          30
 #define BAND_NUM                       3
@@ -177,8 +177,7 @@ enum rtl8192c_h2c_cmd {
 /* For now, it's just for 8192ee
  * but not OK yet, keep it 0
  */
-#define DMA_IS_64BIT 0
-#define RTL8192EE_SEG_NUM              1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
+#define RTL8192EE_SEG_NUM              BUFDESC_SEG_NUM
 
 enum rf_tx_num {
        RF_1TX = 0,
@@ -2162,7 +2161,8 @@ struct rtl_hal_ops {
                             enum led_ctl_mode ledaction);
        void (*set_desc)(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
                         u8 desc_name, u8 *val);
-       u32 (*get_desc) (u8 *pdesc, bool istx, u8 desc_name);
+       u64 (*get_desc)(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
+                       u8 desc_name);
        bool (*is_tx_desc_closed) (struct ieee80211_hw *hw,
                                   u8 hw_queue, u16 index);
        void (*tx_polling) (struct ieee80211_hw *hw, u8 hw_queue);
@@ -2261,6 +2261,9 @@ struct rtl_mod_params {
         */
        bool msi_support;
 
+       /* default: 0 = dma 32 */
+       bool dma64;
+
        /* default 0: 1 means disable */
        bool disable_watchdog;
 
-- 
2.12.3

Reply via email to