diff options
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 8c32c18f569c..e0d736cc245b 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -936,7 +936,16 @@ static irqreturn_t ixgbe_msix_lsc(int irq, void *data) | |||
936 | struct net_device *netdev = data; | 936 | struct net_device *netdev = data; |
937 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 937 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
938 | struct ixgbe_hw *hw = &adapter->hw; | 938 | struct ixgbe_hw *hw = &adapter->hw; |
939 | u32 eicr = IXGBE_READ_REG(hw, IXGBE_EICR); | 939 | u32 eicr; |
940 | |||
941 | /* | ||
942 | * Workaround for Silicon errata. Use clear-by-write instead | ||
943 | * of clear-by-read. Reading with EICS will return the | ||
944 | * interrupt causes without clearing, which later be done | ||
945 | * with the write to EICR. | ||
946 | */ | ||
947 | eicr = IXGBE_READ_REG(hw, IXGBE_EICS); | ||
948 | IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr); | ||
940 | 949 | ||
941 | if (eicr & IXGBE_EICR_LSC) | 950 | if (eicr & IXGBE_EICR_LSC) |
942 | ixgbe_check_lsc(adapter); | 951 | ixgbe_check_lsc(adapter); |
@@ -1355,6 +1364,12 @@ static irqreturn_t ixgbe_intr(int irq, void *data) | |||
1355 | struct ixgbe_hw *hw = &adapter->hw; | 1364 | struct ixgbe_hw *hw = &adapter->hw; |
1356 | u32 eicr; | 1365 | u32 eicr; |
1357 | 1366 | ||
1367 | /* | ||
1368 | * Workaround for silicon errata. Mask the interrupts | ||
1369 | * before the read of EICR. | ||
1370 | */ | ||
1371 | IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK); | ||
1372 | |||
1358 | /* for NAPI, using EIAM to auto-mask tx/rx interrupt bits on read | 1373 | /* for NAPI, using EIAM to auto-mask tx/rx interrupt bits on read |
1359 | * therefore no explict interrupt disable is necessary */ | 1374 | * therefore no explict interrupt disable is necessary */ |
1360 | eicr = IXGBE_READ_REG(hw, IXGBE_EICR); | 1375 | eicr = IXGBE_READ_REG(hw, IXGBE_EICR); |