From e4c316c4f7fa9251e92bdcb24e380caf4a49c90f Mon Sep 17 00:00:00 2001 From: Vincent Wang Date: Tue, 1 Dec 2009 10:45:21 +0800 Subject: [PATCH] 6901121 assertion failed: hubd->h_intr_pipe_state == HUBD_INTR_PIPE_ACTIVE --- usr/src/uts/common/io/usb/usba/hubdi.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/usr/src/uts/common/io/usb/usba/hubdi.c b/usr/src/uts/common/io/usb/usba/hubdi.c index 41dd010842..6bc03eb7e3 100644 --- a/usr/src/uts/common/io/usb/usba/hubdi.c +++ b/usr/src/uts/common/io/usb/usba/hubdi.c @@ -1303,13 +1303,6 @@ hubd_config_one(hubd_t *hubd, int port) ndi_hold_devi(hdip); /* so we don't race with detach */ - mutex_enter(HUBD_MUTEX(hubd)); - - hubd_pm_busy_component(hubd, hubd->h_dip, 0); - hubd_stop_polling(hubd); - - mutex_exit(HUBD_MUTEX(hubd)); - /* * this ensures one config activity per system at a time. * we enter the parent PCI node to have this serialization. @@ -1322,6 +1315,11 @@ hubd_config_one(hubd_t *hubd, int port) ndi_devi_enter(hdip, &circ); mutex_enter(HUBD_MUTEX(hubd)); + hubd_pm_busy_component(hubd, hubd->h_dip, 0); + hubd_stop_polling(hubd); + + + if (!hubd->h_children_dips[port]) { (void) hubd_determine_port_status(hubd, port, @@ -3713,11 +3711,6 @@ hubd_hotplug_thread(void *arg) "hubd_hotplug_thread: not root hub"); } - ASSERT(hubd->h_intr_pipe_state == HUBD_INTR_PIPE_ACTIVE); - - nports = hubd->h_hub_descr.bNbrPorts; - - hubd_stop_polling(hubd); mutex_exit(HUBD_MUTEX(hubd)); /* @@ -3733,6 +3726,12 @@ hubd_hotplug_thread(void *arg) ndi_devi_enter(hdip, &circ); mutex_enter(HUBD_MUTEX(hubd)); + ASSERT(hubd->h_intr_pipe_state == HUBD_INTR_PIPE_ACTIVE); + + nports = hubd->h_hub_descr.bNbrPorts; + + hubd_stop_polling(hubd); + while ((hubd->h_dev_state == USB_DEV_ONLINE) && (hubd->h_port_change)) { /* @@ -7524,9 +7523,13 @@ usba_hubdi_ioctl(dev_info_t *self, dev_t dev, int cmd, intptr_t arg, ndi_devi_exit(hubd->h_dip, circ); ndi_devi_exit(rh_dip, rh_circ); ndi_devi_exit(ddi_get_parent(rh_dip), prh_circ); - if ((child_dip == NULL) || - (ndi_devi_online(child_dip, 0) != NDI_SUCCESS)) { + if (child_dip == NULL) { rv = EIO; + } else { + ndi_hold_devi(child_dip); + if (ndi_devi_online(child_dip, 0) != NDI_SUCCESS) + rv = EIO; + ndi_rele_devi(child_dip); } ndi_devi_enter(ddi_get_parent(rh_dip), &prh_circ); ndi_devi_enter(rh_dip, &rh_circ); -- 2.11.4.GIT