[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