Fixed Francois Romieu's email address. On Tue, Feb 14, 2012 at 10:31 AM, Sameer Nanda <snanda@xxxxxxxxxxxx> wrote: > With runtime PM, if the ethernet cable is disconnected, the device is > transitioned to D3 state to conserve energy. If the system is shutdown > in this state, any register accesses in rtl_shutdown are dropped on > the floor. > > This patch transitions the device back to D0 state in rtl_shutdown if > the device was runtime PM suspended. In addition, since runtiome PM > also mucks around with WOL options, the saved WOL options are also > restored in rtl_shutdown. > > Signed-off-by: Sameer Nanda <snanda@xxxxxxxxxxxx> > --- > drivers/net/ethernet/realtek/r8169.c | 12 ++++++++++++ > 1 files changed, 12 insertions(+), 0 deletions(-) > > diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c > index a6921b7..4a894e6 100644 > --- a/drivers/net/ethernet/realtek/r8169.c > +++ b/drivers/net/ethernet/realtek/r8169.c > @@ -691,6 +691,7 @@ struct rtl8169_private { > u16 intr_event; > u16 napi_event; > u16 intr_mask; > + bool runtime_suspended; > > struct mdio_ops { > void (*write)(void __iomem *, int, int); > @@ -4308,6 +4309,7 @@ static int rtl8169_open(struct net_device *dev) > rtl_hw_start(dev); > > tp->saved_wolopts = 0; > + tp->runtime_suspended = false; > pm_runtime_put_noidle(&pdev->dev); > > rtl8169_check_link_status(dev, tp, ioaddr); > @@ -6106,6 +6108,7 @@ static int rtl8169_runtime_suspend(struct device *device) > spin_lock_irq(&tp->lock); > tp->saved_wolopts = __rtl8169_get_wol(tp); > __rtl8169_set_wol(tp, WAKE_ANY); > + tp->runtime_suspended = true; > spin_unlock_irq(&tp->lock); > > rtl8169_net_suspend(dev); > @@ -6125,6 +6128,7 @@ static int rtl8169_runtime_resume(struct device *device) > spin_lock_irq(&tp->lock); > __rtl8169_set_wol(tp, tp->saved_wolopts); > tp->saved_wolopts = 0; > + tp->runtime_suspended = false; > spin_unlock_irq(&tp->lock); > > rtl8169_init_phy(dev, tp); > @@ -6188,6 +6192,10 @@ static void rtl_shutdown(struct pci_dev *pdev) > struct net_device *dev = pci_get_drvdata(pdev); > struct rtl8169_private *tp = netdev_priv(dev); > > + /* Get the device back to D0 state if it was runtime suspended. */ > + if (tp->runtime_suspended) > + pci_set_power_state(pdev, PCI_D0); > + > rtl8169_net_suspend(dev); > > /* Restore original MAC address */ > @@ -6195,6 +6203,10 @@ static void rtl_shutdown(struct pci_dev *pdev) > > spin_lock_irq(&tp->lock); > > + /* Restore WOL flags if they were messed around with. */ > + if (tp->saved_wolopts) > + __rtl8169_set_wol(tp, tp->saved_wolopts); > + > rtl8169_hw_reset(tp); > > spin_unlock_irq(&tp->lock); > -- > 1.7.7.3 > -- Sameer _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/linux-pm