in devices/rio_mport_cdev.c [1817:1865]
static int rio_mport_del_riodev(struct mport_cdev_priv *priv, void __user *arg)
{
struct rio_rdev_info dev_info;
struct rio_dev *rdev = NULL;
struct device *dev;
struct rio_mport *mport;
struct rio_net *net;
if (copy_from_user(&dev_info, arg, sizeof(dev_info)))
return -EFAULT;
dev_info.name[sizeof(dev_info.name) - 1] = '\0';
mport = priv->md->mport;
/* If device name is specified, removal by name has priority */
if (strlen(dev_info.name)) {
dev = bus_find_device_by_name(&rio_bus_type, NULL,
dev_info.name);
if (dev)
rdev = to_rio_dev(dev);
} else {
do {
rdev = rio_get_comptag(dev_info.comptag, rdev);
if (rdev && rdev->dev.parent == &mport->net->dev &&
rdev->destid == dev_info.destid &&
rdev->hopcount == dev_info.hopcount)
break;
} while (rdev);
}
if (!rdev) {
rmcd_debug(RDEV,
"device name:%s ct:0x%x did:0x%x hc:0x%x not found",
dev_info.name, dev_info.comptag, dev_info.destid,
dev_info.hopcount);
return -ENODEV;
}
net = rdev->net;
rio_dev_put(rdev);
rio_del_device(rdev, RIO_DEVICE_SHUTDOWN);
if (list_empty(&net->devices)) {
rio_free_net(net);
mport->net = NULL;
}
return 0;
}