diff options
| author | Carolyn Wyborny <carolyn.wyborny@intel.com> | 2012-04-06 23:25:19 +0000 | 
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-05-12 13:17:13 -0700 | 
| commit | f96a8a0b78548c0ec06b0b4b438db6ee895d67e9 (patch) | |
| tree | b1e6cc64dd55fc46cfb8877aa94db6a7940c1327 /drivers/net/ethernet/intel/igb/igb_main.c | |
| parent | da02cde1c1ffb798df6159a2252653a9becea51a (diff) | |
| download | olio-linux-3.10-f96a8a0b78548c0ec06b0b4b438db6ee895d67e9.tar.xz olio-linux-3.10-f96a8a0b78548c0ec06b0b4b438db6ee895d67e9.zip  | |
igb: Add Support for new i210/i211 devices.
This patch adds new initialization functions and device support
for i210 and i211 devices.
Signed-off-by: Carolyn Wyborny <carolyn.wyborny@intel.com>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 107 | 
1 files changed, 81 insertions, 26 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 80d52d2dfea..ba21f9c72a2 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c @@ -75,6 +75,11 @@ static const struct e1000_info *igb_info_tbl[] = {  };  static DEFINE_PCI_DEVICE_TABLE(igb_pci_tbl) = { +	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I211_COPPER), board_82575 }, +	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_COPPER), board_82575 }, +	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_FIBER), board_82575 }, +	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SERDES), board_82575 }, +	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I210_SGMII), board_82575 },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_COPPER), board_82575 },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_FIBER), board_82575 },  	{ PCI_VDEVICE(INTEL, E1000_DEV_ID_I350_SERDES), board_82575 }, @@ -641,6 +646,8 @@ static void igb_cache_ring_register(struct igb_adapter *adapter)  	case e1000_82575:  	case e1000_82580:  	case e1000_i350: +	case e1000_i210: +	case e1000_i211:  	default:  		for (; i < adapter->num_rx_queues; i++)  			adapter->rx_ring[i]->reg_idx = rbase_offset + i; @@ -727,8 +734,11 @@ static int igb_alloc_queues(struct igb_adapter *adapter)  		if (adapter->hw.mac.type >= e1000_82576)  			set_bit(IGB_RING_FLAG_RX_SCTP_CSUM, &ring->flags); -		/* On i350, loopback VLAN packets have the tag byte-swapped. */ -		if (adapter->hw.mac.type == e1000_i350) +		/* +		 * On i350, i210, and i211, loopback VLAN packets +		 * have the tag byte-swapped. +		 * */ +		if (adapter->hw.mac.type >= e1000_i350)  			set_bit(IGB_RING_FLAG_RX_LB_VLAN_BSWAP, &ring->flags);  		adapter->rx_ring[i] = ring; @@ -822,6 +832,8 @@ static void igb_assign_vector(struct igb_q_vector *q_vector, int msix_vector)  		break;  	case e1000_82580:  	case e1000_i350: +	case e1000_i210: +	case e1000_i211:  		/*  		 * On 82580 and newer adapters the scheme is similar to 82576  		 * however instead of ordering column-major we have things @@ -888,6 +900,8 @@ static void igb_configure_msix(struct igb_adapter *adapter)  	case e1000_82576:  	case e1000_82580:  	case e1000_i350: +	case e1000_i210: +	case e1000_i211:  		/* Turn on MSI-X capability first, or our settings  		 * won't stick.  And it will take days to debug. */  		wr32(E1000_GPIE, E1000_GPIE_MSIX_MODE | @@ -1034,6 +1048,11 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter)  	if (!(adapter->flags & IGB_FLAG_QUEUE_PAIRS))  		numvecs += adapter->num_tx_queues; +	/* i210 and i211 can only have 4 MSIX vectors for rx/tx queues. */ +	if ((adapter->hw.mac.type == e1000_i210) +		|| (adapter->hw.mac.type == e1000_i211)) +		numvecs = 4; +  	/* store the number of vectors reserved for queues */  	adapter->num_q_vectors = numvecs; @@ -1041,6 +1060,7 @@ static int igb_set_interrupt_capability(struct igb_adapter *adapter)  	numvecs++;  	adapter->msix_entries = kcalloc(numvecs, sizeof(struct msix_entry),  					GFP_KERNEL); +  	if (!adapter->msix_entries)  		goto msi_only; @@ -1631,6 +1651,8 @@ void igb_reset(struct igb_adapter *adapter)  		pba &= E1000_RXPBS_SIZE_MASK_82576;  		break;  	case e1000_82575: +	case e1000_i210: +	case e1000_i211:  	default:  		pba = E1000_PBA_34K;  		break; @@ -1826,7 +1848,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,  	 */  	if (pdev->is_virtfn) {  		WARN(1, KERN_ERR "%s (%hx:%hx) should not be a VF!\n", -		     pci_name(pdev), pdev->vendor, pdev->device); +			pci_name(pdev), pdev->vendor, pdev->device);  		return -EINVAL;  	} @@ -1980,11 +2002,16 @@ static int __devinit igb_probe(struct pci_dev *pdev,  	 * known good starting state */  	hw->mac.ops.reset_hw(hw); -	/* make sure the NVM is good */ -	if (hw->nvm.ops.validate(hw) < 0) { -		dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n"); -		err = -EIO; -		goto err_eeprom; +	/* +	 * make sure the NVM is good , i211 parts have special NVM that +	 * doesn't contain a checksum +	 */ +	if (hw->mac.type != e1000_i211) { +		if (hw->nvm.ops.validate(hw) < 0) { +			dev_err(&pdev->dev, "The NVM Checksum Is Not Valid\n"); +			err = -EIO; +			goto err_eeprom; +		}  	}  	/* copy the MAC address out of the NVM */ @@ -2118,6 +2145,8 @@ static int __devinit igb_probe(struct pci_dev *pdev,  		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;  	default: @@ -2244,9 +2273,14 @@ static void __devinit igb_probe_vfs(struct igb_adapter * adapter)  {  #ifdef CONFIG_PCI_IOV  	struct pci_dev *pdev = adapter->pdev; +	struct e1000_hw *hw = &adapter->hw;  	int old_vfs = igb_find_enabled_vfs(adapter);  	int i; +	/* Virtualization features not supported on i210 family. */ +	if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211)) +		return; +  	if (old_vfs) {  		dev_info(&pdev->dev, "%d pre-allocated VFs found - override "  			 "max_vfs setting of %d\n", old_vfs, max_vfs); @@ -2258,6 +2292,7 @@ static void __devinit igb_probe_vfs(struct igb_adapter * adapter)  	adapter->vf_data = kcalloc(adapter->vfs_allocated_count,  				sizeof(struct vf_data_storage), GFP_KERNEL); +  	/* if allocation failed then we do not support SR-IOV */  	if (!adapter->vf_data) {  		adapter->vfs_allocated_count = 0; @@ -2332,11 +2367,28 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)  		} else  			adapter->vfs_allocated_count = max_vfs;  		break; +	case e1000_i210: +	case e1000_i211: +		adapter->vfs_allocated_count = 0; +		break;  	default:  		break;  	}  #endif /* CONFIG_PCI_IOV */ -	adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, num_online_cpus()); +	switch (hw->mac.type) { +	case e1000_i210: +		adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I210, +			num_online_cpus()); +		break; +	case e1000_i211: +		adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I211, +			num_online_cpus()); +		break; +	default: +		adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES, +		num_online_cpus()); +		break; +	}  	/* i350 cannot do RSS and SR-IOV at the same time */  	if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count)  		adapter->rss_queues = 1; @@ -2366,7 +2418,7 @@ static int __devinit igb_sw_init(struct igb_adapter *adapter)  	/* Explicitly disable IRQ since the NIC can be in any state. */  	igb_irq_disable(adapter); -	if (hw->mac.type == e1000_i350) +	if (hw->mac.type >= e1000_i350)  		adapter->flags &= ~IGB_FLAG_DMAC;  	set_bit(__IGB_DOWN, &adapter->state); @@ -2819,6 +2871,17 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)  	/* Don't need to set TUOFL or IPOFL, they default to 1 */  	wr32(E1000_RXCSUM, rxcsum); +	/* +	 * Generate RSS hash based on TCP port numbers and/or +	 * IPv4/v6 src and dst addresses since UDP cannot be +	 * hashed reliably due to IP fragmentation +	 */ + +	mrqc = E1000_MRQC_RSS_FIELD_IPV4 | +	       E1000_MRQC_RSS_FIELD_IPV4_TCP | +	       E1000_MRQC_RSS_FIELD_IPV6 | +	       E1000_MRQC_RSS_FIELD_IPV6_TCP | +	       E1000_MRQC_RSS_FIELD_IPV6_TCP_EX;  	/* If VMDq is enabled then we set the appropriate mode for that, else  	 * we default to RSS so that an RSS hash is calculated per packet even @@ -2834,25 +2897,15 @@ static void igb_setup_mrqc(struct igb_adapter *adapter)  			wr32(E1000_VT_CTL, vtctl);  		}  		if (adapter->rss_queues > 1) -			mrqc = E1000_MRQC_ENABLE_VMDQ_RSS_2Q; +			mrqc |= E1000_MRQC_ENABLE_VMDQ_RSS_2Q;  		else -			mrqc = E1000_MRQC_ENABLE_VMDQ; +			mrqc |= E1000_MRQC_ENABLE_VMDQ;  	} else { -		mrqc = E1000_MRQC_ENABLE_RSS_4Q; +		if (hw->mac.type != e1000_i211) +			mrqc |= E1000_MRQC_ENABLE_RSS_4Q;  	}  	igb_vmm_control(adapter); -	/* -	 * Generate RSS hash based on TCP port numbers and/or -	 * IPv4/v6 src and dst addresses since UDP cannot be -	 * hashed reliably due to IP fragmentation -	 */ -	mrqc |= E1000_MRQC_RSS_FIELD_IPV4 | -		E1000_MRQC_RSS_FIELD_IPV4_TCP | -		E1000_MRQC_RSS_FIELD_IPV6 | -		E1000_MRQC_RSS_FIELD_IPV6_TCP | -		E1000_MRQC_RSS_FIELD_IPV6_TCP_EX; -  	wr32(E1000_MRQC, mrqc);  } @@ -3454,7 +3507,7 @@ static void igb_set_rx_mode(struct net_device *netdev)  	 * we will have issues with VLAN tag stripping not being done for frames  	 * that are only arriving because we are the default pool  	 */ -	if (hw->mac.type < e1000_82576) +	if ((hw->mac.type < e1000_82576) || (hw->mac.type > e1000_i350))  		return;  	vmolr |= rd32(E1000_VMOLR(vfn)) & @@ -3551,7 +3604,7 @@ static bool igb_thermal_sensor_event(struct e1000_hw *hw, u32 event)  	bool ret = false;  	u32 ctrl_ext, thstat; -	/* check for thermal sensor event on i350, copper only */ +	/* check for thermal sensor event on i350 copper only */  	if (hw->mac.type == e1000_i350) {  		thstat = rd32(E1000_THSTAT);  		ctrl_ext = rd32(E1000_CTRL_EXT); @@ -7027,6 +7080,8 @@ static void igb_vmm_control(struct igb_adapter *adapter)  	switch (hw->mac.type) {  	case e1000_82575: +	case e1000_i210: +	case e1000_i211:  	default:  		/* replication is not supported for 82575 */  		return;  |