aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2014-11-28 11:41:15 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-12-01 15:22:02 -0500
commitf892914c03131a445b926b82815b03162c19288e (patch)
treeeb873f18caa85544dea678b55884829188c3cafd /drivers/net
parent99a82f734aa6c6d397e029e6dfa933f04e0fa8c8 (diff)
rtlwifi: rtl8192ce: Fix kernel crashes due to missing callback entry
In the major update of the rtlwifi-family of drivers, one of the callback entries was missed, which leads to memory corruption. Unfortunately, this corruption never caused a kernel oops, but showed up in other parts of the system. This patch is one of three needed to fix the kernel regression reported at https://bugzilla.kernel.org/show_bug.cgi?id=88951. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Reported-by: Catalin Iacob <iacobcatalin@gmail.com> Tested-by: Catalin Iacob <iacobcatalin@gmail.com> Cc: Catalin Iacob <iacobcatalin@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/sw.c3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/trx.c17
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/trx.h2
3 files changed, 22 insertions, 0 deletions
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
index 46ea07605eb4..dd5aa089126a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
@@ -228,6 +228,7 @@ static struct rtl_hal_ops rtl8192ce_hal_ops = {
228 .led_control = rtl92ce_led_control, 228 .led_control = rtl92ce_led_control,
229 .set_desc = rtl92ce_set_desc, 229 .set_desc = rtl92ce_set_desc,
230 .get_desc = rtl92ce_get_desc, 230 .get_desc = rtl92ce_get_desc,
231 .is_tx_desc_closed = rtl92ce_is_tx_desc_closed,
231 .tx_polling = rtl92ce_tx_polling, 232 .tx_polling = rtl92ce_tx_polling,
232 .enable_hw_sec = rtl92ce_enable_hw_security_config, 233 .enable_hw_sec = rtl92ce_enable_hw_security_config,
233 .set_key = rtl92ce_set_key, 234 .set_key = rtl92ce_set_key,
@@ -271,6 +272,8 @@ static struct rtl_hal_cfg rtl92ce_hal_cfg = {
271 .maps[MAC_RCR_ACRC32] = ACRC32, 272 .maps[MAC_RCR_ACRC32] = ACRC32,
272 .maps[MAC_RCR_ACF] = ACF, 273 .maps[MAC_RCR_ACF] = ACF,
273 .maps[MAC_RCR_AAP] = AAP, 274 .maps[MAC_RCR_AAP] = AAP,
275 .maps[MAC_HIMR] = REG_HIMR,
276 .maps[MAC_HIMRE] = REG_HIMRE,
274 277
275 .maps[EFUSE_TEST] = REG_EFUSE_TEST, 278 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
276 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL, 279 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
index 0916275c7362..e88dcd0e0af1 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
@@ -739,6 +739,23 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
739 return ret; 739 return ret;
740} 740}
741 741
742bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
743 u8 hw_queue, u16 index)
744{
745 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
746 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
747 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
748 u8 own = (u8)rtl92ce_get_desc(entry, true, HW_DESC_OWN);
749
750 /*beacon packet will only use the first
751 *descriptor defautly,and the own may not
752 *be cleared by the hardware
753 */
754 if (own)
755 return false;
756 return true;
757}
758
742void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) 759void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
743{ 760{
744 struct rtl_priv *rtlpriv = rtl_priv(hw); 761 struct rtl_priv *rtlpriv = rtl_priv(hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
index 9a39ec4204dd..4bec4b07e3e0 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.h
@@ -723,6 +723,8 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
723void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 723void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
724 u8 desc_name, u8 *val); 724 u8 desc_name, u8 *val);
725u32 rtl92ce_get_desc(u8 *pdesc, bool istx, u8 desc_name); 725u32 rtl92ce_get_desc(u8 *pdesc, bool istx, u8 desc_name);
726bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
727 u8 hw_queue, u16 index);
726void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); 728void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
727void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, 729void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
728 bool b_firstseg, bool b_lastseg, 730 bool b_firstseg, bool b_lastseg,