common/mlx5/linux: replace malloc and free in glue
[dpdk.git] / drivers / common / mlx5 / linux / mlx5_common_os.c
index 5a54875..0edd78e 100644 (file)
@@ -39,6 +39,7 @@ mlx5_dev_to_pci_addr(const char *dev_path,
 {
        FILE *file;
        char line[32];
+       int rc = -ENOENT;
        MKSTR(path, "%s/device/uevent", dev_path);
 
        file = fopen(path, "rb");
@@ -48,16 +49,19 @@ mlx5_dev_to_pci_addr(const char *dev_path,
        }
        while (fgets(line, sizeof(line), file) == line) {
                size_t len = strlen(line);
-               int ret;
 
                /* Truncate long lines. */
-               if (len == (sizeof(line) - 1))
+               if (len == (sizeof(line) - 1)) {
                        while (line[(len - 1)] != '\n') {
-                               ret = fgetc(file);
+                               int ret = fgetc(file);
+
                                if (ret == EOF)
-                                       break;
+                                       goto exit;
                                line[(len - 1)] = ret;
                        }
+                       /* No match for long lines. */
+                       continue;
+               }
                /* Extract information. */
                if (sscanf(line,
                           "PCI_SLOT_NAME="
@@ -66,12 +70,15 @@ mlx5_dev_to_pci_addr(const char *dev_path,
                           &pci_addr->bus,
                           &pci_addr->devid,
                           &pci_addr->function) == 4) {
-                       ret = 0;
+                       rc = 0;
                        break;
                }
        }
+exit:
        fclose(file);
-       return 0;
+       if (rc)
+               rte_errno = -rc;
+       return rc;
 }
 
 /**
@@ -90,7 +97,7 @@ 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;
+       char pf_c1, pf_c2, vf_c1, vf_c2, eol;
        char *end;
        int sc_items;
 
@@ -98,9 +105,9 @@ mlx5_translate_port_name(const char *port_name_in,
         * 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%c%d%c%c%d",
+       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);
+                         &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') {
@@ -111,12 +118,23 @@ mlx5_translate_port_name(const char *port_name_in,
         * Check for port-name as a string of the form p0
         * (support kernel ver >= 5.0, or OFED ver >= 4.6).
         */
-       sc_items = sscanf(port_name_in, "%c%d",
-                         &pf_c1, &port_info_out->port_name);
+       sc_items = sscanf(port_name_in, "%c%d%c",
+                         &pf_c1, &port_info_out->port_name, &eol);
        if (sc_items == 2 && pf_c1 == 'p') {
                port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_UPLINK;
                return;
        }
+       /*
+        * Check for port-name as a string of the form pf0
+        * (support kernel ver >= 5.7 for HPF representor on BF).
+        */
+       sc_items = sscanf(port_name_in, "%c%c%d%c",
+                         &pf_c1, &pf_c2, &port_info_out->pf_num, &eol);
+       if (sc_items == 3 && pf_c1 == 'p' && pf_c2 == 'f') {
+               port_info_out->port_name = -1;
+               port_info_out->name_type = MLX5_PHYS_PORT_NAME_TYPE_PFHPF;
+               return;
+       }
        /* Check for port-name as a number (support kernel ver < 5.0 */
        errno = 0;
        port_info_out->port_name = strtol(port_name_in, &end, 0);