X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fraw%2Fskeleton_rawdev%2Fskeleton_rawdev.c;h=42471fbd118766035e08212e638032b1348dadb0;hb=e66a5a827064f27258e54f3065fcf515936b7513;hp=3da7fe1c09e13552df817000c82b94a5eedeb323;hpb=61c592a8d035ac64d8c589bd7d91d3a23eee9587;p=dpdk.git diff --git a/drivers/raw/skeleton_rawdev/skeleton_rawdev.c b/drivers/raw/skeleton_rawdev/skeleton_rawdev.c index 3da7fe1c09..42471fbd11 100644 --- a/drivers/raw/skeleton_rawdev/skeleton_rawdev.c +++ b/drivers/raw/skeleton_rawdev/skeleton_rawdev.c @@ -32,7 +32,7 @@ int skeleton_pmd_logtype; /* Count of instances */ -uint16_t skeldev_init_once; +static uint16_t skeldev_init_once; /**< Rawdev Skeleton dummy driver name */ #define SKELETON_PMD_RAWDEV_NAME rawdev_skeleton @@ -305,6 +305,18 @@ static int skeleton_rawdev_queue_release(struct rte_rawdev *dev, return ret; } +static uint16_t skeleton_rawdev_queue_count(struct rte_rawdev *dev) +{ + struct skeleton_rawdev *skeldev; + + SKELETON_PMD_FUNC_TRACE(); + + RTE_FUNC_PTR_OR_ERR_RET(dev, -EINVAL); + + skeldev = skeleton_rawdev_get_priv(dev); + return skeldev->num_queues; +} + static int skeleton_rawdev_get_attr(struct rte_rawdev *dev, const char *attr_name, uint64_t *attr_value) @@ -524,6 +536,7 @@ static const struct rte_rawdev_ops skeleton_rawdev_ops = { .queue_def_conf = skeleton_rawdev_queue_def_conf, .queue_setup = skeleton_rawdev_queue_setup, .queue_release = skeleton_rawdev_queue_release, + .queue_count = skeleton_rawdev_queue_count, .attr_get = skeleton_rawdev_get_attr, .attr_set = skeleton_rawdev_set_attr, @@ -542,6 +555,8 @@ static const struct rte_rawdev_ops skeleton_rawdev_ops = { .firmware_version_get = skeleton_rawdev_firmware_version_get, .firmware_load = skeleton_rawdev_firmware_load, .firmware_unload = skeleton_rawdev_firmware_unload, + + .dev_selftest = test_rawdev_skeldev, }; static int @@ -568,9 +583,10 @@ skeleton_rawdev_create(const char *name, goto cleanup; } + ret = rawdev->dev_id; /* return the rawdev id of new device */ + rawdev->dev_ops = &skeleton_rawdev_ops; rawdev->device = &vdev->device; - rawdev->driver_name = vdev->device.driver->name; skeldev = skeleton_rawdev_get_priv(rawdev); @@ -631,14 +647,68 @@ skeleton_rawdev_destroy(const char *name) return 0; } +static int +skeldev_get_selftest(const char *key __rte_unused, + const char *value, + void *opaque) +{ + int *flag = opaque; + *flag = atoi(value); + return 0; +} + +static int +skeldev_parse_vdev_args(struct rte_vdev_device *vdev) +{ + int selftest = 0; + const char *name; + const char *params; + + static const char *const args[] = { + SKELETON_SELFTEST_ARG, + NULL + }; + + name = rte_vdev_device_name(vdev); + + params = rte_vdev_device_args(vdev); + if (params != NULL && params[0] != '\0') { + struct rte_kvargs *kvlist = rte_kvargs_parse(params, args); + + if (!kvlist) { + SKELETON_PMD_INFO( + "Ignoring unsupported params supplied '%s'", + name); + } else { + int ret = rte_kvargs_process(kvlist, + SKELETON_SELFTEST_ARG, + skeldev_get_selftest, &selftest); + if (ret != 0 || (selftest < 0 || selftest > 1)) { + SKELETON_PMD_ERR("%s: Error in parsing args", + name); + rte_kvargs_free(kvlist); + ret = -1; /* enforce if selftest is invalid */ + return ret; + } + } + + rte_kvargs_free(kvlist); + } + + return selftest; +} + static int skeleton_rawdev_probe(struct rte_vdev_device *vdev) { const char *name; - int ret = 0; + int selftest = 0, ret = 0; name = rte_vdev_device_name(vdev); + if (name == NULL) + return -EINVAL; + /* More than one instance is not supported */ if (skeldev_init_once) { SKELETON_PMD_ERR("Multiple instance not supported for %s", @@ -648,12 +718,23 @@ skeleton_rawdev_probe(struct rte_vdev_device *vdev) SKELETON_PMD_INFO("Init %s on NUMA node %d", name, rte_socket_id()); + selftest = skeldev_parse_vdev_args(vdev); + /* In case of invalid argument, selftest != 1; ignore other values */ + ret = skeleton_rawdev_create(name, vdev, rte_socket_id()); + if (ret >= 0) { + /* In case command line argument for 'selftest' was passed; + * if invalid arguments were passed, execution continues but + * without selftest. + */ + if (selftest == 1) + test_rawdev_skeldev(ret); + } /* Device instance created; Second instance not possible */ skeldev_init_once = 1; - return ret; + return ret < 0 ? ret : 0; } static int @@ -663,6 +744,8 @@ skeleton_rawdev_remove(struct rte_vdev_device *vdev) int ret; name = rte_vdev_device_name(vdev); + if (name == NULL) + return -1; SKELETON_PMD_INFO("Closing %s on NUMA node %d", name, rte_socket_id()); @@ -680,10 +763,7 @@ static struct rte_vdev_driver skeleton_pmd_drv = { RTE_PMD_REGISTER_VDEV(SKELETON_PMD_RAWDEV_NAME, skeleton_pmd_drv); -RTE_INIT(skeleton_pmd_init_log); - -static void -skeleton_pmd_init_log(void) +RTE_INIT(skeleton_pmd_init_log) { skeleton_pmd_logtype = rte_log_register("rawdev.skeleton"); if (skeleton_pmd_logtype >= 0)