|
@@ -1914,30 +1914,20 @@ static irqreturn_t e1000_msix_other(int __always_unused irq, void *data)
|
|
|
struct net_device *netdev = data;
|
|
|
struct e1000_adapter *adapter = netdev_priv(netdev);
|
|
|
struct e1000_hw *hw = &adapter->hw;
|
|
|
- u32 icr;
|
|
|
- bool enable = true;
|
|
|
-
|
|
|
- icr = er32(ICR);
|
|
|
- if (icr & E1000_ICR_RXO) {
|
|
|
- ew32(ICR, E1000_ICR_RXO);
|
|
|
- enable = false;
|
|
|
- /* napi poll will re-enable Other, make sure it runs */
|
|
|
- if (napi_schedule_prep(&adapter->napi)) {
|
|
|
- adapter->total_rx_bytes = 0;
|
|
|
- adapter->total_rx_packets = 0;
|
|
|
- __napi_schedule(&adapter->napi);
|
|
|
- }
|
|
|
- }
|
|
|
+ u32 icr = er32(ICR);
|
|
|
+
|
|
|
+ if (icr & adapter->eiac_mask)
|
|
|
+ ew32(ICS, (icr & adapter->eiac_mask));
|
|
|
+
|
|
|
if (icr & E1000_ICR_LSC) {
|
|
|
- ew32(ICR, E1000_ICR_LSC);
|
|
|
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);
|
|
|
}
|
|
|
|
|
|
- if (enable && !test_bit(__E1000_DOWN, &adapter->state))
|
|
|
- ew32(IMS, E1000_IMS_OTHER);
|
|
|
+ if (!test_bit(__E1000_DOWN, &adapter->state))
|
|
|
+ ew32(IMS, E1000_IMS_OTHER | IMS_OTHER_MASK);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
@@ -2040,7 +2030,6 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)
|
|
|
hw->hw_addr + E1000_EITR_82574(vector));
|
|
|
else
|
|
|
writel(1, hw->hw_addr + E1000_EITR_82574(vector));
|
|
|
- adapter->eiac_mask |= E1000_IMS_OTHER;
|
|
|
|
|
|
/* Cause Tx interrupts on every write back */
|
|
|
ivar |= BIT(31);
|
|
@@ -2265,7 +2254,8 @@ static void e1000_irq_enable(struct e1000_adapter *adapter)
|
|
|
|
|
|
if (adapter->msix_entries) {
|
|
|
ew32(EIAC_82574, adapter->eiac_mask & E1000_EIAC_MASK_82574);
|
|
|
- ew32(IMS, adapter->eiac_mask | E1000_IMS_LSC);
|
|
|
+ ew32(IMS, adapter->eiac_mask | E1000_IMS_OTHER |
|
|
|
+ IMS_OTHER_MASK);
|
|
|
} else if (hw->mac.type >= e1000_pch_lpt) {
|
|
|
ew32(IMS, IMS_ENABLE_MASK | E1000_IMS_ECCER);
|
|
|
} else {
|
|
@@ -2333,8 +2323,8 @@ static int e1000_alloc_ring_dma(struct e1000_adapter *adapter,
|
|
|
{
|
|
|
struct pci_dev *pdev = adapter->pdev;
|
|
|
|
|
|
- ring->desc = dma_alloc_coherent(&pdev->dev, ring->size, &ring->dma,
|
|
|
- GFP_KERNEL);
|
|
|
+ ring->desc = dma_zalloc_coherent(&pdev->dev, ring->size, &ring->dma,
|
|
|
+ GFP_KERNEL);
|
|
|
if (!ring->desc)
|
|
|
return -ENOMEM;
|
|
|
|
|
@@ -2707,8 +2697,7 @@ static int e1000e_poll(struct napi_struct *napi, int weight)
|
|
|
napi_complete_done(napi, work_done);
|
|
|
if (!test_bit(__E1000_DOWN, &adapter->state)) {
|
|
|
if (adapter->msix_entries)
|
|
|
- ew32(IMS, adapter->rx_ring->ims_val |
|
|
|
- E1000_IMS_OTHER);
|
|
|
+ ew32(IMS, adapter->rx_ring->ims_val);
|
|
|
else
|
|
|
e1000_irq_enable(adapter);
|
|
|
}
|