patch "USB: usblp: don't call usb_set_interface if there's a single alt" added to usb-linus
Subsystems (3)
This is a note to let you know that I've just added the patch titled
USB: usblp: don't call usb_set_interface if there's a single alt
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From d8c6edfa3f4ee0d45d7ce5ef18d1245b78774b9d Mon Sep 17 00:00:00 2001
From: Jeremy Figgins <[email protected]>
Date: Sat, 23 Jan 2021 18:21:36 -0600
Subject: USB: usblp: don't call usb_set_interface if there's a single alt
Some devices, such as the Winbond Electronics Corp. Virtual Com Port (Vendor=0416, ProdId=5011), lockup when usb_set_interface() or usb_clear_halt() are called. This device has only a single altsetting, so it should not be necessary to call usb_set_interface().
--- drivers/usb/class/usblp.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/usb/class/usblp.c +11 -8
@@ -1329,14 +1329,17 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)if (protocol <USBLP_FIRST_PROTOCOL || protocol >USBLP_LAST_PROTOCOL )return -EINVAL ; - alts = usblp->protocol[protocol].alt_setting; -if (alts <0 ) -return -EINVAL ; - r =usb_set_interface (usblp->dev, usblp->ifnum, alts); -if (r <0 ) { -printk (KERN_ERR "usblp: can't set desired altsetting %d on interface %d\n" , - alts, usblp->ifnum); -return r; +/* Don't unnecessarily set the interface if there's a single alt. */ +if (usblp->intf->num_altsetting >1 ) { + alts = usblp->protocol[protocol].alt_setting; +if (alts <0 ) +return -EINVAL ; + r =usb_set_interface (usblp->dev, usblp->ifnum, alts); +if (r <0 ) { +printk (KERN_ERR "usblp: can't set desired altsetting %d on interface %d\n" , + alts, usblp->ifnum); +return r; + } } usblp->bidir = (usblp->protocol[protocol].epread !=NULL );
Signature · 1 line
2.30.0