Commit 60164340 authored by Pavan Kumar Linga's avatar Pavan Kumar Linga Committed by Tony Nguyen
Browse files

idpf: generalize send virtchnl message API



With the previous refactor of passing idpf resource pointer, all of the
virtchnl send message functions do not require full vport structure.
Those functions can be generalized to be able to use for configuring
vport independent queues.

Signed-off-by: default avatarAnton Nadezhdin <anton.nadezhdin@intel.com>
Reviewed-by: default avatarMadhu Chittim <madhu.chittim@intel.com>
Signed-off-by: default avatarPavan Kumar Linga <pavan.kumar.linga@intel.com>
Signed-off-by: default avatarJoshua Hay <joshua.a.hay@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 9ad94c23
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -88,7 +88,7 @@ static int idpf_intr_reg_init(struct idpf_vport *vport,
	if (!reg_vals)
		return -ENOMEM;

	num_regs = idpf_get_reg_intr_vecs(vport, reg_vals);
	num_regs = idpf_get_reg_intr_vecs(adapter, reg_vals);
	if (num_regs < num_vecs) {
		err = -EINVAL;
		goto free_reg_vals;
+41 −32
Original line number Diff line number Diff line
@@ -545,7 +545,9 @@ static int idpf_del_mac_filter(struct idpf_vport *vport,
	if (test_bit(IDPF_VPORT_UP, np->state)) {
		int err;

		err = idpf_add_del_mac_filters(vport, np, false, async);
		err = idpf_add_del_mac_filters(np->adapter, vport_config,
					       vport->default_mac_addr,
					       np->vport_id, false, async);
		if (err)
			return err;
	}
@@ -614,7 +616,9 @@ static int idpf_add_mac_filter(struct idpf_vport *vport,
		return err;

	if (test_bit(IDPF_VPORT_UP, np->state))
		err = idpf_add_del_mac_filters(vport, np, true, async);
		err = idpf_add_del_mac_filters(np->adapter, vport_config,
					       vport->default_mac_addr,
					       np->vport_id, true, async);

	return err;
}
@@ -662,7 +666,8 @@ static void idpf_restore_mac_filters(struct idpf_vport *vport)

	spin_unlock_bh(&vport_config->mac_filter_list_lock);

	idpf_add_del_mac_filters(vport, netdev_priv(vport->netdev),
	idpf_add_del_mac_filters(vport->adapter, vport_config,
				 vport->default_mac_addr, vport->vport_id,
				 true, false);
}

@@ -686,7 +691,8 @@ static void idpf_remove_mac_filters(struct idpf_vport *vport)

	spin_unlock_bh(&vport_config->mac_filter_list_lock);

	idpf_add_del_mac_filters(vport, netdev_priv(vport->netdev),
	idpf_add_del_mac_filters(vport->adapter, vport_config,
				 vport->default_mac_addr, vport->vport_id,
				 false, false);
}

@@ -976,7 +982,9 @@ static void idpf_vport_stop(struct idpf_vport *vport, bool rtnl)
{
	struct idpf_netdev_priv *np = netdev_priv(vport->netdev);
	struct idpf_q_vec_rsrc *rsrc = &vport->dflt_qv_rsrc;
	struct idpf_adapter *adapter = vport->adapter;
	struct idpf_queue_id_reg_info *chunks;
	u32 vport_id = vport->vport_id;

	if (!test_bit(IDPF_VPORT_UP, np->state))
		return;
@@ -987,18 +995,18 @@ static void idpf_vport_stop(struct idpf_vport *vport, bool rtnl)
	netif_carrier_off(vport->netdev);
	netif_tx_disable(vport->netdev);

	chunks = &vport->adapter->vport_config[vport->idx]->qid_reg_info;
	chunks = &adapter->vport_config[vport->idx]->qid_reg_info;

	idpf_send_disable_vport_msg(vport);
	idpf_send_disable_vport_msg(adapter, vport_id);
	idpf_send_disable_queues_msg(vport);
	idpf_send_map_unmap_queue_vector_msg(vport, rsrc, false);
	idpf_send_map_unmap_queue_vector_msg(adapter, rsrc, vport_id, false);
	/* Normally we ask for queues in create_vport, but if the number of
	 * initially requested queues have changed, for example via ethtool
	 * set channels, we do delete queues and then add the queues back
	 * instead of deleting and reallocating the vport.
	 */
	if (test_and_clear_bit(IDPF_VPORT_DEL_QUEUES, vport->flags))
		idpf_send_delete_queues_msg(vport, chunks);
		idpf_send_delete_queues_msg(adapter, chunks, vport_id);

	idpf_remove_features(vport);

@@ -1083,7 +1091,7 @@ static void idpf_vport_rel(struct idpf_vport *vport)
	kfree(rss_data->rss_key);
	rss_data->rss_key = NULL;

	idpf_send_destroy_vport_msg(vport);
	idpf_send_destroy_vport_msg(adapter, vport->vport_id);

	/* Release all max queues allocated to the adapter's pool */
	max_q.max_rxq = vport_config->max_q.max_rxq;
@@ -1357,7 +1365,8 @@ void idpf_statistics_task(struct work_struct *work)
		struct idpf_vport *vport = adapter->vports[i];

		if (vport && !test_bit(IDPF_HR_RESET_IN_PROG, adapter->flags))
			idpf_send_get_stats_msg(vport);
			idpf_send_get_stats_msg(netdev_priv(vport->netdev),
						&vport->port_stats);
	}

	queue_delayed_work(adapter->stats_wq, &adapter->stats_task,
@@ -1494,6 +1503,7 @@ static int idpf_vport_open(struct idpf_vport *vport, bool rtnl)
	struct idpf_vport_config *vport_config;
	struct idpf_queue_id_reg_info *chunks;
	struct idpf_rss_data *rss_data;
	u32 vport_id = vport->vport_id;
	int err;

	if (test_bit(IDPF_VPORT_UP, np->state))
@@ -1559,14 +1569,15 @@ static int idpf_vport_open(struct idpf_vport *vport, bool rtnl)

	idpf_vport_intr_ena(vport, rsrc);

	err = idpf_send_config_queues_msg(vport, rsrc);
	err = idpf_send_config_queues_msg(adapter, rsrc, vport_id);
	if (err) {
		dev_err(&adapter->pdev->dev, "Failed to configure queues for vport %u, %d\n",
			vport->vport_id, err);
		goto rxq_deinit;
	}

	err = idpf_send_map_unmap_queue_vector_msg(vport, rsrc, true);
	err = idpf_send_map_unmap_queue_vector_msg(adapter, rsrc, vport_id,
						   true);
	if (err) {
		dev_err(&adapter->pdev->dev, "Failed to map queue vectors for vport %u: %d\n",
			vport->vport_id, err);
@@ -1580,7 +1591,7 @@ static int idpf_vport_open(struct idpf_vport *vport, bool rtnl)
		goto unmap_queue_vectors;
	}

	err = idpf_send_enable_vport_msg(vport);
	err = idpf_send_enable_vport_msg(adapter, vport_id);
	if (err) {
		dev_err(&adapter->pdev->dev, "Failed to enable vport %u: %d\n",
			vport->vport_id, err);
@@ -1606,11 +1617,11 @@ static int idpf_vport_open(struct idpf_vport *vport, bool rtnl)
	return 0;

disable_vport:
	idpf_send_disable_vport_msg(vport);
	idpf_send_disable_vport_msg(adapter, vport_id);
disable_queues:
	idpf_send_disable_queues_msg(vport);
unmap_queue_vectors:
	idpf_send_map_unmap_queue_vector_msg(vport, rsrc, false);
	idpf_send_map_unmap_queue_vector_msg(adapter, rsrc, vport_id, false);
rxq_deinit:
	idpf_xdp_rxq_info_deinit_all(rsrc);
intr_deinit:
@@ -2009,6 +2020,7 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
	struct idpf_adapter *adapter = vport->adapter;
	struct idpf_vport_config *vport_config;
	struct idpf_q_vec_rsrc *new_rsrc;
	u32 vport_id = vport->vport_id;
	struct idpf_vport *new_vport;
	int err, tmp_err = 0;

@@ -2063,27 +2075,20 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
	vport_config = adapter->vport_config[vport->idx];

	if (!vport_is_up) {
		idpf_send_delete_queues_msg(vport, &vport_config->qid_reg_info);
		idpf_send_delete_queues_msg(adapter, &vport_config->qid_reg_info,
					    vport_id);
	} else {
		set_bit(IDPF_VPORT_DEL_QUEUES, vport->flags);
		idpf_vport_stop(vport, false);
	}

	/* We're passing in vport here because we need its wait_queue
	 * to send a message and it should be getting all the vport
	 * config data out of the adapter but we need to be careful not
	 * to add code to add_queues to change the vport config within
	 * vport itself as it will be wiped with a memcpy later.
	 */
	err = idpf_send_add_queues_msg(vport, new_rsrc->num_txq,
				       new_rsrc->num_complq,
				       new_rsrc->num_rxq,
				       new_rsrc->num_bufq);
	err = idpf_send_add_queues_msg(adapter, vport_config, new_rsrc,
				       vport_id);
	if (err)
		goto err_reset;

	/* Same comment as above regarding avoiding copying the wait_queues and
	 * mutexes applies here. We do not want to mess with those if possible.
	/* Avoid copying the wait_queues and mutexes. We do not want to mess
	 * with those if possible.
	 */
	memcpy(vport, new_vport, offsetof(struct idpf_vport, link_up));

@@ -2108,9 +2113,8 @@ int idpf_initiate_soft_reset(struct idpf_vport *vport,
	goto free_vport;

err_reset:
	tmp_err = idpf_send_add_queues_msg(vport, rsrc->num_txq,
					   rsrc->num_complq, rsrc->num_rxq,
					   rsrc->num_bufq);
	tmp_err = idpf_send_add_queues_msg(adapter, vport_config, rsrc,
					   vport_id);

err_open:
	if (!tmp_err && vport_is_up)
@@ -2298,8 +2302,13 @@ static int idpf_set_features(struct net_device *netdev,
	}

	if (changed & NETIF_F_LOOPBACK) {
		bool loopback_ena;

		netdev->features ^= NETIF_F_LOOPBACK;
		err = idpf_send_ena_dis_loopback_msg(vport);
		loopback_ena = idpf_is_feature_ena(vport, NETIF_F_LOOPBACK);

		err = idpf_send_ena_dis_loopback_msg(adapter, vport->vport_id,
						     loopback_ena);
	}

unlock_mutex:
+4 −2
Original line number Diff line number Diff line
@@ -4679,13 +4679,15 @@ void idpf_vport_intr_ena(struct idpf_vport *vport, struct idpf_q_vec_rsrc *rsrc)
 */
int idpf_config_rss(struct idpf_vport *vport, struct idpf_rss_data *rss_data)
{
	struct idpf_adapter *adapter = vport->adapter;
	u32 vport_id = vport->vport_id;
	int err;

	err = idpf_send_get_set_rss_key_msg(vport, rss_data, false);
	err = idpf_send_get_set_rss_key_msg(adapter, rss_data, vport_id, false);
	if (err)
		return err;

	return idpf_send_get_set_rss_lut_msg(vport, rss_data, false);
	return idpf_send_get_set_rss_lut_msg(adapter, rss_data, vport_id, false);
}

/**
+1 −1
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ static int idpf_vf_intr_reg_init(struct idpf_vport *vport,
	if (!reg_vals)
		return -ENOMEM;

	num_regs = idpf_get_reg_intr_vecs(vport, reg_vals);
	num_regs = idpf_get_reg_intr_vecs(adapter, reg_vals);
	if (num_regs < num_vecs) {
		err = -EINVAL;
		goto free_reg_vals;
+132 −109

File changed.

Preview size limit exceeded, changes collapsed.

Loading