Skip to contentSkip to conversation

wifi: rtw89: correct MLO behavior, fix Coverity issues, and update hardware settings

PATCH In review Ping-Ke Shih 1 participant 17 messages Sep 9 – Sep 16 Realtek wireless driver (rtw89)

lore
Share & tools
lore

Ping-Ke Shih

author maintainer
#0 lore raw

cover wifi: rtw89: correct MLO behavior, fix Coverity issues, and update hardware settings

The first patch is to consider AMSDU off as a factor to lower latency.

Patches 2/15 - 4/15 are to correct MLO behavior.

Patches 5/15 - 8/15 are to fix Coverity issues.

Others are to update firmware format and hardware settings according to firmware development and update from internal driver.

Dian-Syuan Yang (1):
wifi: rtw89: 8922d: update BA cam format to G7

Eric Huang (2):
wifi: rtw89: 8922d: add extra data to PS H2C
wifi: rtw89: phy: correct PHY-1 EDCCA report register access

Ping-Ke Shih (5):
wifi: rtw89: consider sta maximum AMSDU subframes number to decide TX
work waiting
wifi: rtw89: mac: change beamformee CSI direct forward to CMAC_TXDMA
wifi: rtw89: fw: extend ch_info format of hw_scan to v2
wifi: rtw89: 8851b: rfk: set DCK start and delay time
wifi: rtw89: 8852b: update default value for ANA SWR

Po-Hao Huang (3):
wifi: rtw89: mlo: update link id to FW upon connection Revert "wifi: rtw89: fix unable to receive probe responses under MLO
connection"
wifi: rtw89: modify active scan rule for 6GHz band

Zong-Zhe Yang (4):
wifi: rtw89: fix ctrl_sco_cck for Wi-Fi 7
wifi: rtw89: 8852a: prevent potential OOB in ctrl_sco_cck
wifi: rtw89: fw: cmd_ofld_flush always reset counter
wifi: rtw89: explicitly declare TX queue flags by DECLARE_BITMAP()

 drivers/net/wireless/realtek/rtw89/core.c     |  36 ++--
 drivers/net/wireless/realtek/rtw89/core.h     |   8 +-
 drivers/net/wireless/realtek/rtw89/fw.c       | 173 ++++++++++++++++--
 drivers/net/wireless/realtek/rtw89/fw.h       |  49 ++++-
 drivers/net/wireless/realtek/rtw89/mac.c      |   3 +-
 drivers/net/wireless/realtek/rtw89/mac80211.c |   4 +-
 drivers/net/wireless/realtek/rtw89/mac_be.c   |   3 +
 drivers/net/wireless/realtek/rtw89/phy.c      |  25 ++-
 drivers/net/wireless/realtek/rtw89/reg.h      |  22 ++-
 .../realtek/rtw89/rtw8851b_rfk_table.c        |   3 +-
 drivers/net/wireless/realtek/rtw89/rtw8852a.c |   8 +
 drivers/net/wireless/realtek/rtw89/rtw8852b.c |   5 +-
 drivers/net/wireless/realtek/rtw89/rtw8922a.c |   2 +-
 drivers/net/wireless/realtek/rtw89/rtw8922d.c |   8 +-
 14 files changed, 284 insertions(+), 65 deletions(-)

base-commit: f71dd599a98182d6bc34dce39977f928068ecd64

Signature · 1 line
2.25.1
author maintainer
#1 lore raw

PATCH 1/15 wifi: rtw89: consider sta maximum AMSDU subframes number to decide TX work waiting

Consider the sta maximum AMSDU subframes as a factor to set agg_wait to 0 to avoid TX work waiting to yield better latency if real-time application lets AMSDU off by

iw dev wlan0 set tidconf tids 0xff amsdu off

---
 drivers/net/wireless/realtek/rtw89/phy.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/phy.c +12 -1
index 501923d97971..c33b888bc0e3 100644
@@ -3221,6 +3221,17 @@ static void rtw89_phy_set_txpwr_limit_ru_ax(struct rtw89_dev *rtwdev,
 	}
 }
 
+static int get_max_agg_wait(struct ieee80211_link_sta *link_sta, u16 amsdu_len)
+{
+	struct ieee80211_sta *sta = link_sta->sta;
+	int max_agg_wait = amsdu_len / 1500 - 1;
+
+	if (sta->max_amsdu_subframes)
+		max_agg_wait = min(max_agg_wait, sta->max_amsdu_subframes - 1);
+
+	return max_agg_wait;
+}
+
 struct rtw89_phy_iter_ra_data {
 	struct rtw89_dev *rtwdev;
 	struct sk_buff *c2h;
@@ -3345,7 +3356,7 @@ static void __rtw89_phy_c2h_ra_rpt_iter(struct rtw89_sta_link *rtwsta_link,
 		*changed = true;
 	}
 
-	rtwsta_link->max_agg_wait = link_sta->agg.max_rc_amsdu_len / 1500 - 1;
+	rtwsta_link->max_agg_wait = get_max_agg_wait(link_sta, amsdu_len);
 }
 
 static void rtw89_phy_c2h_ra_rpt_iter(void *data, struct ieee80211_sta *sta)
Signature · 1 line
2.25.1
author maintainer
#2 lore raw

Re: [PATCH rtw-next 01/15] wifi: rtw89: consider sta maximum AMSDU subframes number to decide TX work waiting

Quoted 7 lines · Ping-Ke Shih

Consider the sta maximum AMSDU subframes as a factor to set agg_wait to 0 to avoid TX work waiting to yield better latency if real-time application lets AMSDU off by

iw dev wlan0 set tidconf tids 0xff amsdu off

15 patch(es) applied to rtw-next branch of rtw.git, thanks.

eed90f3e4e10 wifi: rtw89: consider sta maximum AMSDU subframes number to decide TX work waiting 134e60644995 wifi: rtw89: mlo: update link id to FW upon connection
de9da54622ba Revert "wifi: rtw89: fix unable to receive probe responses under MLO connection" 0788bad5d012 wifi: rtw89: modify active scan rule for 6GHz band
6c6130c4d53f wifi: rtw89: fix ctrl_sco_cck for Wi-Fi 7
cfa33d16a418 wifi: rtw89: 8852a: prevent potential OOB in ctrl_sco_cck a6e919d1473f wifi: rtw89: fw: cmd_ofld_flush always reset counter
3ed30788192d wifi: rtw89: explicitly declare TX queue flags by DECLARE_BITMAP() 95f4fee98572 wifi: rtw89: 8922d: add extra data to PS H2C
9db72f4caa21 wifi: rtw89: mac: change beamformee CSI direct forward to CMAC_TXDMA 74f50393f3f3 wifi: rtw89: fw: extend ch_info format of hw_scan to v2 31f222ebee23 wifi: rtw89: 8922d: update BA cam format to G7
5a2a6b9e092d wifi: rtw89: 8851b: rfk: set DCK start and delay time
0bd0557aefe6 wifi: rtw89: 8852b: update default value for ANA SWR
6894826d9a51 wifi: rtw89: phy: correct PHY-1 EDCCA report register access

