common/mlx5: support sub-function representor parsing
authorXueming Li <xuemingl@nvidia.com>
Sun, 28 Mar 2021 13:48:07 +0000 (13:48 +0000)
committerRaslan Darawsheh <rasland@nvidia.com>
Wed, 31 Mar 2021 07:16:23 +0000 (09:16 +0200)
This patch supports 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 <xuemingl@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/common/mlx5/linux/mlx5_common_os.c
drivers/common/mlx5/linux/mlx5_nl.c
drivers/common/mlx5/mlx5_common.h
drivers/net/mlx5/linux/mlx5_ethdev_os.c

index 0edd78e..5cf9576 100644 (file)
@@ -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
index ef7a521..752c57b 100644 (file)
@@ -746,6 +746,7 @@ mlx5_nl_mac_addr_sync(int nlsk_fd, unsigned int iface_idx,
        int i;
        int ret;
 
+       memset(macs, 0, n * sizeof(macs[0]));
        ret = mlx5_nl_mac_addr_list(nlsk_fd, iface_idx, &macs, &macs_n);
        if (ret)
                return;
@@ -1158,6 +1159,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;
index 5028a05..8eda674 100644 (file)
@@ -151,6 +151,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. */
 };
 
@@ -159,6 +160,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. */
index 0e8de94..cb692b2 100644 (file)
@@ -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;
        }
 }