diff options
Diffstat (limited to 'drivers/net/ethernet/intel')
| -rw-r--r-- | drivers/net/ethernet/intel/e100.c | 36 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_ethtool.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/ethtool.c | 13 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.c | 71 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 89 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/regs.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_82575.c | 44 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb.h | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_hwmon.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 190 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_ptp.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgb/ixgb_main.c | 7 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 24 | 
16 files changed, 241 insertions, 293 deletions
diff --git a/drivers/net/ethernet/intel/e100.c b/drivers/net/ethernet/intel/e100.c index ec800b093e7..d2bea3f07c7 100644 --- a/drivers/net/ethernet/intel/e100.c +++ b/drivers/net/ethernet/intel/e100.c @@ -870,7 +870,7 @@ err_unlock:  }  static int e100_exec_cb(struct nic *nic, struct sk_buff *skb, -	void (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *)) +	int (*cb_prepare)(struct nic *, struct cb *, struct sk_buff *))  {  	struct cb *cb;  	unsigned long flags; @@ -888,10 +888,13 @@ static int e100_exec_cb(struct nic *nic, struct sk_buff *skb,  	nic->cbs_avail--;  	cb->skb = skb; +	err = cb_prepare(nic, cb, skb); +	if (err) +		goto err_unlock; +  	if (unlikely(!nic->cbs_avail))  		err = -ENOSPC; -	cb_prepare(nic, cb, skb);  	/* Order is important otherwise we'll be in a race with h/w:  	 * set S-bit in current first, then clear S-bit in previous. */ @@ -1091,7 +1094,7 @@ static void e100_get_defaults(struct nic *nic)  	nic->mii.mdio_write = mdio_write;  } -static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb) +static int e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)  {  	struct config *config = &cb->u.config;  	u8 *c = (u8 *)config; @@ -1181,6 +1184,7 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb)  	netif_printk(nic, hw, KERN_DEBUG, nic->netdev,  		     "[16-23]=%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n",  		     c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]); +	return 0;  }  /************************************************************************* @@ -1331,7 +1335,7 @@ static const struct firmware *e100_request_firmware(struct nic *nic)  	return fw;  } -static void e100_setup_ucode(struct nic *nic, struct cb *cb, +static int e100_setup_ucode(struct nic *nic, struct cb *cb,  			     struct sk_buff *skb)  {  	const struct firmware *fw = (void *)skb; @@ -1358,6 +1362,7 @@ static void e100_setup_ucode(struct nic *nic, struct cb *cb,  	cb->u.ucode[min_size] |= cpu_to_le32((BUNDLESMALL) ? 0xFFFF : 0xFF80);  	cb->command = cpu_to_le16(cb_ucode | cb_el); +	return 0;  }  static inline int e100_load_ucode_wait(struct nic *nic) @@ -1400,18 +1405,20 @@ static inline int e100_load_ucode_wait(struct nic *nic)  	return err;  } -static void e100_setup_iaaddr(struct nic *nic, struct cb *cb, +static int e100_setup_iaaddr(struct nic *nic, struct cb *cb,  	struct sk_buff *skb)  {  	cb->command = cpu_to_le16(cb_iaaddr);  	memcpy(cb->u.iaaddr, nic->netdev->dev_addr, ETH_ALEN); +	return 0;  } -static void e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb) +static int e100_dump(struct nic *nic, struct cb *cb, struct sk_buff *skb)  {  	cb->command = cpu_to_le16(cb_dump);  	cb->u.dump_buffer_addr = cpu_to_le32(nic->dma_addr +  		offsetof(struct mem, dump_buf)); +	return 0;  }  static int e100_phy_check_without_mii(struct nic *nic) @@ -1581,7 +1588,7 @@ static int e100_hw_init(struct nic *nic)  	return 0;  } -static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb) +static int e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)  {  	struct net_device *netdev = nic->netdev;  	struct netdev_hw_addr *ha; @@ -1596,6 +1603,7 @@ static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)  		memcpy(&cb->u.multi.addr[i++ * ETH_ALEN], &ha->addr,  			ETH_ALEN);  	} +	return 0;  }  static void e100_set_multicast_list(struct net_device *netdev) @@ -1756,11 +1764,18 @@ static void e100_watchdog(unsigned long data)  		  round_jiffies(jiffies + E100_WATCHDOG_PERIOD));  } -static void e100_xmit_prepare(struct nic *nic, struct cb *cb, +static int e100_xmit_prepare(struct nic *nic, struct cb *cb,  	struct sk_buff *skb)  { +	dma_addr_t dma_addr;  	cb->command = nic->tx_command; +	dma_addr = pci_map_single(nic->pdev, +				  skb->data, skb->len, PCI_DMA_TODEVICE); +	/* If we can't map the skb, have the upper layer try later */ +	if (pci_dma_mapping_error(nic->pdev, dma_addr)) +		return -ENOMEM; +  	/*  	 * Use the last 4 bytes of the SKB payload packet as the CRC, used for  	 * testing, ie sending frames with bad CRC. @@ -1777,11 +1792,10 @@ static void e100_xmit_prepare(struct nic *nic, struct cb *cb,  	cb->u.tcb.tcb_byte_count = 0;  	cb->u.tcb.threshold = nic->tx_threshold;  	cb->u.tcb.tbd_count = 1; -	cb->u.tcb.tbd.buf_addr = cpu_to_le32(pci_map_single(nic->pdev, -		skb->data, skb->len, PCI_DMA_TODEVICE)); -	/* check for mapping failure? */ +	cb->u.tcb.tbd.buf_addr = cpu_to_le32(dma_addr);  	cb->u.tcb.tbd.size = cpu_to_le16(skb->len);  	skb_tx_timestamp(skb); +	return 0;  }  static netdev_tx_t e100_xmit_frame(struct sk_buff *skb, diff --git a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c index 43462d596a4..ffd287196bf 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_ethtool.c +++ b/drivers/net/ethernet/intel/e1000/e1000_ethtool.c @@ -1053,6 +1053,10 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)  		txdr->buffer_info[i].dma =  			dma_map_single(&pdev->dev, skb->data, skb->len,  				       DMA_TO_DEVICE); +		if (dma_mapping_error(&pdev->dev, txdr->buffer_info[i].dma)) { +			ret_val = 4; +			goto err_nomem; +		}  		tx_desc->buffer_addr = cpu_to_le64(txdr->buffer_info[i].dma);  		tx_desc->lower.data = cpu_to_le32(skb->len);  		tx_desc->lower.data |= cpu_to_le32(E1000_TXD_CMD_EOP | @@ -1069,7 +1073,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)  	rxdr->buffer_info = kcalloc(rxdr->count, sizeof(struct e1000_buffer),  				    GFP_KERNEL);  	if (!rxdr->buffer_info) { -		ret_val = 4; +		ret_val = 5;  		goto err_nomem;  	} @@ -1077,7 +1081,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)  	rxdr->desc = dma_alloc_coherent(&pdev->dev, rxdr->size, &rxdr->dma,  					GFP_KERNEL);  	if (!rxdr->desc) { -		ret_val = 5; +		ret_val = 6;  		goto err_nomem;  	}  	memset(rxdr->desc, 0, rxdr->size); @@ -1101,7 +1105,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)  		skb = alloc_skb(E1000_RXBUFFER_2048 + NET_IP_ALIGN, GFP_KERNEL);  		if (!skb) { -			ret_val = 6; +			ret_val = 7;  			goto err_nomem;  		}  		skb_reserve(skb, NET_IP_ALIGN); @@ -1110,6 +1114,10 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter)  		rxdr->buffer_info[i].dma =  			dma_map_single(&pdev->dev, skb->data,  				       E1000_RXBUFFER_2048, DMA_FROM_DEVICE); +		if (dma_mapping_error(&pdev->dev, rxdr->buffer_info[i].dma)) { +			ret_val = 8; +			goto err_nomem; +		}  		rx_desc->buffer_addr = cpu_to_le64(rxdr->buffer_info[i].dma);  		memset(skb->data, 0x00, skb->len);  	} diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index 2c1813737f6..f91a8f3f9d4 100644 --- a/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c @@ -36,6 +36,7 @@  #include <linux/delay.h>  #include <linux/vmalloc.h>  #include <linux/mdio.h> +#include <linux/pm_runtime.h>  #include "e1000.h" @@ -2229,7 +2230,19 @@ static int e1000e_get_ts_info(struct net_device *netdev,  	return 0;  } +static int e1000e_ethtool_begin(struct net_device *netdev) +{ +	return pm_runtime_get_sync(netdev->dev.parent); +} + +static void e1000e_ethtool_complete(struct net_device *netdev) +{ +	pm_runtime_put_sync(netdev->dev.parent); +} +  static const struct ethtool_ops e1000_ethtool_ops = { +	.begin			= e1000e_ethtool_begin, +	.complete		= e1000e_ethtool_complete,  	.get_settings		= e1000_get_settings,  	.set_settings		= e1000_set_settings,  	.get_drvinfo		= e1000_get_drvinfo, diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c index dff7bff8b8e..121a865c7fb 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c @@ -782,6 +782,59 @@ release:  }  /** + *  e1000_k1_workaround_lpt_lp - K1 workaround on Lynxpoint-LP + *  @hw:   pointer to the HW structure + *  @link: link up bool flag + * + *  When K1 is enabled for 1Gbps, the MAC can miss 2 DMA completion indications + *  preventing further DMA write requests.  Workaround the issue by disabling + *  the de-assertion of the clock request when in 1Gpbs mode. + **/ +static s32 e1000_k1_workaround_lpt_lp(struct e1000_hw *hw, bool link) +{ +	u32 fextnvm6 = er32(FEXTNVM6); +	s32 ret_val = 0; + +	if (link && (er32(STATUS) & E1000_STATUS_SPEED_1000)) { +		u16 kmrn_reg; + +		ret_val = hw->phy.ops.acquire(hw); +		if (ret_val) +			return ret_val; + +		ret_val = +		    e1000e_read_kmrn_reg_locked(hw, E1000_KMRNCTRLSTA_K1_CONFIG, +						&kmrn_reg); +		if (ret_val) +			goto release; + +		ret_val = +		    e1000e_write_kmrn_reg_locked(hw, +						 E1000_KMRNCTRLSTA_K1_CONFIG, +						 kmrn_reg & +						 ~E1000_KMRNCTRLSTA_K1_ENABLE); +		if (ret_val) +			goto release; + +		usleep_range(10, 20); + +		ew32(FEXTNVM6, fextnvm6 | E1000_FEXTNVM6_REQ_PLL_CLK); + +		ret_val = +		    e1000e_write_kmrn_reg_locked(hw, +						 E1000_KMRNCTRLSTA_K1_CONFIG, +						 kmrn_reg); +release: +		hw->phy.ops.release(hw); +	} else { +		/* clear FEXTNVM6 bit 8 on link down or 10/100 */ +		ew32(FEXTNVM6, fextnvm6 & ~E1000_FEXTNVM6_REQ_PLL_CLK); +	} + +	return ret_val; +} + +/**   *  e1000_check_for_copper_link_ich8lan - Check for link (Copper)   *  @hw: pointer to the HW structure   * @@ -818,6 +871,14 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)  			return ret_val;  	} +	/* Work-around I218 hang issue */ +	if ((hw->adapter->pdev->device == E1000_DEV_ID_PCH_LPTLP_I218_LM) || +	    (hw->adapter->pdev->device == E1000_DEV_ID_PCH_LPTLP_I218_V)) { +		ret_val = e1000_k1_workaround_lpt_lp(hw, link); +		if (ret_val) +			return ret_val; +	} +  	/* Clear link partner's EEE ability */  	hw->dev_spec.ich8lan.eee_lp_ability = 0; @@ -3954,8 +4015,16 @@ void e1000_suspend_workarounds_ich8lan(struct e1000_hw *hw)  	phy_ctrl = er32(PHY_CTRL);  	phy_ctrl |= E1000_PHY_CTRL_GBE_DISABLE; +  	if (hw->phy.type == e1000_phy_i217) { -		u16 phy_reg; +		u16 phy_reg, device_id = hw->adapter->pdev->device; + +		if ((device_id == E1000_DEV_ID_PCH_LPTLP_I218_LM) || +		    (device_id == E1000_DEV_ID_PCH_LPTLP_I218_V)) { +			u32 fextnvm6 = er32(FEXTNVM6); + +			ew32(FEXTNVM6, fextnvm6 & ~E1000_FEXTNVM6_REQ_PLL_CLK); +		}  		ret_val = hw->phy.ops.acquire(hw);  		if (ret_val) diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.h b/drivers/net/ethernet/intel/e1000e/ich8lan.h index b6d3174d7d2..8bf4655c2e1 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.h +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.h @@ -92,6 +92,8 @@  #define E1000_FEXTNVM4_BEACON_DURATION_8USEC	0x7  #define E1000_FEXTNVM4_BEACON_DURATION_16USEC	0x3 +#define E1000_FEXTNVM6_REQ_PLL_CLK	0x00000100 +  #define PCIE_ICH8_SNOOP_ALL	PCIE_NO_SNOOP_ALL  #define E1000_ICH_RAR_ENTRIES	7 diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index a177b8b65c4..7e615e2bf7e 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -848,11 +848,16 @@ check_page:  			}  		} -		if (!buffer_info->dma) +		if (!buffer_info->dma) {  			buffer_info->dma = dma_map_page(&pdev->dev,  			                                buffer_info->page, 0,  			                                PAGE_SIZE,  							DMA_FROM_DEVICE); +			if (dma_mapping_error(&pdev->dev, buffer_info->dma)) { +				adapter->alloc_rx_buff_failed++; +				break; +			} +		}  		rx_desc = E1000_RX_DESC_EXT(*rx_ring, i);  		rx_desc->read.buffer_addr = cpu_to_le64(buffer_info->dma); @@ -4303,6 +4308,7 @@ static int e1000_open(struct net_device *netdev)  	netif_start_queue(netdev);  	adapter->idle_check = true; +	hw->mac.get_link_status = true;  	pm_runtime_put(&pdev->dev);  	/* fire a link status change interrupt to start the watchdog */ @@ -4662,6 +4668,7 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter)  	    (adapter->hw.phy.media_type == e1000_media_type_copper)) {  		int ret_val; +		pm_runtime_get_sync(&adapter->pdev->dev);  		ret_val = e1e_rphy(hw, MII_BMCR, &phy->bmcr);  		ret_val |= e1e_rphy(hw, MII_BMSR, &phy->bmsr);  		ret_val |= e1e_rphy(hw, MII_ADVERTISE, &phy->advertise); @@ -4672,6 +4679,7 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter)  		ret_val |= e1e_rphy(hw, MII_ESTATUS, &phy->estatus);  		if (ret_val)  			e_warn("Error reading PHY register\n"); +		pm_runtime_put_sync(&adapter->pdev->dev);  	} else {  		/* Do not read PHY registers if link is not up  		 * Set values to typical power-on defaults @@ -5887,8 +5895,7 @@ release:  	return retval;  } -static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake, -			    bool runtime) +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); @@ -5912,10 +5919,6 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,  	}  	e1000e_reset_interrupt_capability(adapter); -	retval = pci_save_state(pdev); -	if (retval) -		return retval; -  	status = er32(STATUS);  	if (status & E1000_STATUS_LU)  		wufc &= ~E1000_WUFC_LNKC; @@ -5971,13 +5974,6 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,  		ew32(WUFC, 0);  	} -	*enable_wake = !!wufc; - -	/* make sure adapter isn't asleep if manageability is enabled */ -	if ((adapter->flags & FLAG_MNG_PT_ENABLED) || -	    (hw->mac.ops.check_mng_mode(hw))) -		*enable_wake = true; -  	if (adapter->hw.phy.type == e1000_phy_igp_3)  		e1000e_igp3_phy_powerdown_workaround_ich8lan(&adapter->hw); @@ -5986,27 +5982,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake,  	 */  	e1000e_release_hw_control(adapter); -	pci_disable_device(pdev); - -	return 0; -} - -static void e1000_power_off(struct pci_dev *pdev, bool sleep, bool wake) -{ -	if (sleep && wake) { -		pci_prepare_to_sleep(pdev); -		return; -	} - -	pci_wake_from_d3(pdev, wake); -	pci_set_power_state(pdev, PCI_D3hot); -} - -static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep, -                                    bool wake) -{ -	struct net_device *netdev = pci_get_drvdata(pdev); -	struct e1000_adapter *adapter = netdev_priv(netdev); +	pci_clear_master(pdev);  	/* The pci-e switch on some quad port adapters will report a  	 * correctable error when the MAC transitions from D0 to D3.  To @@ -6021,12 +5997,13 @@ static void e1000_complete_shutdown(struct pci_dev *pdev, bool sleep,  		pcie_capability_write_word(us_dev, PCI_EXP_DEVCTL,  					   (devctl & ~PCI_EXP_DEVCTL_CERE)); -		e1000_power_off(pdev, sleep, wake); +		pci_save_state(pdev); +		pci_prepare_to_sleep(pdev);  		pcie_capability_write_word(us_dev, PCI_EXP_DEVCTL, devctl); -	} else { -		e1000_power_off(pdev, sleep, wake);  	} + +	return 0;  }  #ifdef CONFIG_PCIEASPM @@ -6084,9 +6061,7 @@ static int __e1000_resume(struct pci_dev *pdev)  	if (aspm_disable_flag)  		e1000e_disable_aspm(pdev, aspm_disable_flag); -	pci_set_power_state(pdev, PCI_D0); -	pci_restore_state(pdev); -	pci_save_state(pdev); +	pci_set_master(pdev);  	e1000e_set_interrupt_capability(adapter);  	if (netif_running(netdev)) { @@ -6152,14 +6127,8 @@ static int __e1000_resume(struct pci_dev *pdev)  static int e1000_suspend(struct device *dev)  {  	struct pci_dev *pdev = to_pci_dev(dev); -	int retval; -	bool wake; -	retval = __e1000_shutdown(pdev, &wake, false); -	if (!retval) -		e1000_complete_shutdown(pdev, true, wake); - -	return retval; +	return __e1000_shutdown(pdev, false);  }  static int e1000_resume(struct device *dev) @@ -6182,13 +6151,10 @@ static int e1000_runtime_suspend(struct device *dev)  	struct net_device *netdev = pci_get_drvdata(pdev);  	struct e1000_adapter *adapter = netdev_priv(netdev); -	if (e1000e_pm_ready(adapter)) { -		bool wake; - -		__e1000_shutdown(pdev, &wake, true); -	} +	if (!e1000e_pm_ready(adapter)) +		return 0; -	return 0; +	return __e1000_shutdown(pdev, true);  }  static int e1000_idle(struct device *dev) @@ -6226,12 +6192,7 @@ static int e1000_runtime_resume(struct device *dev)  static void e1000_shutdown(struct pci_dev *pdev)  { -	bool wake = false; - -	__e1000_shutdown(pdev, &wake, false); - -	if (system_state == SYSTEM_POWER_OFF) -		e1000_complete_shutdown(pdev, false, wake); +	__e1000_shutdown(pdev, false);  }  #ifdef CONFIG_NET_POLL_CONTROLLER @@ -6352,9 +6313,9 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)  			"Cannot re-enable PCI device after reset.\n");  		result = PCI_ERS_RESULT_DISCONNECT;  	} else { -		pci_set_master(pdev);  		pdev->state_saved = true;  		pci_restore_state(pdev); +		pci_set_master(pdev);  		pci_enable_wake(pdev, PCI_D3hot, 0);  		pci_enable_wake(pdev, PCI_D3cold, 0); @@ -6783,7 +6744,11 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	/* initialize the wol settings based on the eeprom settings */  	adapter->wol = adapter->eeprom_wol; -	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); + +	/* make sure adapter isn't asleep if manageability is enabled */ +	if (adapter->wol || (adapter->flags & FLAG_MNG_PT_ENABLED) || +	    (hw->mac.ops.check_mng_mode(hw))) +		device_wakeup_enable(&pdev->dev);  	/* save off EEPROM version number */  	e1000_read_nvm(&adapter->hw, 5, 1, &adapter->eeprom_vers); diff --git a/drivers/net/ethernet/intel/e1000e/regs.h b/drivers/net/ethernet/intel/e1000e/regs.h index 794fe149766..a7e6a3e3725 100644 --- a/drivers/net/ethernet/intel/e1000e/regs.h +++ b/drivers/net/ethernet/intel/e1000e/regs.h @@ -42,6 +42,7 @@  #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 */ +#define E1000_FEXTNVM6	0x00010	/* Future Extended NVM 6 - RW */  #define E1000_FEXTNVM7	0x000E4	/* Future Extended NVM 7 - RW */  #define E1000_FCT	0x00030	/* Flow Control Type - RW */  #define E1000_VET	0x00038	/* VLAN Ether Type - RW */ diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c b/drivers/net/ethernet/intel/igb/e1000_82575.c index 84e7e0909de..12b1d848080 100644 --- a/drivers/net/ethernet/intel/igb/e1000_82575.c +++ b/drivers/net/ethernet/intel/igb/e1000_82575.c @@ -1361,11 +1361,16 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)  	switch (hw->phy.type) {  	case e1000_phy_i210:  	case e1000_phy_m88: -		if (hw->phy.id == I347AT4_E_PHY_ID || -		    hw->phy.id == M88E1112_E_PHY_ID) +		switch (hw->phy.id) { +		case I347AT4_E_PHY_ID: +		case M88E1112_E_PHY_ID: +		case I210_I_PHY_ID:  			ret_val = igb_copper_link_setup_m88_gen2(hw); -		else +			break; +		default:  			ret_val = igb_copper_link_setup_m88(hw); +			break; +		}  		break;  	case e1000_phy_igp_3:  		ret_val = igb_copper_link_setup_igp(hw); @@ -1813,27 +1818,32 @@ out:   **/  void igb_vmdq_set_anti_spoofing_pf(struct e1000_hw *hw, bool enable, int pf)  { -	u32 dtxswc; +	u32 reg_val, reg_offset;  	switch (hw->mac.type) {  	case e1000_82576: +		reg_offset = E1000_DTXSWC; +		break;  	case e1000_i350: -		dtxswc = rd32(E1000_DTXSWC); -		if (enable) { -			dtxswc |= (E1000_DTXSWC_MAC_SPOOF_MASK | -				   E1000_DTXSWC_VLAN_SPOOF_MASK); -			/* The PF can spoof - it has to in order to -			 * support emulation mode NICs */ -			dtxswc ^= (1 << pf | 1 << (pf + MAX_NUM_VFS)); -		} else { -			dtxswc &= ~(E1000_DTXSWC_MAC_SPOOF_MASK | -				    E1000_DTXSWC_VLAN_SPOOF_MASK); -		} -		wr32(E1000_DTXSWC, dtxswc); +		reg_offset = E1000_TXSWC;  		break;  	default: -		break; +		return; +	} + +	reg_val = rd32(reg_offset); +	if (enable) { +		reg_val |= (E1000_DTXSWC_MAC_SPOOF_MASK | +			     E1000_DTXSWC_VLAN_SPOOF_MASK); +		/* The PF can spoof - it has to in order to +		 * support emulation mode NICs +		 */ +		reg_val ^= (1 << pf | 1 << (pf + MAX_NUM_VFS)); +	} else { +		reg_val &= ~(E1000_DTXSWC_MAC_SPOOF_MASK | +			     E1000_DTXSWC_VLAN_SPOOF_MASK);  	} +	wr32(reg_offset, reg_val);  }  /** diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index d27edbc6392..ab577a763a2 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h @@ -284,18 +284,10 @@ struct igb_q_vector {  enum e1000_ring_flags_t {  	IGB_RING_FLAG_RX_SCTP_CSUM,  	IGB_RING_FLAG_RX_LB_VLAN_BSWAP, -	IGB_RING_FLAG_RX_BUILD_SKB_ENABLED,  	IGB_RING_FLAG_TX_CTX_IDX,  	IGB_RING_FLAG_TX_DETECT_HANG  }; -#define ring_uses_build_skb(ring) \ -	test_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags) -#define set_ring_build_skb_enabled(ring) \ -	set_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags) -#define clear_ring_build_skb_enabled(ring) \ -	clear_bit(IGB_RING_FLAG_RX_BUILD_SKB_ENABLED, &(ring)->flags) -  #define IGB_TXD_DCMD (E1000_ADVTXD_DCMD_EOP | E1000_ADVTXD_DCMD_RS)  #define IGB_RX_DESC(R, i)	    \ @@ -447,7 +439,7 @@ struct igb_adapter {  #endif  	struct i2c_algo_bit_data i2c_algo;  	struct i2c_adapter i2c_adap; -	struct igb_i2c_client_list *i2c_clients; +	struct i2c_client *i2c_client;  };  #define IGB_FLAG_HAS_MSI		(1 << 0) diff --git a/drivers/net/ethernet/intel/igb/igb_hwmon.c b/drivers/net/ethernet/intel/igb/igb_hwmon.c index 0a9b073d0b0..0478a1abe54 100644 --- a/drivers/net/ethernet/intel/igb/igb_hwmon.c +++ b/drivers/net/ethernet/intel/igb/igb_hwmon.c @@ -39,6 +39,10 @@  #include <linux/pci.h>  #ifdef CONFIG_IGB_HWMON +static struct i2c_board_info i350_sensor_info = { +	I2C_BOARD_INFO("i350bb", (0Xf8 >> 1)), +}; +  /* hwmon callback functions */  static ssize_t igb_hwmon_show_location(struct device *dev,  					 struct device_attribute *attr, @@ -188,6 +192,7 @@ int igb_sysfs_init(struct igb_adapter *adapter)  	unsigned int i;  	int n_attrs;  	int rc = 0; +	struct i2c_client *client = NULL;  	/* If this method isn't defined we don't support thermals */  	if (adapter->hw.mac.ops.init_thermal_sensor_thresh == NULL) @@ -198,6 +203,15 @@ int igb_sysfs_init(struct igb_adapter *adapter)  		if (rc)  			goto exit; +	/* init i2c_client */ +	client = i2c_new_device(&adapter->i2c_adap, &i350_sensor_info); +	if (client == NULL) { +		dev_info(&adapter->pdev->dev, +			"Failed to create new i2c device..\n"); +		goto exit; +	} +	adapter->i2c_client = client; +  	/* Allocation space for max attributes  	 * max num sensors * values (loc, temp, max, caution)  	 */ diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index ed79a1c53b5..64f75291e3a 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -1923,10 +1923,6 @@ void igb_set_fw_version(struct igb_adapter *adapter)  	return;  } -static const struct i2c_board_info i350_sensor_info = { -	I2C_BOARD_INFO("i350bb", 0Xf8), -}; -  /*  igb_init_i2c - Init I2C interface   *  @adapter: pointer to adapter structure   * @@ -2546,8 +2542,8 @@ static void igb_probe_vfs(struct igb_adapter *adapter)  	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))  		return; -	igb_enable_sriov(pdev, max_vfs);  	pci_sriov_set_totalvfs(pdev, 7); +	igb_enable_sriov(pdev, max_vfs);  #endif /* CONFIG_PCI_IOV */  } @@ -2656,7 +2652,7 @@ static int igb_sw_init(struct igb_adapter *adapter)  		if (max_vfs > 7) {  			dev_warn(&pdev->dev,  				 "Maximum of 7 VFs per PF, using max\n"); -			adapter->vfs_allocated_count = 7; +			max_vfs = adapter->vfs_allocated_count = 7;  		} else  			adapter->vfs_allocated_count = max_vfs;  		if (adapter->vfs_allocated_count) @@ -3354,20 +3350,6 @@ void igb_configure_rx_ring(struct igb_adapter *adapter,  	wr32(E1000_RXDCTL(reg_idx), rxdctl);  } -static void igb_set_rx_buffer_len(struct igb_adapter *adapter, -				  struct igb_ring *rx_ring) -{ -#define IGB_MAX_BUILD_SKB_SIZE \ -	(SKB_WITH_OVERHEAD(IGB_RX_BUFSZ) - \ -	 (NET_SKB_PAD + NET_IP_ALIGN + IGB_TS_HDR_LEN)) - -	/* set build_skb flag */ -	if (adapter->max_frame_size <= IGB_MAX_BUILD_SKB_SIZE) -		set_ring_build_skb_enabled(rx_ring); -	else -		clear_ring_build_skb_enabled(rx_ring); -} -  /**   * igb_configure_rx - Configure receive Unit after Reset   * @adapter: board private structure @@ -3387,11 +3369,8 @@ static void igb_configure_rx(struct igb_adapter *adapter)  	/* Setup the HW Rx Head and Tail Descriptor Pointers and  	 * the Base and Length of the Rx Descriptor Ring */ -	for (i = 0; i < adapter->num_rx_queues; i++) { -		struct igb_ring *rx_ring = adapter->rx_ring[i]; -		igb_set_rx_buffer_len(adapter, rx_ring); -		igb_configure_rx_ring(adapter, rx_ring); -	} +	for (i = 0; i < adapter->num_rx_queues; i++) +		igb_configure_rx_ring(adapter, adapter->rx_ring[i]);  }  /** @@ -6207,85 +6186,6 @@ static bool igb_add_rx_frag(struct igb_ring *rx_ring,  	return igb_can_reuse_rx_page(rx_buffer, page, truesize);  } -static struct sk_buff *igb_build_rx_buffer(struct igb_ring *rx_ring, -					   union e1000_adv_rx_desc *rx_desc) -{ -	struct igb_rx_buffer *rx_buffer; -	struct sk_buff *skb; -	struct page *page; -	void *page_addr; -	unsigned int size = le16_to_cpu(rx_desc->wb.upper.length); -#if (PAGE_SIZE < 8192) -	unsigned int truesize = IGB_RX_BUFSZ; -#else -	unsigned int truesize = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) + -				SKB_DATA_ALIGN(NET_SKB_PAD + -					       NET_IP_ALIGN + -					       size); -#endif - -	/* If we spanned a buffer we have a huge mess so test for it */ -	BUG_ON(unlikely(!igb_test_staterr(rx_desc, E1000_RXD_STAT_EOP))); - -	/* Guarantee this function can be used by verifying buffer sizes */ -	BUILD_BUG_ON(SKB_WITH_OVERHEAD(IGB_RX_BUFSZ) < (NET_SKB_PAD + -							NET_IP_ALIGN + -							IGB_TS_HDR_LEN + -							ETH_FRAME_LEN + -							ETH_FCS_LEN)); - -	rx_buffer = &rx_ring->rx_buffer_info[rx_ring->next_to_clean]; -	page = rx_buffer->page; -	prefetchw(page); - -	page_addr = page_address(page) + rx_buffer->page_offset; - -	/* prefetch first cache line of first page */ -	prefetch(page_addr + NET_SKB_PAD + NET_IP_ALIGN); -#if L1_CACHE_BYTES < 128 -	prefetch(page_addr + L1_CACHE_BYTES + NET_SKB_PAD + NET_IP_ALIGN); -#endif - -	/* build an skb to around the page buffer */ -	skb = build_skb(page_addr, truesize); -	if (unlikely(!skb)) { -		rx_ring->rx_stats.alloc_failed++; -		return NULL; -	} - -	/* we are reusing so sync this buffer for CPU use */ -	dma_sync_single_range_for_cpu(rx_ring->dev, -				      rx_buffer->dma, -				      rx_buffer->page_offset, -				      IGB_RX_BUFSZ, -				      DMA_FROM_DEVICE); - -	/* update pointers within the skb to store the data */ -	skb_reserve(skb, NET_IP_ALIGN + NET_SKB_PAD); -	__skb_put(skb, size); - -	/* pull timestamp out of packet data */ -	if (igb_test_staterr(rx_desc, E1000_RXDADV_STAT_TSIP)) { -		igb_ptp_rx_pktstamp(rx_ring->q_vector, skb->data, skb); -		__skb_pull(skb, IGB_TS_HDR_LEN); -	} - -	if (igb_can_reuse_rx_page(rx_buffer, page, truesize)) { -		/* hand second half of page back to the ring */ -		igb_reuse_rx_page(rx_ring, rx_buffer); -	} else { -		/* we are not reusing the buffer so unmap it */ -		dma_unmap_page(rx_ring->dev, rx_buffer->dma, -			       PAGE_SIZE, DMA_FROM_DEVICE); -	} - -	/* clear contents of buffer_info */ -	rx_buffer->dma = 0; -	rx_buffer->page = NULL; - -	return skb; -} -  static struct sk_buff *igb_fetch_rx_buffer(struct igb_ring *rx_ring,  					   union e1000_adv_rx_desc *rx_desc,  					   struct sk_buff *skb) @@ -6701,10 +6601,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)  		rmb();  		/* retrieve a buffer from the ring */ -		if (ring_uses_build_skb(rx_ring)) -			skb = igb_build_rx_buffer(rx_ring, rx_desc); -		else -			skb = igb_fetch_rx_buffer(rx_ring, rx_desc, skb); +		skb = igb_fetch_rx_buffer(rx_ring, rx_desc, skb);  		/* exit if we failed to retrieve a buffer */  		if (!skb) @@ -6791,14 +6688,6 @@ static bool igb_alloc_mapped_page(struct igb_ring *rx_ring,  	return true;  } -static inline unsigned int igb_rx_offset(struct igb_ring *rx_ring) -{ -	if (ring_uses_build_skb(rx_ring)) -		return NET_SKB_PAD + NET_IP_ALIGN; -	else -		return 0; -} -  /**   * igb_alloc_rx_buffers - Replace used receive buffers; packet split   * @adapter: address of board private structure @@ -6825,9 +6714,7 @@ void igb_alloc_rx_buffers(struct igb_ring *rx_ring, u16 cleaned_count)  		 * Refresh the desc even if buffer_addrs didn't change  		 * because each write-back erases this info.  		 */ -		rx_desc->read.pkt_addr = cpu_to_le64(bi->dma + -						     bi->page_offset + -						     igb_rx_offset(rx_ring)); +		rx_desc->read.pkt_addr = cpu_to_le64(bi->dma + bi->page_offset);  		rx_desc++;  		bi++; @@ -7724,67 +7611,6 @@ static void igb_init_dmac(struct igb_adapter *adapter, u32 pba)  	}  } -static DEFINE_SPINLOCK(i2c_clients_lock); - -/*  igb_get_i2c_client - returns matching client - *  in adapters's client list. - *  @adapter: adapter struct - *  @dev_addr: device address of i2c needed. - */ -static struct i2c_client * -igb_get_i2c_client(struct igb_adapter *adapter, u8 dev_addr) -{ -	ulong flags; -	struct igb_i2c_client_list *client_list; -	struct i2c_client *client = NULL; -	struct i2c_board_info client_info = { -		I2C_BOARD_INFO("igb", 0x00), -	}; - -	spin_lock_irqsave(&i2c_clients_lock, flags); -	client_list = adapter->i2c_clients; - -	/* See if we already have an i2c_client */ -	while (client_list) { -		if (client_list->client->addr == (dev_addr >> 1)) { -			client = client_list->client; -			goto exit; -		} else { -			client_list = client_list->next; -		} -	} - -	/* no client_list found, create a new one */ -	client_list = kzalloc(sizeof(*client_list), GFP_ATOMIC); -	if (client_list == NULL) -		goto exit; - -	/* dev_addr passed to us is left-shifted by 1 bit -	 * i2c_new_device call expects it to be flush to the right. -	 */ -	client_info.addr = dev_addr >> 1; -	client_info.platform_data = adapter; -	client_list->client = i2c_new_device(&adapter->i2c_adap, &client_info); -	if (client_list->client == NULL) { -		dev_info(&adapter->pdev->dev, -			"Failed to create new i2c device..\n"); -		goto err_no_client; -	} - -	/* insert new client at head of list */ -	client_list->next = adapter->i2c_clients; -	adapter->i2c_clients = client_list; - -	client = client_list->client; -	goto exit; - -err_no_client: -	kfree(client_list); -exit: -	spin_unlock_irqrestore(&i2c_clients_lock, flags); -	return client; -} -  /*  igb_read_i2c_byte - Reads 8 bit word over I2C   *  @hw: pointer to hardware structure   *  @byte_offset: byte offset to read @@ -7798,7 +7624,7 @@ s32 igb_read_i2c_byte(struct e1000_hw *hw, u8 byte_offset,  				u8 dev_addr, u8 *data)  {  	struct igb_adapter *adapter = container_of(hw, struct igb_adapter, hw); -	struct i2c_client *this_client = igb_get_i2c_client(adapter, dev_addr); +	struct i2c_client *this_client = adapter->i2c_client;  	s32 status;  	u16 swfw_mask = 0; @@ -7835,7 +7661,7 @@ s32 igb_write_i2c_byte(struct e1000_hw *hw, u8 byte_offset,  				 u8 dev_addr, u8 data)  {  	struct igb_adapter *adapter = container_of(hw, struct igb_adapter, hw); -	struct i2c_client *this_client = igb_get_i2c_client(adapter, dev_addr); +	struct i2c_client *this_client = adapter->i2c_client;  	s32 status;  	u16 swfw_mask = E1000_SWFW_PHY0_SM; diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c index 0987822359f..0a237507ee8 100644 --- a/drivers/net/ethernet/intel/igb/igb_ptp.c +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c @@ -740,7 +740,7 @@ void igb_ptp_init(struct igb_adapter *adapter)  	case e1000_82576:  		snprintf(adapter->ptp_caps.name, 16, "%pm", netdev->dev_addr);  		adapter->ptp_caps.owner = THIS_MODULE; -		adapter->ptp_caps.max_adj = 1000000000; +		adapter->ptp_caps.max_adj = 999999881;  		adapter->ptp_caps.n_ext_ts = 0;  		adapter->ptp_caps.pps = 0;  		adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82576; diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_main.c b/drivers/net/ethernet/intel/ixgb/ixgb_main.c index ea480837343..b5f94abe3cf 100644 --- a/drivers/net/ethernet/intel/ixgb/ixgb_main.c +++ b/drivers/net/ethernet/intel/ixgb/ixgb_main.c @@ -2159,6 +2159,10 @@ map_skb:  		                                  skb->data,  		                                  adapter->rx_buffer_len,  						  DMA_FROM_DEVICE); +		if (dma_mapping_error(&pdev->dev, buffer_info->dma)) { +			adapter->alloc_rx_buff_failed++; +			break; +		}  		rx_desc = IXGB_RX_DESC(*rx_ring, i);  		rx_desc->buff_addr = cpu_to_le64(buffer_info->dma); @@ -2168,7 +2172,8 @@ map_skb:  		rx_desc->status = 0; -		if (++i == rx_ring->count) i = 0; +		if (++i == rx_ring->count) +			i = 0;  		buffer_info = &rx_ring->buffer_info[i];  	} diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index db5611ae407..79f4a26ea6c 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -7922,12 +7922,19 @@ static int __init ixgbe_init_module(void)  	ixgbe_dbg_init();  #endif /* CONFIG_DEBUG_FS */ +	ret = pci_register_driver(&ixgbe_driver); +	if (ret) { +#ifdef CONFIG_DEBUG_FS +		ixgbe_dbg_exit(); +#endif /* CONFIG_DEBUG_FS */ +		return ret; +	} +  #ifdef CONFIG_IXGBE_DCA  	dca_register_notify(&dca_notifier);  #endif -	ret = pci_register_driver(&ixgbe_driver); -	return ret; +	return 0;  }  module_init(ixgbe_init_module); diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index d44b4d21268..97e33669c0b 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -1049,6 +1049,12 @@ int ixgbe_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos)  	if ((vf >= adapter->num_vfs) || (vlan > 4095) || (qos > 7))  		return -EINVAL;  	if (vlan || qos) { +		if (adapter->vfinfo[vf].pf_vlan) +			err = ixgbe_set_vf_vlan(adapter, false, +						adapter->vfinfo[vf].pf_vlan, +						vf); +		if (err) +			goto out;  		err = ixgbe_set_vf_vlan(adapter, true, vlan, vf);  		if (err)  			goto out; diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index c3db6cd69b6..2b6cb5ca48e 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c @@ -944,9 +944,17 @@ free_queue_irqs:  		free_irq(adapter->msix_entries[vector].vector,  			 adapter->q_vector[vector]);  	} -	pci_disable_msix(adapter->pdev); -	kfree(adapter->msix_entries); -	adapter->msix_entries = NULL; +	/* This failure is non-recoverable - it indicates the system is +	 * out of MSIX vector resources and the VF driver cannot run +	 * without them.  Set the number of msix vectors to zero +	 * indicating that not enough can be allocated.  The error +	 * will be returned to the user indicating device open failed. +	 * Any further attempts to force the driver to open will also +	 * fail.  The only way to recover is to unload the driver and +	 * reload it again.  If the system has recovered some MSIX +	 * vectors then it may succeed. +	 */ +	adapter->num_msix_vectors = 0;  	return err;  } @@ -2572,6 +2580,15 @@ static int ixgbevf_open(struct net_device *netdev)  	struct ixgbe_hw *hw = &adapter->hw;  	int err; +	/* A previous failure to open the device because of a lack of +	 * available MSIX vector resources may have reset the number +	 * of msix vectors variable to zero.  The only way to recover +	 * is to unload/reload the driver and hope that the system has +	 * been able to recover some MSIX vector resources. +	 */ +	if (!adapter->num_msix_vectors) +		return -ENOMEM; +  	/* disallow open during test */  	if (test_bit(__IXGBEVF_TESTING, &adapter->state))  		return -EBUSY; @@ -2628,7 +2645,6 @@ static int ixgbevf_open(struct net_device *netdev)  err_req_irq:  	ixgbevf_down(adapter); -	ixgbevf_free_irq(adapter);  err_setup_rx:  	ixgbevf_free_all_rx_resources(adapter);  err_setup_tx:  |