diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2014-09-26 17:40:27 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-09-30 13:17:38 -0400 |
commit | 557f933113a42a48ec617b81b5ea53fd7202b1ed (patch) | |
tree | fb234552f04d6070e74644a0f8078432c3fd9ba2 /drivers/net/wireless/rtlwifi/core.c | |
parent | 9f087a924427c01190b205f0051be00808c99828 (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.c | 31 |
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 | } |
1770 | EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing); | 1770 | EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing); |
1771 | |||
1772 | bool 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 | } | ||
1801 | EXPORT_SYMBOL(rtl_cmd_send_packet); | ||
1771 | const struct ieee80211_ops rtl_ops = { | 1802 | const 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, |