diff options
author | Larry Finger <Larry.Finger@lwfinger.net> | 2014-11-28 11:41:15 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-12-01 15:22:02 -0500 |
commit | f892914c03131a445b926b82815b03162c19288e (patch) | |
tree | eb873f18caa85544dea678b55884829188c3cafd /drivers/net | |
parent | 99a82f734aa6c6d397e029e6dfa933f04e0fa8c8 (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.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/trx.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192ce/trx.h | 2 |
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 | ||
742 | bool 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 | |||
742 | void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) | 759 | void 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, | |||
723 | void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, | 723 | void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, |
724 | u8 desc_name, u8 *val); | 724 | u8 desc_name, u8 *val); |
725 | u32 rtl92ce_get_desc(u8 *pdesc, bool istx, u8 desc_name); | 725 | u32 rtl92ce_get_desc(u8 *pdesc, bool istx, u8 desc_name); |
726 | bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw, | ||
727 | u8 hw_queue, u16 index); | ||
726 | void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); | 728 | void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); |
727 | void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, | 729 | void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, |
728 | bool b_firstseg, bool b_lastseg, | 730 | bool b_firstseg, bool b_lastseg, |