> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On Behalf
> Of Vitaly Lifshits
> Sent: Wednesday, June 11, 2025 2:53 PM
> To: [email protected]
> Cc: Lifshits, Vitaly <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-net v2 1/1] igc: disable L1.2
> PCI-E link substate to avoid performance issue
>
> 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. The increased power draw
> between L1.1 and L1.2 is insignificant.
>
> Link: https://lore.kernel.org/intel-wired-lan/15248b4f-3271-42dd-8e35-
> [email protected]
> Signed-off-by: Vitaly Lifshits <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>
> Fixes: 43546211738e ("igc: Add new device ID's")
> ---
> drivers/net/ethernet/intel/igc/igc_main.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c
> b/drivers/net/ethernet/intel/igc/igc_main.c
> index 27575a1e1777..3ada48b85bd9 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -7113,6 +7113,10 @@ static int igc_probe(struct pci_dev *pdev,
> adapter->port_num = hw->bus.func;
> adapter->msg_enable = netif_msg_init(debug,
> DEFAULT_MSG_ENABLE);
>
> + /* Disable ASPM L1.2 on I226 devices to avoid packet loss */
> + if (igc_is_device_id_i226(hw))
> + pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2);
> +
> err = pci_save_state(pdev);
> if (err)
> goto err_ioremap;
> @@ -7498,6 +7502,9 @@ static int __igc_resume(struct device *dev, bool
> rpm)
> pci_enable_wake(pdev, PCI_D3hot, 0);
> pci_enable_wake(pdev, PCI_D3cold, 0);
>
> + if (igc_is_device_id_i226(hw))
> + 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 +7630,9 @@ 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);
>
> + if (igc_is_device_id_i226(hw))
> + 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