From 68c1c7661ed100664ace7694fb6449b5e63d251f Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 12 Feb 2012 00:49:18 +0000 Subject: [PATCH] [USBEHCI] - Enable async park mode when available - Use correct type for the pipe handle - Implement URB_FUNCTION_GET_STATUS_FROM_INTERFACE, URB_FUNCTION_GET_STATUS_FROM_ENDPOINT - Verify that there is buffer provided in SubmitSetupPacket [KBDCLASS] - Forward requests to lower device svn path=/branches/usb-bringup-trunk/; revision=55552 --- drivers/input/kbdclass/kbdclass.c | 2 +- drivers/usb/usbehci/hardware.cpp | 11 ++++++++ drivers/usb/usbehci/hub_controller.cpp | 30 +++++++++++++++----- drivers/usb/usbehci/usb_device.cpp | 39 +++++++++++++++++--------- 4 files changed, 61 insertions(+), 21 deletions(-) diff --git a/drivers/input/kbdclass/kbdclass.c b/drivers/input/kbdclass/kbdclass.c index 03be367be9d..e1bbe5830a9 100644 --- a/drivers/input/kbdclass/kbdclass.c +++ b/drivers/input/kbdclass/kbdclass.c @@ -878,7 +878,7 @@ ClassPnp( } Irp->IoStatus.Status = Status; - if (NT_SUCCESS(Status)) + if (NT_SUCCESS(Status) || Status == STATUS_NOT_SUPPORTED) { IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(DeviceExtension->LowerDevice, Irp); diff --git a/drivers/usb/usbehci/hardware.cpp b/drivers/usb/usbehci/hardware.cpp index 5af6529f382..f00fea3162c 100644 --- a/drivers/usb/usbehci/hardware.cpp +++ b/drivers/usb/usbehci/hardware.cpp @@ -737,8 +737,19 @@ CUSBHardwareDevice::StartController(void) UsbCmd.IntThreshold = 0x8; //1ms UsbCmd.Run = TRUE; UsbCmd.FrameListSize = 0x0; //1024 + + if (m_Capabilities.HCCParams.ParkMode) + { + // + // enable async park mode + // + UsbCmd.AsyncParkEnable = TRUE; + UsbCmd.AsyncParkCount = 3; + } + SetCommandRegister(&UsbCmd); + // // Wait for execution to start // diff --git a/drivers/usb/usbehci/hub_controller.cpp b/drivers/usb/usbehci/hub_controller.cpp index 5c49c219911..1dc1962aad0 100644 --- a/drivers/usb/usbehci/hub_controller.cpp +++ b/drivers/usb/usbehci/hub_controller.cpp @@ -827,7 +827,7 @@ CHubController::HandleBulkOrInterruptTransfer( PURB Urb) { PUSBDEVICE UsbDevice; - PUSB_ENDPOINT_DESCRIPTOR EndPointDesc = NULL; + PUSB_ENDPOINT EndPointDesc = NULL; // // First check if the request is for the Status Change Endpoint // @@ -856,13 +856,13 @@ CHubController::HandleBulkOrInterruptTransfer( // // Check PipeHandle to determine if this is a Bulk or Interrupt Transfer Request // - EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle; + EndPointDesc = (PUSB_ENDPOINT)Urb->UrbBulkOrInterruptTransfer.PipeHandle; // // sanity checks // ASSERT(EndPointDesc); - ASSERT((EndPointDesc->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK || (EndPointDesc->bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_INTERRUPT); + ASSERT((EndPointDesc->EndPointDescriptor.bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK || (EndPointDesc->EndPointDescriptor.bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_INTERRUPT); // // check if this is a valid usb device handle @@ -881,7 +881,6 @@ CHubController::HandleBulkOrInterruptTransfer( // get device // UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle); - return UsbDevice->SubmitIrp(Irp); } @@ -1171,7 +1170,6 @@ CHubController::HandleGetStatusFromDevice( // // sanity checks // - PC_ASSERT(Urb->UrbControlGetStatusRequest.Index == 0); PC_ASSERT(Urb->UrbControlGetStatusRequest.TransferBufferLength >= sizeof(USHORT)); PC_ASSERT(Urb->UrbControlGetStatusRequest.TransferBuffer); @@ -1215,10 +1213,26 @@ CHubController::HandleGetStatusFromDevice( CtrlSetup.bRequest = USB_REQUEST_GET_STATUS; CtrlSetup.wValue.LowByte = 0; CtrlSetup.wValue.HiByte = 0; - CtrlSetup.wIndex.W = Urb->UrbControlGetStatusRequest.Index; + CtrlSetup.wIndex.W = Urb->UrbControlGetStatusRequest.Index; CtrlSetup.wLength = (USHORT)Urb->UrbControlGetStatusRequest.TransferBufferLength; CtrlSetup.bmRequestType.B = 0x80; + + if (Urb->UrbHeader.Function == URB_FUNCTION_GET_STATUS_FROM_INTERFACE) + { + // + // add interface type + // + CtrlSetup.bmRequestType.B |= 0x01; + } + else if (Urb->UrbHeader.Function == URB_FUNCTION_GET_STATUS_FROM_ENDPOINT) + { + // + // add interface type + // + CtrlSetup.bmRequestType.B |= 0x02; + } + // // submit setup packet // @@ -2030,6 +2044,8 @@ CHubController::HandleDeviceControl( Status = HandleClassDevice(Irp, Urb); break; case URB_FUNCTION_GET_STATUS_FROM_DEVICE: + case URB_FUNCTION_GET_STATUS_FROM_INTERFACE: + case URB_FUNCTION_GET_STATUS_FROM_ENDPOINT: Status = HandleGetStatusFromDevice(Irp, Urb); break; case URB_FUNCTION_SELECT_CONFIGURATION: @@ -2523,7 +2539,7 @@ USBHI_CreateUsbDevice( // // now initialize device // - Status = NewUsbDevice->Initialize(PHUBCONTROLLER(Controller), Controller->GetUsbHardware(),PVOID(Controller), PortNumber, PortStatus); + Status = NewUsbDevice->Initialize(PHUBCONTROLLER(Controller), Controller->GetUsbHardware(), HubDeviceHandle, PortNumber, PortStatus); // // check for success diff --git a/drivers/usb/usbehci/usb_device.cpp b/drivers/usb/usbehci/usb_device.cpp index ea3f89bf623..b9f4a806f09 100644 --- a/drivers/usb/usbehci/usb_device.cpp +++ b/drivers/usb/usbehci/usb_device.cpp @@ -1038,27 +1038,40 @@ CUSBDevice::SubmitSetupPacket( OUT PVOID Buffer) { NTSTATUS Status; - PMDL Mdl; + PMDL Mdl = NULL; - // - // allocate mdl - // - Mdl = IoAllocateMdl(Buffer, BufferLength, FALSE, FALSE, 0); + if (BufferLength) + { + // + // allocate mdl + // + Mdl = IoAllocateMdl(Buffer, BufferLength, FALSE, FALSE, 0); + if (!Mdl) + { + // + // no memory + // + return STATUS_INSUFFICIENT_RESOURCES; + } - // - // HACK HACK HACK: assume the buffer is build from non paged pool - // - MmBuildMdlForNonPagedPool(Mdl); + // + // HACK HACK HACK: assume the buffer is build from non paged pool + // + MmBuildMdlForNonPagedPool(Mdl); + } // // commit setup packet // Status = CommitSetupPacket(SetupPacket, 0, BufferLength, Mdl); - // - // free mdl - // - IoFreeMdl(Mdl); + if (Mdl != NULL) + { + // + // free mdl + // + IoFreeMdl(Mdl); + } // // done -- 2.17.1