Hi, looking at the disconnect method of usblp: static void usblp_disconnect(struct usb_interface *intf) { struct usblp *usblp = usb_get_intfdata (intf);
usb_deregister_dev(intf, &usblp_class); if (!usblp || !usblp->dev) { err("bogus disconnect"); BUG (); } down (&usblp_sem); down (&usblp->sem); usblp->present = 0; usb_set_intfdata (intf, NULL); usblp_unlink_urbs(usblp); interacting with this: static void usblp_bulk_read(struct urb *urb, struct pt_regs *regs) { struct usblp *usblp = urb->context; if (!usblp || !usblp->dev || !usblp->used || !usblp->present) return; if (unlikely(urb->status)) warn("usblp%d: nonzero read/write bulk status received: %d", usblp->minor, urb->status); usblp->rcomplete = 1; wake_up_interruptible(&usblp->wait); } The callback will not wake the tasks on the waitqueue if disconnect has proceeded to mark the device as not present. This seems incorrect. Comments? Regards Oliver ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel