Commit d85ea93f authored by David S. Miller's avatar David S. Miller

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next

Jeff Kirsher says:

====================
Intel Wired LAN Driver Updates

This series contains updates to e1000e, ixgbevf and igb.

Majority of this series contains fixes and cleanups to e1000e,
most notably are:

Todd provides a fix to PTP in e1000e which adds a lock in e1000e_phc_adjfreq
to prevent concurrent changes to TIMINCA and SYSTIMH/L.  Then provides an
igb fix to use ARRAY_SIZE for array size calculation.

David provides the remaining e1000e which contain:
 - cleanup of pointer references that are no longer used
 - fix an issue on systems with Management Engine enabled with the
   ethernet cable unplugged
 - fix an issue on 82579 where enabling EEE LPI sooner than one second
   after link up causes link issues on some switches
 - refactor the power management flows to prevent the suspend path from
   being executed twice when hibernating
 - refactor the runtime power management to fix interfering with the
   functionality of Energy Efficient Ethernet when enabled and to fix
   the device from repeatedly flip between suspend and resume with the
   interface administratively downed
 - enable the feature PHY Ultra Low Power Mode which is a power saving
   feature that reduces the power consumption of the PHY when a cable is
   not connected
 - fix the ethtool offline tests for 82579 parts
 - fix SHRA register access for 82579 parts which was introduced by
   previous commit c3a0dce3 "e1000e: fix overrun of PHY RAR array"

Florian provides a fix for ixgbevf where skb->pkt_type was being checked
like a bitmask, but it is not a bitmask.

