Author: janderwald
Date: Fri May 13 13:37:50 2011
New Revision: 51693
URL: 
http://svn.reactos.org/svn/reactos?rev=51693&view=rev
Log:
[USBSTOR]
- Handle SCSIOP_MEDIUM_REMOVAL
- Handle paging i/o requests. These request don't provide a data buffer in the srb,
but the buffer is stored in the irp' mdl
- Fix the hack for unimplemented Mode Sense command
- Usbstor now completes initializes and receives read requests
- Still need to fix read request, as Windows XP fails to recognize the disk format, WIP
Modified:
    branches/usb-bringup/drivers/usb/usbstor/disk.c
    branches/usb-bringup/drivers/usb/usbstor/scsi.c
Modified: branches/usb-bringup/drivers/usb/usbstor/disk.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor…
==============================================================================
--- branches/usb-bringup/drivers/usb/usbstor/disk.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/usb/usbstor/disk.c [iso-8859-1] Fri May 13 13:37:50 2011
@@ -53,12 +53,24 @@
     else if (pCDB->MODE_SENSE.OperationCode == SCSIOP_READ)
     {
         DPRINT1("SCSIOP_READ DataTransferLength %lu\n",
Request->DataTransferLength);
-        ASSERT(Request->DataBuffer);
         //
         // send read command
         //
         Status = USBSTOR_SendReadCmd(DeviceObject, Irp);
+    }
+    else if (pCDB->AsByte[0] == SCSIOP_MEDIUM_REMOVAL)
+    {
+        DPRINT1("SCSIOP_MEDIUM_REMOVAL\n");
+
+        //
+        // just complete the request
+        //
+        Request->SrbStatus = SRB_STATUS_SUCCESS;
+        Irp->IoStatus.Status = STATUS_SUCCESS;
+        Irp->IoStatus.Information = Request->DataTransferLength;
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
+        return STATUS_SUCCESS;
     }
     else if (pCDB->MODE_SENSE.OperationCode == SCSIOP_TEST_UNIT_READY)
     {
Modified: branches/usb-bringup/drivers/usb/usbstor/scsi.c
URL:
http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/usb/usbstor…
==============================================================================
--- 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 13:37:50 2011
@@ -110,12 +110,34 @@
     //
     Context = (PIRP_CONTEXT)Ctx;
+    //
+    // is there a mdl
+    //
     if (Context->TransferBufferMDL)
     {
         //
-        // free mdl
-        //
-        IoFreeMdl(Context->TransferBufferMDL);
+        // is there an irp associated
+        //
+        if (Context->Irp)
+        {
+            //
+            // did we allocate the mdl
+            //
+            if (Context->TransferBufferMDL != Context->Irp->MdlAddress)
+            {
+                //
+                // free mdl
+                //
+                IoFreeMdl(Context->TransferBufferMDL);
+            }
+        }
+        else
+        {
+            //
+            // free mdl
+            //
+            IoFreeMdl(Context->TransferBufferMDL);
+        }
     }
     if (Context->Irp)
@@ -317,7 +339,6 @@
     // access context
     //
     Context = (PIRP_CONTEXT)Ctx;
-
     //
     // get next stack location
@@ -461,15 +482,46 @@
     if (Context->TransferDataLength)
     {
         //
-        // allocate mdl for buffer, buffer must be allocated from NonPagedPool
-        //
-        Context->TransferBufferMDL = IoAllocateMdl(Context->TransferData,
Context->TransferDataLength, FALSE, FALSE, NULL);
-        if (!Context->TransferBufferMDL)
+        // check if the original request already does not have an mdl associated
+        //
+        if (OriginalRequest)
         {
-            //
-            // failed to allocate MDL
-            //
-            return STATUS_INSUFFICIENT_RESOURCES;
+            if (OriginalRequest->MdlAddress != NULL &&
Context->TransferData == NULL)
+            {
+                //
+                // I/O paging request
+                //
+                Context->TransferBufferMDL = OriginalRequest->MdlAddress;
+            }
+            else
+            {
+                //
+                // allocate mdl for buffer, buffer must be allocated from NonPagedPool
+                //
+                Context->TransferBufferMDL = IoAllocateMdl(Context->TransferData,
Context->TransferDataLength, FALSE, FALSE, NULL);
+                if (!Context->TransferBufferMDL)
+                {
+                    //
+                    // failed to allocate MDL
+                    //
+                    return STATUS_INSUFFICIENT_RESOURCES;
+                }
+
+            }
+        }
+        else
+        {
+            //
+            // allocate mdl for buffer, buffer must be allocated from NonPagedPool
+            //
+            Context->TransferBufferMDL = IoAllocateMdl(Context->TransferData,
Context->TransferDataLength, FALSE, FALSE, NULL);
+            if (!Context->TransferBufferMDL)
+            {
+                //
+                // failed to allocate MDL
+                //
+                return STATUS_INSUFFICIENT_RESOURCES;
+            }
         }
         //
@@ -656,8 +708,26 @@
     PCDB pCDB;
     PUFI_MODE_PARAMETER_HEADER Header;
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    PIO_STACK_LOCATION IoStack;
+    PSCSI_REQUEST_BLOCK Request;
+
+    //
+    // get current stack location
+    //
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    //
+    // get request block
+    //
+    Request = (PSCSI_REQUEST_BLOCK)IoStack->Parameters.Others.Argument1;
+
+    RtlZeroMemory(Request->DataBuffer, Request->DataTransferLength);
+    Request->SrbStatus = SRB_STATUS_SUCCESS;
+    Irp->IoStatus.Information = Request->DataTransferLength;
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+    return STATUS_SUCCESS;
 #if 0
     //
@@ -808,6 +878,7 @@
     ULONG BlockCount;
     PIO_STACK_LOCATION IoStack;
     PSCSI_REQUEST_BLOCK Request;
+    PVOID Buffer;
     //
     // get current stack location
@@ -830,10 +901,9 @@
     PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
     //
-    // FIXME: support more logical blocks
-    //
-    DPRINT1("Request->DataTransferLength %x, PDODeviceExtension->BlockLength
%x\n", Request->DataTransferLength, PDODeviceExtension->BlockLength);
-    ASSERT(Request->DataTransferLength == PDODeviceExtension->BlockLength);
+    // informal debug print
+    //
+    DPRINT1("USBSTOR_SendReadCmd DataTransferLength %x, BlockLength %x\n",
Request->DataTransferLength, PDODeviceExtension->BlockLength);
     //
     // block count
@@ -855,7 +925,7 @@
     //
     // send request
     //
-    return USBSTOR_SendRequest(DeviceObject, Irp, NULL, UFI_READ_CMD_LEN,
(PUCHAR)&Cmd, Request->DataTransferLength, (PUCHAR)Request->DataBuffer);
+       return USBSTOR_SendRequest(DeviceObject, Irp, NULL, UFI_READ_CMD_LEN,
(PUCHAR)&Cmd, Request->DataTransferLength, (PUCHAR)Request->DataBuffer);
 }
 NTSTATUS