Birger Koblitz <m...@birger-koblitz.de> writes:

> Yes, this looks like the DSA-tag in the packet buffer is not being 
> overwritten by the CRC.
> Could you try out the following patch, which tries to follow the convolutions 
> of the SDK for the 8380,
> with respect of buffer length and packet length when the CRC is being 
> calculated by offloading.
> On my DLink 1210-10hp I see properly formed packets with small (<60 octets) 
> and larger size.
> It fixes also the detection of DSA tags with a high port number (>=28) on the 
> 8390.
>
> diff --git 
> a/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c 
> b/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c
> index c5c6e3b6b7..9fe4fcd647 100644
> --- a/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c
> +++ b/target/linux/realtek/files-5.4/drivers/net/ethernet/rtl838x_eth.c
> @@ -1129,23 +1129,16 @@ static int rtl838x_eth_tx(struct sk_buff *skb, struct 
> net_device *dev)
>
>       /* Check for DSA tagging at the end of the buffer */
>       if (netdev_uses_dsa(dev) && skb->data[len-4] == 0x80 && 
> skb->data[len-3] > 0
> -                     && skb->data[len-3] < 28 &&  skb->data[len-2] == 0x10
> +                     && skb->data[len-3] < priv->cpu_port &&  
> skb->data[len-2] == 0x10
>                       &&  skb->data[len-1] == 0x00) {
>               /* Reuse tag space for CRC if possible */
>               dest_port = skb->data[len-3];
> +             skb->data[len-4] = skb->data[len-3] = skb->data[len-2] = 
> skb->data[len-1] = 0x00;
>               len -= 4;
>       }
>
>       len += 4; // Add space for CRC
>
> -     // On RTL8380 SoCs, the packet needs extra padding
> -     if (priv->family_id == RTL8380_FAMILY_ID) {
> -             if (len < ETH_ZLEN)
> -                     len = ETH_ZLEN; // SoC not automatically padding to 
> ETH_ZLEN
> -             else
> -                     len += 4;
> -     }
> -
>       if (skb_padto(skb, len)) {
>               ret = NETDEV_TX_OK;
>               goto txdone;
> @@ -1158,6 +1151,11 @@ static int rtl838x_eth_tx(struct sk_buff *skb, struct 
> net_device *dev)
>               h = &ring->tx_header[q][ring->c_tx[q]];
>               h->size = len;
>               h->len = len;
> +             // On RTL8380 SoCs, small packet lengths being sent need 
> adjustments
> +             if (priv->family_id == RTL8380_FAMILY_ID) {
> +                     if (len < ETH_ZLEN - 4)
> +                             h->len -= 4;
> +             }
>
>               priv->r->create_tx_header(h, dest_port, skb->priority >> 1);

Yup, looks much better with that.  No more FCS errors on the untagged
DHCP discovers.


Bjørn

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to