diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 785 | 
1 files changed, 564 insertions, 221 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 8cf44f2a8cc..a9537ba7a5a 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -1,29 +1,25 @@ -/******************************************************************************* - -  Intel(R) Gigabit Ethernet Linux driver -  Copyright(c) 2007-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: -  e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> -  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 - -*******************************************************************************/ +/* Intel(R) Gigabit Ethernet Linux driver + * Copyright(c) 2007-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. + * + * 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". + * + * Contact Information: + * 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 @@ -70,13 +66,13 @@ char igb_driver_version[] = DRV_VERSION;  static const char igb_driver_string[] =  				"Intel(R) Gigabit Ethernet Network Driver";  static const char igb_copyright[] = -				"Copyright (c) 2007-2013 Intel Corporation."; +				"Copyright (c) 2007-2014 Intel Corporation.";  static const struct e1000_info *igb_info_tbl[] = {  	[board_82575] = &e1000_82575_info,  }; -static DEFINE_PCI_DEVICE_TABLE(igb_pci_tbl) = { +static const struct pci_device_id igb_pci_tbl[] = {  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_BACKPLANE_1GBPS) },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_SGMII) },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I354_BACKPLANE_2_5GBPS) }, @@ -118,7 +114,6 @@ static DEFINE_PCI_DEVICE_TABLE(igb_pci_tbl) = {  MODULE_DEVICE_TABLE(pci, igb_pci_tbl); -void igb_reset(struct igb_adapter *);  static int igb_setup_all_tx_resources(struct igb_adapter *);  static int igb_setup_all_rx_resources(struct igb_adapter *);  static void igb_free_all_tx_resources(struct igb_adapter *); @@ -142,7 +137,7 @@ static void igb_watchdog(unsigned long);  static void igb_watchdog_task(struct work_struct *);  static netdev_tx_t igb_xmit_frame(struct sk_buff *skb, struct net_device *);  static struct rtnl_link_stats64 *igb_get_stats64(struct net_device *dev, -						 struct rtnl_link_stats64 *stats); +					  struct rtnl_link_stats64 *stats);  static int igb_change_mtu(struct net_device *, int);  static int igb_set_mac(struct net_device *, void *);  static void igb_set_uta(struct igb_adapter *adapter); @@ -160,7 +155,8 @@ static bool igb_clean_rx_irq(struct igb_q_vector *, int);  static int igb_ioctl(struct net_device *, struct ifreq *, int cmd);  static void igb_tx_timeout(struct net_device *);  static void igb_reset_task(struct work_struct *); -static void igb_vlan_mode(struct net_device *netdev, netdev_features_t features); +static void igb_vlan_mode(struct net_device *netdev, +			  netdev_features_t features);  static int igb_vlan_rx_add_vid(struct net_device *, __be16, u16);  static int igb_vlan_rx_kill_vid(struct net_device *, __be16, u16);  static void igb_restore_vlan(struct igb_adapter *); @@ -173,7 +169,7 @@ static void igb_restore_vf_multicasts(struct igb_adapter *adapter);  static int igb_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac);  static int igb_ndo_set_vf_vlan(struct net_device *netdev,  			       int vf, u16 vlan, u8 qos); -static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate); +static int igb_ndo_set_vf_bw(struct net_device *, int, int, int);  static int igb_ndo_set_vf_spoofchk(struct net_device *netdev, int vf,  				   bool setting);  static int igb_ndo_get_vf_config(struct net_device *netdev, int vf, @@ -182,6 +178,7 @@ static void igb_check_vf_rate_limit(struct igb_adapter *);  #ifdef CONFIG_PCI_IOV  static int igb_vf_configure(struct igb_adapter *adapter, int vf); +static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);  #endif  #ifdef CONFIG_PM @@ -215,10 +212,9 @@ static struct notifier_block dca_notifier = {  static void igb_netpoll(struct net_device *);  #endif  #ifdef CONFIG_PCI_IOV -static unsigned int max_vfs = 0; +static unsigned int max_vfs;  module_param(max_vfs, uint, 0); -MODULE_PARM_DESC(max_vfs, "Maximum number of virtual functions to allocate " -                 "per physical function"); +MODULE_PARM_DESC(max_vfs, "Maximum number of virtual functions to allocate per physical function");  #endif /* CONFIG_PCI_IOV */  static pci_ers_result_t igb_io_error_detected(struct pci_dev *, @@ -384,8 +380,7 @@ static void igb_dump(struct igb_adapter *adapter)  	/* Print netdevice Info */  	if (netdev) {  		dev_info(&adapter->pdev->dev, "Net device Info\n"); -		pr_info("Device Name     state            trans_start      " -			"last_rx\n"); +		pr_info("Device Name     state            trans_start      last_rx\n");  		pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,  			netdev->state, netdev->trans_start, netdev->last_rx);  	} @@ -438,9 +433,7 @@ static void igb_dump(struct igb_adapter *adapter)  		pr_info("------------------------------------\n");  		pr_info("TX QUEUE INDEX = %d\n", tx_ring->queue_index);  		pr_info("------------------------------------\n"); -		pr_info("T [desc]     [address 63:0  ] [PlPOCIStDDM Ln] " -			"[bi->dma       ] leng  ntw timestamp        " -			"bi->skb\n"); +		pr_info("T [desc]     [address 63:0  ] [PlPOCIStDDM Ln] [bi->dma       ] leng  ntw timestamp        bi->skb\n");  		for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {  			const char *next_desc; @@ -458,9 +451,8 @@ static void igb_dump(struct igb_adapter *adapter)  			else  				next_desc = ""; -			pr_info("T [0x%03X]    %016llX %016llX %016llX" -				" %04X  %p %016llX %p%s\n", i, -				le64_to_cpu(u0->a), +			pr_info("T [0x%03X]    %016llX %016llX %016llX %04X  %p %016llX %p%s\n", +				i, le64_to_cpu(u0->a),  				le64_to_cpu(u0->b),  				(u64)dma_unmap_addr(buffer_info, dma),  				dma_unmap_len(buffer_info, len), @@ -519,10 +511,8 @@ rx_ring_summary:  		pr_info("------------------------------------\n");  		pr_info("RX QUEUE INDEX = %d\n", rx_ring->queue_index);  		pr_info("------------------------------------\n"); -		pr_info("R  [desc]      [ PktBuf     A0] [  HeadBuf   DD] " -			"[bi->dma       ] [bi->skb] <-- Adv Rx Read format\n"); -		pr_info("RWB[desc]      [PcsmIpSHl PtRs] [vl er S cks ln] -----" -			"----------- [bi->skb] <-- Adv Rx Write-Back format\n"); +		pr_info("R  [desc]      [ PktBuf     A0] [  HeadBuf   DD] [bi->dma       ] [bi->skb] <-- Adv Rx Read format\n"); +		pr_info("RWB[desc]      [PcsmIpSHl PtRs] [vl er S cks ln] ---------------- [bi->skb] <-- Adv Rx Write-Back format\n");  		for (i = 0; i < rx_ring->count; i++) {  			const char *next_desc; @@ -584,7 +574,7 @@ static int igb_get_i2c_data(void *data)  	struct e1000_hw *hw = &adapter->hw;  	s32 i2cctl = rd32(E1000_I2CPARAMS); -	return ((i2cctl & E1000_I2C_DATA_IN) != 0); +	return !!(i2cctl & E1000_I2C_DATA_IN);  }  /** @@ -648,7 +638,7 @@ static int igb_get_i2c_clk(void *data)  	struct e1000_hw *hw = &adapter->hw;  	s32 i2cctl = rd32(E1000_I2CPARAMS); -	return ((i2cctl & E1000_I2C_CLK_IN) != 0); +	return !!(i2cctl & E1000_I2C_CLK_IN);  }  static const struct i2c_algo_bit_data igb_i2c_algo = { @@ -681,9 +671,9 @@ struct net_device *igb_get_hw_dev(struct e1000_hw *hw)  static int __init igb_init_module(void)  {  	int ret; +  	pr_info("%s - version %s\n",  	       igb_driver_string, igb_driver_version); -  	pr_info("%s\n", igb_copyright);  #ifdef CONFIG_IGB_DCA @@ -736,12 +726,14 @@ static void igb_cache_ring_register(struct igb_adapter *adapter)  				adapter->rx_ring[i]->reg_idx = rbase_offset +  							       Q_IDX_82576(i);  		} +		/* Fall through */  	case e1000_82575:  	case e1000_82580:  	case e1000_i350:  	case e1000_i354:  	case e1000_i210:  	case e1000_i211: +		/* Fall through */  	default:  		for (; i < adapter->num_rx_queues; i++)  			adapter->rx_ring[i]->reg_idx = rbase_offset + i; @@ -751,6 +743,28 @@ static void igb_cache_ring_register(struct igb_adapter *adapter)  	}  } +u32 igb_rd32(struct e1000_hw *hw, u32 reg) +{ +	struct igb_adapter *igb = container_of(hw, struct igb_adapter, hw); +	u8 __iomem *hw_addr = ACCESS_ONCE(hw->hw_addr); +	u32 value = 0; + +	if (E1000_REMOVED(hw_addr)) +		return ~value; + +	value = readl(&hw_addr[reg]); + +	/* reads should not return all F's */ +	if (!(~value) && (!reg || !(~readl(hw_addr)))) { +		struct net_device *netdev = igb->netdev; +		hw->hw_addr = NULL; +		netif_device_detach(netdev); +		netdev_err(netdev, "PCIe link lost, device now detached\n"); +	} + +	return value; +} +  /**   *  igb_write_ivar - configure ivar for given MSI-X vector   *  @hw: pointer to the HW structure @@ -802,7 +816,7 @@ static void igb_assign_vector(struct igb_q_vector *q_vector, int msix_vector)  			msixbm = E1000_EICR_RX_QUEUE0 << rx_queue;  		if (tx_queue > IGB_N0_QUEUE)  			msixbm |= E1000_EICR_TX_QUEUE0 << tx_queue; -		if (!adapter->msix_entries && msix_vector == 0) +		if (!(adapter->flags & IGB_FLAG_HAS_MSIX) && msix_vector == 0)  			msixbm |= E1000_EIMS_OTHER;  		array_wr32(E1000_MSIXBM(0), msix_vector, msixbm);  		q_vector->eims_value = msixbm; @@ -982,43 +996,64 @@ err_out:  	return err;  } -static void igb_reset_interrupt_capability(struct igb_adapter *adapter) -{ -	if (adapter->msix_entries) { -		pci_disable_msix(adapter->pdev); -		kfree(adapter->msix_entries); -		adapter->msix_entries = NULL; -	} else if (adapter->flags & IGB_FLAG_HAS_MSI) { -		pci_disable_msi(adapter->pdev); -	} -} -  /**   *  igb_free_q_vector - Free memory allocated for specific interrupt vector   *  @adapter: board private structure to initialize   *  @v_idx: Index of vector to be freed   * - *  This function frees the memory allocated to the q_vector.  In addition if - *  NAPI is enabled it will delete any references to the NAPI struct prior - *  to freeing the q_vector. + *  This function frees the memory allocated to the q_vector.   **/  static void igb_free_q_vector(struct igb_adapter *adapter, int v_idx)  {  	struct igb_q_vector *q_vector = adapter->q_vector[v_idx]; +	adapter->q_vector[v_idx] = NULL; + +	/* igb_get_stats64() might access the rings on this vector, +	 * we must wait a grace period before freeing it. +	 */ +	kfree_rcu(q_vector, rcu); +} + +/** + *  igb_reset_q_vector - Reset config for interrupt vector + *  @adapter: board private structure to initialize + *  @v_idx: Index of vector to be reset + * + *  If NAPI is enabled it will delete any references to the + *  NAPI struct. This is preparation for igb_free_q_vector. + **/ +static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) +{ +	struct igb_q_vector *q_vector = adapter->q_vector[v_idx]; + +	/* Coming from igb_set_interrupt_capability, the vectors are not yet +	 * allocated. So, q_vector is NULL so we should stop here. +	 */ +	if (!q_vector) +		return; +  	if (q_vector->tx.ring)  		adapter->tx_ring[q_vector->tx.ring->queue_index] = NULL;  	if (q_vector->rx.ring)  		adapter->tx_ring[q_vector->rx.ring->queue_index] = NULL; -	adapter->q_vector[v_idx] = NULL;  	netif_napi_del(&q_vector->napi); -	/* igb_get_stats64() might access the rings on this vector, -	 * we must wait a grace period before freeing it. -	 */ -	kfree_rcu(q_vector, rcu); +} + +static void igb_reset_interrupt_capability(struct igb_adapter *adapter) +{ +	int v_idx = adapter->num_q_vectors; + +	if (adapter->flags & IGB_FLAG_HAS_MSIX) +		pci_disable_msix(adapter->pdev); +	else if (adapter->flags & IGB_FLAG_HAS_MSI) +		pci_disable_msi(adapter->pdev); + +	while (v_idx--) +		igb_reset_q_vector(adapter, v_idx);  }  /** @@ -1037,8 +1072,10 @@ static void igb_free_q_vectors(struct igb_adapter *adapter)  	adapter->num_rx_queues = 0;  	adapter->num_q_vectors = 0; -	while (v_idx--) +	while (v_idx--) { +		igb_reset_q_vector(adapter, v_idx);  		igb_free_q_vector(adapter, v_idx); +	}  }  /** @@ -1069,6 +1106,7 @@ static void igb_set_interrupt_capability(struct igb_adapter *adapter, bool msix)  	if (!msix)  		goto msi_only; +	adapter->flags |= IGB_FLAG_HAS_MSIX;  	/* Number of supported queues. */  	adapter->num_rx_queues = adapter->rss_queues; @@ -1089,25 +1127,21 @@ static void igb_set_interrupt_capability(struct igb_adapter *adapter, bool msix)  	/* add 1 vector for link status interrupts */  	numvecs++; -	adapter->msix_entries = kcalloc(numvecs, sizeof(struct msix_entry), -					GFP_KERNEL); - -	if (!adapter->msix_entries) -		goto msi_only; -  	for (i = 0; i < numvecs; i++)  		adapter->msix_entries[i].entry = i; -	err = pci_enable_msix(adapter->pdev, -			      adapter->msix_entries, -			      numvecs); -	if (err == 0) +	err = pci_enable_msix_range(adapter->pdev, +				    adapter->msix_entries, +				    numvecs, +				    numvecs); +	if (err > 0)  		return;  	igb_reset_interrupt_capability(adapter);  	/* If we can't do MSI-X, try MSI */  msi_only: +	adapter->flags &= ~IGB_FLAG_HAS_MSIX;  #ifdef CONFIG_PCI_IOV  	/* disable SR-IOV for non MSI-X configurations */  	if (adapter->vf_data) { @@ -1171,7 +1205,9 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,  	       (sizeof(struct igb_ring) * ring_count);  	/* allocate q_vector and rings */ -	q_vector = kzalloc(size, GFP_KERNEL); +	q_vector = adapter->q_vector[v_idx]; +	if (!q_vector) +		q_vector = kzalloc(size, GFP_KERNEL);  	if (!q_vector)  		return -ENOMEM; @@ -1223,6 +1259,9 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,  		ring->count = adapter->tx_ring_count;  		ring->queue_index = txr_idx; +		u64_stats_init(&ring->tx_syncp); +		u64_stats_init(&ring->tx_syncp2); +  		/* assign ring to adapter */  		adapter->tx_ring[txr_idx] = ring; @@ -1245,8 +1284,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,  		if (adapter->hw.mac.type >= e1000_82576)  			set_bit(IGB_RING_FLAG_RX_SCTP_CSUM, &ring->flags); -		/* -		 * On i350, i354, i210, and i211, loopback VLAN packets +		/* On i350, i354, i210, and i211, loopback VLAN packets  		 * have the tag byte-swapped.  		 */  		if (adapter->hw.mac.type >= e1000_i350) @@ -1256,6 +1294,8 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter,  		ring->count = adapter->rx_ring_count;  		ring->queue_index = rxr_idx; +		u64_stats_init(&ring->rx_syncp); +  		/* assign ring to adapter */  		adapter->rx_ring[rxr_idx] = ring;  	} @@ -1296,6 +1336,7 @@ static int igb_alloc_q_vectors(struct igb_adapter *adapter)  	for (; v_idx < q_vectors; v_idx++) {  		int rqpv = DIV_ROUND_UP(rxr_remaining, q_vectors - v_idx);  		int tqpv = DIV_ROUND_UP(txr_remaining, q_vectors - v_idx); +  		err = igb_alloc_q_vector(adapter, q_vectors, v_idx,  					 tqpv, txr_idx, rqpv, rxr_idx); @@ -1364,7 +1405,7 @@ static int igb_request_irq(struct igb_adapter *adapter)  	struct pci_dev *pdev = adapter->pdev;  	int err = 0; -	if (adapter->msix_entries) { +	if (adapter->flags & IGB_FLAG_HAS_MSIX) {  		err = igb_request_msix(adapter);  		if (!err)  			goto request_done; @@ -1408,7 +1449,7 @@ request_done:  static void igb_free_irq(struct igb_adapter *adapter)  { -	if (adapter->msix_entries) { +	if (adapter->flags & IGB_FLAG_HAS_MSIX) {  		int vector = 0, i;  		free_irq(adapter->msix_entries[vector++].vector, adapter); @@ -1433,8 +1474,9 @@ static void igb_irq_disable(struct igb_adapter *adapter)  	 * mapped into these registers and so clearing the bits can cause  	 * issues on the VF drivers so we only need to clear what we set  	 */ -	if (adapter->msix_entries) { +	if (adapter->flags & IGB_FLAG_HAS_MSIX) {  		u32 regval = rd32(E1000_EIAM); +  		wr32(E1000_EIAM, regval & ~adapter->eims_enable_mask);  		wr32(E1000_EIMC, adapter->eims_enable_mask);  		regval = rd32(E1000_EIAC); @@ -1444,8 +1486,9 @@ static void igb_irq_disable(struct igb_adapter *adapter)  	wr32(E1000_IAM, 0);  	wr32(E1000_IMC, ~0);  	wrfl(); -	if (adapter->msix_entries) { +	if (adapter->flags & IGB_FLAG_HAS_MSIX) {  		int i; +  		for (i = 0; i < adapter->num_q_vectors; i++)  			synchronize_irq(adapter->msix_entries[i].vector);  	} else { @@ -1461,9 +1504,10 @@ static void igb_irq_enable(struct igb_adapter *adapter)  {  	struct e1000_hw *hw = &adapter->hw; -	if (adapter->msix_entries) { +	if (adapter->flags & IGB_FLAG_HAS_MSIX) {  		u32 ims = E1000_IMS_LSC | E1000_IMS_DOUTSYNC | E1000_IMS_DRSTA;  		u32 regval = rd32(E1000_EIAC); +  		wr32(E1000_EIAC, regval | adapter->eims_enable_mask);  		regval = rd32(E1000_EIAM);  		wr32(E1000_EIAM, regval | adapter->eims_enable_mask); @@ -1601,6 +1645,73 @@ static void igb_power_down_link(struct igb_adapter *adapter)  }  /** + * Detect and switch function for Media Auto Sense + * @adapter: address of the board private structure + **/ +static void igb_check_swap_media(struct igb_adapter *adapter) +{ +	struct e1000_hw *hw = &adapter->hw; +	u32 ctrl_ext, connsw; +	bool swap_now = false; + +	ctrl_ext = rd32(E1000_CTRL_EXT); +	connsw = rd32(E1000_CONNSW); + +	/* need to live swap if current media is copper and we have fiber/serdes +	 * to go to. +	 */ + +	if ((hw->phy.media_type == e1000_media_type_copper) && +	    (!(connsw & E1000_CONNSW_AUTOSENSE_EN))) { +		swap_now = true; +	} else if (!(connsw & E1000_CONNSW_SERDESD)) { +		/* copper signal takes time to appear */ +		if (adapter->copper_tries < 4) { +			adapter->copper_tries++; +			connsw |= E1000_CONNSW_AUTOSENSE_CONF; +			wr32(E1000_CONNSW, connsw); +			return; +		} else { +			adapter->copper_tries = 0; +			if ((connsw & E1000_CONNSW_PHYSD) && +			    (!(connsw & E1000_CONNSW_PHY_PDN))) { +				swap_now = true; +				connsw &= ~E1000_CONNSW_AUTOSENSE_CONF; +				wr32(E1000_CONNSW, connsw); +			} +		} +	} + +	if (!swap_now) +		return; + +	switch (hw->phy.media_type) { +	case e1000_media_type_copper: +		netdev_info(adapter->netdev, +			"MAS: changing media to fiber/serdes\n"); +		ctrl_ext |= +			E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; +		adapter->flags |= IGB_FLAG_MEDIA_RESET; +		adapter->copper_tries = 0; +		break; +	case e1000_media_type_internal_serdes: +	case e1000_media_type_fiber: +		netdev_info(adapter->netdev, +			"MAS: changing media to copper\n"); +		ctrl_ext &= +			~E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES; +		adapter->flags |= IGB_FLAG_MEDIA_RESET; +		break; +	default: +		/* shouldn't get here during regular operation */ +		netdev_err(adapter->netdev, +			"AMS: Invalid media type found, returning\n"); +		break; +	} +	wr32(E1000_CTRL_EXT, ctrl_ext); +} + +/**   *  igb_up - Open the interface and prepare it to handle traffic   *  @adapter: board private structure   **/ @@ -1617,7 +1728,7 @@ int igb_up(struct igb_adapter *adapter)  	for (i = 0; i < adapter->num_q_vectors; i++)  		napi_enable(&(adapter->q_vector[i]->napi)); -	if (adapter->msix_entries) +	if (adapter->flags & IGB_FLAG_HAS_MSIX)  		igb_configure_msix(adapter);  	else  		igb_assign_vector(adapter->q_vector[0], 0); @@ -1629,6 +1740,7 @@ int igb_up(struct igb_adapter *adapter)  	/* notify VFs that reset has been completed */  	if (adapter->vfs_allocated_count) {  		u32 reg_data = rd32(E1000_CTRL_EXT); +  		reg_data |= E1000_CTRL_EXT_PFRSTD;  		wr32(E1000_CTRL_EXT, reg_data);  	} @@ -1639,6 +1751,10 @@ int igb_up(struct igb_adapter *adapter)  	hw->mac.get_link_status = 1;  	schedule_work(&adapter->watchdog_task); +	if ((adapter->flags & IGB_FLAG_EEE) && +	    (!hw->dev_spec._82575.eee_disable)) +		adapter->eee_advert = MDIO_EEE_100TX | MDIO_EEE_1000T; +  	return 0;  } @@ -1667,7 +1783,7 @@ void igb_down(struct igb_adapter *adapter)  	wr32(E1000_TCTL, tctl);  	/* flush both disables and wait for them to finish */  	wrfl(); -	msleep(10); +	usleep_range(10000, 11000);  	igb_irq_disable(adapter); @@ -1707,12 +1823,43 @@ void igb_reinit_locked(struct igb_adapter *adapter)  {  	WARN_ON(in_interrupt());  	while (test_and_set_bit(__IGB_RESETTING, &adapter->state)) -		msleep(1); +		usleep_range(1000, 2000);  	igb_down(adapter);  	igb_up(adapter);  	clear_bit(__IGB_RESETTING, &adapter->state);  } +/** igb_enable_mas - Media Autosense re-enable after swap + * + * @adapter: adapter struct + **/ +static s32 igb_enable_mas(struct igb_adapter *adapter) +{ +	struct e1000_hw *hw = &adapter->hw; +	u32 connsw; +	s32 ret_val = 0; + +	connsw = rd32(E1000_CONNSW); +	if (!(hw->phy.media_type == e1000_media_type_copper)) +		return ret_val; + +	/* configure for SerDes media detect */ +	if (!(connsw & E1000_CONNSW_SERDESD)) { +		connsw |= E1000_CONNSW_ENRGSRC; +		connsw |= E1000_CONNSW_AUTOSENSE_EN; +		wr32(E1000_CONNSW, connsw); +		wrfl(); +	} else if (connsw & E1000_CONNSW_SERDESD) { +		/* already SerDes, no need to enable anything */ +		return ret_val; +	} else { +		netdev_info(adapter->netdev, +			"MAS: Unable to configure feature, disabling..\n"); +		adapter->flags &= ~IGB_FLAG_MAS_ENABLE; +	} +	return ret_val; +} +  void igb_reset(struct igb_adapter *adapter)  {  	struct pci_dev *pdev = adapter->pdev; @@ -1809,6 +1956,7 @@ void igb_reset(struct igb_adapter *adapter)  	/* disable receive for all VFs and wait one second */  	if (adapter->vfs_allocated_count) {  		int i; +  		for (i = 0 ; i < adapter->vfs_allocated_count; i++)  			adapter->vf_data[i].flags &= IGB_VF_FLAG_PF_SET_MAC; @@ -1824,6 +1972,16 @@ void igb_reset(struct igb_adapter *adapter)  	hw->mac.ops.reset_hw(hw);  	wr32(E1000_WUC, 0); +	if (adapter->flags & IGB_FLAG_MEDIA_RESET) { +		/* need to resetup here after media swap */ +		adapter->ei.get_invariants(hw); +		adapter->flags &= ~IGB_FLAG_MEDIA_RESET; +	} +	if (adapter->flags & IGB_FLAG_MAS_ENABLE) { +		if (igb_enable_mas(adapter)) +			dev_err(&pdev->dev, +				"Error enabling Media Auto Sense\n"); +	}  	if (hw->mac.ops.init_hw(hw))  		dev_err(&pdev->dev, "Hardware Error\n"); @@ -1846,6 +2004,21 @@ void igb_reset(struct igb_adapter *adapter)  		}  	}  #endif +	/* Re-establish EEE setting */ +	if (hw->phy.media_type == e1000_media_type_copper) { +		switch (mac->type) { +		case e1000_i350: +		case e1000_i210: +		case e1000_i211: +			igb_set_eee_i350(hw); +			break; +		case e1000_i354: +			igb_set_eee_i354(hw); +			break; +		default: +			break; +		} +	}  	if (!netif_running(adapter->netdev))  		igb_power_down_link(adapter); @@ -1911,7 +2084,7 @@ static const struct net_device_ops igb_netdev_ops = {  	.ndo_vlan_rx_kill_vid	= igb_vlan_rx_kill_vid,  	.ndo_set_vf_mac		= igb_ndo_set_vf_mac,  	.ndo_set_vf_vlan	= igb_ndo_set_vf_vlan, -	.ndo_set_vf_tx_rate	= igb_ndo_set_vf_bw, +	.ndo_set_vf_rate	= igb_ndo_set_vf_bw,  	.ndo_set_vf_spoofchk	= igb_ndo_set_vf_spoofchk,  	.ndo_get_vf_config	= igb_ndo_get_vf_config,  #ifdef CONFIG_NET_POLL_CONTROLLER @@ -1966,7 +2139,58 @@ void igb_set_fw_version(struct igb_adapter *adapter)  		}  		break;  	} -	return; +} + +/** + * igb_init_mas - init Media Autosense feature if enabled in the NVM + * + * @adapter: adapter struct + **/ +static void igb_init_mas(struct igb_adapter *adapter) +{ +	struct e1000_hw *hw = &adapter->hw; +	u16 eeprom_data; + +	hw->nvm.ops.read(hw, NVM_COMPAT, 1, &eeprom_data); +	switch (hw->bus.func) { +	case E1000_FUNC_0: +		if (eeprom_data & IGB_MAS_ENABLE_0) { +			adapter->flags |= IGB_FLAG_MAS_ENABLE; +			netdev_info(adapter->netdev, +				"MAS: Enabling Media Autosense for port %d\n", +				hw->bus.func); +		} +		break; +	case E1000_FUNC_1: +		if (eeprom_data & IGB_MAS_ENABLE_1) { +			adapter->flags |= IGB_FLAG_MAS_ENABLE; +			netdev_info(adapter->netdev, +				"MAS: Enabling Media Autosense for port %d\n", +				hw->bus.func); +		} +		break; +	case E1000_FUNC_2: +		if (eeprom_data & IGB_MAS_ENABLE_2) { +			adapter->flags |= IGB_FLAG_MAS_ENABLE; +			netdev_info(adapter->netdev, +				"MAS: Enabling Media Autosense for port %d\n", +				hw->bus.func); +		} +		break; +	case E1000_FUNC_3: +		if (eeprom_data & IGB_MAS_ENABLE_3) { +			adapter->flags |= IGB_FLAG_MAS_ENABLE; +			netdev_info(adapter->netdev, +				"MAS: Enabling Media Autosense for port %d\n", +				hw->bus.func); +		} +		break; +	default: +		/* Shouldn't get here */ +		netdev_err(adapter->netdev, +			"MAS: Invalid port configuration, returning\n"); +		break; +	}  }  /** @@ -1975,11 +2199,11 @@ void igb_set_fw_version(struct igb_adapter *adapter)   **/  static s32 igb_init_i2c(struct igb_adapter *adapter)  { -	s32 status = E1000_SUCCESS; +	s32 status = 0;  	/* I2C interface supported on i350 devices */  	if (adapter->hw.mac.type != e1000_i350) -		return E1000_SUCCESS; +		return 0;  	/* Initialize the i2c bus which is controlled by the registers.  	 * This bus will use the i2c_algo_bit structue that implements @@ -2016,7 +2240,6 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	s32 ret_val;  	static int global_quad_port_a; /* global quad port a indication */  	const struct e1000_info *ei = igb_info_tbl[ent->driver_data]; -	unsigned long mmio_start, mmio_len;  	int err, pci_using_dac;  	u8 part_str[E1000_PBANUM_LENGTH]; @@ -2034,21 +2257,15 @@ static int igb_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;  		}  	} @@ -2079,11 +2296,8 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	hw->back = adapter;  	adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE); -	mmio_start = pci_resource_start(pdev, 0); -	mmio_len = pci_resource_len(pdev, 0); -  	err = -EIO; -	hw->hw_addr = ioremap(mmio_start, mmio_len); +	hw->hw_addr = pci_iomap(pdev, 0, 0);  	if (!hw->hw_addr)  		goto err_ioremap; @@ -2093,8 +2307,8 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	strncpy(netdev->name, pci_name(pdev), sizeof(netdev->name) - 1); -	netdev->mem_start = mmio_start; -	netdev->mem_end = mmio_start + mmio_len; +	netdev->mem_start = pci_resource_start(pdev, 0); +	netdev->mem_end = pci_resource_end(pdev, 0);  	/* PCI config space info */  	hw->vendor_id = pdev->vendor; @@ -2219,6 +2433,12 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	/* get firmware version for ethtool -i */  	igb_set_fw_version(adapter); +	/* configure RXPBSIZE and TXPBSIZE */ +	if (hw->mac.type == e1000_i210) { +		wr32(E1000_RXPBS, I210_RXPBSIZE_DEFAULT); +		wr32(E1000_TXPBS, I210_TXPBSIZE_DEFAULT); +	} +  	setup_timer(&adapter->watchdog_timer, igb_watchdog,  		    (unsigned long) adapter);  	setup_timer(&adapter->phy_info_timer, igb_update_phy_info, @@ -2311,7 +2531,8 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	}  	/* let the f/w know that the h/w is now under the control of the -	 * driver. */ +	 * driver. +	 */  	igb_get_hw_control(adapter);  	strcpy(netdev->name, "eth%d"); @@ -2350,6 +2571,11 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  		adapter->ets = false;  	}  #endif +	/* Check if Media Autosense is enabled */ +	adapter->ei = *ei; +	if (hw->dev_spec._82575.mas_capable) +		igb_init_mas(adapter); +  	/* do hw tstamp init after resetting */  	igb_ptp_init(adapter); @@ -2382,26 +2608,39 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	dev_info(&pdev->dev, "%s: PBA No: %s\n", netdev->name, part_str);  	dev_info(&pdev->dev,  		"Using %s interrupts. %d rx queue(s), %d tx queue(s)\n", -		adapter->msix_entries ? "MSI-X" : +		(adapter->flags & IGB_FLAG_HAS_MSIX) ? "MSI-X" :  		(adapter->flags & IGB_FLAG_HAS_MSI) ? "MSI" : "legacy",  		adapter->num_rx_queues, adapter->num_tx_queues); -	switch (hw->mac.type) { -	case e1000_i350: -	case e1000_i210: -	case e1000_i211: -		igb_set_eee_i350(hw); -		break; -	case e1000_i354: -		if (hw->phy.media_type == e1000_media_type_copper) { +	if (hw->phy.media_type == e1000_media_type_copper) { +		switch (hw->mac.type) { +		case e1000_i350: +		case e1000_i210: +		case e1000_i211: +			/* Enable EEE for internal copper PHY devices */ +			err = igb_set_eee_i350(hw); +			if ((!err) && +			    (!hw->dev_spec._82575.eee_disable)) { +				adapter->eee_advert = +					MDIO_EEE_100TX | MDIO_EEE_1000T; +				adapter->flags |= IGB_FLAG_EEE; +			} +			break; +		case e1000_i354:  			if ((rd32(E1000_CTRL_EXT) & -			    E1000_CTRL_EXT_LINK_MODE_SGMII)) -				igb_set_eee_i354(hw); +			    E1000_CTRL_EXT_LINK_MODE_SGMII)) { +				err = igb_set_eee_i354(hw); +				if ((!err) && +					(!hw->dev_spec._82575.eee_disable)) { +					adapter->eee_advert = +					   MDIO_EEE_100TX | MDIO_EEE_1000T; +					adapter->flags |= IGB_FLAG_EEE; +				} +			} +			break; +		default: +			break;  		} -		break; -	default: -		break;  	} -  	pm_runtime_put_noidle(&pdev->dev);  	return 0; @@ -2416,7 +2655,7 @@ err_eeprom:  		iounmap(hw->flash_address);  err_sw_init:  	igb_clear_interrupt_scheme(adapter); -	iounmap(hw->hw_addr); +	pci_iounmap(pdev, hw->hw_addr);  err_ioremap:  	free_netdev(netdev);  err_alloc_etherdev: @@ -2429,7 +2668,7 @@ err_dma:  }  #ifdef CONFIG_PCI_IOV -static int  igb_disable_sriov(struct pci_dev *pdev) +static int igb_disable_sriov(struct pci_dev *pdev)  {  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct igb_adapter *adapter = netdev_priv(netdev); @@ -2470,27 +2709,19 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)  	int err = 0;  	int i; -	if (!adapter->msix_entries) { +	if (!(adapter->flags & IGB_FLAG_HAS_MSIX) || num_vfs > 7) {  		err = -EPERM;  		goto out;  	} -  	if (!num_vfs)  		goto out; -	else if (old_vfs && old_vfs == num_vfs) -		goto out; -	else if (old_vfs && old_vfs != num_vfs) -		err = igb_disable_sriov(pdev); -	if (err) -		goto out; - -	if (num_vfs > 7) { -		err = -EPERM; -		goto out; -	} - -	adapter->vfs_allocated_count = num_vfs; +	if (old_vfs) { +		dev_info(&pdev->dev, "%d pre-allocated VFs found - override max_vfs setting of %d\n", +			 old_vfs, max_vfs); +		adapter->vfs_allocated_count = old_vfs; +	} else +		adapter->vfs_allocated_count = num_vfs;  	adapter->vf_data = kcalloc(adapter->vfs_allocated_count,  				sizeof(struct vf_data_storage), GFP_KERNEL); @@ -2504,10 +2735,12 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)  		goto out;  	} -	err = pci_enable_sriov(pdev, adapter->vfs_allocated_count); -	if (err) -		goto err_out; - +	/* only call pci_enable_sriov() if no VFs are allocated already */ +	if (!old_vfs) { +		err = pci_enable_sriov(pdev, adapter->vfs_allocated_count); +		if (err) +			goto err_out; +	}  	dev_info(&pdev->dev, "%d VFs allocated\n",  		 adapter->vfs_allocated_count);  	for (i = 0; i < adapter->vfs_allocated_count; i++) @@ -2589,7 +2822,7 @@ static void igb_remove(struct pci_dev *pdev)  	igb_disable_sriov(pdev);  #endif -	iounmap(hw->hw_addr); +	pci_iounmap(pdev, hw->hw_addr);  	if (hw->flash_address)  		iounmap(hw->flash_address);  	pci_release_selected_regions(pdev, @@ -2623,7 +2856,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)  		return;  	pci_sriov_set_totalvfs(pdev, 7); -	igb_enable_sriov(pdev, max_vfs); +	igb_pci_enable_sriov(pdev, max_vfs);  #endif /* CONFIG_PCI_IOV */  } @@ -2847,6 +3080,7 @@ static int __igb_open(struct net_device *netdev, bool resuming)  	/* notify VFs that reset has been completed */  	if (adapter->vfs_allocated_count) {  		u32 reg_data = rd32(E1000_CTRL_EXT); +  		reg_data |= E1000_CTRL_EXT_PFRSTD;  		wr32(E1000_CTRL_EXT, reg_data);  	} @@ -3018,7 +3252,7 @@ void igb_setup_tctl(struct igb_adapter *adapter)   *  Configure a transmit ring after a reset.   **/  void igb_configure_tx_ring(struct igb_adapter *adapter, -                           struct igb_ring *ring) +			   struct igb_ring *ring)  {  	struct e1000_hw *hw = &adapter->hw;  	u32 txdctl = 0; @@ -3159,7 +3393,8 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)  	if (adapter->rss_indir_tbl_init != num_rx_queues) {  		for (j = 0; j < IGB_RETA_SIZE; j++) -			adapter->rss_indir_tbl[j] = (j * num_rx_queues) / IGB_RETA_SIZE; +			adapter->rss_indir_tbl[j] = +			(j * num_rx_queues) / IGB_RETA_SIZE;  		adapter->rss_indir_tbl_init = num_rx_queues;  	}  	igb_write_rss_indir_tbl(adapter); @@ -3200,6 +3435,7 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)  		if (hw->mac.type > e1000_82575) {  			/* Set the default pool for the PF's first queue */  			u32 vtctl = rd32(E1000_VT_CTL); +  			vtctl &= ~(E1000_VT_CTL_DEFAULT_POOL_MASK |  				   E1000_VT_CTL_DISABLE_DEF_POOL);  			vtctl |= adapter->vfs_allocated_count << @@ -3281,7 +3517,7 @@ void igb_setup_rctl(struct igb_adapter *adapter)  }  static inline int igb_set_vf_rlpml(struct igb_adapter *adapter, int size, -                                   int vfn) +				   int vfn)  {  	struct e1000_hw *hw = &adapter->hw;  	u32 vmolr; @@ -3341,6 +3577,13 @@ static inline void igb_set_vmolr(struct igb_adapter *adapter,  	vmolr = rd32(E1000_VMOLR(vfn));  	vmolr |= E1000_VMOLR_STRVLAN; /* Strip vlan tags */ +	if (hw->mac.type == e1000_i350) { +		u32 dvmolr; + +		dvmolr = rd32(E1000_DVMOLR(vfn)); +		dvmolr |= E1000_DVMOLR_STRVLAN; +		wr32(E1000_DVMOLR(vfn), dvmolr); +	}  	if (aupe)  		vmolr |= E1000_VMOLR_AUPE; /* Accept untagged packets */  	else @@ -3821,7 +4064,8 @@ static void igb_check_wvbr(struct igb_adapter *adapter)  	switch (hw->mac.type) {  	case e1000_82576:  	case e1000_i350: -		if (!(wvbr = rd32(E1000_WVBR))) +		wvbr = rd32(E1000_WVBR); +		if (!wvbr)  			return;  		break;  	default: @@ -3840,7 +4084,7 @@ static void igb_spoof_check(struct igb_adapter *adapter)  	if (!adapter->wvbr)  		return; -	for(j = 0; j < adapter->vfs_allocated_count; j++) { +	for (j = 0; j < adapter->vfs_allocated_count; j++) {  		if (adapter->wvbr & (1 << j) ||  		    adapter->wvbr & (1 << (j + IGB_STAGGERED_QUEUE_OFFSET))) {  			dev_warn(&adapter->pdev->dev, @@ -3941,6 +4185,7 @@ static void igb_watchdog_task(struct work_struct *work)  	struct net_device *netdev = adapter->netdev;  	u32 link;  	int i; +	u32 connsw;  	link = igb_has_link(adapter); @@ -3951,20 +4196,35 @@ static void igb_watchdog_task(struct work_struct *work)  			link = false;  	} +	/* Force link down if we have fiber to swap to */ +	if (adapter->flags & IGB_FLAG_MAS_ENABLE) { +		if (hw->phy.media_type == e1000_media_type_copper) { +			connsw = rd32(E1000_CONNSW); +			if (!(connsw & E1000_CONNSW_AUTOSENSE_EN)) +				link = 0; +		} +	}  	if (link) { +		/* Perform a reset if the media type changed. */ +		if (hw->dev_spec._82575.media_changed) { +			hw->dev_spec._82575.media_changed = false; +			adapter->flags |= IGB_FLAG_MEDIA_RESET; +			igb_reset(adapter); +		}  		/* Cancel scheduled suspend requests. */  		pm_runtime_resume(netdev->dev.parent);  		if (!netif_carrier_ok(netdev)) {  			u32 ctrl; +  			hw->mac.ops.get_speed_and_duplex(hw,  							 &adapter->link_speed,  							 &adapter->link_duplex);  			ctrl = rd32(E1000_CTRL);  			/* Links status message must follow this format */ -			printk(KERN_INFO "igb: %s NIC Link is Up %d Mbps %s " -			       "Duplex, Flow Control: %s\n", +			netdev_info(netdev, +			       "igb: %s NIC Link is Up %d Mbps %s Duplex, Flow Control: %s\n",  			       netdev->name,  			       adapter->link_speed,  			       adapter->link_duplex == FULL_DUPLEX ? @@ -3974,6 +4234,15 @@ static void igb_watchdog_task(struct work_struct *work)  			       (ctrl & E1000_CTRL_RFCE) ?  "RX" :  			       (ctrl & E1000_CTRL_TFCE) ?  "TX" : "None"); +			/* disable EEE if enabled */ +			if ((adapter->flags & IGB_FLAG_EEE) && +				(adapter->link_duplex == HALF_DUPLEX)) { +				dev_info(&adapter->pdev->dev, +				"EEE Disabled: unsupported at half duplex. Re-enable using ethtool when at full duplex.\n"); +				adapter->hw.dev_spec._82575.eee_disable = true; +				adapter->flags &= ~IGB_FLAG_EEE; +			} +  			/* check if SmartSpeed worked */  			igb_check_downshift(hw);  			if (phy->speed_downgraded) @@ -3981,11 +4250,8 @@ static void igb_watchdog_task(struct work_struct *work)  			/* check for thermal sensor event */  			if (igb_thermal_sensor_event(hw, -			    E1000_THSTAT_LINK_THROTTLE)) { -				netdev_info(netdev, "The network adapter link " -					    "speed was downshifted because it " -					    "overheated\n"); -			} +			    E1000_THSTAT_LINK_THROTTLE)) +				netdev_info(netdev, "The network adapter link speed was downshifted because it overheated\n");  			/* adjust timeout factor according to speed/duplex */  			adapter->tx_timeout_factor = 1; @@ -4016,12 +4282,11 @@ static void igb_watchdog_task(struct work_struct *work)  			/* check for thermal sensor event */  			if (igb_thermal_sensor_event(hw,  			    E1000_THSTAT_PWR_DOWN)) { -				netdev_err(netdev, "The network adapter was " -					   "stopped because it overheated\n"); +				netdev_err(netdev, "The network adapter was stopped because it overheated\n");  			}  			/* Links status message must follow this format */ -			printk(KERN_INFO "igb: %s NIC Link is Down\n", +			netdev_info(netdev, "igb: %s NIC Link is Down\n",  			       netdev->name);  			netif_carrier_off(netdev); @@ -4032,8 +4297,27 @@ static void igb_watchdog_task(struct work_struct *work)  				mod_timer(&adapter->phy_info_timer,  					  round_jiffies(jiffies + 2 * HZ)); +			/* link is down, time to check for alternate media */ +			if (adapter->flags & IGB_FLAG_MAS_ENABLE) { +				igb_check_swap_media(adapter); +				if (adapter->flags & IGB_FLAG_MEDIA_RESET) { +					schedule_work(&adapter->reset_task); +					/* return immediately */ +					return; +				} +			}  			pm_schedule_suspend(netdev->dev.parent,  					    MSEC_PER_SEC * 5); + +		/* also check for alternate media here */ +		} else if (!netif_carrier_ok(netdev) && +			   (adapter->flags & IGB_FLAG_MAS_ENABLE)) { +			igb_check_swap_media(adapter); +			if (adapter->flags & IGB_FLAG_MEDIA_RESET) { +				schedule_work(&adapter->reset_task); +				/* return immediately */ +				return; +			}  		}  	} @@ -4062,8 +4346,9 @@ static void igb_watchdog_task(struct work_struct *work)  	}  	/* Cause software interrupt to ensure Rx ring is cleaned */ -	if (adapter->msix_entries) { +	if (adapter->flags & IGB_FLAG_HAS_MSIX) {  		u32 eics = 0; +  		for (i = 0; i < adapter->num_q_vectors; i++)  			eics |= adapter->q_vector[i]->eims_value;  		wr32(E1000_EICS, eics); @@ -4103,8 +4388,7 @@ enum latency_range {   *  were determined based on theoretical maximum wire speed and testing   *  data, in order to minimize response time while increasing bulk   *  throughput. - *  This functionality is controlled by the InterruptThrottleRate module - *  parameter (see igb_param.c) + *  This functionality is controlled by ethtool's coalescing settings.   *  NOTE:  This function is called only when operating in a multiqueue   *         receive environment.   **/ @@ -4178,8 +4462,7 @@ clear_counts:   *  based on theoretical maximum wire speed and thresholds were set based   *  on testing data as well as attempting to minimize response time   *  while increasing bulk throughput. - *  this functionality is controlled by the InterruptThrottleRate module - *  parameter (see igb_param.c) + *  This functionality is controlled by ethtool's coalescing settings.   *  NOTE:  These calculations are only valid when operating in a single-   *         queue environment.   **/ @@ -4205,13 +4488,12 @@ static void igb_update_itr(struct igb_q_vector *q_vector,  	case low_latency:  /* 50 usec aka 20000 ints/s */  		if (bytes > 10000) {  			/* this if handles the TSO accounting */ -			if (bytes/packets > 8000) { +			if (bytes/packets > 8000)  				itrval = bulk_latency; -			} else if ((packets < 10) || ((bytes/packets) > 1200)) { +			else if ((packets < 10) || ((bytes/packets) > 1200))  				itrval = bulk_latency; -			} else if ((packets > 35)) { +			else if ((packets > 35))  				itrval = lowest_latency; -			}  		} else if (bytes/packets > 2000) {  			itrval = bulk_latency;  		} else if (packets <= 2 && bytes < 512) { @@ -4327,6 +4609,7 @@ static int igb_tso(struct igb_ring *tx_ring,  	struct sk_buff *skb = first->skb;  	u32 vlan_macip_lens, type_tucmd;  	u32 mss_l4len_idx, l4len; +	int err;  	if (skb->ip_summed != CHECKSUM_PARTIAL)  		return 0; @@ -4334,16 +4617,14 @@ static int igb_tso(struct igb_ring *tx_ring,  	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;  	/* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */  	type_tucmd = E1000_ADVTXD_TUCMD_L4T_TCP; -	if (first->protocol == __constant_htons(ETH_P_IP)) { +	if (first->protocol == htons(ETH_P_IP)) {  		struct iphdr *iph = ip_hdr(skb);  		iph->tot_len = 0;  		iph->check = 0; @@ -4398,13 +4679,14 @@ static void igb_tx_csum(struct igb_ring *tx_ring, struct igb_tx_buffer *first)  			return;  	} else {  		u8 l4_hdr = 0; +  		switch (first->protocol) { -		case __constant_htons(ETH_P_IP): +		case htons(ETH_P_IP):  			vlan_macip_lens |= skb_network_header_len(skb);  			type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;  			l4_hdr = ip_hdr(skb)->protocol;  			break; -		case __constant_htons(ETH_P_IPV6): +		case htons(ETH_P_IPV6):  			vlan_macip_lens |= skb_network_header_len(skb);  			l4_hdr = ipv6_hdr(skb)->nexthdr;  			break; @@ -4685,6 +4967,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,  	 */  	if (NETDEV_FRAG_PAGE_MAX_SIZE > IGB_MAX_DATA_PER_TXD) {  		unsigned short f; +  		for (f = 0; f < skb_shinfo(skb)->nr_frags; f++)  			count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size);  	} else { @@ -4702,12 +4985,11 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,  	first->bytecount = skb->len;  	first->gso_segs = 1; -	skb_tx_timestamp(skb); -  	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {  		struct igb_adapter *adapter = netdev_priv(tx_ring->netdev); -		if (!(adapter->ptp_tx_skb)) { +		if (!test_and_set_bit_lock(__IGB_PTP_TX_IN_PROGRESS, +					   &adapter->state)) {  			skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;  			tx_flags |= IGB_TX_FLAGS_TSTAMP; @@ -4718,6 +5000,8 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb,  		}  	} +	skb_tx_timestamp(skb); +  	if (vlan_tx_tag_present(skb)) {  		tx_flags |= IGB_TX_FLAGS_VLAN;  		tx_flags |= (vlan_tx_tag_get(skb) << IGB_TX_FLAGS_VLAN_SHIFT); @@ -4862,7 +5146,7 @@ static int igb_change_mtu(struct net_device *netdev, int new_mtu)  		max_frame = ETH_FRAME_LEN + ETH_FCS_LEN;  	while (test_and_set_bit(__IGB_RESETTING, &adapter->state)) -		msleep(1); +		usleep_range(1000, 2000);  	/* igb_down has a dependency on max_frame_size */  	adapter->max_frame_size = max_frame; @@ -4915,8 +5199,10 @@ void igb_update_stats(struct igb_adapter *adapter,  	rcu_read_lock();  	for (i = 0; i < adapter->num_rx_queues; i++) { -		u32 rqdpc = rd32(E1000_RQDPC(i));  		struct igb_ring *ring = adapter->rx_ring[i]; +		u32 rqdpc = rd32(E1000_RQDPC(i)); +		if (hw->mac.type >= e1000_i210) +			wr32(E1000_RQDPC(i), 0);  		if (rqdpc) {  			ring->rx_stats.drops += rqdpc; @@ -4924,10 +5210,10 @@ void igb_update_stats(struct igb_adapter *adapter,  		}  		do { -			start = u64_stats_fetch_begin_bh(&ring->rx_syncp); +			start = u64_stats_fetch_begin_irq(&ring->rx_syncp);  			_bytes = ring->rx_stats.bytes;  			_packets = ring->rx_stats.packets; -		} while (u64_stats_fetch_retry_bh(&ring->rx_syncp, start)); +		} while (u64_stats_fetch_retry_irq(&ring->rx_syncp, start));  		bytes += _bytes;  		packets += _packets;  	} @@ -4940,10 +5226,10 @@ void igb_update_stats(struct igb_adapter *adapter,  	for (i = 0; i < adapter->num_tx_queues; i++) {  		struct igb_ring *ring = adapter->tx_ring[i];  		do { -			start = u64_stats_fetch_begin_bh(&ring->tx_syncp); +			start = u64_stats_fetch_begin_irq(&ring->tx_syncp);  			_bytes = ring->tx_stats.bytes;  			_packets = ring->tx_stats.packets; -		} while (u64_stats_fetch_retry_bh(&ring->tx_syncp, start)); +		} while (u64_stats_fetch_retry_irq(&ring->tx_syncp, start));  		bytes += _bytes;  		packets += _packets;  	} @@ -5341,6 +5627,7 @@ static int igb_set_vf_promisc(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)  			vmolr |= E1000_VMOLR_MPME;  		} else if (vf_data->num_vf_mc_hashes) {  			int j; +  			vmolr |= E1000_VMOLR_ROMPE;  			for (j = 0; j < vf_data->num_vf_mc_hashes; j++)  				igb_mta_set(hw, vf_data->vf_mc_hashes[j]); @@ -5392,6 +5679,7 @@ static void igb_restore_vf_multicasts(struct igb_adapter *adapter)  	for (i = 0; i < adapter->vfs_allocated_count; i++) {  		u32 vmolr = rd32(E1000_VMOLR(i)); +  		vmolr &= ~(E1000_VMOLR_ROMPE | E1000_VMOLR_MPME);  		vf_data = &adapter->vf_data[i]; @@ -5490,6 +5778,7 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)  			if (!adapter->vf_data[vf].vlans_enabled) {  				u32 size; +  				reg = rd32(E1000_VMOLR(vf));  				size = reg & E1000_VMOLR_RLPML_MASK;  				size += 4; @@ -5518,6 +5807,7 @@ static s32 igb_vlvf_set(struct igb_adapter *adapter, u32 vid, bool add, u32 vf)  			adapter->vf_data[vf].vlans_enabled--;  			if (!adapter->vf_data[vf].vlans_enabled) {  				u32 size; +  				reg = rd32(E1000_VMOLR(vf));  				size = reg & E1000_VMOLR_RLPML_MASK;  				size -= 4; @@ -5622,8 +5912,8 @@ static int igb_set_vf_vlan(struct igb_adapter *adapter, u32 *msgbuf, u32 vf)  	 */  	if (!add && (adapter->netdev->flags & IFF_PROMISC)) {  		u32 vlvf, bits; -  		int regndx = igb_find_vlvf_entry(adapter, vid); +  		if (regndx < 0)  			goto out;  		/* See if any other pools are set for this VLAN filter @@ -5708,7 +5998,7 @@ static void igb_vf_reset_msg(struct igb_adapter *adapter, u32 vf)  	/* reply to reset with ack and vf mac address */  	msgbuf[0] = E1000_VF_RESET | E1000_VT_MSGTYPE_ACK; -	memcpy(addr, vf_mac, 6); +	memcpy(addr, vf_mac, ETH_ALEN);  	igb_write_mbx(hw, msgbuf, 3, vf);  } @@ -5983,7 +6273,7 @@ static void igb_ring_irq_enable(struct igb_q_vector *q_vector)  	}  	if (!test_bit(__IGB_DOWN, &adapter->state)) { -		if (adapter->msix_entries) +		if (adapter->flags & IGB_FLAG_HAS_MSIX)  			wr32(E1000_EIMS, q_vector->eims_value);  		else  			igb_irq_enable(adapter); @@ -6214,7 +6504,7 @@ static void igb_reuse_rx_page(struct igb_ring *rx_ring,  	rx_ring->next_to_alloc = (nta < rx_ring->count) ? nta : 0;  	/* transfer page from old buffer to new buffer */ -	memcpy(new_buff, old_buff, sizeof(struct igb_rx_buffer)); +	*new_buff = *old_buff;  	/* sync the buffer for use by the device */  	dma_sync_single_range_for_device(rx_ring->dev, old_buff->dma, @@ -6417,7 +6707,9 @@ static inline void igb_rx_hash(struct igb_ring *ring,  			       struct sk_buff *skb)  {  	if (ring->netdev->features & NETIF_F_RXHASH) -		skb->rxhash = le32_to_cpu(rx_desc->wb.lower.hi_dword.rss); +		skb_set_hash(skb, +			     le32_to_cpu(rx_desc->wb.lower.hi_dword.rss), +			     PKT_HASH_TYPE_L3);  }  /** @@ -6487,7 +6779,7 @@ static unsigned int igb_get_headlen(unsigned char *data,  	hdr.network += ETH_HLEN;  	/* handle any vlan tag if present */ -	if (protocol == __constant_htons(ETH_P_8021Q)) { +	if (protocol == htons(ETH_P_8021Q)) {  		if ((hdr.network - data) > (max_len - VLAN_HLEN))  			return max_len; @@ -6496,7 +6788,7 @@ static unsigned int igb_get_headlen(unsigned char *data,  	}  	/* handle L3 protocols */ -	if (protocol == __constant_htons(ETH_P_IP)) { +	if (protocol == htons(ETH_P_IP)) {  		if ((hdr.network - data) > (max_len - sizeof(struct iphdr)))  			return max_len; @@ -6510,7 +6802,7 @@ static unsigned int igb_get_headlen(unsigned char *data,  		/* record next protocol if header is present */  		if (!(hdr.ipv4->frag_off & htons(IP_OFFSET)))  			nexthdr = hdr.ipv4->protocol; -	} else if (protocol == __constant_htons(ETH_P_IPV6)) { +	} else if (protocol == htons(ETH_P_IPV6)) {  		if ((hdr.network - data) > (max_len - sizeof(struct ipv6hdr)))  			return max_len; @@ -6674,11 +6966,14 @@ static void igb_process_skb_fields(struct igb_ring *rx_ring,  	igb_rx_checksum(rx_ring, rx_desc, skb); -	igb_ptp_rx_hwtstamp(rx_ring, rx_desc, skb); +	if (igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TS) && +	    !igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP)) +		igb_ptp_rx_rgtstamp(rx_ring->q_vector, skb);  	if ((dev->features & NETIF_F_HW_VLAN_CTAG_RX) &&  	    igb_test_staterr(rx_desc, E1000_RXD_STAT_VP)) {  		u16 vid; +  		if (igb_test_staterr(rx_desc, E1000_RXDEXT_STATERR_LB) &&  		    test_bit(IGB_RING_FLAG_RX_LB_VLAN_BSWAP, &rx_ring->flags))  			vid = be16_to_cpu(rx_desc->wb.upper.vlan); @@ -6700,7 +6995,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  	unsigned int total_bytes = 0, total_packets = 0;  	u16 cleaned_count = igb_desc_unused(rx_ring); -	do { +	while (likely(total_packets < budget)) {  		union e1000_adv_rx_desc *rx_desc;  		/* return some buffers to hardware, one at a time is too slow */ @@ -6752,7 +7047,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  		/* update budget accounting */  		total_packets++; -	} while (likely(total_packets < budget)); +	}  	/* place incomplete frames back on ring for completion */  	rx_ring->skb = skb; @@ -6767,7 +7062,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  	if (cleaned_count)  		igb_alloc_rx_buffers(rx_ring, cleaned_count); -	return (total_packets < budget); +	return total_packets < budget;  }  static bool igb_alloc_mapped_page(struct igb_ring *rx_ring, @@ -6888,7 +7183,7 @@ static int igb_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)  		break;  	case SIOCGMIIREG:  		if (igb_read_phy_reg(&adapter->hw, data->reg_num & 0x1F, -		                     &data->val_out)) +				     &data->val_out))  			return -EIO;  		break;  	case SIOCSMIIREG: @@ -6911,13 +7206,29 @@ static int igb_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)  	case SIOCGMIIREG:  	case SIOCSMIIREG:  		return igb_mii_ioctl(netdev, ifr, cmd); +	case SIOCGHWTSTAMP: +		return igb_ptp_get_ts_config(netdev, ifr);  	case SIOCSHWTSTAMP: -		return igb_ptp_hwtstamp_ioctl(netdev, ifr, cmd); +		return igb_ptp_set_ts_config(netdev, ifr);  	default:  		return -EOPNOTSUPP;  	}  } +void igb_read_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) +{ +	struct igb_adapter *adapter = hw->back; + +	pci_read_config_word(adapter->pdev, reg, value); +} + +void igb_write_pci_cfg(struct e1000_hw *hw, u32 reg, u16 *value) +{ +	struct igb_adapter *adapter = hw->back; + +	pci_write_config_word(adapter->pdev, reg, *value); +} +  s32 igb_read_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)  {  	struct igb_adapter *adapter = hw->back; @@ -7281,6 +7592,8 @@ static int igb_sriov_reinit(struct pci_dev *dev)  	if (netif_running(netdev))  		igb_close(netdev); +	else +		igb_reset(adapter);  	igb_clear_interrupt_scheme(adapter); @@ -7350,7 +7663,7 @@ static void igb_netpoll(struct net_device *netdev)  	for (i = 0; i < adapter->num_q_vectors; i++) {  		q_vector = adapter->q_vector[i]; -		if (adapter->msix_entries) +		if (adapter->flags & IGB_FLAG_HAS_MSIX)  			wr32(E1000_EIMC, q_vector->eims_value);  		else  			igb_irq_disable(adapter); @@ -7587,7 +7900,8 @@ static void igb_check_vf_rate_limit(struct igb_adapter *adapter)  	}  } -static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate) +static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, +			     int min_tx_rate, int max_tx_rate)  {  	struct igb_adapter *adapter = netdev_priv(netdev);  	struct e1000_hw *hw = &adapter->hw; @@ -7596,15 +7910,19 @@ static int igb_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate)  	if (hw->mac.type != e1000_82576)  		return -EOPNOTSUPP; +	if (min_tx_rate) +		return -EINVAL; +  	actual_link_speed = igb_link_mbps(adapter->link_speed);  	if ((vf >= adapter->vfs_allocated_count) ||  	    (!(rd32(E1000_STATUS) & E1000_STATUS_LU)) || -	    (tx_rate < 0) || (tx_rate > actual_link_speed)) +	    (max_tx_rate < 0) || +	    (max_tx_rate > actual_link_speed))  		return -EINVAL;  	adapter->vf_rate_link_speed = actual_link_speed; -	adapter->vf_data[vf].tx_rate = (u16)tx_rate; -	igb_set_vf_rate_limit(hw, vf, tx_rate, actual_link_speed); +	adapter->vf_data[vf].tx_rate = (u16)max_tx_rate; +	igb_set_vf_rate_limit(hw, vf, max_tx_rate, actual_link_speed);  	return 0;  } @@ -7633,7 +7951,7 @@ static int igb_ndo_set_vf_spoofchk(struct net_device *netdev, int vf,  	wr32(reg_offset, reg_val);  	adapter->vf_data[vf].spoofchk_enabled = setting; -	return E1000_SUCCESS; +	return 0;  }  static int igb_ndo_get_vf_config(struct net_device *netdev, @@ -7644,7 +7962,8 @@ static int igb_ndo_get_vf_config(struct net_device *netdev,  		return -EINVAL;  	ivi->vf = vf;  	memcpy(&ivi->mac, adapter->vf_data[vf].vf_mac_addresses, ETH_ALEN); -	ivi->tx_rate = adapter->vf_data[vf].tx_rate; +	ivi->max_tx_rate = adapter->vf_data[vf].tx_rate; +	ivi->min_tx_rate = 0;  	ivi->vlan = adapter->vf_data[vf].pf_vlan;  	ivi->qos = adapter->vf_data[vf].pf_qos;  	ivi->spoofchk = adapter->vf_data[vf].spoofchk_enabled; @@ -7669,11 +7988,13 @@ static void igb_vmm_control(struct igb_adapter *adapter)  		reg = rd32(E1000_DTXCTL);  		reg |= E1000_DTXCTL_VLAN_ADDED;  		wr32(E1000_DTXCTL, reg); +		/* Fall through */  	case e1000_82580:  		/* enable replication vlan tag stripping */  		reg = rd32(E1000_RPLOLR);  		reg |= E1000_RPLOLR_STRVLAN;  		wr32(E1000_RPLOLR, reg); +		/* Fall through */  	case e1000_i350:  		/* none of the above registers are supported by i350 */  		break; @@ -7763,6 +8084,7 @@ static void igb_init_dmac(struct igb_adapter *adapter, u32 pba)  		} /* endif adapter->dmac is not disabled */  	} else if (hw->mac.type == e1000_82580) {  		u32 reg = rd32(E1000_PCIEMISC); +  		wr32(E1000_PCIEMISC, reg & ~E1000_PCIEMISC_LX_DECISION);  		wr32(E1000_DMACR, 0);  	} @@ -7791,8 +8113,7 @@ s32 igb_read_i2c_byte(struct e1000_hw *hw, u8 byte_offset,  	swfw_mask = E1000_SWFW_PHY0_SM; -	if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) -	    != E1000_SUCCESS) +	if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))  		return E1000_ERR_SWFW_SYNC;  	status = i2c_smbus_read_byte_data(this_client, byte_offset); @@ -7802,7 +8123,7 @@ s32 igb_read_i2c_byte(struct e1000_hw *hw, u8 byte_offset,  		return E1000_ERR_I2C;  	else {  		*data = status; -		return E1000_SUCCESS; +		return 0;  	}  } @@ -7827,7 +8148,7 @@ s32 igb_write_i2c_byte(struct e1000_hw *hw, u8 byte_offset,  	if (!this_client)  		return E1000_ERR_I2C; -	if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != E1000_SUCCESS) +	if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))  		return E1000_ERR_SWFW_SYNC;  	status = i2c_smbus_write_byte_data(this_client, byte_offset, data);  	hw->mac.ops.release_swfw_sync(hw, swfw_mask); @@ -7835,7 +8156,29 @@ s32 igb_write_i2c_byte(struct e1000_hw *hw, u8 byte_offset,  	if (status)  		return E1000_ERR_I2C;  	else -		return E1000_SUCCESS; +		return 0; + +} + +int igb_reinit_queues(struct igb_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; +	struct pci_dev *pdev = adapter->pdev; +	int err = 0; + +	if (netif_running(netdev)) +		igb_close(netdev); + +	igb_reset_interrupt_capability(adapter); +	if (igb_init_interrupt_scheme(adapter, true)) { +		dev_err(&pdev->dev, "Unable to allocate memory for queues\n"); +		return -ENOMEM; +	} + +	if (netif_running(netdev)) +		err = igb_open(netdev); + +	return err;  }  /* igb_main.c */  | 
