mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 04:45:43 +00:00
Fixed broken handling of SCSI port capabilities.
svn path=/trunk/; revision=3019
This commit is contained in:
parent
0bb513eddf
commit
421ce5c9dc
4 changed files with 42 additions and 64 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: 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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue