1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2017 6WIND S.A. 3 * Copyright 2017 Mellanox Technologies, Ltd. 4 */ 5 6 #include <stddef.h> 7 8 #include <rte_bus_vdev.h> 9 #include <rte_common.h> 10 #include <rte_config.h> 11 #include <rte_kvargs.h> 12 #include <rte_log.h> 13 14 #define VDEV_NETVSC_DRIVER net_vdev_netvsc 15 #define VDEV_NETVSC_ARG_IFACE "iface" 16 #define VDEV_NETVSC_ARG_MAC "mac" 17 18 #define DRV_LOG(level, ...) \ 19 rte_log(RTE_LOG_ ## level, \ 20 vdev_netvsc_logtype, \ 21 RTE_FMT(RTE_STR(VDEV_NETVSC_DRIVER) ": " \ 22 RTE_FMT_HEAD(__VA_ARGS__,) "\n", \ 23 RTE_FMT_TAIL(__VA_ARGS__,))) 24 25 /** Driver-specific log messages type. */ 26 static int vdev_netvsc_logtype; 27 28 /** Number of driver instances relying on context list. */ 29 static unsigned int vdev_netvsc_ctx_inst; 30 31 /** 32 * Probe NetVSC interfaces. 33 * 34 * @param dev 35 * Virtual device context for driver instance. 36 * 37 * @return 38 * Always 0, even in case of errors. 39 */ 40 static int 41 vdev_netvsc_vdev_probe(struct rte_vdev_device *dev) 42 { 43 static const char *const vdev_netvsc_arg[] = { 44 VDEV_NETVSC_ARG_IFACE, 45 VDEV_NETVSC_ARG_MAC, 46 NULL, 47 }; 48 const char *name = rte_vdev_device_name(dev); 49 const char *args = rte_vdev_device_args(dev); 50 struct rte_kvargs *kvargs = rte_kvargs_parse(args ? args : "", 51 vdev_netvsc_arg); 52 53 DRV_LOG(DEBUG, "invoked as \"%s\", using arguments \"%s\"", name, args); 54 if (!kvargs) { 55 DRV_LOG(ERR, "cannot parse arguments list"); 56 goto error; 57 } 58 error: 59 if (kvargs) 60 rte_kvargs_free(kvargs); 61 ++vdev_netvsc_ctx_inst; 62 return 0; 63 } 64 65 /** 66 * Remove driver instance. 67 * 68 * @param dev 69 * Virtual device context for driver instance. 70 * 71 * @return 72 * Always 0. 73 */ 74 static int 75 vdev_netvsc_vdev_remove(__rte_unused struct rte_vdev_device *dev) 76 { 77 --vdev_netvsc_ctx_inst; 78 return 0; 79 } 80 81 /** Virtual device descriptor. */ 82 static struct rte_vdev_driver vdev_netvsc_vdev = { 83 .probe = vdev_netvsc_vdev_probe, 84 .remove = vdev_netvsc_vdev_remove, 85 }; 86 87 RTE_PMD_REGISTER_VDEV(VDEV_NETVSC_DRIVER, vdev_netvsc_vdev); 88 RTE_PMD_REGISTER_ALIAS(VDEV_NETVSC_DRIVER, eth_vdev_netvsc); 89 RTE_PMD_REGISTER_PARAM_STRING(net_vdev_netvsc, 90 VDEV_NETVSC_ARG_IFACE "=<string> " 91 VDEV_NETVSC_ARG_MAC "=<string>"); 92 93 /** Initialize driver log type. */ 94 RTE_INIT(vdev_netvsc_init_log) 95 { 96 vdev_netvsc_logtype = rte_log_register("pmd.vdev_netvsc"); 97 if (vdev_netvsc_logtype >= 0) 98 rte_log_set_level(vdev_netvsc_logtype, RTE_LOG_NOTICE); 99 } 100