|
@@ -1239,8 +1239,9 @@ static int usblp_select_alts(struct usblp *usblp)
|
|
|
{
|
|
|
struct usb_interface *if_alt;
|
|
|
struct usb_host_interface *ifd;
|
|
|
- struct usb_endpoint_descriptor *epd, *epwrite, *epread;
|
|
|
- int p, i, e;
|
|
|
+ struct usb_endpoint_descriptor *epwrite, *epread;
|
|
|
+ int p, i;
|
|
|
+ int res;
|
|
|
|
|
|
if_alt = usblp->intf;
|
|
|
|
|
@@ -1260,31 +1261,21 @@ static int usblp_select_alts(struct usblp *usblp)
|
|
|
ifd->desc.bInterfaceProtocol > USBLP_LAST_PROTOCOL)
|
|
|
continue;
|
|
|
|
|
|
- /* Look for bulk OUT and IN endpoints. */
|
|
|
- epwrite = epread = NULL;
|
|
|
- for (e = 0; e < ifd->desc.bNumEndpoints; e++) {
|
|
|
- epd = &ifd->endpoint[e].desc;
|
|
|
-
|
|
|
- if (usb_endpoint_is_bulk_out(epd))
|
|
|
- if (!epwrite)
|
|
|
- epwrite = epd;
|
|
|
-
|
|
|
- if (usb_endpoint_is_bulk_in(epd))
|
|
|
- if (!epread)
|
|
|
- epread = epd;
|
|
|
+ /* Look for the expected bulk endpoints. */
|
|
|
+ if (ifd->desc.bInterfaceProtocol > 1) {
|
|
|
+ res = usb_find_common_endpoints(ifd,
|
|
|
+ &epread, &epwrite, NULL, NULL);
|
|
|
+ } else {
|
|
|
+ epread = NULL;
|
|
|
+ res = usb_find_bulk_out_endpoint(ifd, &epwrite);
|
|
|
}
|
|
|
|
|
|
/* Ignore buggy hardware without the right endpoints. */
|
|
|
- if (!epwrite || (ifd->desc.bInterfaceProtocol > 1 && !epread))
|
|
|
+ if (res)
|
|
|
continue;
|
|
|
|
|
|
- /*
|
|
|
- * Turn off reads for USB_CLASS_PRINTER/1/1 (unidirectional)
|
|
|
- * interfaces and buggy bidirectional printers.
|
|
|
- */
|
|
|
- if (ifd->desc.bInterfaceProtocol == 1) {
|
|
|
- epread = NULL;
|
|
|
- } else if (usblp->quirks & USBLP_QUIRK_BIDIR) {
|
|
|
+ /* Turn off reads for buggy bidirectional printers. */
|
|
|
+ if (usblp->quirks & USBLP_QUIRK_BIDIR) {
|
|
|
printk(KERN_INFO "usblp%d: Disabling reads from "
|
|
|
"problematic bidirectional printer\n",
|
|
|
usblp->minor);
|