[openwrt/openwrt] realtek: fix RTL838x receive tag decoding

LEDE Commits lede-commits at lists.infradead.org
Thu Sep 8 13:36:39 PDT 2022


svanheule pushed a commit to openwrt/openwrt.git, branch openwrt-22.03:
https://git.openwrt.org/47ba7cdfc34d1fde837a5840c009dafa2fba377b

commit 47ba7cdfc34d1fde837a5840c009dafa2fba377b
Author: Bjørn Mork <bjorn at mork.no>
AuthorDate: Thu Sep 8 19:35:34 2022 +0200

    realtek: fix RTL838x receive tag decoding
    
    Commit dc9cc0d3e2a1 ("realtek: add QoS and rate control") replaced a
    16 bit reserved field in the RTL83xx packet header with the initial
    cpu_tag word, shifting the real cpu_tag fields by one.  Adjusting for
    this new shift was partially forgotten in the new RX tag decoders.
    
    This caused the switch to block IGMP, effectively blocking IPv4
    multicast.
    
    The bug was partially fixed by commit 9d847244d9fd ("realtek: fix
    RTL839X receive tag decoding")
    
    Fix on RTL838x too, including correct NIC_RX_REASON_SPECIAL_TRAP value.
    
    Suggested-by: Jan Hoffmann <jan at 3e8.eu>
    Fixes: dc9cc0d3e2a1 ("realtek: add QoS and rate control")
    Signed-off-by: Bjørn Mork <bjorn at mork.no>
    (cherry picked from commit 545c6113c93bbf7de1b0e515141a4565f7e6cece)
---
 .../linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c  | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c b/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c
index 0eee06d803..d9ade65526 100644
--- a/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c
+++ b/target/linux/realtek/files-5.10/drivers/net/ethernet/rtl838x_eth.c
@@ -58,6 +58,7 @@ struct p_hdr {
 	uint16_t	size;		/* buffer size */
 	uint16_t	offset;
 	uint16_t	len;		/* pkt len */
+	/* cpu_tag[0] is a reserved uint16_t on RTL83xx */
 	uint16_t	cpu_tag[10];
 } __packed __aligned(1);
 
@@ -262,13 +263,14 @@ struct dsa_tag {
 
 bool rtl838x_decode_tag(struct p_hdr *h, struct dsa_tag *t)
 {
-	t->reason = h->cpu_tag[3] & 0xf;
-	t->queue = (h->cpu_tag[0] & 0xe0) >> 5;
+	/* cpu_tag[0] is reserved. Fields are off-by-one */
+	t->reason = h->cpu_tag[4] & 0xf;
+	t->queue = (h->cpu_tag[1] & 0xe0) >> 5;
 	t->port = h->cpu_tag[1] & 0x1f;
 	t->crc_error = t->reason == 13;
 
 	pr_debug("Reason: %d\n", t->reason);
-	if (t->reason != 4) // NIC_RX_REASON_SPECIAL_TRAP
+	if (t->reason != 6) // NIC_RX_REASON_SPECIAL_TRAP
 		t->l2_offloaded = 1;
 	else
 		t->l2_offloaded = 0;
@@ -278,6 +280,7 @@ bool rtl838x_decode_tag(struct p_hdr *h, struct dsa_tag *t)
 
 bool rtl839x_decode_tag(struct p_hdr *h, struct dsa_tag *t)
 {
+	/* cpu_tag[0] is reserved. Fields are off-by-one */
 	t->reason = h->cpu_tag[5] & 0x1f;
 	t->queue = (h->cpu_tag[3] & 0xe000) >> 13;
 	t->port = h->cpu_tag[1] & 0x3f;




More information about the lede-commits mailing list