[][MAC80211][wifi7][Misc][Sync Internal patches to External Release Folder]

[Description]
Add 20231011 MT7996 firmware and sync patches to External Release Folder

[Release-log]
N/A

Change-Id: I8971c21f494c3947f2ac7f19b8c398488356ca59
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8101977
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0008-wifi-mt76-mt7996-add-beacon-duplicate-tx-mode-suppor.patch b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0008-wifi-mt76-mt7996-add-beacon-duplicate-tx-mode-suppor.patch
new file mode 100644
index 0000000..a5b808a
--- /dev/null
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211/package/kernel/mt76/patches/0008-wifi-mt76-mt7996-add-beacon-duplicate-tx-mode-suppor.patch
@@ -0,0 +1,237 @@
+From 8f93c158b307ee75e622a5897499f5837c0d3446 Mon Sep 17 00:00:00 2001
+From: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+Date: Fri, 12 May 2023 16:24:53 +0800
+Subject: [PATCH 08/98] wifi: mt76: mt7996: add beacon duplicate tx mode
+ support
+
+Signed-off-by: StanleyYP Wang <StanleyYP.Wang@mediatek.com>
+---
+ mt76_connac_mcu.h |  1 +
+ mt7996/init.c     |  6 ++++--
+ mt7996/mac.c      | 11 -----------
+ mt7996/main.c     | 18 +++++++++---------
+ mt7996/mcu.c      | 30 ++++++++++++++++++++++++++++++
+ mt7996/mcu.h      | 20 ++++++++++++++++++++
+ mt7996/mt7996.h   |  8 +++++---
+ 7 files changed, 69 insertions(+), 25 deletions(-)
+
+diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
+index 99077f1..90c08d2 100644
+--- a/mt76_connac_mcu.h
++++ b/mt76_connac_mcu.h
+@@ -1239,6 +1239,7 @@ enum {
+ 	MCU_UNI_CMD_CHANNEL_SWITCH = 0x34,
+ 	MCU_UNI_CMD_THERMAL = 0x35,
+ 	MCU_UNI_CMD_VOW = 0x37,
++	MCU_UNI_CMD_FIXED_RATE_TABLE = 0x40,
+ 	MCU_UNI_CMD_RRO = 0x57,
+ 	MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
+ 	MCU_UNI_CMD_ASSERT_DUMP = 0x6f,
+diff --git a/mt7996/init.c b/mt7996/init.c
+index 2e6efc5..17a4abd 100644
+--- a/mt7996/init.c
++++ b/mt7996/init.c
+@@ -354,6 +354,7 @@ mt7996_init_wiphy(struct ieee80211_hw *hw, struct mtk_wed_device *wed)
+ 		IEEE80211_RADIOTAP_TIMESTAMP_UNIT_US;
+ 
+ 	phy->slottime = 9;
++	phy->beacon_rate = -1;
+ 
+ 	hw->sta_data_size = sizeof(struct mt7996_sta);
+ 	hw->vif_data_size = sizeof(struct mt7996_vif);
+@@ -463,11 +464,12 @@ static void mt7996_mac_init_basic_rates(struct mt7996_dev *dev)
+ 
+ 	for (i = 0; i < ARRAY_SIZE(mt76_rates); i++) {
+ 		u16 rate = mt76_rates[i].hw_value;
+-		u16 idx = MT7996_BASIC_RATES_TBL + i;
++		/* odd index for driver, even index for firmware */
++		u16 idx = MT7996_BASIC_RATES_TBL + 2 * i;
+ 
+ 		rate = FIELD_PREP(MT_TX_RATE_MODE, rate >> 8) |
+ 		       FIELD_PREP(MT_TX_RATE_IDX, rate & GENMASK(7, 0));
+-		mt7996_mac_set_fixed_rate_table(dev, idx, rate);
++		mt7996_mcu_set_fixed_rate_table(&dev->phy, idx, rate, false);
+ 	}
+ }
+ 
+diff --git a/mt7996/mac.c b/mt7996/mac.c
+index 4be5410..6688186 100644
+--- a/mt7996/mac.c
++++ b/mt7996/mac.c
+@@ -248,17 +248,6 @@ void mt7996_mac_enable_rtscts(struct mt7996_dev *dev,
+ 		mt76_clear(dev, addr, BIT(5));
+ }
+ 
+-void mt7996_mac_set_fixed_rate_table(struct mt7996_dev *dev,
+-				     u8 tbl_idx, u16 rate_idx)
+-{
+-	u32 ctrl = MT_WTBL_ITCR_WR | MT_WTBL_ITCR_EXEC | tbl_idx;
+-
+-	mt76_wr(dev, MT_WTBL_ITDR0, rate_idx);
+-	/* use wtbl spe idx */
+-	mt76_wr(dev, MT_WTBL_ITDR1, MT_WTBL_SPE_IDX_SEL);
+-	mt76_wr(dev, MT_WTBL_ITCR, ctrl);
+-}
+-
+ /* The HW does not translate the mac header to 802.3 for mesh point */
+ static int mt7996_reverse_frag0_hdr_trans(struct sk_buff *skb, u16 hdr_gap)
+ {
+diff --git a/mt7996/main.c b/mt7996/main.c
+index 280120b..41f0fa1 100644
+--- a/mt7996/main.c
++++ b/mt7996/main.c
+@@ -522,24 +522,25 @@ mt7996_get_rates_table(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+ 	struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv;
+ 	struct mt76_phy *mphy = hw->priv;
+ 	u16 rate;
+-	u8 i, idx, ht;
++	u8 i, idx;
+ 
+ 	rate = mt76_connac2_mac_tx_rate_val(mphy, vif, beacon, mcast);
+-	ht = FIELD_GET(MT_TX_RATE_MODE, rate) > MT_PHY_TYPE_OFDM;
+ 
+-	if (beacon && ht) {
+-		struct mt7996_dev *dev = mt7996_hw_dev(hw);
++	if (beacon) {
++		struct mt7996_phy *phy = mt7996_hw_phy(hw);
++
++		/* odd index for driver, even index for firmware */
++		idx = MT7996_BEACON_RATES_TBL + 2 * phy->mt76->band_idx;
++		if (phy->beacon_rate != rate)
++			mt7996_mcu_set_fixed_rate_table(phy, idx, rate, beacon);
+ 
+-		/* must odd index */
+-		idx = MT7996_BEACON_RATES_TBL + 2 * (mvif->idx % 20);
+-		mt7996_mac_set_fixed_rate_table(dev, idx, rate);
+ 		return idx;
+ 	}
+ 
+ 	idx = FIELD_GET(MT_TX_RATE_IDX, rate);
+ 	for (i = 0; i < ARRAY_SIZE(mt76_rates); i++)
+ 		if ((mt76_rates[i].hw_value & GENMASK(7, 0)) == idx)
+-			return MT7996_BASIC_RATES_TBL + i;
++			return MT7996_BASIC_RATES_TBL + 2 * i;
+ 
+ 	return mvif->basic_rates_idx;
+ }
+@@ -966,7 +967,6 @@ mt7996_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
+ 	mt7996_set_stream_vht_txbf_caps(phy);
+ 	mt7996_set_stream_he_eht_caps(phy);
+ 
+-	/* TODO: update bmc_wtbl spe_idx when antenna changes */
+ 	mutex_unlock(&dev->mt76.mutex);
+ 
+ 	return 0;
+diff --git a/mt7996/mcu.c b/mt7996/mcu.c
+index 84f362b..dbb3ceb 100644
+--- a/mt7996/mcu.c
++++ b/mt7996/mcu.c
+@@ -4055,6 +4055,36 @@ int mt7996_mcu_wtbl_update_hdr_trans(struct mt7996_dev *dev,
+ 				     MCU_WMWA_UNI_CMD(STA_REC_UPDATE), true);
+ }
+ 
++int mt7996_mcu_set_fixed_rate_table(struct mt7996_phy *phy, u8 table_idx,
++				    u16 rate_idx, bool beacon)
++{
++#define UNI_FIXED_RATE_TABLE_SET	0
++#define SPE_IXD_SELECT_TXD		0
++#define SPE_IXD_SELECT_BMC_WTBL		1
++	struct mt7996_dev *dev = phy->dev;
++	struct fixed_rate_table_ctrl req = {
++		.tag = cpu_to_le16(UNI_FIXED_RATE_TABLE_SET),
++		.len = cpu_to_le16(sizeof(req) - 4),
++		.table_idx = table_idx,
++		.rate_idx = cpu_to_le16(rate_idx),
++		.gi = 1,
++		.he_ltf = 1,
++	};
++	u8 band_idx = phy->mt76->band_idx;
++
++	if (beacon) {
++		req.spe_idx_sel = SPE_IXD_SELECT_TXD;
++		req.spe_idx = 24 + band_idx;
++		phy->beacon_rate = rate_idx;
++	} else {
++		req.spe_idx_sel = SPE_IXD_SELECT_BMC_WTBL;
++		req.spe_idx = 0;
++	}
++
++	return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(FIXED_RATE_TABLE),
++				 &req, sizeof(req), false);
++}
++
+ int mt7996_mcu_rf_regval(struct mt7996_dev *dev, u32 regidx, u32 *val, bool set)
+ {
+ 	struct {
+diff --git a/mt7996/mcu.h b/mt7996/mcu.h
+index f1528df..c20a947 100644
+--- a/mt7996/mcu.h
++++ b/mt7996/mcu.h
+@@ -738,4 +738,24 @@ enum {
+ #define MT7996_SEC_KEY_IDX		GENMASK(2, 1)
+ #define MT7996_SEC_IV			BIT(3)
+ 
++struct fixed_rate_table_ctrl {
++	u8 _rsv[4];
++
++	__le16 tag;
++	__le16 len;
++
++	u8 table_idx;
++	u8 antenna_idx;
++	__le16 rate_idx;
++	u8 spe_idx_sel;
++	u8 spe_idx;
++	u8 gi;
++	u8 he_ltf;
++	bool ldpc;
++	bool txbf;
++	bool dynamic_bw;
++
++	u8 rsv[1];
++} __packed;
++
+ #endif
+diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
+index 137d5a2..21ad51d 100644
+--- a/mt7996/mt7996.h
++++ b/mt7996/mt7996.h
+@@ -47,7 +47,7 @@
+ #define MT7996_MAX_QUEUE		(__MT_RXQ_MAX +	__MT_MCUQ_MAX + 3)
+ 
+ /* NOTE: used to map mt76_rates. idx may change if firmware expands table */
+-#define MT7996_BASIC_RATES_TBL		11
++#define MT7996_BASIC_RATES_TBL		31
+ #define MT7996_BEACON_RATES_TBL		25
+ 
+ #define MT7996_THERMAL_THROTTLE_MAX	100
+@@ -213,6 +213,8 @@ struct mt7996_phy {
+ 
+ 	u8 rdd_state;
+ 
++	u16 beacon_rate;
++
+ 	u32 rx_ampdu_ts;
+ 	u32 ampdu_ref;
+ 
+@@ -475,6 +477,8 @@ int mt7996_mcu_rdd_cmd(struct mt7996_dev *dev, int cmd, u8 index,
+ 		       u8 rx_sel, u8 val);
+ int mt7996_mcu_rdd_background_enable(struct mt7996_phy *phy,
+ 				     struct cfg80211_chan_def *chandef);
++int mt7996_mcu_set_fixed_rate_table(struct mt7996_phy *phy, u8 table_idx,
++				    u16 rate_idx, bool beacon);
+ int mt7996_mcu_rf_regval(struct mt7996_dev *dev, u32 regidx, u32 *val, bool set);
+ int mt7996_mcu_set_hdr_trans(struct mt7996_dev *dev, bool hdr_trans);
+ int mt7996_mcu_set_rro(struct mt7996_dev *dev, u16 tag, u8 val);
+@@ -539,8 +543,6 @@ void mt7996_mac_cca_stats_reset(struct mt7996_phy *phy);
+ void mt7996_mac_enable_nf(struct mt7996_dev *dev, u8 band);
+ void mt7996_mac_enable_rtscts(struct mt7996_dev *dev,
+ 			      struct ieee80211_vif *vif, bool enable);
+-void mt7996_mac_set_fixed_rate_table(struct mt7996_dev *dev,
+-				     u8 tbl_idx, u16 rate_idx);
+ void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
+ 			   struct sk_buff *skb, struct mt76_wcid *wcid,
+ 			   struct ieee80211_key_conf *key, int pid,
+-- 
+2.18.0
+