Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] PPC44x EMAC driver: disable TX status deferral in half-duplex mode

Disable TX status deferral (EMACx_MR[MWSW=001]) in half-duplex mode.
I have two reports when EMAC stops transmitting when connected to a
hub. TX ring debug printouts show complete mess when this happens,
probably hardware collision handling doesn't work quite well in this
mode.

This is relevant only for SoCs with EMAC4 core (440GX, 440SP, 440SPe).
Tested on 440GX.

Signed-off-by: Eugene Surovegin <ebs@ebshome.net>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>

authored by

Eugene Surovegin and committed by
Jeff Garzik
38843888 a4bf26f3

+3 -2
+2 -1
drivers/net/ibm_emac/ibm_emac.h
··· 110 110 #define EMAC_MR1_TFS_2K 0x00080000 111 111 #define EMAC_MR1_TR0_MULT 0x00008000 112 112 #define EMAC_MR1_JPSM 0x00000000 113 + #define EMAC_MR1_MWSW_001 0x00000000 113 114 #define EMAC_MR1_BASE(opb) (EMAC_MR1_TFS_2K | EMAC_MR1_TR0_MULT) 114 115 #else 115 116 #define EMAC_MR1_RFS_4K 0x00180000 ··· 131 130 (freq) <= 83 ? EMAC_MR1_OBCI_83 : \ 132 131 (freq) <= 100 ? EMAC_MR1_OBCI_100 : EMAC_MR1_OBCI_100P) 133 132 #define EMAC_MR1_BASE(opb) (EMAC_MR1_TFS_2K | EMAC_MR1_TR | \ 134 - EMAC_MR1_MWSW_001 | EMAC_MR1_OBCI(opb)) 133 + EMAC_MR1_OBCI(opb)) 135 134 #endif 136 135 137 136 /* EMACx_TMR0 */
+1 -1
drivers/net/ibm_emac/ibm_emac_core.c
··· 408 408 /* Mode register */ 409 409 r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST; 410 410 if (dev->phy.duplex == DUPLEX_FULL) 411 - r |= EMAC_MR1_FDE; 411 + r |= EMAC_MR1_FDE | EMAC_MR1_MWSW_001; 412 412 dev->stop_timeout = STOP_TIMEOUT_10; 413 413 switch (dev->phy.speed) { 414 414 case SPEED_1000: