[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