• Zefir Kurtisi's avatar
    gianfar: fix size of scatter-gathered frames · 6c389fc9
    Zefir Kurtisi authored
    The current scatter-gather logic in gianfar is flawed, since
    it does not consider the eTSEC's RxBD 'Data Length' field is
    context depening: for the last fragment it contains the full
    frame size, while fragments contain the fragment size, which
    equals the value written to register MRBLR.
    This causes data corruption as soon as the hardware starts
    to fragment receiving frames. As a result, the size of
    fragmented frames is increased by
    (nr_frags - 1) * MRBLR
    We first noticed this issue working with DSA, where an ICMP
    request sized 1472 bytes causes the scatter-gather logic to
    kick in. The full Ethernet frame (1518) gets increased by
    (priv->padding=8) to a total of 1538 octets, which is
    fragmented by the hardware and reconstructed by the driver
    to a 3074 octet frame.
    This patch fixes the problem by adjusting the size of
    the last fragment.
    It was tested by setting MRBLR to different multiples of
    64, proving correct scatter-gather operation on frames
    with up to 9000 octets in size.
    Signed-off-by: default avatarZefir Kurtisi <zefir.kurtisi@neratec.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
gianfar.c 97.4 KB