Author: janderwald
Date: Sun May 15 12:47:54 2011
New Revision: 51759

URL: http://svn.reactos.org/svn/reactos?rev=51759&view=rev
Log:
[USBSTOR]
- Silence warnings
- Silence traces
- Add asserts
- Add code to detect usb reset in progress. In that case cancel the request
- Add more code to synchronize urb action
- WIP, still hangs are observed

Modified:
    branches/usb-bringup/drivers/usb/usbstor/disk.c
    branches/usb-bringup/drivers/usb/usbstor/queue.c
    branches/usb-bringup/drivers/usb/usbstor/scsi.c
    branches/usb-bringup/drivers/usb/usbstor/usbstor.c
    branches/usb-bringup/drivers/usb/usbstor/usbstor.h

Modified: branches/usb-bringup/drivers/usb/usbstor/disk.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/disk.c?rev=51759&r1=51758&r2=51759&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/disk.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/disk.c [iso-8859-1] Sun May 15 
12:47:54 2011
@@ -46,7 +46,7 @@
     {
         case SRB_FUNCTION_EXECUTE_SCSI:
         {
-            DPRINT1("SRB_FUNCTION_EXECUTE_SCSI\n");
+            DPRINT("SRB_FUNCTION_EXECUTE_SCSI\n");
 
             //
             // check if request is valid
@@ -56,7 +56,7 @@
                 //
                 // data is transferred with this irp
                 //
-                if (Request->SrbFlags & (SRB_FLAGS_DATA_IN | 
SRB_FLAGS_DATA_OUT) == (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT) ||
+                if ((Request->SrbFlags & (SRB_FLAGS_DATA_IN | 
SRB_FLAGS_DATA_OUT) == (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)) ||
                     Request->DataTransferLength == 0 ||
                     Irp->MdlAddress == NULL)
                 {

Modified: branches/usb-bringup/drivers/usb/usbstor/queue.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/queue.c?rev=51759&r1=51758&r2=51759&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/queue.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/queue.c [iso-8859-1] Sun May 15 
12:47:54 2011
@@ -27,7 +27,6 @@
     InitializeListHead(&FDODeviceExtension->IrpListHead);
 }
 
-
 VOID
 NTAPI
 USBSTOR_CancelIo(
@@ -89,11 +88,13 @@
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     PFDO_DEVICE_EXTENSION FDODeviceExtension;
     BOOLEAN IrpListFreeze;
+    BOOLEAN SrbProcessing;
 
     //
     // get pdo device extension
     //
     PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+    ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
 
     //
     // get FDO device extension
@@ -111,9 +112,22 @@
     KeAcquireSpinLock(&FDODeviceExtension->IrpListLock, &OldLevel);
 
     //
-    // add irp to queue
-    //
-    InsertTailList(&FDODeviceExtension->IrpListHead, 
&Irp->Tail.Overlay.ListEntry);
+    // check if there are irp pending
+    //
+    SrbProcessing = FDODeviceExtension->IrpPendingCount != 0;
+
+    if (SrbProcessing)
+    {
+        //
+        // add irp to queue
+        //
+        InsertTailList(&FDODeviceExtension->IrpListHead, 
&Irp->Tail.Overlay.ListEntry);
+   }
+
+   //
+   // increment pending count
+   //
+   FDODeviceExtension->IrpPendingCount++;
 
     //
     // now set the driver cancel routine
@@ -159,7 +173,9 @@
     //
     // if list is freezed, dont start this packet
     //
-    return IrpListFreeze;
+    DPRINT1("IrpListFreeze: %lu IrpPendingCount %lu\n", IrpListFreeze, 
FDODeviceExtension->IrpPendingCount);
+
+    return (IrpListFreeze || SrbProcessing);
 }
 
 PIRP
@@ -442,6 +458,7 @@
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     KIRQL OldLevel;
     NTSTATUS Status;
+    BOOLEAN ResetInProgress;
 
     DPRINT1("USBSTOR_StartIo\n");
 
@@ -519,9 +536,10 @@
     KeAcquireSpinLock(&FDODeviceExtension->IrpListLock, &OldLevel);
 
     //
-    // remove irp from list
-    //
-    RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+    // check reset is in progress
+    //
+    ResetInProgress = FDODeviceExtension->ResetInProgress;
+    ASSERT(ResetInProgress == FALSE);
 
     //
     // release lock
@@ -544,9 +562,39 @@
     ASSERT(PDODeviceExtension->Common.IsFDO == FALSE);
 
     //
-    // execute scsi
-    //
-    Status = USBSTOR_HandleExecuteSCSI(IoStack->DeviceObject, Irp);
+    // is a reset in progress
+    //
+    if (ResetInProgress)
+    {
+        //
+        // hard reset is in progress
+        //
+        Irp->IoStatus.Information = 0;
+        Irp->IoStatus.Status = STATUS_DEVICE_DOES_NOT_EXIST;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    }
+    else
+    {
+        //
+        // execute scsi
+        //
+        Status = USBSTOR_HandleExecuteSCSI(IoStack->DeviceObject, Irp);
+
+        //
+        // acquire lock
+        //
+        KeAcquireSpinLock(&FDODeviceExtension->IrpListLock, &OldLevel);
+
+        //
+        // FIXME: synchronize with error handler
+        //
+        FDODeviceExtension->IrpPendingCount--;
+
+        //
+        // release lock
+        //
+        KeReleaseSpinLock(&FDODeviceExtension->IrpListLock, OldLevel);
+    }
 
     //
     // FIXME: synchronize action with error handling
@@ -557,5 +605,4 @@
     // start next request
     //
     IoStartNextPacket(DeviceObject, TRUE);
-
-}
+}

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=51759&r1=51758&r2=51759&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] Sun May 15 
12:47:54 2011
@@ -442,7 +442,7 @@
     PFDO_DEVICE_EXTENSION FDODeviceExtension;
     PIRP Irp;
     PIO_STACK_LOCATION IoStack;
