[PATCH] realtek: fix RTL838x receive tag decoding

Sander Vanheule sander at svanheule.net
Thu Sep 8 12:50:14 PDT 2022


Hi Bjørn,

On Thu, 2022-09-08 at 19:35 +0200, Bjørn Mork wrote:
> 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.
> 
> Based-on-fix-by: Jan Hoffmann <jan at 3e8.eu>

checkpatch.pl complains about this tag:
WARNING: Non-standard signature: Based-on-fix-by:

Mind if I change it to Suggested-by?

> Fixes: dc9cc0d3e2a1 ("realtek: add QoS and rate control")
> Signed-off-by: Bjørn Mork <bjorn at mork.no>

Thanks for the patch!

Best,
Sander

> ---
>  .../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 0eee06d803ad..d9ade6552698 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 openwrt-devel mailing list