Skip to content

Commit 8238195

Browse files
committed
Merge branch 'r8169-improve-PHY-initialization-and-WoL-handling'
Heiner Kallweit says: ==================== r8169: improve PHY initialization and WoL handling Series with smaller improvements regarding PHY initialization and WoL handling. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents 064f390 + fe87bef commit 8238195

File tree

1 file changed

+15
-25
lines changed
  • drivers/net/ethernet/realtek

1 file changed

+15
-25
lines changed

drivers/net/ethernet/realtek/r8169.c

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,6 +1587,12 @@ static void rtl8169_check_link_status(struct net_device *dev,
15871587

15881588
#define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
15891589

1590+
/* Currently we only enable WoL if explicitly told by userspace to circumvent
1591+
* issues on certain platforms, see commit bde135a672bf ("r8169: only enable
1592+
* PCI wakeups when WOL is active"). Let's keep __rtl8169_get_wol() for the
1593+
* case that we want to respect BIOS settings again.
1594+
*/
1595+
#if 0
15901596
static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
15911597
{
15921598
u8 options;
@@ -1621,25 +1627,16 @@ static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
16211627

16221628
return wolopts;
16231629
}
1630+
#endif
16241631

16251632
static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
16261633
{
16271634
struct rtl8169_private *tp = netdev_priv(dev);
1628-
struct device *d = tp_to_dev(tp);
1629-
1630-
pm_runtime_get_noresume(d);
16311635

16321636
rtl_lock_work(tp);
1633-
16341637
wol->supported = WAKE_ANY;
1635-
if (pm_runtime_active(d))
1636-
wol->wolopts = __rtl8169_get_wol(tp);
1637-
else
1638-
wol->wolopts = tp->saved_wolopts;
1639-
1638+
wol->wolopts = tp->saved_wolopts;
16401639
rtl_unlock_work(tp);
1641-
1642-
pm_runtime_put_noidle(d);
16431640
}
16441641

16451642
static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
@@ -1719,14 +1716,14 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
17191716

17201717
rtl_lock_work(tp);
17211718

1719+
tp->saved_wolopts = wol->wolopts & WAKE_ANY;
1720+
17221721
if (pm_runtime_active(d))
1723-
__rtl8169_set_wol(tp, wol->wolopts);
1724-
else
1725-
tp->saved_wolopts = wol->wolopts;
1722+
__rtl8169_set_wol(tp, tp->saved_wolopts);
17261723

17271724
rtl_unlock_work(tp);
17281725

1729-
device_set_wakeup_enable(d, wol->wolopts);
1726+
device_set_wakeup_enable(d, tp->saved_wolopts);
17301727

17311728
pm_runtime_put_noidle(d);
17321729

@@ -4638,7 +4635,7 @@ static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
46384635

46394636
static bool rtl_wol_pll_power_down(struct rtl8169_private *tp)
46404637
{
4641-
if (!(__rtl8169_get_wol(tp) & WAKE_ANY))
4638+
if (!netif_running(tp->dev) || !tp->saved_wolopts)
46424639
return false;
46434640

46444641
rtl_speed_down(tp);
@@ -7219,7 +7216,6 @@ static int rtl_open(struct net_device *dev)
72197216

72207217
rtl_unlock_work(tp);
72217218

7222-
tp->saved_wolopts = 0;
72237219
pm_runtime_put_sync(&pdev->dev);
72247220

72257221
rtl8169_check_link_status(dev, tp);
@@ -7334,6 +7330,7 @@ static void __rtl8169_resume(struct net_device *dev)
73347330
netif_device_attach(dev);
73357331

73367332
rtl_pll_power_up(tp);
7333+
rtl8169_init_phy(dev, tp);
73377334

73387335
rtl_lock_work(tp);
73397336
napi_enable(&tp->napi);
@@ -7347,9 +7344,6 @@ static int rtl8169_resume(struct device *device)
73477344
{
73487345
struct pci_dev *pdev = to_pci_dev(device);
73497346
struct net_device *dev = pci_get_drvdata(pdev);
7350-
struct rtl8169_private *tp = netdev_priv(dev);
7351-
7352-
rtl8169_init_phy(dev, tp);
73537347

73547348
if (netif_running(dev))
73557349
__rtl8169_resume(dev);
@@ -7369,7 +7363,6 @@ static int rtl8169_runtime_suspend(struct device *device)
73697363
}
73707364

73717365
rtl_lock_work(tp);
7372-
tp->saved_wolopts = __rtl8169_get_wol(tp);
73737366
__rtl8169_set_wol(tp, WAKE_ANY);
73747367
rtl_unlock_work(tp);
73757368

@@ -7394,11 +7387,8 @@ static int rtl8169_runtime_resume(struct device *device)
73947387

73957388
rtl_lock_work(tp);
73967389
__rtl8169_set_wol(tp, tp->saved_wolopts);
7397-
tp->saved_wolopts = 0;
73987390
rtl_unlock_work(tp);
73997391

7400-
rtl8169_init_phy(dev, tp);
7401-
74027392
__rtl8169_resume(dev);
74037393

74047394
return 0;
@@ -7466,7 +7456,7 @@ static void rtl_shutdown(struct pci_dev *pdev)
74667456
rtl8169_hw_reset(tp);
74677457

74687458
if (system_state == SYSTEM_POWER_OFF) {
7469-
if (__rtl8169_get_wol(tp) & WAKE_ANY) {
7459+
if (tp->saved_wolopts) {
74707460
rtl_wol_suspend_quirk(tp);
74717461
rtl_wol_shutdown_quirk(tp);
74727462
}

0 commit comments

Comments
 (0)