blob: b426ae9c99f102d6a1f33b037bbd75858b932c9a [file] [log] [blame]
developer8bb192d2023-08-31 11:46:57 +08001From 5205d81a06d556463a50b163bc6ceb6a6fb2bdeb Mon Sep 17 00:00:00 2001
developerab646612023-03-17 10:43:23 +08002From: MeiChia Chiu <meichia.chiu@mediatek.com>
3Date: Thu, 23 Mar 2023 08:49:48 +0800
developer8bb192d2023-08-31 11:46:57 +08004Subject: [PATCH 01/15] wifi: mt76: mt7915: update beacon size limitation
developerab646612023-03-17 10:43:23 +08005
developer8bb192d2023-08-31 11:46:57 +08006To accommodate 11v MBSSID IE and support maximum 16 MBSSIDs, expand the
7beacon size limitation for beacon and inband discovery commands.
developerab646612023-03-17 10:43:23 +08008
9Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com>
10Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
11Co-developed-by: Money Wang <Money.Wang@mediatek.com>
12Signed-off-by: Money Wang <Money.Wang@mediatek.com>
13Signed-off-by: MeiChia Chiu <MeiChia.Chiu@mediatek.com>
developer8bb192d2023-08-31 11:46:57 +080014Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
developerab646612023-03-17 10:43:23 +080015---
16 mt7915/main.c | 8 +++++---
developer8bb192d2023-08-31 11:46:57 +080017 mt7915/mcu.c | 49 +++++++++++++++++++++++++++++--------------------
developer2e954b52023-04-11 14:14:24 +080018 mt7915/mcu.h | 18 ++++++++----------
developerab646612023-03-17 10:43:23 +080019 mt7915/mt7915.h | 2 ++
developer8bb192d2023-08-31 11:46:57 +080020 4 files changed, 44 insertions(+), 33 deletions(-)
developerab646612023-03-17 10:43:23 +080021
22diff --git a/mt7915/main.c b/mt7915/main.c
developer8bb192d2023-08-31 11:46:57 +080023index 9b79e915..de994ea7 100644
developerab646612023-03-17 10:43:23 +080024--- a/mt7915/main.c
25+++ b/mt7915/main.c
developer8bb192d2023-08-31 11:46:57 +080026@@ -646,11 +646,13 @@ static void mt7915_bss_info_changed(struct ieee80211_hw *hw,
developerab646612023-03-17 10:43:23 +080027 mt7915_update_bss_color(hw, vif, &info->he_bss_color);
28
29 if (changed & (BSS_CHANGED_BEACON |
30- BSS_CHANGED_BEACON_ENABLED |
31- BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
32- BSS_CHANGED_FILS_DISCOVERY))
33+ BSS_CHANGED_BEACON_ENABLED))
34 mt7915_mcu_add_beacon(hw, vif, info->enable_beacon, changed);
35
36+ if (changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP |
37+ BSS_CHANGED_FILS_DISCOVERY))
38+ mt7915_mcu_add_inband_discov(dev, vif, changed);
39+
developerc1571f92023-07-04 22:11:24 +080040 if (set_bss_info == 0)
41 mt7915_mcu_add_bss_info(phy, vif, false);
42 if (set_sta == 0)
developerab646612023-03-17 10:43:23 +080043diff --git a/mt7915/mcu.c b/mt7915/mcu.c
developer8bb192d2023-08-31 11:46:57 +080044index 8224f8be..6d000841 100644
developerab646612023-03-17 10:43:23 +080045--- a/mt7915/mcu.c
46+++ b/mt7915/mcu.c
developerc1571f92023-07-04 22:11:24 +080047@@ -1882,10 +1882,9 @@ mt7915_mcu_beacon_cont(struct mt7915_dev *dev, struct ieee80211_vif *vif,
developerbbd45e12023-05-19 08:22:06 +080048 memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
developerab646612023-03-17 10:43:23 +080049 }
50
51-static void
52-mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
53- struct sk_buff *rskb, struct bss_info_bcn *bcn,
54- u32 changed)
55+int
56+mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
57+ u32 changed)
58 {
59 #define OFFLOAD_TX_MODE_SU BIT(0)
60 #define OFFLOAD_TX_MODE_MU BIT(1)
developer8bb192d2023-08-31 11:46:57 +080061@@ -1895,14 +1894,27 @@ mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vi
developerab646612023-03-17 10:43:23 +080062 struct cfg80211_chan_def *chandef = &mvif->phy->mt76->chandef;
63 enum nl80211_band band = chandef->chan->band;
64 struct mt76_wcid *wcid = &dev->mt76.global_wcid;
65+ struct bss_info_bcn *bcn;
66 struct bss_info_inband_discovery *discov;
67 struct ieee80211_tx_info *info;
68- struct sk_buff *skb = NULL;
69- struct tlv *tlv;
70+ struct sk_buff *rskb, *skb = NULL;
71+ struct tlv *tlv, *sub_tlv;
72 bool ext_phy = phy != &dev->phy;
73 u8 *buf, interval;
74 int len;
75
76+ if (vif->bss_conf.nontransmitted)
77+ return 0;
78+
79+ rskb = __mt76_connac_mcu_alloc_sta_req(&dev->mt76, &mvif->mt76, NULL,
80+ MT7915_MAX_BSS_OFFLOAD_SIZE);
developerab646612023-03-17 10:43:23 +080081+ if (IS_ERR(rskb))
82+ return PTR_ERR(rskb);
83+
84+ tlv = mt76_connac_mcu_add_tlv(rskb, BSS_INFO_OFFLOAD, sizeof(*bcn));
85+ bcn = (struct bss_info_bcn *)tlv;
86+ bcn->enable = true;
87+
88 if (changed & BSS_CHANGED_FILS_DISCOVERY &&
89 vif->bss_conf.fils_discovery.max_interval) {
90 interval = vif->bss_conf.fils_discovery.max_interval;
developer8bb192d2023-08-31 11:46:57 +080091@@ -1914,26 +1926,25 @@ mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vi
developerab646612023-03-17 10:43:23 +080092 }
93
94 if (!skb)
95- return;
96+ return -EINVAL;
97
98 info = IEEE80211_SKB_CB(skb);
99 info->control.vif = vif;
100 info->band = band;
101-
102 info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, ext_phy);
103
104 len = sizeof(*discov) + MT_TXD_SIZE + skb->len;
105 len = (len & 0x3) ? ((len | 0x3) + 1) : len;
106
107- if (len > (MT7915_MAX_BSS_OFFLOAD_SIZE - rskb->len)) {
108+ if (skb->len > MT7915_MAX_BEACON_SIZE) {
109 dev_err(dev->mt76.dev, "inband discovery size limit exceed\n");
110 dev_kfree_skb(skb);
111- return;
112+ return -EINVAL;
113 }
114
115- tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_DISCOV,
116- len, &bcn->sub_ntlv, &bcn->len);
117- discov = (struct bss_info_inband_discovery *)tlv;
118+ sub_tlv = mt7915_mcu_add_nested_subtlv(rskb, BSS_INFO_BCN_DISCOV,
119+ len, &bcn->sub_ntlv, &bcn->len);
120+ discov = (struct bss_info_inband_discovery *)sub_tlv;
121 discov->tx_mode = OFFLOAD_TX_MODE_SU;
122 /* 0: UNSOL PROBE RESP, 1: FILS DISCOV */
123 discov->tx_type = !!(changed & BSS_CHANGED_FILS_DISCOVERY);
developer8bb192d2023-08-31 11:46:57 +0800124@@ -1941,13 +1952,16 @@ mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vi
developerab646612023-03-17 10:43:23 +0800125 discov->prob_rsp_len = cpu_to_le16(MT_TXD_SIZE + skb->len);
126 discov->enable = true;
127
128- buf = (u8 *)tlv + sizeof(*discov);
129+ buf = (u8 *)sub_tlv + sizeof(*discov);
130
131 mt7915_mac_write_txwi(&dev->mt76, (__le32 *)buf, skb, wcid, 0, NULL,
132 0, changed);
133 memcpy(buf + MT_TXD_SIZE, skb->data, skb->len);
134
135 dev_kfree_skb(skb);
136+
137+ return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
138+ MCU_EXT_CMD(BSS_INFO_UPDATE), true);
139 }
140
141 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
developer8bb192d2023-08-31 11:46:57 +0800142@@ -1983,7 +1997,7 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
developerab646612023-03-17 10:43:23 +0800143 if (!skb)
144 return -EINVAL;
145
146- if (skb->len > MT7915_MAX_BEACON_SIZE - MT_TXD_SIZE) {
147+ if (skb->len > MT7915_MAX_BEACON_SIZE) {
148 dev_err(dev->mt76.dev, "Bcn size limit exceed\n");
149 dev_kfree_skb(skb);
150 return -EINVAL;
developer8bb192d2023-08-31 11:46:57 +0800151@@ -1997,11 +2011,6 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
developerab646612023-03-17 10:43:23 +0800152 mt7915_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs);
153 dev_kfree_skb(skb);
154
155- if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP ||
156- changed & BSS_CHANGED_FILS_DISCOVERY)
157- mt7915_mcu_beacon_inband_discov(dev, vif, rskb,
158- bcn, changed);
159-
160 out:
161 return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb,
162 MCU_EXT_CMD(BSS_INFO_UPDATE), true);
163diff --git a/mt7915/mcu.h b/mt7915/mcu.h
developer8bb192d2023-08-31 11:46:57 +0800164index b9ea297f..1592b5d6 100644
developerab646612023-03-17 10:43:23 +0800165--- a/mt7915/mcu.h
166+++ b/mt7915/mcu.h
developer2e954b52023-04-11 14:14:24 +0800167@@ -495,10 +495,14 @@ enum {
developerab646612023-03-17 10:43:23 +0800168 SER_RECOVER
169 };
170
171-#define MT7915_MAX_BEACON_SIZE 512
172-#define MT7915_MAX_INBAND_FRAME_SIZE 256
173-#define MT7915_MAX_BSS_OFFLOAD_SIZE (MT7915_MAX_BEACON_SIZE + \
174- MT7915_MAX_INBAND_FRAME_SIZE + \
developerab646612023-03-17 10:43:23 +0800175+#define MT7915_MAX_BEACON_SIZE 1308
176+#define MT7915_BEACON_UPDATE_SIZE (sizeof(struct sta_req_hdr) + \
177+ sizeof(struct bss_info_bcn) + \
178+ sizeof(struct bss_info_bcn_cntdwn) + \
179+ sizeof(struct bss_info_bcn_mbss) + \
180+ MT_TXD_SIZE + \
181+ sizeof(struct bss_info_bcn_cont))
developer2e954b52023-04-11 14:14:24 +0800182+#define MT7915_MAX_BSS_OFFLOAD_SIZE (MT7915_MAX_BEACON_SIZE + \
developerc9233442023-04-04 06:06:17 +0800183 MT7915_BEACON_UPDATE_SIZE)
184
185 #define MT7915_BSS_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \
developer2e954b52023-04-11 14:14:24 +0800186@@ -511,12 +515,6 @@ enum {
developerab646612023-03-17 10:43:23 +0800187 sizeof(struct bss_info_bmc_rate) +\
188 sizeof(struct bss_info_ext_bss))
189
190-#define MT7915_BEACON_UPDATE_SIZE (sizeof(struct sta_req_hdr) + \
191- sizeof(struct bss_info_bcn_cntdwn) + \
192- sizeof(struct bss_info_bcn_mbss) + \
193- sizeof(struct bss_info_bcn_cont) + \
194- sizeof(struct bss_info_inband_discovery))
195-
196 static inline s8
197 mt7915_get_power_bound(struct mt7915_phy *phy, s8 txpower)
198 {
199diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h
developer8bb192d2023-08-31 11:46:57 +0800200index 0456e56f..21984e97 100644
developerab646612023-03-17 10:43:23 +0800201--- a/mt7915/mt7915.h
202+++ b/mt7915/mt7915.h
developerc1571f92023-07-04 22:11:24 +0800203@@ -447,6 +447,8 @@ int mt7915_mcu_add_rx_ba(struct mt7915_dev *dev,
developerab646612023-03-17 10:43:23 +0800204 bool add);
205 int mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif,
206 struct cfg80211_he_bss_color *he_bss_color);
207+int mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif,
208+ u32 changed);
209 int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
210 int enable, u32 changed);
211 int mt7915_mcu_add_obss_spr(struct mt7915_phy *phy, struct ieee80211_vif *vif,
212--
developer8bb192d2023-08-31 11:46:57 +08002132.39.2
developerab646612023-03-17 10:43:23 +0800214