mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2026-03-14 23:09:45 +01:00
kernel: mtk_eth_soc: fix tx vlan tag for llc packets
When sending llc packets with vlan tx offload, the hardware fails to actually add the tag. Deal with this by fixing it up in software. Fixes: https://github.com/openwrt/openwrt/issues/19916 Reported-by: Thibaut VARENE <hacks@slashdirt.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
e1564c4fab
commit
f7d4036555
4 changed files with 82 additions and 4 deletions
|
|
@ -37,7 +37,7 @@ Signed-off-by: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
|
|||
.glo_cfg = 0x4604,
|
||||
.rst_idx = 0x4608,
|
||||
.delay_irq = 0x460c,
|
||||
@@ -3901,6 +3904,56 @@ static void mtk_set_mcr_max_rx(struct mt
|
||||
@@ -3909,6 +3912,56 @@ static void mtk_set_mcr_max_rx(struct mt
|
||||
mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id));
|
||||
}
|
||||
|
||||
|
|
@ -94,7 +94,7 @@ Signed-off-by: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
|
|||
static void mtk_hw_reset(struct mtk_eth *eth)
|
||||
{
|
||||
u32 val;
|
||||
@@ -4380,6 +4433,8 @@ static void mtk_pending_work(struct work
|
||||
@@ -4388,6 +4441,8 @@ static void mtk_pending_work(struct work
|
||||
rtnl_lock();
|
||||
set_bit(MTK_RESETTING, ð->state);
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ Signed-off-by: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
|
|||
.glo_cfg = 0x4604,
|
||||
.rst_idx = 0x4608,
|
||||
.delay_irq = 0x460c,
|
||||
@@ -3899,6 +3902,56 @@ static void mtk_set_mcr_max_rx(struct mt
|
||||
@@ -3907,6 +3910,56 @@ static void mtk_set_mcr_max_rx(struct mt
|
||||
mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id));
|
||||
}
|
||||
|
||||
|
|
@ -94,7 +94,7 @@ Signed-off-by: Bo-Cun Chen <bc-bocun.chen@mediatek.com>
|
|||
static void mtk_hw_reset(struct mtk_eth *eth)
|
||||
{
|
||||
u32 val;
|
||||
@@ -4374,6 +4427,8 @@ static void mtk_pending_work(struct work
|
||||
@@ -4382,6 +4435,8 @@ static void mtk_pending_work(struct work
|
||||
rtnl_lock();
|
||||
set_bit(MTK_RESETTING, ð->state);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sun, 31 Aug 2025 20:05:13 +0200
|
||||
Subject: [PATCH] net: ethernet: mtk_eth_soc: fix tx vlan tag for llc packets
|
||||
|
||||
When sending llc packets with vlan tx offload, the hardware fails to
|
||||
actually add the tag. Deal with this by fixing it up in software.
|
||||
|
||||
Fixes: 656e705243fd ("net-next: mediatek: add support for MT7623 ethernet")
|
||||
Reported-by: Thibaut VARENE <hacks@slashdirt.org>
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1778,6 +1778,13 @@ static netdev_tx_t mtk_start_xmit(struct
|
||||
bool gso = false;
|
||||
int tx_num;
|
||||
|
||||
+ if (skb_vlan_tag_present(skb) &&
|
||||
+ !eth_proto_is_802_3(eth_hdr(skb)->h_proto)) {
|
||||
+ skb = __vlan_hwaccel_push_inside(skb);
|
||||
+ if (!skb)
|
||||
+ goto dropped;
|
||||
+ }
|
||||
+
|
||||
/* normally we can rely on the stack not calling this more than once,
|
||||
* however we have 2 queues running on the same ring so we need to lock
|
||||
* the ring access
|
||||
@@ -1841,8 +1848,9 @@ static netdev_tx_t mtk_start_xmit(struct
|
||||
|
||||
drop:
|
||||
spin_unlock(ð->page_lock);
|
||||
- stats->tx_dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
+dropped:
|
||||
+ stats->tx_dropped++;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
From: Felix Fietkau <nbd@nbd.name>
|
||||
Date: Sun, 31 Aug 2025 20:05:13 +0200
|
||||
Subject: [PATCH] net: ethernet: mtk_eth_soc: fix tx vlan tag for llc packets
|
||||
|
||||
When sending llc packets with vlan tx offload, the hardware fails to
|
||||
actually add the tag. Deal with this by fixing it up in software.
|
||||
|
||||
Fixes: 656e705243fd ("net-next: mediatek: add support for MT7623 ethernet")
|
||||
Reported-by: Thibaut VARENE <hacks@slashdirt.org>
|
||||
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
||||
---
|
||||
|
||||
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
||||
@@ -1773,6 +1773,13 @@ static netdev_tx_t mtk_start_xmit(struct
|
||||
bool gso = false;
|
||||
int tx_num;
|
||||
|
||||
+ if (skb_vlan_tag_present(skb) &&
|
||||
+ !eth_proto_is_802_3(eth_hdr(skb)->h_proto)) {
|
||||
+ skb = __vlan_hwaccel_push_inside(skb);
|
||||
+ if (!skb)
|
||||
+ goto dropped;
|
||||
+ }
|
||||
+
|
||||
/* normally we can rely on the stack not calling this more than once,
|
||||
* however we have 2 queues running on the same ring so we need to lock
|
||||
* the ring access
|
||||
@@ -1836,8 +1843,9 @@ static netdev_tx_t mtk_start_xmit(struct
|
||||
|
||||
drop:
|
||||
spin_unlock(ð->page_lock);
|
||||
- stats->tx_dropped++;
|
||||
dev_kfree_skb_any(skb);
|
||||
+dropped:
|
||||
+ stats->tx_dropped++;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
Loading…
Add table
Reference in a new issue