[ros-diffs] [fireball] 26211: - Further work on ScsiPortInitialize(): old PortConfig section is deleted. - SpiGetPciData() code improved, part of the code is transferred into a new function. Right now a crash is introduced in ScsiPortFreeDeviceBase(), because of the changes in ScsiPortInitialize(): will be fixed by the next commit.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Mar 30 21:10:30 CEST 2007


Author: fireball
Date: Fri Mar 30 23:10:29 2007
New Revision: 26211

URL: http://svn.reactos.org/svn/reactos?rev=26211&view=rev
Log:
- Further work on ScsiPortInitialize(): old PortConfig section is deleted.
- SpiGetPciData() code improved, part of the code is transferred into a new function.

Right now a crash is introduced in ScsiPortFreeDeviceBase(), because of the changes in ScsiPortInitialize(): will be fixed by the next commit.

Modified:
    trunk/reactos/drivers/storage/scsiport-new/scsiport.c

Modified: trunk/reactos/drivers/storage/scsiport-new/scsiport.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/scsiport-new/scsiport.c?rev=26211&r1=26210&r2=26211&view=diff
==============================================================================
--- trunk/reactos/drivers/storage/scsiport-new/scsiport.c (original)
+++ trunk/reactos/drivers/storage/scsiport-new/scsiport.c Fri Mar 30 23:10:29 2007
@@ -19,10 +19,11 @@
 /* $Id$
  *
  * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
- * FILE:            services/storage/scsiport/scsiport.c
+ * PROJECT:         ReactOS Storage Stack
+ * FILE:            drivers/storage/scsiport/scsiport.c
  * PURPOSE:         SCSI port driver
  * PROGRAMMER:      Eric Kohl (ekohl at rz-online.de)
+ *                  Aleksey Bragin (aleksey reactos org)
  */
 
 /* INCLUDES *****************************************************************/
@@ -51,10 +52,13 @@
 /* GLOBALS *******************************************************************/
 
 static BOOLEAN
-SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
-		     IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
-		     IN ULONG BusNumber,
-		     IN OUT PPCI_SLOT_NUMBER NextSlotNumber);
+SpiGetPciConfigData(IN PDRIVER_OBJECT DriverObject,
+                    IN PDEVICE_OBJECT DeviceObject,
+                    IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+                    IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
+                    IN PUNICODE_STRING RegistryPath,
+                    IN ULONG BusNumber,
+                    IN OUT PPCI_SLOT_NUMBER NextSlotNumber);
 
 static NTSTATUS STDCALL
 ScsiPortCreateClose(IN PDEVICE_OBJECT DeviceObject,
@@ -184,6 +188,11 @@
                    IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
                    IN PCONFIGURATION_INFO InternalConfigInfo,
                    IN PUCHAR Buffer);
+
+static VOID
+SpiResourceToConfig(IN PHW_INITIALIZATION_DATA HwInitializationData,
+                    IN PCM_FULL_RESOURCE_DESCRIPTOR ResourceDescriptor,
+                    IN PPORT_CONFIGURATION_INFORMATION PortConfig);
 
 
 /* FUNCTIONS *****************************************************************/
@@ -759,7 +768,7 @@
 		   IN PVOID HwContext)
 {
     PDRIVER_OBJECT DriverObject = (PDRIVER_OBJECT)Argument1;
-    //  PUNICODE_STRING RegistryPath = (PUNICODE_STRING)Argument2;
+    PUNICODE_STRING RegistryPath = (PUNICODE_STRING)Argument2;
     PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
     PCONFIGURATION_INFORMATION SystemConfig;
     PPORT_CONFIGURATION_INFORMATION PortConfig;
@@ -770,7 +779,6 @@
     BOOLEAN Again;
     BOOLEAN DeviceFound = FALSE;
     BOOLEAN FirstConfigCall = TRUE;
-    ULONG i;
     ULONG Result;
     NTSTATUS Status;
     ULONG MaxBus;
@@ -921,7 +929,7 @@
                         SpiMiniportTimerDpc,
                         PortDeviceObject);
 
-//CreatePortConfig:
+CreatePortConfig:
 
         Status = SpiCreatePortConfig(DeviceExtension,
                                      HwInitializationData,
@@ -953,87 +961,61 @@
                       sizeof(PORT_CONFIGURATION_INFORMATION));
 
 
