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

tg3: Add write accessor for AUX CTRL phy reg

This patch adds a write accessor for the aux ctrl phy register.
Signed-off-by: default avatarMatt Carlson <mcarlson@broadcom.com>
Reviewed-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 15ee95c3
...@@ -962,6 +962,14 @@ static int tg3_phy_auxctl_read(struct tg3 *tp, int reg, u32 *val) ...@@ -962,6 +962,14 @@ static int tg3_phy_auxctl_read(struct tg3 *tp, int reg, u32 *val)
return err; return err;
} }
static int tg3_phy_auxctl_write(struct tg3 *tp, int reg, u32 set)
{
if (reg == MII_TG3_AUXCTL_SHDWSEL_MISC)
set |= MII_TG3_AUXCTL_MISC_WREN;
return tg3_writephy(tp, MII_TG3_AUX_CTRL, set | reg);
}
static int tg3_bmcr_reset(struct tg3 *tp) static int tg3_bmcr_reset(struct tg3 *tp)
{ {
u32 phy_control; u32 phy_control;
...@@ -1701,8 +1709,8 @@ static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable) ...@@ -1701,8 +1709,8 @@ static void tg3_phy_toggle_automdix(struct tg3 *tp, int enable)
phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX; phy |= MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
else else
phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX; phy &= ~MII_TG3_AUXCTL_MISC_FORCE_AMDIX;
phy |= MII_TG3_AUXCTL_MISC_WREN; tg3_phy_auxctl_write(tp,
tg3_writephy(tp, MII_TG3_AUX_CTRL, phy); MII_TG3_AUXCTL_SHDWSEL_MISC, phy);
} }
} }
} }
...@@ -1717,8 +1725,8 @@ static void tg3_phy_set_wirespeed(struct tg3 *tp) ...@@ -1717,8 +1725,8 @@ static void tg3_phy_set_wirespeed(struct tg3 *tp)
ret = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, &val); ret = tg3_phy_auxctl_read(tp, MII_TG3_AUXCTL_SHDWSEL_MISC, &val);
if (!ret) if (!ret)
tg3_writephy(tp, MII_TG3_AUX_CTRL, tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_MISC,
(val | (1 << 15) | (1 << 4))); val | MII_TG3_AUXCTL_MISC_WIRESPD_EN);
} }
static void tg3_phy_apply_otp(struct tg3 *tp) static void tg3_phy_apply_otp(struct tg3 *tp)
...@@ -2104,13 +2112,14 @@ static int tg3_phy_reset(struct tg3 *tp) ...@@ -2104,13 +2112,14 @@ static int tg3_phy_reset(struct tg3 *tp)
/* support jumbo frames */ /* support jumbo frames */
if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) { if ((tp->phy_id & TG3_PHY_ID_MASK) == TG3_PHY_ID_BCM5401) {
/* Cannot do read-modify-write on 5401 */ /* Cannot do read-modify-write on 5401 */
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20); tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
} else if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) { } else if (tp->tg3_flags & TG3_FLAG_JUMBO_CAPABLE) {
/* Set bit 14 with read-modify-write to preserve other bits */ /* Set bit 14 with read-modify-write to preserve other bits */
err = tg3_phy_auxctl_read(tp, err = tg3_phy_auxctl_read(tp,
MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val); MII_TG3_AUXCTL_SHDWSEL_AUXCTL, &val);
if (!err) if (!err)
tg3_writephy(tp, MII_TG3_AUX_CTRL, val | 0x4000); tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL,
val | MII_TG3_AUXCTL_ACTL_EXTPKTLEN);
} }
/* Set phy register 0x10 bit 0 to high fifo elasticity to support /* Set phy register 0x10 bit 0 to high fifo elasticity to support
...@@ -2319,11 +2328,10 @@ static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power) ...@@ -2319,11 +2328,10 @@ static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power)
tg3_writephy(tp, MII_TG3_EXT_CTRL, tg3_writephy(tp, MII_TG3_EXT_CTRL,
MII_TG3_EXT_CTRL_FORCE_LED_OFF); MII_TG3_EXT_CTRL_FORCE_LED_OFF);
tg3_writephy(tp, MII_TG3_AUX_CTRL, val = MII_TG3_AUXCTL_PCTL_100TX_LPWR |
MII_TG3_AUXCTL_SHDWSEL_PWRCTL | MII_TG3_AUXCTL_PCTL_SPR_ISOLATE |
MII_TG3_AUXCTL_PCTL_100TX_LPWR | MII_TG3_AUXCTL_PCTL_VREG_11V;
MII_TG3_AUXCTL_PCTL_SPR_ISOLATE | tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, val);
MII_TG3_AUXCTL_PCTL_VREG_11V);
} }
/* The PHY should not be powered down on some chips because /* The PHY should not be powered down on some chips because
...@@ -2717,8 +2725,13 @@ static int tg3_power_down_prepare(struct tg3 *tp) ...@@ -2717,8 +2725,13 @@ static int tg3_power_down_prepare(struct tg3 *tp)
u32 mac_mode; u32 mac_mode;
if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) { if (!(tp->phy_flags & TG3_PHYFLG_PHY_SERDES)) {
if (do_low_power) { if (do_low_power &&
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x5a); !(tp->phy_flags & TG3_PHYFLG_IS_FET)) {
tg3_phy_auxctl_write(tp,
MII_TG3_AUXCTL_SHDWSEL_PWRCTL,
MII_TG3_AUXCTL_PCTL_WOL_EN |
MII_TG3_AUXCTL_PCTL_100TX_LPWR |
MII_TG3_AUXCTL_PCTL_CL_AB_TXDAC);
udelay(40); udelay(40);
} }
...@@ -3092,7 +3105,7 @@ static int tg3_init_5401phy_dsp(struct tg3 *tp) ...@@ -3092,7 +3105,7 @@ static int tg3_init_5401phy_dsp(struct tg3 *tp)
/* Turn off tap power management. */ /* Turn off tap power management. */
/* Set Extended packet length bit */ /* Set Extended packet length bit */
err = tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x4c20); err = tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_AUXCTL, 0x4c20);
err |= tg3_phydsp_write(tp, 0x0012, 0x1804); err |= tg3_phydsp_write(tp, 0x0012, 0x1804);
err |= tg3_phydsp_write(tp, 0x0013, 0x1204); err |= tg3_phydsp_write(tp, 0x0013, 0x1204);
...@@ -3198,7 +3211,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset) ...@@ -3198,7 +3211,7 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
udelay(80); udelay(80);
} }
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x02); tg3_phy_auxctl_write(tp, MII_TG3_AUXCTL_SHDWSEL_PWRCTL, 0);
/* Some third-party PHYs need to be reset on link going /* Some third-party PHYs need to be reset on link going
* down. * down.
...@@ -3283,8 +3296,9 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset) ...@@ -3283,8 +3296,9 @@ static int tg3_setup_copper_phy(struct tg3 *tp, int force_reset)
MII_TG3_AUXCTL_SHDWSEL_MISCTEST, MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
&val); &val);
if (!err && !(val & (1 << 10))) { if (!err && !(val & (1 << 10))) {
val |= (1 << 10); tg3_phy_auxctl_write(tp,
tg3_writephy(tp, MII_TG3_AUX_CTRL, val); MII_TG3_AUXCTL_SHDWSEL_MISCTEST,
val | (1 << 10));
goto relink; goto relink;
} }
} }
......
...@@ -2197,15 +2197,19 @@ ...@@ -2197,15 +2197,19 @@
#define MII_TG3_AUXCTL_SHDWSEL_AUXCTL 0x0000 #define MII_TG3_AUXCTL_SHDWSEL_AUXCTL 0x0000
#define MII_TG3_AUXCTL_ACTL_TX_6DB 0x0400 #define MII_TG3_AUXCTL_ACTL_TX_6DB 0x0400
#define MII_TG3_AUXCTL_ACTL_SMDSP_ENA 0x0800 #define MII_TG3_AUXCTL_ACTL_SMDSP_ENA 0x0800
#define MII_TG3_AUXCTL_ACTL_EXTPKTLEN 0x4000
#define MII_TG3_AUXCTL_SHDWSEL_PWRCTL 0x0002 #define MII_TG3_AUXCTL_SHDWSEL_PWRCTL 0x0002
#define MII_TG3_AUXCTL_PCTL_WOL_EN 0x0008
#define MII_TG3_AUXCTL_PCTL_100TX_LPWR 0x0010 #define MII_TG3_AUXCTL_PCTL_100TX_LPWR 0x0010
#define MII_TG3_AUXCTL_PCTL_SPR_ISOLATE 0x0020 #define MII_TG3_AUXCTL_PCTL_SPR_ISOLATE 0x0020
#define MII_TG3_AUXCTL_PCTL_CL_AB_TXDAC 0x0040
#define MII_TG3_AUXCTL_PCTL_VREG_11V 0x0180 #define MII_TG3_AUXCTL_PCTL_VREG_11V 0x0180
#define MII_TG3_AUXCTL_SHDWSEL_MISCTEST 0x0004 #define MII_TG3_AUXCTL_SHDWSEL_MISCTEST 0x0004
#define MII_TG3_AUXCTL_SHDWSEL_MISC 0x0007 #define MII_TG3_AUXCTL_SHDWSEL_MISC 0x0007
#define MII_TG3_AUXCTL_MISC_WIRESPD_EN 0x0010
#define MII_TG3_AUXCTL_MISC_FORCE_AMDIX 0x0200 #define MII_TG3_AUXCTL_MISC_FORCE_AMDIX 0x0200
#define MII_TG3_AUXCTL_MISC_RDSEL_SHIFT 12 #define MII_TG3_AUXCTL_MISC_RDSEL_SHIFT 12
#define MII_TG3_AUXCTL_MISC_WREN 0x8000 #define MII_TG3_AUXCTL_MISC_WREN 0x8000
......
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