Convert SCSI SRB to ATAPI format for MODE_SENSE, MODE_SELECT and FORMAT_UNIT SCSI commands.

svn path=/trunk/; revision=5103
This commit is contained in:
Eric Kohl 2003-07-12 19:18:31 +00:00
parent 043a6c087f
commit 15f281d6a1
2 changed files with 104 additions and 2 deletions

View 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 */

View 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