| From 8b591f425b1bb71ebde4a1eb9c926f0c9017fe28 Mon Sep 17 00:00:00 2001 |
| From: MeiChia Chiu <meichia.chiu@mediatek.com> |
| Date: Mon, 27 Mar 2023 09:47:44 +0800 |
| Subject: [PATCH 29/39] wifi: mt76: mt7996: Update beacon size limitation for |
| 11v |
| |
| The TLV size limitation for these two has been expanded to |
| accommodate 11v MBSSID IE. |
| |
| Co-developed-by: Peter Chiu <chui-hao.chiu@mediatek.com> |
| Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com> |
| Co-developed-by: Money Wang <Money.Wang@mediatek.com> |
| Signed-off-by: Money Wang <Money.Wang@mediatek.com> |
| Signed-off-by: MeiChia Chiu <MeiChia.Chiu@mediatek.com> |
| --- |
| mt7996/main.c | 4 ++-- |
| mt7996/mcu.c | 39 +++++++++++++++++++++++---------------- |
| mt7996/mcu.h | 11 ++++------- |
| 3 files changed, 29 insertions(+), 25 deletions(-) |
| |
| diff --git a/mt7996/main.c b/mt7996/main.c |
| index 6c38993..520f250 100644 |
| --- a/mt7996/main.c |
| +++ b/mt7996/main.c |
| @@ -618,8 +618,8 @@ static void mt7996_bss_info_changed(struct ieee80211_hw *hw, |
| mt7996_mcu_add_beacon(hw, vif, info->enable_beacon); |
| } |
| |
| - if (changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP || |
| - changed & BSS_CHANGED_FILS_DISCOVERY) |
| + if (changed & (BSS_CHANGED_UNSOL_BCAST_PROBE_RESP | |
| + BSS_CHANGED_FILS_DISCOVERY)) |
| mt7996_mcu_beacon_inband_discov(dev, vif, changed); |
| |
| mutex_unlock(&dev->mt76.mutex); |
| diff --git a/mt7996/mcu.c b/mt7996/mcu.c |
| index a369a08..7b8f883 100644 |
| --- a/mt7996/mcu.c |
| +++ b/mt7996/mcu.c |
| @@ -2257,7 +2257,7 @@ mt7996_mcu_beacon_cont(struct mt7996_dev *dev, struct ieee80211_vif *vif, |
| bcn->bcc_ie_pos = cpu_to_le16(offset - 3); |
| } |
| |
| - buf = (u8 *)bcn + sizeof(*bcn) - MAX_BEACON_SIZE; |
| + buf = (u8 *)bcn + sizeof(*bcn); |
| mt7996_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, NULL, 0, 0, |
| BSS_CHANGED_BEACON); |
| |
| @@ -2275,28 +2275,21 @@ int mt7996_mcu_add_beacon(struct ieee80211_hw *hw, |
| struct sk_buff *skb, *rskb; |
| struct tlv *tlv; |
| struct bss_bcn_content_tlv *bcn; |
| + int len; |
| |
| if (vif->bss_conf.nontransmitted) |
| return 0; |
| |
| rskb = __mt7996_mcu_alloc_bss_req(&dev->mt76, &mvif->mt76, |
| - MT7996_BEACON_UPDATE_SIZE); |
| + MT7996_MAX_BSS_OFFLOAD_SIZE); |
| if (IS_ERR(rskb)) |
| return PTR_ERR(rskb); |
| |
| - tlv = mt7996_mcu_add_uni_tlv(rskb, |
| - UNI_BSS_INFO_BCN_CONTENT, sizeof(*bcn)); |
| - bcn = (struct bss_bcn_content_tlv *)tlv; |
| - bcn->enable = en; |
| - |
| - if (!en) |
| - goto out; |
| - |
| skb = ieee80211_beacon_get_template(hw, vif, &offs, 0); |
| if (!skb) |
| return -EINVAL; |
| |
| - if (skb->len > MAX_BEACON_SIZE - MT_TXD_SIZE) { |
| + if (skb->len > MT7996_MAX_BEACON_SIZE) { |
| dev_err(dev->mt76.dev, "Bcn size limit exceed\n"); |
| dev_kfree_skb(skb); |
| return -EINVAL; |
| @@ -2305,11 +2298,19 @@ int mt7996_mcu_add_beacon(struct ieee80211_hw *hw, |
| info = IEEE80211_SKB_CB(skb); |
| info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->mt76->band_idx); |
| |
| + len = sizeof(*bcn) + MT_TXD_SIZE + skb->len; |
| + tlv = mt7996_mcu_add_uni_tlv(rskb, |
| + UNI_BSS_INFO_BCN_CONTENT, len); |
| + bcn = (struct bss_bcn_content_tlv *)tlv; |
| + bcn->enable = en; |
| + if (!en) |
| + goto out; |
| + |
| mt7996_mcu_beacon_cont(dev, vif, rskb, skb, bcn, &offs); |
| mt7996_mcu_beacon_mbss(rskb, skb, vif, bcn, &offs); |
| mt7996_mcu_beacon_cntdwn(vif, rskb, skb, &offs); |
| - dev_kfree_skb(skb); |
| out: |
| + dev_kfree_skb(skb); |
| return mt76_mcu_skb_send_msg(&phy->dev->mt76, rskb, |
| MCU_WMWA_UNI_CMD(BSS_INFO_UPDATE), true); |
| } |
| @@ -2330,9 +2331,13 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev, |
| struct sk_buff *rskb, *skb = NULL; |
| struct tlv *tlv; |
| u8 *buf, interval; |
| + int len; |
| + |
| + if (vif->bss_conf.nontransmitted) |
| + return 0; |
| |
| rskb = __mt7996_mcu_alloc_bss_req(&dev->mt76, &mvif->mt76, |
| - MT7996_INBAND_FRAME_SIZE); |
| + MT7996_MAX_BSS_OFFLOAD_SIZE); |
| if (IS_ERR(rskb)) |
| return PTR_ERR(rskb); |
| |
| @@ -2349,7 +2354,7 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev, |
| if (!skb) |
| return -EINVAL; |
| |
| - if (skb->len > MAX_INBAND_FRAME_SIZE - MT_TXD_SIZE) { |
| + if (skb->len > MT7996_MAX_BEACON_SIZE) { |
| dev_err(dev->mt76.dev, "inband discovery size limit exceed\n"); |
| dev_kfree_skb(skb); |
| return -EINVAL; |
| @@ -2360,7 +2365,9 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev, |
| info->band = band; |
| info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->mt76->band_idx); |
| |
| - tlv = mt7996_mcu_add_uni_tlv(rskb, UNI_BSS_INFO_OFFLOAD, sizeof(*discov)); |
| + len = sizeof(*discov) + MT_TXD_SIZE + skb->len; |
| + |
| + tlv = mt7996_mcu_add_uni_tlv(rskb, UNI_BSS_INFO_OFFLOAD, len); |
| |
| discov = (struct bss_inband_discovery_tlv *)tlv; |
| discov->tx_mode = OFFLOAD_TX_MODE_SU; |
| @@ -2371,7 +2378,7 @@ int mt7996_mcu_beacon_inband_discov(struct mt7996_dev *dev, |
| discov->enable = true; |
| discov->wcid = cpu_to_le16(MT7996_WTBL_RESERVED); |
| |
| - buf = (u8 *)tlv + sizeof(*discov) - MAX_INBAND_FRAME_SIZE; |
| + buf = (u8 *)tlv + sizeof(*discov); |
| |
| mt7996_mac_write_txwi(dev, (__le32 *)buf, skb, wcid, NULL, 0, 0, changed); |
| |
| diff --git a/mt7996/mcu.h b/mt7996/mcu.h |
| index 4ba06d9..eed7371 100644 |
| --- a/mt7996/mcu.h |
| +++ b/mt7996/mcu.h |
| @@ -308,8 +308,6 @@ struct bss_inband_discovery_tlv { |
| u8 enable; |
| __le16 wcid; |
| __le16 prob_rsp_len; |
| -#define MAX_INBAND_FRAME_SIZE 512 |
| - u8 pkt[MAX_INBAND_FRAME_SIZE]; |
| } __packed; |
| |
| struct bss_bcn_content_tlv { |
| @@ -321,8 +319,6 @@ struct bss_bcn_content_tlv { |
| u8 enable; |
| u8 type; |
| __le16 pkt_len; |
| -#define MAX_BEACON_SIZE 512 |
| - u8 pkt[MAX_BEACON_SIZE]; |
| } __packed; |
| |
| struct bss_bcn_cntdwn_tlv { |
| @@ -629,13 +625,14 @@ enum { |
| sizeof(struct sta_rec_hdr_trans) + \ |
| sizeof(struct tlv)) |
| |
| +#define MT7996_MAX_BEACON_SIZE 1342 |
| #define MT7996_BEACON_UPDATE_SIZE (sizeof(struct bss_req_hdr) + \ |
| sizeof(struct bss_bcn_content_tlv) + \ |
| + MT_TXD_SIZE + \ |
| sizeof(struct bss_bcn_cntdwn_tlv) + \ |
| sizeof(struct bss_bcn_mbss_tlv)) |
| - |
| -#define MT7996_INBAND_FRAME_SIZE (sizeof(struct bss_req_hdr) + \ |
| - sizeof(struct bss_inband_discovery_tlv)) |
| +#define MT7996_MAX_BSS_OFFLOAD_SIZE (MT7996_MAX_BEACON_SIZE + \ |
| + MT7996_BEACON_UPDATE_SIZE) |
| |
| enum { |
| UNI_BAND_CONFIG_RADIO_ENABLE, |
| -- |
| 2.18.0 |
| |