update for HEAD-2003021201
[reactos.git] / drivers / storage / class2 / class2.c
index 0b01fca..c36b07e 100644 (file)
@@ -69,9 +69,7 @@ ScsiClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
 
 static VOID
 ScsiClassRetryRequest(PDEVICE_OBJECT DeviceObject,
-                     PIRP Irp,
-                     PSCSI_REQUEST_BLOCK Srb,
-                     BOOLEAN Associated);
+                     PIRP Irp, PSCSI_REQUEST_BLOCK Srb, BOOLEAN Associated);
 
 /* FUNCTIONS ****************************************************************/
 
@@ -160,9 +158,7 @@ ScsiClassBuildRequest(PDEVICE_OBJECT DeviceObject,
   DPRINT("Logical block address: %lu\n", LogicalBlockAddress);
 
   /* Allocate and initialize an SRB */
-  /* FIXME: use lookaside list instead */
-  Srb = ExAllocatePool(NonPagedPool,
-                      sizeof(SCSI_REQUEST_BLOCK));
+  Srb = ExAllocateFromNPagedLookasideList(&DeviceExtension->SrbLookasideListHead);
 
   Srb->SrbFlags = 0;
   Srb->Length = sizeof(SCSI_REQUEST_BLOCK); //SCSI_REQUEST_BLOCK_SIZE;
@@ -171,6 +167,7 @@ ScsiClassBuildRequest(PDEVICE_OBJECT DeviceObject,
   Srb->TargetId = DeviceExtension->TargetId;
   Srb->Lun = DeviceExtension->Lun;
   Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+  //FIXME: NT4 DDK sample uses MmGetMdlVirtualAddress! Why shouldn't we?
   Srb->DataBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
   Srb->DataTransferLength = CurrentIrpStack->Parameters.Read.Length;
   Srb->QueueAction = SRB_SIMPLE_TAG_REQUEST;
@@ -240,10 +237,9 @@ ScsiClassBuildRequest(PDEVICE_OBJECT DeviceObject,
   /* Initialize next stack location */
   NextIrpStack->MajorFunction = IRP_MJ_SCSI;
   NextIrpStack->Parameters.Scsi.Srb = Srb;
-  NextIrpStack->DeviceObject = DeviceObject;
 
   /* Set retry count */
-  NextIrpStack->Parameters.Others.Argument4 = (PVOID)MAXIMUM_RETRIES;
+  CurrentIrpStack->Parameters.Others.Argument4 = (PVOID)MAXIMUM_RETRIES;
 
   DPRINT("IoSetCompletionRoutine (Irp %p  Srb %p)\n", Irp, Srb);
   IoSetCompletionRoutine(Irp,
@@ -420,7 +416,7 @@ ScsiClassDeviceControl(PDEVICE_OBJECT DeviceObject,
   ULONG IoControlCode;
   ULONG OutputBufferLength;
 
-  DPRINT1("ScsiClassDeviceControl() called\n");
+  DPRINT("ScsiClassDeviceControl() called\n");
 
   DeviceExtension = DeviceObject->DeviceExtension;
   Stack = IoGetCurrentIrpStackLocation(Irp);
@@ -775,7 +771,7 @@ ScsiClassInterpretSenseInfo(PDEVICE_OBJECT DeviceObject,
   DPRINT("ScsiClassInterpretSenseInfo() called\n");
 
   DPRINT("Srb->SrbStatus %lx\n", Srb->SrbStatus);
-
+  
   if (SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_PENDING)
     {
       *Status = STATUS_SUCCESS;
@@ -899,10 +895,16 @@ ScsiClassIoComplete(PDEVICE_OBJECT DeviceObject,
          DeviceObject, Irp, Context);
 
   DeviceExtension = DeviceObject->DeviceExtension;
-  Srb = (PSCSI_REQUEST_BLOCK)Context;
-  DPRINT("Srb %p\n", Srb);
 
   IrpStack = IoGetCurrentIrpStackLocation(Irp);
+  
+  //BUGBUG -> Srb = IrpStack->Parameters.Scsi.Srb;
+  //Must pass Srb as Context arg!! See comment about Completion routines in 
+  //IofCallDriver for more info.
+  
+  Srb = (PSCSI_REQUEST_BLOCK)Context;
+
+  DPRINT("Srb %p\n", Srb);
 
   if (SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_SUCCESS)
     {
@@ -916,22 +918,24 @@ ScsiClassIoComplete(PDEVICE_OBJECT DeviceObject,
                                          0,
                                          MAXIMUM_RETRIES - ((ULONG)IrpStack->Parameters.Others.Argument4),
                                          &Status);
-      if ((Retry == TRUE) &&
+      if ((Retry) &&
          ((ULONG)IrpStack->Parameters.Others.Argument4 > 0))
        {
          ((ULONG)IrpStack->Parameters.Others.Argument4)--;
 
-         ScsiClassRetryRequest(DeviceObject,
-                               Irp,
-                               Srb,
-                               FALSE);
+         ScsiClassRetryRequest(
+                  DeviceObject,
+                 Irp, 
+                 Srb,
+                 FALSE);
+
          return(STATUS_MORE_PROCESSING_REQUIRED);
        }
     }
 
-  /* FIXME: use lookaside list instead */
-  DPRINT("Freed SRB %p\n", IrpStack->Parameters.Scsi.Srb);
-  ExFreePool(IrpStack->Parameters.Scsi.Srb);
+  /* Free the SRB */
+  ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead,
+                             Srb);
 
   Irp->IoStatus.Status = Status;
   if (!NT_SUCCESS(Status))
@@ -977,11 +981,17 @@ ScsiClassIoCompleteAssociated(PDEVICE_OBJECT DeviceObject,
 
   MasterIrp = Irp->AssociatedIrp.MasterIrp;
   DeviceExtension = DeviceObject->DeviceExtension;
-  Srb = (PSCSI_REQUEST_BLOCK)Context;
-  DPRINT("Srb %p\n", Srb);
 
   IrpStack = IoGetCurrentIrpStackLocation(Irp);
 
+  //BUGBUG -> Srb = Srb = IrpStack->Parameters.Scsi.Srb;
+  //Must pass Srb as Context arg!! See comment about Completion routines in 
+  //IofCallDriver for more info.
+
+  Srb = (PSCSI_REQUEST_BLOCK)Context;
+  
+  DPRINT("Srb %p\n", Srb);
+
   if (SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_SUCCESS)
     {
       Status = STATUS_SUCCESS;
@@ -996,24 +1006,24 @@ ScsiClassIoCompleteAssociated(PDEVICE_OBJECT DeviceObject,
                                          MAXIMUM_RETRIES - ((ULONG)IrpStack->Parameters.Others.Argument4),
                                          &Status);
 
-      DPRINT1("Retry count: %lu\n", (ULONG)IrpStack->Parameters.Others.Argument4);
-
-      if ((Retry == TRUE) &&
+      if ((Retry) &&
          ((ULONG)IrpStack->Parameters.Others.Argument4 > 0))
        {
          ((ULONG)IrpStack->Parameters.Others.Argument4)--;
 
-         ScsiClassRetryRequest(DeviceObject,
-                               Irp,
-                               Srb,
-                               TRUE);
+         ScsiClassRetryRequest(
+                  DeviceObject,
+                 Irp, 
+                 Srb,
+                  TRUE);
+
          return(STATUS_MORE_PROCESSING_REQUIRED);
        }
     }
 
-  /* FIXME: use lookaside list instead */
-  DPRINT("Freed SRB %p\n", IrpStack->Parameters.Scsi.Srb);
-  ExFreePool(IrpStack->Parameters.Scsi.Srb);
+  /* Free the SRB */
+  ExFreeToNPagedLookasideList(&DeviceExtension->SrbLookasideListHead,
+                             Srb);
 
   Irp->IoStatus.Status = Status;
 
@@ -1618,14 +1628,17 @@ ScsiClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
 
 
 static VOID
-ScsiClassRetryRequest(PDEVICE_OBJECT DeviceObject,
-                     PIRP Irp,
-                     PSCSI_REQUEST_BLOCK Srb,
-                     BOOLEAN Associated)
+ScsiClassRetryRequest(
+   PDEVICE_OBJECT DeviceObject,
+   PIRP Irp, 
+   PSCSI_REQUEST_BLOCK Srb,
+   BOOLEAN Associated
+   )
 {
   PDEVICE_EXTENSION DeviceExtension;
   PIO_STACK_LOCATION CurrentIrpStack;
   PIO_STACK_LOCATION NextIrpStack;
+
   ULONG TransferLength;
 
   DPRINT("ScsiPortRetryRequest() called\n");
@@ -1634,21 +1647,23 @@ ScsiClassRetryRequest(PDEVICE_OBJECT DeviceObject,
   CurrentIrpStack = IoGetCurrentIrpStackLocation(Irp);
   NextIrpStack = IoGetNextIrpStackLocation(Irp);
 
-  if (CurrentIrpStack->MajorFunction == IRP_MJ_READ ||
-      CurrentIrpStack->MajorFunction == IRP_MJ_WRITE)
+  if (CurrentIrpStack->MajorFunction != IRP_MJ_READ &&
+      CurrentIrpStack->MajorFunction != IRP_MJ_WRITE)
     {
-      TransferLength = CurrentIrpStack->Parameters.Read.Length;
-    }
-  else if (Irp->MdlAddress != NULL)
-    {
-      TransferLength = Irp->MdlAddress->ByteCount;
-    }
-  else
-    {
-      TransferLength = 0;
+      /* We shouldn't setup the buffer pointer and transfer length on read/write requests. */
+      if (Irp->MdlAddress != NULL)
+        {
+          TransferLength = Irp->MdlAddress->ByteCount;
+        }
+      else
+        {
+          TransferLength = 0;
+        }
+
+      Srb->DataBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
+      Srb->DataTransferLength = TransferLength;
     }
 
-  Srb->DataTransferLength = TransferLength;
   Srb->SrbStatus = 0;
   Srb->ScsiStatus = 0;
 
@@ -1660,23 +1675,24 @@ ScsiClassRetryRequest(PDEVICE_OBJECT DeviceObject,
   NextIrpStack->Parameters.Scsi.Srb = Srb;
 
   if (Associated == FALSE)
-    {
-      IoSetCompletionRoutine(Irp,
-                            ScsiClassIoComplete,
-                            Srb,
-                            TRUE,
-                            TRUE,
-                            TRUE);
-    }
-  else
-    {
-      IoSetCompletionRoutine(Irp,
-                            ScsiClassIoCompleteAssociated,
-                            Srb,
-                            TRUE,
-                            TRUE,
-                            TRUE);
-    }
+  {
+     IoSetCompletionRoutine(Irp,
+                            ScsiClassIoComplete,   
+                            Srb,   
+                            TRUE,   
+                            TRUE,   
+                            TRUE);   
+  }   
+  else   
+  {   
+     IoSetCompletionRoutine(Irp,   
+                            ScsiClassIoCompleteAssociated,   
+                            Srb,   
+                            TRUE,   
+                            TRUE,   
+                            TRUE);   
+  } 
+
 
   IoCallDriver(DeviceExtension->PortDeviceObject,
               Irp);