[PATCH 1/2] net: dsa: ksz: pad frame to 64 bytes for transmission

From: Jean Pihet
Date: Sun Nov 29 2020 - 05:25:14 EST


Some ethernet controllers (e.g. TI CPSW) pad the frames to a minimum
of 64 bytes before the FCS is appended. This causes an issue with the
KSZ tail tag which could not be the last byte before the FCS.
Solve this by padding the frame to 64 bytes minus the tail tag size,
before the tail tag is added and the frame is passed for transmission.

Signed-off-by: Jean Pihet <jean.pihet@xxxxxxxxxxxxxx>
---
net/dsa/tag_ksz.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c
index 0a5aa982c60d..0074702dcbbc 100644
--- a/net/dsa/tag_ksz.c
+++ b/net/dsa/tag_ksz.c
@@ -19,8 +19,13 @@ static struct sk_buff *ksz_common_xmit(struct sk_buff *skb,
{
struct sk_buff *nskb;
int padlen;
+ const int min_len = ETH_ZLEN + ETH_FCS_LEN;

- padlen = (skb->len >= ETH_ZLEN) ? 0 : ETH_ZLEN - skb->len;
+ /*
+ * Pad to the minimum ethernet frame size, minus the size of the
+ * tail tag which will be appended at the very end, before the FCS.
+ */
+ padlen = (skb->len >= min_len) ? 0 : min_len - skb->len - len;

if (skb_tailroom(skb) >= padlen + len) {
/* Let dsa_slave_xmit() free skb */
--
2.26.2