Skip to content

Commit

Permalink
r8169: improve runtime pm in general and suspend unused ports
Browse files Browse the repository at this point in the history
So far rpm doesn't cover cases like unused ports which are never
brought up. If they are active at probe time they remain in this state.
Included in this patch:

- Let the idle notification check whether we can suspend and let it
  schedule the suspend. This way we don't need to have calls to
  pm_schedule_suspend in different places.

- At the end of rtl_open and rtl_init_one send an idle notification
  to allow suspending if the link is down. If a cable is plugged in
  aneg is finished before the suspend timer expires and the suspend
  request is cancelled.

- Change rtl8169_runtime_suspend to power down the chip if the
  interface is down.

Successfully tested on a RTL8168evl (mac version 34).

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Heiner Kallweit authored and David S. Miller committed Jan 9, 2018
1 parent ef4d5fc commit a92a084
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions drivers/net/ethernet/realtek/r8169.c
Original file line number Diff line number Diff line change
Expand Up @@ -1689,7 +1689,7 @@ static void rtl8169_check_link_status(struct net_device *dev,
} else {
netif_carrier_off(dev);
netif_info(tp, ifdown, dev, "link down\n");
pm_schedule_suspend(&tp->pci_dev->dev, 10000);
pm_runtime_idle(&tp->pci_dev->dev);
}
}

Expand Down Expand Up @@ -7950,7 +7950,7 @@ static int rtl_open(struct net_device *dev)
rtl_unlock_work(tp);

tp->saved_wolopts = 0;
pm_runtime_put_noidle(&pdev->dev);
pm_runtime_put_sync(&pdev->dev);

rtl8169_check_link_status(dev, tp, ioaddr);
out:
Expand Down Expand Up @@ -8094,8 +8094,10 @@ static int rtl8169_runtime_suspend(struct device *device)
struct net_device *dev = pci_get_drvdata(pdev);
struct rtl8169_private *tp = netdev_priv(dev);

if (!tp->TxDescArray)
if (!tp->TxDescArray) {
rtl_pll_power_down(tp);
return 0;
}

rtl_lock_work(tp);
tp->saved_wolopts = __rtl8169_get_wol(tp);
Expand Down Expand Up @@ -8137,9 +8139,11 @@ static int rtl8169_runtime_idle(struct device *device)
{
struct pci_dev *pdev = to_pci_dev(device);
struct net_device *dev = pci_get_drvdata(pdev);
struct rtl8169_private *tp = netdev_priv(dev);

return tp->TxDescArray ? -EBUSY : 0;
if (!netif_running(dev) || !netif_carrier_ok(dev))
pm_schedule_suspend(device, 10000);

return -EBUSY;
}

static const struct dev_pm_ops rtl8169_pm_ops = {
Expand Down Expand Up @@ -8687,11 +8691,11 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rtl8168_driver_start(tp);
}

if (pci_dev_run_wake(pdev))
pm_runtime_put_noidle(&pdev->dev);

netif_carrier_off(dev);

if (pci_dev_run_wake(pdev))
pm_runtime_put_sync(&pdev->dev);

return 0;
}

Expand Down

0 comments on commit a92a084

Please sign in to comment.