---
https://github.com/pkshih/rtw.git

author maintainer
#3 lore raw

PATCH 2/15 wifi: rtw89: mlo: update link id to FW upon connection

In reply to Ping-Ke Shih

From: Po-Hao Huang <[email protected]>

Update link id to firmware so correct information can be referenced. This is required for the new power save firmware feature. Without this FW could try to maintain power state of a not existing link and leads to unexpected errors.

---
 drivers/net/wireless/realtek/rtw89/fw.c | 6 +++---
 drivers/net/wireless/realtek/rtw89/fw.h | 5 +++++
 2 files changed, 8 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +3 -3
index 6760e0053665..86db025afd7f 100644
@@ -5193,10 +5193,10 @@ int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwv
 				      RTW89_H2C_JOININFO_W1_EMLSR_PADDING) |
 		     le32_encode_bits(IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_256US,
 				      RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY) |
-		     le32_encode_bits(0, RTW89_H2C_JOININFO_W2_MACID_EXT) |
-		     le32_encode_bits(0, RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT);
+		     le32_encode_bits(rtwvif_link->link_id, RTW89_H2C_JOININFO_W1_LINK_ID);
 
-	h2c_v1->w2 = 0;
+	h2c_v1->w2 = le32_encode_bits(0, RTW89_H2C_JOININFO_W2_MACID_EXT) |
+		     le32_encode_bits(0, RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT);
 
 done:
 	rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
drivers/net/wireless/realtek/rtw89/fw.h +5 -0
index f7d017d3ced0..6cb1f6dfb650 100644
@@ -1858,6 +1858,11 @@ struct rtw89_h2c_join_v1 {
 #define RTW89_H2C_JOININFO_W1_INIT_PWR_STATE BIT(15)
 #define RTW89_H2C_JOININFO_W1_EMLSR_PADDING GENMASK(18, 16)
 #define RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY GENMASK(21, 19)
+#define RTW89_H2C_JOININFO_W1_IS_MLD_EXT BIT(22)
+#define RTW89_H2C_JOININFO_W1_SUPPORT_3LINKS BIT(23)
+#define RTW89_H2C_JOININFO_W1_IS_3RD_LINK BIT(24)
+#define RTW89_H2C_JOININFO_W1_LINK_ID GENMASK(28, 25)
+#define RTW89_H2C_JOININFO_W1_UPDATE_MODE GENMASK(31, 29)
 #define RTW89_H2C_JOININFO_W2_MACID_EXT GENMASK(7, 0)
 #define RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT GENMASK(15, 8)
 
Signature · 1 line
2.25.1
author maintainer
#4 lore raw

PATCH 3/15 Revert "wifi: rtw89: fix unable to receive probe responses under MLO connection"

In reply to Ping-Ke Shih

From: Po-Hao Huang <[email protected]>

This reverts commit 6f6d7a325fbde4f025ee1b1277f6f44727e21223.

We no longer require this change after commit 0b0ff976af94 ("wifi: mac80211: accept probe response on link address as well") Previously, the encryption and decryption of MLD connections are not working properly during scan, this could lead to timeout on some applications.

---
 drivers/net/wireless/realtek/rtw89/fw.c | 3 ---
 1 file changed, 3 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +0 -3
index 86db025afd7f..a16127b2c317 100644
@@ -10445,7 +10445,6 @@ int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
 	struct cfg80211_scan_request *req = &scan_req->req;
 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
 						       rtwvif_link->chanctx_idx);
