Hi all,
I have just tested kernel version 2.6.11-rc5 and noticed it is not
possible to do an USB transfer by submitting an URB to an output
endpoint. This breaks newest versions of libusb and thus SANE,
gphoto2, and a lot of software.
The bug has been introduced in version 2.6.11-rc1 and is due to a
wrong comparison. Please find a patch below to fix that.
Bye,
Aurelien
Signed-off-by: Aurelien Jarno <[email protected]>
diff -urN linux-2.6.11-rc5.orig/drivers/usb/core/devio.c linux-2.6.11-rc5/drivers/usb/core/devio.c
--- linux-2.6.11-rc5.orig/drivers/usb/core/devio.c 2005-02-26 03:15:14.000000000 +0100
+++ linux-2.6.11-rc5/drivers/usb/core/devio.c 2005-02-26 03:16:15.000000000 +0100
@@ -841,7 +841,7 @@
if ((ret = checkintf(ps, ifnum)))
return ret;
}
- if ((uurb.endpoint & ~USB_ENDPOINT_DIR_MASK) != 0)
+ if ((uurb.endpoint & USB_ENDPOINT_DIR_MASK) != 0)
ep = ps->dev->ep_in [uurb.endpoint & USB_ENDPOINT_NUMBER_MASK];
else
ep = ps->dev->ep_out [uurb.endpoint & USB_ENDPOINT_NUMBER_MASK];
--
.''`. Aurelien Jarno GPG: 1024D/F1BCDB73
: :' : Debian GNU/Linux developer | Electrical Engineer
`. `' [email protected] | [email protected]
`- people.debian.org/~aurel32 | http://www.aurel32.net
You are correct, the patch is valid, nice catch. Linus, please apply.
------------
I have just tested kernel version 2.6.11-rc5 and noticed it is not
possible to do an USB transfer by submitting an URB to an output
endpoint. This breaks newest versions of libusb and thus SANE,
gphoto2, and a lot of software.
The bug has been introduced in version 2.6.11-rc1 and is due to a
wrong comparison.
Signed-off-by: Aurelien Jarno <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
diff -urN linux-2.6.11-rc5.orig/drivers/usb/core/devio.c linux-2.6.11-rc5/drivers/usb/core/devio.c
--- linux-2.6.11-rc5.orig/drivers/usb/core/devio.c 2005-02-26 03:15:14.000000000 +0100
+++ linux-2.6.11-rc5/drivers/usb/core/devio.c 2005-02-26 03:16:15.000000000 +0100
@@ -841,7 +841,7 @@
if ((ret = checkintf(ps, ifnum)))
return ret;
}
- if ((uurb.endpoint & ~USB_ENDPOINT_DIR_MASK) != 0)
+ if ((uurb.endpoint & USB_ENDPOINT_DIR_MASK) != 0)
ep = ps->dev->ep_in [uurb.endpoint & USB_ENDPOINT_NUMBER_MASK];
else
ep = ps->dev->ep_out [uurb.endpoint & USB_ENDPOINT_NUMBER_MASK];