Commit d8c6edfa authored by Jeremy Figgins's avatar Jeremy Figgins Committed by Greg Kroah-Hartman
Browse files

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: default avatarPete Zaitcev <zaitcev@redhat.com>
Signed-off-by: default avatarJeremy Figgins <kernel@jeremyfiggins.com>
Link: https://lore.kernel.org/r/YAy9kJhM/rG8EQXC@watson


Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 6ee1d745
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -1329,6 +1329,8 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)
	if (protocol < USBLP_FIRST_PROTOCOL || protocol > USBLP_LAST_PROTOCOL)
		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;
		if (alts < 0)
			return -EINVAL;
@@ -1338,6 +1340,7 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol)
				alts, usblp->ifnum);
			return r;
		}
	}

	usblp->bidir = (usblp->protocol[protocol].epread != NULL);
	usblp->current_protocol = protocol;