diff --git a/reactos/drivers/storage/class2/class2.c b/reactos/drivers/storage/class2/class2.c index 5eabbe9e435..1ff1ac9de6b 100644 --- a/reactos/drivers/storage/class2/class2.c +++ b/reactos/drivers/storage/class2/class2.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: 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) diff --git a/reactos/include/ddk/class2.h b/reactos/include/ddk/class2.h index 45b28d08a97..33850e5933d 100644 --- a/reactos/include/ddk/class2.h +++ b/reactos/include/ddk/class2.h @@ -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 */