nsim_bus_dev
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
if (!smp_load_acquire(&nsim_bus_dev->init))
ret = nsim_drv_port_del(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index);
struct nsim_bus_dev *nsim_bus_dev;
nsim_bus_dev = container_of(dev, struct nsim_bus_dev, dev);
kfree(nsim_bus_dev);
static struct nsim_bus_dev *
struct nsim_bus_dev *nsim_bus_dev;
nsim_bus_dev = nsim_bus_dev_new(id, port_count, num_queues);
if (IS_ERR(nsim_bus_dev)) {
err = PTR_ERR(nsim_bus_dev);
smp_store_release(&nsim_bus_dev->init, true);
list_add_tail(&nsim_bus_dev->list, &nsim_bus_dev_list);
static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev);
struct nsim_bus_dev *nsim_bus_dev, *tmp;
list_for_each_entry_safe(nsim_bus_dev, tmp, &nsim_bus_dev_list, list) {
if (nsim_bus_dev->dev.id != id)
list_del(&nsim_bus_dev->list);
nsim_bus_dev_del(nsim_bus_dev);
static struct nsim_bus_dev *to_nsim_bus_dev(struct device *dev)
return container_of(dev, struct nsim_bus_dev, dev);
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
return nsim_drv_probe(nsim_bus_dev);
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
nsim_drv_remove(nsim_bus_dev);
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
return nsim_bus_dev->num_vfs;
static struct nsim_bus_dev *
ret = nsim_drv_configure_vfs(nsim_bus_dev, num_vfs);
struct nsim_bus_dev *nsim_bus_dev;
nsim_bus_dev = kzalloc_obj(*nsim_bus_dev);
if (!nsim_bus_dev)
nsim_bus_dev->dev.id = err;
nsim_bus_dev->dev.bus = &nsim_bus;
nsim_bus_dev->dev.type = &nsim_bus_dev_type;
nsim_bus_dev->port_count = port_count;
nsim_bus_dev->num_queues = num_queues;
nsim_bus_dev->initial_net = current->nsproxy->net_ns;
nsim_bus_dev->max_vfs = NSIM_BUS_DEV_MAX_VFS;
smp_store_release(&nsim_bus_dev->init, false);
err = device_register(&nsim_bus_dev->dev);
return nsim_bus_dev;
ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id);
put_device(&nsim_bus_dev->dev);
nsim_bus_dev = NULL;
kfree(nsim_bus_dev);
static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev)
smp_store_release(&nsim_bus_dev->init, false);
ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id);
device_unregister(&nsim_bus_dev->dev);
struct nsim_bus_dev *nsim_bus_dev, *tmp;
list_for_each_entry_safe(nsim_bus_dev, tmp, &nsim_bus_dev_list, list) {
list_del(&nsim_bus_dev->list);
nsim_bus_dev_del(nsim_bus_dev);
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
return sprintf(buf, "%u\n", nsim_bus_dev->num_vfs);
struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev);
if (!smp_load_acquire(&nsim_bus_dev->init))
ret = nsim_drv_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index,
struct nsim_bus_dev *nsim_bus_dev = nsim_dev->nsim_bus_dev;
err = nsim_dev_port_add_all(nsim_dev, nsim_bus_dev->port_count);
int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
nsim_bus_dev->initial_net, &nsim_bus_dev->dev);
nsim_dev->nsim_bus_dev = nsim_bus_dev;
dev_set_drvdata(&nsim_bus_dev->dev, nsim_dev);
nsim_bus_dev->max_vfs,
err = nsim_dev_port_add_all(nsim_dev, nsim_bus_dev->port_count);
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
nsim_bus_dev_set_vfs(nsim_dev->nsim_bus_dev, 0);
void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
dev_set_drvdata(&nsim_bus_dev->dev, NULL);
int nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev, enum nsim_dev_port_type type,
struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
int nsim_drv_port_del(struct nsim_bus_dev *nsim_bus_dev, enum nsim_dev_port_type type,
struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
int nsim_drv_configure_vfs(struct nsim_bus_dev *nsim_bus_dev,
struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev);
if (nsim_bus_dev->num_vfs == num_vfs)
if (nsim_bus_dev->num_vfs && num_vfs) {
if (nsim_bus_dev->max_vfs < num_vfs) {
nsim_bus_dev_set_vfs(nsim_bus_dev, num_vfs);
nsim_bus_dev_set_vfs(nsim_bus_dev, 0);
READ_ONCE(nsim_dev->nsim_bus_dev->max_vfs));
WRITE_ONCE(nsim_dev->nsim_bus_dev->max_vfs, val);
sprintf(dev_ddir_name, DRV_NAME "%u", nsim_dev->nsim_bus_dev->dev.id);
struct nsim_bus_dev *nsim_bus_dev = nsim_dev->nsim_bus_dev;
sprintf(dev_link_name, "../../../" DRV_NAME "%u", nsim_bus_dev->dev.id);
return nsim_dev->nsim_bus_dev->num_vfs;
nsim_bus_dev_set_vfs(struct nsim_bus_dev *nsim_bus_dev, unsigned int num_vfs)
nsim_bus_dev->num_vfs = num_vfs;
ch->max_combined = ns->nsim_bus_dev->num_queues;
ns->ethtool.channels = ns->nsim_bus_dev->num_queues;
phc = mock_phc_create(&ns->nsim_bus_dev->dev);
nsim_dev->nsim_bus_dev->num_queues);
ns->nsim_bus_dev = nsim_dev->nsim_bus_dev;
SET_NETDEV_DEV(dev, &ns->nsim_bus_dev->dev);
struct nsim_bus_dev *nsim_bus_dev;
struct nsim_bus_dev *nsim_bus_dev;
int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev);
void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev);
int nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev,
int nsim_drv_port_del(struct nsim_bus_dev *nsim_bus_dev,
int nsim_drv_configure_vfs(struct nsim_bus_dev *nsim_bus_dev,
dev_err(&nsim_dev->nsim_bus_dev->dev,