-	struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link);
 	struct rtw89_vif *rtwvif = rtwvif_link->rtwvif;
 	struct rtw89_chanctx_pause_parm pause_parm = {
 		.rsn = RTW89_CHANCTX_PAUSE_REASON_HW_SCAN,
@@ -10478,8 +10477,6 @@ int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
 	if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
 		get_random_mask_addr(mac_addr, req->mac_addr,
 				     req->mac_addr_mask);
-	else if (ieee80211_vif_is_mld(vif))
-		ether_addr_copy(mac_addr, vif->addr);
 	else
 		ether_addr_copy(mac_addr, rtwvif_link->mac_addr);
 
Signature · 1 line
2.25.1
author maintainer
#5 lore raw

PATCH 4/15 wifi: rtw89: modify active scan rule for 6GHz band

In reply to Ping-Ke Shih

From: Po-Hao Huang <[email protected]>

Remove the cancellation of active scan with specific SSID when receiving beacons/probe responses of that SSID. Per IEEE Std 802.11ax 26.17.2.3.3, only active scan of direct BSSID should be cancelled. Previously the cancellation causes hidden AP under same ESS couldn't be found.

---
 drivers/net/wireless/realtek/rtw89/core.c | 12 ------------
 1 file changed, 12 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +0 -12
index 572d9c65a2dd..8ab15ee1b155 100644
@@ -2579,7 +2579,6 @@ static void rtw89_core_cancel_6ghz_probe_tx(struct rtw89_dev *rtwdev,
 	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
 	struct list_head *pkt_list = rtwdev->scan_info.pkt_list;
 	struct rtw89_pktofld_info *info;
-	const u8 *ies = mgmt->u.beacon.variable, *ssid_ie;
 	bool queue_work = false;
 
 	if (rx_status->band != NL80211_BAND_6GHZ)
@@ -2590,21 +2589,10 @@ static void rtw89_core_cancel_6ghz_probe_tx(struct rtw89_dev *rtwdev,
 		return;
 	}
 
-	ssid_ie = cfg80211_find_ie(WLAN_EID_SSID, ies, skb->len);
-
 	list_for_each_entry(info, &pkt_list[NL80211_BAND_6GHZ], list) {
 		if (ether_addr_equal(info->bssid, mgmt->bssid)) {
 			info->cancel = true;
 			queue_work = true;
-			continue;
-		}
-
-		if (!ssid_ie || ssid_ie[1] != info->ssid_len || info->ssid_len == 0)
-			continue;
-
-		if (memcmp(&ssid_ie[2], info->ssid, info->ssid_len) == 0) {
-			info->cancel = true;
-			queue_work = true;
 		}
 	}
 
Signature · 1 line
2.25.1
author maintainer
#6 lore raw

PATCH 5/15 wifi: rtw89: fix ctrl_sco_cck for Wi-Fi 7

In reply to Ping-Ke Shih

From: Zong-Zhe Yang <[email protected]>

Wi-Fi 7 chips have function to control SCO (Symbol Carrier Offset) for CCK. The corresponding valid primary channels are from 1 to 14, i.e. array index is from 0 to 13. So, fix the condition.

Resolve INTEGER_OVERFLOW (Overflowed array index read) reported by Coverity.

---
 drivers/net/wireless/realtek/rtw89/rtw8922a.c | 2 +-
 drivers/net/wireless/realtek/rtw89/rtw8922d.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw89/rtw8922a.c +1 -1
index 2d225e009b28..6402bd4f06aa 100644
@@ -1152,7 +1152,7 @@ static int rtw8922a_ctrl_sco_cck(struct rtw89_dev *rtwdev,
 {
 	u8 ch_element;
 
-	if (primary_ch >= 14)
+	if (primary_ch > 14 || unlikely(primary_ch == 0))
 		return -EINVAL;
 
 	ch_element = primary_ch - 1;
drivers/net/wireless/realtek/rtw89/rtw8922d.c +1 -1
index 75297b39c4d7..89c1f58d0dc0 100644
@@ -1320,7 +1320,7 @@ static int rtw8922d_ctrl_sco_cck(struct rtw89_dev *rtwdev,
 {
 	u8 ch_element;
 
-	if (primary_ch >= 14)
+	if (primary_ch > 14 || unlikely(primary_ch == 0))
 		return -EINVAL;
 
 	ch_element = primary_ch - 1;
Signature · 1 line
2.25.1
author maintainer
#7 lore raw

PATCH 6/15 wifi: rtw89: 8852a: prevent potential OOB in ctrl_sco_cck

In reply to Ping-Ke Shih

From: Zong-Zhe Yang <[email protected]>

The array size is 14. Add a check to avoid out-of-bound access. Although it doesn't seem to happen if everything follows spec., it might have potential problem in pure logic.

Resolve OVERRUN (Out-of-bounds access) reported by Coverity.

---
 drivers/net/wireless/realtek/rtw89/rtw8852a.c | 8 ++++++++
 1 file changed, 8 insertions(+)
drivers/net/wireless/realtek/rtw89/rtw8852a.c +8 -0
index 5d7b5d1a24b1..4b364f039464 100644
@@ -945,6 +945,14 @@ static int rtw8852a_ctrl_sco_cck(struct rtw89_dev *rtwdev, u8 central_ch,
 		rtw89_warn(rtwdev, "Invalid BW:%d for CCK\n", bw);
 		return -EINVAL;
 	}
+
+	if (unlikely(ch_element >= 14)) {
+		rtw89_warn(rtwdev,
+			   "Invalid ch_element:%u where central_ch %u primary_ch %u\n",
+			   ch_element, central_ch, primary_ch);
+		return -EINVAL;
+	}
+
 	rtw89_phy_write32_mask(rtwdev, R_RXSCOBC, B_RXSCOBC_TH,
 			       rtw8852a_sco_barker_threshold[ch_element]);
 	rtw89_phy_write32_mask(rtwdev, R_RXSCOCCK, B_RXSCOCCK_TH,
Signature · 1 line
2.25.1
author maintainer
#8 lore raw

PATCH 7/15 wifi: rtw89: fw: cmd_ofld_flush always reset counter

In reply to Ping-Ke Shih

From: Zong-Zhe Yang <[email protected]>

Callers expect cmd offload counter is reset after flushing, and then use counter++ with array index. Previously, it might cause OOB since cmd_ofld_flush gets an error, e.g out of memory, and does not reset the cmd offload counter. Fix cmd_ofld_flush to always reset it.

Resolve OVERRUN (Out-of-bounds write) reported by Coverity. Pass info to cmd_ofld_flush to make Coverity aware the changes on cmd offload counter.

---
 drivers/net/wireless/realtek/rtw89/fw.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +7 -6
index a16127b2c317..dcbdf4b5e4b2 100644
@@ -12643,9 +12643,9 @@ static int rtw89_fw_cmd_ofld_pack(struct rtw89_dev *rtwdev)
 	return 0;
 }
 
-static void rtw89_fw_cmd_ofld_flush(struct rtw89_dev *rtwdev)
+static void rtw89_fw_cmd_ofld_flush(struct rtw89_dev *rtwdev,
+				    struct rtw89_fw_cmd_ofld_info *info)
 {
-	struct rtw89_fw_cmd_ofld_info *info = rtwdev->fw_cmd_ofld_info;
 	struct sk_buff *skb;
 	int ret;
 	u32 len;
@@ -12654,7 +12654,7 @@ static void rtw89_fw_cmd_ofld_flush(struct rtw89_dev *rtwdev)
 	skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len);
 	if (!skb) {
 		rtw89_err(rtwdev, "alloc skb fail\n");
-		return;
+		goto out;
 	}
 
 	skb_put_data(skb, info->cmds, len);
@@ -12669,12 +12669,13 @@ static void rtw89_fw_cmd_ofld_flush(struct rtw89_dev *rtwdev)
 	if (ret) {
 		rtw89_err(rtwdev, "failed to send cmd ofld\n");
 		dev_kfree_skb_any(skb);
-		return;
+		goto out;
 	}
 
 	if (info->accu_delay)
 		fsleep(info->accu_delay);
 
+out:
 	info->cnt = 0;
 	info->accu_delay = 0;
 }
@@ -12694,7 +12695,7 @@ static int rtw89_fw_cmd_ofld_unpack(struct rtw89_dev *rtwdev)
 	if (info->cnt == 0)
 		return 0;
 
-	rtw89_fw_cmd_ofld_flush(rtwdev);
+	rtw89_fw_cmd_ofld_flush(rtwdev, info);
 
 	return 0;
 }
@@ -12721,7 +12722,7 @@ static int rtw89_fw_cmd_ofld_enqueue(struct rtw89_dev *rtwdev,
 		return -EFAULT;
 
 	if (info->cnt >= ARRAY_SIZE(info->cmds))
-		rtw89_fw_cmd_ofld_flush(rtwdev);
+		rtw89_fw_cmd_ofld_flush(rtwdev, info);
 
 	h2c = &info->cmds[info->cnt++];
 
Signature · 1 line
2.25.1
author maintainer
#9 lore raw

PATCH 8/15 wifi: rtw89: explicitly declare TX queue flags by DECLARE_BITMAP()

In reply to Ping-Ke Shih

From: Zong-Zhe Yang <[email protected]>

Originally, TX queue flags was declared by pure unsigned long but was used with bitops, e.g. test_bit. Although for now, there are not much cases in enum rtw89_txq_flags to be over than bits that one long can deal with, it indeed missed logical boundary check. Refine it to be declared by DECLARE_BITMAP().

Resolve ARRAY_VS_SINGLETON (Out-of-bounds access) reported by Coverity.

(doesn't change logic)

---
 drivers/net/wireless/realtek/rtw89/core.c     | 24 +++++++++----------
 drivers/net/wireless/realtek/rtw89/core.h     |  5 +++-
 drivers/net/wireless/realtek/rtw89/mac80211.c |  4 ++--
 3 files changed, 18 insertions(+), 15 deletions(-)
drivers/net/wireless/realtek/rtw89/core.c +12 -12
index 8ab15ee1b155..b074b3677c43 100644
@@ -4625,7 +4625,7 @@ static void rtw89_core_ba_work(struct work_struct *work)
 				    "failed to setup BA session for %pM:%2d: %d\n",
 				    sta->addr, tid, ret);
 			if (ret == -EINVAL)
-				set_bit(RTW89_TXQ_F_BLOCK_BA, &rtwtxq->flags);
+				set_bit(RTW89_TXQ_F_BLOCK_BA, rtwtxq->flags);
 		}
 skip_ba_work:
 		list_del_init(&rtwtxq->list);
@@ -4658,7 +4658,7 @@ void rtw89_core_free_sta_pending_forbid_ba(struct rtw89_dev *rtwdev,
 		struct ieee80211_txq *txq = rtw89_txq_to_txq(rtwtxq);
 
 		if (sta == txq->sta) {
-			clear_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags);
+			clear_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags);
 			list_del_init(&rtwtxq->list);
 		}
 	}
@@ -4685,12 +4685,12 @@ static void rtw89_core_stop_tx_ba_session(struct rtw89_dev *rtwdev,
 	if (unlikely(!rtwsta) || unlikely(rtwsta->disassoc))
 		return;
 
-	if (!test_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags) ||
-	    test_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags))
+	if (!test_bit(RTW89_TXQ_F_AMPDU, rtwtxq->flags) ||
+	    test_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags))
 		return;
 
 	spin_lock_bh(&rtwdev->ba_lock);
