JULABO PRESTO chillers on Windows use the usbser.sys driver for communication, so the same functionality should be achievable on Linux using the cdc_acm driver. However, cdc_acm does not accomodate the quirkness of these devices, as they fail normal probing ("Zero length descriptor references"), but they also feature a single USB interface instead of two. This patch extends the effect of the `NO_UNION_NORMAL` quirk to cover the features of JULABO PRESTO devices. Signed-off-by: Fabio Luongo <f.langufo.l@xxxxxxxxx> --- drivers/usb/class/cdc-acm.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 605fea461102..d77c84c6e878 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -1210,6 +1210,8 @@ static int acm_probe(struct usb_interface *intf, if (quirks == NO_UNION_NORMAL) { data_interface = usb_ifnum_to_if(usb_dev, 1); control_interface = usb_ifnum_to_if(usb_dev, 0); + if (!data_interface) + data_interface = control_interface; /* we would crash */ if (!data_interface || !control_interface) return -ENODEV; @@ -1284,6 +1286,8 @@ static int acm_probe(struct usb_interface *intf, if (data_intf_num != call_intf_num) dev_dbg(&intf->dev, "Separate call control interface. That is not fully supported.\n"); +skip_normal_probe: + if (control_interface == data_interface) { /* some broken devices designed for windows work this way */ dev_warn(&intf->dev,"Control and data interfaces are not separated!\n"); @@ -1303,8 +1307,6 @@ static int acm_probe(struct usb_interface *intf, goto made_compressed_probe; } -skip_normal_probe: - /*workaround for switched interfaces */ if (data_interface->cur_altsetting->desc.bInterfaceClass != USB_CLASS_CDC_DATA) { if (control_interface->cur_altsetting->desc.bInterfaceClass == USB_CLASS_CDC_DATA) { @@ -1787,6 +1789,9 @@ static const struct usb_device_id acm_ids[] = { { USB_DEVICE(0x0572, 0x1349), /* Hiro (Conexant) USB MODEM H50228 */ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ }, + { USB_DEVICE(0x233c, 0x7633), /* JULABO PRESTO */ + .driver_info = NO_UNION_NORMAL, + }, { USB_DEVICE(0x20df, 0x0001), /* Simtec Electronics Entropy Key */ .driver_info = QUIRK_CONTROL_LINE_STATE, }, { USB_DEVICE(0x2184, 0x001c) }, /* GW Instek AFG-2225 */ -- 2.46.1