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 ---