From 334c06ae65a0cafcf647aef9f96d2b9b1f59c66e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 1 Dec 2013 22:01:51 +0100 Subject: [PATCH] usb: enforce wMaxPacketSize on high speed bulk endpoints. * according to the USB 2.0 specification. --- src/add-ons/kernel/bus_managers/usb/Pipe.cpp | 14 ++++++++++++++ src/add-ons/kernel/bus_managers/usb/usb_private.h | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/bus_managers/usb/Pipe.cpp b/src/add-ons/kernel/bus_managers/usb/Pipe.cpp index b6af871a9d..f3170285e6 100644 --- a/src/add-ons/kernel/bus_managers/usb/Pipe.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Pipe.cpp @@ -165,6 +165,20 @@ BulkPipe::BulkPipe(Object *parent) } +void +BulkPipe::InitCommon(int8 deviceAddress, uint8 endpointAddress, + usb_speed speed, pipeDirection direction, size_t maxPacketSize, + uint8 interval, int8 hubAddress, uint8 hubPort) +{ + // some devices have bogus descriptors + if (speed == USB_SPEED_HIGHSPEED && maxPacketSize != 512) + maxPacketSize = 512; + + Pipe::InitCommon(deviceAddress, endpointAddress, speed, direction, + maxPacketSize, interval, hubAddress, hubPort); +} + + status_t BulkPipe::QueueBulk(void *data, size_t dataLength, usb_callback_func callback, void *callbackCookie) diff --git a/src/add-ons/kernel/bus_managers/usb/usb_private.h b/src/add-ons/kernel/bus_managers/usb/usb_private.h index 4f0ffc6936..e3f38a3908 100644 --- a/src/add-ons/kernel/bus_managers/usb/usb_private.h +++ b/src/add-ons/kernel/bus_managers/usb/usb_private.h @@ -287,7 +287,7 @@ public: Pipe(Object *parent); virtual ~Pipe(); - void InitCommon(int8 deviceAddress, +virtual void InitCommon(int8 deviceAddress, uint8 endpointAddress, usb_speed speed, pipeDirection direction, @@ -408,6 +408,14 @@ class BulkPipe : public Pipe { public: BulkPipe(Object *parent); +virtual void InitCommon(int8 deviceAddress, + uint8 endpointAddress, + usb_speed speed, + pipeDirection direction, + size_t maxPacketSize, + uint8 interval, + int8 hubAddress, uint8 hubPort); + virtual uint32 Type() const { return USB_OBJECT_PIPE | USB_OBJECT_BULK_PIPE; } virtual const char * TypeName() const { return "bulk pipe"; }