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 <viachesl...@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(-)

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;
 }
 
-- 
1.8.3.1

Reply via email to