diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_adminq.c | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_common.c | 40 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 82 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 27 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 103 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_xsk.c | 1 | 
9 files changed, 156 insertions, 113 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index 7ce42040b851..8dc98d1d2e86 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -295,8 +295,6 @@ struct i40e_cloud_filter {  	u8 tunnel_type;  }; -#define I40E_ETH_P_LLDP			0x88cc -  #define I40E_DCB_PRIO_TYPE_STRICT	0  #define I40E_DCB_PRIO_TYPE_ETS		1  #define I40E_DCB_STRICT_PRIO_CREDITS	127 diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c index 243dcd4bec19..814acbe79ffd 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c +++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c @@ -675,7 +675,7 @@ static u16 i40e_clean_asq(struct i40e_hw *hw)  	desc = I40E_ADMINQ_DESC(*asq, ntc);  	details = I40E_ADMINQ_DETAILS(*asq, ntc);  	while (rd32(hw, hw->aq.asq.head) != ntc) { -		i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, +		i40e_debug(hw, I40E_DEBUG_AQ_COMMAND,  			   "ntc %d head %d.\n", ntc, rd32(hw, hw->aq.asq.head));  		if (details->callback) { @@ -835,7 +835,7 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,  	}  	/* bump the tail */ -	i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: desc and buffer:\n"); +	i40e_debug(hw, I40E_DEBUG_AQ_COMMAND, "AQTX: desc and buffer:\n");  	i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc_on_ring,  		      buff, buff_size);  	(hw->aq.asq.next_to_use)++; @@ -886,7 +886,7 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,  		hw->aq.asq_last_status = (enum i40e_admin_queue_err)retval;  	} -	i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, +	i40e_debug(hw, I40E_DEBUG_AQ_COMMAND,  		   "AQTX: desc and buffer writeback:\n");  	i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, buff, buff_size); @@ -995,7 +995,7 @@ i40e_status i40e_clean_arq_element(struct i40e_hw *hw,  		memcpy(e->msg_buf, hw->aq.arq.r.arq_bi[desc_idx].va,  		       e->msg_len); -	i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQRX: desc and buffer:\n"); +	i40e_debug(hw, I40E_DEBUG_AQ_COMMAND, "AQRX: desc and buffer:\n");  	i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, e->msg_buf,  		      hw->aq.arq_buf_size); diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c index ecb1adaa54ec..641b500ad919 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_common.c +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c @@ -281,47 +281,49 @@ void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,  		   void *buffer, u16 buf_len)  {  	struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc; +	u32 effective_mask = hw->debug_mask & mask; +	char prefix[27];  	u16 len;  	u8 *buf = (u8 *)buffer; -	if ((!(mask & hw->debug_mask)) || (desc == NULL)) +	if (!effective_mask || !desc)  		return;  	len = le16_to_cpu(aq_desc->datalen); -	i40e_debug(hw, mask, +	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,  		   "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",  		   le16_to_cpu(aq_desc->opcode),  		   le16_to_cpu(aq_desc->flags),  		   le16_to_cpu(aq_desc->datalen),  		   le16_to_cpu(aq_desc->retval)); -	i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n", +	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR, +		   "\tcookie (h,l) 0x%08X 0x%08X\n",  		   le32_to_cpu(aq_desc->cookie_high),  		   le32_to_cpu(aq_desc->cookie_low)); -	i40e_debug(hw, mask, "\tparam (0,1)  0x%08X 0x%08X\n", +	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR, +		   "\tparam (0,1)  0x%08X 0x%08X\n",  		   le32_to_cpu(aq_desc->params.internal.param0),  		   le32_to_cpu(aq_desc->params.internal.param1)); -	i40e_debug(hw, mask, "\taddr (h,l)   0x%08X 0x%08X\n", +	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR, +		   "\taddr (h,l)   0x%08X 0x%08X\n",  		   le32_to_cpu(aq_desc->params.external.addr_high),  		   le32_to_cpu(aq_desc->params.external.addr_low)); -	if ((buffer != NULL) && (aq_desc->datalen != 0)) { +	if (buffer && buf_len != 0 && len != 0 && +	    (effective_mask & I40E_DEBUG_AQ_DESC_BUFFER)) {  		i40e_debug(hw, mask, "AQ CMD Buffer:\n");  		if (buf_len < len)  			len = buf_len; -		/* write the full 16-byte chunks */ -		if (hw->debug_mask & mask) { -			char prefix[27]; - -			snprintf(prefix, sizeof(prefix), -				 "i40e %02x:%02x.%x: \t0x", -				 hw->bus.bus_id, -				 hw->bus.device, -				 hw->bus.func); - -			print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET, -				       16, 1, buf, len, false); -		} + +		snprintf(prefix, sizeof(prefix), +			 "i40e %02x:%02x.%x: \t0x", +			 hw->bus.bus_id, +			 hw->bus.device, +			 hw->bus.func); + +		print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET, +			       16, 1, buf, len, false);  	}  } diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c index 7ea4f09229e4..dc5b40013e61 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c @@ -1330,7 +1330,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,  			}  			ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,  						pf->hw.mac.addr, -						I40E_ETH_P_LLDP, 0, +						ETH_P_LLDP, 0,  						pf->vsi[pf->lan_vsi]->seid,  						0, true, NULL, NULL);  			if (ret) { @@ -1348,7 +1348,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,  			ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,  						pf->hw.mac.addr, -						I40E_ETH_P_LLDP, 0, +						ETH_P_LLDP, 0,  						pf->vsi[pf->lan_vsi]->seid,  						0, false, NULL, NULL);  			if (ret) { diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c index 7545b21bee3c..a6c5e10421dd 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c @@ -4852,9 +4852,12 @@ static u32 i40e_get_priv_flags(struct net_device *dev)  static int i40e_set_priv_flags(struct net_device *dev, u32 flags)  {  	struct i40e_netdev_priv *np = netdev_priv(dev); +	u64 orig_flags, new_flags, changed_flags; +	enum i40e_admin_queue_err adq_err;  	struct i40e_vsi *vsi = np->vsi;  	struct i40e_pf *pf = vsi->back; -	u64 orig_flags, new_flags, changed_flags; +	bool is_reset_needed; +	i40e_status status;  	u32 i, j;  	orig_flags = READ_ONCE(pf->flags); @@ -4898,6 +4901,10 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)  flags_complete:  	changed_flags = orig_flags ^ new_flags; +	is_reset_needed = !!(changed_flags & (I40E_FLAG_VEB_STATS_ENABLED | +		I40E_FLAG_LEGACY_RX | I40E_FLAG_SOURCE_PRUNING_DISABLED | +		I40E_FLAG_DISABLE_FW_LLDP)); +  	/* Before we finalize any flag changes, we need to perform some  	 * checks to ensure that the changes are supported and safe.  	 */ @@ -4932,13 +4939,6 @@ flags_complete:  		return -EOPNOTSUPP;  	} -	/* Now that we've checked to ensure that the new flags are valid, load -	 * them into place. Since we only modify flags either (a) during -	 * initialization or (b) while holding the RTNL lock, we don't need -	 * anything fancy here. -	 */ -	pf->flags = new_flags; -  	/* Process any additional changes needed as a result of flag changes.  	 * The changed_flags value reflects the list of bits that were  	 * changed in the code above. @@ -4946,7 +4946,7 @@ flags_complete:  	/* Flush current ATR settings if ATR was disabled */  	if ((changed_flags & I40E_FLAG_FD_ATR_ENABLED) && -	    !(pf->flags & I40E_FLAG_FD_ATR_ENABLED)) { +	    !(new_flags & I40E_FLAG_FD_ATR_ENABLED)) {  		set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);  		set_bit(__I40E_FD_FLUSH_REQUESTED, pf->state);  	} @@ -4955,7 +4955,7 @@ flags_complete:  		u16 sw_flags = 0, valid_flags = 0;  		int ret; -		if (!(pf->flags & I40E_FLAG_TRUE_PROMISC_SUPPORT)) +		if (!(new_flags & I40E_FLAG_TRUE_PROMISC_SUPPORT))  			sw_flags = I40E_AQ_SET_SWITCH_CFG_PROMISC;  		valid_flags = I40E_AQ_SET_SWITCH_CFG_PROMISC;  		ret = i40e_aq_set_switch_config(&pf->hw, sw_flags, valid_flags, @@ -4974,13 +4974,13 @@ flags_complete:  	    (changed_flags & I40E_FLAG_BASE_R_FEC)) {  		u8 fec_cfg = 0; -		if (pf->flags & I40E_FLAG_RS_FEC && -		    pf->flags & I40E_FLAG_BASE_R_FEC) { +		if (new_flags & I40E_FLAG_RS_FEC && +		    new_flags & I40E_FLAG_BASE_R_FEC) {  			fec_cfg = I40E_AQ_SET_FEC_AUTO; -		} else if (pf->flags & I40E_FLAG_RS_FEC) { +		} else if (new_flags & I40E_FLAG_RS_FEC) {  			fec_cfg = (I40E_AQ_SET_FEC_REQUEST_RS |  				   I40E_AQ_SET_FEC_ABILITY_RS); -		} else if (pf->flags & I40E_FLAG_BASE_R_FEC) { +		} else if (new_flags & I40E_FLAG_BASE_R_FEC) {  			fec_cfg = (I40E_AQ_SET_FEC_REQUEST_KR |  				   I40E_AQ_SET_FEC_ABILITY_KR);  		} @@ -4988,14 +4988,14 @@ flags_complete:  			dev_warn(&pf->pdev->dev, "Cannot change FEC config\n");  	} -	if ((changed_flags & pf->flags & +	if ((changed_flags & new_flags &  	     I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED) && -	    (pf->flags & I40E_FLAG_MFP_ENABLED)) +	    (new_flags & I40E_FLAG_MFP_ENABLED))  		dev_warn(&pf->pdev->dev,  			 "Turning on link-down-on-close flag may affect other partitions\n");  	if (changed_flags & I40E_FLAG_DISABLE_FW_LLDP) { -		if (pf->flags & I40E_FLAG_DISABLE_FW_LLDP) { +		if (new_flags & I40E_FLAG_DISABLE_FW_LLDP) {  			struct i40e_dcbx_config *dcbcfg;  			i40e_aq_stop_lldp(&pf->hw, true, false, NULL); @@ -5013,17 +5013,43 @@ flags_complete:  			dcbcfg->pfc.willing = 1;  			dcbcfg->pfc.pfccap = I40E_MAX_TRAFFIC_CLASS;  		} else { -			i40e_aq_start_lldp(&pf->hw, false, NULL); +			status = i40e_aq_start_lldp(&pf->hw, false, NULL); +			if (status) { +				adq_err = pf->hw.aq.asq_last_status; +				switch (adq_err) { +				case I40E_AQ_RC_EEXIST: +					dev_warn(&pf->pdev->dev, +						 "FW LLDP agent is already running\n"); +					is_reset_needed = false; +					break; +				case I40E_AQ_RC_EPERM: +					dev_warn(&pf->pdev->dev, +						 "Device configuration forbids SW from starting the LLDP agent.\n"); +					return -EINVAL; +				default: +					dev_warn(&pf->pdev->dev, +						 "Starting FW LLDP agent failed: error: %s, %s\n", +						 i40e_stat_str(&pf->hw, +							       status), +						 i40e_aq_str(&pf->hw, +							     adq_err)); +					return -EINVAL; +				} +			}  		}  	} +	/* Now that we've checked to ensure that the new flags are valid, load +	 * them into place. Since we only modify flags either (a) during +	 * initialization or (b) while holding the RTNL lock, we don't need +	 * anything fancy here. +	 */ +	pf->flags = new_flags; +  	/* Issue reset to cause things to take effect, as additional bits  	 * are added we will need to create a mask of bits requiring reset  	 */ -	if (changed_flags & (I40E_FLAG_VEB_STATS_ENABLED | -			     I40E_FLAG_LEGACY_RX | -			     I40E_FLAG_SOURCE_PRUNING_DISABLED | -			     I40E_FLAG_DISABLE_FW_LLDP)) +	if (is_reset_needed)  		i40e_do_reset(pf, BIT(__I40E_PF_RESET_REQUESTED), true);  	return 0; @@ -5181,6 +5207,16 @@ static int i40e_get_module_eeprom(struct net_device *netdev,  	return 0;  } +static int i40e_get_eee(struct net_device *netdev, struct ethtool_eee *edata) +{ +	return -EOPNOTSUPP; +} + +static int i40e_set_eee(struct net_device *netdev, struct ethtool_eee *edata) +{ +	return -EOPNOTSUPP; +} +  static const struct ethtool_ops i40e_ethtool_recovery_mode_ops = {  	.set_eeprom		= i40e_set_eeprom,  	.get_eeprom_len		= i40e_get_eeprom_len, @@ -5208,6 +5244,8 @@ static const struct ethtool_ops i40e_ethtool_ops = {  	.set_rxnfc		= i40e_set_rxnfc,  	.self_test		= i40e_diag_test,  	.get_strings		= i40e_get_strings, +	.get_eee		= i40e_get_eee, +	.set_eee		= i40e_set_eee,  	.set_phys_id		= i40e_set_phys_id,  	.get_sset_count		= i40e_get_sset_count,  	.get_ethtool_stats	= i40e_get_ethtool_stats, diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 320562b39686..7c43ec533385 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -636,9 +636,6 @@ void i40e_update_eth_stats(struct i40e_vsi *vsi)  	i40e_stat_update32(hw, I40E_GLV_RUPP(stat_idx),  			   vsi->stat_offsets_loaded,  			   &oes->rx_unknown_protocol, &es->rx_unknown_protocol); -	i40e_stat_update32(hw, I40E_GLV_TEPC(stat_idx), -			   vsi->stat_offsets_loaded, -			   &oes->tx_errors, &es->tx_errors);  	i40e_stat_update48(hw, I40E_GLV_GORCH(stat_idx),  			   I40E_GLV_GORCL(stat_idx), @@ -8570,7 +8567,7 @@ static void i40e_link_event(struct i40e_pf *pf)  	/* Notify the base of the switch tree connected to  	 * the link.  Floating VEBs are not notified.  	 */ -	if (pf->lan_veb != I40E_NO_VEB && pf->veb[pf->lan_veb]) +	if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb])  		i40e_veb_link_event(pf->veb[pf->lan_veb], new_link);  	else  		i40e_vsi_link_event(vsi, new_link); @@ -12519,7 +12516,7 @@ int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi)  	struct i40e_pf *pf = vsi->back;  	/* Uplink is not a bridge so default to VEB */ -	if (vsi->veb_idx == I40E_NO_VEB) +	if (vsi->veb_idx >= I40E_MAX_VEB)  		return 1;  	veb = pf->veb[vsi->veb_idx]; @@ -13577,7 +13574,7 @@ static void i40e_setup_pf_switch_element(struct i40e_pf *pf,  		/* Main VEB? */  		if (uplink_seid != pf->mac_seid)  			break; -		if (pf->lan_veb == I40E_NO_VEB) { +		if (pf->lan_veb >= I40E_MAX_VEB) {  			int v;  			/* find existing or else empty VEB */ @@ -13587,13 +13584,15 @@ static void i40e_setup_pf_switch_element(struct i40e_pf *pf,  					break;  				}  			} -			if (pf->lan_veb == I40E_NO_VEB) { +			if (pf->lan_veb >= I40E_MAX_VEB) {  				v = i40e_veb_mem_alloc(pf);  				if (v < 0)  					break;  				pf->lan_veb = v;  			}  		} +		if (pf->lan_veb >= I40E_MAX_VEB) +			break;  		pf->veb[pf->lan_veb]->seid = seid;  		pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid; @@ -13747,7 +13746,7 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit)  		/* Set up the PF VSI associated with the PF's main VSI  		 * that is already in the HW switch  		 */ -		if (pf->lan_veb != I40E_NO_VEB && pf->veb[pf->lan_veb]) +		if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb])  			uplink_seid = pf->veb[pf->lan_veb]->seid;  		else  			uplink_seid = pf->mac_seid; @@ -14203,7 +14202,17 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	pf->ioremap_len = min_t(int, pci_resource_len(pdev, 0),  				I40E_MAX_CSR_SPACE); - +	/* We believe that the highest register to read is +	 * I40E_GLGEN_STAT_CLEAR, so we check if the BAR size +	 * is not less than that before mapping to prevent a +	 * kernel panic. +	 */ +	if (pf->ioremap_len < I40E_GLGEN_STAT_CLEAR) { +		dev_err(&pdev->dev, "Cannot map registers, bar size 0x%X too small, aborting\n", +			pf->ioremap_len); +		err = -ENOMEM; +		goto err_ioremap; +	}  	hw->hw_addr = ioremap(pci_resource_start(pdev, 0), pf->ioremap_len);  	if (!hw->hw_addr) {  		err = -EIO; diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index 20a283702c9f..2a2fe3ec7926 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c @@ -774,7 +774,7 @@ void i40e_detect_recover_hung(struct i40e_vsi *vsi)  static bool i40e_clean_tx_irq(struct i40e_vsi *vsi,  			      struct i40e_ring *tx_ring, int napi_budget)  { -	u16 i = tx_ring->next_to_clean; +	int i = tx_ring->next_to_clean;  	struct i40e_tx_buffer *tx_buf;  	struct i40e_tx_desc *tx_head;  	struct i40e_tx_desc *tx_desc; diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 479bc60c8f71..ac3a130ee7d4 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -470,14 +470,15 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,  		qv_info = &qvlist_info->qv_info[i];  		if (!qv_info)  			continue; -		v_idx = qv_info->v_idx;  		/* Validate vector id belongs to this vf */ -		if (!i40e_vc_isvalid_vector_id(vf, v_idx)) { +		if (!i40e_vc_isvalid_vector_id(vf, qv_info->v_idx)) {  			ret = -EINVAL;  			goto err_free;  		} +		v_idx = qv_info->v_idx; +  		vf->qvlist_info->qv_info[i] = *qv_info;  		reg_idx = ((msix_vf - 1) * vf->vf_id) + (v_idx - 1); @@ -2135,8 +2136,13 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg)  			}  		} -		if (vf->adq_enabled) +		if (vf->adq_enabled) { +			if (idx >= ARRAY_SIZE(vf->ch)) { +				aq_ret = I40E_ERR_NO_AVAILABLE_VSI; +				goto error_param; +			}  			vsi_id = vf->ch[idx].vsi_id; +		}  		if (i40e_config_vsi_rx_queue(vf, vsi_id, vsi_queue_id,  					     &qpi->rxq) || @@ -2152,6 +2158,10 @@ static int i40e_vc_config_queues_msg(struct i40e_vf *vf, u8 *msg)  		 * to its appropriate VSIs based on TC mapping  		 **/  		if (vf->adq_enabled) { +			if (idx >= ARRAY_SIZE(vf->ch)) { +				aq_ret = I40E_ERR_NO_AVAILABLE_VSI; +				goto error_param; +			}  			if (j == (vf->ch[idx].num_qps - 1)) {  				idx++;  				j = 0; /* resetting the queue count */ @@ -2318,7 +2328,6 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg)  	struct virtchnl_queue_select *vqs =  	    (struct virtchnl_queue_select *)msg;  	struct i40e_pf *pf = vf->pf; -	u16 vsi_id = vqs->vsi_id;  	i40e_status aq_ret = 0;  	int i; @@ -2327,7 +2336,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg)  		goto error_param;  	} -	if (!i40e_vc_isvalid_vsi_id(vf, vsi_id)) { +	if (!i40e_vc_isvalid_vsi_id(vf, vqs->vsi_id)) {  		aq_ret = I40E_ERR_PARAM;  		goto error_param;  	} @@ -2427,18 +2436,14 @@ static int i40e_vc_request_queues_msg(struct i40e_vf *vf, u8 *msg)  {  	struct virtchnl_vf_res_request *vfres =  		(struct virtchnl_vf_res_request *)msg; -	int req_pairs = vfres->num_queue_pairs; -	int cur_pairs = vf->num_queue_pairs; +	u16 req_pairs = vfres->num_queue_pairs; +	u8 cur_pairs = vf->num_queue_pairs;  	struct i40e_pf *pf = vf->pf;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states))  		return -EINVAL; -	if (req_pairs <= 0) { -		dev_err(&pf->pdev->dev, -			"VF %d tried to request %d queues.  Ignoring.\n", -			vf->vf_id, req_pairs); -	} else if (req_pairs > I40E_MAX_VF_QUEUES) { +	if (req_pairs > I40E_MAX_VF_QUEUES) {  		dev_err(&pf->pdev->dev,  			"VF %d tried to request more than %d queues.\n",  			vf->vf_id, @@ -2509,7 +2514,7 @@ error_param:   * MAC filters: 16 for multicast, 1 for MAC, 1 for broadcast   */  #define I40E_VC_MAX_MAC_ADDR_PER_VF (16 + 1 + 1) -#define I40E_VC_MAX_VLAN_PER_VF 8 +#define I40E_VC_MAX_VLAN_PER_VF 16  /**   * i40e_check_vf_permission @@ -2587,12 +2592,11 @@ static int i40e_vc_add_mac_addr_msg(struct i40e_vf *vf, u8 *msg)  	    (struct virtchnl_ether_addr_list *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_vsi *vsi = NULL; -	u16 vsi_id = al->vsi_id;  	i40e_status ret = 0;  	int i;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) || -	    !i40e_vc_isvalid_vsi_id(vf, vsi_id)) { +	    !i40e_vc_isvalid_vsi_id(vf, al->vsi_id)) {  		ret = I40E_ERR_PARAM;  		goto error_param;  	} @@ -2657,12 +2661,11 @@ static int i40e_vc_del_mac_addr_msg(struct i40e_vf *vf, u8 *msg)  	    (struct virtchnl_ether_addr_list *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_vsi *vsi = NULL; -	u16 vsi_id = al->vsi_id;  	i40e_status ret = 0;  	int i;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) || -	    !i40e_vc_isvalid_vsi_id(vf, vsi_id)) { +	    !i40e_vc_isvalid_vsi_id(vf, al->vsi_id)) {  		ret = I40E_ERR_PARAM;  		goto error_param;  	} @@ -2726,7 +2729,6 @@ static int i40e_vc_add_vlan_msg(struct i40e_vf *vf, u8 *msg)  	    (struct virtchnl_vlan_filter_list *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_vsi *vsi = NULL; -	u16 vsi_id = vfl->vsi_id;  	i40e_status aq_ret = 0;  	int i; @@ -2737,7 +2739,7 @@ static int i40e_vc_add_vlan_msg(struct i40e_vf *vf, u8 *msg)  		goto error_param;  	}  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) || -	    !i40e_vc_isvalid_vsi_id(vf, vsi_id)) { +	    !i40e_vc_isvalid_vsi_id(vf, vfl->vsi_id)) {  		aq_ret = I40E_ERR_PARAM;  		goto error_param;  	} @@ -2798,12 +2800,11 @@ static int i40e_vc_remove_vlan_msg(struct i40e_vf *vf, u8 *msg)  	    (struct virtchnl_vlan_filter_list *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_vsi *vsi = NULL; -	u16 vsi_id = vfl->vsi_id;  	i40e_status aq_ret = 0;  	int i;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) || -	    !i40e_vc_isvalid_vsi_id(vf, vsi_id)) { +	    !i40e_vc_isvalid_vsi_id(vf, vfl->vsi_id)) {  		aq_ret = I40E_ERR_PARAM;  		goto error_param;  	} @@ -2920,11 +2921,10 @@ static int i40e_vc_config_rss_key(struct i40e_vf *vf, u8 *msg)  		(struct virtchnl_rss_key *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_vsi *vsi = NULL; -	u16 vsi_id = vrk->vsi_id;  	i40e_status aq_ret = 0;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) || -	    !i40e_vc_isvalid_vsi_id(vf, vsi_id) || +	    !i40e_vc_isvalid_vsi_id(vf, vrk->vsi_id) ||  	    (vrk->key_len != I40E_HKEY_ARRAY_SIZE)) {  		aq_ret = I40E_ERR_PARAM;  		goto err; @@ -2951,16 +2951,22 @@ static int i40e_vc_config_rss_lut(struct i40e_vf *vf, u8 *msg)  		(struct virtchnl_rss_lut *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_vsi *vsi = NULL; -	u16 vsi_id = vrl->vsi_id;  	i40e_status aq_ret = 0; +	u16 i;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) || -	    !i40e_vc_isvalid_vsi_id(vf, vsi_id) || +	    !i40e_vc_isvalid_vsi_id(vf, vrl->vsi_id) ||  	    (vrl->lut_entries != I40E_VF_HLUT_ARRAY_SIZE)) {  		aq_ret = I40E_ERR_PARAM;  		goto err;  	} +	for (i = 0; i < vrl->lut_entries; i++) +		if (vrl->lut[i] >= vf->num_queue_pairs) { +			aq_ret = I40E_ERR_PARAM; +			goto err; +		} +  	vsi = pf->vsi[vf->lan_vsi_idx];  	aq_ret = i40e_config_rss(vsi, NULL, vrl->lut, I40E_VF_HLUT_ARRAY_SIZE);  	/* send the response to the VF */ @@ -3041,14 +3047,15 @@ err:   **/  static int i40e_vc_enable_vlan_stripping(struct i40e_vf *vf, u8 *msg)  { -	struct i40e_vsi *vsi = vf->pf->vsi[vf->lan_vsi_idx];  	i40e_status aq_ret = 0; +	struct i40e_vsi *vsi;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {  		aq_ret = I40E_ERR_PARAM;  		goto err;  	} +	vsi = vf->pf->vsi[vf->lan_vsi_idx];  	i40e_vlan_stripping_enable(vsi);  	/* send the response to the VF */ @@ -3066,14 +3073,15 @@ err:   **/  static int i40e_vc_disable_vlan_stripping(struct i40e_vf *vf, u8 *msg)  { -	struct i40e_vsi *vsi = vf->pf->vsi[vf->lan_vsi_idx];  	i40e_status aq_ret = 0; +	struct i40e_vsi *vsi;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {  		aq_ret = I40E_ERR_PARAM;  		goto err;  	} +	vsi = vf->pf->vsi[vf->lan_vsi_idx];  	i40e_vlan_stripping_disable(vsi);  	/* send the response to the VF */ @@ -3531,8 +3539,9 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)  		(struct virtchnl_tc_info *)msg;  	struct i40e_pf *pf = vf->pf;  	struct i40e_link_status *ls = &pf->hw.phy.link_info; -	int i, adq_request_qps = 0, speed = 0; +	int i, adq_request_qps = 0;  	i40e_status aq_ret = 0; +	u64 speed = 0;  	if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {  		aq_ret = I40E_ERR_PARAM; @@ -3558,8 +3567,8 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)  	/* max number of traffic classes for VF currently capped at 4 */  	if (!tci->num_tc || tci->num_tc > I40E_MAX_VF_VSI) {  		dev_err(&pf->pdev->dev, -			"VF %d trying to set %u TCs, valid range 1-4 TCs per VF\n", -			vf->vf_id, tci->num_tc); +			"VF %d trying to set %u TCs, valid range 1-%u TCs per VF\n", +			vf->vf_id, tci->num_tc, I40E_MAX_VF_VSI);  		aq_ret = I40E_ERR_PARAM;  		goto err;  	} @@ -3569,8 +3578,9 @@ static int i40e_vc_add_qch_msg(struct i40e_vf *vf, u8 *msg)  		if (!tci->list[i].count ||  		    tci->list[i].count > I40E_DEFAULT_QUEUES_PER_VF) {  			dev_err(&pf->pdev->dev, -				"VF %d: TC %d trying to set %u queues, valid range 1-4 queues per TC\n", -				vf->vf_id, i, tci->list[i].count); +				"VF %d: TC %d trying to set %u queues, valid range 1-%u queues per TC\n", +				vf->vf_id, i, tci->list[i].count, +				I40E_DEFAULT_QUEUES_PER_VF);  			aq_ret = I40E_ERR_PARAM;  			goto err;  		} @@ -3730,19 +3740,6 @@ int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode,  	/* perform basic checks on the msg */  	ret = virtchnl_vc_validate_vf_msg(&vf->vf_ver, v_opcode, msg, msglen); -	/* perform additional checks specific to this driver */ -	if (v_opcode == VIRTCHNL_OP_CONFIG_RSS_KEY) { -		struct virtchnl_rss_key *vrk = (struct virtchnl_rss_key *)msg; - -		if (vrk->key_len != I40E_HKEY_ARRAY_SIZE) -			ret = -EINVAL; -	} else if (v_opcode == VIRTCHNL_OP_CONFIG_RSS_LUT) { -		struct virtchnl_rss_lut *vrl = (struct virtchnl_rss_lut *)msg; - -		if (vrl->lut_entries != I40E_VF_HLUT_ARRAY_SIZE) -			ret = -EINVAL; -	} -  	if (ret) {  		i40e_vc_send_resp_to_vf(vf, v_opcode, I40E_ERR_PARAM);  		dev_err(&pf->pdev->dev, "Invalid message from VF %d, opcode %d, len %d\n", @@ -3943,6 +3940,11 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)  	int bkt;  	u8 i; +	if (test_and_set_bit(__I40E_VIRTCHNL_OP_PENDING, pf->state)) { +		dev_warn(&pf->pdev->dev, "Unable to configure VFs, other operation is pending.\n"); +		return -EAGAIN; +	} +  	/* validate the request */  	ret = i40e_validate_vf(pf, vf_id);  	if (ret) @@ -3967,11 +3969,6 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)  		goto error_param;  	} -	if (test_and_set_bit(__I40E_VIRTCHNL_OP_PENDING, pf->state)) { -		dev_warn(&pf->pdev->dev, "Unable to configure VFs, other operation is pending.\n"); -		return -EAGAIN; -	} -  	if (is_multicast_ether_addr(mac)) {  		dev_err(&pf->pdev->dev,  			"Invalid Ethernet address %pM for VF %d\n", mac, vf_id); @@ -4302,10 +4299,8 @@ int i40e_ndo_get_vf_config(struct net_device *netdev,  	vf = &pf->vf[vf_id];  	/* first vsi is always the LAN vsi */  	vsi = pf->vsi[vf->lan_vsi_idx]; -	if (!test_bit(I40E_VF_STATE_INIT, &vf->vf_states)) { -		dev_err(&pf->pdev->dev, "VF %d still in reset. Try again.\n", -			vf_id); -		ret = -EAGAIN; +	if (!vsi) { +		ret = -ENOENT;  		goto error_param;  	} diff --git a/drivers/net/ethernet/intel/i40e/i40e_xsk.c b/drivers/net/ethernet/intel/i40e/i40e_xsk.c index 1b17486543ac..557c565c26fc 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_xsk.c +++ b/drivers/net/ethernet/intel/i40e/i40e_xsk.c @@ -215,6 +215,7 @@ static int i40e_run_xdp_zc(struct i40e_ring *rx_ring, struct xdp_buff *xdp)  		break;  	default:  		bpf_warn_invalid_xdp_action(act); +		/* fall through */  	case XDP_ABORTED:  		trace_xdp_exception(rx_ring->netdev, xdp_prog, act);  		/* fallthrough -- handle aborts by dropping packet */  | 

