diff options
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 113 |
1 files changed, 81 insertions, 32 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 335119a5687a..0956be7c7488 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -1434,27 +1434,6 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter) | |||
1434 | } | 1434 | } |
1435 | 1435 | ||
1436 | /** | 1436 | /** |
1437 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
1438 | * @adapter: board private structure | ||
1439 | **/ | ||
1440 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
1441 | { | ||
1442 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
1443 | if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | ||
1444 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0); | ||
1445 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(2), ~0); | ||
1446 | } | ||
1447 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1448 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
1449 | int i; | ||
1450 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
1451 | synchronize_irq(adapter->msix_entries[i].vector); | ||
1452 | } else { | ||
1453 | synchronize_irq(adapter->pdev->irq); | ||
1454 | } | ||
1455 | } | ||
1456 | |||
1457 | /** | ||
1458 | * ixgbe_irq_enable - Enable default interrupt generation settings | 1437 | * ixgbe_irq_enable - Enable default interrupt generation settings |
1459 | * @adapter: board private structure | 1438 | * @adapter: board private structure |
1460 | **/ | 1439 | **/ |
@@ -1597,6 +1576,39 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter) | |||
1597 | } | 1576 | } |
1598 | 1577 | ||
1599 | /** | 1578 | /** |
1579 | * ixgbe_irq_disable - Mask off interrupt generation on the NIC | ||
1580 | * @adapter: board private structure | ||
1581 | **/ | ||
1582 | static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter) | ||
1583 | { | ||
1584 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); | ||
1585 | if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | ||
1586 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0); | ||
1587 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(2), ~0); | ||
1588 | } | ||
1589 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1590 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
1591 | int i; | ||
1592 | for (i = 0; i < adapter->num_msix_vectors; i++) | ||
1593 | synchronize_irq(adapter->msix_entries[i].vector); | ||
1594 | } else { | ||
1595 | synchronize_irq(adapter->pdev->irq); | ||
1596 | } | ||
1597 | } | ||
1598 | |||
1599 | static inline void ixgbe_irq_enable_queues(struct ixgbe_adapter *adapter) | ||
1600 | { | ||
1601 | u32 mask = IXGBE_EIMS_RTX_QUEUE; | ||
1602 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | ||
1603 | if (adapter->hw.mac.type == ixgbe_mac_82599EB) { | ||
1604 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS_EX(1), mask << 16); | ||
1605 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS_EX(2), | ||
1606 | (mask << 16 | mask)); | ||
1607 | } | ||
1608 | /* skip the flush */ | ||
1609 | } | ||
1610 | |||
1611 | /** | ||
1600 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts | 1612 | * ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts |
1601 | * | 1613 | * |
1602 | **/ | 1614 | **/ |
@@ -2624,7 +2636,7 @@ static int ixgbe_poll(struct napi_struct *napi, int budget) | |||
2624 | if (adapter->itr_setting & 1) | 2636 | if (adapter->itr_setting & 1) |
2625 | ixgbe_set_itr(adapter); | 2637 | ixgbe_set_itr(adapter); |
2626 | if (!test_bit(__IXGBE_DOWN, &adapter->state)) | 2638 | if (!test_bit(__IXGBE_DOWN, &adapter->state)) |
2627 | ixgbe_irq_enable(adapter); | 2639 | ixgbe_irq_enable_queues(adapter); |
2628 | } | 2640 | } |
2629 | return work_done; | 2641 | return work_done; |
2630 | } | 2642 | } |
@@ -3806,17 +3818,54 @@ static void ixgbe_watchdog(unsigned long data) | |||
3806 | /* Do the watchdog outside of interrupt context due to the lovely | 3818 | /* Do the watchdog outside of interrupt context due to the lovely |
3807 | * delays that some of the newer hardware requires */ | 3819 | * delays that some of the newer hardware requires */ |
3808 | if (!test_bit(__IXGBE_DOWN, &adapter->state)) { | 3820 | if (!test_bit(__IXGBE_DOWN, &adapter->state)) { |
3821 | u64 eics = 0; | ||
3822 | int i; | ||
3823 | |||
3824 | for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) | ||
3825 | eics |= (1 << i); | ||
3826 | |||
3809 | /* Cause software interrupt to ensure rx rings are cleaned */ | 3827 | /* Cause software interrupt to ensure rx rings are cleaned */ |
3810 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | 3828 | switch (hw->mac.type) { |
3811 | u32 eics = | 3829 | case ixgbe_mac_82598EB: |
3812 | (1 << (adapter->num_msix_vectors - NON_Q_VECTORS)) - 1; | 3830 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { |
3813 | IXGBE_WRITE_REG(hw, IXGBE_EICS, eics); | 3831 | IXGBE_WRITE_REG(hw, IXGBE_EICS, (u32)eics); |
3814 | } else { | 3832 | } else { |
3815 | /* For legacy and MSI interrupts don't set any bits that | 3833 | /* |
3816 | * are enabled for EIAM, because this operation would | 3834 | * for legacy and MSI interrupts don't set any |
3817 | * set *both* EIMS and EICS for any bit in EIAM */ | 3835 | * bits that are enabled for EIAM, because this |
3818 | IXGBE_WRITE_REG(hw, IXGBE_EICS, | 3836 | * operation would set *both* EIMS and EICS for |
3819 | (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER)); | 3837 | * any bit in EIAM |
3838 | */ | ||
3839 | IXGBE_WRITE_REG(hw, IXGBE_EICS, | ||
3840 | (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER)); | ||
3841 | } | ||
3842 | break; | ||
3843 | case ixgbe_mac_82599EB: | ||
3844 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | ||
3845 | /* | ||
3846 | * EICS(0..15) first 0-15 q vectors | ||
3847 | * EICS[1] (16..31) q vectors 16-31 | ||
3848 | * EICS[2] (0..31) q vectors 32-63 | ||
3849 | */ | ||
3850 | IXGBE_WRITE_REG(hw, IXGBE_EICS, | ||
3851 | (u32)(eics & 0xFFFF)); | ||
3852 | IXGBE_WRITE_REG(hw, IXGBE_EICS_EX(1), | ||
3853 | (u32)(eics & 0xFFFF0000)); | ||
3854 | IXGBE_WRITE_REG(hw, IXGBE_EICS_EX(2), | ||
3855 | (u32)(eics >> 32)); | ||
3856 | } else { | ||
3857 | /* | ||
3858 | * for legacy and MSI interrupts don't set any | ||
3859 | * bits that are enabled for EIAM, because this | ||
3860 | * operation would set *both* EIMS and EICS for | ||
3861 | * any bit in EIAM | ||
3862 | */ | ||
3863 | IXGBE_WRITE_REG(hw, IXGBE_EICS, | ||
3864 | (IXGBE_EICS_TCP_TIMER | IXGBE_EICS_OTHER)); | ||
3865 | } | ||
3866 | break; | ||
3867 | default: | ||
3868 | break; | ||
3820 | } | 3869 | } |
3821 | /* Reset the timer */ | 3870 | /* Reset the timer */ |
3822 | mod_timer(&adapter->watchdog_timer, | 3871 | mod_timer(&adapter->watchdog_timer, |