OSDN Git Service

wifi: mt76: mt7996: fix header translation logic
authorRyder Lee <ryder.lee@mediatek.com>
Wed, 26 Apr 2023 23:05:15 +0000 (07:05 +0800)
committerFelix Fietkau <nbd@nbd.name>
Tue, 25 Jul 2023 19:59:40 +0000 (21:59 +0200)
When header translation failure is indicated, the hardware will insert
an extra 2-byte field containing the data length after the protocol
type field. This happens either when the LLC-SNAP pattern did not match,
or if a VLAN header was detected.

The previous commit accidentally breaks the logic, so reverts back.

Fixes: 27db47ab1f47 (wifi: mt76: mt7996: enable mesh HW amsdu/de-amsdu support)
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/mac.c

index 9b0f605..25c5deb 100644 (file)
@@ -836,14 +836,19 @@ mt7996_mac_fill_rx(struct mt7996_dev *dev, struct sk_buff *skb)
                skb_pull(skb, hdr_gap);
                if (!hdr_trans && status->amsdu && !(ieee80211_has_a4(fc) && is_mesh)) {
                        pad_start = ieee80211_get_hdrlen_from_skb(skb);
-               } else if (hdr_trans && (rxd2 & MT_RXD2_NORMAL_HDR_TRANS_ERROR) &&
-                          get_unaligned_be16(skb->data + pad_start) == ETH_P_8021Q) {
+               } else if (hdr_trans && (rxd2 & MT_RXD2_NORMAL_HDR_TRANS_ERROR)) {
                        /* When header translation failure is indicated,
                         * the hardware will insert an extra 2-byte field
                         * containing the data length after the protocol
-                        * type field.
+                        * type field. This happens either when the LLC-SNAP
+                        * pattern did not match, or if a VLAN header was
+                        * detected.
                         */
-                       pad_start = 16;
+                       pad_start = 12;
+                       if (get_unaligned_be16(skb->data + pad_start) == ETH_P_8021Q)
+                               pad_start += 4;
+                       else
+                               pad_start = 0;
                }
 
                if (pad_start) {