diff options
Diffstat (limited to 'drivers/net/phy')
| -rw-r--r-- | drivers/net/phy/atheros.c | 8 | ||||
| -rw-r--r-- | drivers/net/phy/micrel.c | 34 | ||||
| -rw-r--r-- | drivers/net/phy/phy.c | 5 | ||||
| -rw-r--r-- | drivers/net/phy/realtek.c | 6 | ||||
| -rw-r--r-- | drivers/net/phy/smsc.c | 3 | ||||
| -rw-r--r-- | drivers/net/phy/vitesse.c | 69 | 
6 files changed, 113 insertions, 12 deletions
| diff --git a/drivers/net/phy/atheros.c b/drivers/net/phy/atheros.c index 0f2dfd612..b20b4df98 100644 --- a/drivers/net/phy/atheros.c +++ b/drivers/net/phy/atheros.c @@ -40,7 +40,7 @@ static int ar8035_config(struct phy_device *phydev)  static struct phy_driver AR8021_driver =  {  	.name = "AR8021",  	.uid = 0x4dd040, -	.mask = 0xfffff0, +	.mask = 0x4fffff,  	.features = PHY_GBIT_FEATURES,  	.config = ar8021_config,  	.startup = genphy_startup, @@ -48,11 +48,11 @@ static struct phy_driver AR8021_driver =  {  };  static struct phy_driver AR8031_driver =  { -	.name = "AR8031", +	.name = "AR8031/AR8033",  	.uid = 0x4dd074, -	.mask = 0xfffff0, +	.mask = 0x4fffff,  	.features = PHY_GBIT_FEATURES, -	.config = genphy_config, +	.config = ar8021_config,  	.startup = genphy_startup,  	.shutdown = genphy_shutdown,  }; diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index a7450f832..5d7e3be52 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -100,6 +100,19 @@ int ksz9021_phy_extended_read(struct phy_device *phydev, int regnum)  	return phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ9021_EXTENDED_DATAR);  } + +static int ksz9021_phy_extread(struct phy_device *phydev, int addr, int devaddr, +			      int regnum) +{ +	return ksz9021_phy_extended_read(phydev, regnum); +} + +static int ksz9021_phy_extwrite(struct phy_device *phydev, int addr, +			       int devaddr, int regnum, u16 val) +{ +	return ksz9021_phy_extended_write(phydev, regnum, val); +} +  /* Micrel ksz9021 */  static int ksz9021_config(struct phy_device *phydev)  { @@ -131,6 +144,8 @@ static struct phy_driver ksz9021_driver = {  	.config = &ksz9021_config,  	.startup = &ksz90xx_startup,  	.shutdown = &genphy_shutdown, +	.writeext = &ksz9021_phy_extwrite, +	.readext = &ksz9021_phy_extread,  };  #endif @@ -171,14 +186,31 @@ int ksz9031_phy_extended_read(struct phy_device *phydev, int devaddr,  	return phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZ9031_MMD_REG_DATA);  } +static int ksz9031_phy_extread(struct phy_device *phydev, int addr, int devaddr, +			       int regnum) +{ +	return ksz9031_phy_extended_read(phydev, devaddr, regnum, +					 MII_KSZ9031_MOD_DATA_NO_POST_INC); +}; + +static int ksz9031_phy_extwrite(struct phy_device *phydev, int addr, +				int devaddr, int regnum, u16 val) +{ +	return ksz9031_phy_extended_write(phydev, devaddr, regnum, +					 MII_KSZ9031_MOD_DATA_POST_INC_RW, val); +}; + +  static struct phy_driver ksz9031_driver = {  	.name = "Micrel ksz9031",  	.uid  = 0x221620, -	.mask = 0xfffffe, +	.mask = 0xfffff0,  	.features = PHY_GBIT_FEATURES,  	.config   = &genphy_config,  	.startup  = &ksz90xx_startup,  	.shutdown = &genphy_shutdown, +	.writeext = &ksz9031_phy_extwrite, +	.readext = &ksz9031_phy_extread,  };  int phy_micrel_init(void) diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 62925bb28..c691fbbbc 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -275,13 +275,14 @@ int genphy_parse_link(struct phy_device *phydev)  	int mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);  	/* We're using autonegotiation */ -	if (mii_reg & BMSR_ANEGCAPABLE) { +	if (phydev->supported & SUPPORTED_Autoneg) {  		u32 lpa = 0;  		int gblpa = 0;  		u32 estatus = 0;  		/* Check for gigabit capability */ -		if (mii_reg & BMSR_ERCAP) { +		if (phydev->supported & (SUPPORTED_1000baseT_Full | +					SUPPORTED_1000baseT_Half)) {  			/* We want a list of states supported by  			 * both PHYs in the link  			 */ diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index ddbbc35e2..a3ace6852 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -102,7 +102,7 @@ static int rtl8211x_startup(struct phy_device *phydev)  static struct phy_driver RTL8211B_driver = {  	.name = "RealTek RTL8211B",  	.uid = 0x1cc910, -	.mask = 0xfffff0, +	.mask = 0xffffff,  	.features = PHY_GBIT_FEATURES,  	.config = &rtl8211x_config,  	.startup = &rtl8211x_startup, @@ -113,7 +113,7 @@ static struct phy_driver RTL8211B_driver = {  static struct phy_driver RTL8211E_driver = {  	.name = "RealTek RTL8211E",  	.uid = 0x1cc915, -	.mask = 0xfffff0, +	.mask = 0xffffff,  	.features = PHY_GBIT_FEATURES,  	.config = &rtl8211x_config,  	.startup = &rtl8211x_startup, @@ -124,7 +124,7 @@ static struct phy_driver RTL8211E_driver = {  static struct phy_driver RTL8211DN_driver = {  	.name = "RealTek RTL8211DN",  	.uid = 0x1cc914, -	.mask = 0xfffff0, +	.mask = 0xffffff,  	.features = PHY_GBIT_FEATURES,  	.config = &rtl8211x_config,  	.startup = &rtl8211x_startup, diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c index 60ed92d20..bfd9815ab 100644 --- a/drivers/net/phy/smsc.c +++ b/drivers/net/phy/smsc.c @@ -12,6 +12,7 @@   */  #include <miiphy.h> +/* This code does not check the partner abilities. */  static int smsc_parse_status(struct phy_device *phydev)  {  	int mii_reg; @@ -64,7 +65,7 @@ static struct phy_driver lan8710_driver = {  	.mask = 0xffff0,  	.features = PHY_BASIC_FEATURES,  	.config = &genphy_config_aneg, -	.startup = &smsc_startup, +	.startup = &genphy_startup,  	.shutdown = &genphy_shutdown,  }; diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c index 5cf103e5a..c55597966 100644 --- a/drivers/net/phy/vitesse.c +++ b/drivers/net/phy/vitesse.c @@ -49,6 +49,15 @@  #define MIIM_VSC8574_18G_QSGMII		0x80e0  #define MIIM_VSC8574_18G_CMDSTAT	0x8000 +/* Vitesse VSC8514 control register */ +#define MIIM_VSC8514_GENERAL18		0x12 +#define MIIM_VSC8514_GENERAL19		0x13 +#define MIIM_VSC8514_GENERAL23		0x17 + +/* Vitesse VSC8514 gerenal purpose register 18 */ +#define MIIM_VSC8514_18G_QSGMII		0x80e0 +#define MIIM_VSC8514_18G_CMDSTAT	0x8000 +  /* CIS8201 */  static int vitesse_config(struct phy_device *phydev)  { @@ -148,7 +157,7 @@ static int vsc8601_config(struct phy_device *phydev)  static int vsc8574_config(struct phy_device *phydev)  {  	u32 val; -	/* configure regiser 19G for MAC */ +	/* configure register 19G for MAC */  	phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS,  		  PHY_EXT_PAGE_ACCESS_GENERAL); @@ -188,6 +197,53 @@ static int vsc8574_config(struct phy_device *phydev)  	return 0;  } +static int vsc8514_config(struct phy_device *phydev) +{ +	u32 val; +	int timeout = 1000000; + +	/* configure register to access 19G */ +	phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, +		  PHY_EXT_PAGE_ACCESS_GENERAL); + +	val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL19); +	if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) { +		/* set bit 15:14 to '01' for QSGMII mode */ +		val = (val & 0x3fff) | (1 << 14); +		phy_write(phydev, MDIO_DEVAD_NONE, +			  MIIM_VSC8514_GENERAL19, val); +		/* Enable 4 ports MAC QSGMII */ +		phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18, +			  MIIM_VSC8514_18G_QSGMII); +	} else { +		/*TODO Add SGMII functionality once spec sheet +		 * for VSC8514 defines complete functionality +		 */ +	} + +	val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18); +	/* When bit 15 is cleared the command has completed */ +	while ((val & MIIM_VSC8514_18G_CMDSTAT) && timeout--) +		val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18); + +	if (0 == timeout) { +		printf("PHY 8514 config failed\n"); +		return -1; +	} + +	phy_write(phydev, MDIO_DEVAD_NONE, PHY_EXT_PAGE_ACCESS, 0); + +	/* configure register to access 23 */ +	val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23); +	/* set bits 10:8 to '000' */ +	val = (val & 0xf8ff); +	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL23, val); + +	genphy_config_aneg(phydev); + +	return 0; +} +  static struct phy_driver VSC8211_driver = {  	.name	= "Vitesse VSC8211",  	.uid	= 0xfc4b0, @@ -238,6 +294,16 @@ static struct phy_driver VSC8574_driver = {  	.shutdown = &genphy_shutdown,  }; +static struct phy_driver VSC8514_driver = { +	.name = "Vitesse VSC8514", +	.uid = 0x70570, +	.mask = 0xffff0, +	.features = PHY_GBIT_FEATURES, +	.config = &vsc8514_config, +	.startup = &vitesse_startup, +	.shutdown = &genphy_shutdown, +}; +  static struct phy_driver VSC8601_driver = {  	.name = "Vitesse VSC8601",  	.uid = 0x70420, @@ -298,6 +364,7 @@ int phy_vitesse_init(void)  	phy_register(&VSC8211_driver);  	phy_register(&VSC8221_driver);  	phy_register(&VSC8574_driver); +	phy_register(&VSC8514_driver);  	phy_register(&VSC8662_driver);  	phy_register(&cis8201_driver);  	phy_register(&cis8204_driver); |