Convert SCSI SRB to ATAPI format for MODE_SENSE, MODE_SELECT and FORMAT_UNIT SCSI...
authorEric Kohl <eric.kohl@reactos.org>
Sat, 12 Jul 2003 19:18:31 +0000 (19:18 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sat, 12 Jul 2003 19:18:31 +0000 (19:18 +0000)
svn path=/trunk/; revision=5103

reactos/drivers/storage/atapi/atapi.c
reactos/drivers/storage/atapi/atapi.h

index a015b3a..49da543 100644 (file)
@@ -16,7 +16,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
-/* $Id: atapi.c,v 1.41 2003/07/11 14:10:41 ekohl Exp $
+/* $Id: atapi.c,v 1.42 2003/07/12 19:18:31 ekohl Exp $
  *
  * COPYRIGHT:   See COPYING in the top level directory
  * PROJECT:     ReactOS ATAPI miniport driver
@@ -249,6 +249,9 @@ static UCHAR
 AtapiErrorToScsi(PVOID DeviceExtension,
                 PSCSI_REQUEST_BLOCK Srb);
 
+static VOID
+AtapiScsiSrbToAtapi (PSCSI_REQUEST_BLOCK Srb);
+
 //  ----------------------------------------------------------------  Inlines
 
 void
@@ -1793,6 +1796,16 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension,
       ScsiPortStallExecution(10);
     }
 
+  /* Convert special SCSI SRBs to ATAPI format */
+  switch (Srb->Cdb[0])
+    {
+      case SCSIOP_FORMAT_UNIT:
+      case SCSIOP_MODE_SELECT:
+      case SCSIOP_MODE_SENSE:
+       AtapiScsiSrbToAtapi (Srb);
+       break;
+    }
+
   CdbSize = (DeviceExtension->DeviceParams[Srb->TargetId].ConfigBits & 0x3 == 1) ? 16 : 12;
   DPRINT("CdbSize: %lu\n", CdbSize);
 
@@ -2489,4 +2502,56 @@ AtapiErrorToScsi(PVOID DeviceExtension,
   return(SrbStatus);
 }
 
+
+static VOID
+AtapiScsiSrbToAtapi (PSCSI_REQUEST_BLOCK Srb)
+{
+  DPRINT("AtapiConvertScsiToAtapi() called\n");
+
+  Srb->CdbLength = 12;
+
+  switch (Srb->Cdb[0])
+    {
+      case SCSIOP_FORMAT_UNIT:
+       Srb->Cdb[0] = ATAPI_FORMAT_UNIT;
+       break;
+
+      case SCSIOP_MODE_SELECT:
+         {
+           PATAPI_MODE_SELECT12 AtapiModeSelect;
+           UCHAR Length;
+
+           AtapiModeSelect = (PATAPI_MODE_SELECT12)Srb->Cdb;
+           Length = ((PCDB)Srb->Cdb)->MODE_SELECT.ParameterListLength;
+
+           RtlZeroMemory (Srb->Cdb,
+                          MAXIMUM_CDB_SIZE);
+           AtapiModeSelect->OperationCode = ATAPI_MODE_SELECT;
+           AtapiModeSelect->PFBit = 1;
+           AtapiModeSelect->ParameterListLengthMsb = 0;
+           AtapiModeSelect->ParameterListLengthLsb = Length;
+         }
+       break;
+
+      case SCSIOP_MODE_SENSE:
+         {
+           PATAPI_MODE_SENSE12 AtapiModeSense;
+           UCHAR PageCode;
+           UCHAR Length;
+
+           AtapiModeSense = (PATAPI_MODE_SENSE12)Srb->Cdb;
+           PageCode = ((PCDB)Srb->Cdb)->MODE_SENSE.PageCode;
+           Length = ((PCDB)Srb->Cdb)->MODE_SENSE.AllocationLength;
+
+           RtlZeroMemory (Srb->Cdb,
+                          MAXIMUM_CDB_SIZE);
+           AtapiModeSense->OperationCode = ATAPI_MODE_SENSE;
+           AtapiModeSense->PageCode = PageCode;
+           AtapiModeSense->ParameterListLengthMsb = 0;
+           AtapiModeSense->ParameterListLengthLsb = Length;
+         }
+       break;
+    }
+}
+
 /* EOF */
index 09da13c..f179d41 100644 (file)
@@ -186,7 +186,7 @@ typedef struct _IDE_DRIVE_IDENTIFY
   WORD  Reserved69[2];       /*69*/
   WORD  Reserved71[4];       /*71*/
   WORD  MaxQueueDepth;       /*75*/
-  WORD  Reserved76[4];       /*79*/
+  WORD  Reserved76[4];       /*76*/
   WORD  MajorRevision;       /*80*/
   WORD  MinorRevision;       /*81*/
   WORD  SupportedFeatures82; /*82*/
@@ -202,6 +202,43 @@ typedef struct _IDE_DRIVE_IDENTIFY
   WORD  Checksum;            /*255*/
 } IDE_DRIVE_IDENTIFY, *PIDE_DRIVE_IDENTIFY;
 
+
+/* Special ATAPI commands */
+
+#define ATAPI_FORMAT_UNIT      0x24
+#define ATAPI_MODE_SELECT      0x55
+#define ATAPI_MODE_SENSE       0x5A
+
+
+/* Special ATAPI_MODE_SELECT (12 bytes) command block */
+
+typedef struct _ATAPI_MODE_SELECT12
+{
+  UCHAR OperationCode;
+  UCHAR Reserved1:4;
+  UCHAR PFBit:1;
+  UCHAR Reserved2:3;
+  UCHAR Reserved3[5];
+  UCHAR ParameterListLengthMsb;
+  UCHAR ParameterListLengthLsb;
+  UCHAR Reserved4[3];
+} ATAPI_MODE_SELECT12, *PATAPI_MODE_SELECT12;
+
+
+/* Special ATAPI_MODE_SENSE (12 bytes) command block */
+
+typedef struct _ATAPI_MODE_SENSE12
+{
+  UCHAR OperationCode;
+  UCHAR Reserved1;
+  UCHAR PageCode:6;
+  UCHAR Pc:2;
+  UCHAR Reserved2[4];
+  UCHAR ParameterListLengthMsb;
+  UCHAR ParameterListLengthLsb;
+  UCHAR Reserved3[3];
+} ATAPI_MODE_SENSE12, *PATAPI_MODE_SENSE12;
+
 #ifdef __cplusplus
 }
 #endif