I226 devices advertise support for the PCI-E link L1.2 substate. However, due to a hardware limitation, the exit latency from this low-power state is longer than the packet buffer can tolerate under high traffic conditions. This can lead to packet loss and degraded performance.
To mitigate this, disable the L1.2 substate during both probe and resume flows. Link: https://lore.kernel.org/intel-wired-lan/[email protected] Signed-off-by: Vitaly Lifshits <[email protected]> Fixes: 43546211738e ("igc: Add new device ID's") --- drivers/net/ethernet/intel/igc/igc_main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 27575a1e1777..65ec705eac33 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -7074,6 +7074,8 @@ static int igc_probe(struct pci_dev *pdev, const struct igc_info *ei = igc_info_tbl[ent->driver_data]; int err; + pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2); + err = pci_enable_device_mem(pdev); if (err) return err; @@ -7498,6 +7500,8 @@ static int __igc_resume(struct device *dev, bool rpm) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); + pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2); + if (igc_init_interrupt_scheme(adapter, true)) { netdev_err(netdev, "Unable to allocate memory for queues\n"); return -ENOMEM; @@ -7623,6 +7627,7 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); + pci_disable_link_state_locked(pdev, PCIE_LINK_STATE_L1_2); /* In case of PCI error, adapter loses its HW address * so we should re-assign it here. */ -- 2.34.1
