diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igc/igc_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igc/igc_main.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 686793c539f2..031c332f66c4 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -7115,6 +7115,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; @@ -7500,6 +7504,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; @@ -7625,6 +7632,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.  		 */  | 
