[][MAC80211][External release build]

[Description]
Add external release build flow

[Release-log]
N/A

Change-Id: I9e7f99d972dec580eff7b50f18f1a0bc90487e4d
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5687836
diff --git a/autobuild_mac80211_release/mt7986_mac80211/package/kernel/mt76/patches/0009-mt76-mt7915-fix-mt76-tlv-in-6GHz.patch b/autobuild_mac80211_release/mt7986_mac80211/package/kernel/mt76/patches/0009-mt76-mt7915-fix-mt76-tlv-in-6GHz.patch
new file mode 100644
index 0000000..b2fc634
--- /dev/null
+++ b/autobuild_mac80211_release/mt7986_mac80211/package/kernel/mt76/patches/0009-mt76-mt7915-fix-mt76-tlv-in-6GHz.patch
@@ -0,0 +1,151 @@
+From f83177be8bfcc35eb7e6a1e7742175d27435ce82 Mon Sep 17 00:00:00 2001
+From: MeiChia Chiu <meichia.chiu@mediatek.com>
+Date: Wed, 9 Feb 2022 15:43:19 +0800
+Subject: [PATCH 09/11] mt76: fix mt76 tlv in 6GHz
+
+[Description]
+1. Fix mt76 STA_REC/WTBL tlv
+2. Fix Tx BA issue
+---
+ .../wireless/mediatek/mt76/mt76_connac_mcu.c  | 30 +++++++++++++++----
+ .../net/wireless/mediatek/mt76/mt7915/mac.c   |  2 +-
+ .../net/wireless/mediatek/mt76/mt7915/mcu.c   | 23 ++++++++++++++
+ 3 files changed, 48 insertions(+), 7 deletions(-)
+
+diff --git a/mt76_connac_mcu.c b/mt76_connac_mcu.c
+index 0a646ae..eac096c 100644
+--- a/mt76_connac_mcu.c
++++ b/mt76_connac_mcu.c
+@@ -905,18 +905,28 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
+ 	struct tlv *tlv;
+ 	u32 flags = 0;
+ 
+-	if (sta->ht_cap.ht_supported) {
++	if (sta->ht_cap.ht_supported || sta->he_6ghz_capa.capa) {
+ 		tlv = mt76_connac_mcu_add_nested_tlv(skb, WTBL_HT, sizeof(*ht),
+ 						     wtbl_tlv, sta_wtbl);
+ 		ht = (struct wtbl_ht *)tlv;
+ 		ht->ldpc = ldpc &&
+ 			   !!(sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING);
+-		ht->af = sta->ht_cap.ampdu_factor;
+-		ht->mm = sta->ht_cap.ampdu_density;
++
++		if (sta->ht_cap.ht_supported) {
++			ht->af = sta->ht_cap.ampdu_factor;
++			ht->mm = sta->ht_cap.ampdu_density;
++		}
++		else {
++			ht->af = FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
++					   sta->he_6ghz_capa.capa);
++			ht->mm = FIELD_GET(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START,
++					   sta->he_6ghz_capa.capa);
++		}
++
+ 		ht->ht = true;
+ 	}
+ 
+-	if (sta->vht_cap.vht_supported) {
++	if (sta->vht_cap.vht_supported || sta->he_6ghz_capa.capa) {
+ 		struct wtbl_vht *vht;
+ 		u8 af;
+ 
+@@ -1241,7 +1251,7 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
+ 
+ 		if (he_cap && he_cap->has_he)
+ 			mode |= PHY_MODE_AX_24G;
+-	} else if (band == NL80211_BAND_5GHZ || band == NL80211_BAND_6GHZ) {
++	} else if (band == NL80211_BAND_5GHZ) {
+ 		mode |= PHY_MODE_A;
+ 
+ 		if (ht_cap->ht_supported)
+@@ -1250,8 +1260,16 @@ u8 mt76_connac_get_phy_mode(struct mt76_phy *phy, struct ieee80211_vif *vif,
+ 		if (vht_cap->vht_supported)
+ 			mode |= PHY_MODE_AC;
+ 
+-		if (he_cap && he_cap->has_he && band == NL80211_BAND_5GHZ)
++		if (he_cap && he_cap->has_he)
+ 			mode |= PHY_MODE_AX_5G;
++	} else if (band == NL80211_BAND_6GHZ) {
++		mode |= PHY_MODE_A;
++
++		if (he_cap && he_cap->has_he) {
++			mode |= PHY_MODE_AN;
++			mode |= PHY_MODE_AC;
++			mode |= PHY_MODE_AX_5G;
++		}
+ 	}
+ 
+ 	return mode;
+diff --git a/mt7915/mac.c b/mt7915/mac.c
+index b7e7cd4..261861a 100644
+--- a/mt7915/mac.c
++++ b/mt7915/mac.c
+@@ -1354,7 +1354,7 @@ mt7915_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi)
+ 	u16 fc, tid;
+ 	u32 val;
+ 
+-	if (!sta || !sta->ht_cap.ht_supported)
++	if (!sta || !(sta->ht_cap.ht_supported || sta->he_cap.has_he))
+ 		return;
+ 
+ 	tid = FIELD_GET(MT_TXD1_TID, le32_to_cpu(txwi[1]));
+diff --git a/mt7915/mcu.c b/mt7915/mcu.c
+index 8eb48fa..15580f0 100644
+--- a/mt7915/mcu.c
++++ b/mt7915/mcu.c
+@@ -1538,6 +1538,7 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
+ 	struct tlv *tlv;
+ 	u32 supp_rate = sta->supp_rates[band];
+ 	u32 cap = sta->wme ? STA_CAP_WMM : 0;
++	bool is_6ghz = band == NL80211_BAND_6GHZ;
+ 
+ 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_RA, sizeof(*ra));
+ 	ra = (struct sta_rec_ra *)tlv;
+@@ -1617,8 +1618,25 @@ mt7915_mcu_sta_rate_ctrl_tlv(struct sk_buff *skb, struct mt7915_dev *dev,
+ 	}
+ 
+ 	if (sta->he_cap.has_he) {
++		u8 *phy_cap = sta->he_cap.he_cap_elem.phy_cap_info;
++
+ 		ra->supp_mode |= MODE_HE;
+ 		cap |= STA_CAP_HE;
++
++		if(is_6ghz) {
++			ra->af = FIELD_GET(IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP,
++					   sta->he_6ghz_capa.capa);
++			ra->mmps_mode = FIELD_GET(IEEE80211_HE_6GHZ_CAP_SM_PS,
++						  sta->he_6ghz_capa.capa);
++			ra->phy.type = ffs(MODE_HE);
++			ra->phy.stbc = 1;
++			ra->phy.sgi = 1;
++			ra->phy.ldpc = (mvif->cap.ldpc && !!(phy_cap[1] &
++					  IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD));
++			ra->phy.mcs = 9;
++			ra->phy.nss = sta->rx_nss;
++		}
++
+ 	}
+ 
+ 	ra->sta_cap = cpu_to_le32(cap);
+@@ -1858,6 +1876,8 @@ mt7915_mcu_beacon_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif,
+ 	const struct ieee80211_vht_cap *vht;
+ 	const struct ieee80211_ht_cap *ht;
+ 	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
++	enum nl80211_band band = phy->mt76->chandef.chan->band;
++	bool is_6ghz = band == NL80211_BAND_6GHZ;
+ 	const u8 *ie;
+ 	u32 len, bc;
+ 
+@@ -1921,6 +1941,9 @@ mt7915_mcu_beacon_check_caps(struct mt7915_phy *phy, struct ieee80211_vif *vif,
+ 		vc->he_mu_ebfer =
+ 			HE_PHY(CAP4_MU_BEAMFORMER, he->phy_cap_info[4]) &&
+ 			HE_PHY(CAP4_MU_BEAMFORMER, pe->phy_cap_info[4]);
++
++		if (is_6ghz)
++			vc->ldpc |= HE_PHY(CAP1_LDPC_CODING_IN_PAYLOAD, pe->phy_cap_info[1]);
+ 	}
+ }
+ 
+-- 
+2.25.1
+