|
|
|
@ -2937,7 +2937,7 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp) |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0004); |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0007); |
|
|
|
|
rtl_writephy(tp, 0x1e, 0x0020); |
|
|
|
|
rtl_w1w0_phy(tp, 0x06, 0x0000, 0x0100); |
|
|
|
|
rtl_w1w0_phy(tp, 0x15, 0x0000, 0x0100); |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0002); |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0000); |
|
|
|
|
rtl_writephy(tp, 0x0d, 0x0007); |
|
|
|
@ -3491,6 +3491,37 @@ static void __devinit rtl_init_mdio_ops(struct rtl8169_private *tp) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void rtl_wol_suspend_quirk(struct rtl8169_private *tp) |
|
|
|
|
{ |
|
|
|
|
void __iomem *ioaddr = tp->mmio_addr; |
|
|
|
|
|
|
|
|
|
switch (tp->mac_version) { |
|
|
|
|
case RTL_GIGA_MAC_VER_29: |
|
|
|
|
case RTL_GIGA_MAC_VER_30: |
|
|
|
|
case RTL_GIGA_MAC_VER_32: |
|
|
|
|
case RTL_GIGA_MAC_VER_33: |
|
|
|
|
case RTL_GIGA_MAC_VER_34: |
|
|
|
|
RTL_W32(RxConfig, RTL_R32(RxConfig) | |
|
|
|
|
AcceptBroadcast | AcceptMulticast | AcceptMyPhys); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static bool rtl_wol_pll_power_down(struct rtl8169_private *tp) |
|
|
|
|
{ |
|
|
|
|
if (!(__rtl8169_get_wol(tp) & WAKE_ANY)) |
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0000); |
|
|
|
|
rtl_writephy(tp, MII_BMCR, 0x0000); |
|
|
|
|
|
|
|
|
|
rtl_wol_suspend_quirk(tp); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void r810x_phy_power_down(struct rtl8169_private *tp) |
|
|
|
|
{ |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0000); |
|
|
|
@ -3505,18 +3536,8 @@ static void r810x_phy_power_up(struct rtl8169_private *tp) |
|
|
|
|
|
|
|
|
|
static void r810x_pll_power_down(struct rtl8169_private *tp) |
|
|
|
|
{ |
|
|
|
|
void __iomem *ioaddr = tp->mmio_addr; |
|
|
|
|
|
|
|
|
|
if (__rtl8169_get_wol(tp) & WAKE_ANY) { |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0000); |
|
|
|
|
rtl_writephy(tp, MII_BMCR, 0x0000); |
|
|
|
|
|
|
|
|
|
if (tp->mac_version == RTL_GIGA_MAC_VER_29 || |
|
|
|
|
tp->mac_version == RTL_GIGA_MAC_VER_30) |
|
|
|
|
RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast | |
|
|
|
|
AcceptMulticast | AcceptMyPhys); |
|
|
|
|
if (rtl_wol_pll_power_down(tp)) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
r810x_phy_power_down(tp); |
|
|
|
|
} |
|
|
|
@ -3605,17 +3626,8 @@ static void r8168_pll_power_down(struct rtl8169_private *tp) |
|
|
|
|
tp->mac_version == RTL_GIGA_MAC_VER_33) |
|
|
|
|
rtl_ephy_write(ioaddr, 0x19, 0xff64); |
|
|
|
|
|
|
|
|
|
if (__rtl8169_get_wol(tp) & WAKE_ANY) { |
|
|
|
|
rtl_writephy(tp, 0x1f, 0x0000); |
|
|
|
|
rtl_writephy(tp, MII_BMCR, 0x0000); |
|
|
|
|
|
|
|
|
|
if (tp->mac_version == RTL_GIGA_MAC_VER_32 || |
|
|
|
|
tp->mac_version == RTL_GIGA_MAC_VER_33 || |
|
|
|
|
tp->mac_version == RTL_GIGA_MAC_VER_34) |
|
|
|
|
RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast | |
|
|
|
|
AcceptMulticast | AcceptMyPhys); |
|
|
|
|
if (rtl_wol_pll_power_down(tp)) |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
r8168_phy_power_down(tp); |
|
|
|
|
|
|
|
|
@ -6161,11 +6173,30 @@ static const struct dev_pm_ops rtl8169_pm_ops = { |
|
|
|
|
|
|
|
|
|
#endif /* !CONFIG_PM */ |
|
|
|
|
|
|
|
|
|
static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp) |
|
|
|
|
{ |
|
|
|
|
void __iomem *ioaddr = tp->mmio_addr; |
|
|
|
|
|
|
|
|
|
/* WoL fails with 8168b when the receiver is disabled. */ |
|
|
|
|
switch (tp->mac_version) { |
|
|
|
|
case RTL_GIGA_MAC_VER_11: |
|
|
|
|
case RTL_GIGA_MAC_VER_12: |
|
|
|
|
case RTL_GIGA_MAC_VER_17: |
|
|
|
|
pci_clear_master(tp->pci_dev); |
|
|
|
|
|
|
|
|
|
RTL_W8(ChipCmd, CmdRxEnb); |
|
|
|
|
/* PCI commit */ |
|
|
|
|
RTL_R8(ChipCmd); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void rtl_shutdown(struct pci_dev *pdev) |
|
|
|
|
{ |
|
|
|
|
struct net_device *dev = pci_get_drvdata(pdev); |
|
|
|
|
struct rtl8169_private *tp = netdev_priv(dev); |
|
|
|
|
void __iomem *ioaddr = tp->mmio_addr; |
|
|
|
|
|
|
|
|
|
rtl8169_net_suspend(dev); |
|
|
|
|
|
|
|
|
@ -6179,16 +6210,9 @@ static void rtl_shutdown(struct pci_dev *pdev) |
|
|
|
|
spin_unlock_irq(&tp->lock); |
|
|
|
|
|
|
|
|
|
if (system_state == SYSTEM_POWER_OFF) { |
|
|
|
|
/* WoL fails with 8168b when the receiver is disabled. */ |
|
|
|
|
if ((tp->mac_version == RTL_GIGA_MAC_VER_11 || |
|
|
|
|
tp->mac_version == RTL_GIGA_MAC_VER_12 || |
|
|
|
|
tp->mac_version == RTL_GIGA_MAC_VER_17) && |
|
|
|
|
(tp->features & RTL_FEATURE_WOL)) { |
|
|
|
|
pci_clear_master(pdev); |
|
|
|
|
|
|
|
|
|
RTL_W8(ChipCmd, CmdRxEnb); |
|
|
|
|
/* PCI commit */ |
|
|
|
|
RTL_R8(ChipCmd); |
|
|
|
|
if (__rtl8169_get_wol(tp) & WAKE_ANY) { |
|
|
|
|
rtl_wol_suspend_quirk(tp); |
|
|
|
|
rtl_wol_shutdown_quirk(tp); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pci_wake_from_d3(pdev, true); |
|
|
|
|