Commit d9221e66 authored by Matt Carlson's avatar Matt Carlson Committed by David S. Miller

broadcom: Make the 57780 IEEE compliant

This brings the 57780's phy into IEEE compliance by suppressing the
common mode oscillation.
Signed-off-by: default avatarMatt Carlson <mcarlson@broadcom.com>
Reviewed-by: default avatarMichael Chan <mchan@broadcom.com>
Reviewed-by: default avatarBenjamin Li <benli@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d7a2ed92
...@@ -19,6 +19,11 @@ ...@@ -19,6 +19,11 @@
#define PHY_ID_BCM50610 0x0143bd60 #define PHY_ID_BCM50610 0x0143bd60
#define PHY_ID_BCM50610M 0x0143bd70 #define PHY_ID_BCM50610M 0x0143bd70
#define PHY_ID_BCM57780 0x03625d90
#define BRCM_PHY_MODEL(phydev) \
((phydev)->drv->phy_id & (phydev)->drv->phy_id_mask)
#define MII_BCM54XX_ECR 0x10 /* BCM54xx extended control register */ #define MII_BCM54XX_ECR 0x10 /* BCM54xx extended control register */
#define MII_BCM54XX_ECR_IM 0x1000 /* Interrupt mask */ #define MII_BCM54XX_ECR_IM 0x1000 /* Interrupt mask */
...@@ -118,6 +123,7 @@ ...@@ -118,6 +123,7 @@
#define MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE 0x0200 #define MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE 0x0200
#define MII_BCM54XX_EXP_EXP75 0x0f75 #define MII_BCM54XX_EXP_EXP75 0x0f75
#define MII_BCM54XX_EXP_EXP75_VDACCTRL 0x003c #define MII_BCM54XX_EXP_EXP75_VDACCTRL 0x003c
#define MII_BCM54XX_EXP_EXP75_CM_OSC 0x0001
#define MII_BCM54XX_EXP_EXP96 0x0f96 #define MII_BCM54XX_EXP_EXP96 0x0f96
#define MII_BCM54XX_EXP_EXP96_MYST 0x0010 #define MII_BCM54XX_EXP_EXP96_MYST 0x0010
#define MII_BCM54XX_EXP_EXP97 0x0f97 #define MII_BCM54XX_EXP_EXP97 0x0f97
...@@ -194,7 +200,7 @@ static int bcm54xx_shadow_write(struct phy_device *phydev, u16 shadow, u16 val) ...@@ -194,7 +200,7 @@ static int bcm54xx_shadow_write(struct phy_device *phydev, u16 shadow, u16 val)
} }
/* Indirect register access functions for the Expansion Registers */ /* Indirect register access functions for the Expansion Registers */
static int bcm54xx_exp_read(struct phy_device *phydev, u8 regnum) static int bcm54xx_exp_read(struct phy_device *phydev, u16 regnum)
{ {
int val; int val;
...@@ -308,6 +314,33 @@ static int bcm54xx_config_init(struct phy_device *phydev) ...@@ -308,6 +314,33 @@ static int bcm54xx_config_init(struct phy_device *phydev)
return err; return err;
} }
if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM57780) {
int err2;
err = bcm54xx_auxctl_write(phydev,
MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL,
MII_BCM54XX_AUXCTL_ACTL_SMDSP_ENA |
MII_BCM54XX_AUXCTL_ACTL_TX_6DB);
if (err < 0)
return err;
reg = bcm54xx_exp_read(phydev, MII_BCM54XX_EXP_EXP75);
if (reg < 0)
goto error;
reg |= MII_BCM54XX_EXP_EXP75_CM_OSC;
err = bcm54xx_exp_write(phydev, MII_BCM54XX_EXP_EXP75, reg);
error:
err2 = bcm54xx_auxctl_write(phydev,
MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL,
MII_BCM54XX_AUXCTL_ACTL_TX_6DB);
if (err)
return err;
if (err2)
return err2;
}
return 0; return 0;
} }
...@@ -694,7 +727,7 @@ static struct phy_driver bcm50610m_driver = { ...@@ -694,7 +727,7 @@ static struct phy_driver bcm50610m_driver = {
}; };
static struct phy_driver bcm57780_driver = { static struct phy_driver bcm57780_driver = {
.phy_id = 0x03625d90, .phy_id = PHY_ID_BCM57780,
.phy_id_mask = 0xfffffff0, .phy_id_mask = 0xfffffff0,
.name = "Broadcom BCM57780", .name = "Broadcom BCM57780",
.features = PHY_GBIT_FEATURES | .features = PHY_GBIT_FEATURES |
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment