aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtlwifi/pci.c')
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 846a2e6e34d8..88331d729b0e 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -578,6 +578,13 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
578 else 578 else
579 entry = (u8 *)(&ring->desc[ring->idx]); 579 entry = (u8 *)(&ring->desc[ring->idx]);
580 580
581 if (rtlpriv->cfg->ops->get_available_desc &&
582 rtlpriv->cfg->ops->get_available_desc(hw, prio) <= 1) {
583 RT_TRACE(rtlpriv, (COMP_INTR | COMP_SEND), DBG_DMESG,
584 "no available desc!\n");
585 return;
586 }
587
581 if (!rtlpriv->cfg->ops->is_tx_desc_closed(hw, prio, ring->idx)) 588 if (!rtlpriv->cfg->ops->is_tx_desc_closed(hw, prio, ring->idx))
582 return; 589 return;
583 ring->idx = (ring->idx + 1) % ring->entries; 590 ring->idx = (ring->idx + 1) % ring->entries;
@@ -641,10 +648,9 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
641 648
642 ieee80211_tx_status_irqsafe(hw, skb); 649 ieee80211_tx_status_irqsafe(hw, skb);
643 650
644 if ((ring->entries - skb_queue_len(&ring->queue)) 651 if ((ring->entries - skb_queue_len(&ring->queue)) <= 4) {
645 == 2) {
646 652
647 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 653 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
648 "more desc left, wake skb_queue@%d, ring->idx = %d, skb_queue_len = 0x%x\n", 654 "more desc left, wake skb_queue@%d, ring->idx = %d, skb_queue_len = 0x%x\n",
649 prio, ring->idx, 655 prio, ring->idx,
650 skb_queue_len(&ring->queue)); 656 skb_queue_len(&ring->queue));
@@ -786,7 +792,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
786 rx_remained_cnt = 792 rx_remained_cnt =
787 rtlpriv->cfg->ops->rx_desc_buff_remained_cnt(hw, 793 rtlpriv->cfg->ops->rx_desc_buff_remained_cnt(hw,
788 hw_queue); 794 hw_queue);
789 if (rx_remained_cnt < 1) 795 if (rx_remained_cnt == 0)
790 return; 796 return;
791 797
792 } else { /* rx descriptor */ 798 } else { /* rx descriptor */
@@ -834,18 +840,18 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
834 else 840 else
835 skb_reserve(skb, stats.rx_drvinfo_size + 841 skb_reserve(skb, stats.rx_drvinfo_size +
836 stats.rx_bufshift); 842 stats.rx_bufshift);
837
838 } else { 843 } else {
839 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 844 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
840 "skb->end - skb->tail = %d, len is %d\n", 845 "skb->end - skb->tail = %d, len is %d\n",
841 skb->end - skb->tail, len); 846 skb->end - skb->tail, len);
842 break; 847 dev_kfree_skb_any(skb);
848 goto new_trx_end;
843 } 849 }
844 /* handle command packet here */ 850 /* handle command packet here */
845 if (rtlpriv->cfg->ops->rx_command_packet && 851 if (rtlpriv->cfg->ops->rx_command_packet &&
846 rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) { 852 rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) {
847 dev_kfree_skb_any(skb); 853 dev_kfree_skb_any(skb);
848 goto end; 854 goto new_trx_end;
849 } 855 }
850 856
851 /* 857 /*
@@ -895,6 +901,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
895 } else { 901 } else {
896 dev_kfree_skb_any(skb); 902 dev_kfree_skb_any(skb);
897 } 903 }
904new_trx_end:
898 if (rtlpriv->use_new_trx_flow) { 905 if (rtlpriv->use_new_trx_flow) {
899 rtlpci->rx_ring[hw_queue].next_rx_rp += 1; 906 rtlpci->rx_ring[hw_queue].next_rx_rp += 1;
900 rtlpci->rx_ring[hw_queue].next_rx_rp %= 907 rtlpci->rx_ring[hw_queue].next_rx_rp %=
@@ -910,7 +917,6 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
910 rtlpriv->enter_ps = false; 917 rtlpriv->enter_ps = false;
911 schedule_work(&rtlpriv->works.lps_change_work); 918 schedule_work(&rtlpriv->works.lps_change_work);
912 } 919 }
913end:
914 if (rtlpriv->use_new_trx_flow) { 920 if (rtlpriv->use_new_trx_flow) {
915 _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc, 921 _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc,
916 rxring_idx, 922 rxring_idx,
@@ -1672,6 +1678,15 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1672 } 1678 }
1673 } 1679 }
1674 1680
1681 if (rtlpriv->cfg->ops->get_available_desc &&
1682 rtlpriv->cfg->ops->get_available_desc(hw, hw_queue) == 0) {
1683 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1684 "get_available_desc fail\n");
1685 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock,
1686 flags);
1687 return skb->len;
1688 }
1689
1675 if (ieee80211_is_data_qos(fc)) { 1690 if (ieee80211_is_data_qos(fc)) {
1676 tid = rtl_get_tid(skb); 1691 tid = rtl_get_tid(skb);
1677 if (sta) { 1692 if (sta) {