diff --git a/sys/dev/usb/usb_dev.c b/sys/dev/usb/usb_dev.c index dffabad29b9f..a696a2652be0 100644 --- a/sys/dev/usb/usb_dev.c +++ b/sys/dev/usb/usb_dev.c @@ -284,7 +284,7 @@ usb_ref_device(struct usb_cdev_privdata *cpd, usbd_enum_unlock(cpd->udev); if (--(cpd->udev->refcount) == 0) { - cv_signal(cpd->udev->default_cv + 1); + cv_signal(&cpd->udev->ref_cv); } } mtx_unlock(&usb_ref_lock); @@ -352,7 +352,7 @@ usb_unref_device(struct usb_cdev_privdata *cpd, } if (crd->is_uref) { if (--(cpd->udev->refcount) == 0) { - cv_signal(cpd->udev->default_cv + 1); + cv_signal(&cpd->udev->ref_cv); } crd->is_uref = 0; } @@ -500,7 +500,7 @@ usb_fifo_create(struct usb_cdev_privdata *cpd, /* update some fields */ f->fifo_index = n + USB_FIFO_TX; f->dev_ep_index = e; - f->priv_mtx = udev->default_mtx; + f->priv_mtx = &udev->device_mtx; f->priv_sc0 = ep; f->methods = &usb_ugen_methods; f->iface_index = ep->iface_index; @@ -527,7 +527,7 @@ usb_fifo_create(struct usb_cdev_privdata *cpd, /* update some fields */ f->fifo_index = n + USB_FIFO_RX; f->dev_ep_index = e; - f->priv_mtx = udev->default_mtx; + f->priv_mtx = &udev->device_mtx; f->priv_sc0 = ep; f->methods = &usb_ugen_methods; f->iface_index = ep->iface_index; diff --git a/sys/dev/usb/usb_device.c b/sys/dev/usb/usb_device.c index bc3864749078..98fbb908bdd1 100644 --- a/sys/dev/usb/usb_device.c +++ b/sys/dev/usb/usb_device.c @@ -655,7 +655,7 @@ usb_config_parse(struct usb_device *udev, uint8_t iface_index, uint8_t cmd) goto cleanup; if (cmd == USB_CFG_INIT) { - sx_assert(udev->default_sx + 1, SA_LOCKED); + sx_assert(&udev->enum_sx, SA_LOCKED); /* check for in-use endpoints */ @@ -1062,7 +1062,7 @@ usb_detach_device(struct usb_device *udev, uint8_t iface_index, } DPRINTFN(4, "udev=%p\n", udev); - sx_assert(udev->default_sx + 1, SA_LOCKED); + sx_assert(&udev->enum_sx, SA_LOCKED); /* * First detach the child to give the child's detach routine a @@ -1380,7 +1380,7 @@ usb_suspend_resume(struct usb_device *udev, uint8_t do_suspend) } DPRINTFN(4, "udev=%p do_suspend=%d\n", udev, do_suspend); - sx_assert(udev->default_sx + 1, SA_LOCKED); + sx_assert(&udev->enum_sx, SA_LOCKED); USB_BUS_LOCK(udev->bus); /* filter the suspend events */ @@ -1419,13 +1419,13 @@ usbd_clear_stall_proc(struct usb_proc_msg *_pm) /* Change lock */ USB_BUS_UNLOCK(udev->bus); - mtx_lock(udev->default_mtx); + mtx_lock(&udev->device_mtx); /* Start clear stall callback */ usbd_transfer_start(udev->default_xfer[1]); /* Change lock */ - mtx_unlock(udev->default_mtx); + mtx_unlock(&udev->device_mtx); USB_BUS_LOCK(udev->bus); } @@ -1491,16 +1491,16 @@ usb_alloc_device(device_t parent_dev, struct usb_bus *bus, return (NULL); } /* initialise our SX-lock */ - sx_init_flags(udev->default_sx, "USB device SX lock", SX_DUPOK); + sx_init_flags(&udev->ctrl_sx, "USB device SX lock", SX_DUPOK); /* initialise our SX-lock */ - sx_init_flags(udev->default_sx + 1, "USB config SX lock", SX_DUPOK); + sx_init_flags(&udev->enum_sx, "USB config SX lock", SX_DUPOK); - cv_init(udev->default_cv, "WCTRL"); - cv_init(udev->default_cv + 1, "UGONE"); + cv_init(&udev->ctrlreq_cv, "WCTRL"); + cv_init(&udev->ref_cv, "UGONE"); /* initialise our mutex */ - mtx_init(udev->default_mtx, "USB device mutex", NULL, MTX_DEF); + mtx_init(&udev->device_mtx, "USB device mutex", NULL, MTX_DEF); /* initialise generic clear stall */ udev->cs_msg[0].hdr.pm_callback = &usbd_clear_stall_proc; @@ -2005,7 +2005,7 @@ usb_free_device(struct usb_device *udev, uint8_t flag) mtx_lock(&usb_ref_lock); udev->refcount--; while (udev->refcount != 0) { - cv_wait(udev->default_cv + 1, &usb_ref_lock); + cv_wait(&udev->ref_cv, &usb_ref_lock); } mtx_unlock(&usb_ref_lock); @@ -2036,13 +2036,13 @@ usb_free_device(struct usb_device *udev, uint8_t flag) &udev->cs_msg[0], &udev->cs_msg[1]); USB_BUS_UNLOCK(udev->bus); - sx_destroy(udev->default_sx); - sx_destroy(udev->default_sx + 1); + sx_destroy(&udev->ctrl_sx); + sx_destroy(&udev->enum_sx); - cv_destroy(udev->default_cv); - cv_destroy(udev->default_cv + 1); + cv_destroy(&udev->ctrlreq_cv); + cv_destroy(&udev->ref_cv); - mtx_destroy(udev->default_mtx); + mtx_destroy(&udev->device_mtx); #if USB_HAVE_UGEN KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("leaked cdev entries")); #endif @@ -2588,7 +2588,7 @@ usbd_device_attached(struct usb_device *udev) void usbd_enum_lock(struct usb_device *udev) { - sx_xlock(udev->default_sx + 1); + sx_xlock(&udev->enum_sx); /* * NEWBUS LOCK NOTE: We should check if any parent SX locks * are locked before locking Giant. Else the lock can be @@ -2603,7 +2603,7 @@ void usbd_enum_unlock(struct usb_device *udev) { mtx_unlock(&Giant); - sx_xunlock(udev->default_sx + 1); + sx_xunlock(&udev->enum_sx); } /* @@ -2614,5 +2614,5 @@ usbd_enum_unlock(struct usb_device *udev) uint8_t usbd_enum_is_locked(struct usb_device *udev) { - return (sx_xlocked(udev->default_sx + 1)); + return (sx_xlocked(&udev->enum_sx)); } diff --git a/sys/dev/usb/usb_device.h b/sys/dev/usb/usb_device.h index 3afdecf3ae94..f497949f09c1 100644 --- a/sys/dev/usb/usb_device.h +++ b/sys/dev/usb/usb_device.h @@ -113,9 +113,11 @@ struct usb_power_save { struct usb_device { struct usb_clear_stall_msg cs_msg[2]; /* generic clear stall * messages */ - struct sx default_sx[2]; - struct mtx default_mtx[1]; - struct cv default_cv[2]; + struct sx ctrl_sx; + struct sx enum_sx; + struct mtx device_mtx; + struct cv ctrlreq_cv; + struct cv ref_cv; struct usb_interface *ifaces; struct usb_endpoint default_ep; /* Control Endpoint 0 */ struct usb_endpoint *endpoints; diff --git a/sys/dev/usb/usb_request.c b/sys/dev/usb/usb_request.c index 32c577887730..a5ae56babeeb 100644 --- a/sys/dev/usb/usb_request.c +++ b/sys/dev/usb/usb_request.c @@ -99,7 +99,7 @@ usbd_do_request_callback(struct usb_xfer *xfer, usb_error_t error) usbd_transfer_submit(xfer); break; default: - cv_signal(xfer->xroot->udev->default_cv); + cv_signal(&xfer->xroot->udev->ctrlreq_cv); break; } } @@ -319,7 +319,7 @@ usbd_do_request_flags(struct usb_device *udev, struct mtx *mtx, * is achieved when multiple threads are involved: */ - sx_xlock(udev->default_sx); + sx_xlock(&udev->ctrl_sx); hr_func = usbd_get_hr_func(udev); @@ -457,7 +457,7 @@ usbd_do_request_flags(struct usb_device *udev, struct mtx *mtx, usbd_transfer_start(xfer); while (usbd_transfer_pending(xfer)) { - cv_wait(udev->default_cv, + cv_wait(&udev->ctrlreq_cv, xfer->xroot->xfer_mtx); } @@ -534,7 +534,7 @@ usbd_do_request_flags(struct usb_device *udev, struct mtx *mtx, USB_XFER_UNLOCK(xfer); done: - sx_xunlock(udev->default_sx); + sx_xunlock(&udev->ctrl_sx); if (mtx) { mtx_lock(mtx); diff --git a/sys/dev/usb/usb_transfer.c b/sys/dev/usb/usb_transfer.c index dc39fc64b8ef..ce32f72e6d32 100644 --- a/sys/dev/usb/usb_transfer.c +++ b/sys/dev/usb/usb_transfer.c @@ -2821,7 +2821,7 @@ usbd_default_transfer_setup(struct usb_device *udev) iface_index = 0; if (usbd_transfer_setup(udev, &iface_index, udev->default_xfer, usb_control_ep_cfg, USB_DEFAULT_XFER_MAX, NULL, - udev->default_mtx)) { + &udev->device_mtx)) { DPRINTFN(0, "could not setup default " "USB transfer\n"); } else {