FWIW, the CUPS libusb-based backend only sets the alt setting if there is more than 1 alt setting in the descriptor. > On Jan 18, 2021, at 11:31 AM, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > > On Sun, Jan 17, 2021 at 11:44:16PM -0600, Pete Zaitcev wrote: >> On Sun, 17 Jan 2021 15:36:39 -0600 >> Jeremy Figgins <kernel@xxxxxxxxxxxxxxxxx> wrote: >> >>> The naming is designed to mirror the existing >>> USB_QUIRK_NO_SET_INTF flag, but that flag is >>> not sufficient to make these devices work. >>> + { 0x0416, 0x5011, USBLP_QUIRK_NO_SET_INTF }, /* Winbond Electronics Corp. Virtual Com Port */ >> >> Jeremy, thanks for the patch. It looks mostly fine code-wise (quirk is >> out of numerical order), but I have a question: did you consider keying >> off usblp->dev->quirks instead? >> >> How about this: >> >> diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c >> index 37062130a03c..0c4a98f00797 100644 >> --- a/drivers/usb/class/usblp.c >> +++ b/drivers/usb/class/usblp.c >> @@ -1315,7 +1315,11 @@ static int usblp_set_protocol(struct usblp *usblp, int protocol) >> alts = usblp->protocol[protocol].alt_setting; >> if (alts < 0) >> return -EINVAL; >> - r = usb_set_interface(usblp->dev, usblp->ifnum, alts); >> + if (usblp->dev->quirks & USB_QUIRK_NO_SET_INTF) { >> + r = 0; >> + } else { >> + 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); > > Would it be practical simply to skip the usb_set_interface() call > whenever alts is 0? After all, devices use altsetting 0 by default; it > shouldn't be necessary to tell them to do so. > > Alan Stern ________________________ Michael Sweet