ixgbe: Fix 1G link WoL
authorDon Skidmore <donald.c.skidmore@intel.com>
Thu, 28 Feb 2013 08:08:44 +0000 (08:08 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 18 Apr 2013 05:15:14 +0000 (22:15 -0700)
We reset during the shutdown path which will reset AUTOC register.  This
would change LMS to 10G.  If we were currently linked at 1G we will lose
link, which is a bad thing if we wanted WoL to work.  For the fix I needed
to know if WoL is supported so I created a new bool in the ixgbe_hw struct.
If this is set we will not allow the reset to change the current LMS value
in AUTOC.

Signed-off-by: Don Skidmore <donald.c.skidmore@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_82599.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h

index b6289f11b7643585410fe6d94a9b569a7519c4e4..7946da94b2286a1baba9daf19c84ffe70f07e756 100644 (file)
@@ -1051,8 +1051,11 @@ mac_reset_top:
                /* If MNG FW is running on a multi-speed device that
                 * doesn't autoneg with out driver support we need to
                 * leave LMS in the state it was before we MAC reset.
+                * Likewise if we support WoL we don't want change the
+                * LMS state either.
                 */
-               if (hw->phy.multispeed_fiber && hw->mng_fw_enabled)
+               if ((hw->phy.multispeed_fiber && hw->mng_fw_enabled) ||
+                   hw->wol_supported)
                        hw->mac.orig_autoc =
                                (hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) |
                                curr_lms;
index ac6e464382e4de37e8ff23921c89186366758e3c..25c0e354f4ae7a9f894943ff9b15048b9698c30c 100644 (file)
@@ -7526,7 +7526,9 @@ skip_sriov:
        /* WOL not supported for all devices */
        adapter->wol = 0;
        hw->eeprom.ops.read(hw, 0x2c, &adapter->eeprom_cap);
-       if (ixgbe_wol_supported(adapter, pdev->device, pdev->subsystem_device))
+       hw->wol_supported = ixgbe_wol_supported(adapter, pdev->device,
+                                               pdev->subsystem_device);
+       if (hw->wol_supported)
                adapter->wol = IXGBE_WUFC_MAG;
 
        device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
index 200b1a885ec590706451cf9264ddcb0763bfbd7a..155a793705be50979f24ba5c871c2fcf0cb8a5ae 100644 (file)
@@ -2998,6 +2998,7 @@ struct ixgbe_hw {
        bool                            force_full_reset;
        bool                            allow_unsupported_sfp;
        bool                            mng_fw_enabled;
+       bool                            wol_supported;
 };
 
 struct ixgbe_info {