From 519fbf77d397b5b604e7423f5c7fc8f9fdf37d35 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sun, 18 May 2008 23:04:06 +0000 Subject: [PATCH] * Make the maximum port count a define and set it to 16. OHCI officially supports up to 15 ports and QEMUs OHCI emulation uses a port count of 10 for example. * Update the hub code to remove the hardcoded 8 port limits. * Some other code to enumerate the USB structure I had laying around (available internally only, might be added as a public API some time). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25555 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/bus_managers/usb/Device.cpp | 1 - src/add-ons/kernel/bus_managers/usb/Hub.cpp | 23 +++++++++++++------ src/add-ons/kernel/bus_managers/usb/Stack.cpp | 7 ++++++ src/add-ons/kernel/bus_managers/usb/usb_p.h | 14 +++++++---- .../kernel/bus_managers/usb/usbspec_p.h | 1 + 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/usb/Device.cpp b/src/add-ons/kernel/bus_managers/usb/Device.cpp index 0d0d468ad2..989279b87e 100644 --- a/src/add-ons/kernel/bus_managers/usb/Device.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Device.cpp @@ -153,7 +153,6 @@ Device::Device(Object *parent, int8 hubPort, usb_device_descriptor &desc, interfaceInfo->generic_count = 0; interfaceInfo->generic = NULL; - // TODO: Remove all Interface class related code. Interface *interface = new(std::nothrow) Interface(this, interfaceDescriptor->interface_number); interfaceInfo->handle = interface->USBID(); diff --git a/src/add-ons/kernel/bus_managers/usb/Hub.cpp b/src/add-ons/kernel/bus_managers/usb/Hub.cpp index 1f7d541cd3..3b7e0a3fb7 100644 --- a/src/add-ons/kernel/bus_managers/usb/Hub.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Hub.cpp @@ -19,7 +19,7 @@ Hub::Hub(Object *parent, int8 hubPort, usb_device_descriptor &desc, TRACE(("USB Hub %d: creating hub\n", DeviceAddress())); memset(&fHubDescriptor, 0, sizeof(fHubDescriptor)); - for (int32 i = 0; i < 8; i++) + for (int32 i = 0; i < USB_MAX_PORT_COUNT; i++) fChildren[i] = NULL; if (!fInitOK) { @@ -55,9 +55,10 @@ Hub::Hub(Object *parent, int8 hubPort, usb_device_descriptor &desc, TRACE(("\tdevice_removeable:...0x%02x\n", fHubDescriptor.device_removeable)); TRACE(("\tpower_control_mask:..0x%02x\n", fHubDescriptor.power_control_mask)); - if (fHubDescriptor.num_ports > 8) { - TRACE(("USB Hub %d: hub supports more ports than we do (%d vs. 8)\n", DeviceAddress(), fHubDescriptor.num_ports)); - fHubDescriptor.num_ports = 8; + if (fHubDescriptor.num_ports > USB_MAX_PORT_COUNT) { + TRACE_ERROR(("USB Hub %d: hub supports more ports than we do (%d vs. %d)\n", + DeviceAddress(), fHubDescriptor.num_ports, USB_MAX_PORT_COUNT)); + fHubDescriptor.num_ports = USB_MAX_PORT_COUNT; } Object *object = GetStack()->GetObject(Configuration()->interface->active->endpoint[0].handle); @@ -174,6 +175,16 @@ Hub::ResetPort(uint8 index) } +status_t +Hub::DisablePort(uint8 index) +{ + return DefaultPipe()->SendRequest(USB_REQTYPE_CLASS + | USB_REQTYPE_OTHER_OUT, USB_REQUEST_CLEAR_FEATURE, PORT_ENABLE, + index + 1, 0, NULL, 0, NULL); +} + + + void Hub::Explore(change_item **changeList) { @@ -238,9 +249,7 @@ Hub::Explore(change_item **changeList) // the device failed to setup correctly, disable the port // so that the device doesn't get in the way of future // addressing. - DefaultPipe()->SendRequest(USB_REQTYPE_CLASS | USB_REQTYPE_OTHER_OUT, - USB_REQUEST_CLEAR_FEATURE, PORT_ENABLE, i + 1, - 0, NULL, 0, NULL); + DisablePort(i); } } else { // Device removed... diff --git a/src/add-ons/kernel/bus_managers/usb/Stack.cpp b/src/add-ons/kernel/bus_managers/usb/Stack.cpp index ee47742d02..cb27c43d20 100644 --- a/src/add-ons/kernel/bus_managers/usb/Stack.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Stack.cpp @@ -259,6 +259,13 @@ Stack::IndexOfBusManager(BusManager *busManager) } +BusManager * +Stack::BusManagerAt(int32 index) +{ + return fBusManagers.ElementAt(index); +} + + status_t Stack::AllocateChunk(void **logicalAddress, void **physicalAddress, size_t size) { diff --git a/src/add-ons/kernel/bus_managers/usb/usb_p.h b/src/add-ons/kernel/bus_managers/usb/usb_p.h index 2b222318aa..b80d436c82 100644 --- a/src/add-ons/kernel/bus_managers/usb/usb_p.h +++ b/src/add-ons/kernel/bus_managers/usb/usb_p.h @@ -14,7 +14,7 @@ #include "usbspec_p.h" #include - +//#define TRACE_USB #ifdef TRACE_USB #define TRACE(x) dprintf x #define TRACE_ERROR(x) dprintf x @@ -115,6 +115,7 @@ public: void AddBusManager(BusManager *bus); int32 IndexOfBusManager(BusManager *bus); + BusManager *BusManagerAt(int32 index); status_t AllocateChunk(void **logicalAddress, void **physicalAddress, size_t size); @@ -497,8 +498,13 @@ virtual status_t GetDescriptor(uint8 descriptorType, void *data, size_t dataLength, size_t *actualLength); + Device *ChildAt(uint8 index) + { return fChildren[index]; }; + status_t UpdatePortStatus(uint8 index); status_t ResetPort(uint8 index); + status_t DisablePort(uint8 index); + void Explore(change_item **changeList); static void InterruptCallback(void *cookie, status_t status, void *data, @@ -518,9 +524,9 @@ private: InterruptPipe *fInterruptPipe; usb_hub_descriptor fHubDescriptor; - usb_port_status fInterruptStatus[8]; - usb_port_status fPortStatus[8]; - Device *fChildren[8]; + usb_port_status fInterruptStatus[USB_MAX_PORT_COUNT]; + usb_port_status fPortStatus[USB_MAX_PORT_COUNT]; + Device *fChildren[USB_MAX_PORT_COUNT]; }; diff --git a/src/add-ons/kernel/bus_managers/usb/usbspec_p.h b/src/add-ons/kernel/bus_managers/usb/usbspec_p.h index 11cd58c132..9327ffdcce 100644 --- a/src/add-ons/kernel/bus_managers/usb/usbspec_p.h +++ b/src/add-ons/kernel/bus_managers/usb/usbspec_p.h @@ -17,6 +17,7 @@ #define USB_MAX_AREAS 8 #define USB_MAX_FRAGMENT_SIZE B_PAGE_SIZE * 96 +#define USB_MAX_PORT_COUNT 16 #define USB_DELAY_BUS_RESET 100000 #define USB_DELAY_DEVICE_POWER_UP 300000