mirror of
https://github.com/reactos/reactos.git
synced 2025-05-25 12:14:32 +00:00
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:
parent
043a6c087f
commit
15f281d6a1
2 changed files with 104 additions and 2 deletions
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue