]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mt76: connac: add IEEE 802.11 fragmentation support for mt7996
authorBenjamin Lin <benjamin-jw.lin@mediatek.com>
Fri, 16 Aug 2024 09:46:34 +0000 (17:46 +0800)
committerFelix Fietkau <nbd@nbd.name>
Fri, 6 Sep 2024 09:14:31 +0000 (11:14 +0200)
Add fragment index into TXD.DW2 to support IEEE 802.11 fragmentation.

Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20240816094635.2391-10-shayne.chen@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac3_mac.h
drivers/net/wireless/mediatek/mt76/mt7996/mac.c

index 353e66069840936d9c63fa6193ccd4a16b18bbd2..3fc94bd7271fd22b6a7087a8faaa9cca8378afc5 100644 (file)
@@ -197,6 +197,13 @@ enum tx_mgnt_type {
        MT_TX_ADDBA,
 };
 
+enum tx_frag_idx {
+       MT_TX_FRAG_NONE,
+       MT_TX_FRAG_FIRST,
+       MT_TX_FRAG_MID,
+       MT_TX_FRAG_LAST
+};
+
 #define MT_CT_INFO_APPLY_TXD           BIT(0)
 #define MT_CT_INFO_COPY_HOST_TXD_ALL   BIT(1)
 #define MT_CT_INFO_MGMT_FRAME          BIT(2)
index bc7111a71f98ca06dc630bc8123a2af338fcc024..60446dc2a3b374db72e0c0886102612dec60ffee 100644 (file)
@@ -746,7 +746,7 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        bool multicast = is_multicast_ether_addr(hdr->addr1);
        u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
-       __le16 fc = hdr->frame_control;
+       __le16 fc = hdr->frame_control, sc = hdr->seq_ctrl;
        u8 fc_type, fc_stype;
        u32 val;
 
@@ -780,6 +780,15 @@ mt7996_mac_write_txwi_80211(struct mt7996_dev *dev, __le32 *txwi,
        val = FIELD_PREP(MT_TXD2_FRAME_TYPE, fc_type) |
              FIELD_PREP(MT_TXD2_SUB_TYPE, fc_stype);
 
+       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);
+       else
+               val |= FIELD_PREP(MT_TXD2_FRAG, MT_TX_FRAG_NONE);
+
        txwi[2] |= cpu_to_le32(val);
 
        txwi[3] |= cpu_to_le32(FIELD_PREP(MT_TXD3_BCM, multicast));
@@ -789,7 +798,7 @@ mt7996_mac_write_txwi_80211(struct mt7996_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;