Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/subr_bus.c
Show First 20 Lines • Show All 2,998 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
int error; | int error; | ||||
GIANT_REQUIRED; | GIANT_REQUIRED; | ||||
PDEBUG(("%s", DEVICENAME(dev))); | PDEBUG(("%s", DEVICENAME(dev))); | ||||
if (dev->state == DS_BUSY) | if (dev->state == DS_BUSY) | ||||
return (EBUSY); | return (EBUSY); | ||||
if (dev->state == DS_ATTACHING) { | |||||
device_printf(dev, "device in attaching state! Deferring detach.\n"); | |||||
return (EBUSY); | |||||
} | |||||
if (dev->state != DS_ATTACHED) | if (dev->state != DS_ATTACHED) | ||||
return (0); | return (0); | ||||
EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, EVHDEV_DETACH_BEGIN); | EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, EVHDEV_DETACH_BEGIN); | ||||
if ((error = DEVICE_DETACH(dev)) != 0) { | if ((error = DEVICE_DETACH(dev)) != 0) { | ||||
EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, | EVENTHANDLER_DIRECT_INVOKE(device_detach, dev, | ||||
EVHDEV_DETACH_FAILED); | EVHDEV_DETACH_FAILED); | ||||
return (error); | return (error); | ||||
▲ Show 20 Lines • Show All 2,862 Lines • Show Last 20 Lines |