aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/core.c
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2014-09-26 17:40:27 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-09-30 13:17:38 -0400
commit557f933113a42a48ec617b81b5ea53fd7202b1ed (patch)
treefb234552f04d6070e74644a0f8078432c3fd9ba2 /drivers/net/wireless/rtlwifi/core.c
parent9f087a924427c01190b205f0051be00808c99828 (diff)
rtlwifi: rtl8188ee: rtl8192com: rtl8192cu: rtl8192ee: rtl8723ae: rtl87323be: rtl8821ae: Use common cmd_send_packet
A locking problem was found in routine _rtl92ee_cmd_send_packet() that led to system freezes. Upon inspection, several drivers had the same problem; however, the routines all used the same code. The common code has been moved into rtlwifi. 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/core.c')
-rw-r--r--drivers/net/wireless/rtlwifi/core.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index 10a3bc6dca80..f6179bc06086 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -1768,6 +1768,37 @@ bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
1768 return true; 1768 return true;
1769} 1769}
1770EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing); 1770EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing);
1771
1772bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)
1773{
1774 struct rtl_priv *rtlpriv = rtl_priv(hw);
1775 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1776 struct rtl8192_tx_ring *ring;
1777 struct rtl_tx_desc *pdesc;
1778 unsigned long flags;
1779 struct sk_buff *pskb = NULL;
1780
1781 ring = &rtlpci->tx_ring[BEACON_QUEUE];
1782
1783 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
1784 pskb = __skb_dequeue(&ring->queue);
1785 if (pskb)
1786 kfree_skb(pskb);
1787
1788 /*this is wrong, fill_tx_cmddesc needs update*/
1789 pdesc = &ring->desc[0];
1790
1791 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
1792
1793 __skb_queue_tail(&ring->queue, skb);
1794
1795 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
1796
1797 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
1798
1799 return true;
1800}
1801EXPORT_SYMBOL(rtl_cmd_send_packet);
1771const struct ieee80211_ops rtl_ops = { 1802const struct ieee80211_ops rtl_ops = {
1772 .start = rtl_op_start, 1803 .start = rtl_op_start,
1773 .stop = rtl_op_stop, 1804 .stop = rtl_op_stop,