diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2014-09-27 01:40:27 +0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-09-30 21:17:38 +0400 |
commit | 557f933113a42a48ec617b81b5ea53fd7202b1ed (patch) | |
tree | fb234552f04d6070e74644a0f8078432c3fd9ba2 /drivers/net/wireless/rtlwifi/rtl8821ae/fw.c | |
parent | 9f087a924427c01190b205f0051be00808c99828 (diff) | |
download | linux-557f933113a42a48ec617b81b5ea53fd7202b1ed.tar.xz |
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/rtl8821ae/fw.c')
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8821ae/fw.c | 38 |
1 files changed, 3 insertions, 35 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c index 2efdb64d5528..95e95626b632 100644 --- a/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c +++ b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c @@ -26,6 +26,7 @@ #include "../wifi.h" #include "../pci.h" #include "../base.h" +#include "../core.h" #include "reg.h" #include "def.h" #include "fw.h" @@ -742,39 +743,6 @@ void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw) remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN); } -static bool _rtl8821ae_cmd_send_packet(struct ieee80211_hw *hw, - struct sk_buff *skb) -{ - struct rtl_priv *rtlpriv = rtl_priv(hw); - struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); - struct rtl8192_tx_ring *ring; - struct rtl_tx_desc *pdesc; - struct sk_buff *pskb = NULL; - u8 own; - unsigned long flags; - - ring = &rtlpci->tx_ring[BEACON_QUEUE]; - - pskb = __skb_dequeue(&ring->queue); - if (pskb) - kfree_skb(pskb); - - spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); - - pdesc = &ring->desc[0]; - own = (u8)rtlpriv->cfg->ops->get_desc((u8 *)pdesc, true, HW_DESC_OWN); - - rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb); - - __skb_queue_tail(&ring->queue, skb); - - spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); - - rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE); - - return true; -} - #define BEACON_PG 0 #define PSPOLL_PG 1 #define NULL_PG 2 @@ -1581,7 +1549,7 @@ out: memcpy((u8 *)skb_put(skb, totalpacketlen), &reserved_page_packet_8812, totalpacketlen); - rtstatus = _rtl8821ae_cmd_send_packet(hw, skb); + rtstatus = rtl_cmd_send_packet(hw, skb); if (rtstatus) b_dlok = true; @@ -1706,7 +1674,7 @@ out: memcpy((u8 *)skb_put(skb, totalpacketlen), &reserved_page_packet_8821, totalpacketlen); - rtstatus = _rtl8821ae_cmd_send_packet(hw, skb); + rtstatus = rtl_cmd_send_packet(hw, skb); if (rtstatus) b_dlok = true; |