[08/12] net/mlx5: elaborate E-Switch port parameters query

Message ID 1569398015-6027-9-git-send-email-viacheslavo@mellanox.com (mailing list archive)
State Accepted, archived
Delegated to: Raslan Darawsheh
Headers
Series net/mlx5: add bonding configuration support |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Slava Ovsiienko Sept. 25, 2019, 7:53 a.m. UTC
  The routine mlx5_port_to_eswitch_info() is elaborated
to two ones (get E-Switch port parameters by port and
by device pointer) and simplified to returning structure
containing all parameters instead of copying.

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
---
 drivers/net/mlx5/mlx5.h         |  4 +--
 drivers/net/mlx5/mlx5_ethdev.c  | 49 ++++++++++++++++++++++--------
 drivers/net/mlx5/mlx5_flow_dv.c | 66 +++++++++++++++++++----------------------
 3 files changed, 69 insertions(+), 50 deletions(-)
  

Patch

diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 631876d..87e0549 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -718,8 +718,8 @@  int mlx5_dev_to_pci_addr(const char *dev_path,
 unsigned int mlx5_dev_to_port_id(const struct rte_device *dev,
 				 uint16_t *port_list,
 				 unsigned int port_list_n);
-int mlx5_port_to_eswitch_info(uint16_t port, uint16_t *es_domain_id,
-			      uint16_t *es_port_id);
+struct mlx5_priv *mlx5_port_to_eswitch_info(uint16_t port);
+struct mlx5_priv *mlx5_dev_to_eswitch_info(struct rte_eth_dev *dev);
 int mlx5_sysfs_switch_info(unsigned int ifindex,
 			   struct mlx5_switch_info *info);
 void mlx5_sysfs_check_switch_info(bool device_dir,
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 71f63ac..27372f1 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -1660,7 +1660,7 @@  int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
 }
 
 /**
- * Get the E-Switch domain id this port belongs to.
+ * Get the E-Switch parameters by port id.
  *
  * @param[in] port
  *   Device port id.
@@ -1670,34 +1670,57 @@  int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
  *   The port id of the port in the E-Switch.
  *
  * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
+ *   pointer to device private data structure containing data needed
+ *   on success, NULL otherwise and rte_errno is set.
  */
-int
-mlx5_port_to_eswitch_info(uint16_t port,
-			  uint16_t *es_domain_id, uint16_t *es_port_id)
+struct mlx5_priv *
+mlx5_port_to_eswitch_info(uint16_t port)
 {
 	struct rte_eth_dev *dev;
 	struct mlx5_priv *priv;
 
 	if (port >= RTE_MAX_ETHPORTS) {
 		rte_errno = EINVAL;
-		return -rte_errno;
+		return NULL;
 	}
 	if (!rte_eth_dev_is_valid_port(port)) {
 		rte_errno = ENODEV;
-		return -rte_errno;
+		return NULL;
 	}
 	dev = &rte_eth_devices[port];
 	priv = dev->data->dev_private;
 	if (!(priv->representor || priv->master)) {
 		rte_errno = EINVAL;
-		return -rte_errno;
+		return NULL;
 	}
-	if (es_domain_id)
-		*es_domain_id = priv->domain_id;
-	if (es_port_id)
-		*es_port_id = priv->vport_id;
-	return 0;
+	return priv;
+}
+
+/**
+ * Get the E-Switch parameters by device instance.
+ *
+ * @param[in] port
+ *   Device port id.
+ * @param[out] es_domain_id
+ *   E-Switch domain id.
+ * @param[out] es_port_id
+ *   The port id of the port in the E-Switch.
+ *
+ * @return
+ *   pointer to device private data structure containing data needed
+ *   on success, NULL otherwise and rte_errno is set.
+ */
+struct mlx5_priv *
+mlx5_dev_to_eswitch_info(struct rte_eth_dev *dev)
+{
+	struct mlx5_priv *priv;
+
+	priv = dev->data->dev_private;
+	if (!(priv->representor || priv->master)) {
+		rte_errno = EINVAL;
+		return NULL;
+	}
+	return priv;
 }
 
 /**
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index c234d13..ad4ff5a 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -813,8 +813,8 @@  struct field_modify_info modify_tcp[] = {
 	const struct rte_flow_item_port_id switch_mask = {
 			.id = 0xffffffff,
 	};
-	uint16_t esw_domain_id;
-	uint16_t item_port_esw_domain_id;
+	struct mlx5_priv *esw_priv;
+	struct mlx5_priv *dev_priv;
 	int ret;
 
 	if (!attr->transfer)
@@ -845,21 +845,19 @@  struct field_modify_info modify_tcp[] = {
 		return ret;
 	if (!spec)
 		return 0;
-	ret = mlx5_port_to_eswitch_info(spec->id, &item_port_esw_domain_id,
-					NULL);
-	if (ret)
-		return rte_flow_error_set(error, -ret,
+	esw_priv = mlx5_port_to_eswitch_info(spec->id);
+	if (!esw_priv)
+		return rte_flow_error_set(error, -rte_errno,
 					  RTE_FLOW_ERROR_TYPE_ITEM_SPEC, spec,
 					  "failed to obtain E-Switch info for"
 					  " port");
-	ret = mlx5_port_to_eswitch_info(dev->data->port_id,
-					&esw_domain_id, NULL);
-	if (ret < 0)
-		return rte_flow_error_set(error, -ret,
+	dev_priv = mlx5_dev_to_eswitch_info(dev);
+	if (!dev_priv)
+		return rte_flow_error_set(error, -rte_errno,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL,
 					  "failed to obtain E-Switch info");
-	if (item_port_esw_domain_id != esw_domain_id)
+	if (esw_priv->domain_id != dev_priv->domain_id)
 		return rte_flow_error_set(error, -ret,
 					  RTE_FLOW_ERROR_TYPE_ITEM_SPEC, spec,
 					  "cannot match on a port from a"
@@ -2440,10 +2438,9 @@  struct field_modify_info modify_tcp[] = {
 				struct rte_flow_error *error)
 {
 	const struct rte_flow_action_port_id *port_id;
+	struct mlx5_priv *act_priv;
+	struct mlx5_priv *dev_priv;
 	uint16_t port;
-	uint16_t esw_domain_id;
-	uint16_t act_port_domain_id;
-	int ret;
 
 	if (!attr->transfer)
 		return rte_flow_error_set(error, ENOTSUP,
@@ -2463,24 +2460,23 @@  struct field_modify_info modify_tcp[] = {
 					  RTE_FLOW_ERROR_TYPE_ACTION, NULL,
 					  "can have only one fate actions in"
 					  " a flow");
-	ret = mlx5_port_to_eswitch_info(dev->data->port_id,
-					&esw_domain_id, NULL);
-	if (ret < 0)
-		return rte_flow_error_set(error, -ret,
+	dev_priv = mlx5_dev_to_eswitch_info(dev);
+	if (!dev_priv)
+		return rte_flow_error_set(error, -rte_errno,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL,
 					  "failed to obtain E-Switch info");
 	port_id = action->conf;
 	port = port_id->original ? dev->data->port_id : port_id->id;
-	ret = mlx5_port_to_eswitch_info(port, &act_port_domain_id, NULL);
-	if (ret)
+	act_priv = mlx5_port_to_eswitch_info(port);
+	if (!act_priv)
 		return rte_flow_error_set
-				(error, -ret,
+				(error, -rte_errno,
 				 RTE_FLOW_ERROR_TYPE_ACTION_CONF, port_id,
 				 "failed to obtain E-Switch port id for port");
-	if (act_port_domain_id != esw_domain_id)
+	if (act_priv->domain_id != dev_priv->domain_id)
 		return rte_flow_error_set
-				(error, -ret,
+				(error, -rte_errno,
 				 RTE_FLOW_ERROR_TYPE_ACTION, NULL,
 				 "port does not belong to"
 				 " E-Switch being configured");
@@ -4664,15 +4660,16 @@  struct field_modify_info modify_tcp[] = {
 {
 	const struct rte_flow_item_port_id *pid_m = item ? item->mask : NULL;
 	const struct rte_flow_item_port_id *pid_v = item ? item->spec : NULL;
-	uint16_t mask, val, id;
-	int ret;
+	struct mlx5_priv *priv;
+	uint16_t mask, id;
 
 	mask = pid_m ? pid_m->id : 0xffff;
 	id = pid_v ? pid_v->id : dev->data->port_id;
-	ret = mlx5_port_to_eswitch_info(id, NULL, &val);
-	if (ret)
-		return ret;
-	flow_dv_translate_item_source_vport(matcher, key, val, mask);
+	priv = mlx5_port_to_eswitch_info(id);
+	if (!priv)
+		return -rte_errno;
+	flow_dv_translate_item_source_vport(matcher, key,
+					    priv->vport_id, mask);
 	return 0;
 }
 
@@ -5105,19 +5102,18 @@  struct field_modify_info modify_tcp[] = {
 				 struct rte_flow_error *error)
 {
 	uint32_t port;
-	uint16_t port_id;
-	int ret;
+	struct mlx5_priv *priv;
 	const struct rte_flow_action_port_id *conf =
 			(const struct rte_flow_action_port_id *)action->conf;
 
 	port = conf->original ? dev->data->port_id : conf->id;
-	ret = mlx5_port_to_eswitch_info(port, NULL, &port_id);
-	if (ret)
-		return rte_flow_error_set(error, -ret,
+	priv = mlx5_port_to_eswitch_info(port);
+	if (!priv)
+		return rte_flow_error_set(error, -rte_errno,
 					  RTE_FLOW_ERROR_TYPE_ACTION,
 					  NULL,
 					  "No eswitch info was found for port");
-	*dst_port_id = port_id;
+	*dst_port_id = priv->vport_id;
 	return 0;
 }