diff --git a/drivers/usb/usbccgp/fdo.c b/drivers/usb/usbccgp/fdo.c index 833893b3509..ea48824233a 100644 --- a/drivers/usb/usbccgp/fdo.c +++ b/drivers/usb/usbccgp/fdo.c @@ -189,8 +189,15 @@ FDO_CreateChildPdo( } /* Create pdo for each function */ - for(Index = 0; Index < FDODeviceExtension->FunctionDescriptorCount; Index++) + for (Index = 0; Index < FDODeviceExtension->FunctionDescriptorCount; Index++) { + if (FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces == 0) + { + // Ignore invalid devices + DPRINT1("[USBCCGP] Found descriptor with 0 interfaces\n"); + continue; + } + /* Create the PDO */ Status = IoCreateDevice(FDODeviceExtension->DriverObject, sizeof(PDO_DEVICE_EXTENSION), diff --git a/drivers/usb/usbccgp/function.c b/drivers/usb/usbccgp/function.c index 63817c53728..a738edb052c 100644 --- a/drivers/usb/usbccgp/function.c +++ b/drivers/usb/usbccgp/function.c @@ -607,10 +607,10 @@ NTSTATUS USBCCGP_LegacyEnum( IN PDEVICE_OBJECT DeviceObject) { - ULONG Index; + ULONG Index, SubIndex; PFDO_DEVICE_EXTENSION FDODeviceExtension; NTSTATUS Status = STATUS_SUCCESS; - PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, NextInterfaceDescriptor; // // get device extension @@ -639,7 +639,7 @@ USBCCGP_LegacyEnum( // // init function descriptors // - FDODeviceExtension->FunctionDescriptorCount = 0; + FDODeviceExtension->FunctionDescriptorCount = FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; for (Index = 0; Index < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces; Index++) { // get interface descriptor @@ -654,24 +654,66 @@ USBCCGP_LegacyEnum( return STATUS_UNSUCCESSFUL; } - // - // init function descriptor - // - FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index; - FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1; - FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * 1); - if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList) + SubIndex = 0; + if (InterfaceDescriptor->bInterfaceClass == USB_DEVICE_CLASS_AUDIO) + { + // AUDIO CLASS lets group all audio interfaces together + // + // init function descriptor + // + FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index; + FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1; + FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR) * FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces); + if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList) + { + // + // no memory + // + FreeItem(FDODeviceExtension->FunctionDescriptor); + FDODeviceExtension->FunctionDescriptor = NULL; + FDODeviceExtension->FunctionDescriptorCount = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + + // + // store interface descriptor + // + FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[SubIndex] = InterfaceDescriptor; + while (TRUE) + { + NextInterfaceDescriptor = USBD_ParseConfigurationDescriptorEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->ConfigurationDescriptor, Index + SubIndex + 1, 0, -1, -1, -1); + if (!NextInterfaceDescriptor || NextInterfaceDescriptor->bInterfaceClass != USB_DEVICE_CLASS_AUDIO) + { + // end of collection + break; + } + SubIndex++; + ASSERT(SubIndex < FDODeviceExtension->ConfigurationDescriptor->bNumInterfaces); + FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces++; + FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[SubIndex] = NextInterfaceDescriptor; + } + } + else { // - // no memory + // init function descriptor // - return STATUS_INSUFFICIENT_RESOURCES; - } + FDODeviceExtension->FunctionDescriptor[Index].FunctionNumber = Index; + FDODeviceExtension->FunctionDescriptor[Index].NumberOfInterfaces = 1; + FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList = AllocateItem(NonPagedPool, sizeof(PUSB_INTERFACE_DESCRIPTOR)); + if (!FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList) + { + // + // no memory + // + return STATUS_INSUFFICIENT_RESOURCES; + } - // - // store interface descriptor - // - FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[0] = InterfaceDescriptor; + // + // store interface descriptor + // + FDODeviceExtension->FunctionDescriptor[Index].InterfaceDescriptorList[0] = InterfaceDescriptor; + } // // now init the device ids @@ -685,11 +727,10 @@ USBCCGP_LegacyEnum( DPRINT1("[USBCCGP] Failed to init ids with %lx\n", Status); return Status; } - // - // store function count + // increment interface count // - FDODeviceExtension->FunctionDescriptorCount++; + Index += SubIndex; } // @@ -734,7 +775,7 @@ USBCCGP_EnumWithAudioLegacy( DPRINT1("Index %lu Descriptor %p\n", Index, InterfaceDescriptor); ASSERT(InterfaceDescriptor); - if (InterfaceDescriptor->bInterfaceClass != 0x1) + if (InterfaceDescriptor->bInterfaceClass != USB_DEVICE_CLASS_AUDIO) { // // collection contains non audio class diff --git a/drivers/usb/usbccgp/pdo.c b/drivers/usb/usbccgp/pdo.c index da73ed12ba6..514c441f74a 100644 --- a/drivers/usb/usbccgp/pdo.c +++ b/drivers/usb/usbccgp/pdo.c @@ -769,7 +769,8 @@ USBCCGP_PDOSelectConfiguration( Entry = NULL; do { - 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); + 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 diff --git a/drivers/usb/usbccgp/usbccgp.h b/drivers/usb/usbccgp/usbccgp.h index 04ce3493336..994df91cda1 100644 --- a/drivers/usb/usbccgp/usbccgp.h +++ b/drivers/usb/usbccgp/usbccgp.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include diff --git a/drivers/usb/usbport/endpoint.c b/drivers/usb/usbport/endpoint.c index 1a8d77e362c..699dac24670 100644 --- a/drivers/usb/usbport/endpoint.c +++ b/drivers/usb/usbport/endpoint.c @@ -778,12 +778,13 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice, USBPORT_ENDPOINT_REQUIREMENTS EndpointRequirements = {0}; PUSBPORT_COMMON_BUFFER_HEADER HeaderBuffer; MPSTATUS MpStatus; - USBD_STATUS USBDStatus; + USBD_STATUS USBDStatus = USBD_STATUS_SUCCESS; NTSTATUS Status; KIRQL OldIrql; USHORT MaxPacketSize; USHORT AdditionalTransaction; BOOLEAN IsAllocatedBandwidth; + ULONG RetryCount; DPRINT1("USBPORT_OpenPipe: DeviceHandle - %p, FdoDevice - %p, PipeHandle - %p\n", DeviceHandle, @@ -1074,7 +1075,8 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice, KeReleaseSpinLock(&Endpoint->EndpointSpinLock, Endpoint->EndpointOldIrql); - while (TRUE) + /* Wait maximum 1 second for the endpoint to be active */ + for (RetryCount = 0; RetryCount < 1000; RetryCount++) { KeAcquireSpinLock(&Endpoint->EndpointSpinLock, &Endpoint->EndpointOldIrql); @@ -1091,6 +1093,11 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice, USBPORT_Wait(FdoDevice, 1); // 1 msec. } + if (State != USBPORT_ENDPOINT_ACTIVE) + { + DPRINT1("Timeout State %x\n", State); + USBDStatus = USBD_STATUS_TIMEOUT; + } } } else @@ -1103,10 +1110,6 @@ USBPORT_OpenPipe(IN PDEVICE_OBJECT FdoDevice, { USBDStatus = USBD_STATUS_INSUFFICIENT_RESOURCES; } - else - { - USBDStatus = USBD_STATUS_SUCCESS; - } } if (UsbdStatus)