blob: 70867df8a8ca3ffcb55b6b97b017cba871005d9b [file] [log] [blame]
developerabdbf252023-02-06 16:02:21 +08001From 6298046de15b190139552d74aeb668e8cb873b1d Mon Sep 17 00:00:00 2001
2From: Bo Jiao <Bo.Jiao@mediatek.com>
3Date: Thu, 15 Dec 2022 18:22:37 +0800
4Subject: [PATCH 6/7] wifi: mt76: mt7996: add 802.11s mesh amsdu/de-amsdu
5 support
6
7Signed-off-by: Bo Jiao <Bo.Jiao@mediatek.com>
8---
9 mt7996/mac.c | 15 ++++++++++++++-
10 mt7996/mac.h | 2 ++
11 mt7996/mcu.c | 9 ++++++++-
12 mt7996/mcu.h | 2 +-
13 mt7996/mmio.c | 3 ++-
14 5 files changed, 27 insertions(+), 4 deletions(-)
15 mode change 100644 => 100755 mt7996/mac.c
16 mode change 100644 => 100755 mt7996/mmio.c
17
18diff --git a/mt7996/mac.c b/mt7996/mac.c
19old mode 100644
20new mode 100755
21index 51337dde..d17b5478
22--- a/mt7996/mac.c
23+++ b/mt7996/mac.c
24@@ -630,6 +630,7 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, struct sk_buff *skb)
25 u32 rxd4 = le32_to_cpu(rxd[4]);
26 u32 csum_mask = MT_RXD0_NORMAL_IP_SUM | MT_RXD0_NORMAL_UDP_TCP_SUM;
27 u32 csum_status = *(u32 *)skb->cb;
28+ u32 mesh_mask = MT_RXD0_MESH | MT_RXD0_MHCP;
29 bool unicast, insert_ccmp_hdr = false;
30 u8 remove_pad, amsdu_info, band_idx;
31 u8 mode = 0, qos_ctl = 0;
32@@ -822,6 +823,9 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, struct sk_buff *skb)
33
34 skb_pull(skb, hdr_gap);
35 if (!hdr_trans && status->amsdu) {
36+ if(ieee80211_has_a4(fc) && ((rxd0 & mesh_mask) == mesh_mask))
37+ pad_start = 0;
38+ else
39 pad_start = ieee80211_get_hdrlen_from_skb(skb);
40 } else if (hdr_trans && (rxd2 & MT_RXD2_NORMAL_HDR_TRANS_ERROR)) {
41 /* When header translation failure is indicated,
42@@ -854,8 +858,17 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, struct sk_buff *skb)
43 hdr = mt76_skb_get_hdr(skb);
44 fc = hdr->frame_control;
45 if (ieee80211_is_data_qos(fc)) {
46+ u8 *p = ieee80211_get_qos_ctl(hdr);
47+
48 seq_ctrl = le16_to_cpu(hdr->seq_ctrl);
49- qos_ctl = *ieee80211_get_qos_ctl(hdr);
50+ qos_ctl = *p;
51+
52+ /* the hardware support mesh de-amsdu by default,
53+ * so, clear amsdu present bit in the Qos Control field.
54+ */
55+ if (ieee80211_has_a4(fc) && status->amsdu &&
56+ ((rxd0 & mesh_mask) == mesh_mask))
57+ *p &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
58 }
59 } else {
60 status->flag |= RX_FLAG_8023;
61diff --git a/mt7996/mac.h b/mt7996/mac.h
62index 470b701a..fd0e5d1c 100644
63--- a/mt7996/mac.h
64+++ b/mt7996/mac.h
65@@ -12,6 +12,8 @@
66 #define MT_RXD0_LENGTH GENMASK(15, 0)
67 #define MT_RXD0_PKT_TYPE GENMASK(31, 27)
68
69+#define MT_RXD0_MESH BIT(18)
70+#define MT_RXD0_MHCP BIT(19)
71 #define MT_RXD0_NORMAL_ETH_TYPE_OFS GENMASK(22, 16)
72 #define MT_RXD0_NORMAL_IP_SUM BIT(23)
73 #define MT_RXD0_NORMAL_UDP_TCP_SUM BIT(24)
74diff --git a/mt7996/mcu.c b/mt7996/mcu.c
75index 394dd15c..1e47b0ae 100644
76--- a/mt7996/mcu.c
77+++ b/mt7996/mcu.c
78@@ -1022,7 +1022,8 @@ mt7996_mcu_sta_amsdu_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
79 struct tlv *tlv;
80
81 if (vif->type != NL80211_IFTYPE_STATION &&
82- vif->type != NL80211_IFTYPE_AP)
83+ vif->type != NL80211_IFTYPE_AP &&
84+ vif->type != NL80211_IFTYPE_MESH_POINT)
85 return;
86
87 if (!sta->deflink.agg.max_amsdu_len)
88@@ -1528,6 +1529,12 @@ mt7996_mcu_sta_hdr_trans_tlv(struct mt7996_dev *dev, struct sk_buff *skb,
89 hdr_trans->to_ds = true;
90 hdr_trans->from_ds = true;
91 }
92+
93+ if (vif->type == NL80211_IFTYPE_MESH_POINT) {
94+ hdr_trans->to_ds = true;
95+ hdr_trans->from_ds = true;
96+ hdr_trans->mesh = true;
97+ }
98 }
99
100 static enum mcu_mmps_mode
101diff --git a/mt7996/mcu.h b/mt7996/mcu.h
102index dd0c5ac5..009f5f06 100644
103--- a/mt7996/mcu.h
104+++ b/mt7996/mcu.h
105@@ -396,7 +396,7 @@ struct sta_rec_hdr_trans {
106 u8 from_ds;
107 u8 to_ds;
108 u8 dis_rx_hdr_tran;
109- u8 rsv;
110+ u8 mesh;
111 } __packed;
112
113 struct hdr_trans_en {
114diff --git a/mt7996/mmio.c b/mt7996/mmio.c
115old mode 100644
116new mode 100755
117index d8a2c1a7..08164b1a
118--- a/mt7996/mmio.c
119+++ b/mt7996/mmio.c
120@@ -320,7 +320,8 @@ struct mt7996_dev *mt7996_mmio_probe(struct device *pdev,
121 /* txwi_size = txd size + txp size */
122 .txwi_size = MT_TXD_SIZE + sizeof(struct mt7996_txp),
123 .drv_flags = MT_DRV_TXWI_NO_FREE |
124- MT_DRV_HW_MGMT_TXQ,
125+ MT_DRV_HW_MGMT_TXQ |
126+ MT_DRV_AMSDU_OFFLOAD,
127 .survey_flags = SURVEY_INFO_TIME_TX |
128 SURVEY_INFO_TIME_RX |
129 SURVEY_INFO_TIME_BSS_RX,
130--
1312.25.1
132