This patch updates representor name parsing for SF.
In sysfs, representor name stored under "phys_port_name" sysfs key,
similar to VF representor, switch port name of SF representor is
"pf<x>sf<y>".

For netlink message, net SF type is supported.

Examples:

pf0sf1
pf0sf[0-3]

Signed-off-by: Xueming Li <xuemi...@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viachesl...@nvidia.com>
---
 drivers/common/mlx5/linux/mlx5_common_os.c | 32 +++++++++++++++-------
 drivers/common/mlx5/linux/mlx5_nl.c        |  2 ++
 drivers/common/mlx5/mlx5_common.h          |  2 ++
 drivers/net/mlx5/linux/mlx5_ethdev_os.c    |  3 ++
 4 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/drivers/common/mlx5/linux/mlx5_common_os.c 
b/drivers/common/mlx5/linux/mlx5_common_os.c
index 0edd78ea6d..5cf9576921 100644
--- a/drivers/common/mlx5/linux/mlx5_common_os.c
+++ b/drivers/common/mlx5/linux/mlx5_common_os.c
@@ -97,22 +97,34 @@ void
 mlx5_translate_port_name(const char *port_name_in,
                         struct mlx5_switch_info *port_info_out)
 {
-       char pf_c1, pf_c2, vf_c1, vf_c2, eol;
+       char ctrl = 0, pf_c1, pf_c2, vf_c1, vf_c2, eol;
        char *end;
        int sc_items;
 
-       /*
-        * Check for port-name as a string of the form pf0vf0
-        * (support kernel ver >= 5.0 or OFED ver >= 4.6).
-        */
+       sc_items = sscanf(port_name_in, "%c%d",
+                         &ctrl, &port_info_out->ctrl_num);
+       if (sc_items == 2 && ctrl == 'c') {
+               port_name_in++; /* 'c' */
+               port_name_in += snprintf(NULL, 0, "%d",
+                                         port_info_out->ctrl_num);
+       }
+       /* Check for port-name as a string of the form pf0vf0 or pf0sf0 */
        sc_items = sscanf(port_name_in, "%c%c%d%c%c%d%c",
                          &pf_c1, &pf_c2, &port_info_out->pf_num,
                          &vf_c1, &vf_c2, &port_info_out->port_name, &eol);
-       if (sc_items == 6 &&
-           pf_c1 == 'p' && pf_c2 == 'f' &&
-           vf_c1 == 'v' && vf_c2 == 'f') {
-               port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_PFVF;
-               return;
+       if (sc_items == 6 && pf_c1 == 'p' && pf_c2 == 'f') {
+               if (vf_c1 == 'v' && vf_c2 == 'f') {
+                       /* Kernel ver >= 5.0 or OFED ver >= 4.6 */
+                       port_info_out->name_type =
+                                       MLX5_PHYS_PORT_NAME_TYPE_PFVF;
+                       return;
+               }
+               if (vf_c1 == 's' && vf_c2 == 'f') {
+                       /* Kernel ver >= 5.11 or OFED ver >= 5.1 */
+                       port_info_out->name_type =
+                                       MLX5_PHYS_PORT_NAME_TYPE_PFSF;
+                       return;
+               }
        }
        /*
         * Check for port-name as a string of the form p0
diff --git a/drivers/common/mlx5/linux/mlx5_nl.c 
b/drivers/common/mlx5/linux/mlx5_nl.c
index 40d8620300..3d55cc98b4 100644
--- a/drivers/common/mlx5/linux/mlx5_nl.c
+++ b/drivers/common/mlx5/linux/mlx5_nl.c
@@ -1148,6 +1148,8 @@ mlx5_nl_check_switch_info(bool num_vf_set,
        case MLX5_PHYS_PORT_NAME_TYPE_PFHPF:
                /* Fallthrough */
        case MLX5_PHYS_PORT_NAME_TYPE_PFVF:
+               /* Fallthrough */
+       case MLX5_PHYS_PORT_NAME_TYPE_PFSF:
                /* New representors naming schema. */
                switch_info->representor = 1;
                break;
diff --git a/drivers/common/mlx5/mlx5_common.h 
b/drivers/common/mlx5/mlx5_common.h
index e35188da4c..a422b74577 100644
--- a/drivers/common/mlx5/mlx5_common.h
+++ b/drivers/common/mlx5/mlx5_common.h
@@ -153,6 +153,7 @@ enum mlx5_nl_phys_port_name_type {
        MLX5_PHYS_PORT_NAME_TYPE_UPLINK, /* p0, kernel ver >= 5.0 */
        MLX5_PHYS_PORT_NAME_TYPE_PFVF, /* pf0vf0, kernel ver >= 5.0 */
        MLX5_PHYS_PORT_NAME_TYPE_PFHPF, /* pf0, kernel ver >= 5.7, HPF rep */
+       MLX5_PHYS_PORT_NAME_TYPE_PFSF, /* pf0sf0, kernel ver >= 5.0 */
        MLX5_PHYS_PORT_NAME_TYPE_UNKNOWN, /* Unrecognized. */
 };
 
@@ -161,6 +162,7 @@ struct mlx5_switch_info {
        uint32_t master:1; /**< Master device. */
        uint32_t representor:1; /**< Representor device. */
        enum mlx5_nl_phys_port_name_type name_type; /** < Port name type. */
+       int32_t ctrl_num; /**< Controller number (valid for c#pf#vf# format). */
        int32_t pf_num; /**< PF number (valid for pfxvfx format only). */
        int32_t port_name; /**< Representor port name. */
        uint64_t switch_id; /**< Switch identifier. */
diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c 
b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
index e36a78091c..1b37970c21 100644
--- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c
+++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
@@ -1013,6 +1013,9 @@ mlx5_sysfs_check_switch_info(bool device_dir,
                /* New representors naming schema. */
                switch_info->representor = 1;
                break;
+       default:
+               switch_info->master = device_dir;
+               break;
        }
 }
 
-- 
2.25.1

Reply via email to