Commit c6ecf39a authored by Don Skidmore's avatar Don Skidmore Committed by David S. Miller

ixgbe: fix link behavior for SFP+ when driver is brought down

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: default avatarDon Skidmore <donald.c.skidmore@intel.com>
Tested-by: default avatarStephen Ko <stephen.s.ko@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e4d849b8
...@@ -65,9 +65,9 @@ static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw); ...@@ -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) static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
{ {
struct ixgbe_mac_info *mac = &hw->mac; struct ixgbe_mac_info *mac = &hw->mac;
if (hw->phy.multispeed_fiber) {
/* Set up dual speed SFP+ support */ /* enable the laser control functions for SFP+ fiber */
mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; if (mac->ops.get_media_type(hw) == ixgbe_media_type_fiber) {
mac->ops.disable_tx_laser = mac->ops.disable_tx_laser =
&ixgbe_disable_tx_laser_multispeed_fiber; &ixgbe_disable_tx_laser_multispeed_fiber;
mac->ops.enable_tx_laser = mac->ops.enable_tx_laser =
...@@ -77,6 +77,12 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) ...@@ -77,6 +77,12 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
mac->ops.disable_tx_laser = NULL; mac->ops.disable_tx_laser = NULL;
mac->ops.enable_tx_laser = NULL; mac->ops.enable_tx_laser = NULL;
mac->ops.flap_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) == if ((mac->ops.get_media_type(hw) ==
ixgbe_media_type_backplane) && ixgbe_media_type_backplane) &&
(hw->phy.smart_speed == ixgbe_smart_speed_auto || (hw->phy.smart_speed == ixgbe_smart_speed_auto ||
......
...@@ -3793,8 +3793,11 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter) ...@@ -3793,8 +3793,11 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter)
else else
ixgbe_configure_msi_and_legacy(adapter); ixgbe_configure_msi_and_legacy(adapter);
/* enable the optics */ /* enable the optics for both mult-speed fiber and 82599 SFP+ fiber */
if (hw->phy.multispeed_fiber && hw->mac.ops.enable_tx_laser) 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); hw->mac.ops.enable_tx_laser(hw);
clear_bit(__IXGBE_DOWN, &adapter->state); clear_bit(__IXGBE_DOWN, &adapter->state);
...@@ -4106,15 +4109,19 @@ void ixgbe_down(struct ixgbe_adapter *adapter) ...@@ -4106,15 +4109,19 @@ void ixgbe_down(struct ixgbe_adapter *adapter)
break; 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 */ /* clear n-tuple filters that are cached */
ethtool_ntuple_flush(netdev); ethtool_ntuple_flush(netdev);
if (!pci_channel_offline(adapter->pdev)) if (!pci_channel_offline(adapter->pdev))
ixgbe_reset(adapter); 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_tx_rings(adapter);
ixgbe_clean_all_rx_rings(adapter); ixgbe_clean_all_rx_rings(adapter);
...@@ -7197,8 +7204,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, ...@@ -7197,8 +7204,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
goto err_eeprom; goto err_eeprom;
} }
/* power down the optics */ /* power down the optics for multispeed fiber and 82599 SFP+ fiber */
if (hw->phy.multispeed_fiber && hw->mac.ops.disable_tx_laser) 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); hw->mac.ops.disable_tx_laser(hw);
init_timer(&adapter->watchdog_timer); init_timer(&adapter->watchdog_timer);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment