diff mbox series

realtek: Fix buffer length calculation on RTL8380 with CRC offload

Message ID c0bff218-6b7d-8476-1fd0-c5b2276d3d26@birger-koblitz.de
State Superseded
Delegated to: Hauke Mehrtens
Headers show
Series realtek: Fix buffer length calculation on RTL8380 with CRC offload | expand

Commit Message

Birger Koblitz May 9, 2021, 5:32 p.m. UTC
realtek: Fix buffer length calculation on RTL8380 with CRC offload

Fixes the buffer and packet length calculations for Ethernet TX on
the RTL8380 SoC when CRC calculation offload is enabled.
CRC-offload is always done by the SoC, but additional CRC
calculation was previously done also by the kernel.
It also fixes detection of the DSA tag for packets on RTL8390
SoCs for ports > 28.

Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>

---

Comments

Hauke Mehrtens June 5, 2021, 8:14 p.m. UTC | #1
On 5/9/21 7:32 PM, Birger Koblitz wrote:
> realtek: Fix buffer length calculation on RTL8380 with CRC offload
> 
> Fixes the buffer and packet length calculations for Ethernet TX on
> the RTL8380 SoC when CRC calculation offload is enabled.
> CRC-offload is always done by the SoC, but additional CRC
> calculation was previously done also by the kernel.
> It also fixes detection of the DSA tag for packets on RTL8390
> SoCs for ports > 28.
> 
> Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>


Hi,

This patch does not apply to master for me.

Hauke
Birger Koblitz June 6, 2021, 2:20 p.m. UTC | #2
Hi,

I messed up the whitespace, sorry!
Will send v2.

Birger

On 05.06.21 22:14, Hauke Mehrtens wrote:
> On 5/9/21 7:32 PM, Birger Koblitz wrote:
>> realtek: Fix buffer length calculation on RTL8380 with CRC offload
>>
>> Fixes the buffer and packet length calculations for Ethernet TX on
>> the RTL8380 SoC when CRC calculation offload is enabled.
>> CRC-offload is always done by the SoC, but additional CRC
>> calculation was previously done also by the kernel.
>> It also fixes detection of the DSA tag for packets on RTL8390
>> SoCs for ports > 28.
>>
>> Signed-off-by: Birger Koblitz <mail@birger-koblitz.de>
> 
> 
> Hi,
> 
> This patch does not apply to master for me.
> 
> Hauke
>
diff mbox series

Patch

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);