|
@@ -1905,30 +1905,15 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)
|
|
struct net_device *netdev = data;
|
|
struct net_device *netdev = data;
|
|
struct e1000_adapter *adapter = netdev_priv(netdev);
|
|
struct e1000_adapter *adapter = netdev_priv(netdev);
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
- u32 icr = er32(ICR);
|
|
|
|
-
|
|
|
|
- if (!(icr & E1000_ICR_INT_ASSERTED)) {
|
|
|
|
- if (!test_bit(__E1000_DOWN, &adapter->state))
|
|
|
|
- ew32(IMS, E1000_IMS_OTHER);
|
|
|
|
- return IRQ_NONE;
|
|
|
|
- }
|
|
|
|
|
|
|
|
- if (icr & adapter->eiac_mask)
|
|
|
|
- ew32(ICS, (icr & adapter->eiac_mask));
|
|
|
|
|
|
+ hw->mac.get_link_status = true;
|
|
|
|
|
|
- if (icr & E1000_ICR_OTHER) {
|
|
|
|
- if (!(icr & E1000_ICR_LSC))
|
|
|
|
- goto no_link_interrupt;
|
|
|
|
- hw->mac.get_link_status = true;
|
|
|
|
- /* guard against interrupt when we're going down */
|
|
|
|
- if (!test_bit(__E1000_DOWN, &adapter->state))
|
|
|
|
- mod_timer(&adapter->watchdog_timer, jiffies + 1);
|
|
|
|
|
|
+ /* guard against interrupt when we're going down */
|
|
|
|
+ if (!test_bit(__E1000_DOWN, &adapter->state)) {
|
|
|
|
+ mod_timer(&adapter->watchdog_timer, jiffies + 1);
|
|
|
|
+ ew32(IMS, E1000_IMS_OTHER);
|
|
}
|
|
}
|
|
|
|
|
|
-no_link_interrupt:
|
|
|
|
- if (!test_bit(__E1000_DOWN, &adapter->state))
|
|
|
|
- ew32(IMS, E1000_IMS_LSC | E1000_IMS_OTHER);
|
|
|
|
-
|
|
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1946,6 +1931,9 @@ static irqreturn_t e1000_intr_msix_tx(int __always_unused irq, void *data)
|
|
/* Ring was not completely cleaned, so fire another interrupt */
|
|
/* Ring was not completely cleaned, so fire another interrupt */
|
|
ew32(ICS, tx_ring->ims_val);
|
|
ew32(ICS, tx_ring->ims_val);
|
|
|
|
|
|
|
|
+ if (!test_bit(__E1000_DOWN, &adapter->state))
|
|
|
|
+ ew32(IMS, adapter->tx_ring->ims_val);
|
|
|
|
+
|
|
return IRQ_HANDLED;
|
|
return IRQ_HANDLED;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2027,6 +2015,7 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
|
|
hw->hw_addr + E1000_EITR_82574(vector));
|
|
hw->hw_addr + E1000_EITR_82574(vector));
|
|
else
|
|
else
|
|
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
|
|
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
|
|
|
|
+ adapter->eiac_mask |= E1000_IMS_OTHER;
|
|
|
|
|
|
/* Cause Tx interrupts on every write back */
|
|
/* Cause Tx interrupts on every write back */
|
|
ivar |= (1 << 31);
|
|
ivar |= (1 << 31);
|
|
@@ -2034,12 +2023,8 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
|
|
ew32(IVAR, ivar);
|
|
ew32(IVAR, ivar);
|
|
|
|
|
|
/* enable MSI-X PBA support */
|
|
/* enable MSI-X PBA support */
|
|
- ctrl_ext = er32(CTRL_EXT);
|
|
|
|
- ctrl_ext |= E1000_CTRL_EXT_PBA_CLR;
|
|
|
|
-
|
|
|
|
- /* Auto-Mask Other interrupts upon ICR read */
|
|
|
|
- ew32(IAM, ~E1000_EIAC_MASK_82574 | E1000_IMS_OTHER);
|
|
|
|
- ctrl_ext |= E1000_CTRL_EXT_EIAME;
|
|
|
|
|
|
+ ctrl_ext = er32(CTRL_EXT) & ~E1000_CTRL_EXT_IAME;
|
|
|
|
+ ctrl_ext |= E1000_CTRL_EXT_PBA_CLR | E1000_CTRL_EXT_EIAME;
|
|
ew32(CTRL_EXT, ctrl_ext);
|
|
ew32(CTRL_EXT, ctrl_ext);
|
|
e1e_flush();
|
|
e1e_flush();
|
|
}
|
|
}
|
|
@@ -2255,7 +2240,7 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
|
|
|
|
|
|
if (adapter->msix_entries) {
|
|
if (adapter->msix_entries) {
|
|
ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
|
|
ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
|
|
- ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER | E1000_IMS_LSC);
|
|
|
|
|
|
+ ew32(IMS, adapter->eiac_mask | E1000_IMS_LSC);
|
|
} else if ((hw->mac.type == e1000_pch_lpt) ||
|
|
} else if ((hw->mac.type == e1000_pch_lpt) ||
|
|
(hw->mac.type == e1000_pch_spt)) {
|
|
(hw->mac.type == e1000_pch_spt)) {
|
|
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
|
|
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
|
|
@@ -4146,10 +4131,24 @@ void e1000e_reset(struct e1000_adapter *adapter)
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-int e1000e_up(struct e1000_adapter *adapter)
|
|
|
|
|
|
+/**
|
|
|
|
+ * e1000e_trigger_lsc - trigger an LSC interrupt
|
|
|
|
+ * @adapter:
|
|
|
|
+ *
|
|
|
|
+ * Fire a link status change interrupt to start the watchdog.
|
|
|
|
+ **/
|
|
|
|
+static void e1000e_trigger_lsc(struct e1000_adapter *adapter)
|
|
{
|
|
{
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
|
|
|
|
|
+ if (adapter->msix_entries)
|
|
|
|
+ ew32(ICS, E1000_ICS_OTHER);
|
|
|
|
+ else
|
|
|
|
+ ew32(ICS, E1000_ICS_LSC);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void e1000e_up(struct e1000_adapter *adapter)
|
|
|
|
+{
|
|
/* hardware has been reset, we need to reload some things */
|
|
/* hardware has been reset, we need to reload some things */
|
|
e1000_configure(adapter);
|
|
e1000_configure(adapter);
|
|
|
|
|
|
@@ -4161,13 +4160,7 @@ int e1000e_up(struct e1000_adapter *adapter)
|
|
|
|
|
|
netif_start_queue(adapter->netdev);
|
|
netif_start_queue(adapter->netdev);
|
|
|
|
|
|
- /* fire a link change interrupt to start the watchdog */
|
|
|
|
- if (adapter->msix_entries)
|
|
|
|
- ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
|
|
|
|
- else
|
|
|
|
- ew32(ICS, E1000_ICS_LSC);
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
|
|
+ e1000e_trigger_lsc(adapter);
|
|
}
|
|
}
|
|
|
|
|
|
static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
|
|
static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
|
|
@@ -4592,11 +4585,7 @@ static int e1000_open(struct net_device *netdev)
|
|
hw->mac.get_link_status = true;
|
|
hw->mac.get_link_status = true;
|
|
pm_runtime_put(&pdev->dev);
|
|
pm_runtime_put(&pdev->dev);
|
|
|
|
|
|
- /* fire a link status change interrupt to start the watchdog */
|
|
|
|
- if (adapter->msix_entries)
|
|
|
|
- ew32(ICS, E1000_ICS_LSC | E1000_ICR_OTHER);
|
|
|
|
- else
|
|
|
|
- ew32(ICS, E1000_ICS_LSC);
|
|
|
|
|
|
+ e1000e_trigger_lsc(adapter);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
@@ -6633,7 +6622,7 @@ static int e1000e_pm_runtime_resume(struct device *dev)
|
|
return rc;
|
|
return rc;
|
|
|
|
|
|
if (netdev->flags & IFF_UP)
|
|
if (netdev->flags & IFF_UP)
|
|
- rc = e1000e_up(adapter);
|
|
|
|
|
|
+ e1000e_up(adapter);
|
|
|
|
|
|
return rc;
|
|
return rc;
|
|
}
|
|
}
|
|
@@ -6824,13 +6813,8 @@ static void e1000_io_resume(struct pci_dev *pdev)
|
|
|
|
|
|
e1000_init_manageability_pt(adapter);
|
|
e1000_init_manageability_pt(adapter);
|
|
|
|
|
|
- if (netif_running(netdev)) {
|
|
|
|
- if (e1000e_up(adapter)) {
|
|
|
|
- dev_err(&pdev->dev,
|
|
|
|
- "can't bring device back up after reset\n");
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if (netif_running(netdev))
|
|
|
|
+ e1000e_up(adapter);
|
|
|
|
|
|
netif_device_attach(netdev);
|
|
netif_device_attach(netdev);
|
|
|
|
|