net/mlx5: support new representors' naming format
Checks
Commit Message
Kernel update [1] introduce new format of representors names.
This patch updates MLX5 PMD to support the new format, while
maintaining support of the existing format.
[1] upstream kernel commit c12ecc230564
"net/mlx5e: Move to use common phys port names for vport representors"
http://l-gerrit.mtl.labs.mlnx:8080/#/c/upstream/linux/+/160883/
Signed-off-by: Dekel Peled <dekelp@mellanox.com>
---
drivers/net/mlx5/mlx5_ethdev.c | 14 +++++++++++++-
drivers/net/mlx5/mlx5_nl.c | 20 +++++++++++++++-----
2 files changed, 28 insertions(+), 6 deletions(-)
@@ -1359,7 +1359,8 @@ int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
bool port_name_set = false;
bool port_switch_id_set = false;
bool device_dir = false;
- char c;
+ char c, pf_c1, pf_c2, vf_c1, vf_c2;
+ int32_t pf_num;
if (!if_indextoname(ifindex, ifname)) {
rte_errno = errno;
@@ -1375,9 +1376,20 @@ int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
file = fopen(phys_port_name, "rb");
if (file != NULL) {
+ /* Check for port-name as a number (support kernel ver < 5.0 */
port_name_set =
fscanf(file, "%d%c", &data.port_name, &c) == 2 &&
c == '\n';
+ if (!port_name_set) {
+ /*
+ * Check for port-name as a string of the form pf0vf0
+ * (support kernel ver >= 5.0)
+ */
+ port_name_set = (fscanf(file, "%c%c%d%c%c%d%c", &pf_c1,
+ &pf_c2, &pf_num, &vf_c1, &vf_c2,
+ &data.port_name, &c) == 7) &&
+ c == '\n';
+ }
fclose(file);
}
file = fopen(phys_switch_id, "rb");
@@ -849,7 +849,7 @@ struct mlx5_nl_ifindex_data {
while (off < nh->nlmsg_len) {
struct rtattr *ra = (void *)((uintptr_t)nh + off);
void *payload = RTA_DATA(ra);
- char *end;
+ char *end, *vf_str;
unsigned int i;
if (ra->rta_len > nh->nlmsg_len - off)
@@ -861,10 +861,20 @@ struct mlx5_nl_ifindex_data {
case IFLA_PHYS_PORT_NAME:
errno = 0;
info.port_name = strtol(payload, &end, 0);
- if (errno ||
- (size_t)(end - (char *)payload) != strlen(payload))
- goto error;
- port_name_set = true;
+ if (errno || ((size_t)(end - (char *)payload) !=
+ strlen(payload))) {
+ vf_str = strstr(payload, "vf");
+ if (vf_str) {
+ errno = 0;
+ info.port_name = strtol(vf_str + 2,
+ &end, 0);
+ port_name_set = true;
+ }
+ if (errno)
+ goto error;
+ } else {
+ port_name_set = true;
+ }
break;
case IFLA_PHYS_SWITCH_ID:
info.switch_id = 0;