> @@ -116,6 +133,9 @@
>  
>       down(&driver->serialize);
>  
> +     /* release all urbs for this device */
> +     nuke_urbs(interface_to_usbdev(intf));
> +
>       if (intf->driver && intf->driver->disconnect)
>               intf->driver->disconnect(intf);
>  
> @@ -896,6 +916,9 @@

It seems to me that if you are going to do this. Locking here

static void hcd_endpoint_disable (struct usb_device *udev, int endpoint)
<snip>
        dev = udev->hcpriv;
        hcd = udev->bus->hcpriv;

rescan:
        /* (re)block new requests, as best we can */
        if (endpoint & USB_DIR_IN) {
                usb_endpoint_halt (udev, epnum, 0);
                udev->epmaxpacketin [epnum] = 0;
        } else {
                usb_endpoint_halt (udev, epnum, 1);
                udev->epmaxpacketout [epnum] = 0;
        }

        /* then kill any current requests */
        spin_lock_irqsave (&hcd_data_lock, flags);
        list_for_each_entry (urb, &dev->urb_list, urb_list) {

is insufficient. There is a window between halting the endpoint and adding
an URB to the list. Putting a synchronize_kernel in between should solve this.
Comments?

        Regards
                Oliver



-------------------------------------------------------
This SF.net email is sponsored by: VM Ware
With VMware you can run multiple operating systems on a single machine.
WITHOUT REBOOTING! Mix Linux / Windows / Novell virtual machines at the
same time. Free trial click here: http://www.vmware.com/wl/offer/345/0
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to