Report correctly USB device class and subclass when the device reports only one interface and the class is not defined in the device descriptor Modified: trunk/reactos/drivers/usb/usbhub/fdo.c _____
Modified: trunk/reactos/drivers/usb/usbhub/fdo.c --- trunk/reactos/drivers/usb/usbhub/fdo.c 2005-09-23 08:55:33 UTC (rev 18005) +++ trunk/reactos/drivers/usb/usbhub/fdo.c 2005-09-23 09:02:16 UTC (rev 18006) @@ -110,13 +110,11 @@
if (!NT_SUCCESS(Status)) goto ByeBye; - DPRINT1("child #%lu: USB\Vid_%04x&Pid_%04x&Rev_%04x (class %x:%x)\n", + DPRINT1("child #%lu: USB\Vid_%04x&Pid_%04x&Rev_%04x\n", i, PdoExtension->dev->descriptor.idVendor, PdoExtension->dev->descriptor.idProduct, - PdoExtension->dev->descriptor.bcdDevice, - PdoExtension->dev->descriptor.bDeviceClass, - PdoExtension->dev->descriptor.bDeviceSubClass); + PdoExtension->dev->descriptor.bcdDevice); sprintf(Buffer[0], "USB\Vid_%04x&Pid_%04x&Rev_%04x", PdoExtension->dev->descriptor.idVendor, PdoExtension->dev->descriptor.idProduct, @@ -139,15 +137,33 @@ if (PdoExtension->dev->actconfig->desc.bNumInterfaces == 1) { /* Single-interface USB device */ - sprintf(Buffer[0], "USB\Class_%02x&SubClass_%02x&Prot_%02x", - PdoExtension->dev->descriptor.bDeviceClass, - PdoExtension->dev->descriptor.bDeviceSubClass, - PdoExtension->dev->descriptor.bDeviceProtocol); - sprintf(Buffer[1], "USB\Class_%02x&SubClass_%02x", - PdoExtension->dev->descriptor.bDeviceClass, - PdoExtension->dev->descriptor.bDeviceSubClass); - sprintf(Buffer[2], "USB\Class_%02x", - PdoExtension->dev->descriptor.bDeviceClass); + if (PdoExtension->dev->descriptor.bDeviceClass != 0) + { + /* Use these values for device class/sub class/protocol */ + sprintf(Buffer[0], "USB\Class_%02x&SubClass_%02x&Prot_%02x", + PdoExtension->dev->descriptor.bDeviceClass, + PdoExtension->dev->descriptor.bDeviceSubClass, + PdoExtension->dev->descriptor.bDeviceProtocol); + sprintf(Buffer[1], "USB\Class_%02x&SubClass_%02x", + PdoExtension->dev->descriptor.bDeviceClass, + PdoExtension->dev->descriptor.bDeviceSubClass); + sprintf(Buffer[2], "USB\Class_%02x", + PdoExtension->dev->descriptor.bDeviceClass); + } + else + { + /* Use values specified in the interface descriptor */ + struct usb_host_interface *itf = PdoExtension->dev->actconfig->interface->altsetting; + sprintf(Buffer[0], "USB\Class_%02x&SubClass_%02x&Prot_%02x", + itf->desc.bInterfaceClass, + itf->desc.bInterfaceSubClass, + itf->desc.bInterfaceProtocol); + sprintf(Buffer[1], "USB\Class_%02x&SubClass_%02x", + itf->desc.bInterfaceClass, + itf->desc.bInterfaceSubClass); + sprintf(Buffer[2], "USB\Class_%02x", + itf->desc.bInterfaceClass); + } Status = UsbhubInitMultiSzString( &PdoExtension->CompatibleIds, Buffer[0], Buffer[1], Buffer[2], NULL);