diff options
Diffstat (limited to 'drivers/net/ethernet/realtek')
-rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index d36aa7621ad9..2c40309e40ad 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
@@ -1024,14 +1024,6 @@ static u16 r8168_phy_ocp_read(struct rtl8169_private *tp, u32 reg) | |||
1024 | (RTL_R32(GPHY_OCP) & 0xffff) : ~0; | 1024 | (RTL_R32(GPHY_OCP) & 0xffff) : ~0; |
1025 | } | 1025 | } |
1026 | 1026 | ||
1027 | static void rtl_w1w0_phy_ocp(struct rtl8169_private *tp, int reg, int p, int m) | ||
1028 | { | ||
1029 | int val; | ||
1030 | |||
1031 | val = r8168_phy_ocp_read(tp, reg); | ||
1032 | r8168_phy_ocp_write(tp, reg, (val | p) & ~m); | ||
1033 | } | ||
1034 | |||
1035 | static void r8168_mac_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data) | 1027 | static void r8168_mac_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data) |
1036 | { | 1028 | { |
1037 | void __iomem *ioaddr = tp->mmio_addr; | 1029 | void __iomem *ioaddr = tp->mmio_addr; |
@@ -3370,23 +3362,41 @@ static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp) | |||
3370 | { | 3362 | { |
3371 | rtl_apply_firmware(tp); | 3363 | rtl_apply_firmware(tp); |
3372 | 3364 | ||
3373 | if (r8168_phy_ocp_read(tp, 0xa460) & 0x0100) | 3365 | rtl_writephy(tp, 0x1f, 0x0a46); |
3374 | rtl_w1w0_phy_ocp(tp, 0xbcc4, 0x0000, 0x8000); | 3366 | if (rtl_readphy(tp, 0x10) & 0x0100) { |
3375 | else | 3367 | rtl_writephy(tp, 0x1f, 0x0bcc); |
3376 | rtl_w1w0_phy_ocp(tp, 0xbcc4, 0x8000, 0x0000); | 3368 | rtl_w1w0_phy(tp, 0x12, 0x0000, 0x8000); |
3369 | } else { | ||
3370 | rtl_writephy(tp, 0x1f, 0x0bcc); | ||
3371 | rtl_w1w0_phy(tp, 0x12, 0x8000, 0x0000); | ||
3372 | } | ||
3377 | 3373 | ||
3378 | if (r8168_phy_ocp_read(tp, 0xa466) & 0x0100) | 3374 | rtl_writephy(tp, 0x1f, 0x0a46); |
3379 | rtl_w1w0_phy_ocp(tp, 0xc41a, 0x0002, 0x0000); | 3375 | if (rtl_readphy(tp, 0x13) & 0x0100) { |
3380 | else | 3376 | rtl_writephy(tp, 0x1f, 0x0c41); |
3381 | rtl_w1w0_phy_ocp(tp, 0xbcc4, 0x0000, 0x0002); | 3377 | rtl_w1w0_phy(tp, 0x15, 0x0002, 0x0000); |
3378 | } else { | ||
3379 | rtl_writephy(tp, 0x1f, 0x0bcc); | ||
3380 | rtl_w1w0_phy(tp, 0x12, 0x0000, 0x0002); | ||
3381 | } | ||
3382 | 3382 | ||
3383 | rtl_w1w0_phy_ocp(tp, 0xa442, 0x000c, 0x0000); | 3383 | /* Enable PHY auto speed down */ |
3384 | rtl_w1w0_phy_ocp(tp, 0xa4b2, 0x0004, 0x0000); | 3384 | rtl_writephy(tp, 0x1f, 0x0a44); |
3385 | rtl_w1w0_phy(tp, 0x11, 0x000c, 0x0000); | ||
3385 | 3386 | ||
3386 | r8168_phy_ocp_write(tp, 0xa436, 0x8012); | 3387 | /* EEE auto-fallback function */ |
3387 | rtl_w1w0_phy_ocp(tp, 0xa438, 0x8000, 0x0000); | 3388 | rtl_writephy(tp, 0x1f, 0x0a4b); |
3389 | rtl_w1w0_phy(tp, 0x11, 0x0004, 0x0000); | ||
3388 | 3390 | ||
3389 | rtl_w1w0_phy_ocp(tp, 0xc422, 0x4000, 0x2000); | 3391 | /* Enable UC LPF tune function */ |
3392 | rtl_writephy(tp, 0x1f, 0x0a43); | ||
3393 | rtl_writephy(tp, 0x13, 0x8012); | ||
3394 | rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000); | ||
3395 | |||
3396 | rtl_writephy(tp, 0x1f, 0x0c42); | ||
3397 | rtl_w1w0_phy(tp, 0x11, 0x4000, 0x2000); | ||
3398 | |||
3399 | rtl_writephy(tp, 0x1f, 0x0000); | ||
3390 | } | 3400 | } |
3391 | 3401 | ||
3392 | static void rtl8102e_hw_phy_config(struct rtl8169_private *tp) | 3402 | static void rtl8102e_hw_phy_config(struct rtl8169_private *tp) |