aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2014-09-22 10:39:19 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-09-26 17:22:27 -0400
commit38506ecefab911785d5e1aa5889f6eeb462e0954 (patch)
treee41ef8e6c1283085bb7b8def0810df5fa9f98207 /drivers/net/wireless/rtlwifi
parentfd09ff958777cf583d7541f180991c0fc50bd2f7 (diff)
rtlwifi: rtl_pci: Start modification for new drivers
Future patches will move the drivers for RTL8192EE and RTL8821AE from staging to the regular wireless tree. Here, the necessary features are added to the PCI driver. Other files are touched due to changes in the various data structs. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
-rw-r--r--drivers/net/wireless/rtlwifi/core.c15
-rw-r--r--drivers/net/wireless/rtlwifi/core.h10
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c849
-rw-r--r--drivers/net/wireless/rtlwifi/pci.h56
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h9
5 files changed, 605 insertions, 334 deletions
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index 56e218e0469c..98e564d61a0e 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -129,19 +129,6 @@ found_alt:
129 memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size); 129 memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
130 rtlpriv->rtlhal.fwsize = firmware->size; 130 rtlpriv->rtlhal.fwsize = firmware->size;
131 release_firmware(firmware); 131 release_firmware(firmware);
132
133 err = ieee80211_register_hw(hw);
134 if (err) {
135 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
136 "Can't register mac80211 hw\n");
137 return;
138 } else {
139 rtlpriv->mac80211.mac80211_registered = 1;
140 }
141 set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
142
143 /*init rfkill */
144 rtl_init_rfkill(hw);
145} 132}
146EXPORT_SYMBOL(rtl_fw_cb); 133EXPORT_SYMBOL(rtl_fw_cb);
147 134
@@ -1392,7 +1379,7 @@ static void rtl_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1392 struct rtl_priv *rtlpriv = rtl_priv(hw); 1379 struct rtl_priv *rtlpriv = rtl_priv(hw);
1393 1380
1394 if (rtlpriv->intf_ops->flush) 1381 if (rtlpriv->intf_ops->flush)
1395 rtlpriv->intf_ops->flush(hw, drop); 1382 rtlpriv->intf_ops->flush(hw, queues, drop);
1396} 1383}
1397 1384
1398const struct ieee80211_ops rtl_ops = { 1385const struct ieee80211_ops rtl_ops = {
diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
index 027e75374dcc..cdd47276f694 100644
--- a/drivers/net/wireless/rtlwifi/core.h
+++ b/drivers/net/wireless/rtlwifi/core.h
@@ -2,20 +2,16 @@
2 * 2 *
3 * Copyright(c) 2009-2012 Realtek Corporation. 3 * Copyright(c) 2009-2012 Realtek Corporation.
4 * 4 *
5 * Tmis program is free software; you can redistribute it and/or modify it 5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as 6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Tmis program is distributed in the hope that it will be useful, but WITHOUT 9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with 14 * The full GNU General Public License is included in this distribution in the
15 * tmis program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * Tme full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
21 * Contact Information: 17 * Contact Information:
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 74a8ba4b8844..37a78bf01f94 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -33,6 +33,7 @@
33#include "base.h" 33#include "base.h"
34#include "ps.h" 34#include "ps.h"
35#include "efuse.h" 35#include "efuse.h"
36#include <linux/interrupt.h>
36#include <linux/export.h> 37#include <linux/export.h>
37#include <linux/kmemleak.h> 38#include <linux/kmemleak.h>
38#include <linux/module.h> 39#include <linux/module.h>
@@ -44,10 +45,10 @@ MODULE_LICENSE("GPL");
44MODULE_DESCRIPTION("PCI basic driver for rtlwifi"); 45MODULE_DESCRIPTION("PCI basic driver for rtlwifi");
45 46
46static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = { 47static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
47 PCI_VENDOR_ID_INTEL, 48 INTEL_VENDOR_ID,
48 PCI_VENDOR_ID_ATI, 49 ATI_VENDOR_ID,
49 PCI_VENDOR_ID_AMD, 50 AMD_VENDOR_ID,
50 PCI_VENDOR_ID_SI 51 SIS_VENDOR_ID
51}; 52};
52 53
53static const u8 ac_to_hwq[] = { 54static const u8 ac_to_hwq[] = {
@@ -566,27 +567,25 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
566 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio]; 567 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio];
567 568
568 while (skb_queue_len(&ring->queue)) { 569 while (skb_queue_len(&ring->queue)) {
569 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
570 struct sk_buff *skb; 570 struct sk_buff *skb;
571 struct ieee80211_tx_info *info; 571 struct ieee80211_tx_info *info;
572 __le16 fc; 572 __le16 fc;
573 u8 tid; 573 u8 tid;
574 u8 *entry;
574 575
575 u8 own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) entry, true, 576 if (rtlpriv->use_new_trx_flow)
576 HW_DESC_OWN); 577 entry = (u8 *)(&ring->buffer_desc[ring->idx]);
578 else
579 entry = (u8 *)(&ring->desc[ring->idx]);
577 580
578 /*beacon packet will only use the first 581 if (!rtlpriv->cfg->ops->is_tx_desc_closed(hw, prio, ring->idx))
579 *descriptor by defaut, and the own may not
580 *be cleared by the hardware
581 */
582 if (own)
583 return; 582 return;
584 ring->idx = (ring->idx + 1) % ring->entries; 583 ring->idx = (ring->idx + 1) % ring->entries;
585 584
586 skb = __skb_dequeue(&ring->queue); 585 skb = __skb_dequeue(&ring->queue);
587 pci_unmap_single(rtlpci->pdev, 586 pci_unmap_single(rtlpci->pdev,
588 rtlpriv->cfg->ops-> 587 rtlpriv->cfg->ops->
589 get_desc((u8 *) entry, true, 588 get_desc((u8 *)entry, true,
590 HW_DESC_TXBUFF_ADDR), 589 HW_DESC_TXBUFF_ADDR),
591 skb->len, PCI_DMA_TODEVICE); 590 skb->len, PCI_DMA_TODEVICE);
592 591
@@ -598,7 +597,7 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
598 "new ring->idx:%d, free: skb_queue_len:%d, free: seq:%x\n", 597 "new ring->idx:%d, free: skb_queue_len:%d, free: seq:%x\n",
599 ring->idx, 598 ring->idx,
600 skb_queue_len(&ring->queue), 599 skb_queue_len(&ring->queue),
601 *(u16 *) (skb->data + 22)); 600 *(u16 *)(skb->data + 22));
602 601
603 if (prio == TXCMD_QUEUE) { 602 if (prio == TXCMD_QUEUE) {
604 dev_kfree_skb(skb); 603 dev_kfree_skb(skb);
@@ -666,175 +665,276 @@ tx_status_ok:
666 } 665 }
667} 666}
668 667
669static void _rtl_receive_one(struct ieee80211_hw *hw, struct sk_buff *skb, 668static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
670 struct ieee80211_rx_status rx_status) 669 u8 *entry, int rxring_idx, int desc_idx)
671{ 670{
672 struct rtl_priv *rtlpriv = rtl_priv(hw); 671 struct rtl_priv *rtlpriv = rtl_priv(hw);
673 struct ieee80211_hdr *hdr = rtl_get_hdr(skb); 672 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
674 __le16 fc = rtl_get_fc(skb); 673 u32 bufferaddress;
675 bool unicast = false; 674 u8 tmp_one = 1;
676 struct sk_buff *uskb = NULL; 675 struct sk_buff *skb;
677 u8 *pdata; 676
678 677 skb = dev_alloc_skb(rtlpci->rxbuffersize);
679 678 if (!skb)
680 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); 679 return 0;
681 680 rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
682 if (is_broadcast_ether_addr(hdr->addr1)) { 681
683 ;/*TODO*/ 682 /* just set skb->cb to mapping addr for pci_unmap_single use */
684 } else if (is_multicast_ether_addr(hdr->addr1)) { 683 *((dma_addr_t *)skb->cb) =
685 ;/*TODO*/ 684 pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
685 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
686 bufferaddress = *((dma_addr_t *)skb->cb);
687 if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
688 return 0;
689 if (rtlpriv->use_new_trx_flow) {
690 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
691 HW_DESC_RX_PREPARE,
692 (u8 *)&bufferaddress);
686 } else { 693 } else {
687 unicast = true; 694 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
688 rtlpriv->stats.rxbytesunicast += skb->len; 695 HW_DESC_RXBUFF_ADDR,
696 (u8 *)&bufferaddress);
697 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
698 HW_DESC_RXPKT_LEN,
699 (u8 *)&rtlpci->rxbuffersize);
700 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
701 HW_DESC_RXOWN,
702 (u8 *)&tmp_one);
689 } 703 }
704 return 1;
705}
690 706
691 if (ieee80211_is_data(fc)) { 707/* inorder to receive 8K AMSDU we have set skb to
692 rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); 708 * 9100bytes in init rx ring, but if this packet is
693 709 * not a AMSDU, this large packet will be sent to
694 if (unicast) 710 * TCP/IP directly, this cause big packet ping fail
695 rtlpriv->link_info.num_rx_inperiod++; 711 * like: "ping -s 65507", so here we will realloc skb
712 * based on the true size of packet, Mac80211
713 * Probably will do it better, but does not yet.
714 *
715 * Some platform will fail when alloc skb sometimes.
716 * in this condition, we will send the old skb to
717 * mac80211 directly, this will not cause any other
718 * issues, but only this packet will be lost by TCP/IP
719 */
720static void _rtl_pci_rx_to_mac80211(struct ieee80211_hw *hw,
721 struct sk_buff *skb,
722 struct ieee80211_rx_status rx_status)
723{
724 if (unlikely(!rtl_action_proc(hw, skb, false))) {
725 dev_kfree_skb_any(skb);
726 } else {
727 struct sk_buff *uskb = NULL;
728 u8 *pdata;
729
730 uskb = dev_alloc_skb(skb->len + 128);
731 if (likely(uskb)) {
732 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status,
733 sizeof(rx_status));
734 pdata = (u8 *)skb_put(uskb, skb->len);
735 memcpy(pdata, skb->data, skb->len);
736 dev_kfree_skb_any(skb);
737 ieee80211_rx_irqsafe(hw, uskb);
738 } else {
739 ieee80211_rx_irqsafe(hw, skb);
740 }
696 } 741 }
742}
697 743
698 /* static bcn for roaming */ 744/*hsisr interrupt handler*/
699 rtl_beacon_statistic(hw, skb); 745static void _rtl_pci_hs_interrupt(struct ieee80211_hw *hw)
700 rtl_p2p_info(hw, (void *)skb->data, skb->len); 746{
701 747 struct rtl_priv *rtlpriv = rtl_priv(hw);
702 /* for sw lps */ 748 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
703 rtl_swlps_beacon(hw, (void *)skb->data, skb->len);
704 rtl_recognize_peer(hw, (void *)skb->data, skb->len);
705 if ((rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP) &&
706 (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) &&
707 (ieee80211_is_beacon(fc) || ieee80211_is_probe_resp(fc)))
708 return;
709
710 if (unlikely(!rtl_action_proc(hw, skb, false)))
711 return;
712
713 uskb = dev_alloc_skb(skb->len + 128);
714 if (!uskb)
715 return; /* exit if allocation failed */
716 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status));
717 pdata = (u8 *)skb_put(uskb, skb->len);
718 memcpy(pdata, skb->data, skb->len);
719 749
720 ieee80211_rx_irqsafe(hw, uskb); 750 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[MAC_HSISR],
751 rtl_read_byte(rtlpriv, rtlpriv->cfg->maps[MAC_HSISR]) |
752 rtlpci->sys_irq_mask);
721} 753}
722 754
723static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) 755static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
724{ 756{
725 struct rtl_priv *rtlpriv = rtl_priv(hw); 757 struct rtl_priv *rtlpriv = rtl_priv(hw);
726 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 758 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
727 int rx_queue_idx = RTL_PCI_RX_MPDU_QUEUE; 759 int rxring_idx = RTL_PCI_RX_MPDU_QUEUE;
728
729 struct ieee80211_rx_status rx_status = { 0 }; 760 struct ieee80211_rx_status rx_status = { 0 };
730 unsigned int count = rtlpci->rxringcount; 761 unsigned int count = rtlpci->rxringcount;
731 u8 own; 762 u8 own;
732 u8 tmp_one; 763 u8 tmp_one;
733 u32 bufferaddress; 764 bool unicast = false;
734 765 u8 hw_queue = 0;
766 unsigned int rx_remained_cnt;
735 struct rtl_stats stats = { 767 struct rtl_stats stats = {
736 .signal = 0, 768 .signal = 0,
737 .rate = 0, 769 .rate = 0,
738 }; 770 };
739 int index = rtlpci->rx_ring[rx_queue_idx].idx;
740 771
741 if (rtlpci->driver_is_goingto_unload)
742 return;
743 /*RX NORMAL PKT */ 772 /*RX NORMAL PKT */
744 while (count--) { 773 while (count--) {
745 /*rx descriptor */ 774 struct ieee80211_hdr *hdr;
746 struct rtl_rx_desc *pdesc = &rtlpci->rx_ring[rx_queue_idx].desc[ 775 __le16 fc;
747 index]; 776 u16 len;
777 /*rx buffer descriptor */
778 struct rtl_rx_buffer_desc *buffer_desc = NULL;
779 /*if use new trx flow, it means wifi info */
780 struct rtl_rx_desc *pdesc = NULL;
748 /*rx pkt */ 781 /*rx pkt */
749 struct sk_buff *skb = rtlpci->rx_ring[rx_queue_idx].rx_buf[ 782 struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[
750 index]; 783 rtlpci->rx_ring[rxring_idx].idx];
751 struct sk_buff *new_skb = NULL; 784
752 785 if (rtlpriv->use_new_trx_flow) {
753 own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) pdesc, 786 rx_remained_cnt =
754 false, HW_DESC_OWN); 787 rtlpriv->cfg->ops->rx_desc_buff_remained_cnt(hw,
755 788 hw_queue);
756 /*wait data to be filled by hardware */ 789 if (rx_remained_cnt < 1)
757 if (own) 790 return;
758 break; 791
792 } else { /* rx descriptor */
793 pdesc = &rtlpci->rx_ring[rxring_idx].desc[
794 rtlpci->rx_ring[rxring_idx].idx];
795
796 own = (u8)rtlpriv->cfg->ops->get_desc((u8 *)pdesc,
797 false,
798 HW_DESC_OWN);
799 if (own) /* wait data to be filled by hardware */
800 return;
801 }
759 802
803 /* Reaching this point means: data is filled already
804 * AAAAAAttention !!!
805 * We can NOT access 'skb' before 'pci_unmap_single'
806 */
807 pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
808 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
809
810 if (rtlpriv->use_new_trx_flow) {
811 buffer_desc =
812 &rtlpci->rx_ring[rxring_idx].buffer_desc
813 [rtlpci->rx_ring[rxring_idx].idx];
814 /*means rx wifi info*/
815 pdesc = (struct rtl_rx_desc *)skb->data;
816 }
817 memset(&rx_status , 0 , sizeof(rx_status));
760 rtlpriv->cfg->ops->query_rx_desc(hw, &stats, 818 rtlpriv->cfg->ops->query_rx_desc(hw, &stats,
761 &rx_status, 819 &rx_status, (u8 *)pdesc, skb);
762 (u8 *) pdesc, skb);
763 820
764 if (stats.crc || stats.hwerror) 821 if (rtlpriv->use_new_trx_flow)
765 goto done; 822 rtlpriv->cfg->ops->rx_check_dma_ok(hw,
823 (u8 *)buffer_desc,
824 hw_queue);
766 825
767 new_skb = dev_alloc_skb(rtlpci->rxbuffersize); 826 len = rtlpriv->cfg->ops->get_desc((u8 *)pdesc, false,
768 if (unlikely(!new_skb)) { 827 HW_DESC_RXPKT_LEN);
769 RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV), DBG_DMESG,
770 "can't alloc skb for rx\n");
771 goto done;
772 }
773 kmemleak_not_leak(new_skb);
774 828
775 pci_unmap_single(rtlpci->pdev, 829 if (skb->end - skb->tail > len) {
776 *((dma_addr_t *) skb->cb), 830 skb_put(skb, len);
777 rtlpci->rxbuffersize, 831 if (rtlpriv->use_new_trx_flow)
778 PCI_DMA_FROMDEVICE); 832 skb_reserve(skb, stats.rx_drvinfo_size +
833 stats.rx_bufshift + 24);
834 else
835 skb_reserve(skb, stats.rx_drvinfo_size +
836 stats.rx_bufshift);
779 837
780 skb_put(skb, rtlpriv->cfg->ops->get_desc((u8 *) pdesc, false, 838 } else {
781 HW_DESC_RXPKT_LEN)); 839 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
782 skb_reserve(skb, stats.rx_drvinfo_size + stats.rx_bufshift); 840 "skb->end - skb->tail = %d, len is %d\n",
841 skb->end - skb->tail, len);
842 break;
843 }
844 /* handle command packet here */
845 if (rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) {
846 dev_kfree_skb_any(skb);
847 goto end;
848 }
783 849
784 /* 850 /*
785 * NOTICE This can not be use for mac80211, 851 * NOTICE This can not be use for mac80211,
786 * this is done in mac80211 code, 852 * this is done in mac80211 code,
787 * if you done here sec DHCP will fail 853 * if done here sec DHCP will fail
788 * skb_trim(skb, skb->len - 4); 854 * skb_trim(skb, skb->len - 4);
789 */ 855 */
790 856
791 _rtl_receive_one(hw, skb, rx_status); 857 hdr = rtl_get_hdr(skb);
858 fc = rtl_get_fc(skb);
859
860 if (!stats.crc && !stats.hwerror) {
861 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status,
862 sizeof(rx_status));
863
864 if (is_broadcast_ether_addr(hdr->addr1)) {
865 ;/*TODO*/
866 } else if (is_multicast_ether_addr(hdr->addr1)) {
867 ;/*TODO*/
868 } else {
869 unicast = true;
870 rtlpriv->stats.rxbytesunicast += skb->len;
871 }
872 rtl_is_special_data(hw, skb, false);
792 873
874 if (ieee80211_is_data(fc)) {
875 rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX);
876 if (unicast)
877 rtlpriv->link_info.num_rx_inperiod++;
878 }
879 /* static bcn for roaming */
880 rtl_beacon_statistic(hw, skb);
881 rtl_p2p_info(hw, (void *)skb->data, skb->len);
882 /* for sw lps */
883 rtl_swlps_beacon(hw, (void *)skb->data, skb->len);
884 rtl_recognize_peer(hw, (void *)skb->data, skb->len);
885 if ((rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP) &&
886 (rtlpriv->rtlhal.current_bandtype ==
887 BAND_ON_2_4G) &&
888 (ieee80211_is_beacon(fc) ||
889 ieee80211_is_probe_resp(fc))) {
890 dev_kfree_skb_any(skb);
891 } else {
892 _rtl_pci_rx_to_mac80211(hw, skb, rx_status);
893 }
894 } else {
895 dev_kfree_skb_any(skb);
896 }
897 if (rtlpriv->use_new_trx_flow) {
898 rtlpci->rx_ring[hw_queue].next_rx_rp += 1;
899 rtlpci->rx_ring[hw_queue].next_rx_rp %=
900 RTL_PCI_MAX_RX_COUNT;
901
902 rx_remained_cnt--;
903 rtl_write_word(rtlpriv, 0x3B4,
904 rtlpci->rx_ring[hw_queue].next_rx_rp);
905 }
793 if (((rtlpriv->link_info.num_rx_inperiod + 906 if (((rtlpriv->link_info.num_rx_inperiod +
794 rtlpriv->link_info.num_tx_inperiod) > 8) || 907 rtlpriv->link_info.num_tx_inperiod) > 8) ||
795 (rtlpriv->link_info.num_rx_inperiod > 2)) { 908 (rtlpriv->link_info.num_rx_inperiod > 2)) {
796 rtlpriv->enter_ps = false; 909 rtlpriv->enter_ps = false;
797 schedule_work(&rtlpriv->works.lps_change_work); 910 schedule_work(&rtlpriv->works.lps_change_work);
798 } 911 }
912end:
913 if (rtlpriv->use_new_trx_flow) {
914 _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc,
915 rxring_idx,
916 rtlpci->rx_ring[rxring_idx].idx);
917 } else {
918 _rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx,
919 rtlpci->rx_ring[rxring_idx].idx);
799 920
800 dev_kfree_skb_any(skb); 921 if (rtlpci->rx_ring[rxring_idx].idx ==
801 skb = new_skb; 922 rtlpci->rxringcount - 1)
802 923 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,
803 rtlpci->rx_ring[rx_queue_idx].rx_buf[index] = skb; 924 false,
804 *((dma_addr_t *) skb->cb) = 925 HW_DESC_RXERO,
805 pci_map_single(rtlpci->pdev, skb_tail_pointer(skb), 926 (u8 *)&tmp_one);
806 rtlpci->rxbuffersize, 927 }
807 PCI_DMA_FROMDEVICE); 928 rtlpci->rx_ring[rxring_idx].idx =
808 929 (rtlpci->rx_ring[rxring_idx].idx + 1) %
809done: 930 rtlpci->rxringcount;
810 bufferaddress = (*((dma_addr_t *)skb->cb));
811 if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
812 return;
813 tmp_one = 1;
814 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false,
815 HW_DESC_RXBUFF_ADDR,
816 (u8 *)&bufferaddress);
817 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false,
818 HW_DESC_RXPKT_LEN,
819 (u8 *)&rtlpci->rxbuffersize);
820
821 if (index == rtlpci->rxringcount - 1)
822 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false,
823 HW_DESC_RXERO,
824 &tmp_one);
825
826 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false, HW_DESC_RXOWN,
827 &tmp_one);
828
829 index = (index + 1) % rtlpci->rxringcount;
830 } 931 }
831
832 rtlpci->rx_ring[rx_queue_idx].idx = index;
833} 932}
834 933
835static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id) 934static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
836{ 935{
837 struct ieee80211_hw *hw = dev_id; 936 struct ieee80211_hw *hw = dev_id;
937 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
838 struct rtl_priv *rtlpriv = rtl_priv(hw); 938 struct rtl_priv *rtlpriv = rtl_priv(hw);
839 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 939 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
840 unsigned long flags; 940 unsigned long flags;
@@ -842,7 +942,11 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
842 u32 intb = 0; 942 u32 intb = 0;
843 irqreturn_t ret = IRQ_HANDLED; 943 irqreturn_t ret = IRQ_HANDLED;
844 944
845 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 945 if (rtlpci->irq_enabled == 0)
946 return ret;
947
948 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock , flags);
949 rtlpriv->cfg->ops->disable_interrupt(hw);
846 950
847 /*read ISR: 4/8bytes */ 951 /*read ISR: 4/8bytes */
848 rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb); 952 rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb);
@@ -874,8 +978,8 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
874 tasklet_schedule(&rtlpriv->works.irq_prepare_bcn_tasklet); 978 tasklet_schedule(&rtlpriv->works.irq_prepare_bcn_tasklet);
875 } 979 }
876 980
877 /*<3> Tx related */ 981 /*<2> Tx related */
878 if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_TXFOVW])) 982 if (unlikely(intb & rtlpriv->cfg->maps[RTL_IMR_TXFOVW]))
879 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "IMR_TXFOVW!\n"); 983 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "IMR_TXFOVW!\n");
880 984
881 if (inta & rtlpriv->cfg->maps[RTL_IMR_MGNTDOK]) { 985 if (inta & rtlpriv->cfg->maps[RTL_IMR_MGNTDOK]) {
@@ -932,7 +1036,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
932 } 1036 }
933 } 1037 }
934 1038
935 /*<2> Rx related */ 1039 /*<3> Rx related */
936 if (inta & rtlpriv->cfg->maps[RTL_IMR_ROK]) { 1040 if (inta & rtlpriv->cfg->maps[RTL_IMR_ROK]) {
937 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "Rx ok interrupt!\n"); 1041 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "Rx ok interrupt!\n");
938 _rtl_pci_rx_interrupt(hw); 1042 _rtl_pci_rx_interrupt(hw);
@@ -944,12 +1048,12 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
944 _rtl_pci_rx_interrupt(hw); 1048 _rtl_pci_rx_interrupt(hw);
945 } 1049 }
946 1050
947 if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_RXFOVW])) { 1051 if (unlikely(intb & rtlpriv->cfg->maps[RTL_IMR_RXFOVW])) {
948 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "rx overflow !\n"); 1052 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "rx overflow !\n");
949 _rtl_pci_rx_interrupt(hw); 1053 _rtl_pci_rx_interrupt(hw);
950 } 1054 }
951 1055
952 /*fw related*/ 1056 /*<4> fw related*/
953 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) { 1057 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) {
954 if (inta & rtlpriv->cfg->maps[RTL_IMR_C2HCMD]) { 1058 if (inta & rtlpriv->cfg->maps[RTL_IMR_C2HCMD]) {
955 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, 1059 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
@@ -959,10 +1063,26 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
959 } 1063 }
960 } 1064 }
961 1065
1066 /*<5> hsisr related*/
1067 /* Only 8188EE & 8723BE Supported.
1068 * If Other ICs Come in, System will corrupt,
1069 * because maps[RTL_IMR_HSISR_IND] & maps[MAC_HSISR]
1070 * are not initialized
1071 */
1072 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE ||
1073 rtlhal->hw_type == HARDWARE_TYPE_RTL8723BE) {
1074 if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_HSISR_IND])) {
1075 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
1076 "hsisr interrupt!\n");
1077 _rtl_pci_hs_interrupt(hw);
1078 }
1079 }
1080
962 if (rtlpriv->rtlhal.earlymode_enable) 1081 if (rtlpriv->rtlhal.earlymode_enable)
963 tasklet_schedule(&rtlpriv->works.irq_tasklet); 1082 tasklet_schedule(&rtlpriv->works.irq_tasklet);
964 1083
965done: 1084done:
1085 rtlpriv->cfg->ops->enable_interrupt(hw);
966 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 1086 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
967 return ret; 1087 return ret;
968} 1088}
@@ -990,13 +1110,8 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
990 memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); 1110 memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
991 ring = &rtlpci->tx_ring[BEACON_QUEUE]; 1111 ring = &rtlpci->tx_ring[BEACON_QUEUE];
992 pskb = __skb_dequeue(&ring->queue); 1112 pskb = __skb_dequeue(&ring->queue);
993 if (pskb) { 1113 if (pskb)
994 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
995 pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc(
996 (u8 *) entry, true, HW_DESC_TXBUFF_ADDR),
997 pskb->len, PCI_DMA_TODEVICE);
998 kfree_skb(pskb); 1114 kfree_skb(pskb);
999 }
1000 1115
1001 /*NB: the beacon data buffer must be 32-bit aligned. */ 1116 /*NB: the beacon data buffer must be 32-bit aligned. */
1002 pskb = ieee80211_beacon_get(hw, mac->vif); 1117 pskb = ieee80211_beacon_get(hw, mac->vif);
@@ -1005,7 +1120,10 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
1005 hdr = rtl_get_hdr(pskb); 1120 hdr = rtl_get_hdr(pskb);
1006 info = IEEE80211_SKB_CB(pskb); 1121 info = IEEE80211_SKB_CB(pskb);
1007 pdesc = &ring->desc[0]; 1122 pdesc = &ring->desc[0];
1008 rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *) pdesc, 1123 if (rtlpriv->use_new_trx_flow)
1124 pbuffer_desc = &ring->buffer_desc[0];
1125
1126 rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *)pdesc,
1009 (u8 *)pbuffer_desc, info, NULL, pskb, 1127 (u8 *)pbuffer_desc, info, NULL, pskb,
1010 BEACON_QUEUE, &tcb_desc); 1128 BEACON_QUEUE, &tcb_desc);
1011 1129
@@ -1020,10 +1138,18 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
1020static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) 1138static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
1021{ 1139{
1022 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1140 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1141 struct rtl_priv *rtlpriv = rtl_priv(hw);
1142 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1023 u8 i; 1143 u8 i;
1144 u16 desc_num;
1145
1146 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192EE)
1147 desc_num = TX_DESC_NUM_92E;
1148 else
1149 desc_num = RT_TXDESC_NUM;
1024 1150
1025 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) 1151 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
1026 rtlpci->txringcount[i] = RT_TXDESC_NUM; 1152 rtlpci->txringcount[i] = desc_num;
1027 1153
1028 /* 1154 /*
1029 *we just alloc 2 desc for beacon queue, 1155 *we just alloc 2 desc for beacon queue,
@@ -1031,12 +1157,12 @@ static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
1031 */ 1157 */
1032 rtlpci->txringcount[BEACON_QUEUE] = 2; 1158 rtlpci->txringcount[BEACON_QUEUE] = 2;
1033 1159
1034 /* 1160 /*BE queue need more descriptor for performance
1035 *BE queue need more descriptor for performance
1036 *consideration or, No more tx desc will happen, 1161 *consideration or, No more tx desc will happen,
1037 *and may cause mac80211 mem leakage. 1162 *and may cause mac80211 mem leakage.
1038 */ 1163 */
1039 rtlpci->txringcount[BE_QUEUE] = RT_TXDESC_NUM_BE_QUEUE; 1164 if (!rtl_priv(hw)->use_new_trx_flow)
1165 rtlpci->txringcount[BE_QUEUE] = RT_TXDESC_NUM_BE_QUEUE;
1040 1166
1041 rtlpci->rxbuffersize = 9100; /*2048/1024; */ 1167 rtlpci->rxbuffersize = 9100; /*2048/1024; */
1042 rtlpci->rxringcount = RTL_PCI_MAX_RX_COUNT; /*64; */ 1168 rtlpci->rxringcount = RTL_PCI_MAX_RX_COUNT; /*64; */
@@ -1087,113 +1213,124 @@ static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
1087{ 1213{
1088 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1214 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1089 struct rtl_priv *rtlpriv = rtl_priv(hw); 1215 struct rtl_priv *rtlpriv = rtl_priv(hw);
1090 struct rtl_tx_desc *ring; 1216 struct rtl_tx_buffer_desc *buffer_desc;
1091 dma_addr_t dma; 1217 struct rtl_tx_desc *desc;
1218 dma_addr_t buffer_desc_dma, desc_dma;
1092 u32 nextdescaddress; 1219 u32 nextdescaddress;
1093 int i; 1220 int i;
1094 1221
1095 ring = pci_zalloc_consistent(rtlpci->pdev, sizeof(*ring) * entries, 1222 /* alloc tx buffer desc for new trx flow*/
1096 &dma); 1223 if (rtlpriv->use_new_trx_flow) {
1097 if (!ring || (unsigned long)ring & 0xFF) { 1224 buffer_desc =
1225 pci_zalloc_consistent(rtlpci->pdev,
1226 sizeof(*buffer_desc) * entries,
1227 &buffer_desc_dma);
1228
1229 if (!buffer_desc || (unsigned long)buffer_desc & 0xFF) {
1230 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1231 "Cannot allocate TX ring (prio = %d)\n",
1232 prio);
1233 return -ENOMEM;
1234 }
1235
1236 rtlpci->tx_ring[prio].buffer_desc = buffer_desc;
1237 rtlpci->tx_ring[prio].buffer_desc_dma = buffer_desc_dma;
1238
1239 rtlpci->tx_ring[prio].cur_tx_rp = 0;
1240 rtlpci->tx_ring[prio].cur_tx_wp = 0;
1241 rtlpci->tx_ring[prio].avl_desc = entries;
1242 }
1243
1244 /* alloc dma for this ring */
1245 desc = pci_zalloc_consistent(rtlpci->pdev,
1246 sizeof(*desc) * entries, &desc_dma);
1247
1248 if (!desc || (unsigned long)desc & 0xFF) {
1098 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1249 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1099 "Cannot allocate TX ring (prio = %d)\n", prio); 1250 "Cannot allocate TX ring (prio = %d)\n", prio);
1100 return -ENOMEM; 1251 return -ENOMEM;
1101 } 1252 }
1102 1253
1103 rtlpci->tx_ring[prio].desc = ring; 1254 rtlpci->tx_ring[prio].desc = desc;
1104 rtlpci->tx_ring[prio].dma = dma; 1255 rtlpci->tx_ring[prio].dma = desc_dma;
1256
1105 rtlpci->tx_ring[prio].idx = 0; 1257 rtlpci->tx_ring[prio].idx = 0;
1106 rtlpci->tx_ring[prio].entries = entries; 1258 rtlpci->tx_ring[prio].entries = entries;
1107 skb_queue_head_init(&rtlpci->tx_ring[prio].queue); 1259 skb_queue_head_init(&rtlpci->tx_ring[prio].queue);
1108 1260
1109 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "queue:%d, ring_addr:%p\n", 1261 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "queue:%d, ring_addr:%p\n",
1110 prio, ring); 1262 prio, desc);
1111 1263
1112 for (i = 0; i < entries; i++) { 1264 /* init every desc in this ring */
1113 nextdescaddress = (u32) dma + 1265 if (!rtlpriv->use_new_trx_flow) {
1114 ((i + 1) % entries) * 1266 for (i = 0; i < entries; i++) {
1115 sizeof(*ring); 1267 nextdescaddress = (u32)desc_dma +
1116 1268 ((i + 1) % entries) *
1117 rtlpriv->cfg->ops->set_desc(hw, (u8 *)&(ring[i]), 1269 sizeof(*desc);
1118 true, HW_DESC_TX_NEXTDESC_ADDR, 1270
1119 (u8 *)&nextdescaddress); 1271 rtlpriv->cfg->ops->set_desc(hw, (u8 *)&desc[i],
1272 true,
1273 HW_DESC_TX_NEXTDESC_ADDR,
1274 (u8 *)&nextdescaddress);
1275 }
1120 } 1276 }
1121
1122 return 0; 1277 return 0;
1123} 1278}
1124 1279
1125static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw) 1280static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
1126{ 1281{
1127 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1282 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1128 struct rtl_priv *rtlpriv = rtl_priv(hw); 1283 struct rtl_priv *rtlpriv = rtl_priv(hw);
1129 struct rtl_rx_desc *entry = NULL; 1284 int i;
1130 int i, rx_queue_idx;
1131 u8 tmp_one = 1;
1132 1285
1133 /* 1286 if (rtlpriv->use_new_trx_flow) {
1134 *rx_queue_idx 0:RX_MPDU_QUEUE 1287 struct rtl_rx_buffer_desc *entry = NULL;
1135 *rx_queue_idx 1:RX_CMD_QUEUE 1288 /* alloc dma for this ring */
1136 */ 1289 rtlpci->rx_ring[rxring_idx].buffer_desc =
1137 for (rx_queue_idx = 0; rx_queue_idx < RTL_PCI_MAX_RX_QUEUE; 1290 pci_zalloc_consistent(rtlpci->pdev,
1138 rx_queue_idx++) { 1291 sizeof(*rtlpci->rx_ring[rxring_idx].
1139 rtlpci->rx_ring[rx_queue_idx].desc = 1292 buffer_desc) *
1140 pci_zalloc_consistent(rtlpci->pdev, 1293 rtlpci->rxringcount,
1141 sizeof(*rtlpci->rx_ring[rx_queue_idx].desc) * rtlpci->rxringcount, 1294 &rtlpci->rx_ring[rxring_idx].dma);
1142 &rtlpci->rx_ring[rx_queue_idx].dma); 1295 if (!rtlpci->rx_ring[rxring_idx].buffer_desc ||
1143 1296 (ulong)rtlpci->rx_ring[rxring_idx].buffer_desc & 0xFF) {
1144 if (!rtlpci->rx_ring[rx_queue_idx].desc ||
1145 (unsigned long)rtlpci->rx_ring[rx_queue_idx].desc & 0xFF) {
1146 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1297 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1147 "Cannot allocate RX ring\n"); 1298 "Cannot allocate RX ring\n");
1148 return -ENOMEM; 1299 return -ENOMEM;
1149 } 1300 }
1150 1301
1151 rtlpci->rx_ring[rx_queue_idx].idx = 0; 1302 /* init every desc in this ring */
1303 rtlpci->rx_ring[rxring_idx].idx = 0;
1304 for (i = 0; i < rtlpci->rxringcount; i++) {
1305 entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i];
1306 if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
1307 rxring_idx, i))
1308 return -ENOMEM;
1309 }
1310 } else {
1311 struct rtl_rx_desc *entry = NULL;
1312 u8 tmp_one = 1;
1313 /* alloc dma for this ring */
1314 rtlpci->rx_ring[rxring_idx].desc =
1315 pci_zalloc_consistent(rtlpci->pdev,
1316 sizeof(*rtlpci->rx_ring[rxring_idx].
1317 desc) * rtlpci->rxringcount,
1318 &rtlpci->rx_ring[rxring_idx].dma);
1319 if (!rtlpci->rx_ring[rxring_idx].desc ||
1320 (unsigned long)rtlpci->rx_ring[rxring_idx].desc & 0xFF) {
1321 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1322 "Cannot allocate RX ring\n");
1323 return -ENOMEM;
1324 }
1152 1325
1153 /* If amsdu_8k is disabled, set buffersize to 4096. This 1326 /* init every desc in this ring */
1154 * change will reduce memory fragmentation. 1327 rtlpci->rx_ring[rxring_idx].idx = 0;
1155 */
1156 if (rtlpci->rxbuffersize > 4096 &&
1157 rtlpriv->rtlhal.disable_amsdu_8k)
1158 rtlpci->rxbuffersize = 4096;
1159 1328
1160 for (i = 0; i < rtlpci->rxringcount; i++) { 1329 for (i = 0; i < rtlpci->rxringcount; i++) {
1161 struct sk_buff *skb = 1330 entry = &rtlpci->rx_ring[rxring_idx].desc[i];
1162 dev_alloc_skb(rtlpci->rxbuffersize); 1331 if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
1163 u32 bufferaddress; 1332 rxring_idx, i))
1164 if (!skb) 1333 return -ENOMEM;
1165 return 0;
1166 kmemleak_not_leak(skb);
1167 entry = &rtlpci->rx_ring[rx_queue_idx].desc[i];
1168
1169 /*skb->dev = dev; */
1170
1171 rtlpci->rx_ring[rx_queue_idx].rx_buf[i] = skb;
1172
1173 /*
1174 *just set skb->cb to mapping addr
1175 *for pci_unmap_single use
1176 */
1177 *((dma_addr_t *) skb->cb) =
1178 pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
1179 rtlpci->rxbuffersize,
1180 PCI_DMA_FROMDEVICE);
1181
1182 bufferaddress = (*((dma_addr_t *)skb->cb));
1183 if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) {
1184 dev_kfree_skb_any(skb);
1185 return 1;
1186 }
1187 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1188 HW_DESC_RXBUFF_ADDR,
1189 (u8 *)&bufferaddress);
1190 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1191 HW_DESC_RXPKT_LEN,
1192 (u8 *)&rtlpci->
1193 rxbuffersize);
1194 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1195 HW_DESC_RXOWN,
1196 &tmp_one);
1197 } 1334 }
1198 1335
1199 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, 1336 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
@@ -1209,56 +1346,70 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
1209 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1346 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1210 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio]; 1347 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio];
1211 1348
1349 /* free every desc in this ring */
1212 while (skb_queue_len(&ring->queue)) { 1350 while (skb_queue_len(&ring->queue)) {
1213 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; 1351 u8 *entry;
1214 struct sk_buff *skb = __skb_dequeue(&ring->queue); 1352 struct sk_buff *skb = __skb_dequeue(&ring->queue);
1215 1353
1354 if (rtlpriv->use_new_trx_flow)
1355 entry = (u8 *)(&ring->buffer_desc[ring->idx]);
1356 else
1357 entry = (u8 *)(&ring->desc[ring->idx]);
1358
1216 pci_unmap_single(rtlpci->pdev, 1359 pci_unmap_single(rtlpci->pdev,
1217 rtlpriv->cfg-> 1360 rtlpriv->cfg->
1218 ops->get_desc((u8 *) entry, true, 1361 ops->get_desc((u8 *)entry, true,
1219 HW_DESC_TXBUFF_ADDR), 1362 HW_DESC_TXBUFF_ADDR),
1220 skb->len, PCI_DMA_TODEVICE); 1363 skb->len, PCI_DMA_TODEVICE);
1221 kfree_skb(skb); 1364 kfree_skb(skb);
1222 ring->idx = (ring->idx + 1) % ring->entries; 1365 ring->idx = (ring->idx + 1) % ring->entries;
1223 } 1366 }
1224 1367
1225 if (ring->desc) { 1368 /* free dma of this ring */
1369 pci_free_consistent(rtlpci->pdev,
1370 sizeof(*ring->desc) * ring->entries,
1371 ring->desc, ring->dma);
1372 ring->desc = NULL;
1373 if (rtlpriv->use_new_trx_flow) {
1226 pci_free_consistent(rtlpci->pdev, 1374 pci_free_consistent(rtlpci->pdev,
1227 sizeof(*ring->desc) * ring->entries, 1375 sizeof(*ring->desc) * ring->entries,
1228 ring->desc, ring->dma); 1376 ring->buffer_desc, ring->buffer_desc_dma);
1229 ring->desc = NULL; 1377 ring->desc = NULL;
1230 } 1378 }
1231} 1379}
1232 1380
1233static void _rtl_pci_free_rx_ring(struct rtl_pci *rtlpci) 1381static void _rtl_pci_free_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
1234{ 1382{
1235 int i, rx_queue_idx; 1383 struct rtl_priv *rtlpriv = rtl_priv(hw);
1384 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1385 int i;
1236 1386
1237 /*rx_queue_idx 0:RX_MPDU_QUEUE */ 1387 /* free every desc in this ring */
1238 /*rx_queue_idx 1:RX_CMD_QUEUE */ 1388 for (i = 0; i < rtlpci->rxringcount; i++) {
1239 for (rx_queue_idx = 0; rx_queue_idx < RTL_PCI_MAX_RX_QUEUE; 1389 struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[i];
1240 rx_queue_idx++) {
1241 for (i = 0; i < rtlpci->rxringcount; i++) {
1242 struct sk_buff *skb =
1243 rtlpci->rx_ring[rx_queue_idx].rx_buf[i];
1244 if (!skb)
1245 continue;
1246
1247 pci_unmap_single(rtlpci->pdev,
1248 *((dma_addr_t *) skb->cb),
1249 rtlpci->rxbuffersize,
1250 PCI_DMA_FROMDEVICE);
1251 kfree_skb(skb);
1252 }
1253 1390
1254 if (rtlpci->rx_ring[rx_queue_idx].desc) { 1391 if (!skb)
1255 pci_free_consistent(rtlpci->pdev, 1392 continue;
1256 sizeof(*rtlpci->rx_ring[rx_queue_idx]. 1393 pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
1257 desc) * rtlpci->rxringcount, 1394 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
1258 rtlpci->rx_ring[rx_queue_idx].desc, 1395 kfree_skb(skb);
1259 rtlpci->rx_ring[rx_queue_idx].dma); 1396 }
1260 rtlpci->rx_ring[rx_queue_idx].desc = NULL; 1397
1261 } 1398 /* free dma of this ring */
1399 if (rtlpriv->use_new_trx_flow) {
1400 pci_free_consistent(rtlpci->pdev,
1401 sizeof(*rtlpci->rx_ring[rxring_idx].
1402 buffer_desc) * rtlpci->rxringcount,
1403 rtlpci->rx_ring[rxring_idx].buffer_desc,
1404 rtlpci->rx_ring[rxring_idx].dma);
1405 rtlpci->rx_ring[rxring_idx].buffer_desc = NULL;
1406 } else {
1407 pci_free_consistent(rtlpci->pdev,
1408 sizeof(*rtlpci->rx_ring[rxring_idx].desc) *
1409 rtlpci->rxringcount,
1410 rtlpci->rx_ring[rxring_idx].desc,
1411 rtlpci->rx_ring[rxring_idx].dma);
1412 rtlpci->rx_ring[rxring_idx].desc = NULL;
1262 } 1413 }
1263} 1414}
1264 1415
@@ -1266,11 +1417,16 @@ static int _rtl_pci_init_trx_ring(struct ieee80211_hw *hw)
1266{ 1417{
1267 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1418 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1268 int ret; 1419 int ret;
1269 int i; 1420 int i, rxring_idx;
1270 1421
1271 ret = _rtl_pci_init_rx_ring(hw); 1422 /* rxring_idx 0:RX_MPDU_QUEUE
1272 if (ret) 1423 * rxring_idx 1:RX_CMD_QUEUE
1273 return ret; 1424 */
1425 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++) {
1426 ret = _rtl_pci_init_rx_ring(hw, rxring_idx);
1427 if (ret)
1428 return ret;
1429 }
1274 1430
1275 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) { 1431 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) {
1276 ret = _rtl_pci_init_tx_ring(hw, i, 1432 ret = _rtl_pci_init_tx_ring(hw, i,
@@ -1282,10 +1438,12 @@ static int _rtl_pci_init_trx_ring(struct ieee80211_hw *hw)
1282 return 0; 1438 return 0;
1283 1439
1284err_free_rings: 1440err_free_rings:
1285 _rtl_pci_free_rx_ring(rtlpci); 1441 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++)
1442 _rtl_pci_free_rx_ring(hw, rxring_idx);
1286 1443
1287 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) 1444 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
1288 if (rtlpci->tx_ring[i].desc) 1445 if (rtlpci->tx_ring[i].desc ||
1446 rtlpci->tx_ring[i].buffer_desc)
1289 _rtl_pci_free_tx_ring(hw, i); 1447 _rtl_pci_free_tx_ring(hw, i);
1290 1448
1291 return 1; 1449 return 1;
@@ -1293,11 +1451,11 @@ err_free_rings:
1293 1451
1294static int _rtl_pci_deinit_trx_ring(struct ieee80211_hw *hw) 1452static int _rtl_pci_deinit_trx_ring(struct ieee80211_hw *hw)
1295{ 1453{
1296 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1454 u32 i, rxring_idx;
1297 u32 i;
1298 1455
1299 /*free rx rings */ 1456 /*free rx rings */
1300 _rtl_pci_free_rx_ring(rtlpci); 1457 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++)
1458 _rtl_pci_free_rx_ring(hw, rxring_idx);
1301 1459
1302 /*free tx rings */ 1460 /*free tx rings */
1303 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) 1461 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
@@ -1310,48 +1468,76 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
1310{ 1468{
1311 struct rtl_priv *rtlpriv = rtl_priv(hw); 1469 struct rtl_priv *rtlpriv = rtl_priv(hw);
1312 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1470 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1313 int i, rx_queue_idx; 1471 int i, rxring_idx;
1314 unsigned long flags; 1472 unsigned long flags;
1315 u8 tmp_one = 1; 1473 u8 tmp_one = 1;
1316 1474 u32 bufferaddress;
1317 /*rx_queue_idx 0:RX_MPDU_QUEUE */ 1475 /* rxring_idx 0:RX_MPDU_QUEUE */
1318 /*rx_queue_idx 1:RX_CMD_QUEUE */ 1476 /* rxring_idx 1:RX_CMD_QUEUE */
1319 for (rx_queue_idx = 0; rx_queue_idx < RTL_PCI_MAX_RX_QUEUE; 1477 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++) {
1320 rx_queue_idx++) { 1478 /* force the rx_ring[RX_MPDU_QUEUE/
1321 /* 1479 * RX_CMD_QUEUE].idx to the first one
1322 *force the rx_ring[RX_MPDU_QUEUE/ 1480 *new trx flow, do nothing
1323 *RX_CMD_QUEUE].idx to the first one 1481 */
1324 */ 1482 if (!rtlpriv->use_new_trx_flow &&
1325 if (rtlpci->rx_ring[rx_queue_idx].desc) { 1483 rtlpci->rx_ring[rxring_idx].desc) {
1326 struct rtl_rx_desc *entry = NULL; 1484 struct rtl_rx_desc *entry = NULL;
1327 1485
1486 rtlpci->rx_ring[rxring_idx].idx = 0;
1328 for (i = 0; i < rtlpci->rxringcount; i++) { 1487 for (i = 0; i < rtlpci->rxringcount; i++) {
1329 entry = &rtlpci->rx_ring[rx_queue_idx].desc[i]; 1488 entry = &rtlpci->rx_ring[rxring_idx].desc[i];
1330 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, 1489 bufferaddress =
1331 false, 1490 rtlpriv->cfg->ops->get_desc((u8 *)entry,
1332 HW_DESC_RXOWN, 1491 false , HW_DESC_RXBUFF_ADDR);
1333 &tmp_one); 1492 memset((u8 *)entry , 0 ,
1493 sizeof(*rtlpci->rx_ring
1494 [rxring_idx].desc));/*clear one entry*/
1495 if (rtlpriv->use_new_trx_flow) {
1496 rtlpriv->cfg->ops->set_desc(hw,
1497 (u8 *)entry, false,
1498 HW_DESC_RX_PREPARE,
1499 (u8 *)&bufferaddress);
1500 } else {
1501 rtlpriv->cfg->ops->set_desc(hw,
1502 (u8 *)entry, false,
1503 HW_DESC_RXBUFF_ADDR,
1504 (u8 *)&bufferaddress);
1505 rtlpriv->cfg->ops->set_desc(hw,
1506 (u8 *)entry, false,
1507 HW_DESC_RXPKT_LEN,
1508 (u8 *)&rtlpci->rxbuffersize);
1509 rtlpriv->cfg->ops->set_desc(hw,
1510 (u8 *)entry, false,
1511 HW_DESC_RXOWN,
1512 (u8 *)&tmp_one);
1513 }
1334 } 1514 }
1335 rtlpci->rx_ring[rx_queue_idx].idx = 0; 1515 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1516 HW_DESC_RXERO, (u8 *)&tmp_one);
1336 } 1517 }
1518 rtlpci->rx_ring[rxring_idx].idx = 0;
1337 } 1519 }
1338 1520
1339 /* 1521 /*
1340 *after reset, release previous pending packet, 1522 *after reset, release previous pending packet,
1341 *and force the tx idx to the first one 1523 *and force the tx idx to the first one
1342 */ 1524 */
1525 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
1343 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) { 1526 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) {
1344 if (rtlpci->tx_ring[i].desc) { 1527 if (rtlpci->tx_ring[i].desc ||
1528 rtlpci->tx_ring[i].buffer_desc) {
1345 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[i]; 1529 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[i];
1346 1530
1347 while (skb_queue_len(&ring->queue)) { 1531 while (skb_queue_len(&ring->queue)) {
1348 struct rtl_tx_desc *entry; 1532 u8 *entry;
1349 struct sk_buff *skb; 1533 struct sk_buff *skb =
1534 __skb_dequeue(&ring->queue);
1535 if (rtlpriv->use_new_trx_flow)
1536 entry = (u8 *)(&ring->buffer_desc
1537 [ring->idx]);
1538 else
1539 entry = (u8 *)(&ring->desc[ring->idx]);
1350 1540
1351 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock,
1352 flags);
1353 entry = &ring->desc[ring->idx];
1354 skb = __skb_dequeue(&ring->queue);
1355 pci_unmap_single(rtlpci->pdev, 1541 pci_unmap_single(rtlpci->pdev,
1356 rtlpriv->cfg->ops-> 1542 rtlpriv->cfg->ops->
1357 get_desc((u8 *) 1543 get_desc((u8 *)
@@ -1360,13 +1546,13 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
1360 HW_DESC_TXBUFF_ADDR), 1546 HW_DESC_TXBUFF_ADDR),
1361 skb->len, PCI_DMA_TODEVICE); 1547 skb->len, PCI_DMA_TODEVICE);
1362 ring->idx = (ring->idx + 1) % ring->entries; 1548 ring->idx = (ring->idx + 1) % ring->entries;
1363 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock,
1364 flags);
1365 kfree_skb(skb); 1549 kfree_skb(skb);
1550 ring->idx = (ring->idx + 1) % ring->entries;
1366 } 1551 }
1367 ring->idx = 0; 1552 ring->idx = 0;
1368 } 1553 }
1369 } 1554 }
1555 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
1370 1556
1371 return 0; 1557 return 0;
1372} 1558}
@@ -1421,7 +1607,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1421 struct rtl8192_tx_ring *ring; 1607 struct rtl8192_tx_ring *ring;
1422 struct rtl_tx_desc *pdesc; 1608 struct rtl_tx_desc *pdesc;
1423 struct rtl_tx_buffer_desc *ptx_bd_desc = NULL; 1609 struct rtl_tx_buffer_desc *ptx_bd_desc = NULL;
1424 u8 idx; 1610 u16 idx;
1425 u8 hw_queue = _rtl_mac_to_hwqueue(hw, skb); 1611 u8 hw_queue = _rtl_mac_to_hwqueue(hw, skb);
1426 unsigned long flags; 1612 unsigned long flags;
1427 struct ieee80211_hdr *hdr = rtl_get_hdr(skb); 1613 struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
@@ -1454,11 +1640,15 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1454 1640
1455 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 1641 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
1456 ring = &rtlpci->tx_ring[hw_queue]; 1642 ring = &rtlpci->tx_ring[hw_queue];
1457 if (hw_queue != BEACON_QUEUE) 1643 if (hw_queue != BEACON_QUEUE) {
1458 idx = (ring->idx + skb_queue_len(&ring->queue)) % 1644 if (rtlpriv->use_new_trx_flow)
1459 ring->entries; 1645 idx = ring->cur_tx_wp;
1460 else 1646 else
1647 idx = (ring->idx + skb_queue_len(&ring->queue)) %
1648 ring->entries;
1649 } else {
1461 idx = 0; 1650 idx = 0;
1651 }
1462 1652
1463 pdesc = &ring->desc[idx]; 1653 pdesc = &ring->desc[idx];
1464 if (rtlpriv->use_new_trx_flow) { 1654 if (rtlpriv->use_new_trx_flow) {
@@ -1525,7 +1715,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1525 return 0; 1715 return 0;
1526} 1716}
1527 1717
1528static void rtl_pci_flush(struct ieee80211_hw *hw, bool drop) 1718static void rtl_pci_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
1529{ 1719{
1530 struct rtl_priv *rtlpriv = rtl_priv(hw); 1720 struct rtl_priv *rtlpriv = rtl_priv(hw);
1531 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 1721 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
@@ -1540,6 +1730,11 @@ static void rtl_pci_flush(struct ieee80211_hw *hw, bool drop)
1540 1730
1541 for (queue_id = RTL_PCI_MAX_TX_QUEUE_COUNT - 1; queue_id >= 0;) { 1731 for (queue_id = RTL_PCI_MAX_TX_QUEUE_COUNT - 1; queue_id >= 0;) {
1542 u32 queue_len; 1732 u32 queue_len;
1733
1734 if (((queues >> queue_id) & 0x1) == 0) {
1735 queue_id--;
1736 continue;
1737 }
1543 ring = &pcipriv->dev.tx_ring[queue_id]; 1738 ring = &pcipriv->dev.tx_ring[queue_id];
1544 queue_len = skb_queue_len(&ring->queue); 1739 queue_len = skb_queue_len(&ring->queue);
1545 if (queue_len == 0 || queue_id == BEACON_QUEUE || 1740 if (queue_len == 0 || queue_id == BEACON_QUEUE ||
@@ -1603,6 +1798,10 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
1603 rtl_pci_reset_trx_ring(hw); 1798 rtl_pci_reset_trx_ring(hw);
1604 1799
1605 rtlpci->driver_is_goingto_unload = false; 1800 rtlpci->driver_is_goingto_unload = false;
1801 if (rtlpriv->cfg->ops->get_btc_status()) {
1802 rtlpriv->btcoexist.btc_ops->btc_init_variables(rtlpriv);
1803 rtlpriv->btcoexist.btc_ops->btc_init_hal_vars(rtlpriv);
1804 }
1606 err = rtlpriv->cfg->ops->hw_init(hw); 1805 err = rtlpriv->cfg->ops->hw_init(hw);
1607 if (err) { 1806 if (err) {
1608 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1807 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
@@ -1622,7 +1821,7 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
1622 1821
1623 rtlpci->up_first_time = false; 1822 rtlpci->up_first_time = false;
1624 1823
1625 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "OK\n"); 1824 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "rtl_pci_start OK\n");
1626 return 0; 1825 return 0;
1627} 1826}
1628 1827
@@ -1635,6 +1834,9 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
1635 unsigned long flags; 1834 unsigned long flags;
1636 u8 RFInProgressTimeOut = 0; 1835 u8 RFInProgressTimeOut = 0;
1637 1836
1837 if (rtlpriv->cfg->ops->get_btc_status())
1838 rtlpriv->btcoexist.btc_ops->btc_halt_notify();
1839
1638 /* 1840 /*
1639 *should be before disable interrupt&adapter 1841 *should be before disable interrupt&adapter
1640 *and will do it immediately. 1842 *and will do it immediately.
@@ -1753,6 +1955,22 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
1753 rtlhal->hw_type = HARDWARE_TYPE_RTL8188EE; 1955 rtlhal->hw_type = HARDWARE_TYPE_RTL8188EE;
1754 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1956 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1755 "Find adapter, Hardware type is 8188EE\n"); 1957 "Find adapter, Hardware type is 8188EE\n");
1958 } else if (deviceid == RTL_PCI_8723BE_DID) {
1959 rtlhal->hw_type = HARDWARE_TYPE_RTL8723BE;
1960 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1961 "Find adapter, Hardware type is 8723BE\n");
1962 } else if (deviceid == RTL_PCI_8192EE_DID) {
1963 rtlhal->hw_type = HARDWARE_TYPE_RTL8192EE;
1964 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1965 "Find adapter, Hardware type is 8192EE\n");
1966 } else if (deviceid == RTL_PCI_8821AE_DID) {
1967 rtlhal->hw_type = HARDWARE_TYPE_RTL8821AE;
1968 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1969 "Find adapter, Hardware type is 8821AE\n");
1970 } else if (deviceid == RTL_PCI_8812AE_DID) {
1971 rtlhal->hw_type = HARDWARE_TYPE_RTL8812AE;
1972 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1973 "Find adapter, Hardware type is 8812AE\n");
1756 } else { 1974 } else {
1757 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1975 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1758 "Err: Unknown device - vid/did=%x/%x\n", 1976 "Err: Unknown device - vid/did=%x/%x\n",
@@ -1779,11 +1997,20 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
1779 rtlhal->interfaceindex = 0; 1997 rtlhal->interfaceindex = 0;
1780 } 1998 }
1781 } 1999 }
2000
2001 /* 92ee use new trx flow */
2002 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192EE)
2003 rtlpriv->use_new_trx_flow = true;
2004 else
2005 rtlpriv->use_new_trx_flow = false;
2006
1782 /*find bus info */ 2007 /*find bus info */
1783 pcipriv->ndis_adapter.busnumber = pdev->bus->number; 2008 pcipriv->ndis_adapter.busnumber = pdev->bus->number;
1784 pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn); 2009 pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn);
1785 pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn); 2010 pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn);
1786 2011
2012 /*find bridge info */
2013 pcipriv->ndis_adapter.pcibridge_vendor = PCI_BRIDGE_VENDOR_UNKNOWN;
1787 /* some ARM have no bridge_pdev and will crash here 2014 /* some ARM have no bridge_pdev and will crash here
1788 * so we should check if bridge_pdev is NULL 2015 * so we should check if bridge_pdev is NULL
1789 */ 2016 */
@@ -1951,6 +2178,11 @@ int rtl_pci_probe(struct pci_dev *pdev,
1951 pcipriv = (void *)rtlpriv->priv; 2178 pcipriv = (void *)rtlpriv->priv;
1952 pcipriv->dev.pdev = pdev; 2179 pcipriv->dev.pdev = pdev;
1953 init_completion(&rtlpriv->firmware_loading_complete); 2180 init_completion(&rtlpriv->firmware_loading_complete);
2181 /*proximity init here*/
2182 rtlpriv->proximity.proxim_on = false;
2183
2184 pcipriv = (void *)rtlpriv->priv;
2185 pcipriv->dev.pdev = pdev;
1954 2186
1955 /* init cfg & intf_ops */ 2187 /* init cfg & intf_ops */
1956 rtlpriv->rtlhal.interface = INTF_PCI; 2188 rtlpriv->rtlhal.interface = INTF_PCI;
@@ -2013,6 +2245,13 @@ int rtl_pci_probe(struct pci_dev *pdev,
2013 /*like read eeprom and so on */ 2245 /*like read eeprom and so on */
2014 rtlpriv->cfg->ops->read_eeprom_info(hw); 2246 rtlpriv->cfg->ops->read_eeprom_info(hw);
2015 2247
2248 if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
2249 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n");
2250 err = -ENODEV;
2251 goto fail3;
2252 }
2253 rtlpriv->cfg->ops->init_sw_leds(hw);
2254
2016 /*aspm */ 2255 /*aspm */
2017 rtl_pci_init_aspm(hw); 2256 rtl_pci_init_aspm(hw);
2018 2257
@@ -2031,13 +2270,14 @@ int rtl_pci_probe(struct pci_dev *pdev,
2031 goto fail3; 2270 goto fail3;
2032 } 2271 }
2033 2272
2034 if (rtlpriv->cfg->ops->init_sw_vars(hw)) { 2273 err = ieee80211_register_hw(hw);
2035 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Can't init_sw_vars\n"); 2274 if (err) {
2275 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2276 "Can't register mac80211 hw.\n");
2036 err = -ENODEV; 2277 err = -ENODEV;
2037 goto fail3; 2278 goto fail3;
2038 } 2279 }
2039 2280 rtlpriv->mac80211.mac80211_registered = 1;
2040 rtlpriv->cfg->ops->init_sw_leds(hw);
2041 2281
2042 err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group); 2282 err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group);
2043 if (err) { 2283 if (err) {
@@ -2046,6 +2286,9 @@ int rtl_pci_probe(struct pci_dev *pdev,
2046 goto fail3; 2286 goto fail3;
2047 } 2287 }
2048 2288
2289 /*init rfkill */
2290 rtl_init_rfkill(hw); /* Init PCI sw */
2291
2049 rtlpci = rtl_pcidev(pcipriv); 2292 rtlpci = rtl_pcidev(pcipriv);
2050 err = rtl_pci_intr_mode_decide(hw); 2293 err = rtl_pci_intr_mode_decide(hw);
2051 if (err) { 2294 if (err) {
@@ -2056,9 +2299,11 @@ int rtl_pci_probe(struct pci_dev *pdev,
2056 } 2299 }
2057 rtlpci->irq_alloc = 1; 2300 rtlpci->irq_alloc = 1;
2058 2301
2302 set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
2059 return 0; 2303 return 0;
2060 2304
2061fail3: 2305fail3:
2306 pci_set_drvdata(pdev, NULL);
2062 rtl_deinit_core(hw); 2307 rtl_deinit_core(hw);
2063 2308
2064 if (rtlpriv->io.pci_mem_start != 0) 2309 if (rtlpriv->io.pci_mem_start != 0)
@@ -2128,6 +2373,8 @@ void rtl_pci_disconnect(struct pci_dev *pdev)
2128 2373
2129 rtl_pci_disable_aspm(hw); 2374 rtl_pci_disable_aspm(hw);
2130 2375
2376 pci_set_drvdata(pdev, NULL);
2377
2131 ieee80211_free_hw(hw); 2378 ieee80211_free_hw(hw);
2132} 2379}
2133EXPORT_SYMBOL(rtl_pci_disconnect); 2380EXPORT_SYMBOL(rtl_pci_disconnect);
diff --git a/drivers/net/wireless/rtlwifi/pci.h b/drivers/net/wireless/rtlwifi/pci.h
index 90174a814a6d..5e832306dba9 100644
--- a/drivers/net/wireless/rtlwifi/pci.h
+++ b/drivers/net/wireless/rtlwifi/pci.h
@@ -39,10 +39,11 @@
39#define RTL_PCI_RX_CMD_QUEUE 1 39#define RTL_PCI_RX_CMD_QUEUE 1
40#define RTL_PCI_MAX_RX_QUEUE 2 40#define RTL_PCI_MAX_RX_QUEUE 2
41 41
42#define RTL_PCI_MAX_RX_COUNT 64 42#define RTL_PCI_MAX_RX_COUNT 512/*64*/
43#define RTL_PCI_MAX_TX_QUEUE_COUNT 9 43#define RTL_PCI_MAX_TX_QUEUE_COUNT 9
44 44
45#define RT_TXDESC_NUM 128 45#define RT_TXDESC_NUM 128
46#define TX_DESC_NUM_92E 512
46#define RT_TXDESC_NUM_BE_QUEUE 256 47#define RT_TXDESC_NUM_BE_QUEUE 256
47 48
48#define BK_QUEUE 0 49#define BK_QUEUE 0
@@ -62,6 +63,12 @@
62 .subdevice = PCI_ANY_ID,\ 63 .subdevice = PCI_ANY_ID,\
63 .driver_data = (kernel_ulong_t)&(cfg) 64 .driver_data = (kernel_ulong_t)&(cfg)
64 65
66#define INTEL_VENDOR_ID 0x8086
67#define SIS_VENDOR_ID 0x1039
68#define ATI_VENDOR_ID 0x1002
69#define ATI_DEVICE_ID 0x7914
70#define AMD_VENDOR_ID 0x1022
71
65#define PCI_MAX_BRIDGE_NUMBER 255 72#define PCI_MAX_BRIDGE_NUMBER 255
66#define PCI_MAX_DEVICES 32 73#define PCI_MAX_DEVICES 32
67#define PCI_MAX_FUNCTION 8 74#define PCI_MAX_FUNCTION 8
@@ -69,6 +76,11 @@
69#define PCI_CONF_ADDRESS 0x0CF8 /*PCI Configuration Space Address */ 76#define PCI_CONF_ADDRESS 0x0CF8 /*PCI Configuration Space Address */
70#define PCI_CONF_DATA 0x0CFC /*PCI Configuration Space Data */ 77#define PCI_CONF_DATA 0x0CFC /*PCI Configuration Space Data */
71 78
79#define PCI_CLASS_BRIDGE_DEV 0x06
80#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
81#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
82#define PCI_CAP_ID_EXP 0x10
83
72#define U1DONTCARE 0xFF 84#define U1DONTCARE 0xFF
73#define U2DONTCARE 0xFFFF 85#define U2DONTCARE 0xFFFF
74#define U4DONTCARE 0xFFFFFFFF 86#define U4DONTCARE 0xFFFFFFFF
@@ -87,6 +99,7 @@
87#define RTL_PCI_700F_DID 0x700F 99#define RTL_PCI_700F_DID 0x700F
88#define RTL_PCI_701F_DID 0x701F 100#define RTL_PCI_701F_DID 0x701F
89#define RTL_PCI_DLINK_DID 0x3304 101#define RTL_PCI_DLINK_DID 0x3304
102#define RTL_PCI_8723AE_DID 0x8723 /*8723e */
90#define RTL_PCI_8192CET_DID 0x8191 /*8192ce */ 103#define RTL_PCI_8192CET_DID 0x8191 /*8192ce */
91#define RTL_PCI_8192CE_DID 0x8178 /*8192ce */ 104#define RTL_PCI_8192CE_DID 0x8178 /*8192ce */
92#define RTL_PCI_8191CE_DID 0x8177 /*8192ce */ 105#define RTL_PCI_8191CE_DID 0x8177 /*8192ce */
@@ -95,6 +108,10 @@
95#define RTL_PCI_8192DE_DID 0x8193 /*8192de */ 108#define RTL_PCI_8192DE_DID 0x8193 /*8192de */
96#define RTL_PCI_8192DE_DID2 0x002B /*92DE*/ 109#define RTL_PCI_8192DE_DID2 0x002B /*92DE*/
97#define RTL_PCI_8188EE_DID 0x8179 /*8188ee*/ 110#define RTL_PCI_8188EE_DID 0x8179 /*8188ee*/
111#define RTL_PCI_8723BE_DID 0xB723 /*8723be*/
112#define RTL_PCI_8192EE_DID 0x818B /*8192ee*/
113#define RTL_PCI_8821AE_DID 0x8821 /*8821ae*/
114#define RTL_PCI_8812AE_DID 0x8812 /*8812ae*/
98 115
99/*8192 support 16 pages of IO registers*/ 116/*8192 support 16 pages of IO registers*/
100#define RTL_MEM_MAPPED_IO_RANGE_8190PCI 0x1000 117#define RTL_MEM_MAPPED_IO_RANGE_8190PCI 0x1000
@@ -125,24 +142,34 @@ struct rtl_pci_capabilities_header {
125 u8 next; 142 u8 next;
126}; 143};
127 144
128struct rtl_rx_desc { 145/* In new TRX flow, Buffer_desc is new concept
129 u32 dword[8]; 146 * But TX wifi info == TX descriptor in old flow
147 * RX wifi info == RX descriptor in old flow
148 */
149struct rtl_tx_buffer_desc {
150#if (RTL8192EE_SEG_NUM == 2)
151 u32 dword[2*(DMA_IS_64BIT + 1)*8]; /*seg = 8*/
152#elif (RTL8192EE_SEG_NUM == 1)
153 u32 dword[2*(DMA_IS_64BIT + 1)*4]; /*seg = 4*/
154#elif (RTL8192EE_SEG_NUM == 0)
155 u32 dword[2*(DMA_IS_64BIT + 1)*2]; /*seg = 2*/
156#endif
130} __packed; 157} __packed;
131 158
132struct rtl_tx_desc { 159struct rtl_tx_desc {
133 u32 dword[16]; 160 u32 dword[16];
134} __packed; 161} __packed;
135 162
136struct rtl_tx_cmd_desc { 163struct rtl_rx_buffer_desc { /*rx buffer desc*/
137 u32 dword[16]; 164 u32 dword[2];
138} __packed; 165} __packed;
139 166
140/* In new TRX flow, Buffer_desc is new concept 167struct rtl_rx_desc { /*old: rx desc new: rx wifi info*/
141 * But TX wifi info == TX descriptor in old flow 168 u32 dword[8];
142 * RX wifi info == RX descriptor in old flow 169} __packed;
143 */ 170
144struct rtl_tx_buffer_desc { 171struct rtl_tx_cmd_desc {
145 u32 dword[8]; /*seg = 4*/ 172 u32 dword[16];
146} __packed; 173} __packed;
147 174
148struct rtl8192_tx_ring { 175struct rtl8192_tx_ring {
@@ -153,6 +180,10 @@ struct rtl8192_tx_ring {
153 struct sk_buff_head queue; 180 struct sk_buff_head queue;
154 /*add for new trx flow*/ 181 /*add for new trx flow*/
155 struct rtl_tx_buffer_desc *buffer_desc; /*tx buffer descriptor*/ 182 struct rtl_tx_buffer_desc *buffer_desc; /*tx buffer descriptor*/
183 dma_addr_t buffer_desc_dma; /*tx bufferd desc dma memory*/
184 u16 avl_desc; /* available_desc_to_write */
185 u16 cur_tx_wp; /* current_tx_write_point */
186 u16 cur_tx_rp; /* current_tx_read_point */
156}; 187};
157 188
158struct rtl8192_rx_ring { 189struct rtl8192_rx_ring {
@@ -160,6 +191,9 @@ struct rtl8192_rx_ring {
160 dma_addr_t dma; 191 dma_addr_t dma;
161 unsigned int idx; 192 unsigned int idx;
162 struct sk_buff *rx_buf[RTL_PCI_MAX_RX_COUNT]; 193 struct sk_buff *rx_buf[RTL_PCI_MAX_RX_COUNT];
194 /*add for new trx flow*/
195 struct rtl_rx_buffer_desc *buffer_desc; /*rx buffer descriptor*/
196 u16 next_rx_rp; /* next_rx_read_point */
163}; 197};
164 198
165struct rtl_pci { 199struct rtl_pci {
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index a943a245d680..9e990be4abb3 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -163,6 +163,12 @@
163#define DEL_SW_IDX_SZ 30 163#define DEL_SW_IDX_SZ 30
164#define BAND_NUM 3 164#define BAND_NUM 3
165 165
166/* For now, it's just for 8192ee
167 * but not OK yet, keep it 0
168 */
169#define DMA_IS_64BIT 0
170#define RTL8192EE_SEG_NUM 1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
171
166enum rf_tx_num { 172enum rf_tx_num {
167 RF_1TX = 0, 173 RF_1TX = 0,
168 RF_2TX, 174 RF_2TX,
@@ -636,6 +642,7 @@ enum rtl_var_map {
636 RTL_IMR_VIDOK, /*AC_VI DMA OK Interrupt */ 642 RTL_IMR_VIDOK, /*AC_VI DMA OK Interrupt */
637 RTL_IMR_VODOK, /*AC_VO DMA Interrupt */ 643 RTL_IMR_VODOK, /*AC_VO DMA Interrupt */
638 RTL_IMR_ROK, /*Receive DMA OK Interrupt */ 644 RTL_IMR_ROK, /*Receive DMA OK Interrupt */
645 RTL_IMR_HSISR_IND, /*HSISR Interrupt*/
639 RTL_IBSS_INT_MASKS, /*(RTL_IMR_BCNINT | RTL_IMR_TBDOK | 646 RTL_IBSS_INT_MASKS, /*(RTL_IMR_BCNINT | RTL_IMR_TBDOK |
640 * RTL_IMR_TBDER) */ 647 * RTL_IMR_TBDER) */
641 RTL_IMR_C2HCMD, /*fw interrupt*/ 648 RTL_IMR_C2HCMD, /*fw interrupt*/
@@ -2006,7 +2013,7 @@ struct rtl_intf_ops {
2006 struct ieee80211_sta *sta, 2013 struct ieee80211_sta *sta,
2007 struct sk_buff *skb, 2014 struct sk_buff *skb,
2008 struct rtl_tcb_desc *ptcb_desc); 2015 struct rtl_tcb_desc *ptcb_desc);
2009 void (*flush)(struct ieee80211_hw *hw, bool drop); 2016 void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop);
2010 int (*reset_trx_ring) (struct ieee80211_hw *hw); 2017 int (*reset_trx_ring) (struct ieee80211_hw *hw);
2011 bool (*waitq_insert) (struct ieee80211_hw *hw, 2018 bool (*waitq_insert) (struct ieee80211_hw *hw,
2012 struct ieee80211_sta *sta, 2019 struct ieee80211_sta *sta,