-	if (!test_and_set_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags))
+	if (!test_and_set_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags))
 		list_add_tail(&rtwtxq->list, &rtwdev->forbid_ba_list);
 	spin_unlock_bh(&rtwdev->ba_lock);
 
@@ -4709,7 +4709,7 @@ static void rtw89_core_txq_check_agg(struct rtw89_dev *rtwdev,
 	struct ieee80211_sta *sta = txq->sta;
 	struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
 
-	if (test_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags))
+	if (test_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags))
 		return;
 
 	if (unlikely(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
@@ -4720,10 +4720,10 @@ static void rtw89_core_txq_check_agg(struct rtw89_dev *rtwdev,
 	if (unlikely(!sta))
 		return;
 
-	if (unlikely(test_bit(RTW89_TXQ_F_BLOCK_BA, &rtwtxq->flags)))
+	if (unlikely(test_bit(RTW89_TXQ_F_BLOCK_BA, rtwtxq->flags)))
 		return;
 
-	if (test_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags)) {
+	if (test_bit(RTW89_TXQ_F_AMPDU, rtwtxq->flags)) {
 		IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_AMPDU;
 		return;
 	}
@@ -4901,7 +4901,7 @@ static void rtw89_forbid_ba_work(struct work_struct *w)
 
 	spin_lock_bh(&rtwdev->ba_lock);
 	list_for_each_entry_safe(rtwtxq, tmp, &rtwdev->forbid_ba_list, list) {
-		clear_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags);
+		clear_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags);
 		list_del_init(&rtwtxq->list);
 	}
 	spin_unlock_bh(&rtwdev->ba_lock);
@@ -6036,13 +6036,13 @@ static void _rtw89_core_set_tid_config(struct rtw89_dev *rtwdev,
 
 		if (mask & BIT(NL80211_TID_CONFIG_ATTR_AMPDU_CTRL)) {
 			if (tid_conf->ampdu == NL80211_TID_CONFIG_ENABLE) {
-				clear_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags);
+				clear_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags);
 			} else {
-				if (test_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags))
+				if (test_bit(RTW89_TXQ_F_AMPDU, rtwtxq->flags))
 					ieee80211_stop_tx_ba_session(sta, txq->tid);
 				spin_lock_bh(&rtwdev->ba_lock);
 				list_del_init(&rtwtxq->list);
-				set_bit(RTW89_TXQ_F_FORBID_BA, &rtwtxq->flags);
+				set_bit(RTW89_TXQ_F_FORBID_BA, rtwtxq->flags);
 				spin_unlock_bh(&rtwdev->ba_lock);
 			}
 		}
