diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 58872a4c2540..9a2561409b06 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -183,11 +183,13 @@ static int igb_resume(struct device *);  static int igb_runtime_suspend(struct device *dev);  static int igb_runtime_resume(struct device *dev);  static int igb_runtime_idle(struct device *dev); +#ifdef CONFIG_PM  static const struct dev_pm_ops igb_pm_ops = {  	SET_SYSTEM_SLEEP_PM_OPS(igb_suspend, igb_resume)  	SET_RUNTIME_PM_OPS(igb_runtime_suspend, igb_runtime_resume,  			igb_runtime_idle)  }; +#endif  static void igb_shutdown(struct pci_dev *);  static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs);  #ifdef CONFIG_IGB_DCA @@ -6947,6 +6949,7 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)  	struct e1000_hw *hw = &adapter->hw;  	struct ptp_clock_event event;  	struct timespec64 ts; +	unsigned long flags;  	if (pin < 0 || pin >= IGB_N_SDP)  		return; @@ -6954,9 +6957,12 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)  	if (hw->mac.type == e1000_82580 ||  	    hw->mac.type == e1000_i354 ||  	    hw->mac.type == e1000_i350) { -		s64 ns = rd32(auxstmpl); +		u64 ns = rd32(auxstmpl); -		ns += ((s64)(rd32(auxstmph) & 0xFF)) << 32; +		ns += ((u64)(rd32(auxstmph) & 0xFF)) << 32; +		spin_lock_irqsave(&adapter->tmreg_lock, flags); +		ns = timecounter_cyc2time(&adapter->tc, ns); +		spin_unlock_irqrestore(&adapter->tmreg_lock, flags);  		ts = ns_to_timespec64(ns);  	} else {  		ts.tv_nsec = rd32(auxstmpl); @@ -9581,6 +9587,11 @@ static pci_ers_result_t igb_io_error_detected(struct pci_dev *pdev,  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct igb_adapter *adapter = netdev_priv(netdev); +	if (state == pci_channel_io_normal) { +		dev_warn(&pdev->dev, "Non-correctable non-fatal error reported.\n"); +		return PCI_ERS_RESULT_CAN_RECOVER; +	} +  	netif_device_detach(netdev);  	if (state == pci_channel_io_perm_failure)  |