Author: janderwald
Date: Fri May 24 19:02:28 2013
New Revision: 59081

URL: http://svn.reactos.org/svn/reactos?rev=59081&view=rev
Log:
[USBSTOR]
- partly implement support for scsiop_mechanism command, not yet activated
- terminate request properly when it is not supported. Fixes leaking of irp 
requests

Modified:
    trunk/reactos/drivers/usb/usbstor/scsi.c

Modified: trunk/reactos/drivers/usb/usbstor/scsi.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbstor/scsi.c?rev=59081&r1=59080&r2=59081&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbstor/scsi.c    [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbstor/scsi.c    [iso-8859-1] Fri May 24 
19:02:28 2013
@@ -1249,6 +1249,52 @@
     return USBSTOR_SendRequest(DeviceObject, Irp, UFI_TEST_UNIT_CMD_LEN, 
(PUCHAR)&Cmd, 0, NULL, RetryCount);
 }
 
+NTSTATUS
+USBSTOR_SendUnknownRequest(
+    IN PDEVICE_OBJECT DeviceObject,
+    IN OUT PIRP Irp,
+    IN ULONG RetryCount)
+{
+    PPDO_DEVICE_EXTENSION PDODeviceExtension;
+    PIO_STACK_LOCATION IoStack;
+    PSCSI_REQUEST_BLOCK Request;
+    UFI_TEST_UNIT_CMD Cmd;
+
+    //
+    // get current stack location
+    //
+    IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+    //
+    // get request block
+    //
+    Request = IoStack->Parameters.Others.Argument1;
+
+    //
+    // get PDO device extension
+    //
+    PDODeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+    //
+    // check that we're sending to the right LUN
+    //
+    ASSERT(Request->Cdb[1] == (PDODeviceExtension->LUN & MAX_LUN));
+
+    //
+    // sanity check
+    //
+    ASSERT(Request->CdbLength == sizeof(UFI_TEST_UNIT_CMD));
+
+    //
+    // initialize test unit cmd
+    //
+    RtlCopyMemory(&Cmd, Request->Cdb, Request->CdbLength);
+
+    //
+    // send the request
+    //
+    return USBSTOR_SendRequest(DeviceObject, Irp, Request->CdbLength, 
(PUCHAR)&Cmd, Request->DataTransferLength, Request->DataBuffer, RetryCount);
+}
 
 NTSTATUS
 USBSTOR_HandleExecuteSCSI(
@@ -1366,12 +1412,28 @@
         //
         Status = USBSTOR_SendTestUnit(DeviceObject, Irp, RetryCount);
     }
+#if 0
+    else if (pCDB->AsByte[0] == SCSIOP_MECHANISM_STATUS)
+    {
+        DPRINT1("SCSIOP_MECHANISM_STATUS\n");
+
+        //
+        // Just send it the way it is
+        //
+        Status = USBSTOR_SendUnknownRequest(DeviceObject, Irp, RetryCount);
+    }
+#endif
     else
     {
+        // unsupported request
         DPRINT1("UNIMPLEMENTED Operation Code %x\n", pCDB->AsByte[0]);
+        Status = STATUS_NOT_SUPPORTED;
+
         Request->SrbStatus = SRB_STATUS_ERROR;
-        Status = STATUS_NOT_SUPPORTED;
-        DbgBreakPoint();
+        Irp->IoStatus.Status = Status;
+        Irp->IoStatus.Information = 0;
+        USBSTOR_QueueTerminateRequest(PDODeviceExtension->LowerDeviceObject, 
Irp);
+        IoCompleteRequest(Irp, IO_NO_INCREMENT);
     }
 
     return Status;


Reply via email to