diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi/pci.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/pci.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index c70efb9a6e78..ec456f0d972e 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)); |
@@ -793,7 +799,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
793 | rx_remained_cnt = | 799 | rx_remained_cnt = |
794 | rtlpriv->cfg->ops->rx_desc_buff_remained_cnt(hw, | 800 | rtlpriv->cfg->ops->rx_desc_buff_remained_cnt(hw, |
795 | hw_queue); | 801 | hw_queue); |
796 | if (rx_remained_cnt < 1) | 802 | if (rx_remained_cnt == 0) |
797 | return; | 803 | return; |
798 | 804 | ||
799 | } else { /* rx descriptor */ | 805 | } else { /* rx descriptor */ |
@@ -848,18 +854,18 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
848 | else | 854 | else |
849 | skb_reserve(skb, stats.rx_drvinfo_size + | 855 | skb_reserve(skb, stats.rx_drvinfo_size + |
850 | stats.rx_bufshift); | 856 | stats.rx_bufshift); |
851 | |||
852 | } else { | 857 | } else { |
853 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, | 858 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, |
854 | "skb->end - skb->tail = %d, len is %d\n", | 859 | "skb->end - skb->tail = %d, len is %d\n", |
855 | skb->end - skb->tail, len); | 860 | skb->end - skb->tail, len); |
856 | break; | 861 | dev_kfree_skb_any(skb); |
862 | goto new_trx_end; | ||
857 | } | 863 | } |
858 | /* handle command packet here */ | 864 | /* handle command packet here */ |
859 | if (rtlpriv->cfg->ops->rx_command_packet && | 865 | if (rtlpriv->cfg->ops->rx_command_packet && |
860 | rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) { | 866 | rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) { |
861 | dev_kfree_skb_any(skb); | 867 | dev_kfree_skb_any(skb); |
862 | goto end; | 868 | goto new_trx_end; |
863 | } | 869 | } |
864 | 870 | ||
865 | /* | 871 | /* |
@@ -909,6 +915,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
909 | } else { | 915 | } else { |
910 | dev_kfree_skb_any(skb); | 916 | dev_kfree_skb_any(skb); |
911 | } | 917 | } |
918 | new_trx_end: | ||
912 | if (rtlpriv->use_new_trx_flow) { | 919 | if (rtlpriv->use_new_trx_flow) { |
913 | rtlpci->rx_ring[hw_queue].next_rx_rp += 1; | 920 | rtlpci->rx_ring[hw_queue].next_rx_rp += 1; |
914 | rtlpci->rx_ring[hw_queue].next_rx_rp %= | 921 | rtlpci->rx_ring[hw_queue].next_rx_rp %= |
@@ -924,7 +931,6 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
924 | rtlpriv->enter_ps = false; | 931 | rtlpriv->enter_ps = false; |
925 | schedule_work(&rtlpriv->works.lps_change_work); | 932 | schedule_work(&rtlpriv->works.lps_change_work); |
926 | } | 933 | } |
927 | end: | ||
928 | skb = new_skb; | 934 | skb = new_skb; |
929 | no_new: | 935 | no_new: |
930 | if (rtlpriv->use_new_trx_flow) { | 936 | if (rtlpriv->use_new_trx_flow) { |
@@ -1688,6 +1694,15 @@ static int rtl_pci_tx(struct ieee80211_hw *hw, | |||
1688 | } | 1694 | } |
1689 | } | 1695 | } |
1690 | 1696 | ||
1697 | if (rtlpriv->cfg->ops->get_available_desc && | ||
1698 | rtlpriv->cfg->ops->get_available_desc(hw, hw_queue) == 0) { | ||
1699 | RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, | ||
1700 | "get_available_desc fail\n"); | ||
1701 | spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, | ||
1702 | flags); | ||
1703 | return skb->len; | ||
1704 | } | ||
1705 | |||
1691 | if (ieee80211_is_data_qos(fc)) { | 1706 | if (ieee80211_is_data_qos(fc)) { |
1692 | tid = rtl_get_tid(skb); | 1707 | tid = rtl_get_tid(skb); |
1693 | if (sta) { | 1708 | if (sta) { |