-       PULONG MdlVirtualAddress;
+    PUCHAR MdlVirtualAddress;
 
     //
     // first allocate irp context
@@ -509,16 +509,16 @@
         if (OriginalRequest)
         {
             if ((OriginalRequest->MdlAddress != NULL) &&
-                       (Context->TransferData == NULL || Command[0] == 
SCSIOP_READ || Command[0] == SCSIOP_WRITE))
+                (Context->TransferData == NULL || Command[0] == SCSIOP_READ || 
Command[0] == SCSIOP_WRITE))
             {
-                               //
-                               // Sanity check that the Mdl does describe the 
TransferData for read/write
-                               //
-                               if (CommandLength == UFI_READ_WRITE_CMD_LEN)
-                               {
-                                       MdlVirtualAddress = 
MmGetMdlVirtualAddress(OriginalRequest->MdlAddress);
-                                       ASSERT(MdlVirtualAddress == 
Context->TransferData);
-                               }
+                //
+                // Sanity check that the Mdl does describe the TransferData 
for read/write
+                //
+                if (CommandLength == UFI_READ_WRITE_CMD_LEN)
+                {
+                    MdlVirtualAddress = 
MmGetMdlVirtualAddress(OriginalRequest->MdlAddress);
+                    ASSERT(MdlVirtualAddress == Context->TransferData);
+                }
 
                 //
                 // I/O paging request
@@ -736,6 +736,7 @@
     IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp)
 {
+#if 0
     UFI_SENSE_CMD Cmd;
     NTSTATUS Status;
     PVOID Response;
@@ -743,7 +744,7 @@
     PCBW OutControl;
     PCDB pCDB;
     PUFI_MODE_PARAMETER_HEADER Header;
-
+#endif
     PIO_STACK_LOCATION IoStack;
     PSCSI_REQUEST_BLOCK Request;
 
@@ -908,13 +909,11 @@
     IN PIRP Irp)
 {
     UFI_READ_WRITE_CMD Cmd;
-    NTSTATUS Status;
     PPDO_DEVICE_EXTENSION PDODeviceExtension;
     PCDB pCDB;
     ULONG BlockCount;
     PIO_STACK_LOCATION IoStack;
     PSCSI_REQUEST_BLOCK Request;
-    PVOID Buffer;
 
     //
     // get current stack location
@@ -939,7 +938,7 @@
     //
     // informal debug print
     //
-    DPRINT1("USBSTOR_SendReadWriteCmd DataTransferLength %x, BlockLength 
%x\n", Request->DataTransferLength, PDODeviceExtension->BlockLength);
+    DPRINT("USBSTOR_SendReadWriteCmd DataTransferLength %lu, BlockLength 
%lu\n", Request->DataTransferLength, PDODeviceExtension->BlockLength);
 
     //
     // sanity check
@@ -963,12 +962,12 @@
     Cmd.LogicalBlockByte2 = pCDB->CDB10.LogicalBlockByte2;
     Cmd.LogicalBlockByte3 = pCDB->CDB10.LogicalBlockByte3;
 
-    DPRINT1("BlockAddress %x%x%x%x BlockCount %lu BlockLength %lu\n", 
Cmd.LogicalBlockByte0, Cmd.LogicalBlockByte1, Cmd.LogicalBlockByte2, 
Cmd.LogicalBlockByte3, BlockCount, PDODeviceExtension->BlockLength);
+    DPRINT1("USBSTOR_SendReadWriteCmd BlockAddress %x%x%x%x BlockCount %lu 
BlockLength %lu\n", Cmd.LogicalBlockByte0, Cmd.LogicalBlockByte1, 
Cmd.LogicalBlockByte2, Cmd.LogicalBlockByte3, BlockCount, 
PDODeviceExtension->BlockLength);
 
     //
     // send request
     //
-       return USBSTOR_SendRequest(DeviceObject, Irp, NULL, 
UFI_READ_WRITE_CMD_LEN, (PUCHAR)&Cmd, Request->DataTransferLength, 
(PUCHAR)Request->DataBuffer);
+    return USBSTOR_SendRequest(DeviceObject, Irp, NULL, 
UFI_READ_WRITE_CMD_LEN, (PUCHAR)&Cmd, Request->DataTransferLength, 
(PUCHAR)Request->DataBuffer);
 }
 
 NTSTATUS

Modified: branches/usb-bringup/drivers/usb/usbstor/usbstor.c
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/usbstor.c?rev=51759&r1=51758&r2=51759&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/usbstor.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/usbstor.c [iso-8859-1] Sun May 15 
12:47:54 2011
@@ -148,8 +148,6 @@
     PDEVICE_OBJECT DeviceObject,
     PIRP Irp)
 {
-    NTSTATUS Status;
-
     //
     // handle requests
     //

Modified: branches/usb-bringup/drivers/usb/usbstor/usbstor.h
URL: 
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor/usbstor.h?rev=51759&r1=51758&r2=51759&view=diff
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/usbstor.h [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/usbstor.h [iso-8859-1] Sun May 15 
12:47:54 2011
@@ -66,6 +66,8 @@
     KSPIN_LOCK IrpListLock;                                                    
          // irp list lock
     LIST_ENTRY IrpListHead;                                                    
          // irp list head
     BOOLEAN IrpListFreeze;                                                     
          // if true the irp list is freezed
+    BOOLEAN ResetInProgress;                                                   
          // if hard reset is in progress
+    ULONG IrpPendingCount;                                                     
          // count of irp pending
 }FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
 
 typedef struct
@@ -371,6 +373,10 @@
     IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp);
 
+NTSTATUS
+USBSTOR_SendInquiryCmd(
+    IN PDEVICE_OBJECT DeviceObject);
+
 //---------------------------------------------------------------------
 //
 // disk.c routines
@@ -417,3 +423,4 @@
 VOID
 USBSTOR_QueueInitialize(
     PFDO_DEVICE_EXTENSION FDODeviceExtension);
+


Reply via email to