Fix an issue reported by Stephen Hemminger where there was a warning
about code defined but never used if IGB_HWMON is not defined.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 37147652 9b143d11
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* 80003ES2LAN Gigabit Ethernet Controller (Copper) /* 80003ES2LAN Gigabit Ethernet Controller (Copper)
* 80003ES2LAN Gigabit Ethernet Controller (Serdes) * 80003ES2LAN Gigabit Ethernet Controller (Serdes)
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_80003ES2LAN_H_ #ifndef _E1000E_80003ES2LAN_H_
#define _E1000E_80003ES2LAN_H_ #define _E1000E_80003ES2LAN_H_
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* 82571EB Gigabit Ethernet Controller /* 82571EB Gigabit Ethernet Controller
* 82571EB Gigabit Ethernet Controller (Copper) * 82571EB Gigabit Ethernet Controller (Copper)
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_82571_H_ #ifndef _E1000E_82571_H_
#define _E1000E_82571_H_ #define _E1000E_82571_H_
......
################################################################################ ################################################################################
# #
# Intel PRO/1000 Linux driver # Intel PRO/1000 Linux driver
# Copyright(c) 1999 - 2013 Intel Corporation. # Copyright(c) 1999 - 2014 Intel Corporation.
# #
# This program is free software; you can redistribute it and/or modify it # This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License, # under the terms and conditions of the GNU General Public License,
...@@ -12,9 +12,8 @@ ...@@ -12,9 +12,8 @@
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details. # more details.
# #
# You should have received a copy of the GNU General Public License along with # You should have received a copy of the GNU General Public License
# this program; if not, write to the Free Software Foundation, Inc., # along with this program; if not, see <http://www.gnu.org/licenses/>.
# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
# #
# The full GNU General Public License is included in this distribution in # The full GNU General Public License is included in this distribution in
# the file called "COPYING". # the file called "COPYING".
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000_DEFINES_H_ #ifndef _E1000_DEFINES_H_
#define _E1000_DEFINES_H_ #define _E1000_DEFINES_H_
...@@ -37,6 +30,8 @@ ...@@ -37,6 +30,8 @@
/* Wake Up Control */ /* Wake Up Control */
#define E1000_WUC_APME 0x00000001 /* APM Enable */ #define E1000_WUC_APME 0x00000001 /* APM Enable */
#define E1000_WUC_PME_EN 0x00000002 /* PME Enable */ #define E1000_WUC_PME_EN 0x00000002 /* PME Enable */
#define E1000_WUC_PME_STATUS 0x00000004 /* PME Status */
#define E1000_WUC_APMPME 0x00000008 /* Assert PME on APM Wakeup */
#define E1000_WUC_PHY_WAKE 0x00000100 /* if PHY supports wakeup */ #define E1000_WUC_PHY_WAKE 0x00000100 /* if PHY supports wakeup */
/* Wake Up Filter Control */ /* Wake Up Filter Control */
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* Linux PRO/1000 Ethernet Driver main header file */ /* Linux PRO/1000 Ethernet Driver main header file */
...@@ -333,7 +326,6 @@ struct e1000_adapter { ...@@ -333,7 +326,6 @@ struct e1000_adapter {
struct work_struct update_phy_task; struct work_struct update_phy_task;
struct work_struct print_hang_task; struct work_struct print_hang_task;
bool idle_check;
int phy_hang_count; int phy_hang_count;
u16 tx_ring_count; u16 tx_ring_count;
...@@ -476,7 +468,7 @@ void e1000e_check_options(struct e1000_adapter *adapter); ...@@ -476,7 +468,7 @@ void e1000e_check_options(struct e1000_adapter *adapter);
void e1000e_set_ethtool_ops(struct net_device *netdev); void e1000e_set_ethtool_ops(struct net_device *netdev);
int e1000e_up(struct e1000_adapter *adapter); int e1000e_up(struct e1000_adapter *adapter);
void e1000e_down(struct e1000_adapter *adapter); void e1000e_down(struct e1000_adapter *adapter, bool reset);
void e1000e_reinit_locked(struct e1000_adapter *adapter); void e1000e_reinit_locked(struct e1000_adapter *adapter);
void e1000e_reset(struct e1000_adapter *adapter); void e1000e_reset(struct e1000_adapter *adapter);
void e1000e_power_up_phy(struct e1000_adapter *adapter); void e1000e_power_up_phy(struct e1000_adapter *adapter);
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* ethtool support for e1000 */ /* ethtool support for e1000 */
...@@ -332,7 +325,7 @@ static int e1000_set_settings(struct net_device *netdev, ...@@ -332,7 +325,7 @@ static int e1000_set_settings(struct net_device *netdev,
/* reset the link */ /* reset the link */
if (netif_running(adapter->netdev)) { if (netif_running(adapter->netdev)) {
e1000e_down(adapter); e1000e_down(adapter, true);
e1000e_up(adapter); e1000e_up(adapter);
} else { } else {
e1000e_reset(adapter); e1000e_reset(adapter);
...@@ -380,7 +373,7 @@ static int e1000_set_pauseparam(struct net_device *netdev, ...@@ -380,7 +373,7 @@ static int e1000_set_pauseparam(struct net_device *netdev,
if (adapter->fc_autoneg == AUTONEG_ENABLE) { if (adapter->fc_autoneg == AUTONEG_ENABLE) {
hw->fc.requested_mode = e1000_fc_default; hw->fc.requested_mode = e1000_fc_default;
if (netif_running(adapter->netdev)) { if (netif_running(adapter->netdev)) {
e1000e_down(adapter); e1000e_down(adapter, true);
e1000e_up(adapter); e1000e_up(adapter);
} else { } else {
e1000e_reset(adapter); e1000e_reset(adapter);
...@@ -726,7 +719,7 @@ static int e1000_set_ringparam(struct net_device *netdev, ...@@ -726,7 +719,7 @@ static int e1000_set_ringparam(struct net_device *netdev,
pm_runtime_get_sync(netdev->dev.parent); pm_runtime_get_sync(netdev->dev.parent);
e1000e_down(adapter); e1000e_down(adapter, true);
/* We can't just free everything and then setup again, because the /* We can't just free everything and then setup again, because the
* ISRs in MSI-X mode get passed pointers to the Tx and Rx ring * ISRs in MSI-X mode get passed pointers to the Tx and Rx ring
...@@ -924,15 +917,21 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) ...@@ -924,15 +917,21 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)
} }
if (mac->type == e1000_pch2lan) { if (mac->type == e1000_pch2lan) {
/* SHRAH[0,1,2] different than previous */ /* SHRAH[0,1,2] different than previous */
if (i == 7) if (i == 1)
mask &= 0xFFF4FFFF; mask &= 0xFFF4FFFF;
/* SHRAH[3] different than SHRAH[0,1,2] */ /* SHRAH[3] different than SHRAH[0,1,2] */
if (i == 10) if (i == 4)
mask |= (1 << 30); mask |= (1 << 30);
/* RAR[1-6] owned by management engine - skipping */
if (i > 0)
i += 6;
} }
REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1), mask, REG_PATTERN_TEST_ARRAY(E1000_RA, ((i << 1) + 1), mask,
0xFFFFFFFF); 0xFFFFFFFF);
/* reset index to actual value */
if ((mac->type == e1000_pch2lan) && (i > 6))
i -= 6;
} }
for (i = 0; i < mac->mta_reg_count; i++) for (i = 0; i < mac->mta_reg_count; i++)
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000_HW_H_ #ifndef _E1000_HW_H_
#define _E1000_HW_H_ #define _E1000_HW_H_
...@@ -655,12 +648,20 @@ struct e1000_shadow_ram { ...@@ -655,12 +648,20 @@ struct e1000_shadow_ram {
#define E1000_ICH8_SHADOW_RAM_WORDS 2048 #define E1000_ICH8_SHADOW_RAM_WORDS 2048
/* I218 PHY Ultra Low Power (ULP) states */
enum e1000_ulp_state {
e1000_ulp_state_unknown,
e1000_ulp_state_off,
e1000_ulp_state_on,
};
struct e1000_dev_spec_ich8lan { struct e1000_dev_spec_ich8lan {
bool kmrn_lock_loss_workaround_enabled; bool kmrn_lock_loss_workaround_enabled;
struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];
bool nvm_k1_enabled; bool nvm_k1_enabled;
bool eee_disable; bool eee_disable;
u16 eee_lp_ability; u16 eee_lp_ability;
enum e1000_ulp_state ulp_state;
}; };
struct e1000_hw { struct e1000_hw {
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* 82562G 10/100 Network Connection /* 82562G 10/100 Network Connection
* 82562G-2 10/100 Network Connection * 82562G-2 10/100 Network Connection
...@@ -53,6 +46,14 @@ ...@@ -53,6 +46,14 @@
* 82578DC Gigabit Network Connection * 82578DC Gigabit Network Connection
* 82579LM Gigabit Network Connection * 82579LM Gigabit Network Connection
* 82579V Gigabit Network Connection * 82579V Gigabit Network Connection
* Ethernet Connection I217-LM
* Ethernet Connection I217-V
* Ethernet Connection I218-V
* Ethernet Connection I218-LM
* Ethernet Connection (2) I218-LM
* Ethernet Connection (2) I218-V
* Ethernet Connection (3) I218-LM
* Ethernet Connection (3) I218-V
*/ */
#include "e1000.h" #include "e1000.h"
...@@ -142,7 +143,9 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index); ...@@ -142,7 +143,9 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index);
static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index); static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index);
static s32 e1000_k1_workaround_lv(struct e1000_hw *hw); static s32 e1000_k1_workaround_lv(struct e1000_hw *hw);
static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate); static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate);
static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force);
static s32 e1000_setup_copper_link_pch_lpt(struct e1000_hw *hw); static s32 e1000_setup_copper_link_pch_lpt(struct e1000_hw *hw);
static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state);
static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg)
{ {
...@@ -238,6 +241,47 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw) ...@@ -238,6 +241,47 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)
return true; return true;
} }
/**
* e1000_toggle_lanphypc_pch_lpt - toggle the LANPHYPC pin value
* @hw: pointer to the HW structure
*
* Toggling the LANPHYPC pin value fully power-cycles the PHY and is
* used to reset the PHY to a quiescent state when necessary.
**/
static void e1000_toggle_lanphypc_pch_lpt(struct e1000_hw *hw)
{
u32 mac_reg;
/* Set Phy Config Counter to 50msec */
mac_reg = er32(FEXTNVM3);
mac_reg &= ~E1000_FEXTNVM3_PHY_CFG_COUNTER_MASK;
mac_reg |= E1000_FEXTNVM3_PHY_CFG_COUNTER_50MSEC;
ew32(FEXTNVM3, mac_reg);
/* Toggle LANPHYPC Value bit */
mac_reg = er32(CTRL);
mac_reg |= E1000_CTRL_LANPHYPC_OVERRIDE;
mac_reg &= ~E1000_CTRL_LANPHYPC_VALUE;
ew32(CTRL, mac_reg);
e1e_flush();
usleep_range(10, 20);
mac_reg &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
ew32(CTRL, mac_reg);
e1e_flush();
if (hw->mac.type < e1000_pch_lpt) {
msleep(50);
} else {
u16 count = 20;
do {
usleep_range(5000, 10000);
} while (!(er32(CTRL_EXT) & E1000_CTRL_EXT_LPCD) && count--);
msleep(30);
}
}
/** /**
* e1000_init_phy_workarounds_pchlan - PHY initialization workarounds * e1000_init_phy_workarounds_pchlan - PHY initialization workarounds
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
...@@ -247,6 +291,7 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw) ...@@ -247,6 +291,7 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)
**/ **/
static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw) static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
{ {
struct e1000_adapter *adapter = hw->adapter;
u32 mac_reg, fwsm = er32(FWSM); u32 mac_reg, fwsm = er32(FWSM);
s32 ret_val; s32 ret_val;
...@@ -255,6 +300,12 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw) ...@@ -255,6 +300,12 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
*/ */
e1000_gate_hw_phy_config_ich8lan(hw, true); e1000_gate_hw_phy_config_ich8lan(hw, true);
/* It is not possible to be certain of the current state of ULP
* so forcibly disable it.
*/
hw->dev_spec.ich8lan.ulp_state = e1000_ulp_state_unknown;
e1000_disable_ulp_lpt_lp(hw, true);
ret_val = hw->phy.ops.acquire(hw); ret_val = hw->phy.ops.acquire(hw);
if (ret_val) { if (ret_val) {
e_dbg("Failed to initialize PHY flow\n"); e_dbg("Failed to initialize PHY flow\n");
...@@ -300,33 +351,9 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw) ...@@ -300,33 +351,9 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
break; break;
} }
e_dbg("Toggling LANPHYPC\n");
/* Set Phy Config Counter to 50msec */
mac_reg = er32(FEXTNVM3);
mac_reg &= ~E1000_FEXTNVM3_PHY_CFG_COUNTER_MASK;
mac_reg |= E1000_FEXTNVM3_PHY_CFG_COUNTER_50MSEC;
ew32(FEXTNVM3, mac_reg);
/* Toggle LANPHYPC Value bit */ /* Toggle LANPHYPC Value bit */
mac_reg = er32(CTRL); e1000_toggle_lanphypc_pch_lpt(hw);
mac_reg |= E1000_CTRL_LANPHYPC_OVERRIDE; if (hw->mac.type >= e1000_pch_lpt) {
mac_reg &= ~E1000_CTRL_LANPHYPC_VALUE;
ew32(CTRL, mac_reg);
e1e_flush();
usleep_range(10, 20);
mac_reg &= ~E1000_CTRL_LANPHYPC_OVERRIDE;
ew32(CTRL, mac_reg);
e1e_flush();
if (hw->mac.type < e1000_pch_lpt) {
msleep(50);
} else {
u16 count = 20;
do {
usleep_range(5000, 10000);
} while (!(er32(CTRL_EXT) &
E1000_CTRL_EXT_LPCD) && count--);
usleep_range(30000, 60000);
if (e1000_phy_is_accessible_pchlan(hw)) if (e1000_phy_is_accessible_pchlan(hw))
break; break;
...@@ -349,12 +376,31 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw) ...@@ -349,12 +376,31 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
hw->phy.ops.release(hw); hw->phy.ops.release(hw);
if (!ret_val) { if (!ret_val) {
/* Check to see if able to reset PHY. Print error if not */
if (hw->phy.ops.check_reset_block(hw)) {
e_err("Reset blocked by ME\n");
goto out;
}
/* Reset the PHY before any access to it. Doing so, ensures /* Reset the PHY before any access to it. Doing so, ensures
* that the PHY is in a known good state before we read/write * that the PHY is in a known good state before we read/write
* PHY registers. The generic reset is sufficient here, * PHY registers. The generic reset is sufficient here,
* because we haven't determined the PHY type yet. * because we haven't determined the PHY type yet.
*/ */
ret_val = e1000e_phy_hw_reset_generic(hw); ret_val = e1000e_phy_hw_reset_generic(hw);
if (ret_val)
goto out;
/* On a successful reset, possibly need to wait for the PHY
* to quiesce to an accessible state before returning control
* to the calling function. If the PHY does not quiesce, then
* return E1000E_BLK_PHY_RESET, as this is the condition that
* the PHY is in.
*/
ret_val = hw->phy.ops.check_reset_block(hw);
if (ret_val)
e_err("ME blocked access to PHY after reset\n");
} }
out: out:
...@@ -724,8 +770,14 @@ s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data) ...@@ -724,8 +770,14 @@ s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data)
* Enable/disable EEE based on setting in dev_spec structure, the duplex of * Enable/disable EEE based on setting in dev_spec structure, the duplex of
* the link and the EEE capabilities of the link partner. The LPI Control * the link and the EEE capabilities of the link partner. The LPI Control
* register bits will remain set only if/when link is up. * register bits will remain set only if/when link is up.
*
* EEE LPI must not be asserted earlier than one second after link is up.
* On 82579, EEE LPI should not be enabled until such time otherwise there
* can be link issues with some switches. Other devices can have EEE LPI
* enabled immediately upon link up since they have a timer in hardware which
* prevents LPI from being asserted too early.
**/ **/
static s32 e1000_set_eee_pchlan(struct e1000_hw *hw) s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
{ {
struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
s32 ret_val; s32 ret_val;
...@@ -978,6 +1030,253 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link) ...@@ -978,6 +1030,253 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)
return 0; return 0;
} }
/**
* e1000_enable_ulp_lpt_lp - configure Ultra Low Power mode for LynxPoint-LP
* @hw: pointer to the HW structure
* @to_sx: boolean indicating a system power state transition to Sx
*
* When link is down, configure ULP mode to significantly reduce the power
* to the PHY. If on a Manageability Engine (ME) enabled system, tell the
* ME firmware to start the ULP configuration. If not on an ME enabled
* system, configure the ULP mode by software.
*/
s32 e1000_enable_ulp_lpt_lp(struct e1000_hw *hw, bool to_sx)
{
u32 mac_reg;
s32 ret_val = 0;
u16 phy_reg;
if ((hw->mac.type < e1000_pch_lpt) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_LPT_I217_LM) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_LPT_I217_V) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_I218_LM2) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_I218_V2) ||
(hw->dev_spec.ich8lan.ulp_state == e1000_ulp_state_on))
return 0;
if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) {
/* Request ME configure ULP mode in the PHY */
mac_reg = er32(H2ME);
mac_reg |= E1000_H2ME_ULP | E1000_H2ME_ENFORCE_SETTINGS;
ew32(H2ME, mac_reg);
goto out;
}
if (!to_sx) {
int i = 0;
/* Poll up to 5 seconds for Cable Disconnected indication */
while (!(er32(FEXT) & E1000_FEXT_PHY_CABLE_DISCONNECTED)) {
/* Bail if link is re-acquired */
if (er32(STATUS) & E1000_STATUS_LU)
return -E1000_ERR_PHY;
if (i++ == 100)
break;
msleep(50);
}
e_dbg("CABLE_DISCONNECTED %s set after %dmsec\n",
(er32(FEXT) &
E1000_FEXT_PHY_CABLE_DISCONNECTED) ? "" : "not", i * 50);
}
ret_val = hw->phy.ops.acquire(hw);
if (ret_val)
goto out;
/* Force SMBus mode in PHY */
ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL, &phy_reg);
if (ret_val)
goto release;
phy_reg |= CV_SMB_CTRL_FORCE_SMBUS;
e1000_write_phy_reg_hv_locked(hw, CV_SMB_CTRL, phy_reg);
/* Force SMBus mode in MAC */
mac_reg = er32(CTRL_EXT);
mac_reg |= E1000_CTRL_EXT_FORCE_SMBUS;
ew32(CTRL_EXT, mac_reg);
/* Set Inband ULP Exit, Reset to SMBus mode and
* Disable SMBus Release on PERST# in PHY
*/
ret_val = e1000_read_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, &phy_reg);
if (ret_val)
goto release;
phy_reg |= (I218_ULP_CONFIG1_RESET_TO_SMBUS |
I218_ULP_CONFIG1_DISABLE_SMB_PERST);
if (to_sx) {
if (er32(WUFC) & E1000_WUFC_LNKC)
phy_reg |= I218_ULP_CONFIG1_WOL_HOST;
phy_reg |= I218_ULP_CONFIG1_STICKY_ULP;
} else {
phy_reg |= I218_ULP_CONFIG1_INBAND_EXIT;
}
e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
/* Set Disable SMBus Release on PERST# in MAC */
mac_reg = er32(FEXTNVM7);
mac_reg |= E1000_FEXTNVM7_DISABLE_SMB_PERST;
ew32(FEXTNVM7, mac_reg);
/* Commit ULP changes in PHY by starting auto ULP configuration */
phy_reg |= I218_ULP_CONFIG1_START;
e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
release:
hw->phy.ops.release(hw);
out:
if (ret_val)
e_dbg("Error in ULP enable flow: %d\n", ret_val);
else
hw->dev_spec.ich8lan.ulp_state = e1000_ulp_state_on;
return ret_val;
}
/**
* e1000_disable_ulp_lpt_lp - unconfigure Ultra Low Power mode for LynxPoint-LP
* @hw: pointer to the HW structure
* @force: boolean indicating whether or not to force disabling ULP
*
* Un-configure ULP mode when link is up, the system is transitioned from
* Sx or the driver is unloaded. If on a Manageability Engine (ME) enabled
* system, poll for an indication from ME that ULP has been un-configured.
* If not on an ME enabled system, un-configure the ULP mode by software.
*
* During nominal operation, this function is called when link is acquired
* to disable ULP mode (force=false); otherwise, for example when unloading
* the driver or during Sx->S0 transitions, this is called with force=true
* to forcibly disable ULP.
*/
static s32 e1000_disable_ulp_lpt_lp(struct e1000_hw *hw, bool force)
{
s32 ret_val = 0;
u32 mac_reg;
u16 phy_reg;
int i = 0;
if ((hw->mac.type < e1000_pch_lpt) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_LPT_I217_LM) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_LPT_I217_V) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_I218_LM2) ||
(hw->adapter->pdev->device == E1000_DEV_ID_PCH_I218_V2) ||
(hw->dev_spec.ich8lan.ulp_state == e1000_ulp_state_off))
return 0;
if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) {
if (force) {
/* Request ME un-configure ULP mode in the PHY */
mac_reg = er32(H2ME);
mac_reg &= ~E1000_H2ME_ULP;
mac_reg |= E1000_H2ME_ENFORCE_SETTINGS;
ew32(H2ME, mac_reg);
}
/* Poll up to 100msec for ME to clear ULP_CFG_DONE */
while (er32(FWSM) & E1000_FWSM_ULP_CFG_DONE) {
if (i++ == 10) {
ret_val = -E1000_ERR_PHY;
goto out;
}
usleep_range(10000, 20000);
}
e_dbg("ULP_CONFIG_DONE cleared after %dmsec\n", i * 10);
if (force) {
mac_reg = er32(H2ME);
mac_reg &= ~E1000_H2ME_ENFORCE_SETTINGS;
ew32(H2ME, mac_reg);
} else {
/* Clear H2ME.ULP after ME ULP configuration */
mac_reg = er32(H2ME);
mac_reg &= ~E1000_H2ME_ULP;
ew32(H2ME, mac_reg);
}
goto out;
}
ret_val = hw->phy.ops.acquire(hw);
if (ret_val)
goto out;
if (force)
/* Toggle LANPHYPC Value bit */
e1000_toggle_lanphypc_pch_lpt(hw);
/* Unforce SMBus mode in PHY */
ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL, &phy_reg);
if (ret_val) {
/* The MAC might be in PCIe mode, so temporarily force to
* SMBus mode in order to access the PHY.
*/
mac_reg = er32(CTRL_EXT);
mac_reg |= E1000_CTRL_EXT_FORCE_SMBUS;
ew32(CTRL_EXT, mac_reg);
msleep(50);
ret_val = e1000_read_phy_reg_hv_locked(hw, CV_SMB_CTRL,
&phy_reg);
if (ret_val)
goto release;
}
phy_reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
e1000_write_phy_reg_hv_locked(hw, CV_SMB_CTRL, phy_reg);
/* Unforce SMBus mode in MAC */
mac_reg = er32(CTRL_EXT);
mac_reg &= ~E1000_CTRL_EXT_FORCE_SMBUS;
ew32(CTRL_EXT, mac_reg);
/* When ULP mode was previously entered, K1 was disabled by the
* hardware. Re-Enable K1 in the PHY when exiting ULP.
*/
ret_val = e1000_read_phy_reg_hv_locked(hw, HV_PM_CTRL, &phy_reg);
if (ret_val)
goto release;
phy_reg |= HV_PM_CTRL_K1_ENABLE;
e1000_write_phy_reg_hv_locked(hw, HV_PM_CTRL, phy_reg);
/* Clear ULP enabled configuration */
ret_val = e1000_read_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, &phy_reg);
if (ret_val)
goto release;
phy_reg &= ~(I218_ULP_CONFIG1_IND |
I218_ULP_CONFIG1_STICKY_ULP |
I218_ULP_CONFIG1_RESET_TO_SMBUS |
I218_ULP_CONFIG1_WOL_HOST |
I218_ULP_CONFIG1_INBAND_EXIT |
I218_ULP_CONFIG1_DISABLE_SMB_PERST);
e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
/* Commit ULP changes by starting auto ULP configuration */
phy_reg |= I218_ULP_CONFIG1_START;
e1000_write_phy_reg_hv_locked(hw, I218_ULP_CONFIG1, phy_reg);
/* Clear Disable SMBus Release on PERST# in MAC */
mac_reg = er32(FEXTNVM7);
mac_reg &= ~E1000_FEXTNVM7_DISABLE_SMB_PERST;
ew32(FEXTNVM7, mac_reg);
release:
hw->phy.ops.release(hw);
if (force) {
e1000_phy_hw_reset(hw);
msleep(50);
}
out:
if (ret_val)
e_dbg("Error in ULP disable flow: %d\n", ret_val);
else
hw->dev_spec.ich8lan.ulp_state = e1000_ulp_state_off;
return ret_val;
}
/** /**
* e1000_check_for_copper_link_ich8lan - Check for link (Copper) * e1000_check_for_copper_link_ich8lan - Check for link (Copper)
* @hw: pointer to the HW structure * @hw: pointer to the HW structure
...@@ -1106,9 +1405,11 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) ...@@ -1106,9 +1405,11 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
e1000e_check_downshift(hw); e1000e_check_downshift(hw);
/* Enable/Disable EEE after link up */ /* Enable/Disable EEE after link up */
if (hw->phy.type > e1000_phy_82579) {
ret_val = e1000_set_eee_pchlan(hw); ret_val = e1000_set_eee_pchlan(hw);
if (ret_val) if (ret_val)
return ret_val; return ret_val;
}
/* If we are forcing speed/duplex, then we simply return since /* If we are forcing speed/duplex, then we simply return since
* we have already determined whether we have link or not. * we have already determined whether we have link or not.
...@@ -1374,7 +1675,7 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index) ...@@ -1374,7 +1675,7 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)
/* RAR[1-6] are owned by manageability. Skip those and program the /* RAR[1-6] are owned by manageability. Skip those and program the
* next address into the SHRA register array. * next address into the SHRA register array.
*/ */
if (index < (u32)(hw->mac.rar_entry_count - 6)) { if (index < (u32)(hw->mac.rar_entry_count)) {
s32 ret_val; s32 ret_val;
ret_val = e1000_acquire_swflag_ich8lan(hw); ret_val = e1000_acquire_swflag_ich8lan(hw);
...@@ -1484,11 +1785,13 @@ static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index) ...@@ -1484,11 +1785,13 @@ static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)
**/ **/
static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw) static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw)
{ {
u32 fwsm; bool blocked = false;
int i = 0;
fwsm = er32(FWSM); while ((blocked = !(er32(FWSM) & E1000_ICH_FWSM_RSPCIPHY)) &&
(i++ < 10))
return (fwsm & E1000_ICH_FWSM_RSPCIPHY) ? 0 : E1000_BLK_PHY_RESET; usleep_range(10000, 20000);
return blocked ? E1000_BLK_PHY_RESET : 0;
} }
/** /**
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_ICH8LAN_H_ #ifndef _E1000E_ICH8LAN_H_
#define _E1000E_ICH8LAN_H_ #define _E1000E_ICH8LAN_H_
...@@ -65,11 +58,16 @@ ...@@ -65,11 +58,16 @@
#define E1000_FWSM_WLOCK_MAC_MASK 0x0380 #define E1000_FWSM_WLOCK_MAC_MASK 0x0380
#define E1000_FWSM_WLOCK_MAC_SHIFT 7 #define E1000_FWSM_WLOCK_MAC_SHIFT 7
#define E1000_FWSM_ULP_CFG_DONE 0x00000400 /* Low power cfg done */
/* Shared Receive Address Registers */ /* Shared Receive Address Registers */
#define E1000_SHRAL_PCH_LPT(_i) (0x05408 + ((_i) * 8)) #define E1000_SHRAL_PCH_LPT(_i) (0x05408 + ((_i) * 8))
#define E1000_SHRAH_PCH_LPT(_i) (0x0540C + ((_i) * 8)) #define E1000_SHRAH_PCH_LPT(_i) (0x0540C + ((_i) * 8))
#define E1000_H2ME 0x05B50 /* Host to ME */
#define E1000_H2ME_ULP 0x00000800 /* ULP Indication Bit */
#define E1000_H2ME_ENFORCE_SETTINGS 0x00001000 /* Enforce Settings */
#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \ #define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \
(ID_LED_OFF1_OFF2 << 8) | \ (ID_LED_OFF1_OFF2 << 8) | \
(ID_LED_OFF1_ON2 << 4) | \ (ID_LED_OFF1_ON2 << 4) | \
...@@ -82,6 +80,9 @@ ...@@ -82,6 +80,9 @@
#define E1000_ICH8_LAN_INIT_TIMEOUT 1500 #define E1000_ICH8_LAN_INIT_TIMEOUT 1500
/* FEXT register bit definition */
#define E1000_FEXT_PHY_CABLE_DISCONNECTED 0x00000004
#define E1000_FEXTNVM_SW_CONFIG 1 #define E1000_FEXTNVM_SW_CONFIG 1
#define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* different on ICH8M */ #define E1000_FEXTNVM_SW_CONFIG_ICH8M (1 << 27) /* different on ICH8M */
...@@ -95,10 +96,12 @@ ...@@ -95,10 +96,12 @@
#define E1000_FEXTNVM6_REQ_PLL_CLK 0x00000100 #define E1000_FEXTNVM6_REQ_PLL_CLK 0x00000100
#define E1000_FEXTNVM6_ENABLE_K1_ENTRY_CONDITION 0x00000200 #define E1000_FEXTNVM6_ENABLE_K1_ENTRY_CONDITION 0x00000200
#define E1000_FEXTNVM7_DISABLE_SMB_PERST 0x00000020
#define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL
#define E1000_ICH_RAR_ENTRIES 7 #define E1000_ICH_RAR_ENTRIES 7
#define E1000_PCH2_RAR_ENTRIES 11 /* RAR[0-6], SHRA[0-3] */ #define E1000_PCH2_RAR_ENTRIES 5 /* RAR[0], SHRA[0-3] */
#define E1000_PCH_LPT_RAR_ENTRIES 12 /* RAR[0], SHRA[0-10] */ #define E1000_PCH_LPT_RAR_ENTRIES 12 /* RAR[0], SHRA[0-10] */
#define PHY_PAGE_SHIFT 5 #define PHY_PAGE_SHIFT 5
...@@ -161,6 +164,16 @@ ...@@ -161,6 +164,16 @@
#define CV_SMB_CTRL PHY_REG(769, 23) #define CV_SMB_CTRL PHY_REG(769, 23)
#define CV_SMB_CTRL_FORCE_SMBUS 0x0001 #define CV_SMB_CTRL_FORCE_SMBUS 0x0001
/* I218 Ultra Low Power Configuration 1 Register */
#define I218_ULP_CONFIG1 PHY_REG(779, 16)
#define I218_ULP_CONFIG1_START 0x0001 /* Start auto ULP config */
#define I218_ULP_CONFIG1_IND 0x0004 /* Pwr up from ULP indication */
#define I218_ULP_CONFIG1_STICKY_ULP 0x0010 /* Set sticky ULP mode */
#define I218_ULP_CONFIG1_INBAND_EXIT 0x0020 /* Inband on ULP exit */
#define I218_ULP_CONFIG1_WOL_HOST 0x0040 /* WoL Host on ULP exit */
#define I218_ULP_CONFIG1_RESET_TO_SMBUS 0x0100 /* Reset to SMBus mode */
#define I218_ULP_CONFIG1_DISABLE_SMB_PERST 0x1000 /* Disable on PERST# */
/* SMBus Address Phy Register */ /* SMBus Address Phy Register */
#define HV_SMB_ADDR PHY_REG(768, 26) #define HV_SMB_ADDR PHY_REG(768, 26)
#define HV_SMB_ADDR_MASK 0x007F #define HV_SMB_ADDR_MASK 0x007F
...@@ -195,6 +208,7 @@ ...@@ -195,6 +208,7 @@
/* PHY Power Management Control */ /* PHY Power Management Control */
#define HV_PM_CTRL PHY_REG(770, 17) #define HV_PM_CTRL PHY_REG(770, 17)
#define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100 #define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100
#define HV_PM_CTRL_K1_ENABLE 0x4000
#define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in ms */ #define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in ms */
...@@ -268,4 +282,6 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw); ...@@ -268,4 +282,6 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw);
s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable); s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable);
s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data); s32 e1000_read_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 *data);
s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data); s32 e1000_write_emi_reg_locked(struct e1000_hw *hw, u16 addr, u16 data);
s32 e1000_set_eee_pchlan(struct e1000_hw *hw);
s32 e1000_enable_ulp_lpt_lp(struct e1000_hw *hw, bool to_sx);
#endif /* _E1000E_ICH8LAN_H_ */ #endif /* _E1000E_ICH8LAN_H_ */
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include "e1000.h" #include "e1000.h"
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_MAC_H_ #ifndef _E1000E_MAC_H_
#define _E1000E_MAC_H_ #define _E1000E_MAC_H_
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include "e1000.h" #include "e1000.h"
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_MANAGE_H_ #ifndef _E1000E_MANAGE_H_
#define _E1000E_MANAGE_H_ #define _E1000E_MANAGE_H_
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
...@@ -1701,7 +1694,7 @@ static void e1000_clean_rx_ring(struct e1000_ring *rx_ring) ...@@ -1701,7 +1694,7 @@ static void e1000_clean_rx_ring(struct e1000_ring *rx_ring)
adapter->flags2 &= ~FLAG2_IS_DISCARDING; adapter->flags2 &= ~FLAG2_IS_DISCARDING;
writel(0, rx_ring->head); writel(0, rx_ring->head);
if (rx_ring->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
e1000e_update_rdt_wa(rx_ring, 0); e1000e_update_rdt_wa(rx_ring, 0);
else else
writel(0, rx_ring->tail); writel(0, rx_ring->tail);
...@@ -2405,7 +2398,7 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring) ...@@ -2405,7 +2398,7 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)
tx_ring->next_to_clean = 0; tx_ring->next_to_clean = 0;
writel(0, tx_ring->head); writel(0, tx_ring->head);
if (tx_ring->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) if (adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA)
e1000e_update_tdt_wa(tx_ring, 0); e1000e_update_tdt_wa(tx_ring, 0);
else else
writel(0, tx_ring->tail); writel(0, tx_ring->tail);
...@@ -3334,6 +3327,9 @@ static void e1000e_set_rx_mode(struct net_device *netdev) ...@@ -3334,6 +3327,9 @@ static void e1000e_set_rx_mode(struct net_device *netdev)
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 rctl; u32 rctl;
if (pm_runtime_suspended(netdev->dev.parent))
return;
/* Check for Promiscuous and All Multicast modes */ /* Check for Promiscuous and All Multicast modes */
rctl = er32(RCTL); rctl = er32(RCTL);
...@@ -3694,10 +3690,6 @@ void e1000e_power_up_phy(struct e1000_adapter *adapter) ...@@ -3694,10 +3690,6 @@ void e1000e_power_up_phy(struct e1000_adapter *adapter)
*/ */
static void e1000_power_down_phy(struct e1000_adapter *adapter) static void e1000_power_down_phy(struct e1000_adapter *adapter)
{ {
/* WoL is enabled */
if (adapter->wol)
return;
if (adapter->hw.phy.ops.power_down) if (adapter->hw.phy.ops.power_down)
adapter->hw.phy.ops.power_down(&adapter->hw); adapter->hw.phy.ops.power_down(&adapter->hw);
} }
...@@ -3914,10 +3906,8 @@ void e1000e_reset(struct e1000_adapter *adapter) ...@@ -3914,10 +3906,8 @@ void e1000e_reset(struct e1000_adapter *adapter)
} }
if (!netif_running(adapter->netdev) && if (!netif_running(adapter->netdev) &&
!test_bit(__E1000_TESTING, &adapter->state)) { !test_bit(__E1000_TESTING, &adapter->state))
e1000_power_down_phy(adapter); e1000_power_down_phy(adapter);
return;
}
e1000_get_phy_info(hw); e1000_get_phy_info(hw);
...@@ -3984,7 +3974,12 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter) ...@@ -3984,7 +3974,12 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
static void e1000e_update_stats(struct e1000_adapter *adapter); static void e1000e_update_stats(struct e1000_adapter *adapter);
void e1000e_down(struct e1000_adapter *adapter) /**
* e1000e_down - quiesce the device and optionally reset the hardware
* @adapter: board private structure
* @reset: boolean flag to reset the hardware or not
*/
void e1000e_down(struct e1000_adapter *adapter, bool reset)
{ {
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
...@@ -4038,12 +4033,8 @@ void e1000e_down(struct e1000_adapter *adapter) ...@@ -4038,12 +4033,8 @@ void e1000e_down(struct e1000_adapter *adapter)
e1000_lv_jumbo_workaround_ich8lan(hw, false)) e1000_lv_jumbo_workaround_ich8lan(hw, false))
e_dbg("failed to disable jumbo frame workaround mode\n"); e_dbg("failed to disable jumbo frame workaround mode\n");
if (!pci_channel_offline(adapter->pdev)) if (reset && !pci_channel_offline(adapter->pdev))
e1000e_reset(adapter); e1000e_reset(adapter);
/* TODO: for power management, we could drop the link and
* pci_disable_device here.
*/
} }
void e1000e_reinit_locked(struct e1000_adapter *adapter) void e1000e_reinit_locked(struct e1000_adapter *adapter)
...@@ -4051,7 +4042,7 @@ void e1000e_reinit_locked(struct e1000_adapter *adapter) ...@@ -4051,7 +4042,7 @@ void e1000e_reinit_locked(struct e1000_adapter *adapter)
might_sleep(); might_sleep();
while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
usleep_range(1000, 2000); usleep_range(1000, 2000);
e1000e_down(adapter); e1000e_down(adapter, true);
e1000e_up(adapter); e1000e_up(adapter);
clear_bit(__E1000_RESETTING, &adapter->state); clear_bit(__E1000_RESETTING, &adapter->state);
} }
...@@ -4329,7 +4320,6 @@ static int e1000_open(struct net_device *netdev) ...@@ -4329,7 +4320,6 @@ static int e1000_open(struct net_device *netdev)
adapter->tx_hang_recheck = false; adapter->tx_hang_recheck = false;
netif_start_queue(netdev); netif_start_queue(netdev);
adapter->idle_check = true;
hw->mac.get_link_status = true; hw->mac.get_link_status = true;
pm_runtime_put(&pdev->dev); pm_runtime_put(&pdev->dev);
...@@ -4379,14 +4369,15 @@ static int e1000_close(struct net_device *netdev) ...@@ -4379,14 +4369,15 @@ static int e1000_close(struct net_device *netdev)
pm_runtime_get_sync(&pdev->dev); pm_runtime_get_sync(&pdev->dev);
if (!test_bit(__E1000_DOWN, &adapter->state)) { if (!test_bit(__E1000_DOWN, &adapter->state)) {
e1000e_down(adapter); e1000e_down(adapter, true);
e1000_free_irq(adapter); e1000_free_irq(adapter);
/* Link status message must follow this format */
pr_info("%s NIC Link is Down\n", adapter->netdev->name);
} }
napi_disable(&adapter->napi); napi_disable(&adapter->napi);
e1000_power_down_phy(adapter);
e1000e_free_tx_resources(adapter->tx_ring); e1000e_free_tx_resources(adapter->tx_ring);
e1000e_free_rx_resources(adapter->rx_ring); e1000e_free_rx_resources(adapter->rx_ring);
...@@ -4463,11 +4454,16 @@ static void e1000e_update_phy_task(struct work_struct *work) ...@@ -4463,11 +4454,16 @@ static void e1000e_update_phy_task(struct work_struct *work)
struct e1000_adapter *adapter = container_of(work, struct e1000_adapter *adapter = container_of(work,
struct e1000_adapter, struct e1000_adapter,
update_phy_task); update_phy_task);
struct e1000_hw *hw = &adapter->hw;
if (test_bit(__E1000_DOWN, &adapter->state)) if (test_bit(__E1000_DOWN, &adapter->state))
return; return;
e1000_get_phy_info(&adapter->hw); e1000_get_phy_info(hw);
/* Enable EEE on 82579 after link up */
if (hw->phy.type == e1000_phy_82579)
e1000_set_eee_pchlan(hw);
} }
/** /**
...@@ -5687,8 +5683,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -5687,8 +5683,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
adapter->max_frame_size = max_frame; adapter->max_frame_size = max_frame;
e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu); e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);
netdev->mtu = new_mtu; netdev->mtu = new_mtu;
pm_runtime_get_sync(netdev->dev.parent);
if (netif_running(netdev)) if (netif_running(netdev))
e1000e_down(adapter); e1000e_down(adapter, true);
/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
* means we reserve 2 more, this pushes us to allocate from the next * means we reserve 2 more, this pushes us to allocate from the next
...@@ -5714,6 +5713,8 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -5714,6 +5713,8 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
else else
e1000e_reset(adapter); e1000e_reset(adapter);
pm_runtime_put_sync(netdev->dev.parent);
clear_bit(__E1000_RESETTING, &adapter->state); clear_bit(__E1000_RESETTING, &adapter->state);
return 0; return 0;
...@@ -5855,7 +5856,7 @@ static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) ...@@ -5855,7 +5856,7 @@ static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc) static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u32 i, mac_reg; u32 i, mac_reg, wuc;
u16 phy_reg, wuc_enable; u16 phy_reg, wuc_enable;
int retval; int retval;
...@@ -5902,13 +5903,18 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc) ...@@ -5902,13 +5903,18 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
phy_reg |= BM_RCTL_RFCE; phy_reg |= BM_RCTL_RFCE;
hw->phy.ops.write_reg_page(&adapter->hw, BM_RCTL, phy_reg); hw->phy.ops.write_reg_page(&adapter->hw, BM_RCTL, phy_reg);
wuc = E1000_WUC_PME_EN;
if (wufc & (E1000_WUFC_MAG | E1000_WUFC_LNKC))
wuc |= E1000_WUC_APME;
/* enable PHY wakeup in MAC register */ /* enable PHY wakeup in MAC register */
ew32(WUFC, wufc); ew32(WUFC, wufc);
ew32(WUC, E1000_WUC_PHY_WAKE | E1000_WUC_PME_EN); ew32(WUC, (E1000_WUC_PHY_WAKE | E1000_WUC_APMPME |
E1000_WUC_PME_STATUS | wuc));
/* configure and enable PHY wakeup in PHY registers */ /* configure and enable PHY wakeup in PHY registers */
hw->phy.ops.write_reg_page(&adapter->hw, BM_WUFC, wufc); hw->phy.ops.write_reg_page(&adapter->hw, BM_WUFC, wufc);
hw->phy.ops.write_reg_page(&adapter->hw, BM_WUC, E1000_WUC_PME_EN); hw->phy.ops.write_reg_page(&adapter->hw, BM_WUC, wuc);
/* activate PHY wakeup */ /* activate PHY wakeup */
wuc_enable |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT; wuc_enable |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT;
...@@ -5921,15 +5927,10 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc) ...@@ -5921,15 +5927,10 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
return retval; return retval;
} }
static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) static int e1000e_pm_freeze(struct device *dev)
{ {
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev));
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
u32 ctrl, ctrl_ext, rctl, status;
/* Runtime suspend should only enable wakeup for link changes */
u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
int retval = 0;
netif_device_detach(netdev); netif_device_detach(netdev);
...@@ -5940,11 +5941,29 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) ...@@ -5940,11 +5941,29 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
usleep_range(10000, 20000); usleep_range(10000, 20000);
WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
e1000e_down(adapter);
/* Quiesce the device without resetting the hardware */
e1000e_down(adapter, false);
e1000_free_irq(adapter); e1000_free_irq(adapter);
} }
e1000e_reset_interrupt_capability(adapter); e1000e_reset_interrupt_capability(adapter);
/* Allow time for pending master requests to run */
e1000e_disable_pcie_master(&adapter->hw);
return 0;
}
static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
{
struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw;
u32 ctrl, ctrl_ext, rctl, status;
/* Runtime suspend should only enable wakeup for link changes */
u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
int retval = 0;
status = er32(STATUS); status = er32(STATUS);
if (status & E1000_STATUS_LU) if (status & E1000_STATUS_LU)
wufc &= ~E1000_WUFC_LNKC; wufc &= ~E1000_WUFC_LNKC;
...@@ -5975,12 +5994,12 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) ...@@ -5975,12 +5994,12 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
ew32(CTRL_EXT, ctrl_ext); ew32(CTRL_EXT, ctrl_ext);
} }
if (!runtime)
e1000e_power_up_phy(adapter);
if (adapter->flags & FLAG_IS_ICH) if (adapter->flags & FLAG_IS_ICH)
e1000_suspend_workarounds_ich8lan(&adapter->hw); e1000_suspend_workarounds_ich8lan(&adapter->hw);
/* Allow time for pending master requests to run */
e1000e_disable_pcie_master(&adapter->hw);
if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) { if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
/* enable wakeup by the PHY */ /* enable wakeup by the PHY */
retval = e1000_init_phy_wakeup(adapter, wufc); retval = e1000_init_phy_wakeup(adapter, wufc);
...@@ -5994,10 +6013,23 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) ...@@ -5994,10 +6013,23 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
} else { } else {
ew32(WUC, 0); ew32(WUC, 0);
ew32(WUFC, 0); ew32(WUFC, 0);
e1000_power_down_phy(adapter);
} }
if (adapter->hw.phy.type == e1000_phy_igp_3) if (adapter->hw.phy.type == e1000_phy_igp_3) {
e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw);
} else if (hw->mac.type == e1000_pch_lpt) {
if (!(wufc & (E1000_WUFC_EX | E1000_WUFC_MC | E1000_WUFC_BC)))
/* ULP does not support wake from unicast, multicast
* or broadcast.
*/
retval = e1000_enable_ulp_lpt_lp(hw, !runtime);
if (retval)
return retval;
}
/* Release control of h/w to f/w. If f/w is AMT enabled, this /* Release control of h/w to f/w. If f/w is AMT enabled, this
* would have already happened in close and is redundant. * would have already happened in close and is redundant.
...@@ -6105,18 +6137,12 @@ static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state) ...@@ -6105,18 +6137,12 @@ static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static bool e1000e_pm_ready(struct e1000_adapter *adapter)
{
return !!adapter->tx_ring->buffer_info;
}
static int __e1000_resume(struct pci_dev *pdev) static int __e1000_resume(struct pci_dev *pdev)
{ {
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
u16 aspm_disable_flag = 0; u16 aspm_disable_flag = 0;
u32 err;
if (adapter->flags2 & FLAG2_DISABLE_ASPM_L0S) if (adapter->flags2 & FLAG2_DISABLE_ASPM_L0S)
aspm_disable_flag = PCIE_LINK_STATE_L0S; aspm_disable_flag = PCIE_LINK_STATE_L0S;
...@@ -6127,13 +6153,6 @@ static int __e1000_resume(struct pci_dev *pdev) ...@@ -6127,13 +6153,6 @@ static int __e1000_resume(struct pci_dev *pdev)
pci_set_master(pdev); pci_set_master(pdev);
e1000e_set_interrupt_capability(adapter);
if (netif_running(netdev)) {
err = e1000_request_irq(adapter);
if (err)
return err;
}
if (hw->mac.type >= e1000_pch2lan) if (hw->mac.type >= e1000_pch2lan)
e1000_resume_workarounds_pchlan(&adapter->hw); e1000_resume_workarounds_pchlan(&adapter->hw);
...@@ -6172,11 +6191,6 @@ static int __e1000_resume(struct pci_dev *pdev) ...@@ -6172,11 +6191,6 @@ static int __e1000_resume(struct pci_dev *pdev)
e1000_init_manageability_pt(adapter); e1000_init_manageability_pt(adapter);
if (netif_running(netdev))
e1000e_up(adapter);
netif_device_attach(netdev);
/* If the controller has AMT, do not set DRV_LOAD until the interface /* If the controller has AMT, do not set DRV_LOAD until the interface
* is up. For all other cases, let the f/w know that the h/w is now * is up. For all other cases, let the f/w know that the h/w is now
* under the control of the driver. * under the control of the driver.
...@@ -6187,75 +6201,111 @@ static int __e1000_resume(struct pci_dev *pdev) ...@@ -6187,75 +6201,111 @@ static int __e1000_resume(struct pci_dev *pdev)
return 0; return 0;
} }
static int e1000e_pm_thaw(struct device *dev)
{
struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev));
struct e1000_adapter *adapter = netdev_priv(netdev);
e1000e_set_interrupt_capability(adapter);
if (netif_running(netdev)) {
u32 err = e1000_request_irq(adapter);
if (err)
return err;
e1000e_up(adapter);
}
netif_device_attach(netdev);
return 0;
}
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int e1000_suspend(struct device *dev) static int e1000e_pm_suspend(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
e1000e_pm_freeze(dev);
return __e1000_shutdown(pdev, false); return __e1000_shutdown(pdev, false);
} }
static int e1000_resume(struct device *dev) static int e1000e_pm_resume(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct net_device *netdev = pci_get_drvdata(pdev); int rc;
struct e1000_adapter *adapter = netdev_priv(netdev);
if (e1000e_pm_ready(adapter)) rc = __e1000_resume(pdev);
adapter->idle_check = true; if (rc)
return rc;
return __e1000_resume(pdev); return e1000e_pm_thaw(dev);
} }
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */
#ifdef CONFIG_PM_RUNTIME #ifdef CONFIG_PM_RUNTIME
static int e1000_runtime_suspend(struct device *dev) static int e1000e_pm_runtime_idle(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
if (!e1000e_pm_ready(adapter)) if (!e1000e_has_link(adapter))
return 0; pm_schedule_suspend(dev, 5 * MSEC_PER_SEC);
return __e1000_shutdown(pdev, true); return -EBUSY;
} }
static int e1000_idle(struct device *dev) static int e1000e_pm_runtime_resume(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
int rc;
if (!e1000e_pm_ready(adapter)) rc = __e1000_resume(pdev);
return 0; if (rc)
return rc;
if (adapter->idle_check) { if (netdev->flags & IFF_UP)
adapter->idle_check = false; rc = e1000e_up(adapter);
if (!e1000e_has_link(adapter))
pm_schedule_suspend(dev, MSEC_PER_SEC);
}
return -EBUSY; return rc;
} }
static int e1000_runtime_resume(struct device *dev) static int e1000e_pm_runtime_suspend(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct pci_dev *pdev = to_pci_dev(dev);
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
if (!e1000e_pm_ready(adapter)) if (netdev->flags & IFF_UP) {
return 0; int count = E1000_CHECK_RESET_COUNT;
while (test_bit(__E1000_RESETTING, &adapter->state) && count--)
usleep_range(10000, 20000);
WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
/* Down the device without resetting the hardware */
e1000e_down(adapter, false);
}
if (__e1000_shutdown(pdev, true)) {
e1000e_pm_runtime_resume(dev);
return -EBUSY;
}
adapter->idle_check = !dev->power.runtime_auto; return 0;
return __e1000_resume(pdev);
} }
#endif /* CONFIG_PM_RUNTIME */ #endif /* CONFIG_PM_RUNTIME */
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static void e1000_shutdown(struct pci_dev *pdev) static void e1000_shutdown(struct pci_dev *pdev)
{ {
e1000e_pm_freeze(&pdev->dev);
__e1000_shutdown(pdev, false); __e1000_shutdown(pdev, false);
} }
...@@ -6341,7 +6391,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, ...@@ -6341,7 +6391,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
return PCI_ERS_RESULT_DISCONNECT; return PCI_ERS_RESULT_DISCONNECT;
if (netif_running(netdev)) if (netif_running(netdev))
e1000e_down(adapter); e1000e_down(adapter, true);
pci_disable_device(pdev); pci_disable_device(pdev);
/* Request a slot slot reset. */ /* Request a slot slot reset. */
...@@ -6353,7 +6403,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev, ...@@ -6353,7 +6403,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
* @pdev: Pointer to PCI device * @pdev: Pointer to PCI device
* *
* Restart the card from scratch, as if from a cold-boot. Implementation * Restart the card from scratch, as if from a cold-boot. Implementation
* resembles the first-half of the e1000_resume routine. * resembles the first-half of the e1000e_pm_resume routine.
*/ */
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
{ {
...@@ -6400,7 +6450,7 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) ...@@ -6400,7 +6450,7 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
* *
* This callback is called when the error recovery driver tells us that * This callback is called when the error recovery driver tells us that
* its OK to resume normal operation. Implementation resembles the * its OK to resume normal operation. Implementation resembles the
* second-half of the e1000_resume routine. * second-half of the e1000e_pm_resume routine.
*/ */
static void e1000_io_resume(struct pci_dev *pdev) static void e1000_io_resume(struct pci_dev *pdev)
{ {
...@@ -6905,9 +6955,6 @@ static void e1000_remove(struct pci_dev *pdev) ...@@ -6905,9 +6955,6 @@ static void e1000_remove(struct pci_dev *pdev)
} }
} }
if (!(netdev->flags & IFF_UP))
e1000_power_down_phy(adapter);
/* Don't lie to e1000_close() down the road. */ /* Don't lie to e1000_close() down the road. */
if (!down) if (!down)
clear_bit(__E1000_DOWN, &adapter->state); clear_bit(__E1000_DOWN, &adapter->state);
...@@ -7029,9 +7076,14 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { ...@@ -7029,9 +7076,14 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
static const struct dev_pm_ops e1000_pm_ops = { static const struct dev_pm_ops e1000_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume) .suspend = e1000e_pm_suspend,
SET_RUNTIME_PM_OPS(e1000_runtime_suspend, e1000_runtime_resume, .resume = e1000e_pm_resume,
e1000_idle) .freeze = e1000e_pm_freeze,
.thaw = e1000e_pm_thaw,
.poweroff = e1000e_pm_suspend,
.restore = e1000e_pm_resume,
SET_RUNTIME_PM_OPS(e1000e_pm_runtime_suspend, e1000e_pm_runtime_resume,
e1000e_pm_runtime_idle)
}; };
/* PCI Device API Driver */ /* PCI Device API Driver */
...@@ -7058,7 +7110,7 @@ static int __init e1000_init_module(void) ...@@ -7058,7 +7110,7 @@ static int __init e1000_init_module(void)
int ret; int ret;
pr_info("Intel(R) PRO/1000 Network Driver - %s\n", pr_info("Intel(R) PRO/1000 Network Driver - %s\n",
e1000e_driver_version); e1000e_driver_version);
pr_info("Copyright(c) 1999 - 2013 Intel Corporation.\n"); pr_info("Copyright(c) 1999 - 2014 Intel Corporation.\n");
ret = pci_register_driver(&e1000_driver); ret = pci_register_driver(&e1000_driver);
return ret; return ret;
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include "e1000.h" #include "e1000.h"
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_NVM_H_ #ifndef _E1000E_NVM_H_
#define _E1000E_NVM_H_ #define _E1000E_NVM_H_
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -381,6 +374,12 @@ void e1000e_check_options(struct e1000_adapter *adapter) ...@@ -381,6 +374,12 @@ void e1000e_check_options(struct e1000_adapter *adapter)
"%s set to dynamic mode\n", opt.name); "%s set to dynamic mode\n", opt.name);
adapter->itr = 20000; adapter->itr = 20000;
break; break;
case 2:
dev_info(&adapter->pdev->dev,
"%s Invalid mode - setting default\n",
opt.name);
adapter->itr_setting = opt.def;
/* fall-through */
case 3: case 3:
dev_info(&adapter->pdev->dev, dev_info(&adapter->pdev->dev,
"%s set to dynamic conservative mode\n", "%s set to dynamic conservative mode\n",
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include "e1000.h" #include "e1000.h"
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_PHY_H_ #ifndef _E1000E_PHY_H_
#define _E1000E_PHY_H_ #define _E1000E_PHY_H_
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* PTP 1588 Hardware Clock (PHC) /* PTP 1588 Hardware Clock (PHC)
* Derived from PTP Hardware Clock driver for Intel 82576 and 82580 (igb) * Derived from PTP Hardware Clock driver for Intel 82576 and 82580 (igb)
...@@ -47,6 +40,7 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) ...@@ -47,6 +40,7 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
ptp_clock_info); ptp_clock_info);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
bool neg_adj = false; bool neg_adj = false;
unsigned long flags;
u64 adjustment; u64 adjustment;
u32 timinca, incvalue; u32 timinca, incvalue;
s32 ret_val; s32 ret_val;
...@@ -64,6 +58,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) ...@@ -64,6 +58,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
if (ret_val) if (ret_val)
return ret_val; return ret_val;
spin_lock_irqsave(&adapter->systim_lock, flags);
incvalue = timinca & E1000_TIMINCA_INCVALUE_MASK; incvalue = timinca & E1000_TIMINCA_INCVALUE_MASK;
adjustment = incvalue; adjustment = incvalue;
...@@ -77,6 +73,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) ...@@ -77,6 +73,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
ew32(TIMINCA, timinca); ew32(TIMINCA, timinca);
spin_unlock_irqrestore(&adapter->systim_lock, flags);
return 0; return 0;
} }
......
/******************************************************************************* /* Intel PRO/1000 Linux driver
* Copyright(c) 1999 - 2014 Intel Corporation.
Intel PRO/1000 Linux driver *
Copyright(c) 1999 - 2013 Intel Corporation. * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
This program is free software; you can redistribute it and/or modify it * version 2, as published by the Free Software Foundation.
under the terms and conditions of the GNU General Public License, *
version 2, as published by the Free Software Foundation. * This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
This program is distributed in the hope it will be useful, but WITHOUT * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * more details.
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for *
more details. * The full GNU General Public License is included in this distribution in
* the file called "COPYING".
You should have received a copy of the GNU General Public License along with *
this program; if not, write to the Free Software Foundation, Inc., * Contact Information:
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * Linux NICS <linux.nics@intel.com>
* e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
The full GNU General Public License is included in this distribution in * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
the file called "COPYING". */
Contact Information:
Linux NICS <linux.nics@intel.com>
e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _E1000E_REGS_H_ #ifndef _E1000E_REGS_H_
#define _E1000E_REGS_H_ #define _E1000E_REGS_H_
...@@ -39,6 +32,7 @@ ...@@ -39,6 +32,7 @@
#define E1000_SCTL 0x00024 /* SerDes Control - RW */ #define E1000_SCTL 0x00024 /* SerDes Control - RW */
#define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */ #define E1000_FCAL 0x00028 /* Flow Control Address Low - RW */
#define E1000_FCAH 0x0002C /* Flow Control Address High -RW */ #define E1000_FCAH 0x0002C /* Flow Control Address High -RW */
#define E1000_FEXT 0x0002C /* Future Extended - RW */
#define E1000_FEXTNVM 0x00028 /* Future Extended NVM - RW */ #define E1000_FEXTNVM 0x00028 /* Future Extended NVM - RW */
#define E1000_FEXTNVM3 0x0003C /* Future Extended NVM 3 - RW */ #define E1000_FEXTNVM3 0x0003C /* Future Extended NVM 3 - RW */
#define E1000_FEXTNVM4 0x00024 /* Future Extended NVM 4 - RW */ #define E1000_FEXTNVM4 0x00024 /* Future Extended NVM 4 - RW */
......
...@@ -76,8 +76,6 @@ static s32 igb_update_nvm_checksum_i350(struct e1000_hw *hw); ...@@ -76,8 +76,6 @@ static s32 igb_update_nvm_checksum_i350(struct e1000_hw *hw);
static const u16 e1000_82580_rxpbs_table[] = static const u16 e1000_82580_rxpbs_table[] =
{ 36, 72, 144, 1, 2, 4, 8, 16, { 36, 72, 144, 1, 2, 4, 8, 16,
35, 70, 140 }; 35, 70, 140 };
#define E1000_82580_RXPBS_TABLE_SIZE \
(sizeof(e1000_82580_rxpbs_table)/sizeof(u16))
/** /**
* igb_sgmii_uses_mdio_82575 - Determine if I2C pins are for external MDIO * igb_sgmii_uses_mdio_82575 - Determine if I2C pins are for external MDIO
...@@ -2307,7 +2305,7 @@ u16 igb_rxpbs_adjust_82580(u32 data) ...@@ -2307,7 +2305,7 @@ u16 igb_rxpbs_adjust_82580(u32 data)
{ {
u16 ret_val = 0; u16 ret_val = 0;
if (data < E1000_82580_RXPBS_TABLE_SIZE) if (data < ARRAY_SIZE(e1000_82580_rxpbs_table))
ret_val = e1000_82580_rxpbs_table[data]; ret_val = e1000_82580_rxpbs_table[data];
return ret_val; return ret_val;
...@@ -2713,6 +2711,7 @@ static const u8 e1000_emc_therm_limit[4] = { ...@@ -2713,6 +2711,7 @@ static const u8 e1000_emc_therm_limit[4] = {
E1000_EMC_DIODE3_THERM_LIMIT E1000_EMC_DIODE3_THERM_LIMIT
}; };
#ifdef CONFIG_IGB_HWMON
/** /**
* igb_get_thermal_sensor_data_generic - Gathers thermal sensor data * igb_get_thermal_sensor_data_generic - Gathers thermal sensor data
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
...@@ -2835,6 +2834,7 @@ static s32 igb_init_thermal_sensor_thresh_generic(struct e1000_hw *hw) ...@@ -2835,6 +2834,7 @@ static s32 igb_init_thermal_sensor_thresh_generic(struct e1000_hw *hw)
return status; return status;
} }
#endif
static struct e1000_mac_operations e1000_mac_ops_82575 = { static struct e1000_mac_operations e1000_mac_ops_82575 = {
.init_hw = igb_init_hw_82575, .init_hw = igb_init_hw_82575,
.check_for_link = igb_check_for_link_82575, .check_for_link = igb_check_for_link_82575,
......
...@@ -516,7 +516,8 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector, ...@@ -516,7 +516,8 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
/* Workaround hardware that can't do proper VEPA multicast /* Workaround hardware that can't do proper VEPA multicast
* source pruning. * source pruning.
*/ */
if ((skb->pkt_type & (PACKET_BROADCAST | PACKET_MULTICAST)) && if ((skb->pkt_type == PACKET_BROADCAST ||
skb->pkt_type == PACKET_MULTICAST) &&
ether_addr_equal(rx_ring->netdev->dev_addr, ether_addr_equal(rx_ring->netdev->dev_addr,
eth_hdr(skb)->h_source)) { eth_hdr(skb)->h_source)) {
dev_kfree_skb_irq(skb); dev_kfree_skb_irq(skb);
......
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