bus/fslmc: fix parse method for bus devices
authorShreyansh Jain <shreyansh.jain@nxp.com>
Fri, 11 Jan 2019 12:24:23 +0000 (12:24 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 14 Jan 2019 16:44:29 +0000 (17:44 +0100)
Current code expects that bus->parse() would get a string containing
the name of the bus. That is incorrect. bus->parse() is expected
to have strings like:
  dpni.1,key=val
  dpio.2,key=val

when user passed:
  -b fslmc:dpni.1,key=val

This commit fixes this behavior.

Fixes: 50245be05d1a ("bus/fslmc: support device blacklisting")
Cc: stable@dpdk.org
Signed-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>
drivers/bus/fslmc/fslmc_bus.c

index 89af938..565e014 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2016 NXP
+ *   Copyright 2016,2018 NXP
  *
  */
 
@@ -227,20 +227,16 @@ static int
 rte_fslmc_parse(const char *name, void *addr)
 {
        uint16_t dev_id;
-       char *t_ptr;
-       char *sep = strchr(name, ':');
+       char *t_ptr = NULL, *dname = NULL;
 
-       if (strncmp(name, RTE_STR(FSLMC_BUS_NAME),
-               strlen(RTE_STR(FSLMC_BUS_NAME)))) {
-               return -EINVAL;
-       }
+       /* 'name' is expected to contain name of device, for example, dpio.1,
+        * dpni.2, etc.
+        */
 
-       if (!sep) {
-               DPAA2_BUS_ERR("Incorrect device name observed");
+       dname = strdup(name);
+       if (!dname)
                return -EINVAL;
-       }
-
-       t_ptr = (char *)(sep + 1);
+       t_ptr = dname;
 
        if (strncmp("dpni", t_ptr, 4) &&
            strncmp("dpseci", t_ptr, 6) &&
@@ -251,24 +247,29 @@ rte_fslmc_parse(const char *name, void *addr)
            strncmp("dpmcp", t_ptr, 5) &&
            strncmp("dpdmai", t_ptr, 6)) {
                DPAA2_BUS_ERR("Unknown or unsupported device");
-               return -EINVAL;
+               goto err_out;
        }
 
        t_ptr = strchr(name, '.');
        if (!t_ptr) {
                DPAA2_BUS_ERR("Incorrect device string observed (%s)", t_ptr);
-               return -EINVAL;
+               goto err_out;
        }
 
        t_ptr = (char *)(t_ptr + 1);
        if (sscanf(t_ptr, "%hu", &dev_id) <= 0) {
                DPAA2_BUS_ERR("Incorrect device string observed (%s)", t_ptr);
-               return -EINVAL;
+               goto err_out;
        }
+       free(dname);
 
        if (addr)
-               strcpy(addr, (char *)(sep + 1));
+               strcpy(addr, name);
+
        return 0;
+err_out:
+       free(dname);
+       return -EINVAL;
 }
 
 static int