ixgbe: fix link behavior for SFP+ when driver is brought down
authorDon Skidmore <donald.c.skidmore@intel.com>
Fri, 3 Dec 2010 03:31:51 +0000 (03:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 3 Dec 2010 17:36:45 +0000 (09:36 -0800)
We have had several requests to have ifconfig down command disable
the SFP+ laser and thus make link go down.  Likewise on ifconfig up
the laser would be enabled and link would come up.  This patch enables
that behavior.

Signed-off-by: Don Skidmore <donald.c.skidmore@intel.com>
Tested-by: Stephen Ko <stephen.s.ko@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ixgbe/ixgbe_82599.c
drivers/net/ixgbe/ixgbe_main.c

index e34643eef1627c3d3a43633902bb55a2e3e31788..8fa76785b45c6876029e495c6ddcc8887adc03d6 100644 (file)
@@ -65,9 +65,9 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw);
 static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
 {
        struct ixgbe_mac_info *mac = &hw->mac;
-       if (hw->phy.multispeed_fiber) {
-               /* Set up dual speed SFP+ support */
-               mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber;
+
+       /* enable the laser control functions for SFP+ fiber */
+       if (mac->ops.get_media_type(hw) == ixgbe_media_type_fiber) {
                mac->ops.disable_tx_laser =
                                       &ixgbe_disable_tx_laser_multispeed_fiber;
                mac->ops.enable_tx_laser =
@@ -77,6 +77,12 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
                mac->ops.disable_tx_laser = NULL;
                mac->ops.enable_tx_laser = NULL;
                mac->ops.flap_tx_laser = NULL;
+       }
+
+       if (hw->phy.multispeed_fiber) {
+               /* Set up dual speed SFP+ support */
+               mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber;
+       } else {
                if ((mac->ops.get_media_type(hw) ==
                     ixgbe_media_type_backplane) &&
                    (hw->phy.smart_speed == ixgbe_smart_speed_auto ||
index 494cb57b700ddc5de356e264613771379dac3598..5861ece70207f5f90ae1ffdbd2673eccdf9eb52c 100644 (file)
@@ -3793,8 +3793,11 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
        else
                ixgbe_configure_msi_and_legacy(adapter);
 
-       /* enable the optics */
-       if (hw->phy.multispeed_fiber && hw->mac.ops.enable_tx_laser)
+       /* enable the optics for both mult-speed fiber and 82599 SFP+ fiber */
+       if (hw->mac.ops.enable_tx_laser &&
+           ((hw->phy.multispeed_fiber) ||
+            ((hw->phy.type == ixgbe_media_type_fiber) &&
+             (hw->mac.type == ixgbe_mac_82599EB))))
                hw->mac.ops.enable_tx_laser(hw);
 
        clear_bit(__IXGBE_DOWN, &adapter->state);
@@ -4106,15 +4109,19 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
                break;
        }
 
-       /* power down the optics */
-       if (hw->phy.multispeed_fiber && hw->mac.ops.disable_tx_laser)
-               hw->mac.ops.disable_tx_laser(hw);
-
        /* clear n-tuple filters that are cached */
        ethtool_ntuple_flush(netdev);
 
        if (!pci_channel_offline(adapter->pdev))
                ixgbe_reset(adapter);
+
+       /* power down the optics for multispeed fiber and 82599 SFP+ fiber */
+       if (hw->mac.ops.disable_tx_laser &&
+           ((hw->phy.multispeed_fiber) ||
+            ((hw->phy.type == ixgbe_media_type_fiber) &&
+             (hw->mac.type == ixgbe_mac_82599EB))))
+               hw->mac.ops.disable_tx_laser(hw);
+
        ixgbe_clean_all_tx_rings(adapter);
        ixgbe_clean_all_rx_rings(adapter);
 
@@ -7197,8 +7204,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
                goto err_eeprom;
        }
 
-       /* power down the optics */
-       if (hw->phy.multispeed_fiber && hw->mac.ops.disable_tx_laser)
+       /* power down the optics for multispeed fiber and 82599 SFP+ fiber */
+       if (hw->mac.ops.disable_tx_laser &&
+           ((hw->phy.multispeed_fiber) ||
+            ((hw->phy.type == ixgbe_media_type_fiber) &&
+             (hw->mac.type == ixgbe_mac_82599EB))))
                hw->mac.ops.disable_tx_laser(hw);
 
        init_timer(&adapter->watchdog_timer);