ixgbe: ethtool ixgbe_diag_test cleanup
authorJacob Keller <jacob.e.keller@intel.com>
Thu, 8 Nov 2012 07:07:08 +0000 (07:07 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 23 Jan 2013 22:32:31 +0000 (14:32 -0800)
This patch cleans up the ethtool diagnostics test by ensuring that the tests
work properly regardless of what state the adapter was in. The SRIOV VF check is
done at the beginning, forgoing the link test. The if_running -> dev_close is
moved before the link test, as well as a call to enable the Tx laser. This
ensures that the link test will return valid results even when adapter was
previously down. Also, a call to disable the Tx laser is added if the device
was down before the start. This ensures consistent behavior of the Tx laser
before and after the diagnostic checks. The end result is consistent behavior
regardless of device state.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c

index 32685842434565e609a5f8589b67497609074aa4..21bc72e99c2e12d7383623b4eea7d5a81ee0c232 100644 (file)
@@ -1837,19 +1837,11 @@ static void ixgbe_diag_test(struct net_device *netdev,
                             struct ethtool_test *eth_test, u64 *data)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
+       struct ixgbe_hw *hw = &adapter->hw;
        bool if_running = netif_running(netdev);
 
        set_bit(__IXGBE_TESTING, &adapter->state);
        if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
-               /* Offline tests */
-
-               e_info(hw, "offline testing starting\n");
-
-               /* Link test performed before hardware reset so autoneg doesn't
-                * interfere with test result */
-               if (ixgbe_link_test(adapter, &data[4]))
-                       eth_test->flags |= ETH_TEST_FL_FAILED;
-
                if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
                        int i;
                        for (i = 0; i < adapter->num_vfs; i++) {
@@ -1870,12 +1862,24 @@ static void ixgbe_diag_test(struct net_device *netdev,
                        }
                }
 
+               /* Offline tests */
+               e_info(hw, "offline testing starting\n");
+
                if (if_running)
                        /* indicate we're in test mode */
                        dev_close(netdev);
-               else
-                       ixgbe_reset(adapter);
 
+               /* bringing adapter down disables SFP+ optics */
+               if (hw->mac.ops.enable_tx_laser)
+                       hw->mac.ops.enable_tx_laser(hw);
+
+               /* Link test performed before hardware reset so autoneg doesn't
+                * interfere with test result
+                */
+               if (ixgbe_link_test(adapter, &data[4]))
+                       eth_test->flags |= ETH_TEST_FL_FAILED;
+
+               ixgbe_reset(adapter);
                e_info(hw, "register testing starting\n");
                if (ixgbe_reg_test(adapter, &data[0]))
                        eth_test->flags |= ETH_TEST_FL_FAILED;
@@ -1908,16 +1912,22 @@ static void ixgbe_diag_test(struct net_device *netdev,
 skip_loopback:
                ixgbe_reset(adapter);
 
+               /* clear testing bit and return adapter to previous state */
                clear_bit(__IXGBE_TESTING, &adapter->state);
                if (if_running)
                        dev_open(netdev);
        } else {
                e_info(hw, "online testing starting\n");
+
+               /* if adapter is down, SFP+ optics will be disabled */
+               if (!if_running && hw->mac.ops.enable_tx_laser)
+                       hw->mac.ops.enable_tx_laser(hw);
+
                /* Online tests */
                if (ixgbe_link_test(adapter, &data[4]))
                        eth_test->flags |= ETH_TEST_FL_FAILED;
 
-               /* Online tests aren't run; pass by default */
+               /* Offline tests aren't run; pass by default */
                data[0] = 0;
                data[1] = 0;
                data[2] = 0;
@@ -1925,6 +1935,10 @@ skip_loopback:
 
                clear_bit(__IXGBE_TESTING, &adapter->state);
        }
+
+       /* if adapter was down, ensure SFP+ optics are disabled again */
+       if (!if_running && hw->mac.ops.disable_tx_laser)
+               hw->mac.ops.disable_tx_laser(hw);
 skip_ol_tests:
        msleep_interruptible(4 * 1000);
 }