diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 563 | 
1 files changed, 274 insertions, 289 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 2ecd55856c50..62e57b05a0ae 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -1,30 +1,5 @@ -/******************************************************************************* - -  Intel 10 Gigabit PCI Express Linux driver -  Copyright(c) 1999 - 2016 Intel Corporation. - -  This program is free software; you can redistribute it and/or modify it -  under the terms and conditions of the GNU General Public License, -  version 2, as published by the Free Software Foundation. - -  This program is distributed in the hope it will be useful, but WITHOUT -  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for -  more details. - -  You should have received a copy of the GNU General Public License along with -  this program; if not, write to the Free Software Foundation, Inc., -  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - -  The full GNU General Public License is included in this distribution in -  the file called "COPYING". - -  Contact Information: -  Linux NICS <[email protected]> -  e1000-devel Mailing List <[email protected]> -  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 - -*******************************************************************************/ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright(c) 1999 - 2018 Intel Corporation. */  #include <linux/types.h>  #include <linux/module.h> @@ -270,9 +245,6 @@ static void ixgbe_check_minimum_link(struct ixgbe_adapter *adapter,  				     int expected_gts)  {  	struct ixgbe_hw *hw = &adapter->hw; -	int max_gts = 0; -	enum pci_bus_speed speed = PCI_SPEED_UNKNOWN; -	enum pcie_link_width width = PCIE_LNK_WIDTH_UNKNOWN;  	struct pci_dev *pdev;  	/* Some devices are not connected over PCIe and thus do not negotiate @@ -288,49 +260,7 @@ static void ixgbe_check_minimum_link(struct ixgbe_adapter *adapter,  	else  		pdev = adapter->pdev; -	if (pcie_get_minimum_link(pdev, &speed, &width) || -	    speed == PCI_SPEED_UNKNOWN || width == PCIE_LNK_WIDTH_UNKNOWN) { -		e_dev_warn("Unable to determine PCI Express bandwidth.\n"); -		return; -	} - -	switch (speed) { -	case PCIE_SPEED_2_5GT: -		/* 8b/10b encoding reduces max throughput by 20% */ -		max_gts = 2 * width; -		break; -	case PCIE_SPEED_5_0GT: -		/* 8b/10b encoding reduces max throughput by 20% */ -		max_gts = 4 * width; -		break; -	case PCIE_SPEED_8_0GT: -		/* 128b/130b encoding reduces throughput by less than 2% */ -		max_gts = 8 * width; -		break; -	default: -		e_dev_warn("Unable to determine PCI Express bandwidth.\n"); -		return; -	} - -	e_dev_info("PCI Express bandwidth of %dGT/s available\n", -		   max_gts); -	e_dev_info("(Speed:%s, Width: x%d, Encoding Loss:%s)\n", -		   (speed == PCIE_SPEED_8_0GT ? "8.0GT/s" : -		    speed == PCIE_SPEED_5_0GT ? "5.0GT/s" : -		    speed == PCIE_SPEED_2_5GT ? "2.5GT/s" : -		    "Unknown"), -		   width, -		   (speed == PCIE_SPEED_2_5GT ? "20%" : -		    speed == PCIE_SPEED_5_0GT ? "20%" : -		    speed == PCIE_SPEED_8_0GT ? "<2%" : -		    "Unknown")); - -	if (max_gts < expected_gts) { -		e_dev_warn("This is not sufficient for optimal performance of this card.\n"); -		e_dev_warn("For optimal performance, at least %dGT/s of bandwidth is required.\n", -			expected_gts); -		e_dev_warn("A slot with more lanes and/or higher speed is suggested.\n"); -	} +	pcie_print_link_status(pdev);  }  static void ixgbe_service_event_schedule(struct ixgbe_adapter *adapter) @@ -752,8 +682,8 @@ static void ixgbe_dump(struct ixgbe_adapter *adapter)  					ring_desc = "";  				pr_info("T [0x%03X]    %016llX %016llX %016llX %08X %p %016llX %p%s",  					i, -					le64_to_cpu(u0->a), -					le64_to_cpu(u0->b), +					le64_to_cpu((__force __le64)u0->a), +					le64_to_cpu((__force __le64)u0->b),  					(u64)dma_unmap_addr(tx_buffer, dma),  					dma_unmap_len(tx_buffer, len),  					tx_buffer->next_to_watch, @@ -864,15 +794,15 @@ rx_ring_summary:  				/* Descriptor Done */  				pr_info("RWB[0x%03X]     %016llX %016llX ---------------- %p%s\n",  					i, -					le64_to_cpu(u0->a), -					le64_to_cpu(u0->b), +					le64_to_cpu((__force __le64)u0->a), +					le64_to_cpu((__force __le64)u0->b),  					rx_buffer_info->skb,  					ring_desc);  			} else {  				pr_info("R  [0x%03X]     %016llX %016llX %016llX %p%s\n",  					i, -					le64_to_cpu(u0->a), -					le64_to_cpu(u0->b), +					le64_to_cpu((__force __le64)u0->a), +					le64_to_cpu((__force __le64)u0->b),  					(u64)rx_buffer_info->dma,  					rx_buffer_info->skb,  					ring_desc); @@ -1216,7 +1146,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,  		/* free the skb */  		if (ring_is_xdp(tx_ring)) -			page_frag_free(tx_buffer->data); +			xdp_return_frame(tx_buffer->xdpf);  		else  			napi_consume_skb(tx_buffer->skb, napi_budget); @@ -1768,15 +1698,14 @@ static void ixgbe_process_skb_fields(struct ixgbe_ring *rx_ring,  	if (ixgbe_test_staterr(rx_desc, IXGBE_RXDADV_STAT_SECP))  		ixgbe_ipsec_rx(rx_ring, rx_desc, skb); -	skb->protocol = eth_type_trans(skb, dev); -  	/* record Rx queue, or update MACVLAN statistics */  	if (netif_is_ixgbe(dev))  		skb_record_rx_queue(skb, rx_ring->queue_index);  	else  		macvlan_count_rx(netdev_priv(dev), skb->len + ETH_HLEN, true, -				 (skb->pkt_type == PACKET_BROADCAST) || -				 (skb->pkt_type == PACKET_MULTICAST)); +				 false); + +	skb->protocol = eth_type_trans(skb, dev);  }  static void ixgbe_rx_skb(struct ixgbe_q_vector *q_vector, @@ -2257,12 +2186,13 @@ static struct sk_buff *ixgbe_build_skb(struct ixgbe_ring *rx_ring,  	return skb;  } -#define IXGBE_XDP_PASS 0 -#define IXGBE_XDP_CONSUMED 1 -#define IXGBE_XDP_TX 2 +#define IXGBE_XDP_PASS		0 +#define IXGBE_XDP_CONSUMED	BIT(0) +#define IXGBE_XDP_TX		BIT(1) +#define IXGBE_XDP_REDIR		BIT(2)  static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter, -			       struct xdp_buff *xdp); +			       struct xdp_frame *xdpf);  static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,  				     struct ixgbe_ring *rx_ring, @@ -2270,6 +2200,7 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,  {  	int err, result = IXGBE_XDP_PASS;  	struct bpf_prog *xdp_prog; +	struct xdp_frame *xdpf;  	u32 act;  	rcu_read_lock(); @@ -2278,17 +2209,24 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,  	if (!xdp_prog)  		goto xdp_out; +	prefetchw(xdp->data_hard_start); /* xdp_frame write */ +  	act = bpf_prog_run_xdp(xdp_prog, xdp);  	switch (act) {  	case XDP_PASS:  		break;  	case XDP_TX: -		result = ixgbe_xmit_xdp_ring(adapter, xdp); +		xdpf = convert_to_xdp_frame(xdp); +		if (unlikely(!xdpf)) { +			result = IXGBE_XDP_CONSUMED; +			break; +		} +		result = ixgbe_xmit_xdp_ring(adapter, xdpf);  		break;  	case XDP_REDIRECT:  		err = xdp_do_redirect(adapter->netdev, xdp, xdp_prog);  		if (!err) -			result = IXGBE_XDP_TX; +			result = IXGBE_XDP_REDIR;  		else  			result = IXGBE_XDP_CONSUMED;  		break; @@ -2348,7 +2286,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  	unsigned int mss = 0;  #endif /* IXGBE_FCOE */  	u16 cleaned_count = ixgbe_desc_unused(rx_ring); -	bool xdp_xmit = false; +	unsigned int xdp_xmit = 0;  	struct xdp_buff xdp;  	xdp.rxq = &rx_ring->xdp_rxq; @@ -2391,8 +2329,10 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  		}  		if (IS_ERR(skb)) { -			if (PTR_ERR(skb) == -IXGBE_XDP_TX) { -				xdp_xmit = true; +			unsigned int xdp_res = -PTR_ERR(skb); + +			if (xdp_res & (IXGBE_XDP_TX | IXGBE_XDP_REDIR)) { +				xdp_xmit |= xdp_res;  				ixgbe_rx_buffer_flip(rx_ring, rx_buffer, size);  			} else {  				rx_buffer->pagecnt_bias++; @@ -2464,7 +2404,10 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  		total_rx_packets++;  	} -	if (xdp_xmit) { +	if (xdp_xmit & IXGBE_XDP_REDIR) +		xdp_do_flush_map(); + +	if (xdp_xmit & IXGBE_XDP_TX) {  		struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()];  		/* Force memory writes to complete before letting h/w @@ -2472,8 +2415,6 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,  		 */  		wmb();  		writel(ring->next_to_use, ring->tail); - -		xdp_do_flush_map();  	}  	u64_stats_update_begin(&rx_ring->syncp); @@ -4211,7 +4152,8 @@ static void ixgbe_setup_psrtype(struct ixgbe_adapter *adapter)  static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)  {  	struct ixgbe_hw *hw = &adapter->hw; -	u32 reg_offset, vf_shift; +	u16 pool = adapter->num_rx_pools; +	u32 reg_offset, vf_shift, vmolr;  	u32 gcr_ext, vmdctl;  	int i; @@ -4225,6 +4167,13 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)  	vmdctl |= IXGBE_VT_CTL_REPLEN;  	IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl); +	/* accept untagged packets until a vlan tag is +	 * specifically set for the VMDQ queue/pool +	 */ +	vmolr = IXGBE_VMOLR_AUPE; +	while (pool--) +		IXGBE_WRITE_REG(hw, IXGBE_VMOLR(VMDQ_P(pool)), vmolr); +  	vf_shift = VMDQ_P(0) % 32;  	reg_offset = (VMDQ_P(0) >= 32) ? 1 : 0; @@ -4892,36 +4841,6 @@ int ixgbe_del_mac_filter(struct ixgbe_adapter *adapter,  	return -ENOMEM;  } -/** - * ixgbe_write_uc_addr_list - write unicast addresses to RAR table - * @netdev: network interface device structure - * @vfn: pool to associate with unicast addresses - * - * Writes unicast address list to the RAR table. - * Returns: -ENOMEM on failure/insufficient address space - *                0 on no addresses written - *                X on writing X addresses to the RAR table - **/ -static int ixgbe_write_uc_addr_list(struct net_device *netdev, int vfn) -{ -	struct ixgbe_adapter *adapter = netdev_priv(netdev); -	int count = 0; - -	/* return ENOMEM indicating insufficient memory for addresses */ -	if (netdev_uc_count(netdev) > ixgbe_available_rars(adapter, vfn)) -		return -ENOMEM; - -	if (!netdev_uc_empty(netdev)) { -		struct netdev_hw_addr *ha; -		netdev_for_each_uc_addr(ha, netdev) { -			ixgbe_del_mac_filter(adapter, ha->addr, vfn); -			ixgbe_add_mac_filter(adapter, ha->addr, vfn); -			count++; -		} -	} -	return count; -} -  static int ixgbe_uc_sync(struct net_device *netdev, const unsigned char *addr)  {  	struct ixgbe_adapter *adapter = netdev_priv(netdev); @@ -5301,29 +5220,6 @@ static void ixgbe_fdir_filter_restore(struct ixgbe_adapter *adapter)  	spin_unlock(&adapter->fdir_perfect_lock);  } -static void ixgbe_macvlan_set_rx_mode(struct net_device *dev, unsigned int pool, -				      struct ixgbe_adapter *adapter) -{ -	struct ixgbe_hw *hw = &adapter->hw; -	u32 vmolr; - -	/* No unicast promiscuous support for VMDQ devices. */ -	vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(pool)); -	vmolr |= (IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_BAM | IXGBE_VMOLR_AUPE); - -	/* clear the affected bit */ -	vmolr &= ~IXGBE_VMOLR_MPE; - -	if (dev->flags & IFF_ALLMULTI) { -		vmolr |= IXGBE_VMOLR_MPE; -	} else { -		vmolr |= IXGBE_VMOLR_ROMPE; -		hw->mac.ops.update_mc_addr_list(hw, dev); -	} -	ixgbe_write_uc_addr_list(adapter->netdev, pool); -	IXGBE_WRITE_REG(hw, IXGBE_VMOLR(pool), vmolr); -} -  /**   * ixgbe_clean_rx_ring - Free Rx Buffers per Queue   * @rx_ring: ring to free buffers from @@ -5376,21 +5272,17 @@ static void ixgbe_clean_rx_ring(struct ixgbe_ring *rx_ring)  	rx_ring->next_to_use = 0;  } -static int ixgbe_fwd_ring_up(struct net_device *vdev, +static int ixgbe_fwd_ring_up(struct ixgbe_adapter *adapter,  			     struct ixgbe_fwd_adapter *accel)  { -	struct ixgbe_adapter *adapter = accel->real_adapter; +	struct net_device *vdev = accel->netdev;  	int i, baseq, err; -	if (!test_bit(accel->pool, adapter->fwd_bitmask)) -		return 0; -  	baseq = accel->pool * adapter->num_rx_queues_per_pool;  	netdev_dbg(vdev, "pool %i:%i queues %i:%i\n",  		   accel->pool, adapter->num_rx_pools,  		   baseq, baseq + adapter->num_rx_queues_per_pool); -	accel->netdev = vdev;  	accel->rx_base_queue = baseq;  	accel->tx_base_queue = baseq; @@ -5407,26 +5299,36 @@ static int ixgbe_fwd_ring_up(struct net_device *vdev,  	 */  	err = ixgbe_add_mac_filter(adapter, vdev->dev_addr,  				   VMDQ_P(accel->pool)); -	if (err >= 0) { -		ixgbe_macvlan_set_rx_mode(vdev, accel->pool, adapter); +	if (err >= 0)  		return 0; -	} + +	/* if we cannot add the MAC rule then disable the offload */ +	macvlan_release_l2fw_offload(vdev);  	for (i = 0; i < adapter->num_rx_queues_per_pool; i++)  		adapter->rx_ring[baseq + i]->netdev = NULL; +	netdev_err(vdev, "L2FW offload disabled due to L2 filter error\n"); + +	clear_bit(accel->pool, adapter->fwd_bitmask); +	kfree(accel); +  	return err;  } -static int ixgbe_upper_dev_walk(struct net_device *upper, void *data) +static int ixgbe_macvlan_up(struct net_device *vdev, void *data)  { -	if (netif_is_macvlan(upper)) { -		struct macvlan_dev *dfwd = netdev_priv(upper); -		struct ixgbe_fwd_adapter *vadapter = dfwd->fwd_priv; +	struct ixgbe_adapter *adapter = data; +	struct ixgbe_fwd_adapter *accel; -		if (dfwd->fwd_priv) -			ixgbe_fwd_ring_up(upper, vadapter); -	} +	if (!netif_is_macvlan(vdev)) +		return 0; + +	accel = macvlan_accel_priv(vdev); +	if (!accel) +		return 0; + +	ixgbe_fwd_ring_up(adapter, accel);  	return 0;  } @@ -5434,7 +5336,7 @@ static int ixgbe_upper_dev_walk(struct net_device *upper, void *data)  static void ixgbe_configure_dfwd(struct ixgbe_adapter *adapter)  {  	netdev_walk_all_upper_dev_rcu(adapter->netdev, -				      ixgbe_upper_dev_walk, NULL); +				      ixgbe_macvlan_up, adapter);  }  static void ixgbe_configure(struct ixgbe_adapter *adapter) @@ -5797,7 +5699,7 @@ static void ixgbe_clean_tx_ring(struct ixgbe_ring *tx_ring)  		/* Free all the Tx ring sk_buffs */  		if (ring_is_xdp(tx_ring)) -			page_frag_free(tx_buffer->data); +			xdp_return_frame(tx_buffer->xdpf);  		else  			dev_kfree_skb_any(tx_buffer->skb); @@ -6136,8 +6038,8 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,  	for (i = 1; i < IXGBE_MAX_LINK_HANDLE; i++)  		adapter->jump_tables[i] = NULL; -	adapter->mac_table = kzalloc(sizeof(struct ixgbe_mac_addr) * -				     hw->mac.num_rar_entries, +	adapter->mac_table = kcalloc(hw->mac.num_rar_entries, +				     sizeof(struct ixgbe_mac_addr),  				     GFP_ATOMIC);  	if (!adapter->mac_table)  		return -ENOMEM; @@ -6219,6 +6121,7 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,  #ifdef CONFIG_IXGBE_DCB  	ixgbe_init_dcb(adapter);  #endif +	ixgbe_init_ipsec_offload(adapter);  	/* default flow control settings */  	hw->fc.requested_mode = ixgbe_fc_full; @@ -6370,7 +6273,7 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,  	struct device *dev = rx_ring->dev;  	int orig_node = dev_to_node(dev);  	int ring_node = -1; -	int size; +	int size, err;  	size = sizeof(struct ixgbe_rx_buffer) * rx_ring->count; @@ -6407,6 +6310,13 @@ int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,  			     rx_ring->queue_index) < 0)  		goto err; +	err = xdp_rxq_info_reg_mem_model(&rx_ring->xdp_rxq, +					 MEM_TYPE_PAGE_SHARED, NULL); +	if (err) { +		xdp_rxq_info_unreg(&rx_ring->xdp_rxq); +		goto err; +	} +  	rx_ring->xdp_prog = adapter->xdp_prog;  	return 0; @@ -7671,17 +7581,19 @@ static void ixgbe_reset_subtask(struct ixgbe_adapter *adapter)  	if (!test_and_clear_bit(__IXGBE_RESET_REQUESTED, &adapter->state))  		return; +	rtnl_lock();  	/* If we're already down, removing or resetting, just bail */  	if (test_bit(__IXGBE_DOWN, &adapter->state) ||  	    test_bit(__IXGBE_REMOVING, &adapter->state) || -	    test_bit(__IXGBE_RESETTING, &adapter->state)) +	    test_bit(__IXGBE_RESETTING, &adapter->state)) { +		rtnl_unlock();  		return; +	}  	ixgbe_dump(adapter);  	netdev_err(adapter->netdev, "Reset adapter\n");  	adapter->tx_timeout_count++; -	rtnl_lock();  	ixgbe_reinit_locked(adapter);  	rtnl_unlock();  } @@ -7801,7 +7713,7 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,  	/* remove payload length from inner checksum */  	paylen = skb->len - l4_offset; -	csum_replace_by_diff(&l4.tcp->check, htonl(paylen)); +	csum_replace_by_diff(&l4.tcp->check, (__force __wsum)htonl(paylen));  	/* update gso size and bytecount with header size */  	first->gso_segs = skb_shinfo(skb)->gso_segs; @@ -8336,7 +8248,7 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,  }  static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter, -			       struct xdp_buff *xdp) +			       struct xdp_frame *xdpf)  {  	struct ixgbe_ring *ring = adapter->xdp_ring[smp_processor_id()];  	struct ixgbe_tx_buffer *tx_buffer; @@ -8345,12 +8257,12 @@ static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,  	dma_addr_t dma;  	u16 i; -	len = xdp->data_end - xdp->data; +	len = xdpf->len;  	if (unlikely(!ixgbe_desc_unused(ring)))  		return IXGBE_XDP_CONSUMED; -	dma = dma_map_single(ring->dev, xdp->data, len, DMA_TO_DEVICE); +	dma = dma_map_single(ring->dev, xdpf->data, len, DMA_TO_DEVICE);  	if (dma_mapping_error(ring->dev, dma))  		return IXGBE_XDP_CONSUMED; @@ -8365,7 +8277,8 @@ static int ixgbe_xmit_xdp_ring(struct ixgbe_adapter *adapter,  	dma_unmap_len_set(tx_buffer, len, len);  	dma_unmap_addr_set(tx_buffer, dma, dma); -	tx_buffer->data = xdp->data; +	tx_buffer->xdpf = xdpf; +  	tx_desc->read.buffer_addr = cpu_to_le64(dma);  	/* put descriptor type bits */ @@ -8827,6 +8740,49 @@ static void ixgbe_set_prio_tc_map(struct ixgbe_adapter *adapter)  }  #endif /* CONFIG_IXGBE_DCB */ +static int ixgbe_reassign_macvlan_pool(struct net_device *vdev, void *data) +{ +	struct ixgbe_adapter *adapter = data; +	struct ixgbe_fwd_adapter *accel; +	int pool; + +	/* we only care about macvlans... */ +	if (!netif_is_macvlan(vdev)) +		return 0; + +	/* that have hardware offload enabled... */ +	accel = macvlan_accel_priv(vdev); +	if (!accel) +		return 0; + +	/* If we can relocate to a different bit do so */ +	pool = find_first_zero_bit(adapter->fwd_bitmask, adapter->num_rx_pools); +	if (pool < adapter->num_rx_pools) { +		set_bit(pool, adapter->fwd_bitmask); +		accel->pool = pool; +		return 0; +	} + +	/* if we cannot find a free pool then disable the offload */ +	netdev_err(vdev, "L2FW offload disabled due to lack of queue resources\n"); +	macvlan_release_l2fw_offload(vdev); +	kfree(accel); + +	return 0; +} + +static void ixgbe_defrag_macvlan_pools(struct net_device *dev) +{ +	struct ixgbe_adapter *adapter = netdev_priv(dev); + +	/* flush any stale bits out of the fwd bitmask */ +	bitmap_clear(adapter->fwd_bitmask, 1, 63); + +	/* walk through upper devices reassigning pools */ +	netdev_walk_all_upper_dev_rcu(dev, ixgbe_reassign_macvlan_pool, +				      adapter); +} +  /**   * ixgbe_setup_tc - configure net_device for multiple traffic classes   * @@ -8871,14 +8827,6 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)  	} else {  		netdev_reset_tc(dev); -		/* To support macvlan offload we have to use num_tc to -		 * restrict the queues that can be used by the device. -		 * By doing this we can avoid reporting a false number of -		 * queues. -		 */ -		if (!tc && adapter->num_rx_pools > 1) -			netdev_set_num_tc(dev, 1); -  		if (adapter->hw.mac.type == ixgbe_mac_82598EB)  			adapter->hw.fc.requested_mode = adapter->last_lfc_mode; @@ -8894,6 +8842,8 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)  #endif /* CONFIG_IXGBE_DCB */  	ixgbe_init_interrupt_scheme(adapter); +	ixgbe_defrag_macvlan_pools(dev); +  	if (netif_running(dev))  		return ixgbe_open(dev); @@ -8998,13 +8948,12 @@ struct upper_walk_data {  static int get_macvlan_queue(struct net_device *upper, void *_data)  {  	if (netif_is_macvlan(upper)) { -		struct macvlan_dev *dfwd = netdev_priv(upper); -		struct ixgbe_fwd_adapter *vadapter = dfwd->fwd_priv; +		struct ixgbe_fwd_adapter *vadapter = macvlan_accel_priv(upper);  		struct upper_walk_data *data = _data;  		struct ixgbe_adapter *adapter = data->adapter;  		int ifindex = data->ifindex; -		if (vadapter && vadapter->netdev->ifindex == ifindex) { +		if (vadapter && upper->ifindex == ifindex) {  			data->queue = adapter->rx_ring[vadapter->rx_base_queue]->reg_idx;  			data->action = data->queue;  			return 1; @@ -9108,7 +9057,8 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input,  		for (j = 0; field_ptr[j].val; j++) {  			if (field_ptr[j].off == off) { -				field_ptr[j].val(input, mask, val, m); +				field_ptr[j].val(input, mask, (__force u32)val, +						 (__force u32)m);  				input->filter.formatted.flow_type |=  					field_ptr[j].type;  				found_entry = true; @@ -9117,8 +9067,10 @@ static int ixgbe_clsu32_build_input(struct ixgbe_fdir_filter *input,  		}  		if (nexthdr) {  			if (nexthdr->off == cls->knode.sel->keys[i].off && -			    nexthdr->val == cls->knode.sel->keys[i].val && -			    nexthdr->mask == cls->knode.sel->keys[i].mask) +			    nexthdr->val == +			    (__force u32)cls->knode.sel->keys[i].val && +			    nexthdr->mask == +			    (__force u32)cls->knode.sel->keys[i].mask)  				found_jump_field = true;  			else  				continue; @@ -9222,7 +9174,8 @@ static int ixgbe_configure_clsu32(struct ixgbe_adapter *adapter,  		for (i = 0; nexthdr[i].jump; i++) {  			if (nexthdr[i].o != cls->knode.sel->offoff ||  			    nexthdr[i].s != cls->knode.sel->offshift || -			    nexthdr[i].m != cls->knode.sel->offmask) +			    nexthdr[i].m != +			    (__force u32)cls->knode.sel->offmask)  				return err;  			jump = kzalloc(sizeof(*jump), GFP_KERNEL); @@ -9443,6 +9396,22 @@ static netdev_features_t ixgbe_fix_features(struct net_device *netdev,  	return features;  } +static void ixgbe_reset_l2fw_offload(struct ixgbe_adapter *adapter) +{ +	int rss = min_t(int, ixgbe_max_rss_indices(adapter), +			num_online_cpus()); + +	/* go back to full RSS if we're not running SR-IOV */ +	if (!adapter->ring_feature[RING_F_VMDQ].offset) +		adapter->flags &= ~(IXGBE_FLAG_VMDQ_ENABLED | +				    IXGBE_FLAG_SRIOV_ENABLED); + +	adapter->ring_feature[RING_F_RSS].limit = rss; +	adapter->ring_feature[RING_F_VMDQ].limit = 1; + +	ixgbe_setup_tc(adapter->netdev, adapter->hw_tcs); +} +  static int ixgbe_set_features(struct net_device *netdev,  			      netdev_features_t features)  { @@ -9523,7 +9492,9 @@ static int ixgbe_set_features(struct net_device *netdev,  		}  	} -	if (need_reset) +	if ((changed & NETIF_F_HW_L2FW_DOFFLOAD) && adapter->num_rx_pools > 1) +		ixgbe_reset_l2fw_offload(adapter); +	else if (need_reset)  		ixgbe_do_reset(netdev);  	else if (changed & (NETIF_F_HW_VLAN_CTAG_RX |  			    NETIF_F_HW_VLAN_CTAG_FILTER)) @@ -9786,71 +9757,98 @@ static int ixgbe_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,  static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)  { -	struct ixgbe_fwd_adapter *fwd_adapter = NULL;  	struct ixgbe_adapter *adapter = netdev_priv(pdev); -	int used_pools = adapter->num_vfs + adapter->num_rx_pools; +	struct ixgbe_fwd_adapter *accel;  	int tcs = adapter->hw_tcs ? : 1; -	unsigned int limit;  	int pool, err; -	/* Hardware has a limited number of available pools. Each VF, and the -	 * PF require a pool. Check to ensure we don't attempt to use more -	 * then the available number of pools. +	/* The hardware supported by ixgbe only filters on the destination MAC +	 * address. In order to avoid issues we only support offloading modes +	 * where the hardware can actually provide the functionality.  	 */ -	if (used_pools >= IXGBE_MAX_VF_FUNCTIONS) -		return ERR_PTR(-EINVAL); +	if (!macvlan_supports_dest_filter(vdev)) +		return ERR_PTR(-EMEDIUMTYPE); -	if (((adapter->flags & IXGBE_FLAG_DCB_ENABLED) && -	      adapter->num_rx_pools >= (MAX_TX_QUEUES / tcs)) || -	    (adapter->num_rx_pools > IXGBE_MAX_MACVLANS)) -		return ERR_PTR(-EBUSY); +	pool = find_first_zero_bit(adapter->fwd_bitmask, adapter->num_rx_pools); +	if (pool == adapter->num_rx_pools) { +		u16 used_pools = adapter->num_vfs + adapter->num_rx_pools; +		u16 reserved_pools; + +		if (((adapter->flags & IXGBE_FLAG_DCB_ENABLED) && +		     adapter->num_rx_pools >= (MAX_TX_QUEUES / tcs)) || +		    adapter->num_rx_pools > IXGBE_MAX_MACVLANS) +			return ERR_PTR(-EBUSY); + +		/* Hardware has a limited number of available pools. Each VF, +		 * and the PF require a pool. Check to ensure we don't +		 * attempt to use more then the available number of pools. +		 */ +		if (used_pools >= IXGBE_MAX_VF_FUNCTIONS) +			return ERR_PTR(-EBUSY); -	fwd_adapter = kzalloc(sizeof(*fwd_adapter), GFP_KERNEL); -	if (!fwd_adapter) -		return ERR_PTR(-ENOMEM); +		/* Enable VMDq flag so device will be set in VM mode */ +		adapter->flags |= IXGBE_FLAG_VMDQ_ENABLED | +				  IXGBE_FLAG_SRIOV_ENABLED; + +		/* Try to reserve as many queues per pool as possible, +		 * we start with the configurations that support 4 queues +		 * per pools, followed by 2, and then by just 1 per pool. +		 */ +		if (used_pools < 32 && adapter->num_rx_pools < 16) +			reserved_pools = min_t(u16, +					       32 - used_pools, +					       16 - adapter->num_rx_pools); +		else if (adapter->num_rx_pools < 32) +			reserved_pools = min_t(u16, +					       64 - used_pools, +					       32 - adapter->num_rx_pools); +		else +			reserved_pools = 64 - used_pools; -	pool = find_first_zero_bit(adapter->fwd_bitmask, adapter->num_rx_pools); -	set_bit(pool, adapter->fwd_bitmask); -	limit = find_last_bit(adapter->fwd_bitmask, adapter->num_rx_pools + 1); -	/* Enable VMDq flag so device will be set in VM mode */ -	adapter->flags |= IXGBE_FLAG_VMDQ_ENABLED | IXGBE_FLAG_SRIOV_ENABLED; -	adapter->ring_feature[RING_F_VMDQ].limit = limit + 1; +		if (!reserved_pools) +			return ERR_PTR(-EBUSY); -	fwd_adapter->pool = pool; -	fwd_adapter->real_adapter = adapter; +		adapter->ring_feature[RING_F_VMDQ].limit += reserved_pools; -	/* Force reinit of ring allocation with VMDQ enabled */ -	err = ixgbe_setup_tc(pdev, adapter->hw_tcs); +		/* Force reinit of ring allocation with VMDQ enabled */ +		err = ixgbe_setup_tc(pdev, adapter->hw_tcs); +		if (err) +			return ERR_PTR(err); -	if (!err && netif_running(pdev)) -		err = ixgbe_fwd_ring_up(vdev, fwd_adapter); +		if (pool >= adapter->num_rx_pools) +			return ERR_PTR(-ENOMEM); +	} -	if (!err) -		return fwd_adapter; +	accel = kzalloc(sizeof(*accel), GFP_KERNEL); +	if (!accel) +		return ERR_PTR(-ENOMEM); + +	set_bit(pool, adapter->fwd_bitmask); +	accel->pool = pool; +	accel->netdev = vdev; + +	if (!netif_running(pdev)) +		return accel; + +	err = ixgbe_fwd_ring_up(adapter, accel); +	if (err) +		return ERR_PTR(err); -	/* unwind counter and free adapter struct */ -	netdev_info(pdev, -		    "%s: dfwd hardware acceleration failed\n", vdev->name); -	clear_bit(pool, adapter->fwd_bitmask); -	kfree(fwd_adapter); -	return ERR_PTR(err); +	return accel;  }  static void ixgbe_fwd_del(struct net_device *pdev, void *priv)  {  	struct ixgbe_fwd_adapter *accel = priv; -	struct ixgbe_adapter *adapter = accel->real_adapter; +	struct ixgbe_adapter *adapter = netdev_priv(pdev);  	unsigned int rxbase = accel->rx_base_queue; -	unsigned int limit, i; +	unsigned int i;  	/* delete unicast filter associated with offloaded interface */  	ixgbe_del_mac_filter(adapter, accel->netdev->dev_addr,  			     VMDQ_P(accel->pool)); -	/* disable ability to receive packets for this pool */ -	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VMOLR(accel->pool), 0); -  	/* Allow remaining Rx packets to get flushed out of the  	 * Rx FIFO before we drop the netdev for the ring.  	 */ @@ -9869,25 +9867,6 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv)  	}  	clear_bit(accel->pool, adapter->fwd_bitmask); -	limit = find_last_bit(adapter->fwd_bitmask, adapter->num_rx_pools); -	adapter->ring_feature[RING_F_VMDQ].limit = limit + 1; - -	/* go back to full RSS if we're done with our VMQs */ -	if (adapter->ring_feature[RING_F_VMDQ].limit == 1) { -		int rss = min_t(int, ixgbe_max_rss_indices(adapter), -				num_online_cpus()); - -		adapter->flags &= ~IXGBE_FLAG_VMDQ_ENABLED; -		adapter->flags &= ~IXGBE_FLAG_SRIOV_ENABLED; -		adapter->ring_feature[RING_F_RSS].limit = rss; -	} - -	ixgbe_setup_tc(pdev, adapter->hw_tcs); -	netdev_dbg(pdev, "pool %i:%i queues %i:%i\n", -		   accel->pool, adapter->num_rx_pools, -		   accel->rx_base_queue, -		   accel->rx_base_queue + -		   adapter->num_rx_queues_per_pool);  	kfree(accel);  } @@ -9922,7 +9901,7 @@ ixgbe_features_check(struct sk_buff *skb, struct net_device *dev,  	 * the TSO, so it's the exception.  	 */  	if (skb->encapsulation && !(features & NETIF_F_TSO_MANGLEID)) { -#ifdef CONFIG_XFRM +#ifdef CONFIG_XFRM_OFFLOAD  		if (!skb->sp)  #endif  			features &= ~NETIF_F_TSO; @@ -9969,7 +9948,8 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog)  		}  	} else {  		for (i = 0; i < adapter->num_rx_queues; i++) -			xchg(&adapter->rx_ring[i]->xdp_prog, adapter->xdp_prog); +			(void)xchg(&adapter->rx_ring[i]->xdp_prog, +			    adapter->xdp_prog);  	}  	if (old_prog) @@ -9995,15 +9975,29 @@ static int ixgbe_xdp(struct net_device *dev, struct netdev_bpf *xdp)  	}  } -static int ixgbe_xdp_xmit(struct net_device *dev, struct xdp_buff *xdp) +static void ixgbe_xdp_ring_update_tail(struct ixgbe_ring *ring) +{ +	/* Force memory writes to complete before letting h/w know there +	 * are new descriptors to fetch. +	 */ +	wmb(); +	writel(ring->next_to_use, ring->tail); +} + +static int ixgbe_xdp_xmit(struct net_device *dev, int n, +			  struct xdp_frame **frames, u32 flags)  {  	struct ixgbe_adapter *adapter = netdev_priv(dev);  	struct ixgbe_ring *ring; -	int err; +	int drops = 0; +	int i;  	if (unlikely(test_bit(__IXGBE_DOWN, &adapter->state)))  		return -ENETDOWN; +	if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) +		return -EINVAL; +  	/* During program transitions its possible adapter->xdp_prog is assigned  	 * but ring has not been configured yet. In this case simply abort xmit.  	 */ @@ -10011,35 +10005,21 @@ static int ixgbe_xdp_xmit(struct net_device *dev, struct xdp_buff *xdp)  	if (unlikely(!ring))  		return -ENXIO; -	err = ixgbe_xmit_xdp_ring(adapter, xdp); -	if (err != IXGBE_XDP_TX) -		return -ENOSPC; - -	return 0; -} - -static void ixgbe_xdp_flush(struct net_device *dev) -{ -	struct ixgbe_adapter *adapter = netdev_priv(dev); -	struct ixgbe_ring *ring; - -	/* Its possible the device went down between xdp xmit and flush so -	 * we need to ensure device is still up. -	 */ -	if (unlikely(test_bit(__IXGBE_DOWN, &adapter->state))) -		return; +	for (i = 0; i < n; i++) { +		struct xdp_frame *xdpf = frames[i]; +		int err; -	ring = adapter->xdp_prog ? adapter->xdp_ring[smp_processor_id()] : NULL; -	if (unlikely(!ring)) -		return; +		err = ixgbe_xmit_xdp_ring(adapter, xdpf); +		if (err != IXGBE_XDP_TX) { +			xdp_return_frame_rx_napi(xdpf); +			drops++; +		} +	} -	/* Force memory writes to complete before letting h/w know there -	 * are new descriptors to fetch. -	 */ -	wmb(); -	writel(ring->next_to_use, ring->tail); +	if (unlikely(flags & XDP_XMIT_FLUSH)) +		ixgbe_xdp_ring_update_tail(ring); -	return; +	return n - drops;  }  static const struct net_device_ops ixgbe_netdev_ops = { @@ -10089,7 +10069,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {  	.ndo_features_check	= ixgbe_features_check,  	.ndo_bpf		= ixgbe_xdp,  	.ndo_xdp_xmit		= ixgbe_xdp_xmit, -	.ndo_xdp_flush		= ixgbe_xdp_flush,  };  /** @@ -10455,6 +10434,14 @@ skip_sriov:  	if (hw->mac.type >= ixgbe_mac_82599EB)  		netdev->features |= NETIF_F_SCTP_CRC; +#ifdef CONFIG_XFRM_OFFLOAD +#define IXGBE_ESP_FEATURES	(NETIF_F_HW_ESP | \ +				 NETIF_F_HW_ESP_TX_CSUM | \ +				 NETIF_F_GSO_ESP) + +	if (adapter->ipsec) +		netdev->features |= IXGBE_ESP_FEATURES; +#endif  	/* copy netdev features into list of user selectable features */  	netdev->hw_features |= netdev->features |  			       NETIF_F_HW_VLAN_CTAG_FILTER | @@ -10517,8 +10504,6 @@ skip_sriov:  					 NETIF_F_FCOE_MTU;  	}  #endif /* IXGBE_FCOE */ -	ixgbe_init_ipsec_offload(adapter); -  	if (adapter->flags2 & IXGBE_FLAG2_RSC_CAPABLE)  		netdev->hw_features |= NETIF_F_LRO;  	if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED) @@ -10908,14 +10893,14 @@ skip_bad_vf_detection:  	rtnl_lock();  	netif_device_detach(netdev); +	if (netif_running(netdev)) +		ixgbe_close_suspend(adapter); +  	if (state == pci_channel_io_perm_failure) {  		rtnl_unlock();  		return PCI_ERS_RESULT_DISCONNECT;  	} -	if (netif_running(netdev)) -		ixgbe_close_suspend(adapter); -  	if (!test_and_set_bit(__IXGBE_DISABLED, &adapter->state))  		pci_disable_device(pdev);  	rtnl_unlock();  |