mirror of
https://github.com/reactos/reactos.git
synced 2024-10-06 01:13:38 +00:00
Retry failed requests.
Silenced debug output. svn path=/trunk/; revision=6605
This commit is contained in:
parent
dc8ce663c6
commit
6e978c3db1
|
@ -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: cdrom.c,v 1.24 2003/11/07 17:14:22 ekohl Exp $
|
/* $Id: cdrom.c,v 1.25 2003/11/10 18:09:54 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -706,7 +706,6 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
* RETURNS:
|
* RETURNS:
|
||||||
* Status.
|
* Status.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
CdromClassReadTocEntry (PDEVICE_OBJECT DeviceObject,
|
CdromClassReadTocEntry (PDEVICE_OBJECT DeviceObject,
|
||||||
UINT TrackNo,
|
UINT TrackNo,
|
||||||
|
@ -815,7 +814,7 @@ CdromClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||||
switch (ControlCode)
|
switch (ControlCode)
|
||||||
{
|
{
|
||||||
case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
|
case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
|
||||||
DPRINT("IOCTL_CDROM_GET_DRIVE_GEOMETRY\n");
|
DPRINT ("CdromClassDeviceControl: IOCTL_CDROM_GET_DRIVE_GEOMETRY\n");
|
||||||
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY))
|
if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY))
|
||||||
{
|
{
|
||||||
Status = STATUS_INFO_LENGTH_MISMATCH;
|
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||||
|
@ -829,7 +828,7 @@ CdromClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||||
return STATUS_PENDING;
|
return STATUS_PENDING;
|
||||||
|
|
||||||
case IOCTL_CDROM_CHECK_VERIFY:
|
case IOCTL_CDROM_CHECK_VERIFY:
|
||||||
DPRINT ("IOCTL_CDROM_CHECK_VERIFY\n");
|
DPRINT ("CdromClassDeviceControl: IOCTL_CDROM_CHECK_VERIFY\n");
|
||||||
if (OutputLength != 0 && OutputLength < sizeof (ULONG))
|
if (OutputLength != 0 && OutputLength < sizeof (ULONG))
|
||||||
{
|
{
|
||||||
DPRINT1("Buffer too small\n");
|
DPRINT1("Buffer too small\n");
|
||||||
|
@ -964,11 +963,32 @@ CdromClassStartIo (IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
DPRINT("CdromClassStartIo() called!\n");
|
DPRINT("CdromClassStartIo() called!\n");
|
||||||
|
|
||||||
|
IoMarkIrpPending (Irp);
|
||||||
|
|
||||||
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
IrpStack = IoGetCurrentIrpStackLocation (Irp);
|
IrpStack = IoGetCurrentIrpStackLocation (Irp);
|
||||||
|
|
||||||
MaximumTransferLength = DeviceExtension->PortCapabilities->MaximumTransferLength;
|
MaximumTransferLength = DeviceExtension->PortCapabilities->MaximumTransferLength;
|
||||||
|
|
||||||
|
if (DeviceObject->Flags & DO_VERIFY_VOLUME)
|
||||||
|
{
|
||||||
|
if (!(IrpStack->Flags & SL_OVERRIDE_VERIFY_VOLUME))
|
||||||
|
{
|
||||||
|
DPRINT1 ("Verify required\n");
|
||||||
|
|
||||||
|
if (Irp->Tail.Overlay.Thread)
|
||||||
|
{
|
||||||
|
IoSetHardErrorOrVerifyDevice (Irp,
|
||||||
|
DeviceObject);
|
||||||
|
}
|
||||||
|
Irp->IoStatus.Status = STATUS_VERIFY_REQUIRED;
|
||||||
|
|
||||||
|
/* FIXME: Update drive capacity */
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (IrpStack->MajorFunction == IRP_MJ_READ)
|
if (IrpStack->MajorFunction == IRP_MJ_READ)
|
||||||
{
|
{
|
||||||
DPRINT ("CdromClassStartIo: IRP_MJ_READ\n");
|
DPRINT ("CdromClassStartIo: IRP_MJ_READ\n");
|
||||||
|
@ -1100,11 +1120,12 @@ CdromClassStartIo (IN PDEVICE_OBJECT DeviceObject,
|
||||||
switch (IrpStack->Parameters.DeviceIoControl.IoControlCode)
|
switch (IrpStack->Parameters.DeviceIoControl.IoControlCode)
|
||||||
{
|
{
|
||||||
case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
|
case IOCTL_CDROM_GET_DRIVE_GEOMETRY:
|
||||||
DPRINT1 ("CdromClassStartIo: IOCTL_CDROM_GET_DRIVE_GEOMETRY\n");
|
DPRINT ("CdromClassStartIo: IOCTL_CDROM_GET_DRIVE_GEOMETRY\n");
|
||||||
Srb->DataTransferLength = sizeof(READ_CAPACITY_DATA);
|
Srb->DataTransferLength = sizeof(READ_CAPACITY_DATA);
|
||||||
Srb->CdbLength = 10;
|
Srb->CdbLength = 10;
|
||||||
Srb->TimeOutValue = DeviceExtension->TimeOutValue;
|
Srb->TimeOutValue = DeviceExtension->TimeOutValue;
|
||||||
Srb->SrbFlags = SRB_FLAGS_DISABLE_SYNCH_TRANSFER | SRB_FLAGS_DATA_IN;
|
Srb->SrbFlags = SRB_FLAGS_DISABLE_SYNCH_TRANSFER | SRB_FLAGS_DATA_IN;
|
||||||
|
Cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY;
|
||||||
|
|
||||||
/* Allocate data buffer */
|
/* Allocate data buffer */
|
||||||
DataBuffer = ExAllocatePool (NonPagedPoolCacheAligned,
|
DataBuffer = ExAllocatePool (NonPagedPoolCacheAligned,
|
||||||
|
@ -1146,7 +1167,6 @@ CdromClassStartIo (IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
MmBuildMdlForNonPagedPool (SubIrp->MdlAddress);
|
MmBuildMdlForNonPagedPool (SubIrp->MdlAddress);
|
||||||
Srb->DataBuffer = DataBuffer;
|
Srb->DataBuffer = DataBuffer;
|
||||||
Cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY;
|
|
||||||
|
|
||||||
IoCallDriver (DeviceExtension->PortDeviceObject,
|
IoCallDriver (DeviceExtension->PortDeviceObject,
|
||||||
SubIrp);
|
SubIrp);
|
||||||
|
@ -1221,6 +1241,31 @@ CdromDeviceControlCompletion (IN PDEVICE_OBJECT DeviceObject,
|
||||||
&Status);
|
&Status);
|
||||||
DPRINT ("Retry %u\n", Retry);
|
DPRINT ("Retry %u\n", Retry);
|
||||||
|
|
||||||
|
if (Retry == TRUE &&
|
||||||
|
(ULONG)OrigNextIrpStack->Parameters.Others.Argument1 > 0)
|
||||||
|
{
|
||||||
|
DPRINT1 ("Try again (Retry count %lu)\n",
|
||||||
|
(ULONG)OrigNextIrpStack->Parameters.Others.Argument1);
|
||||||
|
|
||||||
|
(ULONG)OrigNextIrpStack->Parameters.Others.Argument1--;
|
||||||
|
|
||||||
|
/* Release 'old' buffers */
|
||||||
|
ExFreePool (Srb->SenseInfoBuffer);
|
||||||
|
if (Srb->DataBuffer)
|
||||||
|
ExFreePool(Srb->DataBuffer);
|
||||||
|
ExFreePool(Srb);
|
||||||
|
|
||||||
|
if (Irp->MdlAddress != NULL)
|
||||||
|
IoFreeMdl(Irp->MdlAddress);
|
||||||
|
|
||||||
|
IoFreeIrp(Irp);
|
||||||
|
|
||||||
|
/* Call the StartIo routine again */
|
||||||
|
CdromClassStartIo (DeviceObject,
|
||||||
|
OrigIrp);
|
||||||
|
|
||||||
|
return STATUS_MORE_PROCESSING_REQUIRED;
|
||||||
|
}
|
||||||
|
|
||||||
DPRINT ("Status %lx\n", Status);
|
DPRINT ("Status %lx\n", Status);
|
||||||
}
|
}
|
||||||
|
@ -1235,7 +1280,7 @@ CdromDeviceControlCompletion (IN PDEVICE_OBJECT DeviceObject,
|
||||||
ULONG LastSector;
|
ULONG LastSector;
|
||||||
ULONG SectorSize;
|
ULONG SectorSize;
|
||||||
|
|
||||||
DPRINT1 ("CdromClassControlCompletion: IOCTL_CDROM_GET_DRIVE_GEOMETRY\n");
|
DPRINT ("CdromClassControlCompletion: IOCTL_CDROM_GET_DRIVE_GEOMETRY\n");
|
||||||
|
|
||||||
CapacityBuffer = (PREAD_CAPACITY_DATA)Srb->DataBuffer;
|
CapacityBuffer = (PREAD_CAPACITY_DATA)Srb->DataBuffer;
|
||||||
SectorSize = (((PUCHAR)&CapacityBuffer->BytesPerBlock)[0] << 24) |
|
SectorSize = (((PUCHAR)&CapacityBuffer->BytesPerBlock)[0] << 24) |
|
||||||
|
@ -1293,7 +1338,6 @@ CdromDeviceControlCompletion (IN PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
OrigIrp->IoStatus.Information = 0;
|
OrigIrp->IoStatus.Information = 0;
|
||||||
Status = STATUS_INVALID_DEVICE_REQUEST;
|
Status = STATUS_INVALID_DEVICE_REQUEST;
|
||||||
|
|
Loading…
Reference in a new issue