diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 36 | 
1 files changed, 29 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 447098005490..9a23d33a47ed 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -6201,7 +6201,7 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,  	adapter->mac_table = kcalloc(hw->mac.num_rar_entries,  				     sizeof(struct ixgbe_mac_addr), -				     GFP_ATOMIC); +				     GFP_KERNEL);  	if (!adapter->mac_table)  		return -ENOMEM; @@ -6620,8 +6620,18 @@ static int ixgbe_change_mtu(struct net_device *netdev, int new_mtu)  	struct ixgbe_adapter *adapter = netdev_priv(netdev);  	if (adapter->xdp_prog) { -		e_warn(probe, "MTU cannot be changed while XDP program is loaded\n"); -		return -EPERM; +		int new_frame_size = new_mtu + ETH_HLEN + ETH_FCS_LEN + +				     VLAN_HLEN; +		int i; + +		for (i = 0; i < adapter->num_rx_queues; i++) { +			struct ixgbe_ring *ring = adapter->rx_ring[i]; + +			if (new_frame_size > ixgbe_rx_bufsz(ring)) { +				e_warn(probe, "Requested MTU size is not supported with XDP\n"); +				return -EINVAL; +			} +		}  	}  	/* @@ -8983,6 +8993,15 @@ int ixgbe_setup_tc(struct net_device *dev, u8 tc)  #ifdef CONFIG_IXGBE_DCB  	if (tc) { +		if (adapter->xdp_prog) { +			e_warn(probe, "DCB is not supported with XDP\n"); + +			ixgbe_init_interrupt_scheme(adapter); +			if (netif_running(dev)) +				ixgbe_open(dev); +			return -EINVAL; +		} +  		netdev_set_num_tc(dev, tc);  		ixgbe_set_prio_tc_map(adapter); @@ -9171,14 +9190,12 @@ static int parse_tc_actions(struct ixgbe_adapter *adapter,  			    struct tcf_exts *exts, u64 *action, u8 *queue)  {  	const struct tc_action *a; -	LIST_HEAD(actions); +	int i;  	if (!tcf_exts_has_actions(exts))  		return -EINVAL; -	tcf_exts_to_list(exts, &actions); -	list_for_each_entry(a, &actions, list) { - +	tcf_exts_for_each_action(i, a, exts) {  		/* Drop action */  		if (is_tcf_gact_shot(a)) {  			*action = IXGBE_FDIR_DROP_QUEUE; @@ -9936,6 +9953,11 @@ static void *ixgbe_fwd_add(struct net_device *pdev, struct net_device *vdev)  	int tcs = adapter->hw_tcs ? : 1;  	int pool, err; +	if (adapter->xdp_prog) { +		e_warn(probe, "L2FW offload is not supported with XDP\n"); +		return ERR_PTR(-EINVAL); +	} +  	/* 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.  |