-
-
-
-
-
-      /* Initialize the device base list */
-      InitializeListHead (&DeviceExtension->DeviceBaseListHead);
-
-      /* Initialize array of LUNs */
-      RtlZeroMemory(DeviceExtension->LunExtensionList,
-          sizeof(PSCSI_PORT_LUN_EXTENSION) * LUS_NUMBER);
-
-
-      RtlZeroMemory (DeviceExtension->PortConfig,
-		     PortConfigSize);
-
-      PortConfig = DeviceExtension->PortConfig;
-      PortConfig->Length = sizeof(PORT_CONFIGURATION_INFORMATION);
-      PortConfig->SystemIoBusNumber = BusNumber;
-      PortConfig->AdapterInterfaceType = HwInitializationData->AdapterInterfaceType;
-      PortConfig->InterruptMode =
-	(PortConfig->AdapterInterfaceType == PCIBus) ? LevelSensitive : Latched;
-      PortConfig->MaximumTransferLength = SP_UNINITIALIZED_VALUE;
-      PortConfig->NumberOfPhysicalBreaks = SP_UNINITIALIZED_VALUE;
-      PortConfig->DmaChannel = SP_UNINITIALIZED_VALUE;
-      PortConfig->DmaPort = SP_UNINITIALIZED_VALUE;
-//  PortConfig->DmaWidth =
-//  PortConfig->DmaSpeed =
-//  PortConfig->AlignmentMask =
-      PortConfig->NumberOfAccessRanges = HwInitializationData->NumberOfAccessRanges;
-    PortConfig->NumberOfBuses = MaxBus;
-
-      for (i = 0; i < SCSI_MAXIMUM_BUSES; i++)
-	PortConfig->InitiatorBusId[i] = 255;
-
-//  PortConfig->ScatterGather =
-//  PortConfig->Master =
-//  PortConfig->CachesData =
-//  PortConfig->AdapterScansDown =
-      PortConfig->AtdiskPrimaryClaimed = SystemConfig->AtDiskPrimaryAddressClaimed;
-      PortConfig->AtdiskSecondaryClaimed = SystemConfig->AtDiskSecondaryAddressClaimed;
-//  PortConfig->Dma32BitAddresses =
-//  PortConfig->DemandMode =
-      PortConfig->MapBuffers = HwInitializationData->MapBuffers;
-      PortConfig->NeedPhysicalAddresses = HwInitializationData->NeedPhysicalAddresses;
-      PortConfig->TaggedQueuing = HwInitializationData->TaggedQueuing;
-      PortConfig->AutoRequestSense = HwInitializationData->AutoRequestSense;
-      PortConfig->MultipleRequestPerLu = HwInitializationData->MultipleRequestPerLu;
-      PortConfig->ReceiveEvent = HwInitializationData->ReceiveEvent;
-//  PortConfig->RealModeInitialized =
-//  PortConfig->BufferAccessScsiPortControlled =
-      PortConfig->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS;
-//  PortConfig->MaximumNumberOfLogicalUnits = SCSI_MAXIMUM_LOGICAL_UNITS;
-
-      PortConfig->SlotNumber = SlotNumber.u.AsULONG;
-
-      PortConfig->AccessRanges = (ACCESS_RANGE(*)[])(PortConfig + 1);
+        /* Copy extension sizes into the PortConfig */
+        PortConfig->SpecificLuExtensionSize = DeviceExtension->LunExtensionSize;
+        PortConfig->SrbExtensionSize = DeviceExtension->SrbExtensionSize;
+
+        /* Initialize Access ranges */
+        if (HwInitializationData->NumberOfAccessRanges != 0)
+        {
+            PortConfig->AccessRanges = (PVOID)(PortConfig+1);
+
+            /* Align to LONGLONG */
+            PortConfig->AccessRanges = (PVOID)((ULONG)(PortConfig->AccessRanges) + 7);
+            PortConfig->AccessRanges = (PVOID)((ULONG)(PortConfig->AccessRanges) & ~7);
+
+            /* Copy the data */
+            RtlCopyMemory(PortConfig->AccessRanges,
+                          ConfigInfo.AccessRanges,
+                          HwInitializationData->NumberOfAccessRanges * sizeof(ACCESS_RANGE));
+        }
 
       /* Search for matching PCI device */
       if ((HwInitializationData->AdapterInterfaceType == PCIBus) &&
-	  (HwInitializationData->VendorIdLength > 0) &&
-	  (HwInitializationData->VendorId != NULL) &&
-	  (HwInitializationData->DeviceIdLength > 0) &&
-	  (HwInitializationData->DeviceId != NULL))
-	{
-	  /* Get PCI device data */
-	  DPRINT("VendorId '%.*s'  DeviceId '%.*s'\n",
-		 HwInitializationData->VendorIdLength,
-		 HwInitializationData->VendorId,
-		 HwInitializationData->DeviceIdLength,
-		 HwInitializationData->DeviceId);
-
-	  if (!SpiGetPciConfigData (HwInitializationData,
-				    PortConfig,
-				    BusNumber,
-				    &SlotNumber))
-	    {
-	      Status = STATUS_UNSUCCESSFUL;
-	      goto ByeBye;
-	    }
-	}
+          (HwInitializationData->VendorIdLength > 0) &&
+          (HwInitializationData->VendorId != NULL) &&
+          (HwInitializationData->DeviceIdLength > 0) &&
+          (HwInitializationData->DeviceId != NULL))
+      {
+          PortConfig->BusInterruptLevel = 0;
+
+          /* Get PCI device data */
+          DPRINT("VendorId '%.*s'  DeviceId '%.*s'\n",
+                 HwInitializationData->VendorIdLength,
+                 HwInitializationData->VendorId,
+                 HwInitializationData->DeviceIdLength,
+                 HwInitializationData->DeviceId);
+
+          if (!SpiGetPciConfigData(DriverObject,
+                                   PortDeviceObject,
+                                   HwInitializationData,
+                                   PortConfig,
+                                   RegistryPath,
+                                   BusNumber,
+                                   &SlotNumber))
+          {
+              /* Continue to the next bus, nothing here */
+              ConfigInfo.BusNumber++;
+              DeviceExtension->PortConfig = NULL;
+              ExFreePool(PortConfig);
+              Again = FALSE;
+              goto CreatePortConfig;
+          }
+      }
+
+
+
+
 
       /* Note: HwFindAdapter is called once for each bus */
       Again = FALSE;
