Author: janderwald Date: Fri Feb 3 11:02:37 2012 New Revision: 55390
URL: http://svn.reactos.org/svn/reactos?rev=55390&view=rev Log: [USBOHCI] - Consider device speed when building the device endpoint descriptor
Modified: branches/usb-bringup-trunk/drivers/usb/usbohci/interfaces.h branches/usb-bringup-trunk/drivers/usb/usbohci/usb_request.cpp
Modified: branches/usb-bringup-trunk/drivers/usb/usbohci/interfaces.h URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/us... ============================================================================== --- branches/usb-bringup-trunk/drivers/usb/usbohci/interfaces.h [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/usb/usbohci/interfaces.h [iso-8859-1] Fri Feb 3 11:02:37 2012 @@ -402,6 +402,7 @@ IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN UCHAR DeviceAddress, IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor, + IN USB_DEVICE_SPEED DeviceSpeed, IN OUT ULONG TransferBufferLength, IN OUT PMDL TransferBuffer) = 0;
@@ -411,9 +412,11 @@ // // Description: initializes the request with an IRP // The irp contains an URB block which contains all necessary information +// contains the device speed (FullSpeed / LowSpeed)
virtual NTSTATUS InitializeWithIrp(IN PDMAMEMORYMANAGER DmaManager, - IN OUT PIRP Irp) = 0; + IN OUT PIRP Irp, + IN USB_DEVICE_SPEED DeviceSpeed) = 0;
//----------------------------------------------------------------------------------------- //
Modified: branches/usb-bringup-trunk/drivers/usb/usbohci/usb_request.cpp URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/usb/us... ============================================================================== --- branches/usb-bringup-trunk/drivers/usb/usbohci/usb_request.cpp [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/usb/usbohci/usb_request.cpp [iso-8859-1] Fri Feb 3 11:02:37 2012 @@ -36,8 +36,8 @@ }
// IUSBRequest interface functions - virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager, IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN UCHAR DeviceAddress, IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor, IN OUT ULONG TransferBufferLength, IN OUT PMDL TransferBuffer); - virtual NTSTATUS InitializeWithIrp(IN PDMAMEMORYMANAGER DmaManager, IN OUT PIRP Irp); + virtual NTSTATUS InitializeWithSetupPacket(IN PDMAMEMORYMANAGER DmaManager, IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN UCHAR DeviceAddress, IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor, IN USB_DEVICE_SPEED DeviceSpeed, IN OUT ULONG TransferBufferLength, IN OUT PMDL TransferBuffer); + virtual NTSTATUS InitializeWithIrp(IN PDMAMEMORYMANAGER DmaManager, IN OUT PIRP Irp, IN USB_DEVICE_SPEED DeviceSpeed); virtual BOOLEAN IsRequestComplete(); virtual ULONG GetTransferType(); virtual NTSTATUS GetEndpointDescriptor(struct _OHCI_ENDPOINT_DESCRIPTOR ** OutEndpointDescriptor); @@ -136,6 +136,15 @@ NTSTATUS m_NtStatusCode; ULONG m_UrbStatusCode;
+ // + // device speed + // + USB_DEVICE_SPEED m_DeviceSpeed; + + // + // store urb + // + PURB m_Urb; };
//---------------------------------------------------------------------------------------- @@ -155,6 +164,7 @@ IN PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, IN UCHAR DeviceAddress, IN OPTIONAL PUSB_ENDPOINT_DESCRIPTOR EndpointDescriptor, + IN USB_DEVICE_SPEED DeviceSpeed, IN OUT ULONG TransferBufferLength, IN OUT PMDL TransferBuffer) { @@ -174,6 +184,7 @@ m_DeviceAddress = DeviceAddress; m_EndpointDescriptor = EndpointDescriptor; m_TotalBytesTransferred = 0; + m_DeviceSpeed = DeviceSpeed;
// // Set Length Completed to 0 @@ -206,10 +217,10 @@ NTSTATUS CUSBRequest::InitializeWithIrp( IN PDMAMEMORYMANAGER DmaManager, - IN OUT PIRP Irp) + IN OUT PIRP Irp, + IN USB_DEVICE_SPEED DeviceSpeed) { PIO_STACK_LOCATION IoStack; - PURB Urb;
// // sanity checks @@ -235,7 +246,7 @@ // // get urb // - Urb = (PURB)IoStack->Parameters.Others.Argument1; + m_Urb = (PURB)IoStack->Parameters.Others.Argument1;
// // store irp @@ -243,38 +254,43 @@ m_Irp = Irp;
// + // store speed + // + m_DeviceSpeed = DeviceSpeed; + + // // check function type // - switch (Urb->UrbHeader.Function) + switch (m_Urb->UrbHeader.Function) { case URB_FUNCTION_ISOCH_TRANSFER: { // // there must be at least one packet // - ASSERT(Urb->UrbIsochronousTransfer.NumberOfPackets); + ASSERT(m_Urb->UrbIsochronousTransfer.NumberOfPackets);
// // is there data to be transferred // - if (Urb->UrbIsochronousTransfer.TransferBufferLength) + if (m_Urb->UrbIsochronousTransfer.TransferBufferLength) { // // Check if there is a MDL // - if (!Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL) + if (!m_Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL) { // // sanity check // - PC_ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer); + PC_ASSERT(m_Urb->UrbBulkOrInterruptTransfer.TransferBuffer);
// // Create one using TransferBuffer // - DPRINT("Creating Mdl from Urb Buffer %p Length %lu\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); - m_TransferBufferMDL = IoAllocateMdl(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, - Urb->UrbBulkOrInterruptTransfer.TransferBufferLength, + DPRINT("Creating Mdl from Urb Buffer %p Length %lu\n", m_Urb->UrbBulkOrInterruptTransfer.TransferBuffer, m_Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + m_TransferBufferMDL = IoAllocateMdl(m_Urb->UrbBulkOrInterruptTransfer.TransferBuffer, + m_Urb->UrbBulkOrInterruptTransfer.TransferBufferLength, FALSE, FALSE, NULL); @@ -298,14 +314,14 @@ // // use provided mdl // - m_TransferBufferMDL = Urb->UrbIsochronousTransfer.TransferBufferMDL; + m_TransferBufferMDL = m_Urb->UrbIsochronousTransfer.TransferBufferMDL; } }
// // save buffer length // - m_TransferBufferLength = Urb->UrbIsochronousTransfer.TransferBufferLength; + m_TransferBufferLength = m_Urb->UrbIsochronousTransfer.TransferBufferLength;
// // Set Length Completed to 0 @@ -315,7 +331,7 @@ // // get endpoint descriptor // - m_EndpointDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbIsochronousTransfer.PipeHandle; + m_EndpointDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)m_Urb->UrbIsochronousTransfer.PipeHandle;
// // completed initialization @@ -332,24 +348,24 @@ // // bulk interrupt transfer // - if (Urb->UrbBulkOrInterruptTransfer.TransferBufferLength) + if (m_Urb->UrbBulkOrInterruptTransfer.TransferBufferLength) { // // Check if there is a MDL // - if (!Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL) + if (!m_Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL) { // // sanity check // - PC_ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer); + PC_ASSERT(m_Urb->UrbBulkOrInterruptTransfer.TransferBuffer);
// // Create one using TransferBuffer // - DPRINT("Creating Mdl from Urb Buffer %p Length %lu\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); - m_TransferBufferMDL = IoAllocateMdl(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, - Urb->UrbBulkOrInterruptTransfer.TransferBufferLength, + DPRINT("Creating Mdl from Urb Buffer %p Length %lu\n", m_Urb->UrbBulkOrInterruptTransfer.TransferBuffer, m_Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + m_TransferBufferMDL = IoAllocateMdl(m_Urb->UrbBulkOrInterruptTransfer.TransferBuffer, + m_Urb->UrbBulkOrInterruptTransfer.TransferBufferLength, FALSE, FALSE, NULL); @@ -374,13 +390,13 @@ } else { - m_TransferBufferMDL = Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL; + m_TransferBufferMDL = m_Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL; }
// // save buffer length // - m_TransferBufferLength = Urb->UrbBulkOrInterruptTransfer.TransferBufferLength; + m_TransferBufferLength = m_Urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
// // Set Length Completed to 0 @@ -390,13 +406,13 @@ // // get endpoint descriptor // - m_EndpointDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle; + m_EndpointDescriptor = (PUSB_ENDPOINT_DESCRIPTOR)m_Urb->UrbBulkOrInterruptTransfer.PipeHandle;
} break; } default: - DPRINT1("URB Function: not supported %x\n", Urb->UrbHeader.Function); + DPRINT1("URB Function: not supported %x\n", m_Urb->UrbHeader.Function); PC_ASSERT(FALSE); }
@@ -971,9 +987,29 @@ }
// - // FIXME: detect type - // - Descriptor->Flags |= OHCI_ENDPOINT_FULL_SPEED; + // set type + // + if (m_DeviceSpeed == UsbFullSpeed) + { + // + // device is full speed + // + Descriptor->Flags |= OHCI_ENDPOINT_FULL_SPEED; + } + else if (m_DeviceSpeed == UsbLowSpeed) + { + // + // device is full speed + // + Descriptor->Flags |= OHCI_ENDPOINT_LOW_SPEED; + } + else + { + // + // error + // + ASSERT(FALSE); + }
Descriptor->HeadPhysicalDescriptor = 0; Descriptor->NextPhysicalEndpoint = 0; @@ -1098,6 +1134,19 @@ // CurrentDescriptor->BufferPhysical = MmGetPhysicalAddress(Buffer).LowPart; CurrentDescriptor->LastPhysicalByteAddress = CurrentDescriptor->BufferPhysical + CurrentSize - 1; + +#if 0 + if (m_Urb != NULL) + { + if (m_Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK) + { + // + // indicate short packet support + // + CurrentDescriptor->Flags |= OHCI_TD_BUFFER_ROUNDING; + } + } +#endif
// // is there a previous descriptor @@ -1298,16 +1347,15 @@ }
// - // FIXME verify short packets are ok - // - //DataDescriptor->Flags |= OHCI_TD_BUFFER_ROUNDING; + // use short packets + // + DataDescriptor->Flags |= OHCI_TD_BUFFER_ROUNDING;
// // store physical address of buffer // DataDescriptor->BufferPhysical = MmGetPhysicalAddress(MmGetMdlVirtualAddress(m_TransferBufferMDL)).LowPart; DataDescriptor->LastPhysicalByteAddress = DataDescriptor->BufferPhysical + m_TransferBufferLength - 1; - }
//