[][MAC80211][core][Reject duplicated twt flow]

[Description]
Fix twt flow

[Release-log]
N/A


Change-Id: Ib391846b2fc1306a504f02882b364a985410f4c2
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/5822976
diff --git a/autobuild_mac80211_release/package/kernel/mt76/patches/0012-mt76-mt7915-reject-duplicated-twt-flow.patch b/autobuild_mac80211_release/package/kernel/mt76/patches/0012-mt76-mt7915-reject-duplicated-twt-flow.patch
new file mode 100644
index 0000000..bf6ea87
--- /dev/null
+++ b/autobuild_mac80211_release/package/kernel/mt76/patches/0012-mt76-mt7915-reject-duplicated-twt-flow.patch
@@ -0,0 +1,50 @@
+From 261d8a198f9fd9c7f58586f102eafabd2d73b80a Mon Sep 17 00:00:00 2001
+From: Peter Chiu <chui-hao.chiu@mediatek.com>
+Date: Thu, 7 Apr 2022 08:40:05 +0800
+Subject: [PATCH 2/2] mt76: mt7915: reject duplicated twt flow
+
+---
+ mt7915/mac.c | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+diff --git a/mt7915/mac.c b/mt7915/mac.c
+index aa312b75..8c7edd98 100644
+--- a/mt7915/mac.c
++++ b/mt7915/mac.c
+@@ -2889,7 +2889,7 @@ void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw,
+ 	enum ieee80211_twt_setup_cmd sta_setup_cmd;
+ 	struct mt7915_dev *dev = mt7915_hw_dev(hw);
+ 	struct mt7915_twt_flow *flow;
+-	int flowid, table_id;
++	int flowid, table_id, i;
+ 	u8 exp;
+ 
+ 	if (mt7915_mac_check_twt_req(twt))
+@@ -2907,10 +2907,24 @@ void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw,
+ 	le16p_replace_bits(&twt_agrt->req_type, flowid,
+ 			   IEEE80211_TWT_REQTYPE_FLOWID);
+ 
++
+ 	table_id = ffs(~dev->twt.table_mask) - 1;
+ 	exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, req_type);
+ 	sta_setup_cmd = FIELD_GET(IEEE80211_TWT_REQTYPE_SETUP_CMD, req_type);
+ 
++	for (i = 0; i < 8; i++) {
++		if (msta->twt.flowid_mask & BIT(i)) {
++			flow = &msta->twt.flow[i];
++			if (flow->duration == twt_agrt->min_twt_dur &&
++			    flow->mantissa == twt_agrt->mantissa &&
++			    flow->exp == exp &&
++			    flow->protection == !!(req_type & IEEE80211_TWT_REQTYPE_PROTECTION) &&
++			    flow->flowtype == !!(req_type & IEEE80211_TWT_REQTYPE_FLOWTYPE) &&
++			    flow->trigger == !!(req_type & IEEE80211_TWT_REQTYPE_TRIGGER))
++				goto unlock;
++		}
++	}
++
+ 	flow = &msta->twt.flow[flowid];
+ 	memset(flow, 0, sizeof(*flow));
+ 	INIT_LIST_HEAD(&flow->list);
+-- 
+2.18.0
+