The mv643xx ethernet controller limits the packet size for the TX checksum offloading. This patch sets this limits for Kirkwood and Dove which have smaller limits that the default. As a side note, this patch is an updated version of a patch sent some years ago: http://lists.infradead.org/pipermail/linux-arm-kernel/2010-June/017320.html which seems to have been lost. Signed-off-by: Arnaud Patard Index: alunn/arch/arm/mach-dove/common.c =================================================================== --- alunn.orig/arch/arm/mach-dove/common.c 2012-07-26 12:04:52.433913851 +0200 +++ alunn/arch/arm/mach-dove/common.c 2012-07-26 12:05:11.321913026 +0200 @@ -102,7 +102,8 @@ void __init dove_ehci1_init(void) void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) { orion_ge00_init(eth_data, DOVE_GE00_PHYS_BASE, - IRQ_DOVE_GE00_SUM, IRQ_DOVE_GE00_ERR); + IRQ_DOVE_GE00_SUM, IRQ_DOVE_GE00_ERR, + 1600); } /***************************************************************************** Index: alunn/arch/arm/mach-kirkwood/common.c =================================================================== --- alunn.orig/arch/arm/mach-kirkwood/common.c 2012-07-26 12:04:52.433913851 +0200 +++ alunn/arch/arm/mach-kirkwood/common.c 2012-07-26 12:05:11.341913018 +0200 @@ -301,7 +301,7 @@ void __init kirkwood_ge00_init(struct mv { orion_ge00_init(eth_data, GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, - IRQ_KIRKWOOD_GE00_ERR); + IRQ_KIRKWOOD_GE00_ERR, 1600); /* The interface forgets the MAC address assigned by u-boot if the clock is turned off, so claim the clk now. */ clk_prepare_enable(ge0); @@ -315,7 +315,7 @@ void __init kirkwood_ge01_init(struct mv { orion_ge01_init(eth_data, GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, - IRQ_KIRKWOOD_GE01_ERR); + IRQ_KIRKWOOD_GE01_ERR, 1600); clk_prepare_enable(ge1); } Index: alunn/arch/arm/mach-mv78xx0/common.c =================================================================== --- alunn.orig/arch/arm/mach-mv78xx0/common.c 2012-07-26 12:04:52.433913851 +0200 +++ alunn/arch/arm/mach-mv78xx0/common.c 2012-07-26 12:05:11.365913016 +0200 @@ -213,7 +213,8 @@ void __init mv78xx0_ge00_init(struct mv6 { orion_ge00_init(eth_data, GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, - IRQ_MV78XX0_GE_ERR); + IRQ_MV78XX0_GE_ERR, + MV643XX_TX_CSUM_DEFAULT_LIMIT); } @@ -224,7 +225,8 @@ void __init mv78xx0_ge01_init(struct mv6 { orion_ge01_init(eth_data, GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, - NO_IRQ); + NO_IRQ, + MV643XX_TX_CSUM_DEFAULT_LIMIT); } Index: alunn/arch/arm/mach-orion5x/common.c =================================================================== --- alunn.orig/arch/arm/mach-orion5x/common.c 2012-07-26 12:04:52.433913851 +0200 +++ alunn/arch/arm/mach-orion5x/common.c 2012-07-26 12:05:11.365913016 +0200 @@ -109,7 +109,8 @@ void __init orion5x_eth_init(struct mv64 { orion_ge00_init(eth_data, ORION5X_ETH_PHYS_BASE, IRQ_ORION5X_ETH_SUM, - IRQ_ORION5X_ETH_ERR); + IRQ_ORION5X_ETH_ERR, + MV643XX_TX_CSUM_DEFAULT_LIMIT); } Index: alunn/arch/arm/plat-orion/common.c =================================================================== --- alunn.orig/arch/arm/plat-orion/common.c 2012-07-26 12:04:52.433913851 +0200 +++ alunn/arch/arm/plat-orion/common.c 2012-07-26 12:05:11.369913016 +0200 @@ -291,10 +291,12 @@ static struct platform_device orion_ge00 void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, unsigned long mapbase, unsigned long irq, - unsigned long irq_err) + unsigned long irq_err, + unsigned int tx_csum_limit) { fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, mapbase + 0x2000, SZ_16K - 1, irq_err); + orion_ge00_shared_data.tx_csum_limit = tx_csum_limit; ge_complete(&orion_ge00_shared_data, orion_ge00_resources, irq, &orion_ge00_shared, eth_data, &orion_ge00); @@ -343,10 +345,12 @@ static struct platform_device orion_ge01 void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, unsigned long mapbase, unsigned long irq, - unsigned long irq_err) + unsigned long irq_err, + unsigned int tx_csum_limit) { fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, mapbase + 0x2000, SZ_16K - 1, irq_err); + orion_ge01_shared_data.tx_csum_limit = tx_csum_limit; ge_complete(&orion_ge01_shared_data, orion_ge01_resources, irq, &orion_ge01_shared, eth_data, &orion_ge01); Index: alunn/arch/arm/plat-orion/include/plat/common.h =================================================================== --- alunn.orig/arch/arm/plat-orion/include/plat/common.h 2012-07-26 12:04:52.433913851 +0200 +++ alunn/arch/arm/plat-orion/include/plat/common.h 2012-07-26 12:05:11.369913016 +0200 @@ -39,12 +39,14 @@ void __init orion_rtc_init(unsigned long void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, unsigned long mapbase, unsigned long irq, - unsigned long irq_err); + unsigned long irq_err, + unsigned int tx_csum_limit); void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, unsigned long mapbase, unsigned long irq, - unsigned long irq_err); + unsigned long irq_err, + unsigned int tx_csum_limit); void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, unsigned long mapbase, Index: alunn/include/linux/mv643xx_eth.h =================================================================== --- alunn.orig/include/linux/mv643xx_eth.h 2012-07-26 12:04:52.433913851 +0200 +++ alunn/include/linux/mv643xx_eth.h 2012-07-26 12:05:11.369913016 +0200 @@ -15,6 +15,8 @@ #define MV643XX_ETH_SIZE_REG_4 0x2224 #define MV643XX_ETH_BASE_ADDR_ENABLE_REG 0x2290 +#define MV643XX_TX_CSUM_DEFAULT_LIMIT 0 + struct mv643xx_eth_shared_platform_data { struct mbus_dram_target_info *dram; struct platform_device *shared_smi;