diff mbox series

Add support for JULABO PRESTO to cdc_acm

Message ID 20240927134404.110284-1-f.langufo.l@gmail.com
State New
Headers show
Series Add support for JULABO PRESTO to cdc_acm | expand

Commit Message

Fabio Luongo Sept. 27, 2024, 1:44 p.m. UTC
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@gmail.com>
---
 drivers/usb/class/cdc-acm.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
diff mbox series

Patch

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 */