linux/drivers/net/ethernet/freescale
Zefir Kurtisi 6c389fc931 gianfar: fix size of scatter-gathered frames
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
DSA (4), GMAC_FCB_LEN (8), and FSL_GIANFAR_DEV_HAS_TIMER
(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: Zefir Kurtisi <zefir.kurtisi@neratec.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2016-08-23 16:49:00 -07:00
..
fman remove lots of IS_ERR_VALUE abuses 2016-05-27 15:26:11 -07:00
fs_enet net: ethernet: fs-enet: use phy_ethtool_{get|set}_link_ksettings 2016-05-16 22:16:32 -04:00
fec_main.c ARM: SoC platform updates for v4.8 2016-08-01 18:27:08 -04:00
fec_mpc52xx_phy.c mdio: Move allocation of interrupts into core 2016-01-07 14:31:26 -05:00
fec_mpc52xx.c net: ethernet: fec-mpc52xx: use phy_ethtool_{get|set}_link_ksettings 2016-05-16 22:20:06 -04:00
fec_mpc52xx.h
fec_ptp.c net: fec: avoid timespec use 2015-10-05 03:16:39 -07:00
fec.h ARM: SoC platform updates for v4.8 2016-08-01 18:27:08 -04:00
fsl_pq_mdio.c powerpc updates for 4.5 2016-01-15 13:18:47 -08:00
gianfar_ethtool.c net: ethernet: gianfar: use phy_ethtool_{get|set}_link_ksettings 2016-05-16 21:51:40 -04:00
gianfar_ptp.c gianfar_ptp: replace get_of_u32 with of_property_read_u32 2016-02-25 16:22:02 -05:00
gianfar.c gianfar: fix size of scatter-gathered frames 2016-08-23 16:49:00 -07:00
gianfar.h gianfar: prevent fragmentation in DSA environments 2016-08-23 16:48:59 -07:00
Kconfig fsl/fman: Add FMan MURAM support 2015-12-27 20:51:39 -05:00
Makefile net: fec: make driver endian-safe 2016-01-25 10:51:52 -08:00
ucc_geth_ethtool.c net: ethernet: ucc: move to new ethtool api {get|set}_link_ksettings 2016-05-03 13:03:52 -04:00
ucc_geth.c powerpc updates for 4.5 2016-01-15 13:18:47 -08:00
ucc_geth.h QE: Move QE from arch/powerpc to drivers/soc 2015-12-22 17:12:56 -06:00
xgmac_mdio.c net/fsl: constify of_device_id array 2015-03-17 15:00:21 -04:00