From 15f281d6a1d27c82f81104236925300e8e51c1df Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 12 Jul 2003 19:18:31 +0000 Subject: [PATCH] Convert SCSI SRB to ATAPI format for MODE_SENSE, MODE_SELECT and FORMAT_UNIT SCSI commands. svn path=/trunk/; revision=5103 --- reactos/drivers/storage/atapi/atapi.c | 67 ++++++++++++++++++++++++++- reactos/drivers/storage/atapi/atapi.h | 39 +++++++++++++++- 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/atapi/atapi.c b/reactos/drivers/storage/atapi/atapi.c index a015b3aa709..49da543a5a7 100644 --- a/reactos/drivers/storage/atapi/atapi.c +++ b/reactos/drivers/storage/atapi/atapi.c @@ -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 */ diff --git a/reactos/drivers/storage/atapi/atapi.h b/reactos/drivers/storage/atapi/atapi.h index 09da13c656e..f179d413c52 100644 --- a/reactos/drivers/storage/atapi/atapi.h +++ b/reactos/drivers/storage/atapi/atapi.h @@ -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