From 243ac0b9a66c0fd9e00b39b21f87a6309585c766 Mon Sep 17 00:00:00 2001 From: Stian Skjelstad Date: Mon, 3 Jul 2023 23:39:44 +0200 Subject: [PATCH] USB ACM serial driver did not take maxPacketSize provided by the device into account Change-Id: Ic93d420012d757088b20936e6c8d942ccbc0e5bf Reviewed-on: https://review.haiku-os.org/c/haiku/+/6668 Tested-by: Commit checker robot Reviewed-by: Adrien Destugues --- .../kernel/drivers/ports/usb_serial/ACM.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/drivers/ports/usb_serial/ACM.cpp b/src/add-ons/kernel/drivers/ports/usb_serial/ACM.cpp index 7530e5a437..352510fb28 100644 --- a/src/add-ons/kernel/drivers/ports/usb_serial/ACM.cpp +++ b/src/add-ons/kernel/drivers/ports/usb_serial/ACM.cpp @@ -87,6 +87,7 @@ ACMDevice::AddDevice(const usb_configuration_info *config) || descriptor->interface_class == USB_CDC_DATA_INTERFACE_CLASS) && interface->endpoint_count >= 1) { SetControlPipe(interface->endpoint[0].handle); + SetInterruptBufferSize(interface->endpoint[0].descr->max_packet_size); } else { TRACE("Indicated command interface doesn't fit our needs!\n"); status = ENODEV; @@ -99,15 +100,21 @@ ACMDevice::AddDevice(const usb_configuration_info *config) usb_interface_descriptor *descriptor = interface->descr; if (descriptor->interface_class == USB_CDC_DATA_INTERFACE_CLASS && interface->endpoint_count >= 2) { - if (!(interface->endpoint[0].descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN)) + if (!(interface->endpoint[0].descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN)) { + SetWriteBufferSize(ROUNDUP(interface->endpoint[0].descr->max_packet_size, 16)); SetWritePipe(interface->endpoint[0].handle); - else + } else { + SetReadBufferSize(ROUNDUP(interface->endpoint[0].descr->max_packet_size, 16)); SetReadPipe(interface->endpoint[0].handle); + } - if (interface->endpoint[1].descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) + if (interface->endpoint[1].descr->endpoint_address & USB_ENDPOINT_ADDR_DIR_IN) { + SetReadBufferSize(ROUNDUP(interface->endpoint[1].descr->max_packet_size, 16)); SetReadPipe(interface->endpoint[1].handle); - else + } else { + SetWriteBufferSize(ROUNDUP(interface->endpoint[1].descr->max_packet_size, 16)); SetWritePipe(interface->endpoint[1].handle); + } } else { TRACE("Indicated data interface doesn't fit our needs!\n"); status = ENODEV;