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(). Acked-by: Pete Zaitcev <zaitcev@redhat.com> Signed-off-by: Jeremy Figgins <kernel@jeremyfiggins.com> Link: https://lore.kernel.org/r/YAy9kJhM/rG8EQXC@watson Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6ee1d745b7
commit
d8c6edfa3f
1 changed files with 11 additions and 8 deletions
|
@ -1329,6 +1329,8 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)
|
||||||
if (protocol < USBLP_FIRST_PROTOCOL || protocol > USBLP_LAST_PROTOCOL)
|
if (protocol < USBLP_FIRST_PROTOCOL || protocol > USBLP_LAST_PROTOCOL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* Don't unnecessarily set the interface if there's a single alt. */
|
||||||
|
if (usblp->intf->num_altsetting > 1) {
|
||||||
alts = usblp->protocol[protocol].alt_setting;
|
alts = usblp->protocol[protocol].alt_setting;
|
||||||
if (alts < 0)
|
if (alts < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1338,6 +1340,7 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)
|
||||||
alts, usblp->ifnum);
|
alts, usblp->ifnum);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
usblp->bidir = (usblp->protocol[protocol].epread != NULL);
|
usblp->bidir = (usblp->protocol[protocol].epread != NULL);
|
||||||
usblp->current_protocol = protocol;
|
usblp->current_protocol = protocol;
|
||||||
|
|
Loading…
Add table
Reference in a new issue