--- sys/kern/subr_bus.c.orig 2010-12-02 13:28:01.000000000 +0900 +++ sys/kern/subr_bus.c 2010-12-08 12:37:05.524727855 +0900 @@ -3385,15 +3385,13 @@ int bus_generic_suspend(device_t dev) { int error; - device_t child, child2; + device_t child; - TAILQ_FOREACH(child, &dev->children, link) { + TAILQ_FOREACH_REVERSE(child, &dev->children, device_list, link) { error = DEVICE_SUSPEND(child); if (error) { - for (child2 = TAILQ_FIRST(&dev->children); - child2 && child2 != child; - child2 = TAILQ_NEXT(child2, link)) - DEVICE_RESUME(child2); + while ((child = TAILQ_NEXT(child, link)) != NULL) + DEVICE_RESUME(child); return (error); } }