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