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

Fix Vitesse RGMII-ID support

The Vitesse PHY on the 8641D needs to be set up with internal delay to
work in RGMII mode. So we add skew when it is set to RGMII_ID mode.

Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: Haruki Dai <Dai.Haruki@freescale.com>
Signed-off-by: Haiying Wang <Haiying.Wang@freescale.com>

authored by

Andy Fleming and committed by
Jeff Garzik
af2d940d cc65185d

+20 -3
+20 -3
drivers/net/phy/vitesse.c
··· 21 21 /* Vitesse Extended Control Register 1 */ 22 22 #define MII_VSC8244_EXT_CON1 0x17 23 23 #define MII_VSC8244_EXTCON1_INIT 0x0000 24 + #define MII_VSC8244_EXTCON1_TX_SKEW_MASK 0x0c00 25 + #define MII_VSC8244_EXTCON1_RX_SKEW_MASK 0x0300 26 + #define MII_VSC8244_EXTCON1_TX_SKEW 0x0800 27 + #define MII_VSC8244_EXTCON1_RX_SKEW 0x0200 24 28 25 29 /* Vitesse Interrupt Mask Register */ 26 30 #define MII_VSC8244_IMASK 0x19 ··· 43 39 44 40 /* Vitesse Auxiliary Control/Status Register */ 45 41 #define MII_VSC8244_AUX_CONSTAT 0x1c 46 - #define MII_VSC8244_AUXCONSTAT_INIT 0x0004 42 + #define MII_VSC8244_AUXCONSTAT_INIT 0x0000 47 43 #define MII_VSC8244_AUXCONSTAT_DUPLEX 0x0020 48 44 #define MII_VSC8244_AUXCONSTAT_SPEED 0x0018 49 45 #define MII_VSC8244_AUXCONSTAT_GBIT 0x0010 ··· 55 51 56 52 static int vsc824x_config_init(struct phy_device *phydev) 57 53 { 54 + int extcon; 58 55 int err; 59 56 60 57 err = phy_write(phydev, MII_VSC8244_AUX_CONSTAT, ··· 63 58 if (err < 0) 64 59 return err; 65 60 66 - err = phy_write(phydev, MII_VSC8244_EXT_CON1, 67 - MII_VSC8244_EXTCON1_INIT); 61 + extcon = phy_read(phydev, MII_VSC8244_EXT_CON1); 62 + 63 + if (extcon < 0) 64 + return err; 65 + 66 + extcon &= ~(MII_VSC8244_EXTCON1_TX_SKEW_MASK | 67 + MII_VSC8244_EXTCON1_RX_SKEW_MASK); 68 + 69 + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 70 + extcon |= (MII_VSC8244_EXTCON1_TX_SKEW | 71 + MII_VSC8244_EXTCON1_RX_SKEW); 72 + 73 + err = phy_write(phydev, MII_VSC8244_EXT_CON1, extcon); 74 + 68 75 return err; 69 76 } 70 77