From feb7909fa356ce6ce5bfe30c9c10b4f44f9365b4 Mon Sep 17 00:00:00 2001 From: Ping-Ke Shih Date: Tue, 7 Apr 2020 14:05:13 +0800 Subject: [PATCH] UBUNTU: SAUCE: rtw88: No retry and report for auth and assoc BugLink: https://bugs.launchpad.net/bugs/1871300 The certain AP can't handle quick auth/assoc retry proerply, so disable auth/assoc L2 retry and doesn't report TX status immediately, then wait for cfg80211 connection retry that in period of 100ms. Signed-off-by: Ping-Ke Shih Signed-off-by: Kai-Heng Feng Change-Id: I663fc017049b3e663dc3cc0619e00d8e04d0de7e Signed-off-by: Seth Forshee --- drivers/net/wireless/realtek/rtw88/main.h | 1 + drivers/net/wireless/realtek/rtw88/tx.c | 10 ++++++++++ drivers/net/wireless/realtek/rtw88/tx.h | 5 +++++ 3 files changed, 16 insertions(+) diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h index ab50d3546b66..f311adeb4853 100644 --- a/drivers/net/wireless/realtek/rtw88/main.h +++ b/drivers/net/wireless/realtek/rtw88/main.h @@ -600,6 +600,7 @@ struct rtw_tx_pkt_info { u8 hw_ssn_sel; bool en_hw_exseq; bool bt_null; + bool no_retry; }; struct rtw_rx_pkt_stat { diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c index c73b9a0903f6..88c57fe46857 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.c +++ b/drivers/net/wireless/realtek/rtw88/tx.c @@ -64,6 +64,11 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) SET_TX_DESC_EN_HWEXSEQ(txdesc, pkt_info->en_hw_exseq); SET_TX_DESC_HW_SSN_SEL(txdesc, pkt_info->hw_ssn_sel); SET_TX_DESC_BT_NULL(txdesc, pkt_info->bt_null); + + if (pkt_info->no_retry) { + SET_TX_DESC_RETRY_LIMIT_ENABLE(txdesc, 1); + SET_TX_DESC_DATA_RETRY_LIMIT(txdesc, 0); + } } EXPORT_SYMBOL(rtw_tx_fill_tx_desc); @@ -374,6 +379,11 @@ void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev, bmc = is_broadcast_ether_addr(hdr->addr1) || is_multicast_ether_addr(hdr->addr1); + if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { + info->flags &= ~IEEE80211_TX_CTL_REQ_TX_STATUS; // no report + pkt_info->no_retry = true; // don't re-tx + } + if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) rtw_tx_report_enable(rtwdev, pkt_info); diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h index e1f5bb3e5743..cc92926ceb70 100644 --- a/drivers/net/wireless/realtek/rtw88/tx.h +++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -65,6 +65,11 @@ le32p_replace_bits((__le32 *)(txdesc) + 0x03, value, GENMASK(7, 6)) #define SET_TX_DESC_BT_NULL(txdesc, value) \ le32p_replace_bits((__le32 *)(txdesc) + 0x02, value, BIT(23)) +#define SET_TX_DESC_RETRY_LIMIT_ENABLE(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x04, value, BIT(17)) +#define SET_TX_DESC_DATA_RETRY_LIMIT(txdesc, value) \ + le32p_replace_bits((__le32 *)(txdesc) + 0x04, value, GENMASK(23, 18)) + enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0, -- 2.39.5