Author: janderwald Date: Thu Apr 28 23:59:53 2011 New Revision: 51487
URL: http://svn.reactos.org/svn/reactos?rev=51487&view=rev Log: [USBEHCI_NEW] - Remove assert for unknown clear feature - Implement retrieving string descriptors, based on mjmartin usbehci driver - Start implementing USBHI_RestoreUsbDevice - Fixup device stack in USBHI_SetDeviceHandleData. Needs more investigation
Modified: branches/usb-bringup/drivers/usb/usbehci_new/hub_controller.cpp branches/usb-bringup/drivers/usb/usbehci_new/interfaces.h branches/usb-bringup/drivers/usb/usbehci_new/usb_device.cpp
Modified: branches/usb-bringup/drivers/usb/usbehci_new/hub_controller.cpp URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbehci_... ============================================================================== --- branches/usb-bringup/drivers/usb/usbehci_new/hub_controller.cpp [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbehci_new/hub_controller.cpp [iso-8859-1] Thu Apr 28 23:59:53 2011 @@ -868,7 +868,6 @@ break; default: DPRINT("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value); - PC_ASSERT(FALSE); break; }
@@ -1079,6 +1078,7 @@ { NTSTATUS Status = STATUS_NOT_IMPLEMENTED; PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; PUCHAR Buffer; PUSBDEVICE UsbDevice; ULONG Length; @@ -1191,7 +1191,7 @@ // UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle);
- if (UsbDevice->GetConfigurationDescriptorsLength() > Urb->UrbControlDescriptorRequest.TransferBufferLength) + if (sizeof(USB_CONFIGURATION_DESCRIPTOR) > Urb->UrbControlDescriptorRequest.TransferBufferLength) { // // buffer too small @@ -1213,7 +1213,7 @@ // // sanity check // - PC_ASSERT(UsbDevice->GetConfigurationDescriptorsLength() == Length); + PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBufferLength >= Length);
// // store result size @@ -1221,6 +1221,41 @@ Urb->UrbControlDescriptorRequest.TransferBufferLength = Length; Status = STATUS_SUCCESS; } + break; + } + case USB_STRING_DESCRIPTOR_TYPE: + { + // + // sanity check + // + PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer); + PC_ASSERT(Urb->UrbControlDescriptorRequest.TransferBufferLength); + + + // + // check if this is a valid usb device handle + // + PC_ASSERT(ValidateUsbDevice(PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle))); + + // + // get device + // + UsbDevice = PUSBDEVICE(Urb->UrbHeader.UsbdDeviceHandle); + + // + // generate setup packet + // + CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; + CtrlSetup.wValue.LowByte = Urb->UrbControlDescriptorRequest.Index; + CtrlSetup.wValue.HiByte = Urb->UrbControlDescriptorRequest.DescriptorType; + CtrlSetup.wIndex.W = Urb->UrbControlDescriptorRequest.LanguageId; + CtrlSetup.wLength = Urb->UrbControlDescriptorRequest.TransferBufferLength; + CtrlSetup.bmRequestType.B = 0x80; + + // + // submit setup packet + // + Status = UsbDevice->SubmitSetupPacket(&CtrlSetup, Urb->UrbControlDescriptorRequest.TransferBufferLength, Urb->UrbControlDescriptorRequest.TransferBuffer); break; } default: @@ -2049,8 +2084,45 @@ PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) { - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; + PUSBDEVICE OldUsbDevice, NewUsbDevice; + CHubController * Controller; + NTSTATUS Status; + + DPRINT1("USBHI_RestoreUsbDevice\n"); + + // + // first get controller + // + Controller = (CHubController *)BusContext; + PC_ASSERT(Controller); + + // + // get device object + // + OldUsbDevice = (PUSBDEVICE)OldDeviceHandle; + NewUsbDevice = (PUSBDEVICE)NewDeviceHandle; + PC_ASSERT(OldUsbDevice); + PC_ASSERT(NewDeviceHandle); + + // + // validate device handle + // + PC_ASSERT(Controller->ValidateUsbDevice(NewUsbDevice)); + PC_ASSERT(Controller->ValidateUsbDevice(OldUsbDevice)); + + DPRINT1("NewUsbDevice: DeviceAddress %x\n", NewUsbDevice->GetDeviceAddress()); + + + DPRINT1("OldUsbDevice: DeviceAddress %x\n", OldUsbDevice->GetDeviceAddress()); + + PC_ASSERT(FALSE); + + // + // remove old device handle + // + USBHI_RemoveUsbDevice(BusContext, OldDeviceHandle, 0); + + return STATUS_SUCCESS; }
NTSTATUS @@ -2430,11 +2502,36 @@ // return; } - - // - // set device handle data - // - UsbDevice->SetDeviceHandleData(UsbDevicePdo); + else + { + // + // usbhub sends this request as a part of the Pnp startup sequence + // looks like we need apply a dragon voodoo to fixup the device stack + // otherwise usbhub will cause a bugcheck + // + DPRINT1("USBHI_SetDeviceHandleData %p\n", UsbDevicePdo); + + // + // fixup device stack voodoo part #1 + // + UsbDevicePdo->StackSize++; + + // + // sanity check + // + PC_ASSERT(UsbDevicePdo->AttachedDevice); + + // + // should be usbstor + // fixup device stack voodoo part #2 + // + UsbDevicePdo->AttachedDevice->StackSize++; + + // + // set device handle data + // + UsbDevice->SetDeviceHandleData(UsbDevicePdo); + } }
//=================================================================================================
Modified: branches/usb-bringup/drivers/usb/usbehci_new/interfaces.h URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbehci_... ============================================================================== --- branches/usb-bringup/drivers/usb/usbehci_new/interfaces.h [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbehci_new/interfaces.h [iso-8859-1] Thu Apr 28 23:59:53 2011 @@ -802,6 +802,17 @@ // virtual ULONG GetConfigurationDescriptorsLength() = 0;
+//---------------------------------------------------------------------------------------- +// +// SubmitSetupPacket +// +// Description: submits an setup packet. The usb device will then create an usb request from it and submit it to the queue + + virtual NTSTATUS SubmitSetupPacket(IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, + IN OUT ULONG BufferLength, + OUT PVOID Buffer) = 0; + + };
typedef IUSBDevice *PUSBDEVICE;
Modified: branches/usb-bringup/drivers/usb/usbehci_new/usb_device.cpp URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbehci_... ============================================================================== --- branches/usb-bringup/drivers/usb/usbehci_new/usb_device.cpp [iso-8859-1] (original) +++ branches/usb-bringup/drivers/usb/usbehci_new/usb_device.cpp [iso-8859-1] Thu Apr 28 23:59:53 2011 @@ -67,6 +67,8 @@ virtual NTSTATUS SubmitIrp(PIRP Irp); virtual VOID GetConfigurationDescriptors(IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDescriptorBuffer, IN ULONG BufferLength, OUT PULONG OutBufferLength); virtual ULONG GetConfigurationDescriptorsLength(); + virtual NTSTATUS SubmitSetupPacket(IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, OUT ULONG BufferLength, OUT PVOID Buffer); +
// local function virtual NTSTATUS CommitIrp(PIRP Irp); @@ -1016,6 +1018,41 @@ } //---------------------------------------------------------------------------------------- NTSTATUS +CUSBDevice::SubmitSetupPacket( + IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, + IN OUT ULONG BufferLength, + OUT PVOID Buffer) +{ + NTSTATUS Status; + PMDL Mdl; + + // + // allocate mdl + // + Mdl = IoAllocateMdl(Buffer, BufferLength, FALSE, FALSE, 0); + + // + // HACK HACK HACK: assume the buffer is build from non paged pool + // + MmBuildMdlForNonPagedPool(Mdl); + + // + // commit setup packet + // + Status = CommitSetupPacket(SetupPacket, BufferLength, Mdl); + + // + // free mdl + // + IoFreeMdl(Mdl); + + // + // done + // + return Status; +} +//---------------------------------------------------------------------------------------- +NTSTATUS CreateUSBDevice( PUSBDEVICE *OutDevice) {