diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
| commit | bf61c8840efe60fd8f91446860b63338fb424158 (patch) | |
| tree | 7a71832407a4f0d6346db773343f4c3ae2257b19 /drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |
| parent | 5846115b30f3a881e542c8bfde59a699c1c13740 (diff) | |
| parent | 0c6a61657da78098472fd0eb71cc01f2387fa1bb (diff) | |
| download | olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.tar.xz olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.zip  | |
Merge branch 'next' into for-linus
Prepare first set of updates for 3.10 merge window.
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 829 | 
1 files changed, 495 insertions, 334 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index fa3d552e1f4..db5611ae407 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -1,7 +1,7 @@  /*******************************************************************************    Intel 10 Gigabit PCI Express Linux driver -  Copyright(c) 1999 - 2012 Intel Corporation. +  Copyright(c) 1999 - 2013 Intel Corporation.    This program is free software; you can redistribute it and/or modify it    under the terms and conditions of the GNU General Public License, @@ -44,6 +44,7 @@  #include <linux/ethtool.h>  #include <linux/if.h>  #include <linux/if_vlan.h> +#include <linux/if_bridge.h>  #include <linux/prefetch.h>  #include <scsi/fc/fc_fcoe.h> @@ -62,14 +63,10 @@ char ixgbe_default_device_descr[] =  static char ixgbe_default_device_descr[] =  			      "Intel(R) 10 Gigabit Network Connection";  #endif -#define MAJ 3 -#define MIN 9 -#define BUILD 15 -#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \ -	__stringify(BUILD) "-k" +#define DRV_VERSION "3.11.33-k"  const char ixgbe_driver_version[] = DRV_VERSION;  static const char ixgbe_copyright[] = -				"Copyright (c) 1999-2012 Intel Corporation."; +				"Copyright (c) 1999-2013 Intel Corporation.";  static const struct ixgbe_info *ixgbe_info_tbl[] = {  	[board_82598] = &ixgbe_82598_info, @@ -335,11 +332,13 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)  		goto exit;  	dev_info(&adapter->pdev->dev, "TX Rings Summary\n"); -	pr_info("Queue [NTU] [NTC] [bi(ntc)->dma  ] leng ntw timestamp\n"); +	pr_info(" %s     %s              %s        %s\n", +		"Queue [NTU] [NTC] [bi(ntc)->dma  ]", +		"leng", "ntw", "timestamp");  	for (n = 0; n < adapter->num_tx_queues; n++) {  		tx_ring = adapter->tx_ring[n];  		tx_buffer = &tx_ring->tx_buffer_info[tx_ring->next_to_clean]; -		pr_info(" %5d %5X %5X %016llX %04X %p %016llX\n", +		pr_info(" %5d %5X %5X %016llX %08X %p %016llX\n",  			   n, tx_ring->next_to_use, tx_ring->next_to_clean,  			   (u64)dma_unmap_addr(tx_buffer, dma),  			   dma_unmap_len(tx_buffer, len), @@ -355,13 +354,37 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)  	/* Transmit Descriptor Formats  	 * -	 * Advanced Transmit Descriptor +	 * 82598 Advanced Transmit Descriptor  	 *   +--------------------------------------------------------------+  	 * 0 |         Buffer Address [63:0]                                |  	 *   +--------------------------------------------------------------+ -	 * 8 |  PAYLEN  | PORTS  | IDX | STA | DCMD  |DTYP |  RSV |  DTALEN | +	 * 8 |  PAYLEN  | POPTS  | IDX | STA | DCMD  |DTYP |  RSV |  DTALEN |  	 *   +--------------------------------------------------------------+  	 *   63       46 45    40 39 36 35 32 31   24 23 20 19              0 +	 * +	 * 82598 Advanced Transmit Descriptor (Write-Back Format) +	 *   +--------------------------------------------------------------+ +	 * 0 |                          RSV [63:0]                          | +	 *   +--------------------------------------------------------------+ +	 * 8 |            RSV           |  STA  |          NXTSEQ           | +	 *   +--------------------------------------------------------------+ +	 *   63                       36 35   32 31                         0 +	 * +	 * 82599+ Advanced Transmit Descriptor +	 *   +--------------------------------------------------------------+ +	 * 0 |         Buffer Address [63:0]                                | +	 *   +--------------------------------------------------------------+ +	 * 8 |PAYLEN  |POPTS|CC|IDX  |STA  |DCMD  |DTYP |MAC  |RSV  |DTALEN | +	 *   +--------------------------------------------------------------+ +	 *   63     46 45 40 39 38 36 35 32 31  24 23 20 19 18 17 16 15     0 +	 * +	 * 82599+ Advanced Transmit Descriptor (Write-Back Format) +	 *   +--------------------------------------------------------------+ +	 * 0 |                          RSV [63:0]                          | +	 *   +--------------------------------------------------------------+ +	 * 8 |            RSV           |  STA  |           RSV             | +	 *   +--------------------------------------------------------------+ +	 *   63                       36 35   32 31                         0  	 */  	for (n = 0; n < adapter->num_tx_queues; n++) { @@ -369,40 +392,43 @@ static void ixgbe_dump(struct ixgbe_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  ] " -			"[PlPOIdStDDt Ln] [bi->dma       ] " -			"leng  ntw timestamp        bi->skb\n"); +		pr_info("%s%s    %s              %s        %s          %s\n", +			"T [desc]     [address 63:0  ] ", +			"[PlPOIdStDDt Ln] [bi->dma       ] ", +			"leng", "ntw", "timestamp", "bi->skb");  		for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) {  			tx_desc = IXGBE_TX_DESC(tx_ring, i);  			tx_buffer = &tx_ring->tx_buffer_info[i];  			u0 = (struct my_u0 *)tx_desc; -			pr_info("T [0x%03X]    %016llX %016llX %016llX" -				" %04X  %p %016llX %p", i, -				le64_to_cpu(u0->a), -				le64_to_cpu(u0->b), -				(u64)dma_unmap_addr(tx_buffer, dma), -				dma_unmap_len(tx_buffer, len), -				tx_buffer->next_to_watch, -				(u64)tx_buffer->time_stamp, -				tx_buffer->skb); -			if (i == tx_ring->next_to_use && -				i == tx_ring->next_to_clean) -				pr_cont(" NTC/U\n"); -			else if (i == tx_ring->next_to_use) -				pr_cont(" NTU\n"); -			else if (i == tx_ring->next_to_clean) -				pr_cont(" NTC\n"); -			else -				pr_cont("\n"); - -			if (netif_msg_pktdata(adapter) && -			    tx_buffer->skb) -				print_hex_dump(KERN_INFO, "", -					DUMP_PREFIX_ADDRESS, 16, 1, -					tx_buffer->skb->data, +			if (dma_unmap_len(tx_buffer, len) > 0) { +				pr_info("T [0x%03X]    %016llX %016llX %016llX %08X %p %016llX %p", +					i, +					le64_to_cpu(u0->a), +					le64_to_cpu(u0->b), +					(u64)dma_unmap_addr(tx_buffer, dma),  					dma_unmap_len(tx_buffer, len), -					true); +					tx_buffer->next_to_watch, +					(u64)tx_buffer->time_stamp, +					tx_buffer->skb); +				if (i == tx_ring->next_to_use && +					i == tx_ring->next_to_clean) +					pr_cont(" NTC/U\n"); +				else if (i == tx_ring->next_to_use) +					pr_cont(" NTU\n"); +				else if (i == tx_ring->next_to_clean) +					pr_cont(" NTC\n"); +				else +					pr_cont("\n"); + +				if (netif_msg_pktdata(adapter) && +				    tx_buffer->skb) +					print_hex_dump(KERN_INFO, "", +						DUMP_PREFIX_ADDRESS, 16, 1, +						tx_buffer->skb->data, +						dma_unmap_len(tx_buffer, len), +						true); +			}  		}  	} @@ -422,7 +448,9 @@ rx_ring_summary:  	dev_info(&adapter->pdev->dev, "RX Rings Dump\n"); -	/* Advanced Receive Descriptor (Read) Format +	/* Receive Descriptor Formats +	 * +	 * 82598 Advanced Receive Descriptor (Read) Format  	 *    63                                           1        0  	 *    +-----------------------------------------------------+  	 *  0 |       Packet Buffer Address [63:1]           |A0/NSE| @@ -431,27 +459,52 @@ rx_ring_summary:  	 *    +-----------------------------------------------------+  	 *  	 * -	 * Advanced Receive Descriptor (Write-Back) Format +	 * 82598 Advanced Receive Descriptor (Write-Back) Format  	 *  	 *   63       48 47    32 31  30      21 20 16 15   4 3     0  	 *   +------------------------------------------------------+ -	 * 0 | Packet     IP     |SPH| HDR_LEN   | RSV|Packet|  RSS | -	 *   | Checksum   Ident  |   |           |    | Type | Type | +	 * 0 |       RSS Hash /  |SPH| HDR_LEN  | RSV |Packet|  RSS | +	 *   | Packet   | IP     |   |          |     | Type | Type | +	 *   | Checksum | Ident  |   |          |     |      |      |  	 *   +------------------------------------------------------+  	 * 8 | VLAN Tag | Length | Extended Error | Extended Status |  	 *   +------------------------------------------------------+  	 *   63       48 47    32 31            20 19               0 +	 * +	 * 82599+ Advanced Receive Descriptor (Read) Format +	 *    63                                           1        0 +	 *    +-----------------------------------------------------+ +	 *  0 |       Packet Buffer Address [63:1]           |A0/NSE| +	 *    +----------------------------------------------+------+ +	 *  8 |       Header Buffer Address [63:1]           |  DD  | +	 *    +-----------------------------------------------------+ +	 * +	 * +	 * 82599+ Advanced Receive Descriptor (Write-Back) Format +	 * +	 *   63       48 47    32 31  30      21 20 17 16   4 3     0 +	 *   +------------------------------------------------------+ +	 * 0 |RSS / Frag Checksum|SPH| HDR_LEN  |RSC- |Packet|  RSS | +	 *   |/ RTT / PCoE_PARAM |   |          | CNT | Type | Type | +	 *   |/ Flow Dir Flt ID  |   |          |     |      |      | +	 *   +------------------------------------------------------+ +	 * 8 | VLAN Tag | Length |Extended Error| Xtnd Status/NEXTP | +	 *   +------------------------------------------------------+ +	 *   63       48 47    32 31          20 19                 0  	 */ +  	for (n = 0; n < adapter->num_rx_queues; n++) {  		rx_ring = adapter->rx_ring[n];  		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] " +		pr_info("%s%s%s", +			"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] " +		pr_info("%s%s%s", +			"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++) { @@ -646,6 +699,7 @@ static void ixgbe_update_xoff_received(struct ixgbe_adapter *adapter)  	struct ixgbe_hw *hw = &adapter->hw;  	struct ixgbe_hw_stats *hwstats = &adapter->stats;  	u32 xoff[8] = {0}; +	u8 tc;  	int i;  	bool pfc_en = adapter->dcb_cfg.pfc_mode_enable; @@ -659,21 +713,26 @@ static void ixgbe_update_xoff_received(struct ixgbe_adapter *adapter)  	/* update stats for each tc, only valid with PFC enabled */  	for (i = 0; i < MAX_TX_PACKET_BUFFERS; i++) { +		u32 pxoffrxc; +  		switch (hw->mac.type) {  		case ixgbe_mac_82598EB: -			xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); +			pxoffrxc = IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));  			break;  		default: -			xoff[i] = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i)); +			pxoffrxc = IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));  		} -		hwstats->pxoffrxc[i] += xoff[i]; +		hwstats->pxoffrxc[i] += pxoffrxc; +		/* Get the TC for given UP */ +		tc = netdev_get_prio_tc_map(adapter->netdev, i); +		xoff[tc] += pxoffrxc;  	}  	/* disarm tx queues that have received xoff frames */  	for (i = 0; i < adapter->num_tx_queues; i++) {  		struct ixgbe_ring *tx_ring = adapter->tx_ring[i]; -		u8 tc = tx_ring->dcb_tc; +		tc = tx_ring->dcb_tc;  		if (xoff[tc])  			clear_bit(__IXGBE_HANG_CHECK_ARMED, &tx_ring->state);  	} @@ -744,6 +803,7 @@ static void ixgbe_tx_timeout_reset(struct ixgbe_adapter *adapter)  	/* Do the reset outside of interrupt context */  	if (!test_bit(__IXGBE_DOWN, &adapter->state)) {  		adapter->flags2 |= IXGBE_FLAG2_RESET_REQUESTED; +		e_warn(drv, "initiating reset due to tx timeout\n");  		ixgbe_service_event_schedule(adapter);  	}  } @@ -778,7 +838,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,  			break;  		/* prevent any other reads prior to eop_desc */ -		rmb(); +		read_barrier_depends();  		/* if DD is not set pending work has not been completed */  		if (!(eop_desc->wb.status & cpu_to_le32(IXGBE_TXD_STAT_DD))) @@ -791,11 +851,6 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,  		total_bytes += tx_buffer->bytecount;  		total_packets += tx_buffer->gso_segs; -#ifdef CONFIG_IXGBE_PTP -		if (unlikely(tx_buffer->tx_flags & IXGBE_TX_FLAGS_TSTAMP)) -			ixgbe_ptp_tx_hwtstamp(q_vector, tx_buffer->skb); -#endif -  		/* free the skb */  		dev_kfree_skb_any(tx_buffer->skb); @@ -967,7 +1022,6 @@ static void ixgbe_update_rx_dca(struct ixgbe_adapter *adapter,  	 * which will cause the DCA tag to be cleared.  	 */  	rxctrl |= IXGBE_DCA_RXCTRL_DESC_RRO_EN | -		  IXGBE_DCA_RXCTRL_DATA_DCA_EN |  		  IXGBE_DCA_RXCTRL_DESC_DCA_EN;  	IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(reg_idx), rxctrl); @@ -1244,6 +1298,7 @@ static unsigned int ixgbe_get_headlen(unsigned char *data,  		struct vlan_hdr *vlan;  		/* l3 headers */  		struct iphdr *ipv4; +		struct ipv6hdr *ipv6;  	} hdr;  	__be16 protocol;  	u8 nexthdr = 0;	/* default to not TCP */ @@ -1281,20 +1336,30 @@ static unsigned int ixgbe_get_headlen(unsigned char *data,  		if (hlen < sizeof(struct iphdr))  			return hdr.network - data; +		/* record next protocol if header is present */ +		if (!hdr.ipv4->frag_off) +			nexthdr = hdr.ipv4->protocol; +	} else if (protocol == __constant_htons(ETH_P_IPV6)) { +		if ((hdr.network - data) > (max_len - sizeof(struct ipv6hdr))) +			return max_len; +  		/* record next protocol */ -		nexthdr = hdr.ipv4->protocol; -		hdr.network += hlen; +		nexthdr = hdr.ipv6->nexthdr; +		hlen = sizeof(struct ipv6hdr);  #ifdef IXGBE_FCOE  	} else if (protocol == __constant_htons(ETH_P_FCOE)) {  		if ((hdr.network - data) > (max_len - FCOE_HEADER_LEN))  			return max_len; -		hdr.network += FCOE_HEADER_LEN; +		hlen = FCOE_HEADER_LEN;  #endif  	} else {  		return hdr.network - data;  	} -	/* finally sort out TCP */ +	/* relocate pointer to start of L4 header */ +	hdr.network += hlen; + +	/* finally sort out TCP/UDP */  	if (nexthdr == IPPROTO_TCP) {  		if ((hdr.network - data) > (max_len - sizeof(struct tcphdr)))  			return max_len; @@ -1307,6 +1372,11 @@ static unsigned int ixgbe_get_headlen(unsigned char *data,  			return hdr.network - data;  		hdr.network += hlen; +	} else if (nexthdr == IPPROTO_UDP) { +		if ((hdr.network - data) > (max_len - sizeof(struct udphdr))) +			return max_len; + +		hdr.network += sizeof(struct udphdr);  	}  	/* @@ -1329,6 +1399,7 @@ static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring,  	/* set gso_size to avoid messing up TCP MSS */  	skb_shinfo(skb)->gso_size = DIV_ROUND_UP((skb->len - hdr_len),  						 IXGBE_CB(skb)->append_cnt); +	skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;  }  static void ixgbe_update_rsc_stats(struct ixgbe_ring *rx_ring, @@ -1369,9 +1440,7 @@ static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring,  	ixgbe_rx_checksum(rx_ring, rx_desc, skb); -#ifdef CONFIG_IXGBE_PTP -	ixgbe_ptp_rx_hwtstamp(rx_ring->q_vector, rx_desc, skb); -#endif +	ixgbe_ptp_rx_hwtstamp(rx_ring, rx_desc, skb);  	if ((dev->features & NETIF_F_HW_VLAN_RX) &&  	    ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_VP)) { @@ -1781,7 +1850,7 @@ dma_sync:   **/  static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  			       struct ixgbe_ring *rx_ring, -			       int budget) +			       const int budget)  {  	unsigned int total_rx_bytes = 0, total_rx_packets = 0;  #ifdef IXGBE_FCOE @@ -1832,7 +1901,6 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  		/* probably a little skewed due to removing CRC */  		total_rx_bytes += skb->len; -		total_rx_packets++;  		/* populate checksum, timestamp, VLAN, and protocol */  		ixgbe_process_skb_fields(rx_ring, rx_desc, skb); @@ -1865,8 +1933,8 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  		ixgbe_rx_skb(q_vector, skb);  		/* update budget accounting */ -		budget--; -	} while (likely(budget)); +		total_rx_packets++; +	} while (likely(total_rx_packets < budget));  	u64_stats_update_begin(&rx_ring->syncp);  	rx_ring->stats.packets += total_rx_packets; @@ -1878,7 +1946,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  	if (cleaned_count)  		ixgbe_alloc_rx_buffers(rx_ring, cleaned_count); -	return !!budget; +	return (total_rx_packets < budget);  }  /** @@ -1914,20 +1982,6 @@ static void ixgbe_configure_msix(struct ixgbe_adapter *adapter)  		ixgbe_for_each_ring(ring, q_vector->tx)  			ixgbe_set_ivar(adapter, 1, ring->reg_idx, v_idx); -		if (q_vector->tx.ring && !q_vector->rx.ring) { -			/* tx only vector */ -			if (adapter->tx_itr_setting == 1) -				q_vector->itr = IXGBE_10K_ITR; -			else -				q_vector->itr = adapter->tx_itr_setting; -		} else { -			/* rx or rx/tx vector */ -			if (adapter->rx_itr_setting == 1) -				q_vector->itr = IXGBE_20K_ITR; -			else -				q_vector->itr = adapter->rx_itr_setting; -		} -  		ixgbe_write_eitr(q_vector);  	} @@ -2125,10 +2179,10 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter)  			return;  		if (!(eicr & IXGBE_EICR_LSC) && hw->mac.ops.check_link) { -			u32 autoneg; +			u32 speed;  			bool link_up = false; -			hw->mac.ops.check_link(hw, &autoneg, &link_up, false); +			hw->mac.ops.check_link(hw, &speed, &link_up, false);  			if (link_up)  				return; @@ -2324,10 +2378,8 @@ static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter, bool queues,  		break;  	} -#ifdef CONFIG_IXGBE_PTP  	if (adapter->hw.mac.type == ixgbe_mac_X540)  		mask |= IXGBE_EIMS_TIMESYNC; -#endif  	if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) &&  	    !(adapter->flags2 & IXGBE_FLAG2_FDIR_REQUIRES_REINIT)) @@ -2393,10 +2445,8 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data)  	ixgbe_check_fan_failure(adapter, eicr); -#ifdef CONFIG_IXGBE_PTP  	if (unlikely(eicr & IXGBE_EICR_TIMESYNC))  		ixgbe_ptp_check_pps_event(adapter, eicr); -#endif  	/* re-enable the original interrupt state, no lsc, no queues */  	if (!test_bit(__IXGBE_DOWN, &adapter->state)) @@ -2588,10 +2638,8 @@ static irqreturn_t ixgbe_intr(int irq, void *data)  	}  	ixgbe_check_fan_failure(adapter, eicr); -#ifdef CONFIG_IXGBE_PTP  	if (unlikely(eicr & IXGBE_EICR_TIMESYNC))  		ixgbe_ptp_check_pps_event(adapter, eicr); -#endif  	/* would disable interrupts here but EIAM disabled it */  	napi_schedule(&q_vector->napi); @@ -2699,12 +2747,6 @@ static void ixgbe_configure_msi_and_legacy(struct ixgbe_adapter *adapter)  {  	struct ixgbe_q_vector *q_vector = adapter->q_vector[0]; -	/* rx/tx vector */ -	if (adapter->rx_itr_setting == 1) -		q_vector->itr = IXGBE_20K_ITR; -	else -		q_vector->itr = adapter->rx_itr_setting; -  	ixgbe_write_eitr(q_vector);  	ixgbe_set_ivar(adapter, 0, 0, 0); @@ -2744,13 +2786,19 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,  	/*  	 * set WTHRESH to encourage burst writeback, it should not be set -	 * higher than 1 when ITR is 0 as it could cause false TX hangs +	 * higher than 1 when: +	 * - ITR is 0 as it could cause false TX hangs +	 * - ITR is set to > 100k int/sec and BQL is enabled  	 *  	 * In order to avoid issues WTHRESH + PTHRESH should always be equal  	 * to or less than the number of on chip descriptors, which is  	 * currently 40.  	 */ +#if IS_ENABLED(CONFIG_BQL) +	if (!ring->q_vector || (ring->q_vector->itr < IXGBE_100K_ITR)) +#else  	if (!ring->q_vector || (ring->q_vector->itr < 8)) +#endif  		txdctl |= (1 << 16);	/* WTHRESH = 1 */  	else  		txdctl |= (8 << 16);	/* WTHRESH = 8 */ @@ -2771,6 +2819,16 @@ void ixgbe_configure_tx_ring(struct ixgbe_adapter *adapter,  		ring->atr_sample_rate = 0;  	} +	/* initialize XPS */ +	if (!test_and_set_bit(__IXGBE_TX_XPS_INIT_DONE, &ring->state)) { +		struct ixgbe_q_vector *q_vector = ring->q_vector; + +		if (q_vector) +			netif_set_xps_queue(adapter->netdev, +					    &q_vector->affinity_mask, +					    ring->queue_index); +	} +  	clear_bit(__IXGBE_HANG_CHECK_ARMED, &ring->state);  	/* enable queue */ @@ -3132,14 +3190,6 @@ void ixgbe_configure_rx_ring(struct ixgbe_adapter *adapter,  	ixgbe_configure_srrctl(adapter, ring);  	ixgbe_configure_rscctl(adapter, ring); -	/* If operating in IOV mode set RLPML for X540 */ -	if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) && -	    hw->mac.type == ixgbe_mac_X540) { -		rxdctl &= ~IXGBE_RXDCTL_RLPMLMASK; -		rxdctl |= ((ring->netdev->mtu + ETH_HLEN + -			    ETH_FCS_LEN + VLAN_HLEN) | IXGBE_RXDCTL_RLPML_EN); -	} -  	if (hw->mac.type == ixgbe_mac_82598EB) {  		/*  		 * enable cache line friendly hardware writes: @@ -3211,7 +3261,8 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)  	IXGBE_WRITE_REG(hw, IXGBE_VFRE(reg_offset ^ 1), reg_offset - 1);  	IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset), (~0) << vf_shift);  	IXGBE_WRITE_REG(hw, IXGBE_VFTE(reg_offset ^ 1), reg_offset - 1); -	IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN); +	if (adapter->flags2 & IXGBE_FLAG2_BRIDGE_MODE_VEB) +		IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);  	/* Map PF MAC address in RAR Entry 0 to first pool following VFs */  	hw->mac.ops.set_vmdq(hw, 0, VMDQ_P(0)); @@ -3234,8 +3285,6 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)  	IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext); -	/* enable Tx loopback for VF/PF communication */ -	IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);  	/* Enable MAC Anti-Spoofing */  	hw->mac.ops.set_mac_anti_spoofing(hw, (adapter->num_vfs != 0), @@ -3263,6 +3312,11 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter)  		max_frame = IXGBE_FCOE_JUMBO_FRAME_SIZE;  #endif /* IXGBE_FCOE */ + +	/* adjust max frame to be at least the size of a standard frame */ +	if (max_frame < (ETH_FRAME_LEN + ETH_FCS_LEN)) +		max_frame = (ETH_FRAME_LEN + ETH_FCS_LEN); +  	mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);  	if (max_frame != (mhadd >> IXGBE_MHADD_MFS_SHIFT)) {  		mhadd &= ~IXGBE_MHADD_MFS_MASK; @@ -3271,9 +3325,6 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter)  		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);  	} -	/* MHADD will allow an extra 4 bytes past for vlan tagged frames */ -	max_frame += VLAN_HLEN; -  	hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);  	/* set jumbo enable since MHADD.MFS is keeping size locked at max_frame */  	hlreg0 |= IXGBE_HLREG0_JUMBOEN; @@ -3840,7 +3891,7 @@ static void ixgbe_configure_pb(struct ixgbe_adapter *adapter)  static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)  {  	struct ixgbe_hw *hw = &adapter->hw; -	struct hlist_node *node, *node2; +	struct hlist_node *node2;  	struct ixgbe_fdir_filter *filter;  	spin_lock(&adapter->fdir_perfect_lock); @@ -3848,7 +3899,7 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)  	if (!hlist_empty(&adapter->fdir_filter_list))  		ixgbe_fdir_set_input_mask_82599(hw, &adapter->fdir_mask); -	hlist_for_each_entry_safe(filter, node, node2, +	hlist_for_each_entry_safe(filter, node2,  				  &adapter->fdir_filter_list, fdir_node) {  		ixgbe_fdir_write_perfect_filter_82599(hw,  				&filter->filter, @@ -3960,25 +4011,25 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)   **/  static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw)  { -	u32 autoneg; -	bool negotiation, link_up = false; +	u32 speed; +	bool autoneg, link_up = false;  	u32 ret = IXGBE_ERR_LINK_SETUP;  	if (hw->mac.ops.check_link) -		ret = hw->mac.ops.check_link(hw, &autoneg, &link_up, false); +		ret = hw->mac.ops.check_link(hw, &speed, &link_up, false);  	if (ret)  		goto link_cfg_out; -	autoneg = hw->phy.autoneg_advertised; -	if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) -		ret = hw->mac.ops.get_link_capabilities(hw, &autoneg, -							&negotiation); +	speed = hw->phy.autoneg_advertised; +	if ((!speed) && (hw->mac.ops.get_link_capabilities)) +		ret = hw->mac.ops.get_link_capabilities(hw, &speed, +							&autoneg);  	if (ret)  		goto link_cfg_out;  	if (hw->mac.ops.setup_link) -		ret = hw->mac.ops.setup_link(hw, autoneg, negotiation, link_up); +		ret = hw->mac.ops.setup_link(hw, speed, link_up);  link_cfg_out:  	return ret;  } @@ -4072,11 +4123,8 @@ static void ixgbe_up_complete(struct ixgbe_adapter *adapter)  	else  		ixgbe_configure_msi_and_legacy(adapter); -	/* enable the optics for both mult-speed fiber and 82599 SFP+ fiber */ -	if (hw->mac.ops.enable_tx_laser && -	    ((hw->phy.multispeed_fiber) || -	     ((hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) && -	      (hw->mac.type == ixgbe_mac_82599EB)))) +	/* enable the optics for 82599 SFP+ fiber */ +	if (hw->mac.ops.enable_tx_laser)  		hw->mac.ops.enable_tx_laser(hw);  	clear_bit(__IXGBE_DOWN, &adapter->state); @@ -4192,6 +4240,9 @@ void ixgbe_reset(struct ixgbe_adapter *adapter)  	/* update SAN MAC vmdq pool selection */  	if (hw->mac.san_mac_rar_index)  		hw->mac.ops.set_vmdq_san_mac(hw, VMDQ_P(0)); + +	if (adapter->flags2 & IXGBE_FLAG2_PTP_ENABLED) +		ixgbe_ptp_reset(adapter);  }  /** @@ -4305,12 +4356,12 @@ static void ixgbe_clean_all_tx_rings(struct ixgbe_adapter *adapter)  static void ixgbe_fdir_filter_exit(struct ixgbe_adapter *adapter)  { -	struct hlist_node *node, *node2; +	struct hlist_node *node2;  	struct ixgbe_fdir_filter *filter;  	spin_lock(&adapter->fdir_perfect_lock); -	hlist_for_each_entry_safe(filter, node, node2, +	hlist_for_each_entry_safe(filter, node2,  				  &adapter->fdir_filter_list, fdir_node) {  		hlist_del(&filter->fdir_node);  		kfree(filter); @@ -4393,11 +4444,8 @@ void ixgbe_down(struct ixgbe_adapter *adapter)  	if (!pci_channel_offline(adapter->pdev))  		ixgbe_reset(adapter); -	/* power down the optics for multispeed fiber and 82599 SFP+ fiber */ -	if (hw->mac.ops.disable_tx_laser && -	    ((hw->phy.multispeed_fiber) || -	     ((hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) && -	      (hw->mac.type == ixgbe_mac_82599EB)))) +	/* power down the optics for 82599 SFP+ fiber */ +	if (hw->mac.ops.disable_tx_laser)  		hw->mac.ops.disable_tx_laser(hw);  	ixgbe_clean_all_tx_rings(adapter); @@ -4429,11 +4477,12 @@ static void ixgbe_tx_timeout(struct net_device *netdev)   * Fields are initialized based on PCI device information and   * OS network device settings (MTU size).   **/ -static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter) +static int ixgbe_sw_init(struct ixgbe_adapter *adapter)  {  	struct ixgbe_hw *hw = &adapter->hw;  	struct pci_dev *pdev = adapter->pdev; -	unsigned int rss; +	unsigned int rss, fdir; +	u32 fwsm;  #ifdef CONFIG_IXGBE_DCB  	int j;  	struct tc_configuration *tc; @@ -4447,37 +4496,58 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)  	hw->subsystem_vendor_id = pdev->subsystem_vendor;  	hw->subsystem_device_id = pdev->subsystem_device; -	/* Set capability flags */ +	/* Set common capability flags and settings */  	rss = min_t(int, IXGBE_MAX_RSS_INDICES, num_online_cpus());  	adapter->ring_feature[RING_F_RSS].limit = rss; +	adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE; +	adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; +	adapter->max_q_vectors = MAX_Q_VECTORS_82599; +	adapter->atr_sample_rate = 20; +	fdir = min_t(int, IXGBE_MAX_FDIR_INDICES, num_online_cpus()); +	adapter->ring_feature[RING_F_FDIR].limit = fdir; +	adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K; +#ifdef CONFIG_IXGBE_DCA +	adapter->flags |= IXGBE_FLAG_DCA_CAPABLE; +#endif +#ifdef IXGBE_FCOE +	adapter->flags |= IXGBE_FLAG_FCOE_CAPABLE; +	adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED; +#ifdef CONFIG_IXGBE_DCB +	/* Default traffic class to use for FCoE */ +	adapter->fcoe.up = IXGBE_FCOE_DEFTC; +#endif /* CONFIG_IXGBE_DCB */ +#endif /* IXGBE_FCOE */ + +	/* Set MAC specific capability flags and exceptions */  	switch (hw->mac.type) {  	case ixgbe_mac_82598EB: +		adapter->flags2 &= ~IXGBE_FLAG2_RSC_CAPABLE; +		adapter->flags2 &= ~IXGBE_FLAG2_RSC_ENABLED; +  		if (hw->device_id == IXGBE_DEV_ID_82598AT)  			adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE; +  		adapter->max_q_vectors = MAX_Q_VECTORS_82598; -		break; -	case ixgbe_mac_X540: -		adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; -	case ixgbe_mac_82599EB: -		adapter->max_q_vectors = MAX_Q_VECTORS_82599; -		adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE; -		adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED; -		if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) -			adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; -		/* Flow Director hash filters enabled */ -		adapter->atr_sample_rate = 20; -		adapter->ring_feature[RING_F_FDIR].limit = -							 IXGBE_MAX_FDIR_INDICES; -		adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K; +		adapter->ring_feature[RING_F_FDIR].limit = 0; +		adapter->atr_sample_rate = 0; +		adapter->fdir_pballoc = 0;  #ifdef IXGBE_FCOE -		adapter->flags |= IXGBE_FLAG_FCOE_CAPABLE; +		adapter->flags &= ~IXGBE_FLAG_FCOE_CAPABLE;  		adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;  #ifdef CONFIG_IXGBE_DCB -		/* Default traffic class to use for FCoE */ -		adapter->fcoe.up = IXGBE_FCOE_DEFTC; -#endif +		adapter->fcoe.up = 0; +#endif /* IXGBE_DCB */  #endif /* IXGBE_FCOE */  		break; +	case ixgbe_mac_82599EB: +		if (hw->device_id == IXGBE_DEV_ID_82599_T3_LOM) +			adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; +		break; +	case ixgbe_mac_X540: +		fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM); +		if (fwsm & IXGBE_FWSM_TS_ENABLED) +			adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE; +		break;  	default:  		break;  	} @@ -4533,7 +4603,8 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)  	ixgbe_pbthresh_setup(adapter);  	hw->fc.pause_time = IXGBE_DEFAULT_FCPAUSE;  	hw->fc.send_xon = true; -	hw->fc.disable_fc_autoneg = false; +	hw->fc.disable_fc_autoneg = +		(ixgbe_device_supports_autoneg_fc(hw) == 0) ? false : true;  #ifdef CONFIG_PCI_IOV  	/* assign number of SR-IOV VFs */ @@ -4828,14 +4899,14 @@ static int ixgbe_change_mtu(struct net_device *netdev, int new_mtu)  		return -EINVAL;  	/* -	 * For 82599EB we cannot allow PF to change MTU greater than 1500 -	 * in SR-IOV mode as it may cause buffer overruns in guest VFs that -	 * don't allocate and chain buffers correctly. +	 * For 82599EB we cannot allow legacy VFs to enable their receive +	 * paths when MTU greater than 1500 is configured.  So display a +	 * warning that legacy VFs will be disabled.  	 */  	if ((adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) &&  	    (adapter->hw.mac.type == ixgbe_mac_82599EB) && -	    (max_frame > MAXIMUM_ETHERNET_VLAN_SIZE)) -			return -EINVAL; +	    (max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN))) +		e_warn(probe, "Setting MTU > 1500 will disable legacy VFs\n");  	e_info(probe, "changing MTU from %d to %d\n", netdev->mtu, new_mtu); @@ -4901,6 +4972,8 @@ static int ixgbe_open(struct net_device *netdev)  	if (err)  		goto err_set_queues; +	ixgbe_ptp_init(adapter); +  	ixgbe_up_complete(adapter);  	return 0; @@ -4932,6 +5005,8 @@ static int ixgbe_close(struct net_device *netdev)  {  	struct ixgbe_adapter *adapter = netdev_priv(netdev); +	ixgbe_ptp_stop(adapter); +  	ixgbe_down(adapter);  	ixgbe_free_irq(adapter); @@ -5022,14 +5097,8 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)  	if (wufc) {  		ixgbe_set_rx_mode(netdev); -		/* -		 * enable the optics for both mult-speed fiber and -		 * 82599 SFP+ fiber as we can WoL. -		 */ -		if (hw->mac.ops.enable_tx_laser && -		    (hw->phy.multispeed_fiber || -		    (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber && -		     hw->mac.type == ixgbe_mac_82599EB))) +		/* enable the optics for 82599 SFP+ fiber as we can WoL */ +		if (hw->mac.ops.enable_tx_laser)  			hw->mac.ops.enable_tx_laser(hw);  		/* turn on all-multi mode if wake on multicast is enabled */ @@ -5442,6 +5511,23 @@ static void ixgbe_watchdog_update_link(struct ixgbe_adapter *adapter)  	adapter->link_speed = link_speed;  } +static void ixgbe_update_default_up(struct ixgbe_adapter *adapter) +{ +#ifdef CONFIG_IXGBE_DCB +	struct net_device *netdev = adapter->netdev; +	struct dcb_app app = { +			      .selector = IEEE_8021QAZ_APP_SEL_ETHERTYPE, +			      .protocol = 0, +			     }; +	u8 up = 0; + +	if (adapter->dcbx_cap & DCB_CAP_DCBX_VER_IEEE) +		up = dcb_ieee_getapp_mask(netdev, &app); + +	adapter->default_up = (up > 1) ? (ffs(up) - 1) : 0; +#endif +} +  /**   * ixgbe_watchdog_link_is_up - update netif_carrier status and   *                             print link up message @@ -5482,9 +5568,10 @@ static void ixgbe_watchdog_link_is_up(struct ixgbe_adapter *adapter)  		break;  	} -#ifdef CONFIG_IXGBE_PTP -	ixgbe_ptp_start_cyclecounter(adapter); -#endif +	adapter->last_rx_ptp_check = jiffies; + +	if (adapter->flags2 & IXGBE_FLAG2_PTP_ENABLED) +		ixgbe_ptp_start_cyclecounter(adapter);  	e_info(drv, "NIC Link is Up %s, Flow Control: %s\n",  	       (link_speed == IXGBE_LINK_SPEED_10GB_FULL ? @@ -5501,6 +5588,9 @@ static void ixgbe_watchdog_link_is_up(struct ixgbe_adapter *adapter)  	netif_carrier_on(netdev);  	ixgbe_check_vf_rate_limit(adapter); +	/* update the default user priority for VFs */ +	ixgbe_update_default_up(adapter); +  	/* ping all the active vfs to let them know link has changed */  	ixgbe_ping_all_vfs(adapter);  } @@ -5526,9 +5616,8 @@ static void ixgbe_watchdog_link_is_down(struct ixgbe_adapter *adapter)  	if (ixgbe_is_sfp(hw) && hw->mac.type == ixgbe_mac_82598EB)  		adapter->flags2 |= IXGBE_FLAG2_SEARCH_FOR_SFP; -#ifdef CONFIG_IXGBE_PTP -	ixgbe_ptp_start_cyclecounter(adapter); -#endif +	if (adapter->flags2 & IXGBE_FLAG2_PTP_ENABLED) +		ixgbe_ptp_start_cyclecounter(adapter);  	e_info(drv, "NIC Link is Down\n");  	netif_carrier_off(netdev); @@ -5561,6 +5650,7 @@ static void ixgbe_watchdog_flush_tx(struct ixgbe_adapter *adapter)  			 * to get done, so reset controller to flush Tx.  			 * (Do the reset outside of interrupt context).  			 */ +			e_warn(drv, "initiating reset to clear Tx work after link loss\n");  			adapter->flags2 |= IXGBE_FLAG2_RESET_REQUESTED;  		}  	} @@ -5625,6 +5715,10 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)  	    !(adapter->flags2 & IXGBE_FLAG2_SFP_NEEDS_RESET))  		return; +	/* concurent i2c reads are not supported */ +	if (test_bit(__IXGBE_READ_I2C, &adapter->state)) +		return; +  	/* someone else is in init, wait until next service event */  	if (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))  		return; @@ -5685,8 +5779,8 @@ sfp_out:  static void ixgbe_sfp_link_config_subtask(struct ixgbe_adapter *adapter)  {  	struct ixgbe_hw *hw = &adapter->hw; -	u32 autoneg; -	bool negotiation; +	u32 speed; +	bool autoneg = false;  	if (!(adapter->flags & IXGBE_FLAG_NEED_LINK_CONFIG))  		return; @@ -5697,11 +5791,11 @@ static void ixgbe_sfp_link_config_subtask(struct ixgbe_adapter *adapter)  	adapter->flags &= ~IXGBE_FLAG_NEED_LINK_CONFIG; -	autoneg = hw->phy.autoneg_advertised; -	if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) -		hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiation); +	speed = hw->phy.autoneg_advertised; +	if ((!speed) && (hw->mac.ops.get_link_capabilities)) +		hw->mac.ops.get_link_capabilities(hw, &speed, &autoneg);  	if (hw->mac.ops.setup_link) -		hw->mac.ops.setup_link(hw, autoneg, negotiation, true); +		hw->mac.ops.setup_link(hw, speed, true);  	adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE;  	adapter->link_check_timeout = jiffies; @@ -5825,7 +5919,6 @@ static void ixgbe_service_task(struct work_struct *work)  	struct ixgbe_adapter *adapter = container_of(work,  						     struct ixgbe_adapter,  						     service_task); -  	ixgbe_reset_subtask(adapter);  	ixgbe_sfp_detection_subtask(adapter);  	ixgbe_sfp_link_config_subtask(adapter); @@ -5833,9 +5926,11 @@ static void ixgbe_service_task(struct work_struct *work)  	ixgbe_watchdog_subtask(adapter);  	ixgbe_fdir_reinit_subtask(adapter);  	ixgbe_check_hang_subtask(adapter); -#ifdef CONFIG_IXGBE_PTP -	ixgbe_ptp_overflow_check(adapter); -#endif + +	if (adapter->flags2 & IXGBE_FLAG2_PTP_ENABLED) { +		ixgbe_ptp_overflow_check(adapter); +		ixgbe_ptp_rx_hang(adapter); +	}  	ixgbe_service_event_complete(adapter);  } @@ -5848,6 +5943,9 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,  	u32 vlan_macip_lens, type_tucmd;  	u32 mss_l4len_idx, l4len; +	if (skb->ip_summed != CHECKSUM_PARTIAL) +		return 0; +  	if (!skb_is_gso(skb))  		return 0; @@ -5890,10 +5988,9 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,  	first->gso_segs = skb_shinfo(skb)->gso_segs;  	first->bytecount += (first->gso_segs - 1) * *hdr_len; -	/* mss_l4len_id: use 1 as index for TSO */ +	/* mss_l4len_id: use 0 as index for TSO */  	mss_l4len_idx = l4len << IXGBE_ADVTXD_L4LEN_SHIFT;  	mss_l4len_idx |= skb_shinfo(skb)->gso_size << IXGBE_ADVTXD_MSS_SHIFT; -	mss_l4len_idx |= 1 << IXGBE_ADVTXD_IDX_SHIFT;  	/* vlan_macip_lens: HEADLEN, MACLEN, VLAN tag */  	vlan_macip_lens = skb_network_header_len(skb); @@ -5915,12 +6012,9 @@ static void ixgbe_tx_csum(struct ixgbe_ring *tx_ring,  	u32 type_tucmd = 0;  	if (skb->ip_summed != CHECKSUM_PARTIAL) { -		if (!(first->tx_flags & IXGBE_TX_FLAGS_HW_VLAN)) { -			if (unlikely(skb->no_fcs)) -				first->tx_flags |= IXGBE_TX_FLAGS_NO_IFCS; -			if (!(first->tx_flags & IXGBE_TX_FLAGS_TXSW)) -				return; -		} +		if (!(first->tx_flags & IXGBE_TX_FLAGS_HW_VLAN) && +		    !(first->tx_flags & IXGBE_TX_FLAGS_CC)) +			return;  	} else {  		u8 l4_hdr = 0;  		switch (first->protocol) { @@ -5978,32 +6072,32 @@ static void ixgbe_tx_csum(struct ixgbe_ring *tx_ring,  			  type_tucmd, mss_l4len_idx);  } -static __le32 ixgbe_tx_cmd_type(u32 tx_flags) +#define IXGBE_SET_FLAG(_input, _flag, _result) \ +	((_flag <= _result) ? \ +	 ((u32)(_input & _flag) * (_result / _flag)) : \ +	 ((u32)(_input & _flag) / (_flag / _result))) + +static u32 ixgbe_tx_cmd_type(struct sk_buff *skb, u32 tx_flags)  {  	/* set type for advanced descriptor with frame checksum insertion */ -	__le32 cmd_type = cpu_to_le32(IXGBE_ADVTXD_DTYP_DATA | -				      IXGBE_ADVTXD_DCMD_DEXT); +	u32 cmd_type = IXGBE_ADVTXD_DTYP_DATA | +		       IXGBE_ADVTXD_DCMD_DEXT | +		       IXGBE_ADVTXD_DCMD_IFCS;  	/* set HW vlan bit if vlan is present */ -	if (tx_flags & IXGBE_TX_FLAGS_HW_VLAN) -		cmd_type |= cpu_to_le32(IXGBE_ADVTXD_DCMD_VLE); - -#ifdef CONFIG_IXGBE_PTP -	if (tx_flags & IXGBE_TX_FLAGS_TSTAMP) -		cmd_type |= cpu_to_le32(IXGBE_ADVTXD_MAC_TSTAMP); -#endif +	cmd_type |= IXGBE_SET_FLAG(tx_flags, IXGBE_TX_FLAGS_HW_VLAN, +				   IXGBE_ADVTXD_DCMD_VLE);  	/* set segmentation enable bits for TSO/FSO */ -#ifdef IXGBE_FCOE -	if (tx_flags & (IXGBE_TX_FLAGS_TSO | IXGBE_TX_FLAGS_FSO)) -#else -	if (tx_flags & IXGBE_TX_FLAGS_TSO) -#endif -		cmd_type |= cpu_to_le32(IXGBE_ADVTXD_DCMD_TSE); +	cmd_type |= IXGBE_SET_FLAG(tx_flags, IXGBE_TX_FLAGS_TSO, +				   IXGBE_ADVTXD_DCMD_TSE); + +	/* set timestamp bit if present */ +	cmd_type |= IXGBE_SET_FLAG(tx_flags, IXGBE_TX_FLAGS_TSTAMP, +				   IXGBE_ADVTXD_MAC_TSTAMP);  	/* insert frame checksum */ -	if (!(tx_flags & IXGBE_TX_FLAGS_NO_IFCS)) -		cmd_type |= cpu_to_le32(IXGBE_ADVTXD_DCMD_IFCS); +	cmd_type ^= IXGBE_SET_FLAG(skb->no_fcs, 1, IXGBE_ADVTXD_DCMD_IFCS);  	return cmd_type;  } @@ -6011,36 +6105,27 @@ static __le32 ixgbe_tx_cmd_type(u32 tx_flags)  static void ixgbe_tx_olinfo_status(union ixgbe_adv_tx_desc *tx_desc,  				   u32 tx_flags, unsigned int paylen)  { -	__le32 olinfo_status = cpu_to_le32(paylen << IXGBE_ADVTXD_PAYLEN_SHIFT); +	u32 olinfo_status = paylen << IXGBE_ADVTXD_PAYLEN_SHIFT;  	/* enable L4 checksum for TSO and TX checksum offload */ -	if (tx_flags & IXGBE_TX_FLAGS_CSUM) -		olinfo_status |= cpu_to_le32(IXGBE_ADVTXD_POPTS_TXSM); +	olinfo_status |= IXGBE_SET_FLAG(tx_flags, +					IXGBE_TX_FLAGS_CSUM, +					IXGBE_ADVTXD_POPTS_TXSM);  	/* enble IPv4 checksum for TSO */ -	if (tx_flags & IXGBE_TX_FLAGS_IPV4) -		olinfo_status |= cpu_to_le32(IXGBE_ADVTXD_POPTS_IXSM); - -	/* use index 1 context for TSO/FSO/FCOE */ -#ifdef IXGBE_FCOE -	if (tx_flags & (IXGBE_TX_FLAGS_TSO | IXGBE_TX_FLAGS_FCOE)) -#else -	if (tx_flags & IXGBE_TX_FLAGS_TSO) -#endif -		olinfo_status |= cpu_to_le32(1 << IXGBE_ADVTXD_IDX_SHIFT); +	olinfo_status |= IXGBE_SET_FLAG(tx_flags, +					IXGBE_TX_FLAGS_IPV4, +					IXGBE_ADVTXD_POPTS_IXSM);  	/*  	 * Check Context must be set if Tx switch is enabled, which it  	 * always is for case where virtual functions are running  	 */ -#ifdef IXGBE_FCOE -	if (tx_flags & (IXGBE_TX_FLAGS_TXSW | IXGBE_TX_FLAGS_FCOE)) -#else -	if (tx_flags & IXGBE_TX_FLAGS_TXSW) -#endif -		olinfo_status |= cpu_to_le32(IXGBE_ADVTXD_CC); +	olinfo_status |= IXGBE_SET_FLAG(tx_flags, +					IXGBE_TX_FLAGS_CC, +					IXGBE_ADVTXD_CC); -	tx_desc->read.olinfo_status = olinfo_status; +	tx_desc->read.olinfo_status = cpu_to_le32(olinfo_status);  }  #define IXGBE_TXD_CMD (IXGBE_TXD_CMD_EOP | \ @@ -6050,22 +6135,22 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,  			 struct ixgbe_tx_buffer *first,  			 const u8 hdr_len)  { -	dma_addr_t dma;  	struct sk_buff *skb = first->skb;  	struct ixgbe_tx_buffer *tx_buffer;  	union ixgbe_adv_tx_desc *tx_desc; -	struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0]; -	unsigned int data_len = skb->data_len; -	unsigned int size = skb_headlen(skb); -	unsigned int paylen = skb->len - hdr_len; +	struct skb_frag_struct *frag; +	dma_addr_t dma; +	unsigned int data_len, size;  	u32 tx_flags = first->tx_flags; -	__le32 cmd_type; +	u32 cmd_type = ixgbe_tx_cmd_type(skb, tx_flags);  	u16 i = tx_ring->next_to_use;  	tx_desc = IXGBE_TX_DESC(tx_ring, i); -	ixgbe_tx_olinfo_status(tx_desc, tx_flags, paylen); -	cmd_type = ixgbe_tx_cmd_type(tx_flags); +	ixgbe_tx_olinfo_status(tx_desc, tx_flags, skb->len - hdr_len); + +	size = skb_headlen(skb); +	data_len = skb->data_len;  #ifdef IXGBE_FCOE  	if (tx_flags & IXGBE_TX_FLAGS_FCOE) { @@ -6079,19 +6164,22 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,  #endif  	dma = dma_map_single(tx_ring->dev, skb->data, size, DMA_TO_DEVICE); -	if (dma_mapping_error(tx_ring->dev, dma)) -		goto dma_error; -	/* record length, and DMA address */ -	dma_unmap_len_set(first, len, size); -	dma_unmap_addr_set(first, dma, dma); +	tx_buffer = first; + +	for (frag = &skb_shinfo(skb)->frags[0];; frag++) { +		if (dma_mapping_error(tx_ring->dev, dma)) +			goto dma_error; + +		/* record length, and DMA address */ +		dma_unmap_len_set(tx_buffer, len, size); +		dma_unmap_addr_set(tx_buffer, dma, dma); -	tx_desc->read.buffer_addr = cpu_to_le64(dma); +		tx_desc->read.buffer_addr = cpu_to_le64(dma); -	for (;;) {  		while (unlikely(size > IXGBE_MAX_DATA_PER_TXD)) {  			tx_desc->read.cmd_type_len = -				cmd_type | cpu_to_le32(IXGBE_MAX_DATA_PER_TXD); +				cpu_to_le32(cmd_type ^ IXGBE_MAX_DATA_PER_TXD);  			i++;  			tx_desc++; @@ -6099,18 +6187,18 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,  				tx_desc = IXGBE_TX_DESC(tx_ring, 0);  				i = 0;  			} +			tx_desc->read.olinfo_status = 0;  			dma += IXGBE_MAX_DATA_PER_TXD;  			size -= IXGBE_MAX_DATA_PER_TXD;  			tx_desc->read.buffer_addr = cpu_to_le64(dma); -			tx_desc->read.olinfo_status = 0;  		}  		if (likely(!data_len))  			break; -		tx_desc->read.cmd_type_len = cmd_type | cpu_to_le32(size); +		tx_desc->read.cmd_type_len = cpu_to_le32(cmd_type ^ size);  		i++;  		tx_desc++; @@ -6118,6 +6206,7 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,  			tx_desc = IXGBE_TX_DESC(tx_ring, 0);  			i = 0;  		} +		tx_desc->read.olinfo_status = 0;  #ifdef IXGBE_FCOE  		size = min_t(unsigned int, data_len, skb_frag_size(frag)); @@ -6128,22 +6217,13 @@ static void ixgbe_tx_map(struct ixgbe_ring *tx_ring,  		dma = skb_frag_dma_map(tx_ring->dev, frag, 0, size,  				       DMA_TO_DEVICE); -		if (dma_mapping_error(tx_ring->dev, dma)) -			goto dma_error;  		tx_buffer = &tx_ring->tx_buffer_info[i]; -		dma_unmap_len_set(tx_buffer, len, size); -		dma_unmap_addr_set(tx_buffer, dma, dma); - -		tx_desc->read.buffer_addr = cpu_to_le64(dma); -		tx_desc->read.olinfo_status = 0; - -		frag++;  	}  	/* write last descriptor with RS and EOP bits */ -	cmd_type |= cpu_to_le32(size) | cpu_to_le32(IXGBE_TXD_CMD); -	tx_desc->read.cmd_type_len = cmd_type; +	cmd_type |= size | IXGBE_TXD_CMD; +	tx_desc->read.cmd_type_len = cpu_to_le32(cmd_type);  	netdev_tx_sent_queue(txring_txq(tx_ring), first->bytecount); @@ -6304,38 +6384,40 @@ static inline int ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, u16 size)  	return __ixgbe_maybe_stop_tx(tx_ring, size);  } +#ifdef IXGBE_FCOE  static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)  { -	struct ixgbe_adapter *adapter = netdev_priv(dev); -	int txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : -					       smp_processor_id(); -#ifdef IXGBE_FCOE -	__be16 protocol = vlan_get_protocol(skb); +	struct ixgbe_adapter *adapter; +	struct ixgbe_ring_feature *f; +	int txq; -	if (((protocol == htons(ETH_P_FCOE)) || -	    (protocol == htons(ETH_P_FIP))) && -	    (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) { -		struct ixgbe_ring_feature *f; +	/* +	 * only execute the code below if protocol is FCoE +	 * or FIP and we have FCoE enabled on the adapter +	 */ +	switch (vlan_get_protocol(skb)) { +	case __constant_htons(ETH_P_FCOE): +	case __constant_htons(ETH_P_FIP): +		adapter = netdev_priv(dev); -		f = &adapter->ring_feature[RING_F_FCOE]; +		if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) +			break; +	default: +		return __netdev_pick_tx(dev, skb); +	} -		while (txq >= f->indices) -			txq -= f->indices; -		txq += adapter->ring_feature[RING_F_FCOE].offset; +	f = &adapter->ring_feature[RING_F_FCOE]; -		return txq; -	} -#endif +	txq = skb_rx_queue_recorded(skb) ? skb_get_rx_queue(skb) : +					   smp_processor_id(); -	if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) { -		while (unlikely(txq >= dev->real_num_tx_queues)) -			txq -= dev->real_num_tx_queues; -		return txq; -	} +	while (txq >= f->indices) +		txq -= f->indices; -	return skb_tx_hash(dev, skb); +	return txq + f->offset;  } +#endif  netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,  			  struct ixgbe_adapter *adapter,  			  struct ixgbe_ring *tx_ring) @@ -6393,12 +6475,15 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,  	skb_tx_timestamp(skb); -#ifdef CONFIG_IXGBE_PTP  	if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {  		skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;  		tx_flags |= IXGBE_TX_FLAGS_TSTAMP; + +		/* schedule check for Tx timestamp */ +		adapter->ptp_tx_skb = skb_get(skb); +		adapter->ptp_tx_start = jiffies; +		schedule_work(&adapter->ptp_tx_work);  	} -#endif  #ifdef CONFIG_PCI_IOV  	/* @@ -6406,7 +6491,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,  	 * Tx switch had been disabled.  	 */  	if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) -		tx_flags |= IXGBE_TX_FLAGS_TXSW; +		tx_flags |= IXGBE_TX_FLAGS_CC;  #endif  	/* DCB maps skb priorities 0-7 onto 3 bit PCP of VLAN tag. */ @@ -6485,6 +6570,7 @@ static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb,  		if (skb_pad(skb, 17 - skb->len))  			return NETDEV_TX_OK;  		skb->len = 17; +		skb_set_tail_pointer(skb, 17);  	}  	tx_ring = adapter->tx_ring[skb->queue_mapping]; @@ -6547,10 +6633,8 @@ static int ixgbe_ioctl(struct net_device *netdev, struct ifreq *req, int cmd)  	struct ixgbe_adapter *adapter = netdev_priv(netdev);  	switch (cmd) { -#ifdef CONFIG_IXGBE_PTP  	case SIOCSHWTSTAMP:  		return ixgbe_ptp_hwtstamp_ioctl(adapter, req, cmd); -#endif  	default:  		return mdio_mii_ioctl(&adapter->hw.phy.mdio, if_mii(req), cmd);  	} @@ -6738,6 +6822,7 @@ static void ixgbe_set_prio_tc_map(struct ixgbe_adapter *adapter)  	}  } +#endif /* CONFIG_IXGBE_DCB */  /**   * ixgbe_setup_tc - configure net_device for multiple traffic classes   * @@ -6763,6 +6848,7 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)  		ixgbe_close(dev);  	ixgbe_clear_interrupt_scheme(adapter); +#ifdef CONFIG_IXGBE_DCB  	if (tc) {  		netdev_set_num_tc(dev, tc);  		ixgbe_set_prio_tc_map(adapter); @@ -6785,15 +6871,28 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)  		adapter->dcb_cfg.pfc_mode_enable = false;  	} -	ixgbe_init_interrupt_scheme(adapter);  	ixgbe_validate_rtr(adapter, tc); + +#endif /* CONFIG_IXGBE_DCB */ +	ixgbe_init_interrupt_scheme(adapter); +  	if (netif_running(dev)) -		ixgbe_open(dev); +		return ixgbe_open(dev);  	return 0;  } -#endif /* CONFIG_IXGBE_DCB */ +#ifdef CONFIG_PCI_IOV +void ixgbe_sriov_reinit(struct ixgbe_adapter *adapter) +{ +	struct net_device *netdev = adapter->netdev; + +	rtnl_lock(); +	ixgbe_setup_tc(netdev, netdev_get_num_tc(netdev)); +	rtnl_unlock(); +} + +#endif  void ixgbe_do_reset(struct net_device *netdev)  {  	struct ixgbe_adapter *adapter = netdev_priv(netdev); @@ -6910,13 +7009,16 @@ static int ixgbe_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],  	if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED))  		return -EOPNOTSUPP; -	if (ndm->ndm_state & NUD_PERMANENT) { +	/* Hardware does not support aging addresses so if a +	 * ndm_state is given only allow permanent addresses +	 */ +	if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) {  		pr_info("%s: FDB only supports static addresses\n",  			ixgbe_driver_name);  		return -EINVAL;  	} -	if (is_unicast_ether_addr(addr)) { +	if (is_unicast_ether_addr(addr) || is_link_local_ether_addr(addr)) {  		u32 rar_uc_entries = IXGBE_MAX_PF_MACVLANS;  		if (netdev_uc_count(dev) < rar_uc_entries) @@ -6936,7 +7038,7 @@ static int ixgbe_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],  	return err;  } -static int ixgbe_ndo_fdb_del(struct ndmsg *ndm, +static int ixgbe_ndo_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],  			     struct net_device *dev,  			     const unsigned char *addr)  { @@ -6974,11 +7076,69 @@ static int ixgbe_ndo_fdb_dump(struct sk_buff *skb,  	return idx;  } +static int ixgbe_ndo_bridge_setlink(struct net_device *dev, +				    struct nlmsghdr *nlh) +{ +	struct ixgbe_adapter *adapter = netdev_priv(dev); +	struct nlattr *attr, *br_spec; +	int rem; + +	if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) +		return -EOPNOTSUPP; + +	br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC); + +	nla_for_each_nested(attr, br_spec, rem) { +		__u16 mode; +		u32 reg = 0; + +		if (nla_type(attr) != IFLA_BRIDGE_MODE) +			continue; + +		mode = nla_get_u16(attr); +		if (mode == BRIDGE_MODE_VEPA) { +			reg = 0; +			adapter->flags2 &= ~IXGBE_FLAG2_BRIDGE_MODE_VEB; +		} else if (mode == BRIDGE_MODE_VEB) { +			reg = IXGBE_PFDTXGSWC_VT_LBEN; +			adapter->flags2 |= IXGBE_FLAG2_BRIDGE_MODE_VEB; +		} else +			return -EINVAL; + +		IXGBE_WRITE_REG(&adapter->hw, IXGBE_PFDTXGSWC, reg); + +		e_info(drv, "enabling bridge mode: %s\n", +			mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB"); +	} + +	return 0; +} + +static int ixgbe_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq, +				    struct net_device *dev, +				    u32 filter_mask) +{ +	struct ixgbe_adapter *adapter = netdev_priv(dev); +	u16 mode; + +	if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) +		return 0; + +	if (adapter->flags2 & IXGBE_FLAG2_BRIDGE_MODE_VEB) +		mode = BRIDGE_MODE_VEB; +	else +		mode = BRIDGE_MODE_VEPA; + +	return ndo_dflt_bridge_getlink(skb, pid, seq, dev, mode); +} +  static const struct net_device_ops ixgbe_netdev_ops = {  	.ndo_open		= ixgbe_open,  	.ndo_stop		= ixgbe_close,  	.ndo_start_xmit		= ixgbe_xmit_frame, +#ifdef IXGBE_FCOE  	.ndo_select_queue	= ixgbe_select_queue, +#endif  	.ndo_set_rx_mode	= ixgbe_set_rx_mode,  	.ndo_validate_addr	= eth_validate_addr,  	.ndo_set_mac_address	= ixgbe_set_mac, @@ -7013,6 +7173,8 @@ static const struct net_device_ops ixgbe_netdev_ops = {  	.ndo_fdb_add		= ixgbe_ndo_fdb_add,  	.ndo_fdb_del		= ixgbe_ndo_fdb_del,  	.ndo_fdb_dump		= ixgbe_ndo_fdb_dump, +	.ndo_bridge_setlink	= ixgbe_ndo_bridge_setlink, +	.ndo_bridge_getlink	= ixgbe_ndo_bridge_getlink,  };  /** @@ -7042,6 +7204,7 @@ int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id,  				break;  		case IXGBE_SUBDEV_ID_82599_SFP:  		case IXGBE_SUBDEV_ID_82599_RNDC: +		case IXGBE_SUBDEV_ID_82599_ECNA_DP:  			is_wol_supported = 1;  			break;  		} @@ -7079,8 +7242,7 @@ int ixgbe_wol_supported(struct ixgbe_adapter *adapter, u16 device_id,   * The OS initialization, configuring of the adapter private structure,   * and a hardware reset occur.   **/ -static int __devinit ixgbe_probe(struct pci_dev *pdev, -				 const struct pci_device_id *ent) +static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  {  	struct net_device *netdev;  	struct ixgbe_adapter *adapter = NULL; @@ -7088,9 +7250,8 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  	const struct ixgbe_info *ii = ixgbe_info_tbl[ent->driver_data];  	static int cards_found;  	int i, err, pci_using_dac; +	unsigned int indices = MAX_TX_QUEUES;  	u8 part_str[IXGBE_PBANUM_LENGTH]; -	unsigned int indices = num_possible_cpus(); -	unsigned int dcb_max = 0;  #ifdef IXGBE_FCOE  	u16 device_caps;  #endif @@ -7139,25 +7300,15 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  	pci_set_master(pdev);  	pci_save_state(pdev); +	if (ii->mac == ixgbe_mac_82598EB) {  #ifdef CONFIG_IXGBE_DCB -	if (ii->mac == ixgbe_mac_82598EB) -		dcb_max = min_t(unsigned int, indices * MAX_TRAFFIC_CLASS, -				IXGBE_MAX_RSS_INDICES); -	else -		dcb_max = min_t(unsigned int, indices * MAX_TRAFFIC_CLASS, -				IXGBE_MAX_FDIR_INDICES); +		/* 8 TC w/ 4 queues per TC */ +		indices = 4 * MAX_TRAFFIC_CLASS; +#else +		indices = IXGBE_MAX_RSS_INDICES;  #endif +	} -	if (ii->mac == ixgbe_mac_82598EB) -		indices = min_t(unsigned int, indices, IXGBE_MAX_RSS_INDICES); -	else -		indices = min_t(unsigned int, indices, IXGBE_MAX_FDIR_INDICES); - -#ifdef IXGBE_FCOE -	indices += min_t(unsigned int, num_possible_cpus(), -			 IXGBE_MAX_FCOE_INDICES); -#endif -	indices = max_t(unsigned int, dcb_max, indices);  	netdev = alloc_etherdev_mq(sizeof(struct ixgbe_adapter), indices);  	if (!netdev) {  		err = -ENOMEM; @@ -7260,7 +7411,15 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  	}  #ifdef CONFIG_PCI_IOV -	ixgbe_enable_sriov(adapter, ii); +	/* SR-IOV not supported on the 82598 */ +	if (adapter->hw.mac.type == ixgbe_mac_82598EB) +		goto skip_sriov; +	/* Mailbox */ +	ixgbe_init_mbx_params_pf(hw); +	memcpy(&hw->mbx.ops, ii->mbx_ops, sizeof(hw->mbx.ops)); +	ixgbe_enable_sriov(adapter); +	pci_sriov_set_totalvfs(pdev, 63); +skip_sriov:  #endif  	netdev->features = NETIF_F_SG | @@ -7304,13 +7463,17 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  #ifdef IXGBE_FCOE  	if (adapter->flags & IXGBE_FLAG_FCOE_CAPABLE) { +		unsigned int fcoe_l; +  		if (hw->mac.ops.get_device_caps) {  			hw->mac.ops.get_device_caps(hw, &device_caps);  			if (device_caps & IXGBE_DEVICE_CAPS_FCOE_OFFLOADS)  				adapter->flags &= ~IXGBE_FLAG_FCOE_CAPABLE;  		} -		adapter->ring_feature[RING_F_FCOE].limit = IXGBE_FCRETA_SIZE; + +		fcoe_l = min_t(int, IXGBE_FCRETA_SIZE, num_online_cpus()); +		adapter->ring_feature[RING_F_FCOE].limit = fcoe_l;  		netdev->features |= NETIF_F_FSO |  				    NETIF_F_FCOE_CRC; @@ -7338,9 +7501,8 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  	}  	memcpy(netdev->dev_addr, hw->mac.perm_addr, netdev->addr_len); -	memcpy(netdev->perm_addr, hw->mac.perm_addr, netdev->addr_len); -	if (ixgbe_validate_mac_addr(netdev->perm_addr)) { +	if (!is_valid_ether_addr(netdev->dev_addr)) {  		e_dev_err("invalid MAC address\n");  		err = -EIO;  		goto err_sw_init; @@ -7364,10 +7526,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  	device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol); -#ifdef CONFIG_IXGBE_PTP -	ixgbe_ptp_init(adapter); -#endif /* CONFIG_IXGBE_PTP*/ -  	/* save off EEPROM version number */  	hw->eeprom.ops.read(hw, 0x2e, &adapter->eeprom_verh);  	hw->eeprom.ops.read(hw, 0x2d, &adapter->eeprom_verl); @@ -7420,11 +7578,8 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,  	if (err)  		goto err_register; -	/* power down the optics for multispeed fiber and 82599 SFP+ fiber */ -	if (hw->mac.ops.disable_tx_laser && -	    ((hw->phy.multispeed_fiber) || -	     ((hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) && -	      (hw->mac.type == ixgbe_mac_82599EB)))) +	/* power down the optics for 82599 SFP+ fiber */ +	if (hw->mac.ops.disable_tx_laser)  		hw->mac.ops.disable_tx_laser(hw);  	/* carrier off reporting is important to ethtool even BEFORE open */ @@ -7493,7 +7648,7 @@ err_dma:   * Hot-Plug event, or because the driver is going to be removed from   * memory.   **/ -static void __devexit ixgbe_remove(struct pci_dev *pdev) +static void ixgbe_remove(struct pci_dev *pdev)  {  	struct ixgbe_adapter *adapter = pci_get_drvdata(pdev);  	struct net_device *netdev = adapter->netdev; @@ -7505,9 +7660,6 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)  	set_bit(__IXGBE_DOWN, &adapter->state);  	cancel_work_sync(&adapter->service_task); -#ifdef CONFIG_IXGBE_PTP -	ixgbe_ptp_stop(adapter); -#endif  #ifdef CONFIG_IXGBE_DCA  	if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) { @@ -7527,8 +7679,14 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev)  	if (netdev->reg_state == NETREG_REGISTERED)  		unregister_netdev(netdev); -	ixgbe_disable_sriov(adapter); - +#ifdef CONFIG_PCI_IOV +	/* +	 * Only disable SR-IOV on unload if the user specified the now +	 * deprecated max_vfs module parameter. +	 */ +	if (max_vfs) +		ixgbe_disable_sriov(adapter); +#endif  	ixgbe_clear_interrupt_scheme(adapter);  	ixgbe_release_hw_control(adapter); @@ -7633,6 +7791,8 @@ static pci_ers_result_t ixgbe_io_error_detected(struct pci_dev *pdev,  		if (vfdev) {  			e_dev_err("Issuing VFLR to VF %d\n", vf);  			pci_write_config_dword(vfdev, 0xA8, 0x00008000); +			/* Free device reference count */ +			pci_dev_put(vfdev);  		}  		pci_cleanup_aer_uncorrect_error_status(pdev); @@ -7736,12 +7896,13 @@ static struct pci_driver ixgbe_driver = {  	.name     = ixgbe_driver_name,  	.id_table = ixgbe_pci_tbl,  	.probe    = ixgbe_probe, -	.remove   = __devexit_p(ixgbe_remove), +	.remove   = ixgbe_remove,  #ifdef CONFIG_PM  	.suspend  = ixgbe_suspend,  	.resume   = ixgbe_resume,  #endif  	.shutdown = ixgbe_shutdown, +	.sriov_configure = ixgbe_pci_sriov_configure,  	.err_handler = &ixgbe_err_handler  };  |