[][MAC80211][WiFi6][mt76][Add support for IEEE 802.11 fragmentation]

[Description]
Add fragmentation index into TXD.DW2 to support IEEE 802.11 fragmentation.

[Release-log]
N/A

Change-Id: Ibf2a1f40f597d124e97ae737d95c2874705a081b
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8898121
diff --git a/autobuild_mac80211_release/package/kernel/mt76/patches/0015-wifi-mt76-mt7915-add-support-for-IEEE-802.11-fragmen.patch b/autobuild_mac80211_release/package/kernel/mt76/patches/0015-wifi-mt76-mt7915-add-support-for-IEEE-802.11-fragmen.patch
new file mode 100644
index 0000000..ab924eb
--- /dev/null
+++ b/autobuild_mac80211_release/package/kernel/mt76/patches/0015-wifi-mt76-mt7915-add-support-for-IEEE-802.11-fragmen.patch
@@ -0,0 +1,67 @@
+From 7b7d9e3ef08ce5526d43d657cb717b471002b087 Mon Sep 17 00:00:00 2001
+From: Benjamin Lin <benjamin-jw.lin@mediatek.com>
+Date: Wed, 3 Apr 2024 14:05:59 +0800
+Subject: [PATCH] wifi: mt76: mt7915: add support for IEEE 802.11 fragmentation
+
+Add fragmentation index into TXD.DW2 to support IEEE 802.11 fragmentation.
+
+Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
+---
+ mt76_connac2_mac.h |  7 +++++++
+ mt76_connac_mac.c  | 10 +++++++++-
+ 2 files changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/mt76_connac2_mac.h b/mt76_connac2_mac.h
+index 5f13211..eb47653 100644
+--- a/mt76_connac2_mac.h
++++ b/mt76_connac2_mac.h
+@@ -355,4 +355,11 @@ enum tx_port_idx {
+ 	MT_TX_PORT_IDX_MCU
+ };
+ 
++enum tx_frag_idx {
++	MT_TX_FRAG_NONE,
++	MT_TX_FRAG_FIRST,
++	MT_TX_FRAG_MID,
++	MT_TX_FRAG_LAST
++};
++
+ #endif /* __MT76_CONNAC2_MAC_H */
+diff --git a/mt76_connac_mac.c b/mt76_connac_mac.c
+index 630c640..d7d602a 100644
+--- a/mt76_connac_mac.c
++++ b/mt76_connac_mac.c
+@@ -391,6 +391,7 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
+ 	bool multicast = is_multicast_ether_addr(hdr->addr1);
+ 	u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
+ 	__le16 fc = hdr->frame_control;
++	__le16 sc = hdr->seq_ctrl;
+ 	u8 fc_type, fc_stype;
+ 	u32 val;
+ 
+@@ -432,6 +433,13 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
+ 	    info->flags & IEEE80211_TX_CTL_USE_MINRATE)
+ 		val |= MT_TXD2_FIX_RATE;
+ 
++	if (ieee80211_has_morefrags(fc) && ieee80211_is_first_frag(sc))
++		val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_FIRST);
++	else if (ieee80211_has_morefrags(fc) && !ieee80211_is_first_frag(sc))
++		val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_MID);
++	else if (!ieee80211_has_morefrags(fc) && !ieee80211_is_first_frag(sc))
++		val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_LAST);
++
+ 	txwi[2] |= cpu_to_le32(val);
+ 
+ 	if (ieee80211_is_beacon(fc)) {
+@@ -440,7 +448,7 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
+ 	}
+ 
+ 	if (info->flags & IEEE80211_TX_CTL_INJECTED) {
+-		u16 seqno = le16_to_cpu(hdr->seq_ctrl);
++		u16 seqno = le16_to_cpu(sc);
+ 
+ 		if (ieee80211_is_back_req(hdr->frame_control)) {
+ 			struct ieee80211_bar *bar;
+-- 
+2.18.0
+