Author: janderwald Date: Sat Mar 3 15:08:28 2012 New Revision: 55966
URL: http://svn.reactos.org/svn/reactos?rev=55966&view=rev Log: [USBCCG] - Remove hacks - Include alternate interface descriptors in the configuration descriptor
Modified: trunk/reactos/drivers/usb/usbccgp/descriptor.c trunk/reactos/drivers/usb/usbccgp/function.c trunk/reactos/drivers/usb/usbccgp/pdo.c
Modified: trunk/reactos/drivers/usb/usbccgp/descriptor.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbccgp/descrip... ============================================================================== --- trunk/reactos/drivers/usb/usbccgp/descriptor.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbccgp/descriptor.c [iso-8859-1] Sat Mar 3 15:08:28 2012 @@ -220,76 +220,32 @@ return Status; }
-ULONG -CountInterfaceDescriptors( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor) -{ - PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; - PVOID CurrentPosition; - ULONG Count = 0; - - // - // enumerate all interfaces - // - CurrentPosition = ConfigurationDescriptor; - do - { - // - // find next descriptor - // - InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, CurrentPosition, -1, -1, -1, -1, -1); - if (!InterfaceDescriptor) - break; - - // - // advance to next descriptor - // - CurrentPosition = (PVOID)((ULONG_PTR)InterfaceDescriptor + InterfaceDescriptor->bLength); - - // - // increment descriptor count - // - Count++; - - }while(TRUE); - - // - // done - // - return Count; -} - NTSTATUS AllocateInterfaceDescriptorsArray( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, OUT PUSB_INTERFACE_DESCRIPTOR **OutArray) { PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; - PVOID CurrentPosition; ULONG Count = 0; PUSB_INTERFACE_DESCRIPTOR *Array;
- Count = CountInterfaceDescriptors(ConfigurationDescriptor); - ASSERT(Count); - // // allocate array // - Array = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * Count); + Array = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * ConfigurationDescriptor->bNumInterfaces); if (!Array) return STATUS_INSUFFICIENT_RESOURCES;
// // enumerate all interfaces // - CurrentPosition = ConfigurationDescriptor; Count = 0; do { // // find next descriptor // - InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, CurrentPosition, -1, -1, -1, -1, -1); + InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, ConfigurationDescriptor, Count, 0, -1, -1, -1); if (!InterfaceDescriptor) break;
@@ -298,11 +254,6 @@ // Array[Count] = InterfaceDescriptor; Count++; - - // - // advance to next descriptor - // - CurrentPosition = (PVOID)((ULONG_PTR)InterfaceDescriptor + InterfaceDescriptor->bLength);
}while(TRUE);
Modified: trunk/reactos/drivers/usb/usbccgp/function.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbccgp/functio... ============================================================================== --- trunk/reactos/drivers/usb/usbccgp/function.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbccgp/function.c [iso-8859-1] Sat Mar 3 15:08:28 2012 @@ -711,7 +711,6 @@ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, FirstDescriptor = NULL; PFDO_DEVICE_EXTENSION FDODeviceExtension; NTSTATUS Status = STATUS_SUCCESS; - PVOID StartPosition;
// // get device extension @@ -723,21 +722,15 @@ // // first check if all interfaces belong to the same audio class // - StartPosition = FDODeviceExtension->ConfigurationDescriptor; - for(Index = 0; Index < CountInterfaceDescriptors(FDODeviceExtension->ConfigurationDescriptor); Index++) + for(Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++) { // // get interface descriptor // - InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, StartPosition, -1, -1, -1, -1, -1); + InterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index, 0, -1, -1, -1); DPRINT1("Index %lu Descriptor %p\n", Index, InterfaceDescriptor); ASSERT(InterfaceDescriptor);
- // - // move to next descriptor - // - StartPosition = (PVOID)((ULONG_PTR)InterfaceDescriptor + InterfaceDescriptor->bLength); - if (InterfaceDescriptor->bInterfaceClass != 0x1) { // @@ -816,7 +809,7 @@ // // number of interfaces // - FDODeviceExtension->FunctionDescriptor[0].NumberOfInterfaces = CountInterfaceDescriptors(FDODeviceExtension->ConfigurationDescriptor); + FDODeviceExtension->FunctionDescriptor[0].NumberOfInterfaces = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces;
// // store function count
Modified: trunk/reactos/drivers/usb/usbccgp/pdo.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbccgp/pdo.c?r... ============================================================================== --- trunk/reactos/drivers/usb/usbccgp/pdo.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbccgp/pdo.c [iso-8859-1] Sat Mar 3 15:08:28 2012 @@ -460,6 +460,7 @@ PURB Urb; PVOID Buffer; PUCHAR BufferPtr; + UCHAR InterfaceNumber;
// // get current stack location @@ -489,6 +490,7 @@ // get current interface descriptor // InterfaceDescriptor = PDODeviceExtension->FunctionDescriptor->InterfaceDescriptorList[Index]; + InterfaceNumber = InterfaceDescriptor->bInterfaceNumber;
// // add to size and move to next descriptor @@ -513,10 +515,17 @@ { if (InterfaceDescriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE) { + if (InterfaceNumber != InterfaceDescriptor->bInterfaceNumber) + { + // + // reached next descriptor + // + break; + } + // - // reached next descriptor + // include alternate descriptor // - break; }
// @@ -557,6 +566,7 @@ // get current interface descriptor // InterfaceDescriptor = PDODeviceExtension->FunctionDescriptor->InterfaceDescriptorList[Index]; + InterfaceNumber = InterfaceDescriptor->bInterfaceNumber;
// // copy descriptor and move to next descriptor @@ -582,10 +592,18 @@ { if (InterfaceDescriptor->bDescriptorType == USB_INTERFACE_DESCRIPTOR_TYPE) { + if (InterfaceNumber != InterfaceDescriptor->bInterfaceNumber) + { + // + // reached next descriptor + // + break; + } + // - // reached next descriptor + // include alternate descriptor // - break; + DPRINT("InterfaceDescriptor %p Alternate %x InterfaceNumber %x\n", InterfaceDescriptor, InterfaceDescriptor->bAlternateSetting, InterfaceDescriptor->bInterfaceNumber); }
// @@ -645,7 +663,7 @@ PPDO_DEVICE_EXTENSION PDODeviceExtension; PURB Urb, NewUrb; PUSBD_INTERFACE_INFORMATION InterfaceInformation; - ULONG InterfaceInformationCount, Index, InterfaceIndex; + ULONG InterfaceIndex, Length; PUSBD_INTERFACE_LIST_ENTRY Entry; ULONG NeedSelect, FoundInterface; NTSTATUS Status; @@ -677,28 +695,25 @@ return STATUS_SUCCESS; }
- // - // count interface information - // - InterfaceInformationCount = 0; + // sanity checks + //C_ASSERT(sizeof(struct _URB_HEADER) == 16); + //C_ASSERT(FIELD_OFFSET(struct _URB_SELECT_CONFIGURATION, Interface.Length) == 24); + //C_ASSERT(sizeof(USBD_INTERFACE_INFORMATION) == 36); + //C_ASSERT(sizeof(struct _URB_SELECT_CONFIGURATION) == 0x3C); + + // available buffer length + Length = Urb->UrbSelectConfiguration.Hdr.Length - FIELD_OFFSET(struct _URB_SELECT_CONFIGURATION, Interface.Length); + + // + // check all interfaces + // InterfaceInformation = &Urb->UrbSelectConfiguration.Interface; + + Entry = NULL; do { - InterfaceInformationCount++; - InterfaceInformation = (PUSBD_INTERFACE_INFORMATION)((ULONG_PTR)InterfaceInformation + InterfaceInformation->Length); - }while((ULONG_PTR)InterfaceInformation < (ULONG_PTR)Urb + Urb->UrbSelectConfiguration.Hdr.Length); - - // - // check all interfaces - // - InterfaceInformation = &Urb->UrbSelectConfiguration.Interface; - Index = 0; - Entry = NULL; - DPRINT("Count %x\n", InterfaceInformationCount); - do - { - DPRINT1("[USBCCGP] SelectConfiguration Function %x InterfaceNumber %x Alternative %x\n", PDODeviceExtension->FunctionDescriptor->FunctionNumber, InterfaceInformation->InterfaceNumber, InterfaceInformation->AlternateSetting); - + DPRINT1("[USBCCGP] SelectConfiguration Function %x InterfaceNumber %x Alternative %x Length %lu InterfaceInformation->Length %lu\n", PDODeviceExtension->FunctionDescriptor->FunctionNumber, InterfaceInformation->InterfaceNumber, InterfaceInformation->AlternateSetting, Length, InterfaceInformation->Length); + ASSERT(InterfaceInformation->Length); // // search for the interface in the local interface list // @@ -778,7 +793,19 @@ // // interface is already selected // - RtlCopyMemory(InterfaceInformation, Entry->Interface, min(InterfaceInformation->Length, Entry->Interface->Length)); + ASSERT(Length >= Entry->Interface->Length); + RtlCopyMemory(InterfaceInformation, Entry->Interface, Entry->Interface->Length); + + // + // adjust remaining buffer size + // + ASSERT(Entry->Interface->Length); + Length -= Entry->Interface->Length; + + // + // move to next output interface information + // + InterfaceInformation = (PUSBD_INTERFACE_INFORMATION)((ULONG_PTR)InterfaceInformation + Entry->Interface->Length); } else { @@ -811,23 +838,37 @@ Status = USBCCGP_SyncUrbRequest(PDODeviceExtension->NextDeviceObject, NewUrb); DPRINT1("SelectInterface Status %x\n", Status);
- // - // did it succeeed - // - if (NT_SUCCESS(Status)) - { - // - // update configuration info - // - ASSERT(Entry->Interface->Length == NewUrb->UrbSelectInterface.Interface.Length); - ASSERT(InterfaceInformation->Length == NewUrb->UrbSelectInterface.Interface.Length); - RtlCopyMemory(Entry->Interface, &NewUrb->UrbSelectInterface.Interface, NewUrb->UrbSelectInterface.Interface.Length); - - // - // update provided interface information - // - RtlCopyMemory(InterfaceInformation, Entry->Interface, Entry->Interface->Length); - } + if (!NT_SUCCESS(Status)) + { + // + // failed + // + break; + } + + // + // update configuration info + // + ASSERT(Entry->Interface->Length >= NewUrb->UrbSelectInterface.Interface.Length); + ASSERT(Length >= NewUrb->UrbSelectInterface.Interface.Length); + RtlCopyMemory(Entry->Interface, &NewUrb->UrbSelectInterface.Interface, NewUrb->UrbSelectInterface.Interface.Length); + + // + // update provided interface information + // + ASSERT(Length >= Entry->Interface->Length); + RtlCopyMemory(InterfaceInformation, Entry->Interface, Entry->Interface->Length); + + // + // decrement remaining buffer size + // + ASSERT(Entry->Interface->Length); + Length -= Entry->Interface->Length; + + // + // adjust output buffer offset + // + InterfaceInformation = (PUSBD_INTERFACE_INFORMATION)((ULONG_PTR)InterfaceInformation + Entry->Interface->Length);
// // free urb @@ -835,12 +876,7 @@ FreeItem(NewUrb); }
- // - // move to next information - // - InterfaceInformation = (PUSBD_INTERFACE_INFORMATION)((ULONG_PTR)InterfaceInformation + InterfaceInformation->Length); - Index++; - }while(Index < InterfaceInformationCount); + }while(Length);
// // store configuration handle