Author: mjmartin
Date: Fri May 13 09:14:28 2011
New Revision: 51691

URL: http://svn.reactos.org/svn/reactos?rev=51691&view=rev
Log:
[USBSTOR]
- Add a check at USBSTOR_FdoHandleStartDevice to make sure the device uses Bulk 
Transfers.
- Use macros for initializing the Urbs. The macros ensure that the proper 
fields of the URB are set correctly.
Fixes failing of getting device descriptor and getting devices BlockLength.


Modified:
    branches/usb-bringup/drivers/usb/usbstor/descriptor.c
    branches/usb-bringup/drivers/usb/usbstor/fdo.c
    branches/usb-bringup/drivers/usb/usbstor/scsi.c

Modified: branches/usb-bringup/drivers/usb/usbstor/descriptor.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/descriptor.c?rev=51691&r1=51690&r2=51691&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/descriptor.c [iso-8859-1] 
(original)
+++ branches/usb-bringup/drivers/usb/usbstor/descriptor.c [iso-8859-1] Fri May 
13 09:14:28 2011
@@ -60,13 +60,15 @@
     //
     // initialize urb
     //
-    Urb->UrbHeader.Function = URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE;
-    Urb->UrbHeader.Length = sizeof(URB);
-    Urb->UrbControlDescriptorRequest.DescriptorType = DescriptorType;
-    Urb->UrbControlDescriptorRequest.TransferBuffer = Descriptor;
-    Urb->UrbControlDescriptorRequest.TransferBufferLength = DescriptorLength;
-    Urb->UrbControlDescriptorRequest.Index = DescriptorIndex;
-    Urb->UrbControlDescriptorRequest.LanguageId = LanguageId;
+    UsbBuildGetDescriptorRequest(Urb,
+                                 sizeof(Urb->UrbControlDescriptorRequest),
+                                 DescriptorType,
+                                 DescriptorIndex,
+                                 LanguageId,
+                                 Descriptor,
+                                 NULL,
+                                 DescriptorLength,
+                                 NULL);
 
     //
     // submit urb

Modified: branches/usb-bringup/drivers/usb/usbstor/fdo.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/fdo.c?rev=51691&r1=51690&r2=51691&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/fdo.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/fdo.c [iso-8859-1] Fri May 13 
09:14:28 2011
@@ -124,6 +124,7 @@
     IN PFDO_DEVICE_EXTENSION DeviceExtension,
     IN OUT PIRP Irp)
 {
+    PUSB_INTERFACE_DESCRIPTOR InterfaceDesc;
     NTSTATUS Status;
     UCHAR Index = 0;
 
@@ -157,6 +158,18 @@
     // dump device descriptor
     //
     USBSTOR_DumpDeviceDescriptor(DeviceExtension->DeviceDescriptor);
+
+    //
+    // Check that this device uses bulk transfers and is SCSI
+    //
+    InterfaceDesc = 
(PUSB_INTERFACE_DESCRIPTOR)((ULONG_PTR)DeviceExtension->ConfigurationDescriptor 
+ sizeof(USB_CONFIGURATION_DESCRIPTOR));
+    DPRINT1("bInterfaceSubClass %x\n", InterfaceDesc->bInterfaceSubClass);
+    if (InterfaceDesc->bInterfaceProtocol != 0x50)
+    {
+        DPRINT1("USB Device is not a bulk only device and is not currently 
supported\n");
+        return STATUS_NOT_SUPPORTED;
+    }
+    
 
     //
     // now select an interface
@@ -290,6 +303,7 @@
            //
            // just forward irp to lower device
            //
+           //IoSkipCurrentIrpStackLocation(Irp);
            Status = USBSTOR_SyncForwardIrp(DeviceExtension->LowerDeviceObject, 
Irp);
            break;
        }

Modified: branches/usb-bringup/drivers/usb/usbstor/scsi.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/scsi.c?rev=51691&r1=51690&r2=51691&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/scsi.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/scsi.c [iso-8859-1] Fri May 13 
09:14:28 2011
@@ -258,19 +258,20 @@
     //
     // get next stack location
     //
+
     IoStack = IoGetNextIrpStackLocation(Irp);
 
     //
     // now initialize the urb for sending the csw
     //
-    Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Length = sizeof(URB);
-    Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Function = 
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
-    Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle = 
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle;
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferBuffer = Context->csw;
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength = 512; //FIXME
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferMDL = NULL;
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferFlags = 
USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;
-
+    UsbBuildInterruptOrBulkTransferRequest(&Context->Urb,
+                                           sizeof(struct 
_URB_BULK_OR_INTERRUPT_TRANSFER),
+                                           
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle,
+                                           Context->csw,
+                                           NULL,
+                                           512, //FIXME
+                                           USBD_TRANSFER_DIRECTION_IN | 
USBD_SHORT_TRANSFER_OK,
+                                           NULL);
 
     //
     // initialize stack location
@@ -291,6 +292,7 @@
     // call driver
     //
     IoCallDriver(Context->FDODeviceExtension->LowerDeviceObject, Irp);
+
     return STATUS_MORE_PROCESSING_REQUIRED;
 }
 
