realtek: Setup all VLANs with default configurations

Bjørn Mork bjorn at mork.no
Sun May 9 18:03:10 BST 2021


Birger Koblitz <mail at 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



More information about the openwrt-devel mailing list