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