Fixed broken handling of SCSI port capabilities.

svn path=/trunk/; revision=3019
This commit is contained in:
Eric Kohl 2002-06-06 23:20:08 +00:00
parent 0bb513eddf
commit 421ce5c9dc
4 changed files with 42 additions and 64 deletions

View file

@ -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: cdrom.c,v 1.10 2002/05/26 20:23:22 ekohl Exp $
/* $Id: cdrom.c,v 1.11 2002/06/06 23:19:19 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -202,7 +202,9 @@ CdromClassFindDevices(IN PDRIVER_OBJECT DriverObject,
return(FALSE);
}
DPRINT("PortCapabilities: %p\n", PortCapabilities);
DPRINT("MaximumTransferLength: %lu\n", PortCapabilities->MaximumTransferLength);
DPRINT("MaximumPhysicalPages: %lu\n", PortCapabilities->MaximumPhysicalPages);
/* Get inquiry data */
Status = ScsiClassGetInquiryData(PortDeviceObject,
@ -270,7 +272,6 @@ CdromClassFindDevices(IN PDRIVER_OBJECT DriverObject,
}
ExFreePool(Buffer);
ExFreePool(PortCapabilities);
DPRINT("CdromClassFindDevices() done\n");
@ -433,10 +434,7 @@ CdromClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
DiskDeviceExtension->DeviceNumber = DeviceNumber;
DiskDeviceExtension->PortDeviceObject = PortDeviceObject;
DiskDeviceExtension->PhysicalDevice = DiskDeviceObject;
/* FIXME: Not yet! Will cause pointer corruption! */
// DiskDeviceExtension->PortCapabilities = PortCapabilities;
DiskDeviceExtension->PortCapabilities = Capabilities;
DiskDeviceExtension->StartingOffset.QuadPart = 0;
DiskDeviceExtension->PortNumber = (UCHAR)PortNumber;
DiskDeviceExtension->PathId = InquiryData->PathId;
@ -578,7 +576,7 @@ CdromClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
Status = ScsiClassReadDriveCapacity(DeviceObject);
if (NT_SUCCESS(Status))
{
Geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer;
Geometry = (PDISK_GEOMETRY)Irp->AssociatedIrp.SystemBuffer;
RtlMoveMemory(Geometry,
DeviceExtension->DiskGeometry,
sizeof(DISK_GEOMETRY));

View file

@ -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.20 2002/06/05 19:31:39 hbirr Exp $
/* $Id: class2.c,v 1.21 2002/06/06 23:19:36 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -536,20 +536,11 @@ NTSTATUS STDCALL
ScsiClassGetCapabilities(PDEVICE_OBJECT PortDeviceObject,
PIO_SCSI_CAPABILITIES *PortCapabilities)
{
PIO_SCSI_CAPABILITIES Buffer;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
KEVENT Event;
PIRP Irp;
*PortCapabilities = NULL;
Buffer = ExAllocatePool(NonPagedPool,
sizeof(IO_SCSI_CAPABILITIES));
if (Buffer == NULL)
{
return(STATUS_INSUFFICIENT_RESOURCES);
}
KeInitializeEvent(&Event,
NotificationEvent,
FALSE);
@ -558,14 +549,13 @@ ScsiClassGetCapabilities(PDEVICE_OBJECT PortDeviceObject,
PortDeviceObject,
NULL,
0,
Buffer,
sizeof(IO_SCSI_CAPABILITIES),
PortCapabilities,
sizeof(PVOID),
FALSE,
&Event,
&IoStatusBlock);
if (Irp == NULL)
{
ExFreePool(Buffer);
return(STATUS_INSUFFICIENT_RESOURCES);
}
@ -581,14 +571,7 @@ ScsiClassGetCapabilities(PDEVICE_OBJECT PortDeviceObject,
Status = IoStatusBlock.Status;
}
if (!NT_SUCCESS(Status))
{
ExFreePool(Buffer);
}
else
{
*PortCapabilities = Buffer;
}
DPRINT("PortCapabilities at %p\n", *PortCapabilities);
return(Status);
}
@ -1486,10 +1469,8 @@ ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
IrpStack->Parameters.Read.ByteOffset.QuadPart,
IrpStack->Parameters.Read.Length);
// MaximumTransferLength = DeviceExtension->PortCapabilities->MaximumTransferLength;
// MaximumTransferPages = DeviceExtension->PortCapabilities->MaximumPhysicalPages;
MaximumTransferLength = 0x10000; /* 64 kbytes */
MaximumTransferPages = MaximumTransferLength / PAGESIZE;
MaximumTransferLength = DeviceExtension->PortCapabilities->MaximumTransferLength;
MaximumTransferPages = DeviceExtension->PortCapabilities->MaximumPhysicalPages;
CurrentTransferLength = IrpStack->Parameters.Read.Length;
@ -1560,9 +1541,7 @@ ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
MaximumTransferLength, CurrentTransferLength);
/* Adjust the maximum transfer length */
// CurrentTransferPages = DeviceExtension->PortCapabilities->MaximumPhysicalPages - 1;
CurrentTransferPages = 0x10000 / PAGESIZE;
CurrentTransferPages = DeviceExtension->PortCapabilities->MaximumPhysicalPages;
if (MaximumTransferLength > CurrentTransferPages * PAGESIZE)
MaximumTransferLength = CurrentTransferPages * PAGESIZE;

View file

@ -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: disk.c,v 1.14 2002/05/28 09:29:07 ekohl Exp $
/* $Id: disk.c,v 1.15 2002/06/06 23:19:53 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -200,7 +200,9 @@ DiskClassFindDevices(PDRIVER_OBJECT DriverObject,
return(FALSE);
}
DPRINT("PortCapabilities: %p\n", PortCapabilities);
DPRINT("MaximumTransferLength: %lu\n", PortCapabilities->MaximumTransferLength);
DPRINT("MaximumPhysicalPages: %lu\n", PortCapabilities->MaximumPhysicalPages);
/* Get inquiry data */
Status = ScsiClassGetInquiryData(PortDeviceObject,
@ -268,7 +270,6 @@ DiskClassFindDevices(PDRIVER_OBJECT DriverObject,
}
ExFreePool(Buffer);
ExFreePool(PortCapabilities);
DPRINT("DiskClassFindDevices() done\n");
@ -481,10 +482,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
DiskDeviceExtension->DeviceNumber = DiskNumber;
DiskDeviceExtension->PortDeviceObject = PortDeviceObject;
DiskDeviceExtension->PhysicalDevice = DiskDeviceObject;
/* FIXME: Not yet! Will cause pointer corruption! */
// DiskDeviceExtension->PortCapabilities = PortCapabilities;
DiskDeviceExtension->PortCapabilities = Capabilities;
DiskDeviceExtension->StartingOffset.QuadPart = 0;
DiskDeviceExtension->PortNumber = (UCHAR)PortNumber;
DiskDeviceExtension->PathId = InquiryData->PathId;
@ -631,10 +629,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
PartitionDeviceExtension->PortDeviceObject = PortDeviceObject;
PartitionDeviceExtension->DiskGeometry = DiskDeviceExtension->DiskGeometry;
PartitionDeviceExtension->PhysicalDevice = DiskDeviceExtension->PhysicalDevice;
/* FIXME: Not yet! Will cause pointer corruption! */
// PartitionDeviceExtension->PortCapabilities = PortCapabilities;
PartitionDeviceExtension->PortCapabilities = Capabilities;
PartitionDeviceExtension->StartingOffset.QuadPart =
PartitionEntry->StartingOffset.QuadPart;
PartitionDeviceExtension->PartitionLength.QuadPart =
@ -659,8 +654,6 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
break;
}
}
}
if (PartitionList != NULL)