@@ -330,12 +332,15 @@
         //
         // now initialize the urb for sending data
         //
-        Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Length = sizeof(URB);
-        Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Function = 
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
-        Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle = 
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle;
-        Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferMDL = 
Context->TransferBufferMDL;
-        Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength = 
Context->TransferDataLength;
-        Context->Urb.UrbBulkOrInterruptTransfer.TransferFlags = 
USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;
+
+        UsbBuildInterruptOrBulkTransferRequest(&Context->Urb,
+                                               sizeof(struct 
_URB_BULK_OR_INTERRUPT_TRANSFER),
+                                               
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle,
+                                               NULL,
+                                               Context->TransferBufferMDL,
+                                               Context->TransferDataLength,
+                                               USBD_TRANSFER_DIRECTION_IN | 
USBD_SHORT_TRANSFER_OK,
+                                               NULL);
 
         //
         // setup completion routine
@@ -347,12 +352,15 @@
         //
         // now initialize the urb for sending the csw
         //
-        Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Length = sizeof(URB);
-        Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Function = 
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
-        Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle = 
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle;
-        Context->Urb.UrbBulkOrInterruptTransfer.TransferBuffer = Context->csw;
-        Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength = 512; 
//FIXME
-        Context->Urb.UrbBulkOrInterruptTransfer.TransferFlags = 
USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK;
+
+        UsbBuildInterruptOrBulkTransferRequest(&Context->Urb,
+                                               sizeof(struct 
_URB_BULK_OR_INTERRUPT_TRANSFER),
+                                               
Context->FDODeviceExtension->InterfaceInformation->Pipes[Context->FDODeviceExtension->BulkInPipeIndex].PipeHandle,
+                                               Context->csw,
+                                               NULL,
+                                               512, //FIXME
+                                               USBD_TRANSFER_DIRECTION_IN | 
USBD_SHORT_TRANSFER_OK,
+                                               NULL);
 
         //
         // setup completion routine
@@ -373,6 +381,7 @@
     // call driver
     //
     IoCallDriver(Context->FDODeviceExtension->LowerDeviceObject, Irp);
+
     return STATUS_MORE_PROCESSING_REQUIRED;
 }
 
@@ -427,12 +436,14 @@
     //
     // now initialize the urb
     //
-    Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Length = sizeof(URB);
-    Context->Urb.UrbBulkOrInterruptTransfer.Hdr.Function = 
URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
-    Context->Urb.UrbBulkOrInterruptTransfer.PipeHandle = 
FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkOutPipeIndex].PipeHandle;
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferBuffer = 
(PVOID)Context->cbw;
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferBufferLength = sizeof(CBW);
-    Context->Urb.UrbBulkOrInterruptTransfer.TransferFlags = 
USBD_TRANSFER_DIRECTION_OUT | USBD_SHORT_TRANSFER_OK;
+    UsbBuildInterruptOrBulkTransferRequest(&Context->Urb,
+                                           sizeof(struct 
_URB_BULK_OR_INTERRUPT_TRANSFER),
+                                           
FDODeviceExtension->InterfaceInformation->Pipes[FDODeviceExtension->BulkOutPipeIndex].PipeHandle,
+                                           Context->cbw,
+                                           NULL,
+                                           sizeof(CBW),
+                                           USBD_TRANSFER_DIRECTION_OUT | 
USBD_SHORT_TRANSFER_OK,
+                                           NULL);
 
     //
     // initialize rest of context
@@ -477,7 +488,6 @@
         FreeItem(Context);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
-
 
     //
     // get next stack location
@@ -822,6 +832,7 @@
     //
     // FIXME: support more logical blocks
     //
+    DPRINT1("Request->DataTransferLength %x, PDODeviceExtension->BlockLength 
%x\n", Request->DataTransferLength, PDODeviceExtension->BlockLength);
     ASSERT(Request->DataTransferLength == PDODeviceExtension->BlockLength);
 
     //


Reply via email to