drivers/net/wireless/realtek/rtw89/core.h +4 -1
index c300d15581fc..d725124b39bf 100644
@@ -244,6 +244,8 @@ enum rtw89_txq_flags {
 	RTW89_TXQ_F_AMPDU		= 0,
 	RTW89_TXQ_F_BLOCK_BA		= 1,
 	RTW89_TXQ_F_FORBID_BA		= 2,
+
+	NUM_OF_RTW89_TXQ_FLAGS,
 };
 
 enum rtw89_net_type {
@@ -1313,8 +1315,9 @@ struct rtw89_core_tx_request {
 
 struct rtw89_txq {
 	struct list_head list;
-	unsigned long flags;
 	int wait_cnt;
+
+	DECLARE_BITMAP(flags, NUM_OF_RTW89_TXQ_FLAGS);
 };
 
 struct rtw89_mac_ax_gnt {
drivers/net/wireless/realtek/rtw89/mac80211.c +2 -2
index c1be69a3c192..cf356a54d91c 100644
@@ -1043,7 +1043,7 @@ static int rtw89_ops_ampdu_action(struct ieee80211_hw *hw,
 	case IEEE80211_AMPDU_TX_STOP_CONT:
 	case IEEE80211_AMPDU_TX_STOP_FLUSH:
 	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
-		clear_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags);
+		clear_bit(RTW89_TXQ_F_AMPDU, rtwtxq->flags);
 		clear_bit(tid, rtwsta->ampdu_map);
 		rtw89_chip_h2c_ampdu_cmac_tbl(rtwdev, rtwvif, rtwsta);
 		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
@@ -1051,7 +1051,7 @@ static int rtw89_ops_ampdu_action(struct ieee80211_hw *hw,
 		rtw89_phy_ra_recalc_agg_limit(rtwdev);
 		break;
 	case IEEE80211_AMPDU_TX_OPERATIONAL:
-		set_bit(RTW89_TXQ_F_AMPDU, &rtwtxq->flags);
+		set_bit(RTW89_TXQ_F_AMPDU, rtwtxq->flags);
 		rtwsta->ampdu_params[tid].agg_num = params->buf_size;
 		rtwsta->ampdu_params[tid].amsdu = params->amsdu;
 		set_bit(tid, rtwsta->ampdu_map);
Signature · 1 line
2.25.1
author maintainer
#10 lore raw

PATCH 9/15 wifi: rtw89: 8922d: add extra data to PS H2C

In reply to Ping-Ke Shih

From: Eric Huang <[email protected]>

Append 2GHz regulatory mode and per-link BSS color to LPS multi-link H2C to assist firmware backup and restore the settings.

---
 drivers/net/wireless/realtek/rtw89/core.h |  1 +
 drivers/net/wireless/realtek/rtw89/fw.c   | 44 +++++++++++++++++++++--
 drivers/net/wireless/realtek/rtw89/fw.h   | 17 +++++++++
 3 files changed, 60 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
index d725124b39bf..e88942c469e4 100644
@@ -6023,6 +6023,7 @@ enum rtw89_fw_feature {
 	RTW89_FW_FEATURE_SER_L1_BY_EVENT,
 	RTW89_FW_FEATURE_SIM_SER_L0L1_BY_HALT_H2C,
 	RTW89_FW_FEATURE_LPS_ML_INFO_V1,
+	RTW89_FW_FEATURE_LPS_ML_INFO_V1_EXTRA,
 	RTW89_FW_FEATURE_SER_POST_RECOVER_DMAC,
 	RTW89_FW_FEATURE_TX_HISTORY_V1,
 
drivers/net/wireless/realtek/rtw89/fw.c +42 -2

81 lines not on this page · raw message

drivers/net/wireless/realtek/rtw89/fw.h +17 -0
index 6cb1f6dfb650..d1bd82788376 100644
@@ -2091,6 +2091,16 @@ struct rtw89_bb_link_info_rx_gain {
 	u8 wb_g_elna[RTW89_BB_PS_LINK_RX_GAIN_TAB_MAX][BB_GT2_G_ELNA_NUM];
 } __packed;
 
+enum rtw89_bb_regulation_mode {
+	RTW89_BB_REGULATION_FCC = 0,
+	RTW89_BB_REGULATION_CE = 1,
+};
+
+enum rtw89_h2c_lps_ml_cmn_info_fmt_id {
+	RTW89_H2C_LPS_ML_CMN_INFO_FMT_ID_V1 = 0x20,
+	RTW89_H2C_LPS_ML_CMN_INFO_FMT_ID_V1_EXTRA = 0x21,
+};
+
 struct rtw89_h2c_lps_ml_cmn_info_v1 {
 	u8 fmt_id;
 	u8 rfe_type;
@@ -2106,6 +2116,13 @@ struct rtw89_h2c_lps_ml_cmn_info_v1 {
 	struct rtw89_bb_link_info_rx_gain rx_gain[RTW89_BB_PS_LINK_BUF_MAX];
 } __packed;
 
+struct rtw89_h2c_lps_ml_cmn_info_v1_extra {
+	struct rtw89_h2c_lps_ml_cmn_info_v1 v1;
+	u8 regu_mode_on_24g;
+	u8 bss_color[RTW89_BB_PS_LINK_BUF_MAX];
+	u8 rsvd[2];
+} __packed;
+
 struct rtw89_h2c_phy_rfe_type {
 	u8 rfe_type;
 	u8 rsvd[3];
Signature · 1 line
2.25.1
author maintainer
#11 lore raw

PATCH 10/15 wifi: rtw89: mac: change beamformee CSI direct forward to CMAC_TXDMA

In reply to Ping-Ke Shih

Set R_BE_RESP_MODE register when initializing beamformee to makes CSI RX state machine enter initial state, and enables received beamformee CSI to be directly forwarded to CMAC_TXDMA via hardware shortcut path.

---
 drivers/net/wireless/realtek/rtw89/mac_be.c |  3 +++
 drivers/net/wireless/realtek/rtw89/reg.h    | 20 ++++++++++++++++++++
 2 files changed, 23 insertions(+)
drivers/net/wireless/realtek/rtw89/mac_be.c +3 -0
index c8f343c8d545..fa35cafd7074 100644
@@ -2786,6 +2786,9 @@ static int rtw89_mac_init_bfee_be(struct rtw89_dev *rtwdev, u8 mac_idx)
 				       B_BE_CSIPRT_HESU_AID_EN |
 				       B_BE_CSIPRT_EHTSU_AID_EN);
 
+	reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RESP_MODE, mac_idx);
+	rtw89_write32_set(rtwdev, reg, B_BE_INIT_CLEAR_RX_STATE | B_BE_SHORT_CUT_MODE);
+
 	reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_RRSC, mac_idx);
 	rtw89_write32(rtwdev, reg, CSI_RRSC_BMAP_BE);
 
drivers/net/wireless/realtek/rtw89/reg.h +20 -0
index 4291e8115f10..e85af8713777 100644
@@ -8373,6 +8373,26 @@
 #define B_BE_CSI_RESERVED_PAGE_NUM_MASK GENMASK(27, 16)
 #define B_BE_CSI_RESERVED_START_PAGE_MASK GENMASK(11, 0)
 
+#define R_BE_RESP_MODE 0x11814
+#define R_BE_RESP_MODE_C1 0x15814
+#define B_BE_LMR_MASK_PRE_ENQ BIT(27)
+#define B_BE_LMR_INIT_CLEAR_RX_STATE BIT(26)
+#define B_BE_LMR_SHORT_CUT_MODE BIT(25)
+#define B_BE_LMR_IMMED_ENQ_MODE BIT(24)
+#define B_BE_CLEAR_SMR_SEG_TBL BIT(19)
+#define B_BE_CLEAR_FTM_SEG_TBL BIT(18)
+#define B_BE_CLEAR_CSI_SEG_TBL BIT(17)
+#define B_BE_CLEAR_CSI_RESP_TBL BIT(16)
+#define B_BE_SMR_MASK_PRE_ENQ BIT(12)
+#define B_BE_SMR_DELAY_IMMED_ENQ_MODE BIT(11)
+#define B_BE_SMR_INIT_CLEAR_RX_STATE BIT(10)
+#define B_BE_SMR_SHORT_CUT_MODE BIT(9)
+#define B_BE_SMR_IMMED_ENQ_MODE BIT(8)
+#define B_BE_CSI_MASK_PRE_ENQ BIT(3)
+#define B_BE_INIT_CLEAR_RX_STATE BIT(2)
+#define B_BE_SHORT_CUT_MODE BIT(1)
+#define B_BE_IMMED_ENQ_MODE BIT(0)
+
 #define R_BE_RESP_IMR1 0x11878
 #define R_BE_RESP_IMR1_C1 0x15878
 #define B_BE_RESP_IMR_1_MASK GENMASK(31, 9)
Signature · 1 line
2.25.1
author maintainer
#12 lore raw

PATCH 11/15 wifi: rtw89: fw: extend ch_info format of hw_scan to v2

In reply to Ping-Ke Shih

The new format of ch_info is extended from 8 words to 9 words to have additional control probe delay on 6GHz band, but not implement these fields for now.

---
 drivers/net/wireless/realtek/rtw89/core.h |  1 +
 drivers/net/wireless/realtek/rtw89/fw.c   | 27 +++++++++++++++++++----
 drivers/net/wireless/realtek/rtw89/fw.h   |  6 ++++-
 3 files changed, 29 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
index e88942c469e4..3caef61b21d3 100644
@@ -6011,6 +6011,7 @@ enum rtw89_fw_feature {
 	RTW89_FW_FEATURE_NO_WOW_CPU_IO_RX,
 	RTW89_FW_FEATURE_NOTIFY_AP_INFO,
 	RTW89_FW_FEATURE_CH_INFO_BE_V0,
+	RTW89_FW_FEATURE_CH_INFO_BE_V1,
 	RTW89_FW_FEATURE_LPS_CH_INFO,
 	RTW89_FW_FEATURE_NO_PHYCAP_P1,
 	RTW89_FW_FEATURE_NO_POWER_DIFFERENCE,
drivers/net/wireless/realtek/rtw89/fw.c +23 -4
index 300686ed0f6e..9eaace2d57c4 100644
@@ -967,6 +967,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
 	__CFG_FW_FEAT(RTL8922A, ge, 0, 35, 108, 0, SIM_SER_L0L1_BY_HALT_H2C),
 	__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 109, 1, SCAN_OFFLOAD_BE_V1),
 	__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 113, 2, SCAN_OFFLOAD_BE_V2),
+	__CFG_FW_FEAT(RTL8922A, lt, 0, 35, 119, 0, CH_INFO_BE_V1),
 	__CFG_FW_FEAT(RTL8922D, ge, 0, 0, 0, 0, MACID_PAUSE_SLEEP),
 	__CFG_FW_FEAT(RTL8922D, ge, 0, 35, 75, 2, SCAN_OFFLOAD),
 	__CFG_FW_FEAT(RTL8922D, ge, 0, 35, 75, 2, BEACON_FILTER),
@@ -984,6 +985,7 @@ static const struct __fw_feat_cfg fw_feat_tbl[] = {
 	__CFG_FW_FEAT(RTL8922D, lt, 0, 35, 113, 0, RFK_TXIQK_V0),
 	__CFG_FW_FEAT(RTL8922D, lt, 0, 35, 113, 2, SCAN_OFFLOAD_BE_V2),
 	__CFG_FW_FEAT(RTL8922D, ge, 0, 35, 119, 0, LPS_ML_INFO_V1_EXTRA),
+	__CFG_FW_FEAT(RTL8922D, lt, 0, 35, 119, 0, CH_INFO_BE_V1),
 };
 
 static void rtw89_fw_iterate_feature_cfg(struct rtw89_fw_info *fw,
@@ -7615,24 +7617,34 @@ int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
 	struct rtw89_h2c_chinfo_elem_be *elem;
 	struct rtw89_mac_chinfo_be *ch_info;
 	struct rtw89_h2c_chinfo_be *h2c;
+	u8 elem_size = sizeof(*elem);
 	bool wildcard_by_drv;
 	struct sk_buff *skb;
 	unsigned int cond;
 	u8 ver = U8_MAX;
+	int used_len;
 	int skb_len;
 	int ret;
 
 	static_assert(sizeof(*elem) == RTW89_MAC_CHINFO_SIZE_BE);
 
 	skb_len = struct_size(h2c, elem, ch_num);
+	used_len = skb_len;
 	skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, skb_len);
 	if (!skb) {
 		rtw89_err(rtwdev, "failed to alloc skb for h2c scan list\n");
 		return -ENOMEM;
 	}
 
-	if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V0, &rtwdev->fw))
+	if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V0, &rtwdev->fw)) {
 		ver = 0;
+		elem_size = offsetofend(typeof(*elem), w7);
+		used_len = sizeof(*h2c) + elem_size * ch_num;
+	} else if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V1, &rtwdev->fw)) {
+		ver = 1;
+		elem_size = offsetofend(typeof(*elem), w7);
+		used_len = sizeof(*h2c) + elem_size * ch_num;
+	}
 
 	wildcard_by_drv = !(RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V0, &rtwdev->fw) ||
 			    RTW89_CHK_FW_FEATURE(SCAN_OFFLOAD_BE_V1, &rtwdev->fw) ||
