OSDN Git Service

ixgbe: fix issue with SFP events with new X550 devices
authorDon Skidmore <donald.c.skidmore@intel.com>
Wed, 2 Sep 2015 20:47:54 +0000 (13:47 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 16 Sep 2015 00:02:53 +0000 (17:02 -0700)
Add checks for systems that don't have SFP's to avoid incorrectly
acting on interrupts that are falsely interpreted as SFP events.
This also includes a modified check generating the EICR mask to be
more forward-looking.

Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index 63b2cfe..b9267e2 100644 (file)
@@ -2495,17 +2495,26 @@ static inline bool ixgbe_is_sfp(struct ixgbe_hw *hw)
 static void ixgbe_check_sfp_event(struct ixgbe_adapter *adapter, u32 eicr)
 {
        struct ixgbe_hw *hw = &adapter->hw;
+       u32 eicr_mask = IXGBE_EICR_GPI_SDP2(hw);
 
-       if (eicr & IXGBE_EICR_GPI_SDP2(hw)) {
+       if (!ixgbe_is_sfp(hw))
+               return;
+
+       /* Later MAC's use different SDP */
+       if (hw->mac.type >= ixgbe_mac_X540)
+               eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
+
+       if (eicr & eicr_mask) {
                /* Clear the interrupt */
-               IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2(hw));
+               IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
                if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
                        adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
                        ixgbe_service_event_schedule(adapter);
                }
        }
 
-       if (eicr & IXGBE_EICR_GPI_SDP1(hw)) {
+       if (adapter->hw.mac.type == ixgbe_mac_82599EB &&
+           (eicr & IXGBE_EICR_GPI_SDP1(hw))) {
                /* Clear the interrupt */
                IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1(hw));
                if (!test_bit(__IXGBE_DOWN, &adapter->state)) {