Hi, you have moved kill_urbs() below cancel_work_sync(&desc->rxwork); cancel_work_sync(&desc->service_outs_intr); to close a race, as rv = usb_submit_urb(desc->response, GFP_KERNEL); in service_outstanding_interrupt() would submit the response URB, right? Unfortunately we have in wdm_in_callback() the following code path if (desc->rerr) { /* * Since there was an error, userspace may decide to not read * any data after poll'ing. * We should respond to further attempts from the device to send * data, so that we can get unstuck. */ schedule_work(&desc->service_outs_intr); It looks to me like we have a circular dependency here and this needs some change to break. What do you think about the attached patch? Regards Oliver