@@ -1427,146 +1409,180 @@
 
 /* INTERNAL FUNCTIONS ********************************************************/
 
+static VOID
+SpiResourceToConfig(IN PHW_INITIALIZATION_DATA HwInitializationData,
+                    IN PCM_FULL_RESOURCE_DESCRIPTOR ResourceDescriptor,
+                    IN PPORT_CONFIGURATION_INFORMATION PortConfig)
+{
+    PACCESS_RANGE AccessRange;
+    PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialData;
+    ULONG RangeNumber;
+    ULONG Index;
+
+    RangeNumber = 0;
+
+    /* Loop through all entries */
+    for (Index = 0; Index < ResourceDescriptor->PartialResourceList.Count; Index++)
+    {
+        PartialData = &ResourceDescriptor->PartialResourceList.PartialDescriptors[Index];
+
+        switch (PartialData->Type)
+        {
+        case CmResourceTypePort:
+            /* Copy access ranges */
+            if (RangeNumber < HwInitializationData->NumberOfAccessRanges)
+            {
+                AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]);
+
+                AccessRange->RangeStart = PartialData->u.Port.Start;
+                AccessRange->RangeLength = PartialData->u.Port.Length;
+
+                AccessRange->RangeInMemory = FALSE;
+                RangeNumber++;
+            }
+            break;
+
+        case CmResourceTypeMemory:
+            /* Copy access ranges */
+            if (RangeNumber < HwInitializationData->NumberOfAccessRanges)
+            {
+                AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]);
+
+                AccessRange->RangeStart = PartialData->u.Memory.Start;
+                AccessRange->RangeLength = PartialData->u.Memory.Length;
+
+                AccessRange->RangeInMemory = TRUE;
+                RangeNumber++;
+            }
+            break;
+
+        case CmResourceTypeInterrupt:
+            /* Copy interrupt data */
+            PortConfig->BusInterruptLevel = PartialData->u.Interrupt.Level;
+            PortConfig->BusInterruptVector = PartialData->u.Interrupt.Vector;
+
+            /* Set interrupt mode accordingly to the resource */
+            if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED)
+            {
+                PortConfig->InterruptMode = Latched;
+            }
+            else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE)
+            {
+                PortConfig->InterruptMode = LevelSensitive;
+            }
+            break;
+
+        case CmResourceTypeDma:
+            PortConfig->DmaChannel = PartialData->u.Dma.Channel;
+            PortConfig->DmaPort = PartialData->u.Dma.Port;
+            break;
+        }
+    }
+}
 
 static BOOLEAN
-SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
-		     IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
-		     IN ULONG BusNumber,
-		     IN OUT PPCI_SLOT_NUMBER NextSlotNumber)
-{
-  PCI_COMMON_CONFIG PciConfig;
-  PCI_SLOT_NUMBER SlotNumber;
-  ULONG DataSize;
-  ULONG DeviceNumber;
-  ULONG FunctionNumber;
-  CHAR VendorIdString[8];
-  CHAR DeviceIdString[8];
-  ULONG i;
-  ULONG RangeLength;
-
-  DPRINT ("SpiGetPciConfiguration() called\n");
-
-  if (NextSlotNumber->u.bits.FunctionNumber >= PCI_MAX_FUNCTION)
-    {
-      NextSlotNumber->u.bits.FunctionNumber = 0;
-      NextSlotNumber->u.bits.DeviceNumber++;
-    }
-
-  if (NextSlotNumber->u.bits.DeviceNumber >= PCI_MAX_DEVICES)
-    {
-      NextSlotNumber->u.bits.DeviceNumber = 0;
-      return FALSE;
-    }
-
-  for (DeviceNumber = NextSlotNumber->u.bits.DeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
-    {
-      SlotNumber.u.bits.DeviceNumber = DeviceNumber;
-
-      for (FunctionNumber = NextSlotNumber->u.bits.FunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
-	{
-	  SlotNumber.u.bits.FunctionNumber = FunctionNumber;
-
-	  DataSize = HalGetBusData (PCIConfiguration,
-				    BusNumber,
-				    SlotNumber.u.AsULONG,
-				    &PciConfig,
-				    PCI_COMMON_HDR_LENGTH);
-	  if (DataSize != PCI_COMMON_HDR_LENGTH)
-	    {
-	      if (FunctionNumber == 0)
-		{
-		  break;
-		}
-	      else
-		{
-		  continue;
-		}
-	    }
-
-	  sprintf (VendorIdString, "%04hx", PciConfig.VendorID);
-	  sprintf (DeviceIdString, "%04hx", PciConfig.DeviceID);
-
-	  if (!_strnicmp(VendorIdString, HwInitializationData->VendorId, HwInitializationData->VendorIdLength) &&
-	      !_strnicmp(DeviceIdString, HwInitializationData->DeviceId, HwInitializationData->DeviceIdLength))
-	    {
-	      DPRINT ("Found device 0x%04hx 0x%04hx at %1lu %2lu %1lu\n",
-		      PciConfig.VendorID,
-		      PciConfig.DeviceID,
-		      BusNumber,
-		      SlotNumber.u.bits.DeviceNumber,
-		      SlotNumber.u.bits.FunctionNumber);
-
-	      PortConfig->BusInterruptLevel =
-	      PortConfig->BusInterruptVector = PciConfig.u.type0.InterruptLine;
-	      PortConfig->SlotNumber = SlotNumber.u.AsULONG;
-
-	      /* Initialize access ranges */
-	      if (PortConfig->NumberOfAccessRanges > 0)
-		{
-		  if (PortConfig->NumberOfAccessRanges > PCI_TYPE0_ADDRESSES)
-		    PortConfig->NumberOfAccessRanges = PCI_TYPE0_ADDRESSES;
-
-		  for (i = 0; i < PortConfig->NumberOfAccessRanges; i++)
-		    {
-		      (*PortConfig->AccessRanges)[i].RangeStart.QuadPart =
-			PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_ADDRESS_MASK;
-		      if ((*PortConfig->AccessRanges)[i].RangeStart.QuadPart != 0)
-			{
-			  RangeLength = (ULONG)-1;
-			  HalSetBusDataByOffset (PCIConfiguration,
-						 BusNumber,
-						 SlotNumber.u.AsULONG,
-						 (PVOID)&RangeLength,
-						 0x10 + (i * sizeof(ULONG)),
-						 sizeof(ULONG));
-
-			  HalGetBusDataByOffset (PCIConfiguration,
-						 BusNumber,
-						 SlotNumber.u.AsULONG,
-						 (PVOID)&RangeLength,
-						 0x10 + (i * sizeof(ULONG)),
-						 sizeof(ULONG));
-
-			  HalSetBusDataByOffset (PCIConfiguration,
-						 BusNumber,
-						 SlotNumber.u.AsULONG,
-						 (PVOID)&PciConfig.u.type0.BaseAddresses[i],
-						 0x10 + (i * sizeof(ULONG)),
-						 sizeof(ULONG));
-			  if (RangeLength != 0)
-			    {
-			      (*PortConfig->AccessRanges)[i].RangeLength =
-			        -(RangeLength & PCI_ADDRESS_IO_ADDRESS_MASK);
-			      (*PortConfig->AccessRanges)[i].RangeInMemory =
-				!(PciConfig.u.type0.BaseAddresses[i] & PCI_ADDRESS_IO_SPACE);
-
-			      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");
-			    }
-			}
-		    }
-		}
-
-	      NextSlotNumber->u.bits.DeviceNumber = DeviceNumber;
-	      NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1;
-
-	      return TRUE;
-	    }
-
-
-	  if (FunctionNumber == 0 && !(PciConfig.HeaderType & PCI_MULTIFUNCTION))
-	    {
-	      break;
-	    }
-	}
+SpiGetPciConfigData(IN PDRIVER_OBJECT DriverObject,
+                    IN PDEVICE_OBJECT DeviceObject,
+                    IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+                    IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
+                    IN PUNICODE_STRING RegistryPath,
+                    IN ULONG BusNumber,
+                    IN OUT PPCI_SLOT_NUMBER NextSlotNumber)
+{
+    PCI_COMMON_CONFIG PciConfig;
+    PCI_SLOT_NUMBER SlotNumber;
+    ULONG DataSize;
+    ULONG DeviceNumber;
+    ULONG FunctionNumber;
+    CHAR VendorIdString[8];
+    CHAR DeviceIdString[8];
+    UNICODE_STRING UnicodeStr;
+    PCM_RESOURCE_LIST ResourceList;
+    NTSTATUS Status;
+
+    DPRINT ("SpiGetPciConfiguration() called\n");
+
+    SlotNumber.u.AsULONG = 0;
+
+    /* Loop through all devices */
+    for (DeviceNumber = NextSlotNumber->u.bits.DeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
+    {
+        SlotNumber.u.bits.DeviceNumber = DeviceNumber;
+
+        /* Loop through all functions */
+        for (FunctionNumber = NextSlotNumber->u.bits.FunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
+        {
+            SlotNumber.u.bits.FunctionNumber = FunctionNumber;
+
+            /* Get PCI config bytes */
+            DataSize = HalGetBusData(PCIConfiguration,
+                                     BusNumber,
+                                     SlotNumber.u.AsULONG,
+                                     &PciConfig,
+                                     sizeof(ULONG));
+
+            /* There is nothing there */
+            if (DataSize < sizeof(ULONG))
+                return FALSE;
+
+            if (PciConfig.VendorID == PCI_INVALID_VENDORID)
+                break;
+
+            sprintf (VendorIdString, "%04hx", PciConfig.VendorID);
+            sprintf (DeviceIdString, "%04hx", PciConfig.DeviceID);
+
+            if (_strnicmp(VendorIdString, HwInitializationData->VendorId, HwInitializationData->VendorIdLength) ||
+                _strnicmp(DeviceIdString, HwInitializationData->DeviceId, HwInitializationData->DeviceIdLength))
+            {
+                /* It is not our device */
+                continue;
+            }
+
+            DPRINT("Found device 0x%04hx 0x%04hx at %1lu %2lu %1lu\n",
+                   PciConfig.VendorID,
+                   PciConfig.DeviceID,
+                   BusNumber,
+                   SlotNumber.u.bits.DeviceNumber,
+                   SlotNumber.u.bits.FunctionNumber);
+
+
+            RtlInitUnicodeString(&UnicodeStr, L"ScsiAdapter");
+            Status = HalAssignSlotResources(RegistryPath,
+                                            &UnicodeStr,
+                                            DriverObject,
+                                            DeviceObject,
+                                            PCIBus,
+                                            BusNumber,
+                                            SlotNumber.u.AsULONG,
+                                            &ResourceList);
+
+            if (!NT_SUCCESS(Status))
+                break;
+
+            /* Create configuration information */
+            SpiResourceToConfig(HwInitializationData,
+                                ResourceList->List,
+                                PortConfig);
+
+            /* Free the resource list */
+            ExFreePool(ResourceList);
+
+            /* Set dev & fn numbers */
+            NextSlotNumber->u.bits.DeviceNumber = DeviceNumber;
+            NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1;
+
+            /* Save the slot number */
+            PortConfig->SlotNumber = SlotNumber.u.AsULONG;
+
+            return TRUE;
+        }
        NextSlotNumber->u.bits.FunctionNumber = 0;
     }
 
-  DPRINT ("No device found\n");
-
-  return FALSE;
+    NextSlotNumber->u.bits.DeviceNumber = 0;
+    DPRINT ("No device found\n");
+
+    return FALSE;
 }
 
 




More information about the Ros-diffs mailing list