bus.c (794b2c05ca1c4ded4a023d11833e3855a0ed6ea8) | bus.c (e05b2d141fef22cfac1928cf0eb6890e5dae4216) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (C) 2017 Netronome Systems, Inc. 3 * Copyright (C) 2019 Mellanox Technologies. All rights reserved 4 */ 5 6#include <linux/device.h> 7#include <linux/idr.h> 8#include <linux/kernel.h> --- 139 unchanged lines hidden (view full) --- 148 nsim_bus_dev_vfs_disable(nsim_bus_dev); 149} 150 151static struct device_type nsim_bus_dev_type = { 152 .groups = nsim_bus_dev_attr_groups, 153 .release = nsim_bus_dev_release, 154}; 155 | 1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (C) 2017 Netronome Systems, Inc. 3 * Copyright (C) 2019 Mellanox Technologies. All rights reserved 4 */ 5 6#include <linux/device.h> 7#include <linux/idr.h> 8#include <linux/kernel.h> --- 139 unchanged lines hidden (view full) --- 148 nsim_bus_dev_vfs_disable(nsim_bus_dev); 149} 150 151static struct device_type nsim_bus_dev_type = { 152 .groups = nsim_bus_dev_attr_groups, 153 .release = nsim_bus_dev_release, 154}; 155 |
156static struct nsim_bus_dev * 157nsim_bus_dev_new(unsigned int id, unsigned int port_count); 158 |
|
156static ssize_t 157new_device_store(struct bus_type *bus, const char *buf, size_t count) 158{ 159 struct nsim_bus_dev *nsim_bus_dev; 160 unsigned int port_count; 161 unsigned int id; 162 int err; 163 --- 19 unchanged lines hidden (view full) --- 183 mutex_lock(&nsim_bus_dev_list_lock); 184 list_add_tail(&nsim_bus_dev->list, &nsim_bus_dev_list); 185 mutex_unlock(&nsim_bus_dev_list_lock); 186 187 return count; 188} 189static BUS_ATTR_WO(new_device); 190 | 159static ssize_t 160new_device_store(struct bus_type *bus, const char *buf, size_t count) 161{ 162 struct nsim_bus_dev *nsim_bus_dev; 163 unsigned int port_count; 164 unsigned int id; 165 int err; 166 --- 19 unchanged lines hidden (view full) --- 186 mutex_lock(&nsim_bus_dev_list_lock); 187 list_add_tail(&nsim_bus_dev->list, &nsim_bus_dev_list); 188 mutex_unlock(&nsim_bus_dev_list_lock); 189 190 return count; 191} 192static BUS_ATTR_WO(new_device); 193 |
194static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev); 195 |
|
191static ssize_t 192del_device_store(struct bus_type *bus, const char *buf, size_t count) 193{ 194 struct nsim_bus_dev *nsim_bus_dev, *tmp; 195 unsigned int id; 196 int err; 197 198 err = sscanf(buf, "%u", &id); --- 57 unchanged lines hidden (view full) --- 256 .name = DRV_NAME, 257 .dev_name = DRV_NAME, 258 .bus_groups = nsim_bus_groups, 259 .probe = nsim_bus_probe, 260 .remove = nsim_bus_remove, 261 .num_vf = nsim_num_vf, 262}; 263 | 196static ssize_t 197del_device_store(struct bus_type *bus, const char *buf, size_t count) 198{ 199 struct nsim_bus_dev *nsim_bus_dev, *tmp; 200 unsigned int id; 201 int err; 202 203 err = sscanf(buf, "%u", &id); --- 57 unchanged lines hidden (view full) --- 261 .name = DRV_NAME, 262 .dev_name = DRV_NAME, 263 .bus_groups = nsim_bus_groups, 264 .probe = nsim_bus_probe, 265 .remove = nsim_bus_remove, 266 .num_vf = nsim_num_vf, 267}; 268 |
264struct nsim_bus_dev *nsim_bus_dev_new(unsigned int id, unsigned int port_count) | 269static struct nsim_bus_dev * 270nsim_bus_dev_new(unsigned int id, unsigned int port_count) |
265{ 266 struct nsim_bus_dev *nsim_bus_dev; 267 int err; 268 269 nsim_bus_dev = kzalloc(sizeof(*nsim_bus_dev), GFP_KERNEL); 270 if (!nsim_bus_dev) 271 return ERR_PTR(-ENOMEM); 272 | 271{ 272 struct nsim_bus_dev *nsim_bus_dev; 273 int err; 274 275 nsim_bus_dev = kzalloc(sizeof(*nsim_bus_dev), GFP_KERNEL); 276 if (!nsim_bus_dev) 277 return ERR_PTR(-ENOMEM); 278 |
273 err = ida_alloc_range(&nsim_bus_dev_ids, 274 id == ~0 ? 0 : id, id, GFP_KERNEL); | 279 err = ida_alloc_range(&nsim_bus_dev_ids, id, id, GFP_KERNEL); |
275 if (err < 0) 276 goto err_nsim_bus_dev_free; 277 nsim_bus_dev->dev.id = err; 278 nsim_bus_dev->dev.bus = &nsim_bus; 279 nsim_bus_dev->dev.type = &nsim_bus_dev_type; 280 nsim_bus_dev->port_count = port_count; 281 282 err = device_register(&nsim_bus_dev->dev); 283 if (err) 284 goto err_nsim_bus_dev_id_free; 285 return nsim_bus_dev; 286 287err_nsim_bus_dev_id_free: 288 ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id); 289err_nsim_bus_dev_free: 290 kfree(nsim_bus_dev); 291 return ERR_PTR(err); 292} 293 | 280 if (err < 0) 281 goto err_nsim_bus_dev_free; 282 nsim_bus_dev->dev.id = err; 283 nsim_bus_dev->dev.bus = &nsim_bus; 284 nsim_bus_dev->dev.type = &nsim_bus_dev_type; 285 nsim_bus_dev->port_count = port_count; 286 287 err = device_register(&nsim_bus_dev->dev); 288 if (err) 289 goto err_nsim_bus_dev_id_free; 290 return nsim_bus_dev; 291 292err_nsim_bus_dev_id_free: 293 ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id); 294err_nsim_bus_dev_free: 295 kfree(nsim_bus_dev); 296 return ERR_PTR(err); 297} 298 |
294struct nsim_bus_dev *nsim_bus_dev_new_with_ns(struct netdevsim *ns) | 299static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev) |
295{ | 300{ |
296 struct nsim_bus_dev *nsim_bus_dev; 297 298 dev_hold(ns->netdev); 299 rtnl_unlock(); 300 nsim_bus_dev = nsim_bus_dev_new(~0, 0); 301 rtnl_lock(); 302 dev_put(ns->netdev); 303 return nsim_bus_dev; 304} 305 306void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev) 307{ | |
308 device_unregister(&nsim_bus_dev->dev); 309 ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id); 310 kfree(nsim_bus_dev); 311} 312 313static struct device_driver nsim_driver = { 314 .name = DRV_NAME, 315 .bus = &nsim_bus, --- 33 unchanged lines hidden --- | 301 device_unregister(&nsim_bus_dev->dev); 302 ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id); 303 kfree(nsim_bus_dev); 304} 305 306static struct device_driver nsim_driver = { 307 .name = DRV_NAME, 308 .bus = &nsim_bus, --- 33 unchanged lines hidden --- |