diff options
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 37 |
1 files changed, 14 insertions, 23 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index fc5c63f4f578..f501dd5e7b16 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -836,9 +836,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
836 | struct e1000_hw *hw = &adapter->hw; | 836 | struct e1000_hw *hw = &adapter->hw; |
837 | u32 icr = er32(ICR); | 837 | u32 icr = er32(ICR); |
838 | 838 | ||
839 | /* read ICR disables interrupts using IAM, so keep up with our | 839 | /* read ICR disables interrupts using IAM */ |
840 | * enable/disable accounting */ | ||
841 | atomic_inc(&adapter->irq_sem); | ||
842 | 840 | ||
843 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { | 841 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { |
844 | hw->mac.get_link_status = 1; | 842 | hw->mac.get_link_status = 1; |
@@ -868,8 +866,6 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
868 | adapter->total_rx_bytes = 0; | 866 | adapter->total_rx_bytes = 0; |
869 | adapter->total_rx_packets = 0; | 867 | adapter->total_rx_packets = 0; |
870 | __netif_rx_schedule(netdev, &adapter->napi); | 868 | __netif_rx_schedule(netdev, &adapter->napi); |
871 | } else { | ||
872 | atomic_dec(&adapter->irq_sem); | ||
873 | } | 869 | } |
874 | 870 | ||
875 | return IRQ_HANDLED; | 871 | return IRQ_HANDLED; |
@@ -895,11 +891,8 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
895 | if (!(icr & E1000_ICR_INT_ASSERTED)) | 891 | if (!(icr & E1000_ICR_INT_ASSERTED)) |
896 | return IRQ_NONE; | 892 | return IRQ_NONE; |
897 | 893 | ||
898 | /* Interrupt Auto-Mask...upon reading ICR, | 894 | /* Interrupt Auto-Mask...upon reading ICR, interrupts are masked. No |
899 | * interrupts are masked. No need for the | 895 | * need for the IMC write */ |
900 | * IMC write, but it does mean we should | ||
901 | * account for it ASAP. */ | ||
902 | atomic_inc(&adapter->irq_sem); | ||
903 | 896 | ||
904 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { | 897 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { |
905 | hw->mac.get_link_status = 1; | 898 | hw->mac.get_link_status = 1; |
@@ -931,8 +924,6 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
931 | adapter->total_rx_bytes = 0; | 924 | adapter->total_rx_bytes = 0; |
932 | adapter->total_rx_packets = 0; | 925 | adapter->total_rx_packets = 0; |
933 | __netif_rx_schedule(netdev, &adapter->napi); | 926 | __netif_rx_schedule(netdev, &adapter->napi); |
934 | } else { | ||
935 | atomic_dec(&adapter->irq_sem); | ||
936 | } | 927 | } |
937 | 928 | ||
938 | return IRQ_HANDLED; | 929 | return IRQ_HANDLED; |
@@ -983,7 +974,6 @@ static void e1000_irq_disable(struct e1000_adapter *adapter) | |||
983 | { | 974 | { |
984 | struct e1000_hw *hw = &adapter->hw; | 975 | struct e1000_hw *hw = &adapter->hw; |
985 | 976 | ||
986 | atomic_inc(&adapter->irq_sem); | ||
987 | ew32(IMC, ~0); | 977 | ew32(IMC, ~0); |
988 | e1e_flush(); | 978 | e1e_flush(); |
989 | synchronize_irq(adapter->pdev->irq); | 979 | synchronize_irq(adapter->pdev->irq); |
@@ -996,10 +986,8 @@ static void e1000_irq_enable(struct e1000_adapter *adapter) | |||
996 | { | 986 | { |
997 | struct e1000_hw *hw = &adapter->hw; | 987 | struct e1000_hw *hw = &adapter->hw; |
998 | 988 | ||
999 | if (atomic_dec_and_test(&adapter->irq_sem)) { | 989 | ew32(IMS, IMS_ENABLE_MASK); |
1000 | ew32(IMS, IMS_ENABLE_MASK); | 990 | e1e_flush(); |
1001 | e1e_flush(); | ||
1002 | } | ||
1003 | } | 991 | } |
1004 | 992 | ||
1005 | /** | 993 | /** |
@@ -1427,9 +1415,12 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
1427 | struct e1000_hw *hw = &adapter->hw; | 1415 | struct e1000_hw *hw = &adapter->hw; |
1428 | u32 vfta, index; | 1416 | u32 vfta, index; |
1429 | 1417 | ||
1430 | e1000_irq_disable(adapter); | 1418 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
1419 | e1000_irq_disable(adapter); | ||
1431 | vlan_group_set_device(adapter->vlgrp, vid, NULL); | 1420 | vlan_group_set_device(adapter->vlgrp, vid, NULL); |
1432 | e1000_irq_enable(adapter); | 1421 | |
1422 | if (!test_bit(__E1000_DOWN, &adapter->state)) | ||
1423 | e1000_irq_enable(adapter); | ||
1433 | 1424 | ||
1434 | if ((adapter->hw.mng_cookie.status & | 1425 | if ((adapter->hw.mng_cookie.status & |
1435 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && | 1426 | E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && |
@@ -1480,7 +1471,8 @@ static void e1000_vlan_rx_register(struct net_device *netdev, | |||
1480 | struct e1000_hw *hw = &adapter->hw; | 1471 | struct e1000_hw *hw = &adapter->hw; |
1481 | u32 ctrl, rctl; | 1472 | u32 ctrl, rctl; |
1482 | 1473 | ||
1483 | e1000_irq_disable(adapter); | 1474 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
1475 | e1000_irq_disable(adapter); | ||
1484 | adapter->vlgrp = grp; | 1476 | adapter->vlgrp = grp; |
1485 | 1477 | ||
1486 | if (grp) { | 1478 | if (grp) { |
@@ -1517,7 +1509,8 @@ static void e1000_vlan_rx_register(struct net_device *netdev, | |||
1517 | } | 1509 | } |
1518 | } | 1510 | } |
1519 | 1511 | ||
1520 | e1000_irq_enable(adapter); | 1512 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
1513 | e1000_irq_enable(adapter); | ||
1521 | } | 1514 | } |
1522 | 1515 | ||
1523 | static void e1000_restore_vlan(struct e1000_adapter *adapter) | 1516 | static void e1000_restore_vlan(struct e1000_adapter *adapter) |
@@ -2167,7 +2160,6 @@ void e1000e_down(struct e1000_adapter *adapter) | |||
2167 | msleep(10); | 2160 | msleep(10); |
2168 | 2161 | ||
2169 | napi_disable(&adapter->napi); | 2162 | napi_disable(&adapter->napi); |
2170 | atomic_set(&adapter->irq_sem, 0); | ||
2171 | e1000_irq_disable(adapter); | 2163 | e1000_irq_disable(adapter); |
2172 | 2164 | ||
2173 | del_timer_sync(&adapter->watchdog_timer); | 2165 | del_timer_sync(&adapter->watchdog_timer); |
@@ -2227,7 +2219,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
2227 | spin_lock_init(&adapter->tx_queue_lock); | 2219 | spin_lock_init(&adapter->tx_queue_lock); |
2228 | 2220 | ||
2229 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 2221 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
2230 | atomic_set(&adapter->irq_sem, 0); | ||
2231 | e1000_irq_disable(adapter); | 2222 | e1000_irq_disable(adapter); |
2232 | 2223 | ||
2233 | spin_lock_init(&adapter->stats_lock); | 2224 | spin_lock_init(&adapter->stats_lock); |