| From 5e4084e799b2fbb2608cf2f1d2c186e70ca366e2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 27 Apr 2023 07:05:15 +0800 |
| Subject: wifi: mt76: mt7996: fix header translation logic |
| |
| From: Ryder Lee <ryder.lee@mediatek.com> |
| |
| [ Upstream commit c55b4e788f1dd6ca89cc97cf291d2a03b0b96de1 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 13 +++++++++---- |
| 1 file changed, 9 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c |
| index 9b0f6053e0fa6..25c5deb15d213 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c |
| @@ -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) { |
| -- |
| 2.40.1 |
| |