Skip to content

Commit 06f656e

Browse files
eichenbergergregkh
authored andcommitted
usb: core: fix pipe creation for get_bMaxPacketSize0
commit 4aac0db upstream. When usb_control_msg is used in the get_bMaxPacketSize0 function, the USB pipe does not include the endpoint device number. This can cause failures when a usb hub port is reinitialized after encountering a bad cable connection. As a result, the system logs the following error messages: usb usb2-port1: cannot reset (err = -32) usb usb2-port1: Cannot enable. Maybe the USB cable is bad? usb usb2-port1: attempt power cycle usb 2-1: new high-speed USB device number 5 using ci_hdrc usb 2-1: device descriptor read/8, error -71 The problem began after commit 85d07c5 ("USB: core: Unite old scheme and new scheme descriptor reads"). There usb_get_device_descriptor was replaced with get_bMaxPacketSize0. Unlike usb_get_device_descriptor, the get_bMaxPacketSize0 function uses the macro usb_rcvaddr0pipe, which does not include the endpoint device number. usb_get_device_descriptor, on the other hand, used the macro usb_rcvctrlpipe, which includes the endpoint device number. By modifying the get_bMaxPacketSize0 function to use usb_rcvctrlpipe instead of usb_rcvaddr0pipe, the issue can be resolved. This change will ensure that the endpoint device number is included in the USB pipe, preventing reinitialization failures. If the endpoint has not set the device number yet, it will still work because the device number is 0 in udev. Cc: stable <stable@kernel.org> Fixes: 85d07c5 ("USB: core: Unite old scheme and new scheme descriptor reads") Signed-off-by: Stefan Eichenberger <stefan.eichenberger@toradex.com> Reviewed-by: Alan Stern <stern@rowland.harvard.edu> Link: https://lore.kernel.org/r/20250203105840.17539-1-eichest@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 6e0e83e commit 06f656e

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

drivers/usb/core/hub.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4698,7 +4698,6 @@ void usb_ep0_reinit(struct usb_device *udev)
46984698
EXPORT_SYMBOL_GPL(usb_ep0_reinit);
46994699

47004700
#define usb_sndaddr0pipe() (PIPE_CONTROL << 30)
4701-
#define usb_rcvaddr0pipe() ((PIPE_CONTROL << 30) | USB_DIR_IN)
47024701

47034702
static int hub_set_address(struct usb_device *udev, int devnum)
47044703
{
@@ -4804,7 +4803,7 @@ static int get_bMaxPacketSize0(struct usb_device *udev,
48044803
for (i = 0; i < GET_MAXPACKET0_TRIES; ++i) {
48054804
/* Start with invalid values in case the transfer fails */
48064805
buf->bDescriptorType = buf->bMaxPacketSize0 = 0;
4807-
rc = usb_control_msg(udev, usb_rcvaddr0pipe(),
4806+
rc = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
48084807
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
48094808
USB_DT_DEVICE << 8, 0,
48104809
buf, size,

0 commit comments

Comments
 (0)