mirror of
https://github.com/reactos/reactos.git
synced 2025-05-25 20:18:22 +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
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* 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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS ATAPI miniport driver
|
* PROJECT: ReactOS ATAPI miniport driver
|
||||||
|
@ -249,6 +249,9 @@ static UCHAR
|
||||||
AtapiErrorToScsi(PVOID DeviceExtension,
|
AtapiErrorToScsi(PVOID DeviceExtension,
|
||||||
PSCSI_REQUEST_BLOCK Srb);
|
PSCSI_REQUEST_BLOCK Srb);
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
AtapiScsiSrbToAtapi (PSCSI_REQUEST_BLOCK Srb);
|
||||||
|
|
||||||
// ---------------------------------------------------------------- Inlines
|
// ---------------------------------------------------------------- Inlines
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1793,6 +1796,16 @@ AtapiSendAtapiCommand(IN PATAPI_MINIPORT_EXTENSION DeviceExtension,
|
||||||
ScsiPortStallExecution(10);
|
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;
|
CdbSize = (DeviceExtension->DeviceParams[Srb->TargetId].ConfigBits & 0x3 == 1) ? 16 : 12;
|
||||||
DPRINT("CdbSize: %lu\n", CdbSize);
|
DPRINT("CdbSize: %lu\n", CdbSize);
|
||||||
|
|
||||||
|
@ -2489,4 +2502,56 @@ AtapiErrorToScsi(PVOID DeviceExtension,
|
||||||
return(SrbStatus);
|
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 */
|
/* EOF */
|
||||||
|
|
|
@ -186,7 +186,7 @@ typedef struct _IDE_DRIVE_IDENTIFY
|
||||||
WORD Reserved69[2]; /*69*/
|
WORD Reserved69[2]; /*69*/
|
||||||
WORD Reserved71[4]; /*71*/
|
WORD Reserved71[4]; /*71*/
|
||||||
WORD MaxQueueDepth; /*75*/
|
WORD MaxQueueDepth; /*75*/
|
||||||
WORD Reserved76[4]; /*79*/
|
WORD Reserved76[4]; /*76*/
|
||||||
WORD MajorRevision; /*80*/
|
WORD MajorRevision; /*80*/
|
||||||
WORD MinorRevision; /*81*/
|
WORD MinorRevision; /*81*/
|
||||||
WORD SupportedFeatures82; /*82*/
|
WORD SupportedFeatures82; /*82*/
|
||||||
|
@ -202,6 +202,43 @@ typedef struct _IDE_DRIVE_IDENTIFY
|
||||||
WORD Checksum; /*255*/
|
WORD Checksum; /*255*/
|
||||||
} IDE_DRIVE_IDENTIFY, *PIDE_DRIVE_IDENTIFY;
|
} 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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue