diff options
Diffstat (limited to 'drivers/net/phy/micrel.c')
| -rw-r--r-- | drivers/net/phy/micrel.c | 45 | 
1 files changed, 36 insertions, 9 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index cf287e0eb40..2165d5fdb8c 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -21,6 +21,12 @@  #include <linux/phy.h>  #include <linux/micrel_phy.h> +/* Operation Mode Strap Override */ +#define MII_KSZPHY_OMSO				0x16 +#define KSZPHY_OMSO_B_CAST_OFF			(1 << 9) +#define KSZPHY_OMSO_RMII_OVERRIDE		(1 << 1) +#define KSZPHY_OMSO_MII_OVERRIDE		(1 << 0) +  /* general Interrupt control/status reg in vendor specific block. */  #define MII_KSZPHY_INTCS			0x1B  #define	KSZPHY_INTCS_JABBER			(1 << 15) @@ -101,6 +107,13 @@ static int kszphy_config_init(struct phy_device *phydev)  	return 0;  } +static int ksz8021_config_init(struct phy_device *phydev) +{ +	const u16 val = KSZPHY_OMSO_B_CAST_OFF | KSZPHY_OMSO_RMII_OVERRIDE; +	phy_write(phydev, MII_KSZPHY_OMSO, val); +	return 0; +} +  static int ks8051_config_init(struct phy_device *phydev)  {  	int regval; @@ -128,9 +141,22 @@ static struct phy_driver ksphy_driver[] = {  	.config_intr	= ks8737_config_intr,  	.driver		= { .owner = THIS_MODULE,},  }, { -	.phy_id		= PHY_ID_KS8041, +	.phy_id		= PHY_ID_KSZ8021, +	.phy_id_mask	= 0x00ffffff, +	.name		= "Micrel KSZ8021", +	.features	= (PHY_BASIC_FEATURES | SUPPORTED_Pause | +			   SUPPORTED_Asym_Pause), +	.flags		= PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, +	.config_init	= ksz8021_config_init, +	.config_aneg	= genphy_config_aneg, +	.read_status	= genphy_read_status, +	.ack_interrupt	= kszphy_ack_interrupt, +	.config_intr	= kszphy_config_intr, +	.driver		= { .owner = THIS_MODULE,}, +}, { +	.phy_id		= PHY_ID_KSZ8041,  	.phy_id_mask	= 0x00fffff0, -	.name		= "Micrel KS8041", +	.name		= "Micrel KSZ8041",  	.features	= (PHY_BASIC_FEATURES | SUPPORTED_Pause  				| SUPPORTED_Asym_Pause),  	.flags		= PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, @@ -141,9 +167,9 @@ static struct phy_driver ksphy_driver[] = {  	.config_intr	= kszphy_config_intr,  	.driver		= { .owner = THIS_MODULE,},  }, { -	.phy_id		= PHY_ID_KS8051, +	.phy_id		= PHY_ID_KSZ8051,  	.phy_id_mask	= 0x00fffff0, -	.name		= "Micrel KS8051", +	.name		= "Micrel KSZ8051",  	.features	= (PHY_BASIC_FEATURES | SUPPORTED_Pause  				| SUPPORTED_Asym_Pause),  	.flags		= PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, @@ -154,8 +180,8 @@ static struct phy_driver ksphy_driver[] = {  	.config_intr	= kszphy_config_intr,  	.driver		= { .owner = THIS_MODULE,},  }, { -	.phy_id		= PHY_ID_KS8001, -	.name		= "Micrel KS8001 or KS8721", +	.phy_id		= PHY_ID_KSZ8001, +	.name		= "Micrel KSZ8001 or KS8721",  	.phy_id_mask	= 0x00ffffff,  	.features	= (PHY_BASIC_FEATURES | SUPPORTED_Pause),  	.flags		= PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, @@ -201,10 +227,11 @@ MODULE_LICENSE("GPL");  static struct mdio_device_id __maybe_unused micrel_tbl[] = {  	{ PHY_ID_KSZ9021, 0x000ffffe }, -	{ PHY_ID_KS8001, 0x00ffffff }, +	{ PHY_ID_KSZ8001, 0x00ffffff },  	{ PHY_ID_KS8737, 0x00fffff0 }, -	{ PHY_ID_KS8041, 0x00fffff0 }, -	{ PHY_ID_KS8051, 0x00fffff0 }, +	{ PHY_ID_KSZ8021, 0x00ffffff }, +	{ PHY_ID_KSZ8041, 0x00fffff0 }, +	{ PHY_ID_KSZ8051, 0x00fffff0 },  	{ }  };  |