diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_lib.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_lib.c | 613 | 
1 files changed, 322 insertions, 291 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c index 2f256bf45efc..2e3a39cea2c0 100644 --- a/drivers/net/ethernet/intel/ice/ice_lib.c +++ b/drivers/net/ethernet/intel/ice/ice_lib.c @@ -5,6 +5,7 @@  #include "ice_base.h"  #include "ice_flow.h"  #include "ice_lib.h" +#include "ice_fltr.h"  #include "ice_dcb_lib.h"  /** @@ -18,6 +19,8 @@ const char *ice_vsi_type_str(enum ice_vsi_type vsi_type)  		return "ICE_VSI_PF";  	case ICE_VSI_VF:  		return "ICE_VSI_VF"; +	case ICE_VSI_CTRL: +		return "ICE_VSI_CTRL";  	case ICE_VSI_LB:  		return "ICE_VSI_LB";  	default: @@ -37,7 +40,8 @@ const char *ice_vsi_type_str(enum ice_vsi_type vsi_type)   */  static int ice_vsi_ctrl_all_rx_rings(struct ice_vsi *vsi, bool ena)  { -	int i, ret = 0; +	int ret = 0; +	u16 i;  	for (i = 0; i < vsi->num_rxq; i++)  		ice_vsi_ctrl_one_rx_ring(vsi, ena, i, false); @@ -121,6 +125,7 @@ static void ice_vsi_set_num_desc(struct ice_vsi *vsi)  {  	switch (vsi->type) {  	case ICE_VSI_PF: +	case ICE_VSI_CTRL:  	case ICE_VSI_LB:  		vsi->num_rx_desc = ICE_DFLT_NUM_RX_DESC;  		vsi->num_tx_desc = ICE_DFLT_NUM_TX_DESC; @@ -185,6 +190,11 @@ static void ice_vsi_set_num_qs(struct ice_vsi *vsi, u16 vf_id)  		 */  		vsi->num_q_vectors = pf->num_msix_per_vf - ICE_NONQ_VECS_VF;  		break; +	case ICE_VSI_CTRL: +		vsi->alloc_txq = 1; +		vsi->alloc_rxq = 1; +		vsi->num_q_vectors = 1; +		break;  	case ICE_VSI_LB:  		vsi->alloc_txq = 1;  		vsi->alloc_rxq = 1; @@ -248,8 +258,8 @@ void ice_vsi_delete(struct ice_vsi *vsi)  	status = ice_free_vsi(&pf->hw, vsi->idx, ctxt, false, NULL);  	if (status) -		dev_err(ice_pf_to_dev(pf), "Failed to delete VSI %i in FW - error: %d\n", -			vsi->vsi_num, status); +		dev_err(ice_pf_to_dev(pf), "Failed to delete VSI %i in FW - error: %s\n", +			vsi->vsi_num, ice_stat_str(status));  	kfree(ctxt);  } @@ -320,7 +330,7 @@ int ice_vsi_clear(struct ice_vsi *vsi)  	/* updates the PF for this cleared VSI */  	pf->vsi[vsi->idx] = NULL; -	if (vsi->idx < pf->next_vsi) +	if (vsi->idx < pf->next_vsi && vsi->type != ICE_VSI_CTRL)  		pf->next_vsi = vsi->idx;  	ice_vsi_free_arrays(vsi); @@ -331,6 +341,25 @@ int ice_vsi_clear(struct ice_vsi *vsi)  }  /** + * ice_msix_clean_ctrl_vsi - MSIX mode interrupt handler for ctrl VSI + * @irq: interrupt number + * @data: pointer to a q_vector + */ +static irqreturn_t ice_msix_clean_ctrl_vsi(int __always_unused irq, void *data) +{ +	struct ice_q_vector *q_vector = (struct ice_q_vector *)data; + +	if (!q_vector->tx.ring) +		return IRQ_HANDLED; + +#define FDIR_RX_DESC_CLEAN_BUDGET 64 +	ice_clean_rx_irq(q_vector->rx.ring, FDIR_RX_DESC_CLEAN_BUDGET); +	ice_clean_ctrl_tx_irq(q_vector->tx.ring); + +	return IRQ_HANDLED; +} + +/**   * ice_msix_clean_rings - MSIX mode Interrupt Handler   * @irq: interrupt number   * @data: pointer to a q_vector @@ -381,8 +410,6 @@ ice_vsi_alloc(struct ice_pf *pf, enum ice_vsi_type vsi_type, u16 vf_id)  	vsi->back = pf;  	set_bit(__ICE_DOWN, vsi->state); -	vsi->idx = pf->next_vsi; -  	if (vsi_type == ICE_VSI_VF)  		ice_vsi_set_num_qs(vsi, vf_id);  	else @@ -396,6 +423,13 @@ ice_vsi_alloc(struct ice_pf *pf, enum ice_vsi_type vsi_type, u16 vf_id)  		/* Setup default MSIX irq handler for VSI */  		vsi->irq_handler = ice_msix_clean_rings;  		break; +	case ICE_VSI_CTRL: +		if (ice_vsi_alloc_arrays(vsi)) +			goto err_rings; + +		/* Setup ctrl VSI MSIX irq handler */ +		vsi->irq_handler = ice_msix_clean_ctrl_vsi; +		break;  	case ICE_VSI_VF:  		if (ice_vsi_alloc_arrays(vsi))  			goto err_rings; @@ -409,12 +443,20 @@ ice_vsi_alloc(struct ice_pf *pf, enum ice_vsi_type vsi_type, u16 vf_id)  		goto unlock_pf;  	} -	/* fill VSI slot in the PF struct */ -	pf->vsi[pf->next_vsi] = vsi; +	if (vsi->type == ICE_VSI_CTRL) { +		/* Use the last VSI slot as the index for the control VSI */ +		vsi->idx = pf->num_alloc_vsi - 1; +		pf->ctrl_vsi_idx = vsi->idx; +		pf->vsi[vsi->idx] = vsi; +	} else { +		/* fill slot and make note of the index */ +		vsi->idx = pf->next_vsi; +		pf->vsi[pf->next_vsi] = vsi; -	/* prepare pf->next_vsi for next use */ -	pf->next_vsi = ice_get_free_slot(pf->vsi, pf->num_alloc_vsi, -					 pf->next_vsi); +		/* prepare pf->next_vsi for next use */ +		pf->next_vsi = ice_get_free_slot(pf->vsi, pf->num_alloc_vsi, +						 pf->next_vsi); +	}  	goto unlock_pf;  err_rings: @@ -426,6 +468,48 @@ unlock_pf:  }  /** + * ice_alloc_fd_res - Allocate FD resource for a VSI + * @vsi: pointer to the ice_vsi + * + * This allocates the FD resources + * + * Returns 0 on success, -EPERM on no-op or -EIO on failure + */ +static int ice_alloc_fd_res(struct ice_vsi *vsi) +{ +	struct ice_pf *pf = vsi->back; +	u32 g_val, b_val; + +	/* Flow Director filters are only allocated/assigned to the PF VSI which +	 * passes the traffic. The CTRL VSI is only used to add/delete filters +	 * so we don't allocate resources to it +	 */ + +	/* FD filters from guaranteed pool per VSI */ +	g_val = pf->hw.func_caps.fd_fltr_guar; +	if (!g_val) +		return -EPERM; + +	/* FD filters from best effort pool */ +	b_val = pf->hw.func_caps.fd_fltr_best_effort; +	if (!b_val) +		return -EPERM; + +	if (vsi->type != ICE_VSI_PF) +		return -EPERM; + +	if (!test_bit(ICE_FLAG_FD_ENA, pf->flags)) +		return -EPERM; + +	vsi->num_gfltr = g_val / pf->num_alloc_vsi; + +	/* each VSI gets same "best_effort" quota */ +	vsi->num_bfltr = b_val; + +	return 0; +} + +/**   * ice_vsi_get_qs - Assign queues from PF to VSI   * @vsi: the VSI to assign queues to   * @@ -521,8 +605,8 @@ static void ice_vsi_clean_rss_flow_fld(struct ice_vsi *vsi)  	status = ice_rem_vsi_rss_cfg(&pf->hw, vsi->idx);  	if (status) -		dev_dbg(ice_pf_to_dev(pf), "ice_rem_vsi_rss_cfg failed for vsi = %d, error = %d\n", -			vsi->vsi_num, status); +		dev_dbg(ice_pf_to_dev(pf), "ice_rem_vsi_rss_cfg failed for vsi = %d, error = %s\n", +			vsi->vsi_num, ice_stat_str(status));  }  /** @@ -565,8 +649,8 @@ static void ice_vsi_set_rss_params(struct ice_vsi *vsi)  	switch (vsi->type) {  	case ICE_VSI_PF:  		/* PF VSI will inherit RSS instance of PF */ -		vsi->rss_table_size = cap->rss_table_size; -		vsi->rss_size = min_t(int, num_online_cpus(), +		vsi->rss_table_size = (u16)cap->rss_table_size; +		vsi->rss_size = min_t(u16, num_online_cpus(),  				      BIT(cap->rss_table_entry_width));  		vsi->rss_lut_type = ICE_AQC_GSET_RSS_LUT_TABLE_TYPE_PF;  		break; @@ -581,8 +665,8 @@ static void ice_vsi_set_rss_params(struct ice_vsi *vsi)  	case ICE_VSI_LB:  		break;  	default: -		dev_warn(ice_pf_to_dev(pf), "Unknown VSI type %d\n", -			 vsi->type); +		dev_dbg(ice_pf_to_dev(pf), "Unsupported VSI type %s\n", +			ice_vsi_type_str(vsi->type));  		break;  	}  } @@ -684,15 +768,15 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)  				max_rss = ICE_MAX_LG_RSS_QS;  			else  				max_rss = ICE_MAX_RSS_QS_PER_VF; -			qcount_rx = min_t(int, rx_numq_tc, max_rss); +			qcount_rx = min_t(u16, rx_numq_tc, max_rss);  			if (!vsi->req_rxq) -				qcount_rx = min_t(int, qcount_rx, +				qcount_rx = min_t(u16, qcount_rx,  						  vsi->rss_size);  		}  	}  	/* find the (rounded up) power-of-2 of qcount */ -	pow = order_base_2(qcount_rx); +	pow = (u16)order_base_2(qcount_rx);  	ice_for_each_traffic_class(i) {  		if (!(vsi->tc_cfg.ena_tc & BIT(i))) { @@ -752,6 +836,51 @@ static void ice_vsi_setup_q_map(struct ice_vsi *vsi, struct ice_vsi_ctx *ctxt)  }  /** + * ice_set_fd_vsi_ctx - Set FD VSI context before adding a VSI + * @ctxt: the VSI context being set + * @vsi: the VSI being configured + */ +static void ice_set_fd_vsi_ctx(struct ice_vsi_ctx *ctxt, struct ice_vsi *vsi) +{ +	u8 dflt_q_group, dflt_q_prio; +	u16 dflt_q, report_q, val; + +	if (vsi->type != ICE_VSI_PF && vsi->type != ICE_VSI_CTRL) +		return; + +	val = ICE_AQ_VSI_PROP_FLOW_DIR_VALID; +	ctxt->info.valid_sections |= cpu_to_le16(val); +	dflt_q = 0; +	dflt_q_group = 0; +	report_q = 0; +	dflt_q_prio = 0; + +	/* enable flow director filtering/programming */ +	val = ICE_AQ_VSI_FD_ENABLE | ICE_AQ_VSI_FD_PROG_ENABLE; +	ctxt->info.fd_options = cpu_to_le16(val); +	/* max of allocated flow director filters */ +	ctxt->info.max_fd_fltr_dedicated = +			cpu_to_le16(vsi->num_gfltr); +	/* max of shared flow director filters any VSI may program */ +	ctxt->info.max_fd_fltr_shared = +			cpu_to_le16(vsi->num_bfltr); +	/* default queue index within the VSI of the default FD */ +	val = ((dflt_q << ICE_AQ_VSI_FD_DEF_Q_S) & +	       ICE_AQ_VSI_FD_DEF_Q_M); +	/* target queue or queue group to the FD filter */ +	val |= ((dflt_q_group << ICE_AQ_VSI_FD_DEF_GRP_S) & +		ICE_AQ_VSI_FD_DEF_GRP_M); +	ctxt->info.fd_def_q = cpu_to_le16(val); +	/* queue index on which FD filter completion is reported */ +	val = ((report_q << ICE_AQ_VSI_FD_REPORT_Q_S) & +	       ICE_AQ_VSI_FD_REPORT_Q_M); +	/* priority of the default qindex action */ +	val |= ((dflt_q_prio << ICE_AQ_VSI_FD_DEF_PRIORITY_S) & +		ICE_AQ_VSI_FD_DEF_PRIORITY_M); +	ctxt->info.fd_report_opt = cpu_to_le16(val); +} + +/**   * ice_set_rss_vsi_ctx - Set RSS VSI context before adding a VSI   * @ctxt: the VSI context being set   * @vsi: the VSI being configured @@ -776,13 +905,10 @@ static void ice_set_rss_vsi_ctx(struct ice_vsi_ctx *ctxt, struct ice_vsi *vsi)  		lut_type = ICE_AQ_VSI_Q_OPT_RSS_LUT_VSI;  		hash_type = ICE_AQ_VSI_Q_OPT_RSS_TPLZ;  		break; -	case ICE_VSI_LB: +	default:  		dev_dbg(dev, "Unsupported VSI type %s\n",  			ice_vsi_type_str(vsi->type));  		return; -	default: -		dev_warn(dev, "Unknown VSI type %d\n", vsi->type); -		return;  	}  	ctxt->info.q_opt_rss = ((lut_type << ICE_AQ_VSI_Q_OPT_RSS_LUT_S) & @@ -812,8 +938,8 @@ static int ice_vsi_init(struct ice_vsi *vsi, bool init_vsi)  	if (!ctxt)  		return -ENOMEM; -	ctxt->info = vsi->info;  	switch (vsi->type) { +	case ICE_VSI_CTRL:  	case ICE_VSI_LB:  	case ICE_VSI_PF:  		ctxt->flags = ICE_AQ_VSI_TYPE_PF; @@ -829,12 +955,15 @@ static int ice_vsi_init(struct ice_vsi *vsi, bool init_vsi)  	}  	ice_set_dflt_vsi_ctx(ctxt); +	if (test_bit(ICE_FLAG_FD_ENA, pf->flags)) +		ice_set_fd_vsi_ctx(ctxt, vsi);  	/* if the switch is in VEB mode, allow VSI loopback */  	if (vsi->vsw->bridge_mode == BRIDGE_MODE_VEB)  		ctxt->info.sw_flags |= ICE_AQ_VSI_SW_FLAG_ALLOW_LB;  	/* Set LUT type and HASH type if RSS is enabled */ -	if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) { +	if (test_bit(ICE_FLAG_RSS_ENA, pf->flags) && +	    vsi->type != ICE_VSI_CTRL) {  		ice_set_rss_vsi_ctx(ctxt, vsi);  		/* if updating VSI context, make sure to set valid_section:  		 * to indicate which section of VSI context being updated @@ -941,7 +1070,7 @@ int ice_free_res(struct ice_res_tracker *res, u16 index, u16 id)   */  static int ice_search_res(struct ice_res_tracker *res, u16 needed, u16 id)  { -	int start = 0, end = 0; +	u16 start = 0, end = 0;  	if (needed > res->end)  		return -ENOMEM; @@ -1024,6 +1153,7 @@ static int ice_vsi_setup_vector_base(struct ice_vsi *vsi)  	struct ice_pf *pf = vsi->back;  	struct device *dev;  	u16 num_q_vectors; +	int base;  	dev = ice_pf_to_dev(pf);  	/* SRIOV doesn't grab irq_tracker entries for each VSI */ @@ -1038,14 +1168,15 @@ static int ice_vsi_setup_vector_base(struct ice_vsi *vsi)  	num_q_vectors = vsi->num_q_vectors;  	/* reserve slots from OS requested IRQs */ -	vsi->base_vector = ice_get_res(pf, pf->irq_tracker, num_q_vectors, -				       vsi->idx); -	if (vsi->base_vector < 0) { +	base = ice_get_res(pf, pf->irq_tracker, num_q_vectors, vsi->idx); + +	if (base < 0) {  		dev_err(dev, "%d MSI-X interrupts available. %s %d failed to get %d MSI-X vectors\n",  			ice_get_free_res_count(pf->irq_tracker),  			ice_vsi_type_str(vsi->type), vsi->idx, num_q_vectors);  		return -ENOENT;  	} +	vsi->base_vector = (u16)base;  	pf->num_avail_sw_msix -= num_q_vectors;  	return 0; @@ -1063,7 +1194,7 @@ static void ice_vsi_clear_rings(struct ice_vsi *vsi)  		for (i = 0; i < vsi->alloc_txq; i++) {  			if (vsi->tx_rings[i]) {  				kfree_rcu(vsi->tx_rings[i], rcu); -				vsi->tx_rings[i] = NULL; +				WRITE_ONCE(vsi->tx_rings[i], NULL);  			}  		}  	} @@ -1071,7 +1202,7 @@ static void ice_vsi_clear_rings(struct ice_vsi *vsi)  		for (i = 0; i < vsi->alloc_rxq; i++) {  			if (vsi->rx_rings[i]) {  				kfree_rcu(vsi->rx_rings[i], rcu); -				vsi->rx_rings[i] = NULL; +				WRITE_ONCE(vsi->rx_rings[i], NULL);  			}  		}  	} @@ -1085,7 +1216,7 @@ static int ice_vsi_alloc_rings(struct ice_vsi *vsi)  {  	struct ice_pf *pf = vsi->back;  	struct device *dev; -	int i; +	u16 i;  	dev = ice_pf_to_dev(pf);  	/* Allocate Tx rings */ @@ -1104,7 +1235,7 @@ static int ice_vsi_alloc_rings(struct ice_vsi *vsi)  		ring->vsi = vsi;  		ring->dev = dev;  		ring->count = vsi->num_tx_desc; -		vsi->tx_rings[i] = ring; +		WRITE_ONCE(vsi->tx_rings[i], ring);  	}  	/* Allocate Rx rings */ @@ -1123,7 +1254,7 @@ static int ice_vsi_alloc_rings(struct ice_vsi *vsi)  		ring->netdev = vsi->netdev;  		ring->dev = dev;  		ring->count = vsi->num_rx_desc; -		vsi->rx_rings[i] = ring; +		WRITE_ONCE(vsi->rx_rings[i], ring);  	}  	return 0; @@ -1178,7 +1309,7 @@ static int ice_vsi_cfg_rss_lut_key(struct ice_vsi *vsi)  	u8 *lut;  	dev = ice_pf_to_dev(pf); -	vsi->rss_size = min_t(int, vsi->rss_size, vsi->num_rxq); +	vsi->rss_size = min_t(u16, vsi->rss_size, vsi->num_rxq);  	lut = kzalloc(vsi->rss_table_size, GFP_KERNEL);  	if (!lut) @@ -1193,7 +1324,8 @@ static int ice_vsi_cfg_rss_lut_key(struct ice_vsi *vsi)  				    vsi->rss_table_size);  	if (status) { -		dev_err(dev, "set_rss_lut failed, error %d\n", status); +		dev_err(dev, "set_rss_lut failed, error %s\n", +			ice_stat_str(status));  		err = -EIO;  		goto ice_vsi_cfg_rss_exit;  	} @@ -1215,7 +1347,8 @@ static int ice_vsi_cfg_rss_lut_key(struct ice_vsi *vsi)  	status = ice_aq_set_rss_key(&pf->hw, vsi->idx, key);  	if (status) { -		dev_err(dev, "set_rss_key failed, error %d\n", status); +		dev_err(dev, "set_rss_key failed, error %s\n", +			ice_stat_str(status));  		err = -EIO;  	} @@ -1248,8 +1381,8 @@ static void ice_vsi_set_vf_rss_flow_fld(struct ice_vsi *vsi)  	status = ice_add_avf_rss_cfg(&pf->hw, vsi->idx, ICE_DEFAULT_RSS_HENA);  	if (status) -		dev_dbg(dev, "ice_add_avf_rss_cfg failed for vsi = %d, error = %d\n", -			vsi->vsi_num, status); +		dev_dbg(dev, "ice_add_avf_rss_cfg failed for vsi = %d, error = %s\n", +			vsi->vsi_num, ice_stat_str(status));  }  /** @@ -1281,91 +1414,57 @@ static void ice_vsi_set_rss_flow_fld(struct ice_vsi *vsi)  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_FLOW_HASH_IPV4,  				 ICE_FLOW_SEG_HDR_IPV4);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for ipv4 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for ipv4 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for IPv6 with input set IPv6 src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_FLOW_HASH_IPV6,  				 ICE_FLOW_SEG_HDR_IPV6);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for ipv6 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for ipv6 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for tcp4 with input set IP src/dst, TCP src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_HASH_TCP_IPV4,  				 ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV4);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for tcp4 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for tcp4 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for udp4 with input set IP src/dst, UDP src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_HASH_UDP_IPV4,  				 ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV4);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for udp4 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for udp4 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for sctp4 with input set IP src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_FLOW_HASH_IPV4,  				 ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for sctp4 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for sctp4 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for tcp6 with input set IPv6 src/dst, TCP src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_HASH_TCP_IPV6,  				 ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV6);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for tcp6 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for tcp6 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for udp6 with input set IPv6 src/dst, UDP src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_HASH_UDP_IPV6,  				 ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV6);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for udp6 flow, vsi = %d, error = %d\n", -			vsi_num, status); +		dev_dbg(dev, "ice_add_rss_cfg failed for udp6 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  	/* configure RSS for sctp6 with input set IPv6 src/dst */  	status = ice_add_rss_cfg(hw, vsi_handle, ICE_FLOW_HASH_IPV6,  				 ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV6);  	if (status) -		dev_dbg(dev, "ice_add_rss_cfg failed for sctp6 flow, vsi = %d, error = %d\n", -			vsi_num, status); -} - -/** - * ice_add_mac_to_list - Add a MAC address filter entry to the list - * @vsi: the VSI to be forwarded to - * @add_list: pointer to the list which contains MAC filter entries - * @macaddr: the MAC address to be added. - * - * Adds MAC address filter entry to the temp list - * - * Returns 0 on success or ENOMEM on failure. - */ -int -ice_add_mac_to_list(struct ice_vsi *vsi, struct list_head *add_list, -		    const u8 *macaddr) -{ -	struct ice_fltr_list_entry *tmp; -	struct ice_pf *pf = vsi->back; - -	tmp = devm_kzalloc(ice_pf_to_dev(pf), sizeof(*tmp), GFP_ATOMIC); -	if (!tmp) -		return -ENOMEM; - -	tmp->fltr_info.flag = ICE_FLTR_TX; -	tmp->fltr_info.src_id = ICE_SRC_ID_VSI; -	tmp->fltr_info.lkup_type = ICE_SW_LKUP_MAC; -	tmp->fltr_info.fltr_act = ICE_FWD_TO_VSI; -	tmp->fltr_info.vsi_handle = vsi->idx; -	ether_addr_copy(tmp->fltr_info.l_data.mac.mac_addr, macaddr); - -	INIT_LIST_HEAD(&tmp->list_entry); -	list_add(&tmp->list_entry, add_list); - -	return 0; +		dev_dbg(dev, "ice_add_rss_cfg failed for sctp6 flow, vsi = %d, error = %s\n", +			vsi_num, ice_stat_str(status));  }  /** @@ -1415,54 +1514,21 @@ void ice_update_eth_stats(struct ice_vsi *vsi)  }  /** - * ice_free_fltr_list - free filter lists helper - * @dev: pointer to the device struct - * @h: pointer to the list head to be freed - * - * Helper function to free filter lists previously created using - * ice_add_mac_to_list - */ -void ice_free_fltr_list(struct device *dev, struct list_head *h) -{ -	struct ice_fltr_list_entry *e, *tmp; - -	list_for_each_entry_safe(e, tmp, h, list_entry) { -		list_del(&e->list_entry); -		devm_kfree(dev, e); -	} -} - -/**   * ice_vsi_add_vlan - Add VSI membership for given VLAN   * @vsi: the VSI being configured   * @vid: VLAN ID to be added + * @action: filter action to be performed on match   */ -int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid) +int +ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid, enum ice_sw_fwd_act_type action)  { -	struct ice_fltr_list_entry *tmp;  	struct ice_pf *pf = vsi->back; -	LIST_HEAD(tmp_add_list); -	enum ice_status status;  	struct device *dev;  	int err = 0;  	dev = ice_pf_to_dev(pf); -	tmp = devm_kzalloc(dev, sizeof(*tmp), GFP_KERNEL); -	if (!tmp) -		return -ENOMEM; -	tmp->fltr_info.lkup_type = ICE_SW_LKUP_VLAN; -	tmp->fltr_info.fltr_act = ICE_FWD_TO_VSI; -	tmp->fltr_info.flag = ICE_FLTR_TX; -	tmp->fltr_info.src_id = ICE_SRC_ID_VSI; -	tmp->fltr_info.vsi_handle = vsi->idx; -	tmp->fltr_info.l_data.vlan.vlan_id = vid; - -	INIT_LIST_HEAD(&tmp->list_entry); -	list_add(&tmp->list_entry, &tmp_add_list); - -	status = ice_add_vlan(&pf->hw, &tmp_add_list); -	if (!status) { +	if (!ice_fltr_add_vlan(vsi, vid, action)) {  		vsi->num_vlan++;  	} else {  		err = -ENODEV; @@ -1470,7 +1536,6 @@ int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid)  			vsi->vsi_num);  	} -	ice_free_fltr_list(dev, &tmp_add_list);  	return err;  } @@ -1483,41 +1548,25 @@ int ice_vsi_add_vlan(struct ice_vsi *vsi, u16 vid)   */  int ice_vsi_kill_vlan(struct ice_vsi *vsi, u16 vid)  { -	struct ice_fltr_list_entry *list;  	struct ice_pf *pf = vsi->back; -	LIST_HEAD(tmp_add_list);  	enum ice_status status;  	struct device *dev;  	int err = 0;  	dev = ice_pf_to_dev(pf); -	list = devm_kzalloc(dev, sizeof(*list), GFP_KERNEL); -	if (!list) -		return -ENOMEM; - -	list->fltr_info.lkup_type = ICE_SW_LKUP_VLAN; -	list->fltr_info.vsi_handle = vsi->idx; -	list->fltr_info.fltr_act = ICE_FWD_TO_VSI; -	list->fltr_info.l_data.vlan.vlan_id = vid; -	list->fltr_info.flag = ICE_FLTR_TX; -	list->fltr_info.src_id = ICE_SRC_ID_VSI; -	INIT_LIST_HEAD(&list->list_entry); -	list_add(&list->list_entry, &tmp_add_list); - -	status = ice_remove_vlan(&pf->hw, &tmp_add_list); +	status = ice_fltr_remove_vlan(vsi, vid, ICE_FWD_TO_VSI);  	if (!status) {  		vsi->num_vlan--;  	} else if (status == ICE_ERR_DOES_NOT_EXIST) { -		dev_dbg(dev, "Failed to remove VLAN %d on VSI %i, it does not exist, status: %d\n", -			vid, vsi->vsi_num, status); +		dev_dbg(dev, "Failed to remove VLAN %d on VSI %i, it does not exist, status: %s\n", +			vid, vsi->vsi_num, ice_stat_str(status));  	} else { -		dev_err(dev, "Error removing VLAN %d on vsi %i error: %d\n", -			vid, vsi->vsi_num, status); +		dev_err(dev, "Error removing VLAN %d on vsi %i error: %s\n", +			vid, vsi->vsi_num, ice_stat_str(status));  		err = -EIO;  	} -	ice_free_fltr_list(dev, &tmp_add_list);  	return err;  } @@ -1547,6 +1596,32 @@ void ice_vsi_cfg_frame_size(struct ice_vsi *vsi)  }  /** + * ice_write_qrxflxp_cntxt - write/configure QRXFLXP_CNTXT register + * @hw: HW pointer + * @pf_q: index of the Rx queue in the PF's queue space + * @rxdid: flexible descriptor RXDID + * @prio: priority for the RXDID for this queue + */ +void +ice_write_qrxflxp_cntxt(struct ice_hw *hw, u16 pf_q, u32 rxdid, u32 prio) +{ +	int regval = rd32(hw, QRXFLXP_CNTXT(pf_q)); + +	/* clear any previous values */ +	regval &= ~(QRXFLXP_CNTXT_RXDID_IDX_M | +		    QRXFLXP_CNTXT_RXDID_PRIO_M | +		    QRXFLXP_CNTXT_TS_M); + +	regval |= (rxdid << QRXFLXP_CNTXT_RXDID_IDX_S) & +		QRXFLXP_CNTXT_RXDID_IDX_M; + +	regval |= (prio << QRXFLXP_CNTXT_RXDID_PRIO_S) & +		QRXFLXP_CNTXT_RXDID_PRIO_M; + +	wr32(hw, QRXFLXP_CNTXT(pf_q), regval); +} + +/**   * ice_vsi_cfg_rxqs - Configure the VSI for Rx   * @vsi: the VSI being configured   * @@ -1671,7 +1746,7 @@ void ice_vsi_cfg_msix(struct ice_vsi *vsi)  {  	struct ice_pf *pf = vsi->back;  	struct ice_hw *hw = &pf->hw; -	u32 txq = 0, rxq = 0; +	u16 txq = 0, rxq = 0;  	int i, q;  	for (i = 0; i < vsi->num_q_vectors; i++) { @@ -1737,8 +1812,9 @@ int ice_vsi_manage_vlan_insertion(struct ice_vsi *vsi)  	status = ice_update_vsi(hw, vsi->idx, ctxt, NULL);  	if (status) { -		dev_err(ice_pf_to_dev(vsi->back), "update VSI for VLAN insert failed, err %d aq_err %d\n", -			status, hw->adminq.sq_last_status); +		dev_err(ice_pf_to_dev(vsi->back), "update VSI for VLAN insert failed, err %s aq_err %s\n", +			ice_stat_str(status), +			ice_aq_str(hw->adminq.sq_last_status));  		ret = -EIO;  		goto out;  	} @@ -1761,6 +1837,12 @@ int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena)  	enum ice_status status;  	int ret = 0; +	/* do not allow modifying VLAN stripping when a port VLAN is configured +	 * on this VSI +	 */ +	if (vsi->info.pvid) +		return 0; +  	ctxt = kzalloc(sizeof(*ctxt), GFP_KERNEL);  	if (!ctxt)  		return -ENOMEM; @@ -1783,8 +1865,9 @@ int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena)  	status = ice_update_vsi(hw, vsi->idx, ctxt, NULL);  	if (status) { -		dev_err(ice_pf_to_dev(vsi->back), "update VSI for VLAN strip failed, ena = %d err %d aq_err %d\n", -			ena, status, hw->adminq.sq_last_status); +		dev_err(ice_pf_to_dev(vsi->back), "update VSI for VLAN strip failed, ena = %d err %s aq_err %s\n", +			ena, ice_stat_str(status), +			ice_aq_str(hw->adminq.sq_last_status));  		ret = -EIO;  		goto out;  	} @@ -1922,9 +2005,10 @@ int ice_cfg_vlan_pruning(struct ice_vsi *vsi, bool ena, bool vlan_promisc)  	status = ice_update_vsi(&pf->hw, vsi->idx, ctxt, NULL);  	if (status) { -		netdev_err(vsi->netdev, "%sabling VLAN pruning on VSI handle: %d, VSI HW ID: %d failed, err = %d, aq_err = %d\n", -			   ena ? "En" : "Dis", vsi->idx, vsi->vsi_num, status, -			   pf->hw.adminq.sq_last_status); +		netdev_err(vsi->netdev, "%sabling VLAN pruning on VSI handle: %d, VSI HW ID: %d failed, err = %s, aq_err = %s\n", +			   ena ? "En" : "Dis", vsi->idx, vsi->vsi_num, +			   ice_stat_str(status), +			   ice_aq_str(pf->hw.adminq.sq_last_status));  		goto err_out;  	} @@ -1991,47 +2075,6 @@ clear_reg_idx:  }  /** - * ice_vsi_add_rem_eth_mac - Program VSI ethertype based filter with rule - * @vsi: the VSI being configured - * @add_rule: boolean value to add or remove ethertype filter rule - */ -static void -ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule) -{ -	struct ice_fltr_list_entry *list; -	struct ice_pf *pf = vsi->back; -	LIST_HEAD(tmp_add_list); -	enum ice_status status; -	struct device *dev; - -	dev = ice_pf_to_dev(pf); -	list = devm_kzalloc(dev, sizeof(*list), GFP_KERNEL); -	if (!list) -		return; - -	list->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE; -	list->fltr_info.fltr_act = ICE_DROP_PACKET; -	list->fltr_info.flag = ICE_FLTR_TX; -	list->fltr_info.src_id = ICE_SRC_ID_VSI; -	list->fltr_info.vsi_handle = vsi->idx; -	list->fltr_info.l_data.ethertype_mac.ethertype = vsi->ethtype; - -	INIT_LIST_HEAD(&list->list_entry); -	list_add(&list->list_entry, &tmp_add_list); - -	if (add_rule) -		status = ice_add_eth_mac(&pf->hw, &tmp_add_list); -	else -		status = ice_remove_eth_mac(&pf->hw, &tmp_add_list); - -	if (status) -		dev_err(dev, "Failure Adding or Removing Ethertype on VSI %i error: %d\n", -			vsi->vsi_num, status); - -	ice_free_fltr_list(dev, &tmp_add_list); -} - -/**   * ice_cfg_sw_lldp - Config switch rules for LLDP packet handling   * @vsi: the VSI being configured   * @tx: bool to determine Tx or Rx rule @@ -2039,45 +2082,25 @@ ice_vsi_add_rem_eth_mac(struct ice_vsi *vsi, bool add_rule)   */  void ice_cfg_sw_lldp(struct ice_vsi *vsi, bool tx, bool create)  { -	struct ice_fltr_list_entry *list; +	enum ice_status (*eth_fltr)(struct ice_vsi *v, u16 type, u16 flag, +				    enum ice_sw_fwd_act_type act);  	struct ice_pf *pf = vsi->back; -	LIST_HEAD(tmp_add_list);  	enum ice_status status;  	struct device *dev;  	dev = ice_pf_to_dev(pf); -	list = devm_kzalloc(dev, sizeof(*list), GFP_KERNEL); -	if (!list) -		return; +	eth_fltr = create ? ice_fltr_add_eth : ice_fltr_remove_eth; -	list->fltr_info.lkup_type = ICE_SW_LKUP_ETHERTYPE; -	list->fltr_info.vsi_handle = vsi->idx; -	list->fltr_info.l_data.ethertype_mac.ethertype = ETH_P_LLDP; - -	if (tx) { -		list->fltr_info.fltr_act = ICE_DROP_PACKET; -		list->fltr_info.flag = ICE_FLTR_TX; -		list->fltr_info.src_id = ICE_SRC_ID_VSI; -	} else { -		list->fltr_info.fltr_act = ICE_FWD_TO_VSI; -		list->fltr_info.flag = ICE_FLTR_RX; -		list->fltr_info.src_id = ICE_SRC_ID_LPORT; -	} - -	INIT_LIST_HEAD(&list->list_entry); -	list_add(&list->list_entry, &tmp_add_list); - -	if (create) -		status = ice_add_eth_mac(&pf->hw, &tmp_add_list); +	if (tx) +		status = eth_fltr(vsi, ETH_P_LLDP, ICE_FLTR_TX, +				  ICE_DROP_PACKET);  	else -		status = ice_remove_eth_mac(&pf->hw, &tmp_add_list); +		status = eth_fltr(vsi, ETH_P_LLDP, ICE_FLTR_RX, ICE_FWD_TO_VSI);  	if (status) -		dev_err(dev, "Fail %s %s LLDP rule on VSI %i error: %d\n", +		dev_err(dev, "Fail %s %s LLDP rule on VSI %i error: %s\n",  			create ? "adding" : "removing", tx ? "TX" : "RX", -			vsi->vsi_num, status); - -	ice_free_fltr_list(dev, &tmp_add_list); +			vsi->vsi_num, ice_stat_str(status));  }  /** @@ -2122,10 +2145,12 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,  	if (vsi->type == ICE_VSI_VF)  		vsi->vf_id = vf_id; +	ice_alloc_fd_res(vsi); +  	if (ice_vsi_get_qs(vsi)) {  		dev_err(dev, "Failed to allocate queues. vsi->idx = %d\n",  			vsi->idx); -		goto unroll_get_qs; +		goto unroll_vsi_alloc;  	}  	/* set RSS capabilities */ @@ -2140,6 +2165,7 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,  		goto unroll_get_qs;  	switch (vsi->type) { +	case ICE_VSI_CTRL:  	case ICE_VSI_PF:  		ret = ice_vsi_alloc_q_vectors(vsi);  		if (ret) @@ -2164,20 +2190,23 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,  		 * so this handles those cases (i.e. adding the PF to a bridge  		 * without the 8021q module loaded).  		 */ -		ret = ice_vsi_add_vlan(vsi, 0); +		ret = ice_vsi_add_vlan(vsi, 0, ICE_FWD_TO_VSI);  		if (ret)  			goto unroll_clear_rings;  		ice_vsi_map_rings_to_vectors(vsi); -		/* Do not exit if configuring RSS had an issue, at least -		 * receive traffic on first queue. Hence no need to capture -		 * return value -		 */ -		if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) { -			ice_vsi_cfg_rss_lut_key(vsi); -			ice_vsi_set_rss_flow_fld(vsi); -		} +		/* ICE_VSI_CTRL does not need RSS so skip RSS processing */ +		if (vsi->type != ICE_VSI_CTRL) +			/* Do not exit if configuring RSS had an issue, at +			 * least receive traffic on first queue. Hence no +			 * need to capture return value +			 */ +			if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) { +				ice_vsi_cfg_rss_lut_key(vsi); +				ice_vsi_set_rss_flow_fld(vsi); +			} +		ice_init_arfs(vsi);  		break;  	case ICE_VSI_VF:  		/* VF driver will take care of creating netdev for this type and @@ -2223,8 +2252,8 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,  	status = ice_cfg_vsi_lan(vsi->port_info, vsi->idx, vsi->tc_cfg.ena_tc,  				 max_txqs);  	if (status) { -		dev_err(dev, "VSI %d failed lan queue config, error %d\n", -			vsi->vsi_num, status); +		dev_err(dev, "VSI %d failed lan queue config, error %s\n", +			vsi->vsi_num, ice_stat_str(status));  		goto unroll_vector_base;  	} @@ -2239,9 +2268,8 @@ ice_vsi_setup(struct ice_pf *pf, struct ice_port_info *pi,  	 */  	if (!ice_is_safe_mode(pf))  		if (vsi->type == ICE_VSI_PF) { -			ice_vsi_add_rem_eth_mac(vsi, true); - -			/* Tx LLDP packets */ +			ice_fltr_add_eth(vsi, ETH_P_PAUSE, ICE_FLTR_TX, +					 ICE_DROP_PACKET);  			ice_cfg_sw_lldp(vsi, true, true);  		} @@ -2259,6 +2287,7 @@ unroll_vsi_init:  	ice_vsi_delete(vsi);  unroll_get_qs:  	ice_vsi_put_qs(vsi); +unroll_vsi_alloc:  	ice_vsi_clear(vsi);  	return NULL; @@ -2411,6 +2440,8 @@ int ice_ena_vsi(struct ice_vsi *vsi, bool locked)  			if (!locked)  				rtnl_unlock();  		} +	} else if (vsi->type == ICE_VSI_CTRL) { +		err = ice_vsi_open_ctrl(vsi);  	}  	return err; @@ -2440,6 +2471,8 @@ void ice_dis_vsi(struct ice_vsi *vsi, bool locked)  		} else {  			ice_vsi_close(vsi);  		} +	} else if (vsi->type == ICE_VSI_CTRL) { +		ice_vsi_close(vsi);  	}  } @@ -2558,7 +2591,8 @@ int ice_vsi_release(struct ice_vsi *vsi)  	if (!ice_is_safe_mode(pf)) {  		if (vsi->type == ICE_VSI_PF) { -			ice_vsi_add_rem_eth_mac(vsi, false); +			ice_fltr_remove_eth(vsi, ETH_P_PAUSE, ICE_FLTR_TX, +					    ICE_DROP_PACKET);  			ice_cfg_sw_lldp(vsi, true, false);  			/* The Rx rule will only exist to remove if the LLDP FW  			 * engine is currently stopped @@ -2568,7 +2602,7 @@ int ice_vsi_release(struct ice_vsi *vsi)  		}  	} -	ice_remove_vsi_fltr(&pf->hw, vsi->idx); +	ice_fltr_remove_all(vsi);  	ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx);  	ice_vsi_delete(vsi);  	ice_vsi_free_q_vectors(vsi); @@ -2673,15 +2707,13 @@ ice_vsi_rebuild_set_coalesce(struct ice_vsi *vsi,  		ice_vsi_rebuild_update_coalesce(vsi->q_vectors[i],  						&coalesce[i]); -	for (; i < vsi->num_q_vectors; i++) { -		struct ice_coalesce_stored coalesce_dflt = { -			.itr_tx = ICE_DFLT_TX_ITR, -			.itr_rx = ICE_DFLT_RX_ITR, -			.intrl = 0 -		}; +	/* number of q_vectors increased, so assume coalesce settings were +	 * changed globally (i.e. ethtool -C eth0 instead of per-queue) and use +	 * the previous settings from q_vector 0 for all of the new q_vectors +	 */ +	for (; i < vsi->num_q_vectors; i++)  		ice_vsi_rebuild_update_coalesce(vsi->q_vectors[i], -						&coalesce_dflt); -	} +						&coalesce[0]);  }  /** @@ -2746,6 +2778,8 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, bool init_vsi)  		goto err_vsi;  	ice_vsi_get_qs(vsi); + +	ice_alloc_fd_res(vsi);  	ice_vsi_set_tc_cfg(vsi);  	/* Initialize VSI struct elements and create VSI in FW */ @@ -2754,6 +2788,7 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, bool init_vsi)  		goto err_vsi;  	switch (vsi->type) { +	case ICE_VSI_CTRL:  	case ICE_VSI_PF:  		ret = ice_vsi_alloc_q_vectors(vsi);  		if (ret) @@ -2773,17 +2808,19 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, bool init_vsi)  		ice_vsi_map_rings_to_vectors(vsi);  		if (ice_is_xdp_ena_vsi(vsi)) { -			vsi->num_xdp_txq = vsi->alloc_txq; +			vsi->num_xdp_txq = vsi->alloc_rxq;  			ret = ice_prepare_xdp_rings(vsi, vsi->xdp_prog);  			if (ret)  				goto err_vectors;  		} -		/* Do not exit if configuring RSS had an issue, at least -		 * receive traffic on first queue. Hence no need to capture -		 * return value -		 */ -		if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) -			ice_vsi_cfg_rss_lut_key(vsi); +		/* ICE_VSI_CTRL does not need RSS so skip RSS processing */ +		if (vsi->type != ICE_VSI_CTRL) +			/* Do not exit if configuring RSS had an issue, at +			 * least receive traffic on first queue. Hence no +			 * need to capture return value +			 */ +			if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) +				ice_vsi_cfg_rss_lut_key(vsi);  		break;  	case ICE_VSI_VF:  		ret = ice_vsi_alloc_q_vectors(vsi); @@ -2814,8 +2851,8 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, bool init_vsi)  	status = ice_cfg_vsi_lan(vsi->port_info, vsi->idx, vsi->tc_cfg.ena_tc,  				 max_txqs);  	if (status) { -		dev_err(ice_pf_to_dev(pf), "VSI %d failed lan queue config, error %d\n", -			vsi->vsi_num, status); +		dev_err(ice_pf_to_dev(pf), "VSI %d failed lan queue config, error %s\n", +			vsi->vsi_num, ice_stat_str(status));  		if (init_vsi) {  			ret = -EIO;  			goto err_vectors; @@ -2924,8 +2961,8 @@ int ice_vsi_cfg_tc(struct ice_vsi *vsi, u8 ena_tc)  				 max_txqs);  	if (status) { -		dev_err(dev, "VSI %d failed TC config, error %d\n", -			vsi->vsi_num, status); +		dev_err(dev, "VSI %d failed TC config, error %s\n", +			vsi->vsi_num, ice_stat_str(status));  		ret = -EIO;  		goto out;  	} @@ -2985,33 +3022,27 @@ void ice_update_rx_ring_stats(struct ice_ring *rx_ring, u64 pkts, u64 bytes)  }  /** - * ice_vsi_cfg_mac_fltr - Add or remove a MAC address filter for a VSI - * @vsi: the VSI being configured MAC filter - * @macaddr: the MAC address to be added. - * @set: Add or delete a MAC filter - * - * Adds or removes MAC address filter entry for VF VSI + * ice_status_to_errno - convert from enum ice_status to Linux errno + * @err: ice_status value to convert   */ -enum ice_status -ice_vsi_cfg_mac_fltr(struct ice_vsi *vsi, const u8 *macaddr, bool set) +int ice_status_to_errno(enum ice_status err)  { -	LIST_HEAD(tmp_add_list); -	enum ice_status status; - -	 /* Update MAC filter list to be added or removed for a VSI */ -	if (ice_add_mac_to_list(vsi, &tmp_add_list, macaddr)) { -		status = ICE_ERR_NO_MEMORY; -		goto cfg_mac_fltr_exit; +	switch (err) { +	case ICE_SUCCESS: +		return 0; +	case ICE_ERR_DOES_NOT_EXIST: +		return -ENOENT; +	case ICE_ERR_OUT_OF_RANGE: +		return -ENOTTY; +	case ICE_ERR_PARAM: +		return -EINVAL; +	case ICE_ERR_NO_MEMORY: +		return -ENOMEM; +	case ICE_ERR_MAX_LIMIT: +		return -EAGAIN; +	default: +		return -EINVAL;  	} - -	if (set) -		status = ice_add_mac(&vsi->back->hw, &tmp_add_list); -	else -		status = ice_remove_mac(&vsi->back->hw, &tmp_add_list); - -cfg_mac_fltr_exit: -	ice_free_fltr_list(ice_pf_to_dev(vsi->back), &tmp_add_list); -	return status;  }  /** @@ -3079,8 +3110,8 @@ int ice_set_dflt_vsi(struct ice_sw *sw, struct ice_vsi *vsi)  	status = ice_cfg_dflt_vsi(&vsi->back->hw, vsi->idx, true, ICE_FLTR_RX);  	if (status) { -		dev_err(dev, "Failed to set VSI %d as the default forwarding VSI, error %d\n", -			vsi->vsi_num, status); +		dev_err(dev, "Failed to set VSI %d as the default forwarding VSI, error %s\n", +			vsi->vsi_num, ice_stat_str(status));  		return -EIO;  	} @@ -3118,8 +3149,8 @@ int ice_clear_dflt_vsi(struct ice_sw *sw)  	status = ice_cfg_dflt_vsi(&dflt_vsi->back->hw, dflt_vsi->idx, false,  				  ICE_FLTR_RX);  	if (status) { -		dev_err(dev, "Failed to clear the default forwarding VSI %d, error %d\n", -			dflt_vsi->vsi_num, status); +		dev_err(dev, "Failed to clear the default forwarding VSI %d, error %s\n", +			dflt_vsi->vsi_num, ice_stat_str(status));  		return -EIO;  	} |