Message ID | 20230710164213.2821481-1-anthony.l.nguyen@intel.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] e1000e: Use PME poll to circumvent unreliable ACPI wake | expand |
On Mon, Jul 10, 2023 at 09:42:13AM -0700, Tony Nguyen wrote: > From: Kai-Heng Feng <kai.heng.feng@canonical.com> > > On some I219 devices, ethernet cable plugging detection only works once > from PCI D3 state. Subsequent cable plugging does set PME bit correctly, > but device still doesn't get woken up. > > Since I219 connects to the root complex directly, it relies on platform > firmware (ACPI) to wake it up. In this case, the GPE from _PRW only > works for first cable plugging but fails to notify the driver for > subsequent plugging events. > > The issue was originally found on CNP, but the same issue can be found > on ADL too. So workaround the issue by continuing use PME poll after > first ACPI wake. As PME poll is always used, the runtime suspend > restriction for CNP can also be removed. > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > Tested-by: Naama Meir <naamax.meir@linux.intel.com> > Acked-by: Sasha Neftin <sasha.neftin@intel.com> > Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Reviewed-by: Simon Horman <simon.horman@corigine.com>
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 771a3c909c45..18a5e73b8680 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -7021,6 +7021,8 @@ static __maybe_unused int e1000e_pm_runtime_resume(struct device *dev) struct e1000_adapter *adapter = netdev_priv(netdev); int rc; + pdev->pme_poll = true; + rc = __e1000_resume(pdev); if (rc) return rc; @@ -7682,7 +7684,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_SMART_PREPARE); - if (pci_dev_run_wake(pdev) && hw->mac.type != e1000_pch_cnp) + if (pci_dev_run_wake(pdev)) pm_runtime_put_noidle(&pdev->dev); return 0;