broadcom: Fix slow link problem
authorMatt Carlson <mcarlson@broadcom.com>
Mon, 2 Nov 2009 14:28:33 +0000 (14:28 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Nov 2009 07:39:09 +0000 (23:39 -0800)
When a 50610 or 50610M is paired against particular remote partners,
link is slow to come up.  This patch works around the problem.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/broadcom.c

index 9e574ce..1a2b2f2 100644 (file)
@@ -242,12 +242,6 @@ static int bcm50610_a0_workaround(struct phy_device *phydev)
 {
        int err;
 
-       err = bcm54xx_exp_write(phydev, MII_BCM54XX_EXP_EXP08,
-                               MII_BCM54XX_EXP_EXP08_RJCT_2MHZ |
-                               MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE);
-       if (err < 0)
-               return err;
-
        err = bcm54xx_exp_write(phydev, MII_BCM54XX_EXP_AADJ1CH0,
                                MII_BCM54XX_EXP_AADJ1CH0_SWP_ABCD_OEN |
                                MII_BCM54XX_EXP_AADJ1CH0_SWSEL_THPF);
@@ -287,8 +281,20 @@ static int bcm54xx_phydsp_config(struct phy_device *phydev)
        if (err < 0)
                return err;
 
-       if (phydev->drv->phy_id == PHY_ID_BCM50610)
-               err = bcm50610_a0_workaround(phydev);
+       if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610 ||
+           BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610M) {
+               /* Clear bit 9 to fix a phy interop issue. */
+               err = bcm54xx_exp_write(phydev, MII_BCM54XX_EXP_EXP08,
+                                       MII_BCM54XX_EXP_EXP08_RJCT_2MHZ);
+               if (err < 0)
+                       goto error;
+
+               if (phydev->drv->phy_id == PHY_ID_BCM50610) {
+                       err = bcm50610_a0_workaround(phydev);
+                       if (err < 0)
+                               goto error;
+               }
+       }
 
        if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM57780) {
                int val;