diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e')
23 files changed, 1357 insertions, 907 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/80003es2lan.c b/drivers/net/ethernet/intel/e1000e/80003es2lan.c index 895450e9bb3..08f22f34880 100644 --- a/drivers/net/ethernet/intel/e1000e/80003es2lan.c +++ b/drivers/net/ethernet/intel/e1000e/80003es2lan.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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 (Serdes) @@ -718,8 +711,11 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)  	e1000_release_phy_80003es2lan(hw);  	/* Disable IBIST slave mode (far-end loopback) */ -	e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, -					&kum_reg_data); +	ret_val = +	    e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, +					    &kum_reg_data); +	if (ret_val) +		return ret_val;  	kum_reg_data |= E1000_KMRNCTRLSTA_IBIST_DISABLE;  	e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,  					 kum_reg_data); @@ -1369,6 +1365,7 @@ static const struct e1000_mac_operations es2_mac_ops = {  	.setup_led		= e1000e_setup_led_generic,  	.config_collision_dist	= e1000e_config_collision_dist_generic,  	.rar_set		= e1000e_rar_set_generic, +	.rar_get_count		= e1000e_rar_get_count_generic,  };  static const struct e1000_phy_operations es2_phy_ops = { diff --git a/drivers/net/ethernet/intel/e1000e/80003es2lan.h b/drivers/net/ethernet/intel/e1000e/80003es2lan.h index 90d363b2d28..535a9430976 100644 --- a/drivers/net/ethernet/intel/e1000e/80003es2lan.h +++ b/drivers/net/ethernet/intel/e1000e/80003es2lan.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_80003ES2LAN_H_ diff --git a/drivers/net/ethernet/intel/e1000e/82571.c b/drivers/net/ethernet/intel/e1000e/82571.c index 8fed74e3fa5..218481e509f 100644 --- a/drivers/net/ethernet/intel/e1000e/82571.c +++ b/drivers/net/ethernet/intel/e1000e/82571.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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 (Copper) @@ -1903,6 +1896,7 @@ static const struct e1000_mac_operations e82571_mac_ops = {  	.config_collision_dist	= e1000e_config_collision_dist_generic,  	.read_mac_addr		= e1000_read_mac_addr_82571,  	.rar_set		= e1000e_rar_set_generic, +	.rar_get_count		= e1000e_rar_get_count_generic,  };  static const struct e1000_phy_operations e82_phy_ops_igp = { diff --git a/drivers/net/ethernet/intel/e1000e/82571.h b/drivers/net/ethernet/intel/e1000e/82571.h index 08e24dc3dc0..2e758f796d6 100644 --- a/drivers/net/ethernet/intel/e1000e/82571.h +++ b/drivers/net/ethernet/intel/e1000e/82571.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_82571_H_ diff --git a/drivers/net/ethernet/intel/e1000e/Makefile b/drivers/net/ethernet/intel/e1000e/Makefile index c2dcfcc1085..106de493373 100644 --- a/drivers/net/ethernet/intel/e1000e/Makefile +++ b/drivers/net/ethernet/intel/e1000e/Makefile @@ -1,7 +1,7 @@  ################################################################################  #  # 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  # under the terms and conditions of the GNU General Public License, @@ -12,9 +12,8 @@  # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  # more details.  # -# 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>.  #  # The full GNU General Public License is included in this distribution in  # the file called "COPYING". diff --git a/drivers/net/ethernet/intel/e1000e/defines.h b/drivers/net/ethernet/intel/e1000e/defines.h index 351c94a0cf7..d18e8921257 100644 --- a/drivers/net/ethernet/intel/e1000e/defines.h +++ b/drivers/net/ethernet/intel/e1000e/defines.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000_DEFINES_H_ @@ -35,9 +28,11 @@  /* Definitions for power management and wakeup registers */  /* Wake Up Control */ -#define E1000_WUC_APME       0x00000001 /* APM Enable */ -#define E1000_WUC_PME_EN     0x00000002 /* PME Enable */ -#define E1000_WUC_PHY_WAKE   0x00000100 /* if PHY supports wakeup */ +#define E1000_WUC_APME		0x00000001	/* APM 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 */  /* Wake Up Filter Control */  #define E1000_WUFC_LNKC 0x00000001 /* Link Status Change Wakeup Enable */ diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index ad0edd11015..7785240a0da 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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 */ @@ -269,12 +262,13 @@ struct e1000_adapter {  	u32 tx_head_addr;  	u32 tx_fifo_size;  	u32 tx_dma_failed; +	u32 tx_hwtstamp_timeouts;  	/* Rx */ -	bool (*clean_rx) (struct e1000_ring *ring, int *work_done, -			  int work_to_do) ____cacheline_aligned_in_smp; -	void (*alloc_rx_buf) (struct e1000_ring *ring, int cleaned_count, -			      gfp_t gfp); +	bool (*clean_rx)(struct e1000_ring *ring, int *work_done, +			 int work_to_do) ____cacheline_aligned_in_smp; +	void (*alloc_rx_buf)(struct e1000_ring *ring, int cleaned_count, +			     gfp_t gfp);  	struct e1000_ring *rx_ring;  	u32 rx_int_delay; @@ -333,7 +327,6 @@ struct e1000_adapter {  	struct work_struct update_phy_task;  	struct work_struct print_hang_task; -	bool idle_check;  	int phy_hang_count;  	u16 tx_ring_count; @@ -342,6 +335,7 @@ struct e1000_adapter {  	struct hwtstamp_config hwtstamp_config;  	struct delayed_work systim_overflow_work;  	struct sk_buff *tx_hwtstamp_skb; +	unsigned long tx_hwtstamp_start;  	struct work_struct tx_hwtstamp_work;  	spinlock_t systim_lock;	/* protects SYSTIML/H regsters */  	struct cyclecounter cc; @@ -397,6 +391,8 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca);   * 25MHz	46-bit	2^46 / 10^9 / 3600 = 19.55 hours   */  #define E1000_SYSTIM_OVERFLOW_PERIOD	(HZ * 60 * 60 * 4) +#define E1000_MAX_82574_SYSTIM_REREADS	50 +#define E1000_82574_SYSTIM_EPSILON	(1ULL << 35ULL)  /* hardware capability, feature, and workaround flags */  #define FLAG_HAS_AMT                      (1 << 0) @@ -472,26 +468,25 @@ enum latency_range {  extern char e1000e_driver_name[];  extern const char e1000e_driver_version[]; -extern void e1000e_check_options(struct e1000_adapter *adapter); -extern void e1000e_set_ethtool_ops(struct net_device *netdev); - -extern int e1000e_up(struct e1000_adapter *adapter); -extern void e1000e_down(struct e1000_adapter *adapter); -extern void e1000e_reinit_locked(struct e1000_adapter *adapter); -extern void e1000e_reset(struct e1000_adapter *adapter); -extern void e1000e_power_up_phy(struct e1000_adapter *adapter); -extern int e1000e_setup_rx_resources(struct e1000_ring *ring); -extern int e1000e_setup_tx_resources(struct e1000_ring *ring); -extern void e1000e_free_rx_resources(struct e1000_ring *ring); -extern void e1000e_free_tx_resources(struct e1000_ring *ring); -extern struct rtnl_link_stats64 *e1000e_get_stats64(struct net_device *netdev, -						    struct rtnl_link_stats64 -						    *stats); -extern void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); -extern void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); -extern void e1000e_get_hw_control(struct e1000_adapter *adapter); -extern void e1000e_release_hw_control(struct e1000_adapter *adapter); -extern void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr); +void e1000e_check_options(struct e1000_adapter *adapter); +void e1000e_set_ethtool_ops(struct net_device *netdev); + +int e1000e_up(struct e1000_adapter *adapter); +void e1000e_down(struct e1000_adapter *adapter, bool reset); +void e1000e_reinit_locked(struct e1000_adapter *adapter); +void e1000e_reset(struct e1000_adapter *adapter); +void e1000e_power_up_phy(struct e1000_adapter *adapter); +int e1000e_setup_rx_resources(struct e1000_ring *ring); +int e1000e_setup_tx_resources(struct e1000_ring *ring); +void e1000e_free_rx_resources(struct e1000_ring *ring); +void e1000e_free_tx_resources(struct e1000_ring *ring); +struct rtnl_link_stats64 *e1000e_get_stats64(struct net_device *netdev, +					     struct rtnl_link_stats64 *stats); +void e1000e_set_interrupt_capability(struct e1000_adapter *adapter); +void e1000e_reset_interrupt_capability(struct e1000_adapter *adapter); +void e1000e_get_hw_control(struct e1000_adapter *adapter); +void e1000e_release_hw_control(struct e1000_adapter *adapter); +void e1000e_write_itr(struct e1000_adapter *adapter, u32 itr);  extern unsigned int copybreak; @@ -508,8 +503,8 @@ extern const struct e1000_info e1000_pch2_info;  extern const struct e1000_info e1000_pch_lpt_info;  extern const struct e1000_info e1000_es2_info; -extern void e1000e_ptp_init(struct e1000_adapter *adapter); -extern void e1000e_ptp_remove(struct e1000_adapter *adapter); +void e1000e_ptp_init(struct e1000_adapter *adapter); +void e1000e_ptp_remove(struct e1000_adapter *adapter);  static inline s32 e1000_phy_hw_reset(struct e1000_hw *hw)  { @@ -536,7 +531,7 @@ static inline s32 e1e_wphy_locked(struct e1000_hw *hw, u32 offset, u16 data)  	return hw->phy.ops.write_reg_locked(hw, offset, data);  } -extern void e1000e_reload_nvm_generic(struct e1000_hw *hw); +void e1000e_reload_nvm_generic(struct e1000_hw *hw);  static inline s32 e1000e_read_mac_addr(struct e1000_hw *hw)  { @@ -580,35 +575,8 @@ static inline u32 __er32(struct e1000_hw *hw, unsigned long reg)  #define er32(reg)	__er32(hw, E1000_##reg) -/** - * __ew32_prepare - prepare to write to MAC CSR register on certain parts - * @hw: pointer to the HW structure - * - * When updating the MAC CSR registers, the Manageability Engine (ME) could - * be accessing the registers at the same time.  Normally, this is handled in - * h/w by an arbiter but on some parts there is a bug that acknowledges Host - * accesses later than it should which could result in the register to have - * an incorrect value.  Workaround this by checking the FWSM register which - * has bit 24 set while ME is accessing MAC CSR registers, wait if it is set - * and try again a number of times. - **/ -static inline s32 __ew32_prepare(struct e1000_hw *hw) -{ -	s32 i = E1000_ICH_FWSM_PCIM2PCI_COUNT; - -	while ((er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI) && --i) -		udelay(50); - -	return i; -} - -static inline void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val) -{ -	if (hw->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) -		__ew32_prepare(hw); - -	writel(val, hw->hw_addr + reg); -} +s32 __ew32_prepare(struct e1000_hw *hw); +void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val);  #define ew32(reg, val)	__ew32(hw, E1000_##reg, (val)) diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index a8633b8f0ac..815e26c6d34 100644 --- a/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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 */ @@ -111,6 +104,7 @@ static const struct e1000_stats e1000_gstrings_stats[] = {  	E1000_STAT("rx_hwtstamp_cleared", rx_hwtstamp_cleared),  	E1000_STAT("uncorr_ecc_errors", uncorr_errors),  	E1000_STAT("corr_ecc_errors", corr_errors), +	E1000_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts),  };  #define E1000_GLOBAL_STATS_LEN	ARRAY_SIZE(e1000_gstrings_stats) @@ -165,8 +159,8 @@ static int e1000_get_settings(struct net_device *netdev,  		ecmd->transceiver = XCVR_EXTERNAL;  	} -	speed = -1; -	ecmd->duplex = -1; +	speed = SPEED_UNKNOWN; +	ecmd->duplex = DUPLEX_UNKNOWN;  	if (netif_running(netdev)) {  		if (netif_carrier_ok(netdev)) { @@ -175,6 +169,7 @@ static int e1000_get_settings(struct net_device *netdev,  		}  	} else if (!pm_runtime_suspended(netdev->dev.parent)) {  		u32 status = er32(STATUS); +  		if (status & E1000_STATUS_LU) {  			if (status & E1000_STATUS_SPEED_1000)  				speed = SPEED_1000; @@ -332,7 +327,7 @@ static int e1000_set_settings(struct net_device *netdev,  	/* reset the link */  	if (netif_running(adapter->netdev)) { -		e1000e_down(adapter); +		e1000e_down(adapter, true);  		e1000e_up(adapter);  	} else {  		e1000e_reset(adapter); @@ -380,7 +375,7 @@ static int e1000_set_pauseparam(struct net_device *netdev,  	if (adapter->fc_autoneg == AUTONEG_ENABLE) {  		hw->fc.requested_mode = e1000_fc_default;  		if (netif_running(adapter->netdev)) { -			e1000e_down(adapter); +			e1000e_down(adapter, true);  			e1000e_up(adapter);  		} else {  			e1000e_reset(adapter); @@ -726,7 +721,7 @@ static int e1000_set_ringparam(struct net_device *netdev,  	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  	 * ISRs in MSI-X mode get passed pointers to the Tx and Rx ring @@ -789,25 +784,26 @@ static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data,  			      reg + (offset << 2), val,  			      (test[pat] & write & mask));  			*data = reg; -			return 1; +			return true;  		}  	} -	return 0; +	return false;  }  static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data,  			      int reg, u32 mask, u32 write)  {  	u32 val; +  	__ew32(&adapter->hw, reg, write & mask);  	val = __er32(&adapter->hw, reg);  	if ((write & mask) != (val & mask)) {  		e_err("set/check test failed (reg 0x%05X): got 0x%08X expected 0x%08X\n",  		      reg, (val & mask), (write & mask));  		*data = reg; -		return 1; +		return true;  	} -	return 0; +	return false;  }  #define REG_PATTERN_TEST_ARRAY(reg, offset, mask, write)                       \ @@ -922,9 +918,23 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data)  			else  				mask &= ~(1 << 30);  		} +		if (mac->type == e1000_pch2lan) { +			/* SHRAH[0,1,2] different than previous */ +			if (i == 1) +				mask &= 0xFFF4FFFF; +			/* SHRAH[3] different than SHRAH[0,1,2] */ +			if (i == 4) +				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,  				       0xFFFFFFFF); +		/* reset index to actual value */ +		if ((mac->type == e1000_pch2lan) && (i > 6)) +			i -= 6;  	}  	for (i = 0; i < mac->mta_reg_count; i++) @@ -1709,6 +1719,7 @@ static int e1000_link_test(struct e1000_adapter *adapter, u64 *data)  	*data = 0;  	if (hw->phy.media_type == e1000_media_type_internal_serdes) {  		int i = 0; +  		hw->mac.serdes_has_link = false;  		/* On some blade server designs, link establishment @@ -2307,5 +2318,5 @@ static const struct ethtool_ops e1000_ethtool_ops = {  void e1000e_set_ethtool_ops(struct net_device *netdev)  { -	SET_ETHTOOL_OPS(netdev, &e1000_ethtool_ops); +	netdev->ethtool_ops = &e1000_ethtool_ops;  } diff --git a/drivers/net/ethernet/intel/e1000e/hw.h b/drivers/net/ethernet/intel/e1000e/hw.h index b7f38435d1f..72f5475c4b9 100644 --- a/drivers/net/ethernet/intel/e1000e/hw.h +++ b/drivers/net/ethernet/intel/e1000e/hw.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000_HW_H_ @@ -476,8 +469,9 @@ struct e1000_mac_operations {  	s32  (*setup_led)(struct e1000_hw *);  	void (*write_vfta)(struct e1000_hw *, u32, u32);  	void (*config_collision_dist)(struct e1000_hw *); -	void (*rar_set)(struct e1000_hw *, u8 *, u32); +	int  (*rar_set)(struct e1000_hw *, u8 *, u32);  	s32  (*read_mac_addr)(struct e1000_hw *); +	u32  (*rar_get_count)(struct e1000_hw *);  };  /* When to use various PHY register access functions: @@ -655,12 +649,20 @@ struct e1000_shadow_ram {  #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 {  	bool kmrn_lock_loss_workaround_enabled;  	struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS];  	bool nvm_k1_enabled;  	bool eee_disable;  	u16 eee_lp_ability; +	enum e1000_ulp_state ulp_state;  };  struct e1000_hw { diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c index af08188d7e6..8894ab8ed6b 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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-2 10/100 Network Connection @@ -53,6 +46,14 @@   * 82578DC Gigabit Network Connection   * 82579LM 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" @@ -138,11 +139,14 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link);  static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw);  static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw);  static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); -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 int e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index); +static int e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index); +static u32 e1000_rar_get_count_pch_lpt(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 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_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state);  static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg)  { @@ -183,7 +187,7 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)  {  	u16 phy_reg = 0;  	u32 phy_id = 0; -	s32 ret_val; +	s32 ret_val = 0;  	u16 retry_count;  	u32 mac_reg = 0; @@ -214,11 +218,13 @@ static bool e1000_phy_is_accessible_pchlan(struct e1000_hw *hw)  	/* In case the PHY needs to be in mdio slow mode,  	 * set slow mode and try to get the PHY id again.  	 */ -	hw->phy.ops.release(hw); -	ret_val = e1000_set_mdio_slow_mode_hv(hw); -	if (!ret_val) -		ret_val = e1000e_get_phy_id(hw); -	hw->phy.ops.acquire(hw); +	if (hw->mac.type < e1000_pch_lpt) { +		hw->phy.ops.release(hw); +		ret_val = e1000_set_mdio_slow_mode_hv(hw); +		if (!ret_val) +			ret_val = e1000e_get_phy_id(hw); +		hw->phy.ops.acquire(hw); +	}  	if (ret_val)  		return false; @@ -239,6 +245,47 @@ out:  }  /** + *  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   *  @hw: pointer to the HW structure   * @@ -247,6 +294,7 @@ out:   **/  static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)  { +	struct e1000_adapter *adapter = hw->adapter;  	u32 mac_reg, fwsm = er32(FWSM);  	s32 ret_val; @@ -255,6 +303,12 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)  	 */  	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);  	if (ret_val) {  		e_dbg("Failed to initialize PHY flow\n"); @@ -300,33 +354,9 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)  			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 */ -		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--); -			usleep_range(30000, 60000); +		e1000_toggle_lanphypc_pch_lpt(hw); +		if (hw->mac.type >= e1000_pch_lpt) {  			if (e1000_phy_is_accessible_pchlan(hw))  				break; @@ -349,12 +379,31 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)  	hw->phy.ops.release(hw);  	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  		 * that the PHY is in a known good state before we read/write  		 * PHY registers.  The generic reset is sufficient here,  		 * because we haven't determined the PHY type yet.  		 */  		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: @@ -656,6 +705,7 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw)  		mac->ops.rar_set = e1000_rar_set_pch_lpt;  		mac->ops.setup_physical_interface =  		    e1000_setup_copper_link_pch_lpt; +		mac->ops.rar_get_count = e1000_rar_get_count_pch_lpt;  	}  	/* Enable PCS Lock-loss workaround for ICH8 */ @@ -724,8 +774,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   *  the link and the EEE capabilities of the link partner.  The LPI Control   *  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;  	s32 ret_val; @@ -790,6 +846,17 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw)  		}  	} +	if (hw->phy.type == e1000_phy_82579) { +		ret_val = e1000_read_emi_reg_locked(hw, I82579_LPI_PLL_SHUT, +						    &data); +		if (ret_val) +			goto release; + +		data &= ~I82579_LPI_100_PLL_SHUT; +		ret_val = e1000_write_emi_reg_locked(hw, I82579_LPI_PLL_SHUT, +						     data); +	} +  	/* R/Clr IEEE MMD 3.1 bits 11:10 - Tx/Rx LPI Received */  	ret_val = e1000_read_emi_reg_locked(hw, pcs_status, &data);  	if (ret_val) @@ -979,6 +1046,253 @@ static s32 e1000_platform_pm_pch_lpt(struct e1000_hw *hw, bool link)  }  /** + *  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)   *  @hw: pointer to the HW structure   * @@ -1015,14 +1329,18 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)  			return ret_val;  	} -	/* When connected at 10Mbps half-duplex, 82579 parts are excessively +	/* When connected at 10Mbps half-duplex, some parts are excessively  	 * aggressive resulting in many collisions. To avoid this, increase  	 * the IPG and reduce Rx latency in the PHY.  	 */ -	if ((hw->mac.type == e1000_pch2lan) && link) { +	if (((hw->mac.type == e1000_pch2lan) || +	     (hw->mac.type == e1000_pch_lpt)) && link) {  		u32 reg; +  		reg = er32(STATUS);  		if (!(reg & (E1000_STATUS_FD | E1000_STATUS_SPEED_MASK))) { +			u16 emi_addr; +  			reg = er32(TIPG);  			reg &= ~E1000_TIPG_IPGT_MASK;  			reg |= 0xFF; @@ -1033,8 +1351,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)  			if (ret_val)  				return ret_val; -			ret_val = -			    e1000_write_emi_reg_locked(hw, I82579_RX_CONFIG, 0); +			if (hw->mac.type == e1000_pch2lan) +				emi_addr = I82579_RX_CONFIG; +			else +				emi_addr = I217_RX_CONFIG; + +			ret_val = e1000_write_emi_reg_locked(hw, emi_addr, 0);  			hw->phy.ops.release(hw); @@ -1106,9 +1428,11 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)  	e1000e_check_downshift(hw);  	/* Enable/Disable EEE after link up */ -	ret_val = e1000_set_eee_pchlan(hw); -	if (ret_val) -		return ret_val; +	if (hw->phy.type > e1000_phy_82579) { +		ret_val = e1000_set_eee_pchlan(hw); +		if (ret_val) +			return ret_val; +	}  	/* If we are forcing speed/duplex, then we simply return since  	 * we have already determined whether we have link or not. @@ -1313,9 +1637,9 @@ static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw)  	u32 fwsm;  	fwsm = er32(FWSM); -	return ((fwsm & E1000_ICH_FWSM_FW_VALID) && +	return (fwsm & E1000_ICH_FWSM_FW_VALID) &&  		((fwsm & E1000_FWSM_MODE_MASK) == -		 (E1000_ICH_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT))); +		 (E1000_ICH_MNG_IAMT_MODE << E1000_FWSM_MODE_SHIFT));  }  /** @@ -1346,7 +1670,7 @@ static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw)   *  contain the MAC address but RAR[1-6] are reserved for manageability (ME).   *  Use SHRA[0-3] in place of those reserved for ME.   **/ -static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index) +static int e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)  {  	u32 rar_low, rar_high; @@ -1368,10 +1692,13 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)  		e1e_flush();  		ew32(RAH(index), rar_high);  		e1e_flush(); -		return; +		return 0;  	} -	if (index < hw->mac.rar_entry_count) { +	/* RAR[1-6] are owned by manageability.  Skip those and program the +	 * next address into the SHRA register array. +	 */ +	if (index < (u32)(hw->mac.rar_entry_count)) {  		s32 ret_val;  		ret_val = e1000_acquire_swflag_ich8lan(hw); @@ -1388,7 +1715,7 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)  		/* verify the register updates */  		if ((er32(SHRAL(index - 1)) == rar_low) &&  		    (er32(SHRAH(index - 1)) == rar_high)) -			return; +			return 0;  		e_dbg("SHRA[%d] might be locked by ME - FWSM=0x%8.8x\n",  		      (index - 1), er32(FWSM)); @@ -1396,6 +1723,43 @@ static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index)  out:  	e_dbg("Failed to write receive address at index %d\n", index); +	return -E1000_ERR_CONFIG; +} + +/** + *  e1000_rar_get_count_pch_lpt - Get the number of available SHRA + *  @hw: pointer to the HW structure + * + *  Get the number of available receive registers that the Host can + *  program. SHRA[0-10] are the shared receive address registers + *  that are shared between the Host and manageability engine (ME). + *  ME can reserve any number of addresses and the host needs to be + *  able to tell how many available registers it has access to. + **/ +static u32 e1000_rar_get_count_pch_lpt(struct e1000_hw *hw) +{ +	u32 wlock_mac; +	u32 num_entries; + +	wlock_mac = er32(FWSM) & E1000_FWSM_WLOCK_MAC_MASK; +	wlock_mac >>= E1000_FWSM_WLOCK_MAC_SHIFT; + +	switch (wlock_mac) { +	case 0: +		/* All SHRA[0..10] and RAR[0] available */ +		num_entries = hw->mac.rar_entry_count; +		break; +	case 1: +		/* Only RAR[0] available */ +		num_entries = 1; +		break; +	default: +		/* SHRA[0..(wlock_mac - 1)] available + RAR[0] */ +		num_entries = wlock_mac + 1; +		break; +	} + +	return num_entries;  }  /** @@ -1409,7 +1773,7 @@ out:   *  contain the MAC address. SHRA[0-10] are the shared receive address   *  registers that are shared between the Host and manageability engine (ME).   **/ -static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index) +static int e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)  {  	u32 rar_low, rar_high;  	u32 wlock_mac; @@ -1431,7 +1795,7 @@ static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)  		e1e_flush();  		ew32(RAH(index), rar_high);  		e1e_flush(); -		return; +		return 0;  	}  	/* The manageability engine (ME) can lock certain SHRAR registers that @@ -1463,12 +1827,13 @@ static void e1000_rar_set_pch_lpt(struct e1000_hw *hw, u8 *addr, u32 index)  			/* verify the register updates */  			if ((er32(SHRAL_PCH_LPT(index - 1)) == rar_low) &&  			    (er32(SHRAH_PCH_LPT(index - 1)) == rar_high)) -				return; +				return 0;  		}  	}  out:  	e_dbg("Failed to write receive address at index %d\n", index); +	return -E1000_ERR_CONFIG;  }  /** @@ -1481,11 +1846,13 @@ out:   **/  static s32 e1000_check_reset_block_ich8lan(struct e1000_hw *hw)  { -	u32 fwsm; +	bool blocked = false; +	int i = 0; -	fwsm = er32(FWSM); - -	return (fwsm & E1000_ICH_FWSM_RSPCIPHY) ? 0 : E1000_BLK_PHY_RESET; +	while ((blocked = !(er32(FWSM) & E1000_ICH_FWSM_RSPCIPHY)) && +	       (i++ < 10)) +		usleep_range(10000, 20000); +	return blocked ? E1000_BLK_PHY_RESET : 0;  }  /** @@ -1962,8 +2329,8 @@ void e1000_copy_rx_addrs_to_phy_ich8lan(struct e1000_hw *hw)  	if (ret_val)  		goto release; -	/* Copy both RAL/H (rar_entry_count) and SHRAL/H (+4) to PHY */ -	for (i = 0; i < (hw->mac.rar_entry_count + 4); i++) { +	/* Copy both RAL/H (rar_entry_count) and SHRAL/H to PHY */ +	for (i = 0; i < (hw->mac.rar_entry_count); i++) {  		mac_reg = er32(RAL(i));  		hw->phy.ops.write_reg_page(hw, BM_RAR_L(i),  					   (u16)(mac_reg & 0xFFFF)); @@ -2007,10 +2374,10 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)  		return ret_val;  	if (enable) { -		/* Write Rx addresses (rar_entry_count for RAL/H, +4 for +		/* Write Rx addresses (rar_entry_count for RAL/H, and  		 * SHRAL/H) and initial CRC values to the MAC  		 */ -		for (i = 0; i < (hw->mac.rar_entry_count + 4); i++) { +		for (i = 0; i < hw->mac.rar_entry_count; i++) {  			u8 mac_addr[ETH_ALEN] = { 0 };  			u32 addr_high, addr_low; @@ -2187,51 +2554,44 @@ release:   *  e1000_k1_gig_workaround_lv - K1 Si workaround   *  @hw:   pointer to the HW structure   * - *  Workaround to set the K1 beacon duration for 82579 parts + *  Workaround to set the K1 beacon duration for 82579 parts in 10Mbps + *  Disable K1 in 1000Mbps and 100Mbps   **/  static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)  {  	s32 ret_val = 0;  	u16 status_reg = 0; -	u32 mac_reg; -	u16 phy_reg;  	if (hw->mac.type != e1000_pch2lan)  		return 0; -	/* Set K1 beacon duration based on 1Gbps speed or otherwise */ +	/* Set K1 beacon duration based on 10Mbs speed */  	ret_val = e1e_rphy(hw, HV_M_STATUS, &status_reg);  	if (ret_val)  		return ret_val;  	if ((status_reg & (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE))  	    == (HV_M_STATUS_LINK_UP | HV_M_STATUS_AUTONEG_COMPLETE)) { -		mac_reg = er32(FEXTNVM4); -		mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK; - -		ret_val = e1e_rphy(hw, I82579_LPI_CTRL, &phy_reg); -		if (ret_val) -			return ret_val; - -		if (status_reg & HV_M_STATUS_SPEED_1000) { +		if (status_reg & +		    (HV_M_STATUS_SPEED_1000 | HV_M_STATUS_SPEED_100)) {  			u16 pm_phy_reg; -			mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_8USEC; -			phy_reg &= ~I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT; -			/* LV 1G Packet drop issue wa  */ +			/* LV 1G/100 Packet drop issue wa  */  			ret_val = e1e_rphy(hw, HV_PM_CTRL, &pm_phy_reg);  			if (ret_val)  				return ret_val; -			pm_phy_reg &= ~HV_PM_CTRL_PLL_STOP_IN_K1_GIGA; +			pm_phy_reg &= ~HV_PM_CTRL_K1_ENABLE;  			ret_val = e1e_wphy(hw, HV_PM_CTRL, pm_phy_reg);  			if (ret_val)  				return ret_val;  		} else { +			u32 mac_reg; + +			mac_reg = er32(FEXTNVM4); +			mac_reg &= ~E1000_FEXTNVM4_BEACON_DURATION_MASK;  			mac_reg |= E1000_FEXTNVM4_BEACON_DURATION_16USEC; -			phy_reg |= I82579_LPI_CTRL_FORCE_PLL_LOCK_COUNT; +			ew32(FEXTNVM4, mac_reg);  		} -		ew32(FEXTNVM4, mac_reg); -		ret_val = e1e_wphy(hw, I82579_LPI_CTRL, phy_reg);  	}  	return ret_val; @@ -4657,6 +5017,7 @@ static const struct e1000_mac_operations ich8_mac_ops = {  	/* id_led_init dependent on mac type */  	.config_collision_dist	= e1000e_config_collision_dist_generic,  	.rar_set		= e1000e_rar_set_generic, +	.rar_get_count		= e1000e_rar_get_count_generic,  };  static const struct e1000_phy_operations ich8_phy_ops = { diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h index 59865695b28..5515126c81c 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.h +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_ICH8LAN_H_ @@ -65,11 +58,16 @@  #define E1000_FWSM_WLOCK_MAC_MASK	0x0380  #define E1000_FWSM_WLOCK_MAC_SHIFT	7 +#define E1000_FWSM_ULP_CFG_DONE		0x00000400	/* Low power cfg done */  /* Shared Receive Address Registers */  #define E1000_SHRAL_PCH_LPT(_i)		(0x05408 + ((_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) | \  				 (ID_LED_OFF1_OFF2 <<  8) | \  				 (ID_LED_OFF1_ON2  <<  4) | \ @@ -82,6 +80,9 @@  #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_ICH8M	(1 << 27)	/* different on ICH8M */ @@ -95,6 +96,8 @@  #define E1000_FEXTNVM6_REQ_PLL_CLK	0x00000100  #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 E1000_ICH_RAR_ENTRIES	7 @@ -161,6 +164,16 @@  #define CV_SMB_CTRL		PHY_REG(769, 23)  #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 */  #define HV_SMB_ADDR		PHY_REG(768, 26)  #define HV_SMB_ADDR_MASK	0x007F @@ -195,6 +208,7 @@  /* PHY Power Management Control */  #define HV_PM_CTRL		PHY_REG(770, 17)  #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 */ @@ -218,16 +232,19 @@  #define I82577_MSE_THRESHOLD	0x0887	/* 82577 Mean Square Error Threshold */  #define I82579_MSE_LINK_DOWN	0x2411	/* MSE count before dropping link */  #define I82579_RX_CONFIG		0x3412	/* Receive configuration */ +#define I82579_LPI_PLL_SHUT		0x4412	/* LPI PLL Shut Enable */  #define I82579_EEE_PCS_STATUS		0x182E	/* IEEE MMD Register 3.1 >> 8 */  #define I82579_EEE_CAPABILITY		0x0410	/* IEEE MMD Register 3.20 */  #define I82579_EEE_ADVERTISEMENT	0x040E	/* IEEE MMD Register 7.60 */  #define I82579_EEE_LP_ABILITY		0x040F	/* IEEE MMD Register 7.61 */  #define I82579_EEE_100_SUPPORTED	(1 << 1)	/* 100BaseTx EEE */  #define I82579_EEE_1000_SUPPORTED	(1 << 2)	/* 1000BaseTx EEE */ +#define I82579_LPI_100_PLL_SHUT	(1 << 2)	/* 100M LPI PLL Shut Enabled */  #define I217_EEE_PCS_STATUS	0x9401	/* IEEE MMD Register 3.1 */  #define I217_EEE_CAPABILITY	0x8000	/* IEEE MMD Register 3.20 */  #define I217_EEE_ADVERTISEMENT	0x8001	/* IEEE MMD Register 7.60 */  #define I217_EEE_LP_ABILITY	0x8002	/* IEEE MMD Register 7.61 */ +#define I217_RX_CONFIG		0xB20C	/* Receive configuration */  #define E1000_EEE_RX_LPI_RCVD	0x0400	/* Tx LP idle received */  #define E1000_EEE_TX_LPI_RCVD	0x0800	/* Rx LP idle received */ @@ -268,4 +285,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_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_set_eee_pchlan(struct e1000_hw *hw); +s32 e1000_enable_ulp_lpt_lp(struct e1000_hw *hw, bool to_sx);  #endif /* _E1000E_ICH8LAN_H_ */ diff --git a/drivers/net/ethernet/intel/e1000e/mac.c b/drivers/net/ethernet/intel/e1000e/mac.c index 2480c109187..8c386f3a15e 100644 --- a/drivers/net/ethernet/intel/e1000e/mac.c +++ b/drivers/net/ethernet/intel/e1000e/mac.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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" @@ -218,6 +211,11 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)  	return 0;  } +u32 e1000e_rar_get_count_generic(struct e1000_hw *hw) +{ +	return hw->mac.rar_entry_count; +} +  /**   *  e1000e_rar_set_generic - Set receive address register   *  @hw: pointer to the HW structure @@ -227,7 +225,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)   *  Sets the receive address array register at index to the address passed   *  in by addr.   **/ -void e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) +int e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index)  {  	u32 rar_low, rar_high; @@ -251,6 +249,8 @@ void e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index)  	e1e_flush();  	ew32(RAH(index), rar_high);  	e1e_flush(); + +	return 0;  }  /** diff --git a/drivers/net/ethernet/intel/e1000e/mac.h b/drivers/net/ethernet/intel/e1000e/mac.h index a61fee404eb..0513d90cdee 100644 --- a/drivers/net/ethernet/intel/e1000e/mac.h +++ b/drivers/net/ethernet/intel/e1000e/mac.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_MAC_H_ @@ -68,7 +61,8 @@ void e1000e_update_adaptive(struct e1000_hw *hw);  void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value);  void e1000_set_lan_id_multi_port_pcie(struct e1000_hw *hw); -void e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); +u32 e1000e_rar_get_count_generic(struct e1000_hw *hw); +int e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index);  void e1000e_config_collision_dist_generic(struct e1000_hw *hw);  #endif diff --git a/drivers/net/ethernet/intel/e1000e/manage.c b/drivers/net/ethernet/intel/e1000e/manage.c index e4b0f1ef92f..cb37ff1f132 100644 --- a/drivers/net/ethernet/intel/e1000e/manage.c +++ b/drivers/net/ethernet/intel/e1000e/manage.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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" diff --git a/drivers/net/ethernet/intel/e1000e/manage.h b/drivers/net/ethernet/intel/e1000e/manage.h index 326897c29ea..a8c27f98f7b 100644 --- a/drivers/net/ethernet/intel/e1000e/manage.h +++ b/drivers/net/ethernet/intel/e1000e/manage.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_MANAGE_H_ diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index e87e9b01f40..201cc93f362 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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 @@ -131,6 +124,36 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = {  };  /** + * __ew32_prepare - prepare to write to MAC CSR register on certain parts + * @hw: pointer to the HW structure + * + * When updating the MAC CSR registers, the Manageability Engine (ME) could + * be accessing the registers at the same time.  Normally, this is handled in + * h/w by an arbiter but on some parts there is a bug that acknowledges Host + * accesses later than it should which could result in the register to have + * an incorrect value.  Workaround this by checking the FWSM register which + * has bit 24 set while ME is accessing MAC CSR registers, wait if it is set + * and try again a number of times. + **/ +s32 __ew32_prepare(struct e1000_hw *hw) +{ +	s32 i = E1000_ICH_FWSM_PCIM2PCI_COUNT; + +	while ((er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI) && --i) +		udelay(50); + +	return i; +} + +void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val) +{ +	if (hw->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) +		__ew32_prepare(hw); + +	writel(val, hw->hw_addr + reg); +} + +/**   * e1000_regdump - register printout routine   * @hw: pointer to the HW structure   * @reginfo: pointer to the register info table @@ -606,6 +629,7 @@ static void e1000e_update_rdt_wa(struct e1000_ring *rx_ring, unsigned int i)  	if (unlikely(!ret_val && (i != readl(rx_ring->tail)))) {  		u32 rctl = er32(RCTL); +  		ew32(RCTL, rctl & ~E1000_RCTL_EN);  		e_err("ME firmware caused invalid RDT - resetting\n");  		schedule_work(&adapter->reset_task); @@ -622,6 +646,7 @@ static void e1000e_update_tdt_wa(struct e1000_ring *tx_ring, unsigned int i)  	if (unlikely(!ret_val && (i != readl(tx_ring->tail)))) {  		u32 tctl = er32(TCTL); +  		ew32(TCTL, tctl & ~E1000_TCTL_EN);  		e_err("ME firmware caused invalid TDT - resetting\n");  		schedule_work(&adapter->reset_task); @@ -885,7 +910,7 @@ static inline void e1000_rx_hash(struct net_device *netdev, __le32 rss,  				 struct sk_buff *skb)  {  	if (netdev->features & NETIF_F_RXHASH) -		skb->rxhash = le32_to_cpu(rss); +		skb_set_hash(skb, le32_to_cpu(rss), PKT_HASH_TYPE_L3);  }  /** @@ -1097,8 +1122,14 @@ static void e1000_print_hw_hang(struct work_struct *work)  		adapter->tx_hang_recheck = true;  		return;  	} -	/* Real hang detected */  	adapter->tx_hang_recheck = false; + +	if (er32(TDH(0)) == er32(TDT(0))) { +		e_dbg("false hang detected, ignoring\n"); +		return; +	} + +	/* Real hang detected */  	netif_stop_queue(netdev);  	e1e_rphy(hw, MII_BMSR, &phy_status); @@ -1128,6 +1159,8 @@ static void e1000_print_hw_hang(struct work_struct *work)  	      eop, jiffies, eop_desc->upper.fields.status, er32(STATUS),  	      phy_status, phy_1000t_status, phy_ext_status, pci_status); +	e1000e_dump(adapter); +  	/* Suggest workaround for known h/w issue */  	if ((hw->mac.type == e1000_pchlan) && (er32(CTRL) & E1000_CTRL_TFCE))  		e_err("Try turning off Tx pause (flow control) via ethtool\n"); @@ -1147,9 +1180,6 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)  						     tx_hwtstamp_work);  	struct e1000_hw *hw = &adapter->hw; -	if (!adapter->tx_hwtstamp_skb) -		return; -  	if (er32(TSYNCTXCTL) & E1000_TSYNCTXCTL_VALID) {  		struct skb_shared_hwtstamps shhwtstamps;  		u64 txstmp; @@ -1162,6 +1192,12 @@ static void e1000e_tx_hwtstamp_work(struct work_struct *work)  		skb_tstamp_tx(adapter->tx_hwtstamp_skb, &shhwtstamps);  		dev_kfree_skb_any(adapter->tx_hwtstamp_skb);  		adapter->tx_hwtstamp_skb = NULL; +	} else if (time_after(jiffies, adapter->tx_hwtstamp_start +			      + adapter->tx_timeout_factor * HZ)) { +		dev_kfree_skb_any(adapter->tx_hwtstamp_skb); +		adapter->tx_hwtstamp_skb = NULL; +		adapter->tx_hwtstamp_timeouts++; +		e_warn("clearing Tx timestamp hang\n");  	} else {  		/* reschedule to check later */  		schedule_work(&adapter->tx_hwtstamp_work); @@ -1194,6 +1230,7 @@ static bool e1000_clean_tx_irq(struct e1000_ring *tx_ring)  	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&  	       (count < tx_ring->count)) {  		bool cleaned = false; +  		rmb();		/* read buffer_info after eop_desc */  		for (; !cleaned; count++) {  			tx_desc = E1000_TX_DESC(*tx_ring, i); @@ -1701,7 +1738,7 @@ static void e1000_clean_rx_ring(struct e1000_ring *rx_ring)  	adapter->flags2 &= ~FLAG2_IS_DISCARDING;  	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);  	else  		writel(0, rx_ring->tail); @@ -1749,6 +1786,7 @@ static irqreturn_t e1000_intr_msi(int __always_unused irq, void *data)  		    adapter->flags & FLAG_RX_NEEDS_RESTART) {  			/* disable receives */  			u32 rctl = er32(RCTL); +  			ew32(RCTL, rctl & ~E1000_RCTL_EN);  			adapter->flags |= FLAG_RESTART_NOW;  		} @@ -1956,6 +1994,7 @@ static void e1000_configure_msix(struct e1000_adapter *adapter)  	/* Workaround issue with spurious interrupts on 82574 in MSI-X mode */  	if (hw->mac.type == e1000_82574) {  		u32 rfctl = er32(RFCTL); +  		rfctl |= E1000_RFCTL_ACK_DIS;  		ew32(RFCTL, rfctl);  	} @@ -2038,13 +2077,16 @@ void e1000e_set_interrupt_capability(struct e1000_adapter *adapter)  							       msix_entry),  							GFP_KERNEL);  			if (adapter->msix_entries) { +				struct e1000_adapter *a = adapter; +  				for (i = 0; i < adapter->num_vectors; i++)  					adapter->msix_entries[i].entry = i; -				err = pci_enable_msix(adapter->pdev, -						      adapter->msix_entries, -						      adapter->num_vectors); -				if (err == 0) +				err = pci_enable_msix_range(a->pdev, +							    a->msix_entries, +							    a->num_vectors, +							    a->num_vectors); +				if (err > 0)  					return;  			}  			/* MSI-X failed, so fall through and try MSI */ @@ -2197,6 +2239,7 @@ static void e1000_irq_disable(struct e1000_adapter *adapter)  	if (adapter->msix_entries) {  		int i; +  		for (i = 0; i < adapter->num_vectors; i++)  			synchronize_irq(adapter->msix_entries[i].vector);  	} else { @@ -2402,7 +2445,7 @@ static void e1000_clean_tx_ring(struct e1000_ring *tx_ring)  	tx_ring->next_to_clean = 0;  	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);  	else  		writel(0, tx_ring->tail); @@ -2894,7 +2937,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)  	struct e1000_hw *hw = &adapter->hw;  	struct e1000_ring *tx_ring = adapter->tx_ring;  	u64 tdba; -	u32 tdlen, tarc; +	u32 tdlen, tctl, tarc;  	/* Setup the HW Tx Head and Tail descriptor pointers */  	tdba = tx_ring->dma; @@ -2914,6 +2957,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)  	if (adapter->flags2 & FLAG2_DMA_BURST) {  		u32 txdctl = er32(TXDCTL(0)); +  		txdctl &= ~(E1000_TXDCTL_PTHRESH | E1000_TXDCTL_HTHRESH |  			    E1000_TXDCTL_WTHRESH);  		/* set up some performance related parameters to encourage the @@ -2931,6 +2975,12 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)  	/* erratum work around: set txdctl the same for both queues */  	ew32(TXDCTL(1), er32(TXDCTL(0))); +	/* Program the Transmit Control Register */ +	tctl = er32(TCTL); +	tctl &= ~E1000_TCTL_CT; +	tctl |= E1000_TCTL_PSP | E1000_TCTL_RTLC | +		(E1000_COLLISION_THRESHOLD << E1000_CT_SHIFT); +  	if (adapter->flags & FLAG_TARC_SPEED_MODE_BIT) {  		tarc = er32(TARC(0));  		/* set the speed mode bit, we'll clear it if we're not at @@ -2961,6 +3011,8 @@ static void e1000_configure_tx(struct e1000_adapter *adapter)  	/* enable Report Status bit */  	adapter->txd_cmd |= E1000_TXD_CMD_RS; +	ew32(TCTL, tctl); +  	hw->mac.ops.config_collision_dist(hw);  } @@ -2976,11 +3028,21 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)  	u32 rctl, rfctl;  	u32 pages = 0; -	/* Workaround Si errata on PCHx - configure jumbo frame flow */ -	if ((hw->mac.type >= e1000_pch2lan) && -	    (adapter->netdev->mtu > ETH_DATA_LEN) && -	    e1000_lv_jumbo_workaround_ich8lan(hw, true)) -		e_dbg("failed to enable jumbo frame workaround mode\n"); +	/* Workaround Si errata on PCHx - configure jumbo frame flow. +	 * If jumbo frames not set, program related MAC/PHY registers +	 * to h/w defaults +	 */ +	if (hw->mac.type >= e1000_pch2lan) { +		s32 ret_val; + +		if (adapter->netdev->mtu > ETH_DATA_LEN) +			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); +		else +			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); + +		if (ret_val) +			e_dbg("failed to enable|disable jumbo frame workaround mode\n"); +	}  	/* Program MC offset vector base */  	rctl = er32(RCTL); @@ -3214,6 +3276,7 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)  		if (adapter->flags & FLAG_IS_ICH) {  			u32 rxdctl = er32(RXDCTL(0)); +  			ew32(RXDCTL(0), rxdctl | 0x3);  		} @@ -3278,9 +3341,11 @@ static int e1000e_write_uc_addr_list(struct net_device *netdev)  {  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw; -	unsigned int rar_entries = hw->mac.rar_entry_count; +	unsigned int rar_entries;  	int count = 0; +	rar_entries = hw->mac.ops.rar_get_count(hw); +  	/* save a rar entry for our hardware address */  	rar_entries--; @@ -3299,9 +3364,13 @@ static int e1000e_write_uc_addr_list(struct net_device *netdev)  		 * combining  		 */  		netdev_for_each_uc_addr(ha, netdev) { +			int rval; +  			if (!rar_entries)  				break; -			hw->mac.ops.rar_set(hw, ha->addr, rar_entries--); +			rval = hw->mac.ops.rar_set(hw, ha->addr, rar_entries--); +			if (rval < 0) +				return -ENOMEM;  			count++;  		}  	} @@ -3331,6 +3400,9 @@ static void e1000e_set_rx_mode(struct net_device *netdev)  	struct e1000_hw *hw = &adapter->hw;  	u32 rctl; +	if (pm_runtime_suspended(netdev->dev.parent)) +		return; +  	/* Check for Promiscuous and All Multicast modes */  	rctl = er32(RCTL); @@ -3482,10 +3554,10 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca)   * specified. Matching the kind of event packet is not supported, with the   * exception of "all V2 events regardless of level 2 or 4".   **/ -static int e1000e_config_hwtstamp(struct e1000_adapter *adapter) +static int e1000e_config_hwtstamp(struct e1000_adapter *adapter, +				  struct hwtstamp_config *config)  {  	struct e1000_hw *hw = &adapter->hw; -	struct hwtstamp_config *config = &adapter->hwtstamp_config;  	u32 tsync_tx_ctl = E1000_TSYNCTXCTL_ENABLED;  	u32 tsync_rx_ctl = E1000_TSYNCRXCTL_ENABLED;  	u32 rxmtrl = 0; @@ -3586,6 +3658,8 @@ static int e1000e_config_hwtstamp(struct e1000_adapter *adapter)  		return -ERANGE;  	} +	adapter->hwtstamp_config = *config; +  	/* enable/disable Tx h/w time stamping */  	regval = er32(TSYNCTXCTL);  	regval &= ~E1000_TSYNCTXCTL_ENABLED; @@ -3689,10 +3763,6 @@ void e1000e_power_up_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)  		adapter->hw.phy.ops.power_down(&adapter->hw);  } @@ -3874,7 +3944,7 @@ void e1000e_reset(struct e1000_adapter *adapter)  	e1000e_reset_adaptive(hw);  	/* initialize systim and reset the ns time counter */ -	e1000e_config_hwtstamp(adapter); +	e1000e_config_hwtstamp(adapter, &adapter->hwtstamp_config);  	/* Set EEE advertisement as appropriate */  	if (adapter->flags2 & FLAG2_HAS_EEE) { @@ -3909,10 +3979,8 @@ void e1000e_reset(struct e1000_adapter *adapter)  	}  	if (!netif_running(adapter->netdev) && -	    !test_bit(__E1000_TESTING, &adapter->state)) { +	    !test_bit(__E1000_TESTING, &adapter->state))  		e1000_power_down_phy(adapter); -		return; -	}  	e1000_get_phy_info(hw); @@ -3979,7 +4047,12 @@ static void e1000e_flush_descriptors(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 e1000_hw *hw = &adapter->hw; @@ -4033,12 +4106,8 @@ void e1000e_down(struct e1000_adapter *adapter)  	    e1000_lv_jumbo_workaround_ich8lan(hw, false))  		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); - -	/* TODO: for power management, we could drop the link and -	 * pci_disable_device here. -	 */  }  void e1000e_reinit_locked(struct e1000_adapter *adapter) @@ -4046,7 +4115,7 @@ void e1000e_reinit_locked(struct e1000_adapter *adapter)  	might_sleep();  	while (test_and_set_bit(__E1000_RESETTING, &adapter->state))  		usleep_range(1000, 2000); -	e1000e_down(adapter); +	e1000e_down(adapter, true);  	e1000e_up(adapter);  	clear_bit(__E1000_RESETTING, &adapter->state);  } @@ -4060,12 +4129,37 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)  	struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,  						     cc);  	struct e1000_hw *hw = &adapter->hw; -	cycle_t systim; +	cycle_t systim, systim_next;  	/* latch SYSTIMH on read of SYSTIML */  	systim = (cycle_t)er32(SYSTIML);  	systim |= (cycle_t)er32(SYSTIMH) << 32; +	if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) { +		u64 incvalue, time_delta, rem, temp; +		int i; + +		/* errata for 82574/82583 possible bad bits read from SYSTIMH/L +		 * check to see that the time is incrementing at a reasonable +		 * rate and is a multiple of incvalue +		 */ +		incvalue = er32(TIMINCA) & E1000_TIMINCA_INCVALUE_MASK; +		for (i = 0; i < E1000_MAX_82574_SYSTIM_REREADS; i++) { +			/* latch SYSTIMH on read of SYSTIML */ +			systim_next = (cycle_t)er32(SYSTIML); +			systim_next |= (cycle_t)er32(SYSTIMH) << 32; + +			time_delta = systim_next - systim; +			temp = time_delta; +			rem = do_div(temp, incvalue); + +			systim = systim_next; + +			if ((time_delta < E1000_82574_SYSTIM_EPSILON) && +			    (rem == 0)) +				break; +		} +	}  	return systim;  } @@ -4324,7 +4418,6 @@ static int e1000_open(struct net_device *netdev)  	adapter->tx_hang_recheck = false;  	netif_start_queue(netdev); -	adapter->idle_check = true;  	hw->mac.get_link_status = true;  	pm_runtime_put(&pdev->dev); @@ -4374,14 +4467,15 @@ static int e1000_close(struct net_device *netdev)  	pm_runtime_get_sync(&pdev->dev);  	if (!test_bit(__E1000_DOWN, &adapter->state)) { -		e1000e_down(adapter); +		e1000e_down(adapter, true);  		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); -	e1000_power_down_phy(adapter); -  	e1000e_free_tx_resources(adapter->tx_ring);  	e1000e_free_rx_resources(adapter->rx_ring); @@ -4458,11 +4552,16 @@ static void e1000e_update_phy_task(struct work_struct *work)  	struct e1000_adapter *adapter = container_of(work,  						     struct e1000_adapter,  						     update_phy_task); +	struct e1000_hw *hw = &adapter->hw;  	if (test_bit(__E1000_DOWN, &adapter->state))  		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);  }  /** @@ -4665,6 +4764,7 @@ static void e1000e_update_stats(struct e1000_adapter *adapter)  	/* Correctable ECC Errors */  	if (hw->mac.type == e1000_pch_lpt) {  		u32 pbeccsts = er32(PBECCSTS); +  		adapter->corr_errors +=  		    pbeccsts & E1000_PBECCSTS_CORR_ERR_CNT_MASK;  		adapter->uncorr_errors += @@ -4778,6 +4878,7 @@ static void e1000e_enable_receives(struct e1000_adapter *adapter)  	    (adapter->flags & FLAG_RESTART_NOW)) {  		struct e1000_hw *hw = &adapter->hw;  		u32 rctl = er32(RCTL); +  		ew32(RCTL, rctl | E1000_RCTL_EN);  		adapter->flags &= ~FLAG_RESTART_NOW;  	} @@ -4797,6 +4898,7 @@ static void e1000e_check_82574_phy_workaround(struct e1000_adapter *adapter)  	if (adapter->phy_hang_count > 1) {  		adapter->phy_hang_count = 0; +		e_dbg("PHY appears hung - resetting\n");  		schedule_work(&adapter->reset_task);  	}  } @@ -4868,7 +4970,7 @@ static void e1000_watchdog_task(struct work_struct *work)  			 */  			if ((hw->phy.type == e1000_phy_igp_3 ||  			     hw->phy.type == e1000_phy_bm) && -			    (hw->mac.autoneg == true) && +			    hw->mac.autoneg &&  			    (adapter->link_speed == SPEED_10 ||  			     adapter->link_speed == SPEED_100) &&  			    (adapter->link_duplex == HALF_DUPLEX)) { @@ -4899,6 +5001,7 @@ static void e1000_watchdog_task(struct work_struct *work)  			if ((adapter->flags & FLAG_TARC_SPEED_MODE_BIT) &&  			    !txb2b) {  				u32 tarc0; +  				tarc0 = er32(TARC(0));  				tarc0 &= ~SPEED_MODE_BIT;  				ew32(TARC(0), tarc0); @@ -4955,15 +5058,11 @@ static void e1000_watchdog_task(struct work_struct *work)  				mod_timer(&adapter->phy_info_timer,  					  round_jiffies(jiffies + 2 * HZ)); -			/* The link is lost so the controller stops DMA. -			 * If there is queued Tx work that cannot be done -			 * or if on an 8000ES2LAN which requires a Rx packet -			 * buffer work-around on link down event, reset the -			 * controller to flush the Tx/Rx packet buffers. -			 * (Do the reset outside of interrupt context). +			/* 8000ES2LAN requires a Rx packet buffer work-around +			 * on link down event; reset the controller to flush +			 * the Rx packet buffer.  			 */ -			if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || -			    (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) +			if (adapter->flags & FLAG_RX_NEEDS_RESTART)  				adapter->flags |= FLAG_RESTART_NOW;  			else  				pm_schedule_suspend(netdev->dev.parent, @@ -4986,6 +5085,15 @@ link_up:  	adapter->gotc_old = adapter->stats.gotc;  	spin_unlock(&adapter->stats64_lock); +	/* If the link is lost the controller stops DMA, but +	 * if there is queued Tx work it cannot be done.  So +	 * reset the controller to flush the Tx packet buffers. +	 */ +	if (!netif_carrier_ok(netdev) && +	    (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) +		adapter->flags |= FLAG_RESTART_NOW; + +	/* If reset is necessary, do it outside of interrupt context. */  	if (adapter->flags & FLAG_RESTART_NOW) {  		schedule_work(&adapter->reset_task);  		/* return immediately since reset is imminent */ @@ -5064,16 +5172,14 @@ static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb)  	u32 cmd_length = 0;  	u16 ipcse = 0, mss;  	u8 ipcss, ipcso, tucss, tucso, hdr_len; +	int err;  	if (!skb_is_gso(skb))  		return 0; -	if (skb_header_cloned(skb)) { -		int err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC); - -		if (err) -			return err; -	} +	err = skb_cow_head(skb, 0); +	if (err < 0) +		return err;  	hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);  	mss = skb_shinfo(skb)->gso_size; @@ -5136,7 +5242,7 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb)  	__be16 protocol;  	if (skb->ip_summed != CHECKSUM_PARTIAL) -		return 0; +		return false;  	if (skb->protocol == cpu_to_be16(ETH_P_8021Q))  		protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; @@ -5181,7 +5287,7 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb)  		i = 0;  	tx_ring->next_to_use = i; -	return 1; +	return true;  }  static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb, @@ -5544,6 +5650,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  			skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;  			tx_flags |= E1000_TX_FLAGS_HWTSTAMP;  			adapter->tx_hwtstamp_skb = skb_get(skb); +			adapter->tx_hwtstamp_start = jiffies;  			schedule_work(&adapter->tx_hwtstamp_work);  		} else {  			skb_tx_timestamp(skb); @@ -5652,7 +5759,7 @@ struct rtnl_link_stats64 *e1000e_get_stats64(struct net_device *netdev,  static int e1000_change_mtu(struct net_device *netdev, int new_mtu)  {  	struct e1000_adapter *adapter = netdev_priv(netdev); -	int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; +	int max_frame = new_mtu + VLAN_HLEN + ETH_HLEN + ETH_FCS_LEN;  	/* Jumbo frame support */  	if ((max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) && @@ -5682,8 +5789,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)  	adapter->max_frame_size = max_frame;  	e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);  	netdev->mtu = new_mtu; + +	pm_runtime_get_sync(netdev->dev.parent); +  	if (netif_running(netdev)) -		e1000e_down(adapter); +		e1000e_down(adapter, true);  	/* 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 @@ -5709,6 +5819,8 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)  	else  		e1000e_reset(adapter); +	pm_runtime_put_sync(netdev->dev.parent); +  	clear_bit(__E1000_RESETTING, &adapter->state);  	return 0; @@ -5788,7 +5900,7 @@ static int e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr,   * specified. Matching the kind of event packet is not supported, with the   * exception of "all V2 events regardless of level 2 or 4".   **/ -static int e1000e_hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr) +static int e1000e_hwtstamp_set(struct net_device *netdev, struct ifreq *ifr)  {  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct hwtstamp_config config; @@ -5797,14 +5909,10 @@ static int e1000e_hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr)  	if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))  		return -EFAULT; -	adapter->hwtstamp_config = config; - -	ret_val = e1000e_config_hwtstamp(adapter); +	ret_val = e1000e_config_hwtstamp(adapter, &config);  	if (ret_val)  		return ret_val; -	config = adapter->hwtstamp_config; -  	switch (config.rx_filter) {  	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:  	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: @@ -5827,6 +5935,14 @@ static int e1000e_hwtstamp_ioctl(struct net_device *netdev, struct ifreq *ifr)  			    sizeof(config)) ? -EFAULT : 0;  } +static int e1000e_hwtstamp_get(struct net_device *netdev, struct ifreq *ifr) +{ +	struct e1000_adapter *adapter = netdev_priv(netdev); + +	return copy_to_user(ifr->ifr_data, &adapter->hwtstamp_config, +			    sizeof(adapter->hwtstamp_config)) ? -EFAULT : 0; +} +  static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)  {  	switch (cmd) { @@ -5835,7 +5951,9 @@ static int e1000_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)  	case SIOCSMIIREG:  		return e1000_mii_ioctl(netdev, ifr, cmd);  	case SIOCSHWTSTAMP: -		return e1000e_hwtstamp_ioctl(netdev, ifr); +		return e1000e_hwtstamp_set(netdev, ifr); +	case SIOCGHWTSTAMP: +		return e1000e_hwtstamp_get(netdev, ifr);  	default:  		return -EOPNOTSUPP;  	} @@ -5844,7 +5962,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)  {  	struct e1000_hw *hw = &adapter->hw; -	u32 i, mac_reg; +	u32 i, mac_reg, wuc;  	u16 phy_reg, wuc_enable;  	int retval; @@ -5891,13 +6009,18 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)  		phy_reg |= BM_RCTL_RFCE;  	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 */  	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 */  	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 */  	wuc_enable |= BM_WUC_ENABLE_BIT | BM_WUC_HOST_WU_BIT; @@ -5910,15 +6033,10 @@ release:  	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_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); @@ -5929,11 +6047,29 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)  			usleep_range(10000, 20000);  		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);  	}  	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);  	if (status & E1000_STATUS_LU)  		wufc &= ~E1000_WUFC_LNKC; @@ -5964,12 +6100,12 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)  			ew32(CTRL_EXT, ctrl_ext);  		} +		if (!runtime) +			e1000e_power_up_phy(adapter); +  		if (adapter->flags & FLAG_IS_ICH)  			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) {  			/* enable wakeup by the PHY */  			retval = e1000_init_phy_wakeup(adapter, wufc); @@ -5983,10 +6119,23 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)  	} else {  		ew32(WUC, 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); +	} 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  	 * would have already happened in close and is redundant. @@ -6094,18 +6243,12 @@ static void e1000e_disable_aspm(struct pci_dev *pdev, u16 state)  }  #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)  {  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct e1000_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw;  	u16 aspm_disable_flag = 0; -	u32 err;  	if (adapter->flags2 & FLAG2_DISABLE_ASPM_L0S)  		aspm_disable_flag = PCIE_LINK_STATE_L0S; @@ -6116,13 +6259,6 @@ static int __e1000_resume(struct pci_dev *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)  		e1000_resume_workarounds_pchlan(&adapter->hw); @@ -6145,6 +6281,7 @@ static int __e1000_resume(struct pci_dev *pdev)  		e1e_wphy(&adapter->hw, BM_WUS, ~0);  	} else {  		u32 wus = er32(WUS); +  		if (wus) {  			e_info("MAC Wakeup cause - %s\n",  			       wus & E1000_WUS_EX ? "Unicast Packet" : @@ -6161,11 +6298,6 @@ static int __e1000_resume(struct pci_dev *pdev)  	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  	 * is up.  For all other cases, let the f/w know that the h/w is now  	 * under the control of the driver. @@ -6177,74 +6309,110 @@ static int __e1000_resume(struct pci_dev *pdev)  }  #ifdef CONFIG_PM_SLEEP -static int e1000_suspend(struct device *dev) +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; +} + +static int e1000e_pm_suspend(struct device *dev)  {  	struct pci_dev *pdev = to_pci_dev(dev); +	e1000e_pm_freeze(dev); +  	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 net_device *netdev = pci_get_drvdata(pdev); -	struct e1000_adapter *adapter = netdev_priv(netdev); +	int rc; -	if (e1000e_pm_ready(adapter)) -		adapter->idle_check = true; +	rc = __e1000_resume(pdev); +	if (rc) +		return rc; -	return __e1000_resume(pdev); +	return e1000e_pm_thaw(dev);  }  #endif /* CONFIG_PM_SLEEP */  #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 net_device *netdev = pci_get_drvdata(pdev);  	struct e1000_adapter *adapter = netdev_priv(netdev); -	if (!e1000e_pm_ready(adapter)) -		return 0; +	if (!e1000e_has_link(adapter)) +		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 net_device *netdev = pci_get_drvdata(pdev);  	struct e1000_adapter *adapter = netdev_priv(netdev); +	int rc; -	if (!e1000e_pm_ready(adapter)) -		return 0; +	rc = __e1000_resume(pdev); +	if (rc) +		return rc; -	if (adapter->idle_check) { -		adapter->idle_check = false; -		if (!e1000e_has_link(adapter)) -			pm_schedule_suspend(dev, MSEC_PER_SEC); -	} +	if (netdev->flags & IFF_UP) +		rc = e1000e_up(adapter); -	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 net_device *netdev = pci_get_drvdata(pdev);  	struct e1000_adapter *adapter = netdev_priv(netdev); -	if (!e1000e_pm_ready(adapter)) -		return 0; +	if (netdev->flags & IFF_UP) { +		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)); -	adapter->idle_check = !dev->power.runtime_auto; -	return __e1000_resume(pdev); +		/* Down the device without resetting the hardware */ +		e1000e_down(adapter, false); +	} + +	if (__e1000_shutdown(pdev, true)) { +		e1000e_pm_runtime_resume(dev); +		return -EBUSY; +	} + +	return 0;  }  #endif /* CONFIG_PM_RUNTIME */  #endif /* CONFIG_PM */  static void e1000_shutdown(struct pci_dev *pdev)  { +	e1000e_pm_freeze(&pdev->dev); +  	__e1000_shutdown(pdev, false);  } @@ -6330,7 +6498,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,  		return PCI_ERS_RESULT_DISCONNECT;  	if (netif_running(netdev)) -		e1000e_down(adapter); +		e1000e_down(adapter, true);  	pci_disable_device(pdev);  	/* Request a slot slot reset. */ @@ -6342,7 +6510,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,   * @pdev: Pointer to PCI device   *   * 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)  { @@ -6389,7 +6557,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   * 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)  { @@ -6553,21 +6721,15 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  		return err;  	pci_using_dac = 0; -	err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); +	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));  	if (!err) { -		err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); -		if (!err) -			pci_using_dac = 1; +		pci_using_dac = 1;  	} else { -		err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); +		err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));  		if (err) { -			err = dma_set_coherent_mask(&pdev->dev, -						    DMA_BIT_MASK(32)); -			if (err) { -				dev_err(&pdev->dev, -					"No usable DMA configuration, aborting\n"); -				goto err_dma; -			} +			dev_err(&pdev->dev, +				"No usable DMA configuration, aborting\n"); +			goto err_dma;  		}  	} @@ -6900,9 +7062,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. */  	if (!down)  		clear_bit(__E1000_DOWN, &adapter->state); @@ -6941,7 +7100,7 @@ static const struct pci_error_handlers e1000_err_handler = {  	.resume = e1000_io_resume,  }; -static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { +static const struct pci_device_id e1000_pci_tbl[] = {  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_COPPER), board_82571 },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_FIBER), board_82571 },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_82571EB_QUAD_COPPER), board_82571 }, @@ -7023,13 +7182,18 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {  };  MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); -#ifdef CONFIG_PM  static const struct dev_pm_ops e1000_pm_ops = { -	SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume) -	SET_RUNTIME_PM_OPS(e1000_runtime_suspend, e1000_runtime_resume, -			   e1000_idle) -}; +#ifdef CONFIG_PM_SLEEP +	.suspend	= e1000e_pm_suspend, +	.resume		= e1000e_pm_resume, +	.freeze		= e1000e_pm_freeze, +	.thaw		= e1000e_pm_thaw, +	.poweroff	= e1000e_pm_suspend, +	.restore	= e1000e_pm_resume,  #endif +	SET_RUNTIME_PM_OPS(e1000e_pm_runtime_suspend, e1000e_pm_runtime_resume, +			   e1000e_pm_runtime_idle) +};  /* PCI Device API Driver */  static struct pci_driver e1000_driver = { @@ -7037,11 +7201,9 @@ static struct pci_driver e1000_driver = {  	.id_table = e1000_pci_tbl,  	.probe    = e1000_probe,  	.remove   = e1000_remove, -#ifdef CONFIG_PM  	.driver   = {  		.pm = &e1000_pm_ops,  	}, -#endif  	.shutdown = e1000_shutdown,  	.err_handler = &e1000_err_handler  }; @@ -7055,9 +7217,10 @@ static struct pci_driver e1000_driver = {  static int __init e1000_init_module(void)  {  	int ret; +  	pr_info("Intel(R) PRO/1000 Network Driver - %s\n",  		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);  	return ret; diff --git a/drivers/net/ethernet/intel/e1000e/nvm.c b/drivers/net/ethernet/intel/e1000e/nvm.c index d70a03906ac..b1f212b7baf 100644 --- a/drivers/net/ethernet/intel/e1000e/nvm.c +++ b/drivers/net/ethernet/intel/e1000e/nvm.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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" @@ -405,6 +398,7 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)  		/* Loop to allow for up to whole page write of eeprom */  		while (widx < words) {  			u16 word_out = data[widx]; +  			word_out = (word_out >> 8) | (word_out << 8);  			e1000_shift_out_eec_bits(hw, word_out, 16);  			widx++; diff --git a/drivers/net/ethernet/intel/e1000e/nvm.h b/drivers/net/ethernet/intel/e1000e/nvm.h index 45fc6956162..342bf69efab 100644 --- a/drivers/net/ethernet/intel/e1000e/nvm.h +++ b/drivers/net/ethernet/intel/e1000e/nvm.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_NVM_H_ diff --git a/drivers/net/ethernet/intel/e1000e/param.c b/drivers/net/ethernet/intel/e1000e/param.c index c16bd75b6ca..aa1923f7ebd 100644 --- a/drivers/net/ethernet/intel/e1000e/param.c +++ b/drivers/net/ethernet/intel/e1000e/param.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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/module.h> @@ -381,6 +374,12 @@ void e1000e_check_options(struct e1000_adapter *adapter)  				 "%s set to dynamic mode\n", opt.name);  			adapter->itr = 20000;  			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:  			dev_info(&adapter->pdev->dev,  				 "%s set to dynamic conservative mode\n", @@ -437,6 +436,7 @@ void e1000e_check_options(struct e1000_adapter *adapter)  		if (num_IntMode > bd) {  			unsigned int int_mode = IntMode[bd]; +  			e1000_validate_option(&int_mode, &opt, adapter);  			adapter->int_mode = int_mode;  		} else { @@ -458,6 +458,7 @@ void e1000e_check_options(struct e1000_adapter *adapter)  		if (num_SmartPowerDownEnable > bd) {  			unsigned int spd = SmartPowerDownEnable[bd]; +  			e1000_validate_option(&spd, &opt, adapter);  			if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) && spd)  				adapter->flags |= FLAG_SMART_POWER_DOWN; @@ -474,6 +475,7 @@ void e1000e_check_options(struct e1000_adapter *adapter)  		if (num_CrcStripping > bd) {  			unsigned int crc_stripping = CrcStripping[bd]; +  			e1000_validate_option(&crc_stripping, &opt, adapter);  			if (crc_stripping == OPTION_ENABLED) {  				adapter->flags2 |= FLAG2_CRC_STRIPPING; @@ -496,6 +498,7 @@ void e1000e_check_options(struct e1000_adapter *adapter)  		if (num_KumeranLockLoss > bd) {  			unsigned int kmrn_lock_loss = KumeranLockLoss[bd]; +  			e1000_validate_option(&kmrn_lock_loss, &opt, adapter);  			enabled = kmrn_lock_loss;  		} diff --git a/drivers/net/ethernet/intel/e1000e/phy.c b/drivers/net/ethernet/intel/e1000e/phy.c index da2be59505c..b2005e13fb0 100644 --- a/drivers/net/ethernet/intel/e1000e/phy.c +++ b/drivers/net/ethernet/intel/e1000e/phy.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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" @@ -1757,19 +1750,23 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations,  		 * it across the board.  		 */  		ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); -		if (ret_val) +		if (ret_val) {  			/* If the first read fails, another entity may have  			 * ownership of the resources, wait and try again to  			 * see if they have relinquished the resources yet.  			 */ -			udelay(usec_interval); +			if (usec_interval >= 1000) +				msleep(usec_interval / 1000); +			else +				udelay(usec_interval); +		}  		ret_val = e1e_rphy(hw, MII_BMSR, &phy_status);  		if (ret_val)  			break;  		if (phy_status & BMSR_LSTATUS)  			break;  		if (usec_interval >= 1000) -			mdelay(usec_interval / 1000); +			msleep(usec_interval / 1000);  		else  			udelay(usec_interval);  	} @@ -2899,6 +2896,7 @@ static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data,  		    (hw->phy.addr == 2) &&  		    !(MAX_PHY_REG_ADDRESS & reg) && (data & (1 << 11))) {  			u16 data2 = 0x7EFF; +  			ret_val = e1000_access_phy_debug_regs_hv(hw,  								 (1 << 6) | 0x3,  								 &data2, false); diff --git a/drivers/net/ethernet/intel/e1000e/phy.h b/drivers/net/ethernet/intel/e1000e/phy.h index f4f71b9991e..537d2780b40 100644 --- a/drivers/net/ethernet/intel/e1000e/phy.h +++ b/drivers/net/ethernet/intel/e1000e/phy.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_PHY_H_ @@ -171,6 +164,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw);  #define HV_M_STATUS_AUTONEG_COMPLETE	0x1000  #define HV_M_STATUS_SPEED_MASK		0x0300  #define HV_M_STATUS_SPEED_1000		0x0200 +#define HV_M_STATUS_SPEED_100		0x0100  #define HV_M_STATUS_LINK_UP		0x0040  #define IGP01E1000_PHY_PCS_INIT_REG	0x00B4 diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c index 065f8c80d4f..fb1a914a3ad 100644 --- a/drivers/net/ethernet/intel/e1000e/ptp.c +++ b/drivers/net/ethernet/intel/e1000e/ptp.c @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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)   * 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)  						     ptp_clock_info);  	struct e1000_hw *hw = &adapter->hw;  	bool neg_adj = false; +	unsigned long flags;  	u64 adjustment;  	u32 timinca, incvalue;  	s32 ret_val; @@ -64,6 +58,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)  	if (ret_val)  		return ret_val; +	spin_lock_irqsave(&adapter->systim_lock, flags); +  	incvalue = timinca & E1000_TIMINCA_INCVALUE_MASK;  	adjustment = incvalue; @@ -77,6 +73,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)  	ew32(TIMINCA, timinca); +	spin_unlock_irqrestore(&adapter->systim_lock, flags); +  	return 0;  } @@ -191,6 +189,7 @@ static const struct ptp_clock_info e1000e_ptp_clock_info = {  	.n_alarm	= 0,  	.n_ext_ts	= 0,  	.n_per_out	= 0, +	.n_pins		= 0,  	.pps		= 0,  	.adjfreq	= e1000e_phc_adjfreq,  	.adjtime	= e1000e_phc_adjtime, diff --git a/drivers/net/ethernet/intel/e1000e/regs.h b/drivers/net/ethernet/intel/e1000e/regs.h index a7e6a3e3725..ea235bbe50d 100644 --- a/drivers/net/ethernet/intel/e1000e/regs.h +++ b/drivers/net/ethernet/intel/e1000e/regs.h @@ -1,30 +1,23 @@ -/******************************************************************************* - -  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, -  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 -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  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., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  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 - -*******************************************************************************/ +/* Intel PRO/1000 Linux driver + * Copyright(c) 1999 - 2014 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, + * 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 + * 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". + * + * 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_  #define _E1000E_REGS_H_ @@ -39,6 +32,7 @@  #define E1000_SCTL	0x00024	/* SerDes Control - RW */  #define E1000_FCAL	0x00028	/* Flow Control Address Low - 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_FEXTNVM3	0x0003C	/* Future Extended NVM 3 - RW */  #define E1000_FEXTNVM4	0x00024	/* Future Extended NVM 4 - RW */  | 
