diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index 881e97809de..9d941cee067 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -19,6 +19,13 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO ULONG CStatus; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext; + + if (!FdoDeviceExtension->Pdo) + { + DPRINT1("PDO not set yet!\n"); + return; + } + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension; CStatus = (ULONG) SystemArgument2; @@ -80,7 +87,8 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i))); PdoDeviceExtension->ChildDeviceCount++; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED | USB_PORT_STATUS_CONNECT; + PdoDeviceExtension->Ports[i].PortStatus &= ~0x8000; + PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT; PdoDeviceExtension->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; PdoDeviceExtension->HaltQueue = FALSE; @@ -194,7 +202,7 @@ StartEhci(PDEVICE_OBJECT DeviceObject) LONG tmp2; ULONG base; - DPRINT1("Starting Ehci controller\n"); + DPRINT("Starting Ehci controller\n"); FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; base = (ULONG)FdoDeviceExtension->ResourceMemory; @@ -408,6 +416,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART /* Zeroize it */ RtlZeroMemory(FdoDeviceExtension->PeriodicFramList, sizeof(ULONG) * 1024); + ExInitializeFastMutex(&FdoDeviceExtension->FrameListMutex); + /* Allocate Common Buffer for Async List Head Queue */ FdoDeviceExtension->AsyncListQueueHeadPtr = FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter, @@ -427,6 +437,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART /* FIXME: Same as FIXME above */ 20800); + ExInitializeFastMutex(&FdoDeviceExtension->AsyncListMutex); + Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice, DevicePropertyAddress, sizeof(ULONG), @@ -540,6 +552,8 @@ FdoQueryBusRelations( DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + DPRINT1("Ehci: QueryBusRelations\n"); + /* Create the PDO with the next available number */ while (TRUE) { @@ -623,7 +637,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { case IRP_MN_START_DEVICE: { - DPRINT1("START_DEVICE\n"); + DPRINT1("Ehci: START_DEVICE\n"); Irp->IoStatus.Status = STATUS_SUCCESS; Status = ForwardAndWait(DeviceObject, Irp); @@ -634,20 +648,20 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) } case IRP_MN_QUERY_DEVICE_RELATIONS: { - DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + DPRINT1("Ehci: IRP_MN_QUERY_DEVICE_RELATIONS\n"); switch(Stack->Parameters.QueryDeviceRelations.Type) { case BusRelations: { PDEVICE_RELATIONS DeviceRelations = NULL; - DPRINT("BusRelations\n"); + DPRINT1("Ehci: BusRelations\n"); Status = FdoQueryBusRelations(DeviceObject, &DeviceRelations); Information = (ULONG_PTR)DeviceRelations; break; } default: { - DPRINT("Unknown query device relations type\n"); + DPRINT1("Ehci: Unknown query device relations type\n"); Status = STATUS_NOT_IMPLEMENTED; break; } @@ -656,16 +670,17 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) } case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: { - DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); + DPRINT1("Ehci: IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); return ForwardIrpAndForget(DeviceObject, Irp); break; } case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: { - DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); + DPRINT1("Ehci: IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); } case IRP_MN_QUERY_INTERFACE: { + DPRINT1("Ehci: IRP_MN_QUERY_INTERFACE\n"); Status = STATUS_SUCCESS; Information = 0; Status = ForwardIrpAndForget(DeviceObject, Irp); @@ -674,7 +689,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) } default: { - DPRINT1("IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction); + DPRINT1("Ehci: IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction); return ForwardIrpAndForget(DeviceObject, Irp); } } @@ -701,7 +716,7 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) PFDO_DEVICE_EXTENSION FdoDeviceExtension; - DPRINT("Ehci AddDevice\n"); + DPRINT1("Ehci: AddDevice\n"); /* Create the FDO with next available number */ while (TRUE) @@ -818,14 +833,14 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) if (!NT_SUCCESS(Status)) { DPRINT1("Unable to register device interface!\n"); - ASSERT(FALSE); + return Status; } else { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); DPRINT1("SetInterfaceState %x\n", Status); if (!NT_SUCCESS(Status)) - ASSERT(FALSE); + return Status; } Fdo->Flags &= ~DO_DEVICE_INITIALIZING; @@ -836,6 +851,7 @@ NTSTATUS NTAPI FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PFDO_DEVICE_EXTENSION FdoDeviceExtension; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; PIO_STACK_LOCATION Stack = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; ULONG_PTR Information = 0; @@ -843,6 +859,7 @@ FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) URB *Urb; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension; ASSERT(FdoDeviceExtension->Common.IsFdo == TRUE); @@ -851,25 +868,31 @@ FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) ASSERT(Stack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_SUBMIT_URB); Urb = (PURB) Stack->Parameters.Others.Argument1; - DPRINT("Header Length %d\n", Urb->UrbHeader.Length); - DPRINT("Header Function %d\n", Urb->UrbHeader.Function); + DPRINT1("Header Length %d\n", Urb->UrbHeader.Length); + DPRINT1("Header Function %d\n", Urb->UrbHeader.Function); - UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; + UsbDevice = DeviceHandleToUsbDevice(PdoDeviceExtension, Urb->UrbHeader.UsbdDeviceHandle); + if (!UsbDevice) + { + DPRINT1("Invalid DeviceHandle or device not connected\n"); + return STATUS_DEVICE_NOT_CONNECTED; + } switch (Urb->UrbHeader.Function) { case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: { - DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); + DPRINT1("Ehci: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); break; } case URB_FUNCTION_GET_STATUS_FROM_DEVICE: { - DPRINT1("URB_FUNCTION_GET_STATUS_FROM_DEVICE\n"); + DPRINT1("Ehci: URB_FUNCTION_GET_STATUS_FROM_DEVICE\n"); break; } case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: { + DPRINT1("Ehci: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n"); switch(Urb->UrbControlDescriptorRequest.DescriptorType) { case USB_DEVICE_DESCRIPTOR_TYPE: @@ -880,30 +903,63 @@ FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case USB_CONFIGURATION_DESCRIPTOR_TYPE: DPRINT1("USB CONFIG DESC\n"); + //break; case USB_STRING_DESCRIPTOR_TYPE: DPRINT1("Usb String Descriptor\n"); { USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; + PUSB_STRING_DESCRIPTOR UsbString; BOOLEAN ResultOk; CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; + CtrlSetup.bmRequestType._BM.Reserved = 0; CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST; CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; CtrlSetup.wValue.LowByte = Urb->UrbControlDescriptorRequest.Index; CtrlSetup.wValue.HiByte = Urb->UrbControlDescriptorRequest.DescriptorType; + if (Urb->UrbControlDescriptorRequest.DescriptorType == USB_STRING_DESCRIPTOR_TYPE) + { + if ((Urb->UrbControlDescriptorRequest.Index != UsbDevice->DeviceDescriptor.iManufacturer) && + (UsbDevice->DeviceDescriptor.iManufacturer) && + (UsbDevice->DeviceDescriptor.iSerialNumber)) + { + DPRINT1("Invalid Index\n"); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_PARAMETER; + Status = STATUS_SUCCESS; + Information = 0; + break; + } + CtrlSetup.wIndex.W = Urb->UrbControlDescriptorRequest.LanguageId; + RtlZeroMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, Urb->UrbControlDescriptorRequest.TransferBufferLength-1); + } else CtrlSetup.wIndex.W = 0; + CtrlSetup.wLength = Urb->UrbControlDescriptorRequest.TransferBufferLength; ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, UsbDevice->Address, UsbDevice->Port, Urb->UrbControlDescriptorRequest.TransferBuffer, Urb->UrbControlDescriptorRequest.TransferBufferLength); + if (Urb->UrbControlDescriptorRequest.DescriptorType == USB_STRING_DESCRIPTOR_TYPE) + { + UsbString = Urb->UrbControlDescriptorRequest.TransferBuffer; + DPRINT1("Index %x\n", Urb->UrbControlDescriptorRequest.Index); + DPRINT1("BufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + DPRINT1("Length %x\n", UsbString->bLength); + if (Urb->UrbControlDescriptorRequest.Index == 0) + { + DPRINT1("%x\n", (ULONG)Urb->UrbControlDescriptorRequest.TransferBuffer); + } + else + DPRINT1("String %S\n", &UsbString->bString); + } + UsbString = Urb->UrbControlDescriptorRequest.TransferBuffer; Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; Status = STATUS_SUCCESS; - + Information = UsbString->bLength; break; } default: @@ -915,12 +971,13 @@ FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case URB_FUNCTION_SELECT_CONFIGURATION: { - DPRINT1("Selecting Configuration\n"); + DPRINT1("Ehci: URB_FUNCTION_SELECT_CONFIGURATION\n"); DPRINT1("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); break; } case URB_FUNCTION_CLASS_DEVICE: { + DPRINT1("Ehci: URB_FUNCTION_CLASS_DEVICE %x\n",Urb->UrbControlVendorClassRequest.Request); switch (Urb->UrbControlVendorClassRequest.Request) { case USB_REQUEST_GET_DESCRIPTOR: @@ -999,6 +1056,7 @@ FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case URB_FUNCTION_CLASS_OTHER: { + DPRINT1("Ehci: URB_FUNCTION_CLASS_OTHER\n"); switch (Urb->UrbControlVendorClassRequest.Request) { case USB_REQUEST_GET_STATUS: @@ -1099,7 +1157,7 @@ FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } default: { - DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function); + DPRINT1("Ehci: Unhandled URB %x\n", Urb->UrbHeader.Function); //Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; } } diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index 99a601d8ebc..14ef600c98d 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -37,6 +37,7 @@ QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL)) { + DPRINT1("Cancelled!!!!???\n"); KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, OldIrql); Irp->IoStatus.Status = STATUS_CANCELLED; IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -175,15 +176,18 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) LONG i, j; DPRINT1("USB CONFIG DESC\n"); - if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength) { Urb->UrbControlDescriptorRequest.TransferBufferLength = UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength; } else { - DPRINT1("Buffer to small!!!\n"); - //ASSERT(FALSE); + DPRINT1("TransferBufferLenth %x is too small!!!\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + if (Urb->UrbControlDescriptorRequest.TransferBufferLength < sizeof(USB_CONFIGURATION_DESCRIPTOR)) + { + DPRINT1("Bail!\n"); + break; + } } ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer); @@ -191,6 +195,14 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) /* Copy the Configuration Descriptor */ RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); + + /* If there is no room for all the configs then bail */ + if (!(Urb->UrbControlDescriptorRequest.TransferBufferLength > sizeof(USB_CONFIGURATION_DESCRIPTOR))) + { + DPRINT1("Bail!\n"); + break; + } + BufPtr += sizeof(USB_CONFIGURATION_DESCRIPTOR); for (i = 0; i < UsbDevice->ActiveConfig->ConfigurationDescriptor.bNumInterfaces; i++) { @@ -348,6 +360,8 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; + + DPRINT1("Length %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength); ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); /* FIXME: Handle more than root hub? */ if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR)) @@ -383,7 +397,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) case USB_REQUEST_GET_STATUS: { DPRINT1("DEVICE: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - if (Urb->UrbControlVendorClassRequest.Index == 1) { ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); @@ -401,12 +414,17 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) } case URB_FUNCTION_CLASS_OTHER: { + + /* FIXME: Each one of these needs to make sure that the index value is a valid for a port (1-8) and return STATUS_UNSUCCESSFUL is not */ + switch (Urb->UrbControlVendorClassRequest.Request) { case USB_REQUEST_GET_STATUS: { DPRINT1("OTHER: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); + DPRINT1("PortStatus %x\n", DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus); + DPRINT1("PortChange %x\n", DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange); ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; break; @@ -443,7 +461,12 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) } case PORT_ENABLE: { - DPRINT1("Unhandled Set Feature\n"); + DPRINT1("PORT_ENABLE not implemented\n"); + break; + } + case PORT_POWER: + { + DPRINT1("PORT_POWER not implemented\n"); break; } default: diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 19e75345fd1..9576fba26a6 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -128,8 +128,12 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) URB *Urb; Urb = (PURB) Stack->Parameters.Others.Argument1; - DPRINT("Header Length %d\n", Urb->UrbHeader.Length); - DPRINT("Header Function %d\n", Urb->UrbHeader.Function); + + if ((Urb->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER) && + (Urb->UrbHeader.UsbdDeviceHandle == PdoDeviceExtension->UsbDevices[0])) + { + PdoDeviceExtension->HaltQueue = TRUE; + } /* Queue all request for now, kernel thread will complete them */ QueueURBRequest(PdoDeviceExtension, Irp); Information = 0; @@ -166,11 +170,11 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE: { - DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE); + DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2); if (Stack->Parameters.Others.Argument1) { /* Return the root hubs devicehandle */ - DPRINT1("Returning RootHub Handle %x\n", PdoDeviceExtension->UsbDevices[0]); + DPRINT("Returning RootHub Handle %x\n", PdoDeviceExtension->UsbDevices[0]); *(PVOID *)Stack->Parameters.Others.Argument1 = (PVOID)PdoDeviceExtension->UsbDevices[0]; Status = STATUS_SUCCESS; } @@ -182,13 +186,13 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { - DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); + DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); ASSERT(Stack->Parameters.Others.Argument1 != NULL); if (Stack->Parameters.Others.Argument1) { /* FIXME: Determine the number of hubs between the usb device and root hub */ DPRINT1("RootHubCount %x\n", *(PULONG)Stack->Parameters.Others.Argument1); - *(PULONG)Stack->Parameters.Others.Argument1 = 0; + *(PULONG)Stack->Parameters.Others.Argument1 = 1; } Status = STATUS_SUCCESS; break; @@ -215,8 +219,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO: { - DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); - + DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO Arg1 %x, Arg2 %x\n", Stack->Parameters.Others.Argument1, Stack->Parameters.Others.Argument2); if (Stack->Parameters.Others.Argument1) *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; if (Stack->Parameters.Others.Argument2) @@ -229,7 +232,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: { PUSB_IDLE_CALLBACK_INFO CallBackInfo; - DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); + DPRINT1("Ehci: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); /* FIXME: Set Callback for safe power down */ CallBackInfo = Stack->Parameters.DeviceIoControl.Type3InputBuffer; DPRINT1("IdleCallback %x\n", CallBackInfo->IdleCallback); @@ -368,6 +371,7 @@ PdoDispatchPnp( UNICODE_STRING InterfaceSymLinkName; LONG i; + DPRINT1("Ehci: PDO StartDevice\n"); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; @@ -376,8 +380,11 @@ PdoDispatchPnp( for (i = 0; i < 8; i++) { - PdoDeviceExtension->Ports[i].PortStatus = USB_PORT_STATUS_ENABLE; + PdoDeviceExtension->Ports[i].PortStatus = USB_PORT_STATUS_HIGH_SPEED | 0x8000; PdoDeviceExtension->Ports[i].PortChange = 0; + + if (!FdoDeviceExtension->ECHICaps.HCSParams.PortPowerControl) + PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_POWER; } RtlCopyMemory(&RootHubDevice->DeviceDescriptor, @@ -441,13 +448,13 @@ PdoDispatchPnp( if (!NT_SUCCESS(Status)) { DPRINT1("Failed to register interface\n"); - ASSERT(FALSE); + return Status; } else { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); if (!NT_SUCCESS(Status)) - ASSERT(FALSE); + return Status; } Status = STATUS_SUCCESS; @@ -455,6 +462,7 @@ PdoDispatchPnp( } case IRP_MN_QUERY_DEVICE_RELATIONS: { + DPRINT1("Ehci: PDO QueryDeviceRelations\n"); switch (Stack->Parameters.QueryDeviceRelations.Type) { case TargetDeviceRelation: @@ -499,6 +507,7 @@ PdoDispatchPnp( } case IRP_MN_QUERY_CAPABILITIES: { + DPRINT("Ehci: PDO Query Capabilities\n"); PDEVICE_CAPABILITIES DeviceCapabilities; ULONG i; @@ -538,6 +547,7 @@ PdoDispatchPnp( case IRP_MN_QUERY_ID: { + DPRINT("Ehci: PDO Query ID\n"); Status = PdoQueryId(DeviceObject, Irp, &Information); break; } @@ -549,6 +559,8 @@ PdoDispatchPnp( PPDO_DEVICE_EXTENSION PdoDeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExtension; + DPRINT("Ehci: PDO Query Interface\n"); + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; @@ -558,10 +570,6 @@ PdoDispatchPnp( DPRINT1("Failed to create string from GUID!\n"); } - DPRINT("Interface GUID requested %wZ\n", &GuidString); - DPRINT("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); - DPRINT("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); - /* Assume success */ Status = STATUS_SUCCESS; Information = 0; diff --git a/reactos/drivers/usb/usbehci/urbreq.c b/reactos/drivers/usb/usbehci/urbreq.c index 86a88a899ea..b623cd02840 100644 --- a/reactos/drivers/usb/usbehci/urbreq.c +++ b/reactos/drivers/usb/usbehci/urbreq.c @@ -125,6 +125,8 @@ ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_S DPRINT1("ExecuteControlRequest: Buffer %x, Length %x\n", Buffer, BufferLength); + ExAcquireFastMutex(&DeviceExtension->AsyncListMutex); + Base = (ULONG) DeviceExtension->ResourceMemory; /* Set up the QUEUE HEAD in memory */ @@ -142,6 +144,7 @@ ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_S QueueHead->EndPointCapabilities2.PortNumber = Port; QueueHead->EndPointCapabilities1.DeviceAddress = Address; + CtrlSetup->bmRequestType._BM.Recipient = SetupPacket->bmRequestType._BM.Recipient; CtrlSetup->bmRequestType._BM.Type = SetupPacket->bmRequestType._BM.Type; CtrlSetup->bmRequestType._BM.Dir = SetupPacket->bmRequestType._BM.Dir; @@ -208,5 +211,8 @@ ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_S DPRINT1("Unable to copy data to buffer\n"); } + + ExReleaseFastMutex(&DeviceExtension->AsyncListMutex); + return TRUE; } diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index 1867763de20..e47091b2359 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -390,6 +390,9 @@ typedef struct _FDO_DEVICE_EXTENSION PHYSICAL_ADDRESS PeriodicFramListPhysAddr; PHYSICAL_ADDRESS AsyncListQueueHeadPtrPhysAddr; + FAST_MUTEX AsyncListMutex; + FAST_MUTEX FrameListMutex; + BOOLEAN AsyncComplete; PULONG ResourceBase; diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c index 5b4c5b4555c..500c9493618 100644 --- a/reactos/drivers/usb/usbehci/usbiffn.c +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -14,6 +14,7 @@ PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) { PUSB_DEVICE UsbDevicePointer = NULL; + UsbDevicePointer = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); if (!UsbDevicePointer) @@ -42,14 +43,14 @@ VOID USB_BUSIFFN InterfaceReference(PVOID BusContext) { - DPRINT1("InterfaceReference called\n"); + DPRINT1("Ehci: InterfaceReference called\n"); } VOID USB_BUSIFFN InterfaceDereference(PVOID BusContext) { - DPRINT1("InterfaceDereference called\n"); + DPRINT1("Ehci: InterfaceDereference called\n"); } /* Bus Interface Hub V5 Functions */ @@ -65,7 +66,7 @@ CreateUsbDevice(PVOID BusContext, PUSB_DEVICE UsbDevice; LONG i = 0; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; - DPRINT("CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber); + DPRINT1("Ehci: CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber); if (PdoDeviceExtension->UsbDevices[0] != HubDeviceHandle) { @@ -116,7 +117,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) PUCHAR Ptr; LONG i, j, k; - DPRINT1("InitializeUsbDevice called, device %x\n", DeviceHandle); + DPRINT1("Ehci: InitializeUsbDevice called, device %x\n", DeviceHandle); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; @@ -141,6 +142,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) /* Set the device address */ CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; + CtrlSetup.bmRequestType._BM.Reserved = 0; CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_HOST_TO_DEVICE; CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; CtrlSetup.wValue.W = UsbDevice->Address; @@ -209,6 +211,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) sizeof(USB_CONFIGURATION) + sizeof(PVOID) * ConfigDesc->bNumInterfaces, USB_POOL_TAG); UsbDevice->Configs[i]->Device = UsbDevice; + RtlCopyMemory(&UsbDevice->Configs[0]->ConfigurationDescriptor, ConfigDesc, sizeof(USB_CONFIGURATION_DESCRIPTOR)); Ptr += ConfigDesc->bLength; @@ -252,7 +255,7 @@ GetUsbDescriptors(PVOID BusContext, PULONG ConfigDescriptorBufferLength) { PUSB_DEVICE UsbDevice; - DPRINT1("GetUsbDescriptor %x, %x, %x, %x\n", DeviceDescriptorBuffer, *DeviceDescriptorBufferLength, ConfigDescriptorBuffer, *ConfigDescriptorBufferLength); + DPRINT1("Ehci: GetUsbDescriptor %x, %x, %x, %x\n", DeviceDescriptorBuffer, *DeviceDescriptorBufferLength, ConfigDescriptorBuffer, *ConfigDescriptorBufferLength); UsbDevice = DeviceHandleToUsbDevice(BusContext, DeviceHandle); @@ -267,6 +270,7 @@ GetUsbDescriptors(PVOID BusContext, RtlCopyMemory(DeviceDescriptorBuffer, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); *DeviceDescriptorBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); } + if ((ConfigDescriptorBuffer) && (ConfigDescriptorBufferLength)) { RtlCopyMemory(ConfigDescriptorBuffer, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); @@ -340,7 +344,7 @@ NTSTATUS USB_BUSIFFN RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) { - DPRINT1("RestoreUsbDevice called\n"); + DPRINT1("Ehci: RestoreUsbDevice called\n"); return STATUS_NOT_SUPPORTED; } @@ -348,7 +352,7 @@ NTSTATUS USB_BUSIFFN GetPortHackFlags(PVOID BusContext, PULONG Flags) { - DPRINT1("GetPortHackFlags called\n"); + DPRINT1("Ehci: GetPortHackFlags called\n"); return STATUS_NOT_SUPPORTED; } @@ -365,7 +369,7 @@ QueryDeviceInformation(PVOID BusContext, ULONG SizeNeeded; LONG i; - DPRINT1("QueryDeviceInformation (%x, %x, %x, %d, %x\n", BusContext, DeviceHandle, DeviceInformationBuffer, DeviceInformationBufferLength, LengthReturned); + DPRINT1("Ehci: QueryDeviceInformation (%x, %x, %x, %d, %x\n", BusContext, DeviceHandle, DeviceInformationBuffer, DeviceInformationBufferLength, LengthReturned); UsbDevice = DeviceHandleToUsbDevice(BusContext, DeviceHandle); @@ -418,7 +422,7 @@ GetControllerInformation(PVOID BusContext, { PUSB_CONTROLLER_INFORMATION_0 ControllerInfo; - DPRINT1("GetControllerInformation called\n"); + DPRINT1("Ehci: GetControllerInformation called\n"); ControllerInfo = ControllerInformationBuffer; @@ -447,7 +451,7 @@ NTSTATUS USB_BUSIFFN ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable) { - DPRINT1("ControllerSelectiveSuspend called\n"); + DPRINT1("Ehci: ControllerSelectiveSuspend called\n"); return STATUS_NOT_SUPPORTED; } @@ -464,13 +468,16 @@ GetExtendedHubInformation(PVOID BusContext, PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; LONG i; - DPRINT1("GetExtendedHubInformation\n"); + DPRINT1("Ehci: GetExtendedHubInformation BusContext %x, PDO %x\n", BusContext, HubPhysicalDeviceObject); /* Set the default return value */ *LengthReturned = 0; - /* Caller must have set InformationLevel to 0 */ + + DPRINT1("InformationLevel %x\n", UsbExtHubInfo->InformationLevel); + + /* Caller is suppose to have set InformationLevel to 0. However usbehci from MS seems to ignore this */ if (UsbExtHubInfo->InformationLevel != 0) { - return STATUS_NOT_SUPPORTED; + DPRINT1("InformationLevel should really be set to 0. Ignoring\n"); } UsbExtHubInfo->NumberOfPorts = 8; @@ -496,7 +503,7 @@ GetRootHubSymbolicName(PVOID BusContext, ULONG HubSymNameBufferLength, PULONG HubSymNameActualLength) { - DPRINT1("GetRootHubSymbolicName called\n"); + DPRINT1("Ehci: GetRootHubSymbolicName called\n"); if (HubSymNameBufferLength < 16) return STATUS_UNSUCCESSFUL; @@ -512,7 +519,7 @@ GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle) { PUSB_DEVICE UsbDevice; - DPRINT1("GetDeviceBusContext called\n"); + DPRINT1("Ehci: GetDeviceBusContext called\n"); UsbDevice = DeviceHandleToUsbDevice(HubBusContext, DeviceHandle); if (!UsbDevice) @@ -528,7 +535,7 @@ NTSTATUS USB_BUSIFFN Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount) { - DPRINT1("Initialize20Hub called, HubDeviceHandle: %x\n", HubDeviceHandle); + DPRINT1("Ehci: Initialize20Hub called, HubDeviceHandle: %x\n", HubDeviceHandle); /* FIXME: */ /* Create the Irp Queue for SCE */ @@ -541,7 +548,7 @@ USB_BUSIFFN RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine) { PPDO_DEVICE_EXTENSION PdoDeviceExtension; - DPRINT1("RootHubInitNotification %x, %x, %x\n", BusContext, CallbackContext, CallbackRoutine); + DPRINT1("Ehci: RootHubInitNotification %x, %x, %x\n", BusContext, CallbackContext, CallbackRoutine); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; PdoDeviceExtension->CallbackContext = CallbackContext; @@ -579,7 +586,7 @@ VOID USB_BUSIFFN SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo) { - DPRINT1("SetDeviceHandleData called\n"); + DPRINT1("Ehci: SetDeviceHandleData called\n"); } @@ -589,7 +596,7 @@ VOID USB_BUSIFFN GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites) { - DPRINT1("GetUSBDIVersion called\n"); + DPRINT1("Ehci: GetUSBDIVersion called\n"); return; } @@ -597,7 +604,7 @@ NTSTATUS USB_BUSIFFN QueryBusTime(PVOID BusContext, PULONG CurrentFrame) { - DPRINT1("QueryBusTime called\n"); + DPRINT1("Ehci: QueryBusTime called\n"); return STATUS_NOT_SUPPORTED; } @@ -605,7 +612,7 @@ NTSTATUS USB_BUSIFFN SubmitIsoOutUrb(PVOID BusContext, PURB Urb) { - DPRINT1("SubmitIsoOutUrb called\n"); + DPRINT1("Ehci: SubmitIsoOutUrb called\n"); return STATUS_NOT_SUPPORTED; } @@ -617,7 +624,7 @@ QueryBusInformation(PVOID BusContext, PULONG BusInformationBufferLength, PULONG BusInformationActualLength) { - DPRINT1("QueryBusInformation called\n"); + DPRINT1("Ehci: QueryBusInformation called\n"); return STATUS_NOT_SUPPORTED; } @@ -625,7 +632,7 @@ BOOLEAN USB_BUSIFFN IsDeviceHighSpeed(PVOID BusContext) { - DPRINT1("IsDeviceHighSpeed called\n"); + DPRINT1("Ehci: IsDeviceHighSpeed called\n"); return TRUE; } @@ -633,6 +640,6 @@ NTSTATUS USB_BUSIFFN EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) { - DPRINT1("EnumLogEntry called\n"); + DPRINT1("Ehci: EnumLogEntry called\n"); return STATUS_SUCCESS; }