| From 3155db7613edea8fb943624062baf1e4f9cfbfd6 Mon Sep 17 00:00:00 2001 |
| From: Larry Finger <Larry.Finger@lwfinger.net> |
| Date: Mon, 11 Nov 2019 13:40:45 -0600 |
| Subject: rtlwifi: rtl8192de: Fix missing callback that tests for hw release of buffer |
| |
| From: Larry Finger <Larry.Finger@lwfinger.net> |
| |
| commit 3155db7613edea8fb943624062baf1e4f9cfbfd6 upstream. |
| |
| In commit 38506ecefab9 ("rtlwifi: rtl_pci: Start modification for |
| new drivers"), a callback needed to check if the hardware has released |
| a buffer indicating that a DMA operation is completed was not added. |
| |
| Fixes: 38506ecefab9 ("rtlwifi: rtl_pci: Start modification for new drivers") |
| Cc: Stable <stable@vger.kernel.org> # v3.18+ |
| Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/rtlwifi/rtl8192de/sw.c | 1 + |
| drivers/net/wireless/rtlwifi/rtl8192de/trx.c | 17 +++++++++++++++++ |
| drivers/net/wireless/rtlwifi/rtl8192de/trx.h | 2 ++ |
| 3 files changed, 20 insertions(+) |
| |
| --- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c |
| +++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c |
| @@ -242,6 +242,7 @@ static struct rtl_hal_ops rtl8192de_hal_ |
| .led_control = rtl92de_led_control, |
| .set_desc = rtl92de_set_desc, |
| .get_desc = rtl92de_get_desc, |
| + .is_tx_desc_closed = rtl92de_is_tx_desc_closed, |
| .tx_polling = rtl92de_tx_polling, |
| .enable_hw_sec = rtl92de_enable_hw_security_config, |
| .set_key = rtl92de_set_key, |
| --- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c |
| +++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c |
| @@ -863,6 +863,23 @@ u32 rtl92de_get_desc(u8 *p_desc, bool is |
| return ret; |
| } |
| |
| +bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw, |
| + u8 hw_queue, u16 index) |
| +{ |
| + struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
| + struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue]; |
| + u8 *entry = (u8 *)(&ring->desc[ring->idx]); |
| + u8 own = (u8)rtl92de_get_desc(entry, true, HW_DESC_OWN); |
| + |
| + /* a beacon packet will only use the first |
| + * descriptor by defaut, and the own bit may not |
| + * be cleared by the hardware |
| + */ |
| + if (own) |
| + return false; |
| + return true; |
| +} |
| + |
| void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) |
| { |
| struct rtl_priv *rtlpriv = rtl_priv(hw); |
| --- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.h |
| +++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.h |
| @@ -740,6 +740,8 @@ bool rtl92de_rx_query_desc(struct ieee80 |
| void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, |
| u8 desc_name, u8 *val); |
| u32 rtl92de_get_desc(u8 *pdesc, bool istx, u8 desc_name); |
| +bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw, |
| + u8 hw_queue, u16 index); |
| void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); |
| void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, |
| bool b_firstseg, bool b_lastseg, |