@@ -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 */
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@newoldbits.com> --- net/dsa/tag_ksz.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)