Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b76c2952 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



commit d8c6edfa3f4ee0d45d7ce5ef18d1245b78774b9d upstream.

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 ccdc62f4
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -1349,6 +1349,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;
@@ -1358,6 +1360,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;