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

Reply via email to