@@ -7642,14 +7654,14 @@ int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
 	h2c = (struct rtw89_h2c_chinfo_be *)skb->data;
 
 	h2c->ch_num = ch_num;
-	h2c->elem_size = sizeof(*elem) / 4; /* in unit of 4 bytes */
+	h2c->elem_size = elem_size / 4; /* in unit of 4 bytes */
 	h2c->arg = u8_encode_bits(rtwvif_link->mac_idx,
 				  RTW89_H2C_CHINFO_ARG_MAC_IDX_MASK);
 
 	list_for_each_entry(ch_info, chan_list, list) {
 		bool with_probe_id = ch_info->probe_id != RTW89_SCANOFLD_PKT_NONE;
 
-		elem = (struct rtw89_h2c_chinfo_elem_be *)skb_put(skb, sizeof(*elem));
+		elem = (struct rtw89_h2c_chinfo_elem_be *)skb_put(skb, elem_size);
 
 		elem->w0 = le32_encode_bits(ch_info->dwell_time, RTW89_H2C_CHINFO_BE_W0_DWELL) |
 			   le32_encode_bits(ch_info->central_ch,
@@ -7704,11 +7716,16 @@ int rtw89_fw_h2c_scan_list_offload_be(struct rtw89_dev *rtwdev, int ch_num,
 		else
 			elem->w7 = le32_encode_bits(ch_info->period,
 						    RTW89_H2C_CHINFO_BE_W7_PERIOD_V1);
+
+		if (ver < 2)
+			continue;
+
+		elem->w8 = 0;
 	}
 
 	rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C,
 			      H2C_CAT_MAC, H2C_CL_MAC_FW_OFLD,
-			      H2C_FUNC_ADD_SCANOFLD_CH, 1, 1, skb_len);
+			      H2C_FUNC_ADD_SCANOFLD_CH, 1, 1, used_len);
 
 	cond = RTW89_SCANOFLD_WAIT_COND_ADD_CH;
 
@@ -7929,6 +7946,8 @@ int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
 
 	if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V0, &rtwdev->fw))
 		ver = 0;
