[F/Unstable] [PATCH 3/3] UBUNTU: SAUCE: rtw88: Move driver IQK to set channel before association for 11N chip

Kai-Heng Feng kai.heng.feng at canonical.com
Tue Apr 7 06:05:17 UTC 2020


From: Ping-Ke Shih <pkshih at realtek.com>

BugLink: https://bugs.launchpad.net/bugs/1871300

Originally, driver do IQK after auth/assoc, but it's doing 4-way handshake
if we connect to an AP with WPA2 security. Since 11N chips use software IQK
that causes more than 100ms, so IQK and 4-way handshake can be overlap, then
4-way handshake may be failed. To resolve this issue, move IQK prior to
issue auth.

Change-Id: I019fe3d6cf2cdc6c0454558904bfc5c2f0c7e6ea
Signed-off-by: Ping-Ke Shih <pkshih at realtek.com>
Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
---
 drivers/net/wireless/realtek/rtw88/mac80211.c |  3 ++-
 drivers/net/wireless/realtek/rtw88/main.c     | 10 ++++++++++
 drivers/net/wireless/realtek/rtw88/main.h     |  1 +
 drivers/net/wireless/realtek/rtw88/tx.c       |  5 +++++
 4 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c
index 3c6ae6e6cf51..cd0832e48580 100644
--- a/drivers/net/wireless/realtek/rtw88/mac80211.c
+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c
@@ -347,7 +347,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
 		if (conf->assoc) {
 			rtw_coex_connect_notify(rtwdev, COEX_ASSOCIATE_FINISH);
 			net_type = RTW_NET_MGD_LINKED;
-			chip->ops->phy_calibration(rtwdev);
+			if (!rtw_chip_wcpu_11n(rtwdev))
+				chip->ops->phy_calibration(rtwdev);
 
 			rtwvif->aid = conf->aid;
 			rtw_fw_download_rsvd_page(rtwdev);
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
index 8e2fc205e663..255b0cae4001 100644
--- a/drivers/net/wireless/realtek/rtw88/main.c
+++ b/drivers/net/wireless/realtek/rtw88/main.c
@@ -410,6 +410,16 @@ void rtw_set_channel(struct rtw_dev *rtwdev)
 	}
 
 	rtw_phy_set_tx_power_level(rtwdev, center_chan);
+
+	/* 11N chip uses driver IQK that takes lot of time, so move here
+	 * to avoid interferencing 4 way handshake.
+	 */
+	if (rtw_chip_wcpu_11n(rtwdev) &&
+	    !(hw->conf.flags & IEEE80211_CONF_IDLE) &&
+	    !test_bit(RTW_FLAG_SCANNING, rtwdev->flags) &&
+	    !test_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags)) {
+		rtwdev->need_rfk = true;
+	}
 }
 
 static void rtw_vif_write_addr(struct rtw_dev *rtwdev, u32 start, u8 *addr)
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
index 021fdb41ff4d..935c52db5bf3 100644
--- a/drivers/net/wireless/realtek/rtw88/main.h
+++ b/drivers/net/wireless/realtek/rtw88/main.h
@@ -1762,6 +1762,7 @@ struct rtw_dev {
 	struct rtw_sar sar;
 
 	u32 fix_rate_count;
+	bool need_rfk;
 
 	/* hci related data, must be last */
 	u8 priv[0] __aligned(sizeof(void *));
diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c
index 794d134d2dfe..7e998fd0cb8c 100644
--- a/drivers/net/wireless/realtek/rtw88/tx.c
+++ b/drivers/net/wireless/realtek/rtw88/tx.c
@@ -387,6 +387,11 @@ void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev,
 	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 (rtwdev->need_rfk) {
+			rtwdev->need_rfk = false;
+			chip->ops->phy_calibration(rtwdev);
+		}
 	}
 
 	if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS)
-- 
2.17.1




More information about the kernel-team mailing list