Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: misc: uss720: check for incompatible versions of the Belkin F5U002

The incompatible device in my possession has a sticker that says
"F5U002 Rev 2" and "P80453-B", and lsusb identifies it as
"050d:0002 Belkin Components IEEE-1284 Controller". There is a bug
report from 2007 from Michael Trausch who was seeing the exact same
errors that I saw in 2024 trying to use this cable.

Link: https://lore.kernel.org/all/46DE5830.9060401@trausch.us/
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Link: https://lore.kernel.org/r/20240326150723.99939-5-alexhenrie24@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Alex Henrie and committed by
Greg Kroah-Hartman
3295f1b8 d24f0596

+14 -8
+14 -8
drivers/usb/misc/uss720.c
··· 677 677 struct parport_uss720_private *priv; 678 678 struct parport *pp; 679 679 unsigned char reg; 680 - int i; 680 + int ret; 681 681 682 682 dev_dbg(&intf->dev, "probe: vendor id 0x%x, device id 0x%x\n", 683 683 le16_to_cpu(usbdev->descriptor.idVendor), ··· 688 688 usb_put_dev(usbdev); 689 689 return -ENODEV; 690 690 } 691 - i = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2); 692 - dev_dbg(&intf->dev, "set interface result %d\n", i); 691 + ret = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2); 692 + dev_dbg(&intf->dev, "set interface result %d\n", ret); 693 693 694 694 interface = intf->cur_altsetting; 695 695 ··· 728 728 set_1284_register(pp, 7, 0x00, GFP_KERNEL); 729 729 set_1284_register(pp, 6, 0x30, GFP_KERNEL); /* PS/2 mode */ 730 730 set_1284_register(pp, 2, 0x0c, GFP_KERNEL); 731 - /* debugging */ 732 - get_1284_register(pp, 0, &reg, GFP_KERNEL); 733 - dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg); 734 731 735 - i = usb_find_last_int_in_endpoint(interface, &epd); 736 - if (!i) { 732 + /* The Belkin F5U002 Rev 2 P80453-B USB parallel port adapter shares the 733 + * device ID 050d:0002 with some other device that works with this 734 + * driver, but it itself does not. Detect and handle the bad cable 735 + * here. */ 736 + ret = get_1284_register(pp, 0, &reg, GFP_KERNEL); 737 + dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg); 738 + if (ret < 0) 739 + return ret; 740 + 741 + ret = usb_find_last_int_in_endpoint(interface, &epd); 742 + if (!ret) { 737 743 dev_dbg(&intf->dev, "epaddr %d interval %d\n", 738 744 epd->bEndpointAddress, epd->bInterval); 739 745 }