+	else if (RTW89_CHK_FW_FEATURE(CH_INFO_BE_V1, &rtwdev->fw))
+		ver = 1;
 
 	h2c->w0 = le32_encode_bits(option->operation, RTW89_H2C_SCANOFLD_BE_W0_OP) |
 		  le32_encode_bits(option->scan_mode,
drivers/net/wireless/realtek/rtw89/fw.h +5 -1
index d1bd82788376..d64435ffbf78 100644
@@ -342,7 +342,7 @@ struct rtw89_fw_macid_pause_sleep_grp {
 #define RTW89_SCANOFLD_DEBUG_MASK 0x1F
 #define RTW89_CHAN_INVALID 0xFF
 #define RTW89_MAC_CHINFO_SIZE 28
-#define RTW89_MAC_CHINFO_SIZE_BE 32
+#define RTW89_MAC_CHINFO_SIZE_BE 36
 #define RTW89_SCAN_LIST_GUARD 4
 #define RTW89_SCAN_LIST_LIMIT(size) \
 		((RTW89_H2C_MAX_SIZE / (size)) - RTW89_SCAN_LIST_GUARD)
@@ -3009,6 +3009,7 @@ struct rtw89_h2c_chinfo_elem_be {
 	__le32 w5;
 	__le32 w6;
 	__le32 w7;
+	__le32 w8; /* after CH_INFO_BE_V1 */
 } __packed;
 
 #define RTW89_H2C_CHINFO_BE_W0_PERIOD GENMASK(7, 0)
@@ -3041,6 +3042,9 @@ struct rtw89_h2c_chinfo_elem_be {
 #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_SHORTSSIDS GENMASK(15, 0)
 #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_BSSIDS GENMASK(31, 16)
 #define RTW89_H2C_CHINFO_BE_W7_PERIOD_V1 GENMASK(15, 0)
+#define RTW89_H2C_CHINFO_BE_W7_SSIDS_IGN_DELAY_V2 GENMASK(31, 16)
+#define RTW89_H2C_CHINFO_BE_W8_SHORTSSIDS_IGN_DELAY_V2 GENMASK(15, 0)
+#define RTW89_H2C_CHINFO_BE_W8_BSSIDS_IGN_DELAY_V2 GENMASK(31, 16)
 
 struct rtw89_h2c_chinfo {
 	u8 ch_num;
Signature · 1 line
2.25.1
author maintainer
#13 lore raw

PATCH 12/15 wifi: rtw89: 8922d: update BA cam format to G7

In reply to Ping-Ke Shih

From: Dian-Syuan Yang <[email protected]>

Initially, Wi-Fi 7 chips utilized the V1 format, but the 8922DE is expected to use the G7 format. This format differs from V1 into that STD_ENTRY_EN, BAND_SEL, and MLD_EN are moved into W0, and MACID is widened to 10-bit and relocated to W1.

---
 drivers/net/wireless/realtek/rtw89/core.h     |  1 +
 drivers/net/wireless/realtek/rtw89/fw.c       | 80 +++++++++++++++++++
 drivers/net/wireless/realtek/rtw89/fw.h       | 21 +++++
 drivers/net/wireless/realtek/rtw89/mac.c      |  3 +-
 drivers/net/wireless/realtek/rtw89/rtw8922d.c |  4 +-
 5 files changed, 106 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/core.h +1 -0
index 3caef61b21d3..2e6d1be3a751 100644
@@ -212,6 +212,7 @@ enum rtw89_cv {
 enum rtw89_bacam_ver {
 	RTW89_BACAM_V0,
 	RTW89_BACAM_V1,
+	RTW89_BACAM_G7,
 
 	RTW89_BACAM_V0_EXT = 99,
 };
drivers/net/wireless/realtek/rtw89/fw.c +80 -0

86 lines not on this page · raw message

drivers/net/wireless/realtek/rtw89/fw.h +21 -0
index d64435ffbf78..a15a5967cabc 100644
@@ -1956,6 +1956,23 @@ struct rtw89_h2c_ba_cam_v1 {
 #define RTW89_H2C_BA_CAM_V1_W1_MLD_EN BIT(10)
 #define RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK GENMASK(31, 24)
 
+struct rtw89_h2c_ba_cam_g7 {
+	__le32 w0;
+	__le32 w1;
+} __packed;
+
+#define RTW89_H2C_BA_CAM_G7_W0_VALID BIT(0)
+#define RTW89_H2C_BA_CAM_G7_W0_INIT_REQ	BIT(1)
+#define RTW89_H2C_BA_CAM_G7_W0_TID_MASK	GENMASK(7, 4)
+#define RTW89_H2C_BA_CAM_G7_W0_STD_ENTRY_EN BIT(8)
+#define RTW89_H2C_BA_CAM_G7_W0_BAND_SEL	BIT(9)
+#define RTW89_H2C_BA_CAM_G7_W0_MLD_EN BIT(10)
+#define RTW89_H2C_BA_CAM_G7_W0_BMAP_SIZE_MASK GENMASK(19, 16)
+#define RTW89_H2C_BA_CAM_G7_W0_SSN_MASK	GENMASK(31, 20)
+#define RTW89_H2C_BA_CAM_G7_W1_UID_VALUE_MASK GENMASK(7, 0)
+#define RTW89_H2C_BA_CAM_G7_W1_MACID_MASK GENMASK(17, 8)
+#define RTW89_H2C_BA_CAM_G7_W1_ENTRY_IDX_MASK GENMASK(31, 24)
+
 struct rtw89_h2c_ba_cam_init {
 	__le32 w0;
 } __packed;
@@ -5584,6 +5601,10 @@ int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
 			   struct rtw89_vif_link *rtwvif_link,
 			   struct rtw89_sta_link *rtwsta_link,
 			   bool valid, struct ieee80211_ampdu_params *params);
+int rtw89_fw_h2c_ba_cam_g7(struct rtw89_dev *rtwdev,
+			   struct rtw89_vif_link *rtwvif_link,
+			   struct rtw89_sta_link *rtwsta_link,
+			   bool valid, struct ieee80211_ampdu_params *params);
 void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev);
 int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
 				   u8 offset, u8 mac_idx);
drivers/net/wireless/realtek/rtw89/mac.c +2 -1
index df396fbfca26..093291e8854d 100644
@@ -4087,7 +4087,8 @@ static int rtw89_mac_feat_init(struct rtw89_dev *rtwdev)
 	const struct rtw89_chip_info *chip = rtwdev->chip;
 	u8 users, offset;
 
-	if (chip->bacam_ver != RTW89_BACAM_V1)
+	if (!(chip->bacam_ver == RTW89_BACAM_V1 ||
+	      chip->bacam_ver == RTW89_BACAM_G7))
 		return 0;
 
 	offset = 0;
drivers/net/wireless/realtek/rtw89/rtw8922d.c +2 -2
index 89c1f58d0dc0..2325e646c487 100644
@@ -3712,7 +3712,7 @@ static const struct rtw89_chip_ops rtw8922d_chip_ops = {
 	.h2c_punctured_cmac_tbl	= rtw89_fw_h2c_punctured_cmac_tbl_be,
 	.h2c_default_dmac_tbl	= rtw89_fw_h2c_default_dmac_tbl_v3,
 	.h2c_update_beacon	= rtw89_fw_h2c_update_beacon_be,
-	.h2c_ba_cam		= rtw89_fw_h2c_ba_cam_v1,
+	.h2c_ba_cam		= rtw89_fw_h2c_ba_cam_g7,
 	.h2c_wow_cam_update	= rtw89_fw_h2c_wow_cam_update_v1,
 
 	.btc_set_rfe		= rtw8922d_btc_set_rfe,
@@ -3807,7 +3807,7 @@ const struct rtw89_chip_info rtw8922d_chip_info = {
 	.scam_num		= 32,
 	.bacam_num		= 24,
 	.bacam_dynamic_num	= 8,
-	.bacam_ver		= RTW89_BACAM_V1,
+	.bacam_ver		= RTW89_BACAM_G7,
 	.addrcam_ver		= 1,
 	.ppdu_max_usr		= 16,
 	.sec_ctrl_efuse_size	= 4,
Signature · 1 line
2.25.1
author maintainer
#14 lore raw

PATCH 13/15 wifi: rtw89: 8851b: rfk: set DCK start and delay time

In reply to Ping-Ke Shih

Modify the DCK delay time and add the TSSI TX start time to bring more accurate TSSI detection, which helps thermal tracking to compensate output power correctly.

---
 drivers/net/wireless/realtek/rtw89/rtw8851b_rfk_table.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/rtw8851b_rfk_table.c +2 -1
index c5f70c045692..beae5749d07d 100644
@@ -272,7 +272,8 @@ static const struct rtw89_reg5_def rtw8851b_tssi_dck_defs_a[] = {
 	RTW89_DECL_RFK_WM(0x5814, 0x00002000, 0x1),
 	RTW89_DECL_RFK_WM(0x5814, 0x00004000, 0x1),
 	RTW89_DECL_RFK_WM(0x5814, 0x00038000, 0x3),
-	RTW89_DECL_RFK_WM(0x5814, 0x003c0000, 0x5),
+	RTW89_DECL_RFK_WM(0x0620, 0x00003f00, 0x17),
+	RTW89_DECL_RFK_WM(0x5814, 0x003c0000, 0x7),
 	RTW89_DECL_RFK_WM(0x5814, 0x18000000, 0x0),
 };
 
Signature · 1 line
2.25.1
author maintainer
#15 lore raw

PATCH 14/15 wifi: rtw89: 8852b: update default value for ANA SWR

In reply to Ping-Ke Shih

The RTL8852BE randomly card drops on certain platforms. Adjust ANA_SWR behavior by compensation parameters to stabilize the switching regulator output to prevent unwanted drop.

---
 drivers/net/wireless/realtek/rtw89/reg.h      | 2 +-
 drivers/net/wireless/realtek/rtw89/rtw8852b.c | 5 +----
 2 files changed, 2 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtw89/reg.h +1 -1
index e85af8713777..11b30be8f880 100644
@@ -265,7 +265,7 @@
 #define R_AX_SPSANA_ON_CTRL1 0x0224
 
 #define R_AX_SPS_ANA_ON_CTRL2 0x0228
-#define RTL8852B_RFE_05_SPS_ANA 0x4A82
+#define RTL8852B_DEFAULT_SPS_ANA 0x4F42
 
 #define R_AX_WLAN_XTAL_SI_CTRL 0x0270
 #define B_AX_WL_XTAL_SI_CMD_POLL BIT(31)
drivers/net/wireless/realtek/rtw89/rtw8852b.c +1 -4
index 356623341f65..c3c53a6b8119 100644
@@ -355,10 +355,7 @@ static const u8 rtw89_btc_8852b_bt_rssi_thres[BTC_BT_RSSI_THMAX] = {50, 40, 30,
 
 static void rtw8852b_pwr_sps_ana(struct rtw89_dev *rtwdev)
 {
-	struct rtw89_efuse *efuse = &rtwdev->efuse;
-
-	if (efuse->rfe_type == 0x5)
-		rtw89_write16(rtwdev, R_AX_SPS_ANA_ON_CTRL2, RTL8852B_RFE_05_SPS_ANA);
+	rtw89_write16(rtwdev, R_AX_SPS_ANA_ON_CTRL2, RTL8852B_DEFAULT_SPS_ANA);
 }
 
 static void rtw8852b_pwr_sps_dig_off(struct rtw89_dev *rtwdev)
Signature · 1 line
2.25.1
author maintainer
#16 lore raw

PATCH 15/15 wifi: rtw89: phy: correct PHY-1 EDCCA report register access

In reply to Ping-Ke Shih

From: Eric Huang <[email protected]>

RTL8922D fills the PHY-1 rpt_b entry with the address of rpt_a.

The report select of RTL8922A and RTL8922D has a per-PHY instance, but it was written without the PHY index, so PHY-1 read its report registers through the select of PHY-0. Write it with rtw89_phy_write32_idx() instead.

---
 drivers/net/wireless/realtek/rtw89/phy.c      | 12 ++++++------
 drivers/net/wireless/realtek/rtw89/rtw8922d.c |  2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)
drivers/net/wireless/realtek/rtw89/phy.c +6 -6
index c33b888bc0e3..074865665b16 100644
@@ -8712,8 +8712,8 @@ static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *b
 	rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel,
 			       edcca_p_regs->rpt_sel_mask, 0);
 	if (rtwdev->chip->chip_id == RTL8922A || rtwdev->chip->chip_id == RTL8922D) {
-		rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be,
-				       edcca_regs->rpt_sel_be_mask, 0);
+		rtw89_phy_write32_idx(rtwdev, edcca_regs->rpt_sel_be,
+				      edcca_regs->rpt_sel_be_mask, 0, bb->phy_idx);
 		per20_bitmap = rtw89_phy_read32_mask(rtwdev, edcca_p_regs->rpt_a,
 						     MASKBYTE0);
 	}
@@ -8738,16 +8738,16 @@ static void rtw89_phy_edcca_log(struct rtw89_dev *rtwdev, struct rtw89_bb_ctx *b
 	pwdb_s40 = u32_get_bits(tmp, MASKBYTE2);
 
 	if (rtwdev->chip->chip_id == RTL8922A || rtwdev->chip->chip_id == RTL8922D) {
-		rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be,
-				       edcca_regs->rpt_sel_be_mask, 4);
+		rtw89_phy_write32_idx(rtwdev, edcca_regs->rpt_sel_be,
+				      edcca_regs->rpt_sel_be_mask, 4, bb->phy_idx);
 		tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b);
 		pwdb[0] = u32_get_bits(tmp, MASKBYTE3);
 		pwdb[1] = u32_get_bits(tmp, MASKBYTE2);
 		pwdb[2] = u32_get_bits(tmp, MASKBYTE1);
 		pwdb[3] = u32_get_bits(tmp, MASKBYTE0);
 
-		rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be,
-				       edcca_regs->rpt_sel_be_mask, 5);
+		rtw89_phy_write32_idx(rtwdev, edcca_regs->rpt_sel_be,
+				      edcca_regs->rpt_sel_be_mask, 5, bb->phy_idx);
 		tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b);
 		pwdb[4] = u32_get_bits(tmp, MASKBYTE3);
 		pwdb[5] = u32_get_bits(tmp, MASKBYTE2);
drivers/net/wireless/realtek/rtw89/rtw8922d.c +1 -1
index 2325e646c487..41e2aa1c8f78 100644
@@ -271,7 +271,7 @@ static const struct rtw89_edcca_regs rtw8922d_edcca_regs = {
 		.rpt_sel_mask		= B_EDCCA_RPT_SEL_BE4_MSK,
 	}, {
 		.rpt_a			= R_EDCCA_RPT_A_BE4_C1,
-		.rpt_b			= R_EDCCA_RPT_A_BE4_C1,
+		.rpt_b			= R_EDCCA_RPT_B_BE4_C1,
 		.rpt_sel		= R_EDCCA_RPT_SEL_BE4_C1,
 		.rpt_sel_mask		= B_EDCCA_RPT_SEL_BE4_MSK,
 	}},
Signature · 1 line
2.25.1