igb: only disable/enable interrupt bits for igb physical function
authorAlexander Duyck <alexander.h.duyck@intel.com>
Thu, 3 Sep 2009 14:49:15 +0000 (14:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Sep 2009 03:01:47 +0000 (20:01 -0700)
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>
drivers/net/igb/igb_main.c

index 95089a8feeec03e3f23b87b2c22e3a2e6878a77f..1d03fcb0bd6c000ad5001021cc7cad2f8437d5ca 100644 (file)
@@ -821,9 +821,11 @@ static void igb_irq_disable(struct igb_adapter *adapter)
        struct e1000_hw *hw = &adapter->hw;
 
        if (adapter->msix_entries) {
-               wr32(E1000_EIAM, 0);
-               wr32(E1000_EIMC, ~0);
-               wr32(E1000_EIAC, 0);
+               u32 regval = rd32(E1000_EIAM);
+               wr32(E1000_EIAM, regval & ~adapter->eims_enable_mask);
+               wr32(E1000_EIMC, adapter->eims_enable_mask);
+               regval = rd32(E1000_EIAC);
+               wr32(E1000_EIAC, regval & ~adapter->eims_enable_mask);
        }
 
        wr32(E1000_IAM, 0);
@@ -841,8 +843,10 @@ static void igb_irq_enable(struct igb_adapter *adapter)
        struct e1000_hw *hw = &adapter->hw;
 
        if (adapter->msix_entries) {
-               wr32(E1000_EIAC, adapter->eims_enable_mask);
-               wr32(E1000_EIAM, adapter->eims_enable_mask);
+               u32 regval = rd32(E1000_EIAC);
+               wr32(E1000_EIAC, regval | adapter->eims_enable_mask);
+               regval = rd32(E1000_EIAM);
+               wr32(E1000_EIAM, regval | adapter->eims_enable_mask);
                wr32(E1000_EIMS, adapter->eims_enable_mask);
                if (adapter->vfs_allocated_count)
                        wr32(E1000_MBVFIMR, 0xFF);