[ros-kernel] BusLogic 958 SCSI miniport
Filip Navara
xnavara at volny.cz
Tue Mar 23 17:17:10 CET 2004
Hi all,
after some more hacking with ScsiPort I got the BusLogic 958 SCSI
controller (the one emulated by VMware) driver working under ReactOS. I
successfully installed and started ReactOS with it. The patch that makes
all this possible is attached, but it needs some verfication before
commiting. (Please have patience with me, I never worked on storage
drivers. :-)
Regards,
Filip
Changelog:
* Always return STATUS_SUCCESS from ScsiPortInitialize if some device
was found.
* Changed the way of completing Irps that encapsulate SCSI requesty blocks.
* Minor correction to setting of SrbExtension.
* Changed DPRINT1 to DPRINT on some places.
-------------- next part --------------
Index: drivers/storage/class2/class2.c
===================================================================
RCS file: /CVS/ReactOS/reactos/drivers/storage/class2/class2.c,v
retrieving revision 1.50
diff -u -r1.50 class2.c
--- drivers/storage/class2/class2.c 7 Mar 2004 19:53:08 -0000 1.50
+++ drivers/storage/class2/class2.c 23 Mar 2004 16:05:33 -0000
@@ -44,7 +44,7 @@
#define TAG_SRBT TAG('S', 'r', 'b', 'T')
-#define INQUIRY_DATA_SIZE 2048
+#define INQUIRY_DATA_SIZE 8192
#define START_UNIT_TIMEOUT 30
static NTSTATUS STDCALL
Index: drivers/storage/scsiport/scsiport.c
===================================================================
RCS file: /CVS/ReactOS/reactos/drivers/storage/scsiport/scsiport.c,v
retrieving revision 1.49
diff -u -r1.49 scsiport.c
--- drivers/storage/scsiport/scsiport.c 23 Mar 2004 00:12:24 -0000 1.49
+++ drivers/storage/scsiport/scsiport.c 23 Mar 2004 16:05:42 -0000
@@ -45,11 +45,9 @@
/* TYPES *********************************************************************/
-#define IRP_FLAG_COMPLETE 0x00000001
#define IRP_FLAG_NEXT 0x00000002
#define IRP_FLAG_NEXT_LU 0x00000004
-
/* GLOBALS *******************************************************************/
static BOOLEAN
@@ -506,7 +504,7 @@
IN UCHAR Lun,
IN LONG QueueTag)
{
- DPRINT1("ScsiPortGetSrb()\n");
+ DPRINT1("ScsiPortGetSrb() unimplemented\n");
UNIMPLEMENTED;
return NULL;
}
@@ -523,7 +521,7 @@
PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
DEVICE_DESCRIPTION DeviceDescription;
- DPRINT1("ScsiPortGetUncachedExtension(%p %p %lu)\n",
+ DPRINT("ScsiPortGetUncachedExtension(%p %p %lu)\n",
HwDeviceExtension, ConfigInfo, NumberOfBytes);
DeviceExtension = CONTAINING_RECORD(HwDeviceExtension,
@@ -657,6 +655,7 @@
ULONG DeviceExtensionSize;
ULONG PortConfigSize;
BOOLEAN Again;
+ BOOLEAN DeviceFound = FALSE;
ULONG i;
ULONG Result;
NTSTATUS Status;
@@ -950,6 +949,7 @@
SystemConfig->ScsiPortCount++;
PortDeviceObject = NULL;
+ DeviceFound = TRUE;
}
else
{
@@ -999,7 +999,7 @@
DPRINT("ScsiPortInitialize() done!\n");
- return Status;
+ return (DeviceFound == FALSE) ? Status : STATUS_SUCCESS;
}
@@ -1086,7 +1086,7 @@
Srb = (PSCSI_REQUEST_BLOCK) va_arg (ap, PSCSI_REQUEST_BLOCK);
DPRINT("Notify: RequestComplete (Srb %p)\n", Srb);
- DeviceExtension->IrpFlags |= IRP_FLAG_COMPLETE;
+ Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE;
}
break;
@@ -1109,6 +1109,7 @@
PathId, TargetId, Lun);
/* FIXME: Implement it! */
+ DeviceExtension->IrpFlags |= IRP_FLAG_NEXT;
// DeviceExtension->IrpFlags |= IRP_FLAG_NEXT_LU;
}
@@ -1281,7 +1282,7 @@
PortConfig->AccessRanges[i].RangeInMemory =
!(PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_SPACE);
- DPRINT1("RangeStart 0x%lX RangeLength 0x%lX RangeInMemory %s\n",
+ DPRINT("RangeStart 0x%lX RangeLength 0x%lX RangeInMemory %s\n",
PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_ADDRESS_MASK,
-(RangeLength & PCI_ADDRESS_IO_ADDRESS_MASK),
(PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_SPACE)?"FALSE":"TRUE");
@@ -1648,15 +1649,11 @@
return;
}
+ Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE;
+
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = Srb->DataTransferLength;
- /* Allocte SRB extension */
- if (DeviceExtension->SrbExtensionSize != 0)
- {
- Srb->SrbExtension = DeviceExtension->VirtualAddress;
- }
-
DeviceExtension->CurrentIrp = Irp;
if (!KeSynchronizeExecution(DeviceExtension->Interrupt,
@@ -1685,12 +1682,13 @@
}
KeAcquireSpinLock(&DeviceExtension->IrpLock, &oldIrql);
- if (DeviceExtension->IrpFlags & IRP_FLAG_COMPLETE)
- {
- DeviceExtension->IrpFlags &= ~IRP_FLAG_COMPLETE;
- IoCompleteRequest(Irp,
- IO_NO_INCREMENT);
- }
+
+ /* FIXME: Timeout requests based on Srb->TimeOutValue. */
+ while (Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)
+ ;
+
+ IoCompleteRequest(Irp,
+ IO_NO_INCREMENT);
if (DeviceExtension->IrpFlags & IRP_FLAG_NEXT)
{
@@ -1723,6 +1721,12 @@
IrpStack = IoGetCurrentIrpStackLocation(DeviceExtension->CurrentIrp);
Srb = IrpStack->Parameters.Scsi.Srb;
+ /* Allocte SRB extension */
+ if (DeviceExtension->SrbExtensionSize != 0)
+ {
+ Srb->SrbExtension = DeviceExtension->VirtualAddress;
+ }
+
return(DeviceExtension->HwStartIo(&DeviceExtension->MiniPortDeviceExtension,
Srb));
}
@@ -1976,6 +1980,10 @@
/* Copy inquiry data to the port device extension */
AdapterBusInfo->NumberOfBuses = DeviceExtension->PortConfig->NumberOfBuses;
+ DPRINT("(%d, %d) %d\n",
+ sizeof(SCSI_ADAPTER_BUS_INFO), sizeof(SCSI_BUS_DATA),
+ AdapterBusInfo->NumberOfBuses);
+
UnitInfo = (PSCSI_INQUIRY_DATA)
((PUCHAR)AdapterBusInfo + sizeof(SCSI_ADAPTER_BUS_INFO) +
(sizeof(SCSI_BUS_DATA) * (AdapterBusInfo->NumberOfBuses - 1)));
@@ -2127,6 +2135,9 @@
DeviceExtension->OriginalSrb = Srb;
IrpStack->Parameters.Scsi.Srb = ScsiPortInitSenseRequestSrb(DeviceExtension,
Srb);
+
+ IrpStack->Parameters.Scsi.Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE;
+
KeReleaseSpinLockFromDpcLevel(&DeviceExtension->IrpLock);
if (!KeSynchronizeExecution(DeviceExtension->Interrupt,
ScsiPortStartPacket,
@@ -2150,12 +2161,6 @@
// DpcIrp->IoStatus.Information = 0;
// DpcIrp->IoStatus.Status = STATUS_SUCCESS;
- if (DeviceExtension->IrpFlags & IRP_FLAG_COMPLETE)
- {
- DeviceExtension->IrpFlags &= ~IRP_FLAG_COMPLETE;
- IoCompleteRequest(DpcIrp, IO_NO_INCREMENT);
- }
-
if (DeviceExtension->IrpFlags & IRP_FLAG_NEXT)
{
DeviceExtension->IrpFlags &= ~IRP_FLAG_NEXT;
@@ -2175,7 +2180,6 @@
DPRINT("ScsiPortDpcForIsr() done\n");
}
-
// ScsiPortIoTimer
// DESCRIPTION:
// This function handles timeouts and other time delayed processing
More information about the Ros-kernel
mailing list