mirror of
https://github.com/reactos/reactos.git
synced 2025-05-23 02:56:09 +00:00
Implemented ScsiClassModeSense().
svn path=/trunk/; revision=5074
This commit is contained in:
parent
040095cb66
commit
c71f4b34ff
2 changed files with 135 additions and 89 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: class2.c,v 1.36 2003/07/10 15:11:58 chorns Exp $
|
||||
/* $Id: class2.c,v 1.37 2003/07/11 14:07:13 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -55,10 +55,6 @@ static NTSTATUS STDCALL
|
|||
ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
|
||||
static NTSTATUS STDCALL
|
||||
ScsiClassScsiDispatch(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
|
||||
static NTSTATUS STDCALL
|
||||
ScsiClassDeviceDispatch(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
|
@ -139,8 +135,8 @@ ScsiClassAsynchronousCompletion(IN PDEVICE_OBJECT DeviceObject,
|
|||
* @implemented
|
||||
*/
|
||||
VOID STDCALL
|
||||
ScsiClassBuildRequest(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp)
|
||||
ScsiClassBuildRequest(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
PIO_STACK_LOCATION CurrentIrpStack;
|
||||
|
@ -423,8 +419,8 @@ ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
|||
* @implemented
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassDeviceControl(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp)
|
||||
ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
PIO_STACK_LOCATION NextStack;
|
||||
|
@ -569,10 +565,10 @@ ScsiClassDeviceControl(PDEVICE_OBJECT DeviceObject,
|
|||
* @unimplemented
|
||||
*/
|
||||
PVOID STDCALL
|
||||
ScsiClassFindModePage(PCHAR ModeSenseBuffer,
|
||||
ULONG Length,
|
||||
UCHAR PageMode,
|
||||
BOOLEAN Use6Byte)
|
||||
ScsiClassFindModePage(IN PCHAR ModeSenseBuffer,
|
||||
IN ULONG Length,
|
||||
IN UCHAR PageMode,
|
||||
IN BOOLEAN Use6Byte)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
@ -582,8 +578,8 @@ ScsiClassFindModePage(PCHAR ModeSenseBuffer,
|
|||
* @implemented
|
||||
*/
|
||||
ULONG STDCALL
|
||||
ScsiClassFindUnclaimedDevices(PCLASS_INIT_DATA InitializationData,
|
||||
PSCSI_ADAPTER_BUS_INFO AdapterInformation)
|
||||
ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData,
|
||||
IN PSCSI_ADAPTER_BUS_INFO AdapterInformation)
|
||||
{
|
||||
PSCSI_INQUIRY_DATA UnitInfo;
|
||||
PINQUIRYDATA InquiryData;
|
||||
|
@ -629,8 +625,8 @@ ScsiClassFindUnclaimedDevices(PCLASS_INIT_DATA InitializationData,
|
|||
* @implemented
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassGetCapabilities(PDEVICE_OBJECT PortDeviceObject,
|
||||
PIO_SCSI_CAPABILITIES *PortCapabilities)
|
||||
ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject,
|
||||
OUT PIO_SCSI_CAPABILITIES *PortCapabilities)
|
||||
{
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
NTSTATUS Status;
|
||||
|
@ -677,8 +673,8 @@ ScsiClassGetCapabilities(PDEVICE_OBJECT PortDeviceObject,
|
|||
* @implemented
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassGetInquiryData(PDEVICE_OBJECT PortDeviceObject,
|
||||
PSCSI_ADAPTER_BUS_INFO *ConfigInfo)
|
||||
ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject,
|
||||
IN PSCSI_ADAPTER_BUS_INFO *ConfigInfo)
|
||||
{
|
||||
PSCSI_ADAPTER_BUS_INFO Buffer;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
|
@ -746,9 +742,9 @@ ScsiClassGetInquiryData(PDEVICE_OBJECT PortDeviceObject,
|
|||
* @implemented
|
||||
*/
|
||||
ULONG STDCALL
|
||||
ScsiClassInitialize(PVOID Argument1,
|
||||
PVOID Argument2,
|
||||
PCLASS_INIT_DATA InitializationData)
|
||||
ScsiClassInitialize(IN PVOID Argument1,
|
||||
IN PVOID Argument2,
|
||||
IN PCLASS_INIT_DATA InitializationData)
|
||||
{
|
||||
PCONFIGURATION_INFORMATION ConfigInfo;
|
||||
PDRIVER_OBJECT DriverObject = Argument1;
|
||||
|
@ -766,7 +762,7 @@ ScsiClassInitialize(PVOID Argument1,
|
|||
DriverObject->MajorFunction[IRP_MJ_CLOSE] = ScsiClassCreateClose;
|
||||
DriverObject->MajorFunction[IRP_MJ_READ] = ScsiClassReadWrite;
|
||||
DriverObject->MajorFunction[IRP_MJ_WRITE] = ScsiClassReadWrite;
|
||||
DriverObject->MajorFunction[IRP_MJ_SCSI] = ScsiClassScsiDispatch;
|
||||
DriverObject->MajorFunction[IRP_MJ_SCSI] = ScsiClassInternalIoControl;
|
||||
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ScsiClassDeviceDispatch;
|
||||
DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = ScsiClassShutdownFlush;
|
||||
DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = ScsiClassShutdownFlush;
|
||||
|
@ -842,8 +838,8 @@ ScsiClassInitialize(PVOID Argument1,
|
|||
* @implemented
|
||||
*/
|
||||
VOID STDCALL
|
||||
ScsiClassInitializeSrbLookasideList(PDEVICE_EXTENSION DeviceExtension,
|
||||
ULONG NumberElements)
|
||||
ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension,
|
||||
IN ULONG NumberElements)
|
||||
{
|
||||
ExInitializeNPagedLookasideList(&DeviceExtension->SrbLookasideListHead,
|
||||
NULL,
|
||||
|
@ -859,29 +855,36 @@ ScsiClassInitializeSrbLookasideList(PDEVICE_EXTENSION DeviceExtension,
|
|||
* @unimplemented
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassInternalIoControl(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp)
|
||||
ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
DPRINT1("ScsiClassInternalIoContol() called\n");
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
BOOLEAN STDCALL
|
||||
ScsiClassInterpretSenseInfo(PDEVICE_OBJECT DeviceObject,
|
||||
PSCSI_REQUEST_BLOCK Srb,
|
||||
UCHAR MajorFunctionCode,
|
||||
ULONG IoDeviceCode,
|
||||
ULONG RetryCount,
|
||||
NTSTATUS *Status)
|
||||
ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PSCSI_REQUEST_BLOCK Srb,
|
||||
IN UCHAR MajorFunctionCode,
|
||||
IN ULONG IoDeviceCode,
|
||||
IN ULONG RetryCount,
|
||||
OUT NTSTATUS *Status)
|
||||
{
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
#if 0
|
||||
PIO_ERROR_LOG_PACKET LogPacket;
|
||||
#endif
|
||||
PSENSE_DATA SenseData;
|
||||
NTSTATUS LogStatus;
|
||||
BOOLEAN LogError;
|
||||
BOOLEAN Retry;
|
||||
|
||||
|
@ -914,9 +917,13 @@ ScsiClassInterpretSenseInfo(PDEVICE_OBJECT DeviceObject,
|
|||
/* FIXME: add more sense key codes */
|
||||
#if 0
|
||||
case SCSI_SENSE_NO_SENSE:
|
||||
#endif
|
||||
|
||||
case SCSI_SENSE_RECOVERED_ERROR:
|
||||
#endif
|
||||
DPRINT("SCSI_SENSE_RECOVERED_ERROR\n");
|
||||
*Status = STATUS_SUCCESS;
|
||||
Retry = FALSE;
|
||||
break;
|
||||
|
||||
case SCSI_SENSE_NOT_READY:
|
||||
DPRINT("SCSI_SENSE_NOT_READY\n");
|
||||
|
@ -1077,9 +1084,9 @@ ScsiClassInterpretSenseInfo(PDEVICE_OBJECT DeviceObject,
|
|||
* @implemented
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassIoComplete(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
PVOID Context)
|
||||
ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN PVOID Context)
|
||||
{
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
PIO_STACK_LOCATION IrpStack;
|
||||
|
@ -1164,9 +1171,9 @@ ScsiClassIoComplete(PDEVICE_OBJECT DeviceObject,
|
|||
* @implemented
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassIoCompleteAssociated(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
PVOID Context)
|
||||
ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN PVOID Context)
|
||||
{
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
PIO_STACK_LOCATION IrpStack;
|
||||
|
@ -1265,15 +1272,62 @@ ScsiClassIoCompleteAssociated(PDEVICE_OBJECT DeviceObject,
|
|||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
* @implemented
|
||||
*/
|
||||
ULONG STDCALL
|
||||
ScsiClassModeSense(PDEVICE_OBJECT DeviceObject,
|
||||
CHAR ModeSenseBuffer,
|
||||
ULONG Length,
|
||||
UCHAR PageMode)
|
||||
ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PCHAR ModeSenseBuffer,
|
||||
IN ULONG Length,
|
||||
IN UCHAR PageMode)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
SCSI_REQUEST_BLOCK Srb;
|
||||
ULONG RetryCount;
|
||||
PCDB Cdb;
|
||||
NTSTATUS Status;
|
||||
|
||||
DPRINT("ScsiClassModeSense() called\n");
|
||||
|
||||
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||
RetryCount = 1;
|
||||
|
||||
/* Initialize the SRB */
|
||||
RtlZeroMemory (&Srb,
|
||||
sizeof(SCSI_REQUEST_BLOCK));
|
||||
Srb.CdbLength = 6;
|
||||
Srb.TimeOutValue = DeviceExtension->TimeOutValue;
|
||||
|
||||
/* Initialize the CDB */
|
||||
Cdb = (PCDB)&Srb.Cdb;
|
||||
Cdb->MODE_SENSE.OperationCode = SCSIOP_MODE_SENSE;
|
||||
Cdb->MODE_SENSE.PageCode = PageMode;
|
||||
Cdb->MODE_SENSE.AllocationLength = (UCHAR)Length;
|
||||
|
||||
TryAgain:
|
||||
Status = ScsiClassSendSrbSynchronous (DeviceObject,
|
||||
&Srb,
|
||||
ModeSenseBuffer,
|
||||
Length,
|
||||
FALSE);
|
||||
if (Status == STATUS_VERIFY_REQUIRED)
|
||||
{
|
||||
if (RetryCount != 0)
|
||||
{
|
||||
RetryCount--;
|
||||
goto TryAgain;
|
||||
}
|
||||
}
|
||||
else if (SRB_STATUS(Srb.SrbStatus) == SRB_STATUS_DATA_OVERRUN)
|
||||
{
|
||||
Status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return Srb.DataTransferLength;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1690,9 +1744,9 @@ TryAgain:
|
|||
* @implemented
|
||||
*/
|
||||
VOID STDCALL
|
||||
ScsiClassSplitRequest(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
ULONG MaximumBytes)
|
||||
ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN ULONG MaximumBytes)
|
||||
{
|
||||
PDEVICE_EXTENSION DeviceExtension;
|
||||
PIO_STACK_LOCATION CurrentStack;
|
||||
|
@ -1930,20 +1984,6 @@ ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
|
|||
}
|
||||
|
||||
|
||||
static NTSTATUS STDCALL
|
||||
ScsiClassScsiDispatch(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
{
|
||||
DPRINT1("ScsiClassScsiDispatch() called\n");
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
Irp->IoStatus.Information = 0;
|
||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
||||
static NTSTATUS STDCALL
|
||||
ScsiClassDeviceDispatch(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: class2.h,v 1.2 2003/04/26 22:51:21 ekohl Exp $
|
||||
/* $Id: class2.h,v 1.3 2003/07/11 14:07:30 ekohl Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -136,6 +136,12 @@ NTSTATUS STDCALL
|
|||
ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
|
||||
PVOID STDCALL
|
||||
ScsiClassFindModePage(IN PCHAR ModeSenseBuffer,
|
||||
IN ULONG Length,
|
||||
IN UCHAR PageMode,
|
||||
IN BOOLEAN Use6Byte);
|
||||
|
||||
ULONG STDCALL
|
||||
ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData,
|
||||
OUT PSCSI_ADAPTER_BUS_INFO AdapterInformation);
|
||||
|
@ -154,36 +160,36 @@ ScsiClassInitialize(IN PVOID Argument1,
|
|||
IN PCLASS_INIT_DATA InitializationData);
|
||||
|
||||
VOID STDCALL
|
||||
ScsiClassInitializeSrbLookasideList(PDEVICE_EXTENSION DeviceExtension,
|
||||
ULONG NumberElements);
|
||||
ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension,
|
||||
IN ULONG NumberElements);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassInternalIoControl(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp);
|
||||
ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp);
|
||||
|
||||
BOOLEAN STDCALL
|
||||
ScsiClassInterpretSenseInfo(PDEVICE_OBJECT DeviceObject,
|
||||
PSCSI_REQUEST_BLOCK Srb,
|
||||
UCHAR MajorFunctionCode,
|
||||
ULONG IoDeviceCode,
|
||||
ULONG RetryCount,
|
||||
NTSTATUS *Status);
|
||||
ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PSCSI_REQUEST_BLOCK Srb,
|
||||
IN UCHAR MajorFunctionCode,
|
||||
IN ULONG IoDeviceCode,
|
||||
IN ULONG RetryCount,
|
||||
OUT NTSTATUS *Status);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassIoComplete(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
PVOID Context);
|
||||
ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN PVOID Context);
|
||||
|
||||
NTSTATUS STDCALL
|
||||
ScsiClassIoCompleteAssociated(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
PVOID Context);
|
||||
ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN PVOID Context);
|
||||
|
||||
ULONG STDCALL
|
||||
ScsiClassModeSense(PDEVICE_OBJECT DeviceObject,
|
||||
CHAR ModeSenseBuffer,
|
||||
ULONG Length,
|
||||
UCHAR PageMode);
|
||||
ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PCHAR ModeSenseBuffer,
|
||||
IN ULONG Length,
|
||||
IN UCHAR PageMode);
|
||||
|
||||
ULONG STDCALL
|
||||
ScsiClassQueryTimeOutRegistryValue(IN PUNICODE_STRING RegistryPath);
|
||||
|
@ -207,9 +213,9 @@ ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject,
|
|||
BOOLEAN WriteToDevice);
|
||||
|
||||
VOID STDCALL
|
||||
ScsiClassSplitRequest(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp,
|
||||
ULONG MaximumBytes);
|
||||
ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN ULONG MaximumBytes);
|
||||
|
||||
#endif /* __STORAGE_INCLUDE_CLASS2_H */
|
||||
|
||||
|
|
Loading…
Reference in a new issue