Commit bb13a800 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller

r8169: fix handling ether_clk

Petr reported that system freezes on r8169 driver load on a system
using ether_clk. The original change was done under the assumption
that the clock isn't needed for basic operations like chip register
access. But obviously that was wrong.
Therefore effectively revert the original change, and in addition
leave the clock active when suspending and WoL is enabled. Chip may
not be able to process incoming packets otherwise.

Fixes: 9f0b54cd ("r8169: move switching optional clock on/off to pll power functions")
Reported-by: default avatarPetr Tesarik <ptesarik@suse.cz>
Tested-by: default avatarPetr Tesarik <ptesarik@suse.cz>
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a59cf619
...@@ -2239,14 +2239,10 @@ static void rtl_pll_power_down(struct rtl8169_private *tp) ...@@ -2239,14 +2239,10 @@ static void rtl_pll_power_down(struct rtl8169_private *tp)
default: default:
break; break;
} }
clk_disable_unprepare(tp->clk);
} }
static void rtl_pll_power_up(struct rtl8169_private *tp) static void rtl_pll_power_up(struct rtl8169_private *tp)
{ {
clk_prepare_enable(tp->clk);
switch (tp->mac_version) { switch (tp->mac_version) {
case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33: case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33:
case RTL_GIGA_MAC_VER_37: case RTL_GIGA_MAC_VER_37:
...@@ -4826,29 +4822,39 @@ static void rtl8169_net_suspend(struct rtl8169_private *tp) ...@@ -4826,29 +4822,39 @@ static void rtl8169_net_suspend(struct rtl8169_private *tp)
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int rtl8169_net_resume(struct rtl8169_private *tp)
{
rtl_rar_set(tp, tp->dev->dev_addr);
if (tp->TxDescArray)
rtl8169_up(tp);
netif_device_attach(tp->dev);
return 0;
}
static int __maybe_unused rtl8169_suspend(struct device *device) static int __maybe_unused rtl8169_suspend(struct device *device)
{ {
struct rtl8169_private *tp = dev_get_drvdata(device); struct rtl8169_private *tp = dev_get_drvdata(device);
rtnl_lock(); rtnl_lock();
rtl8169_net_suspend(tp); rtl8169_net_suspend(tp);
if (!device_may_wakeup(tp_to_dev(tp)))
clk_disable_unprepare(tp->clk);
rtnl_unlock(); rtnl_unlock();
return 0; return 0;
} }
static int rtl8169_resume(struct device *device) static int __maybe_unused rtl8169_resume(struct device *device)
{ {
struct rtl8169_private *tp = dev_get_drvdata(device); struct rtl8169_private *tp = dev_get_drvdata(device);
rtl_rar_set(tp, tp->dev->dev_addr); if (!device_may_wakeup(tp_to_dev(tp)))
clk_prepare_enable(tp->clk);
if (tp->TxDescArray)
rtl8169_up(tp);
netif_device_attach(tp->dev); return rtl8169_net_resume(tp);
return 0;
} }
static int rtl8169_runtime_suspend(struct device *device) static int rtl8169_runtime_suspend(struct device *device)
...@@ -4874,7 +4880,7 @@ static int rtl8169_runtime_resume(struct device *device) ...@@ -4874,7 +4880,7 @@ static int rtl8169_runtime_resume(struct device *device)
__rtl8169_set_wol(tp, tp->saved_wolopts); __rtl8169_set_wol(tp, tp->saved_wolopts);
return rtl8169_resume(device); return rtl8169_net_resume(tp);
} }
static int rtl8169_runtime_idle(struct device *device) static int rtl8169_runtime_idle(struct device *device)
......
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