wifi: mt76: connac: add support for IEEE 802.11 fragmentation
authorBenjamin Lin <benjamin-jw.lin@mediatek.com>
Tue, 27 Aug 2024 09:29:56 +0000 (11:29 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 6 Sep 2024 12:23:06 +0000 (14:23 +0200)
Add fragmentation index into TXD.DW2 to support IEEE 802.11 fragmentation.

Signed-off-by: Benjamin Lin <benjamin-jw.lin@mediatek.com>
Link: https://patch.msgid.link/20240827093011.18621-9-nbd@nbd.name
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c

index 5f132115ebfc4ef4d2b723c2843f3f047457c9d2..eb4765365b8ce42c70f38414a9ad420fd705e5cf 100644 (file)
@@ -355,4 +355,11 @@ enum tx_port_idx {
        MT_TX_PORT_IDX_MCU
 };
 
+enum tx_frag_idx {
+       MT_TX_FRAG_NONE,
+       MT_TX_FRAG_FIRST,
+       MT_TX_FRAG_MID,
+       MT_TX_FRAG_LAST
+};
+
 #endif /* __MT76_CONNAC2_MAC_H */
index b841bf628d02670895f9b157970052fd6be293af..a3db65254e37fdaa494a7b311b80fb8ecb7c22c0 100644 (file)
@@ -391,6 +391,7 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
        bool multicast = is_multicast_ether_addr(hdr->addr1);
        u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
        __le16 fc = hdr->frame_control;
+       __le16 sc = hdr->seq_ctrl;
        u8 fc_type, fc_stype;
        u32 val;
 
@@ -432,6 +433,13 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_dev *dev, __le32 *txwi,
            info->flags & IEEE80211_TX_CTL_USE_MINRATE)
                val |= MT_TXD2_FIX_RATE;
 
+       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);
+
        txwi[2] |= cpu_to_le32(val);
 
        if (ieee80211_is_beacon(fc)) {
@@ -440,7 +448,7 @@ mt76_connac2_mac_write_txwi_80211(struct mt76_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;