net/virtio: revert not claiming LRO support
[dpdk.git] / drivers / net / failsafe / failsafe_args.c
index ec3db55..cfc83e3 100644 (file)
@@ -101,10 +101,11 @@ fs_parse_device(struct sub_device *sdev, char *args)
 static void
 fs_sanitize_cmdline(char *args)
 {
-       size_t len;
+       char *nl;
 
-       len = strnlen(args, DEVARGS_MAXLEN);
-       args[len - 1] = '\0';
+       nl = strrchr(args, '\n');
+       if (nl)
+               nl[0] = '\0';
 }
 
 static int
@@ -114,7 +115,6 @@ fs_execute_cmd(struct sub_device *sdev, char *cmdline)
        /* store possible newline as well */
        char output[DEVARGS_MAXLEN + 1];
        size_t len;
-       int old_err;
        int ret;
 
        RTE_ASSERT(cmdline != NULL || sdev->cmdline != NULL);
@@ -134,33 +134,29 @@ fs_execute_cmd(struct sub_device *sdev, char *cmdline)
                                sdev->cmdline[i] = ' ';
        }
        DEBUG("'%s'", sdev->cmdline);
-       old_err = errno;
        fp = popen(sdev->cmdline, "r");
        if (fp == NULL) {
-               ret = errno;
+               ret = -errno;
                ERROR("popen: %s", strerror(errno));
-               errno = old_err;
                return ret;
        }
        /* We only read one line */
        if (fgets(output, sizeof(output) - 1, fp) == NULL) {
                DEBUG("Could not read command output");
-               return -ENODEV;
+               ret = -ENODEV;
+               goto ret_pclose;
        }
        fs_sanitize_cmdline(output);
-       ret = fs_parse_device(sdev, output);
-       if (ret) {
-               ERROR("Parsing device '%s' failed", output);
+       if (output[0] == '\0') {
+               ret = -ENODEV;
                goto ret_pclose;
        }
+       ret = fs_parse_device(sdev, output);
+       if (ret)
+               ERROR("Parsing device '%s' failed", output);
 ret_pclose:
-       ret = pclose(fp);
-       if (ret) {
-               ret = errno;
+       if (pclose(fp) == -1)
                ERROR("pclose: %s", strerror(errno));
-               errno = old_err;
-               return ret;
-       }
        return ret;
 }
 
@@ -280,10 +276,17 @@ fs_remove_sub_devices_definition(char params[DEVARGS_MAXLEN])
                        ERROR("Invalid parameter");
                        return -EINVAL;
                }
-               if (params[b] == ',' || params[b] == '\0')
-                       i += snprintf(&buffer[i], b - a + 1, "%s", &params[a]);
-               if (params[b] == '(') {
+               if (params[b] == ',' || params[b] == '\0') {
+                       size_t len = b - a;
+
+                       if (i > 0)
+                               len += 1;
+                       snprintf(&buffer[i], len + 1, "%s%s",
+                                       i ? "," : "", &params[a]);
+                       i += len;
+               } else if (params[b] == '(') {
                        size_t start = b;
+
                        b += closing_paren(&params[b]);
                        if (b == start)
                                return -EINVAL;
@@ -387,6 +390,7 @@ failsafe_args_parse(struct rte_eth_dev *dev, const char *params)
                                        &dev->data->mac_addrs[0]);
                        if (ret < 0)
                                goto free_kvlist;
+
                        mac_from_arg = 1;
                }
        }
@@ -436,6 +440,17 @@ failsafe_args_count_subdevice(struct rte_eth_dev *dev,
                                    dev, params);
 }
 
+static int
+fs_parse_sub_device(struct sub_device *sdev)
+{
+       struct rte_devargs *da;
+       char devstr[DEVARGS_MAXLEN] = "";
+
+       da = &sdev->devargs;
+       snprintf(devstr, sizeof(devstr), "%s,%s", da->name, da->args);
+       return fs_parse_device(sdev, devstr);
+}
+
 int
 failsafe_args_parse_subs(struct rte_eth_dev *dev)
 {
@@ -448,6 +463,8 @@ failsafe_args_parse_subs(struct rte_eth_dev *dev)
                        continue;
                if (sdev->cmdline)
                        ret = fs_execute_cmd(sdev, sdev->cmdline);
+               else
+                       ret = fs_parse_sub_device(sdev);
                if (ret == 0)
                        sdev->state = DEV_PARSED;
        }