View file

@ -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: scsiport.c,v 1.15 2002/05/26 20:25:49 ekohl Exp $
/* $Id: scsiport.c,v 1.16 2002/06/06 23:20:08 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
@ -78,6 +78,8 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION
ULONG PortBusInfoSize;
PSCSI_ADAPTER_BUS_INFO PortBusInfo;
PIO_SCSI_CAPABILITIES PortCapabilities;
PDEVICE_OBJECT DeviceObject;
PCONTROLLER_OBJECT ControllerObject;
@ -896,25 +898,12 @@ ScsiPortDeviceControl(IN PDEVICE_OBJECT DeviceObject,
case IOCTL_SCSI_GET_CAPABILITIES:
{
PIO_SCSI_CAPABILITIES Capabilities;
DPRINT(" IOCTL_SCSI_GET_CAPABILITIES\n");
Capabilities = (PIO_SCSI_CAPABILITIES)Irp->AssociatedIrp.SystemBuffer;
Capabilities->Length = sizeof(IO_SCSI_CAPABILITIES);
Capabilities->MaximumTransferLength =
DeviceExtension->PortConfig.MaximumTransferLength;
Capabilities->MaximumPhysicalPages = 1;
Capabilities->SupportedAsynchronousEvents = 0;
Capabilities->AlignmentMask =
DeviceExtension->PortConfig.AlignmentMask;
Capabilities->TaggedQueuing =
DeviceExtension->PortConfig.TaggedQueuing;
Capabilities->AdapterScansDown =
DeviceExtension->PortConfig.AdapterScansDown;
Capabilities->AdapterUsesPio = TRUE;
*((PIO_SCSI_CAPABILITIES *)Irp->AssociatedIrp.SystemBuffer) =
DeviceExtension->PortCapabilities;
Irp->IoStatus.Information = sizeof(IO_SCSI_CAPABILITIES);
Irp->IoStatus.Information = sizeof(PIO_SCSI_CAPABILITIES);
}
break;
@ -1068,6 +1057,7 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
IN ULONG PortNumber)
{
PSCSI_PORT_DEVICE_EXTENSION PortDeviceExtension;
PIO_SCSI_CAPABILITIES PortCapabilities;
PDEVICE_OBJECT PortDeviceObject;
WCHAR NameBuffer[80];
UNICODE_STRING DeviceName;
@ -1174,6 +1164,24 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
ScsiPortIoTimer,
PortDeviceExtension);
/* Initialize port capabilities */
PortCapabilities = ExAllocatePool(NonPagedPool,
sizeof(IO_SCSI_CAPABILITIES));
PortDeviceExtension->PortCapabilities = PortCapabilities;
PortCapabilities->Length = sizeof(IO_SCSI_CAPABILITIES);
PortCapabilities->MaximumTransferLength =
PortDeviceExtension->PortConfig.MaximumTransferLength;
PortCapabilities->MaximumPhysicalPages =
PortCapabilities->MaximumTransferLength / PAGESIZE;
PortCapabilities->SupportedAsynchronousEvents = 0; /* FIXME */
PortCapabilities->AlignmentMask =
PortDeviceExtension->PortConfig.AlignmentMask;
PortCapabilities->TaggedQueuing =
PortDeviceExtension->PortConfig.TaggedQueuing;
PortCapabilities->AdapterScansDown =
PortDeviceExtension->PortConfig.AdapterScansDown;
PortCapabilities->AdapterUsesPio = TRUE; /* FIXME */
/* Initialize inquiry data */
PortDeviceExtension->PortBusInfoSize = 0;
PortDeviceExtension->PortBusInfo = NULL;