return 0;
}
-int device_claim(struct device *dev)
+int device_claim(struct device_user *dep)
{
+ struct device *dev = dep->dev;
int ret;
+ if (dep->claimed)
+ return 0;
+
+ dep->claimed = true;
DPRINTF("claim device %s, new refcount: %d\n", dev->ifname, dev->active + 1);
if (++dev->active != 1)
return 0;
return ret;
}
-void device_release(struct device *dev)
+void device_release(struct device_user *dep)
{
+ struct device *dev = dep->dev;
+
+ if (!dep->claimed)
+ return;
+
+ dep->claimed = false;
dev->active--;
DPRINTF("release device %s, new refcount: %d\n", dev->ifname, dev->active);
assert(dev->active >= 0);
void device_add_user(struct device_user *dep, struct device *dev)
{
dep->dev = dev;
- list_add(&dep->list, &dev->users);
+ list_add_tail(&dep->list, &dev->users);
if (dep->cb && dev->present) {
dep->cb(dep, DEV_EVENT_ADD);
if (dev->active)
{
struct device *dev = dep->dev;
+ if (dep->claimed)
+ device_release(dep);
+
list_del(&dep->list);
if (list_empty(&dev->users)) {