Author: mmlr Date: 2011-06-07 02:25:58 +0200 (Tue, 07 Jun 2011) New Revision: 42002 Changeset: https://dev.haiku-os.org/changeset/42002 Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h Log: Move the quirky device detection out of the HIDDevice constructor and into the usb_hid_device_added hook so that we can actually detect non-HID devices at all. Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp 2011-06-06 23:54:01 UTC (rev 42001) +++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/Driver.cpp 2011-06-07 00:25:58 UTC (rev 42002) @@ -82,10 +82,33 @@ i, interfaceClass, interface->descr->interface_subclass, interface->descr->interface_protocol); - if (interfaceClass == USB_INTERFACE_CLASS_HID) { + // check for quirky devices first + int32 quirkyIndex = -1; + for (int32 j = 0; j < gQuirkyDeviceCount; j++) { + usb_hid_quirky_device &quirky = gQuirkyDevices[j]; + if ((quirky.vendor_id != 0 + && deviceDescriptor->vendor_id != quirky.vendor_id) + || (quirky.product_id != 0 + && deviceDescriptor->product_id != quirky.product_id) + || (quirky.device_class != 0 + && interfaceClass != quirky.device_class) + || (quirky.device_subclass != 0 + && interface->descr->interface_subclass + != quirky.device_subclass) + || (quirky.device_protocol != 0 + && interface->descr->interface_protocol + != quirky.device_protocol)) { + continue; + } + + quirkyIndex = j; + break; + } + + if (quirkyIndex >= 0 || interfaceClass == USB_INTERFACE_CLASS_HID) { mutex_lock(&sDriverLock); HIDDevice *hidDevice - = new(std::nothrow) HIDDevice(device, config, i); + = new(std::nothrow) HIDDevice(device, config, i, quirkyIndex); if (hidDevice != NULL && hidDevice->InitCheck() == B_OK) { hidDevice->SetParentCookie(parentCookie); Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp 2011-06-06 23:54:01 UTC (rev 42001) +++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp 2011-06-07 00:25:58 UTC (rev 42002) @@ -24,7 +24,7 @@ HIDDevice::HIDDevice(usb_device device, const usb_configuration_info *config, - size_t interfaceIndex) + size_t interfaceIndex, int32 quirkyIndex) : fStatus(B_NO_INIT), fDevice(device), fInterfaceIndex(interfaceIndex), @@ -44,25 +44,18 @@ const usb_device_descriptor *deviceDescriptor = gUSBModule->get_device_descriptor(device); - // check for quirky devices first and don't bother in that case HIDWriter descriptorWriter; bool hasFixedDescriptor = false; - quirky_init_function quirkyInit = NULL; - for (int32 i = 0; i < gQuirkyDeviceCount; i++) { - usb_hid_quirky_device &quirky = gQuirkyDevices[i]; - if (deviceDescriptor->vendor_id == quirky.vendor_id - && deviceDescriptor->product_id == quirky.product_id) { + if (quirkyIndex >= 0) { + quirky_build_descriptor quirkyBuildDescriptor + = gQuirkyDevices[quirkyIndex].build_descriptor; - quirkyInit = quirky.init_function; - if (quirky.build_descriptor != NULL - && quirky.build_descriptor(descriptorWriter) == B_OK) { + if (quirkyBuildDescriptor != NULL + && quirkyBuildDescriptor(descriptorWriter) == B_OK) { - reportDescriptor = (uint8 *)descriptorWriter.Buffer(); - descriptorLength = descriptorWriter.BufferLength(); - hasFixedDescriptor = true; - } - - break; + reportDescriptor = (uint8 *)descriptorWriter.Buffer(); + descriptorLength = descriptorWriter.BufferLength(); + hasFixedDescriptor = true; } } @@ -176,10 +169,15 @@ return; } - if (quirkyInit != NULL) { - fStatus = quirkyInit(device, config, interfaceIndex); - if (fStatus != B_OK) - return; + if (quirkyIndex >= 0) { + quirky_init_function quirkyInit + = gQuirkyDevices[quirkyIndex].init_function; + + if (quirkyInit != NULL) { + fStatus = quirkyInit(device, config, interfaceIndex); + if (fStatus != B_OK) + return; + } } ProtocolHandler::AddHandlers(*this, fProtocolHandlerList, Modified: haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h 2011-06-06 23:54:01 UTC (rev 42001) +++ haiku/trunk/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h 2011-06-07 00:25:58 UTC (rev 42002) @@ -18,7 +18,7 @@ public: HIDDevice(usb_device device, const usb_configuration_info *config, - size_t interfaceIndex); + size_t interfaceIndex, int32 quirkyIndex); ~HIDDevice(); void SetParentCookie(int32 cookie);