diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2009-09-03 10:49:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-03 23:01:47 -0400 |
commit | 2dfd12126573d6feb12f1d215a352851750fcbd7 (patch) | |
tree | d94258fba677d18f8556a926eabefc7c05a524a8 | |
parent | ff41f8dcc63b4d027ed314ae909df53746c40632 (diff) |
igb: only disable/enable interrupt bits for igb physical function
The igb_irq_disable/enable calls were causing virtual functions associated
with the igb physical function to have their interrupts disabled. In order
to prevent this from occuring we should only clear/set the bits related to
the physical function.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/igb/igb_main.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index 95089a8feeec..1d03fcb0bd6c 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -821,9 +821,11 @@ static void igb_irq_disable(struct igb_adapter *adapter) | |||
821 | struct e1000_hw *hw = &adapter->hw; | 821 | struct e1000_hw *hw = &adapter->hw; |
822 | 822 | ||
823 | if (adapter->msix_entries) { | 823 | if (adapter->msix_entries) { |
824 | wr32(E1000_EIAM, 0); | 824 | u32 regval = rd32(E1000_EIAM); |
825 | wr32(E1000_EIMC, ~0); | 825 | wr32(E1000_EIAM, regval & ~adapter->eims_enable_mask); |
826 | wr32(E1000_EIAC, 0); | 826 | wr32(E1000_EIMC, adapter->eims_enable_mask); |
827 | regval = rd32(E1000_EIAC); | ||
828 | wr32(E1000_EIAC, regval & ~adapter->eims_enable_mask); | ||
827 | } | 829 | } |
828 | 830 | ||
829 | wr32(E1000_IAM, 0); | 831 | wr32(E1000_IAM, 0); |
@@ -841,8 +843,10 @@ static void igb_irq_enable(struct igb_adapter *adapter) | |||
841 | struct e1000_hw *hw = &adapter->hw; | 843 | struct e1000_hw *hw = &adapter->hw; |
842 | 844 | ||
843 | if (adapter->msix_entries) { | 845 | if (adapter->msix_entries) { |
844 | wr32(E1000_EIAC, adapter->eims_enable_mask); | 846 | u32 regval = rd32(E1000_EIAC); |
845 | wr32(E1000_EIAM, adapter->eims_enable_mask); | 847 | wr32(E1000_EIAC, regval | adapter->eims_enable_mask); |
848 | regval = rd32(E1000_EIAM); | ||
849 | wr32(E1000_EIAM, regval | adapter->eims_enable_mask); | ||
846 | wr32(E1000_EIMS, adapter->eims_enable_mask); | 850 | wr32(E1000_EIMS, adapter->eims_enable_mask); |
847 | if (adapter->vfs_allocated_count) | 851 | if (adapter->vfs_allocated_count) |
848 | wr32(E1000_MBVFIMR, 0xFF); | 852 | wr32(E1000_MBVFIMR, 0xFF); |