Commit 5d2ca2e1 authored by Jesse Brandeburg's avatar Jesse Brandeburg Committed by David S. Miller
Browse files

e100: fix device suspend/resume

As reported in [1], e100 was no longer working for suspend/resume
cycles. The previous commit mentioned in the fixes appears to have
broken things and this attempts to practice best known methods for
device power management and keep wake-up working while allowing
suspend/resume to work. To do this, I reorder a little bit of code
and fix the resume path to make sure the device is enabled.

[1] https://bugzilla.kernel.org/show_bug.cgi?id=214933



Fixes: 69a74aef ("e100: use generic power management")
Cc: Vaibhav Gupta <vaibhavgupta40@gmail.com>
Reported-by: default avatarAlexey Kuznetsov <axet@me.com>
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: default avatarAlexey Kuznetsov <axet@me.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fec1faf2
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -3003,9 +3003,10 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake)
	struct net_device *netdev = pci_get_drvdata(pdev);
	struct nic *nic = netdev_priv(netdev);

	netif_device_detach(netdev);

	if (netif_running(netdev))
		e100_down(nic);
	netif_device_detach(netdev);

	if ((nic->flags & wol_magic) | e100_asf(nic)) {
		/* enable reverse auto-negotiation */
@@ -3022,7 +3023,7 @@ static void __e100_shutdown(struct pci_dev *pdev, bool *enable_wake)
		*enable_wake = false;
	}

	pci_clear_master(pdev);
	pci_disable_device(pdev);
}

static int __e100_power_off(struct pci_dev *pdev, bool wake)
@@ -3042,8 +3043,6 @@ static int __maybe_unused e100_suspend(struct device *dev_d)

	__e100_shutdown(to_pci_dev(dev_d), &wake);

	device_wakeup_disable(dev_d);

	return 0;
}

@@ -3051,6 +3050,14 @@ static int __maybe_unused e100_resume(struct device *dev_d)
{
	struct net_device *netdev = dev_get_drvdata(dev_d);
	struct nic *nic = netdev_priv(netdev);
	int err;

	err = pci_enable_device(to_pci_dev(dev_d));
	if (err) {
		netdev_err(netdev, "Resume cannot enable PCI device, aborting\n");
		return err;
	}
	pci_set_master(to_pci_dev(dev_d));

	/* disable reverse auto-negotiation */
	if (nic->phy == phy_82552_v) {
@@ -3062,10 +3069,11 @@ static int __maybe_unused e100_resume(struct device *dev_d)
		           smartspeed & ~(E100_82552_REV_ANEG));
	}

	netif_device_attach(netdev);
	if (netif_running(netdev))
		e100_up(nic);

	netif_device_attach(netdev);

	return 0;
}