- Move port configuration info from the device extension.

- Prepare to reorganize ScsiPortInitialize().

svn path=/trunk/; revision=6204
This commit is contained in:
Eric Kohl 2003-10-01 14:59:11 +00:00
parent 14faffecc0
commit e0492ecd39
2 changed files with 156 additions and 144 deletions

View file

@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* $Id: scsiport.c,v 1.37 2003/09/25 23:23:21 ekohl Exp $ /* $Id: scsiport.c,v 1.38 2003/10/01 14:59:11 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -55,8 +55,7 @@ static BOOLEAN
SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig, IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
IN ULONG BusNumber, IN ULONG BusNumber,
IN OUT PULONG NextDeviceNumber, IN OUT PPCI_SLOT_NUMBER NextSlotNumber);
IN OUT PULONG NextFunctionNumber);
static NTSTATUS STDCALL static NTSTATUS STDCALL
ScsiPortCreateClose(IN PDEVICE_OBJECT DeviceObject, ScsiPortCreateClose(IN PDEVICE_OBJECT DeviceObject,
@ -613,17 +612,16 @@ ScsiPortInitialize(IN PVOID Argument1,
PSCSI_PORT_DEVICE_EXTENSION PseudoDeviceExtension; PSCSI_PORT_DEVICE_EXTENSION PseudoDeviceExtension;
PSCSI_PORT_DEVICE_EXTENSION RealDeviceExtension; PSCSI_PORT_DEVICE_EXTENSION RealDeviceExtension;
PCONFIGURATION_INFORMATION SystemConfig; PCONFIGURATION_INFORMATION SystemConfig;
PPORT_CONFIGURATION_INFORMATION PortConfig; PPORT_CONFIGURATION_INFORMATION PortConfig = NULL;
ULONG DeviceExtensionSize;
ULONG PortConfigSize;
BOOLEAN Again; BOOLEAN Again;
ULONG i; ULONG i;
ULONG Result; ULONG Result;
NTSTATUS Status; NTSTATUS Status;
ULONG MaxBus; ULONG MaxBus;
PACCESS_RANGE AccessRanges; ULONG BusNumber;
ULONG ExtensionSize; PCI_SLOT_NUMBER SlotNumber;
ULONG NextBusNumber = 0;
ULONG NextDeviceNumber = 0;
ULONG NextFunctionNumber = 0;
DPRINT("ScsiPortInitialize() called!\n"); DPRINT("ScsiPortInitialize() called!\n");
@ -643,22 +641,60 @@ ScsiPortInitialize(IN PVOID Argument1,
SystemConfig = IoGetConfigurationInformation(); SystemConfig = IoGetConfigurationInformation();
ExtensionSize = sizeof(SCSI_PORT_DEVICE_EXTENSION) + DeviceExtensionSize = sizeof(SCSI_PORT_DEVICE_EXTENSION) +
HwInitializationData->DeviceExtensionSize; HwInitializationData->DeviceExtensionSize;
PseudoDeviceExtension = ExAllocatePool(PagedPool, PseudoDeviceExtension = ExAllocatePool(PagedPool,
ExtensionSize); DeviceExtensionSize);
RtlZeroMemory(PseudoDeviceExtension, RtlZeroMemory(PseudoDeviceExtension,
ExtensionSize); DeviceExtensionSize);
PseudoDeviceExtension->Length = ExtensionSize;
MaxBus = (HwInitializationData->AdapterInterfaceType == PCIBus) ? 8 : 1;
DPRINT("MaxBus: %lu\n", MaxBus);
BusNumber = 0;
SlotNumber.u.AsULONG = 0;
while (TRUE)
{
DPRINT("Calling HwFindAdapter() for Bus %lu\n", PortConfig->SystemIoBusNumber);
PseudoDeviceExtension->Length = DeviceExtensionSize;
PseudoDeviceExtension->MiniPortExtensionSize = HwInitializationData->DeviceExtensionSize; PseudoDeviceExtension->MiniPortExtensionSize = HwInitializationData->DeviceExtensionSize;
PseudoDeviceExtension->LunExtensionSize = HwInitializationData->SpecificLuExtensionSize; PseudoDeviceExtension->LunExtensionSize = HwInitializationData->SpecificLuExtensionSize;
PseudoDeviceExtension->HwStartIo = HwInitializationData->HwStartIo; PseudoDeviceExtension->HwStartIo = HwInitializationData->HwStartIo;
PseudoDeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt; PseudoDeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt;
PortConfig = &PseudoDeviceExtension->PortConfig; InitializeListHead(&PseudoDeviceExtension->DeviceBaseListHead);
PseudoDeviceExtension->AdapterObject = NULL;
PseudoDeviceExtension->MapRegisterCount = 0;
PseudoDeviceExtension->PhysicalAddress.QuadPart = 0ULL;
PseudoDeviceExtension->VirtualAddress = NULL;
PseudoDeviceExtension->CommonBufferLength = 0;
RtlZeroMemory(PseudoDeviceExtension->MiniPortDeviceExtension,
PseudoDeviceExtension->MiniPortExtensionSize);
/* Allocate and initialize port configuration info */
if (PortConfig == NULL)
{
PortConfigSize = sizeof(PORT_CONFIGURATION_INFORMATION) +
HwInitializationData->NumberOfAccessRanges * sizeof(ACCESS_RANGE);
PortConfig = ExAllocatePool (NonPagedPool, PortConfigSize);
if (PortConfig == NULL)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto ByeBye;
}
}
RtlZeroMemory (PortConfig, PortConfigSize);
PortConfig->Length = sizeof(PORT_CONFIGURATION_INFORMATION); PortConfig->Length = sizeof(PORT_CONFIGURATION_INFORMATION);
PortConfig->SystemIoBusNumber = 0; PortConfig->SystemIoBusNumber = BusNumber;
PortConfig->AdapterInterfaceType = HwInitializationData->AdapterInterfaceType; PortConfig->AdapterInterfaceType = HwInitializationData->AdapterInterfaceType;
// PortConfig->BusInterruptLevel = oz_dev_pci_conf_inb (pciconfp, OZ_DEV_PCI_CONF_B_INTLINE); // PortConfig->BusInterruptLevel = oz_dev_pci_conf_inb (pciconfp, OZ_DEV_PCI_CONF_B_INTLINE);
// PortConfig->BusInterruptVector = ; // PortConfig->BusInterruptVector = ;
@ -695,34 +731,11 @@ ScsiPortInitialize(IN PVOID Argument1,
// PortConfig->BufferAccessScsiPortControlled = // PortConfig->BufferAccessScsiPortControlled =
PortConfig->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS; PortConfig->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS;
// PortConfig->MaximumNumberOfLogicalUnits = SCSI_MAXIMUM_LOGICAL_UNITS; // PortConfig->MaximumNumberOfLogicalUnits = SCSI_MAXIMUM_LOGICAL_UNITS;
PortConfig->SlotNumber = 0;
PortConfig->AccessRanges = PortConfig->SlotNumber = SlotNumber.u.AsULONG;
ExAllocatePool(PagedPool,
sizeof(ACCESS_RANGE) * PortConfig->NumberOfAccessRanges);
PortConfig->AccessRanges = (PACCESS_RANGE)(PortConfig + 1);
MaxBus = (PortConfig->AdapterInterfaceType == PCIBus) ? 8 : 1;
DPRINT("MaxBus: %lu\n", MaxBus);
while (TRUE)
{
DPRINT("Calling HwFindAdapter() for Bus %lu\n", PortConfig->SystemIoBusNumber);
InitializeListHead(&PseudoDeviceExtension->DeviceBaseListHead);
// RtlZeroMemory(AccessRanges,
// sizeof(ACCESS_RANGE) * PortConfig->NumberOfAccessRanges);
PseudoDeviceExtension->AdapterObject = NULL;
PseudoDeviceExtension->MapRegisterCount = 0;
PseudoDeviceExtension->PhysicalAddress.QuadPart = 0ULL;
PseudoDeviceExtension->VirtualAddress = NULL;
PseudoDeviceExtension->CommonBufferLength = 0;
RtlZeroMemory(PseudoDeviceExtension->MiniPortDeviceExtension,
PseudoDeviceExtension->MiniPortExtensionSize);
if ((HwInitializationData->AdapterInterfaceType == PCIBus) && if ((HwInitializationData->AdapterInterfaceType == PCIBus) &&
(HwInitializationData->VendorIdLength > 0) && (HwInitializationData->VendorIdLength > 0) &&
@ -738,15 +751,12 @@ ScsiPortInitialize(IN PVOID Argument1,
HwInitializationData->DeviceId); HwInitializationData->DeviceId);
if (!SpiGetPciConfigData (HwInitializationData, if (!SpiGetPciConfigData (HwInitializationData,
&PseudoDeviceExtension->PortConfig, PortConfig,
NextBusNumber, BusNumber,
&NextDeviceNumber, &SlotNumber))
&NextFunctionNumber))
{ {
ExFreePool(PortConfig->AccessRanges); Status = STATUS_UNSUCCESSFUL;
ExFreePool(PseudoDeviceExtension); goto ByeBye;
return STATUS_UNSUCCESSFUL;
} }
} }
@ -756,7 +766,7 @@ ScsiPortInitialize(IN PVOID Argument1,
HwContext, HwContext,
0, /* BusInformation */ 0, /* BusInformation */
"", /* ArgumentString */ "", /* ArgumentString */
&PseudoDeviceExtension->PortConfig, PortConfig,
&Again); &Again);
DPRINT("HwFindAdapter() Result: %lu Again: %s\n", DPRINT("HwFindAdapter() Result: %lu Again: %s\n",
Result, (Again) ? "True" : "False"); Result, (Again) ? "True" : "False");
@ -765,6 +775,8 @@ ScsiPortInitialize(IN PVOID Argument1,
{ {
DPRINT("ScsiPortInitialize(): Found HBA!\n"); DPRINT("ScsiPortInitialize(): Found HBA!\n");
PseudoDeviceExtension->PortConfig = PortConfig;
Status = ScsiPortCreatePortDevice(DriverObject, Status = ScsiPortCreatePortDevice(DriverObject,
PseudoDeviceExtension, PseudoDeviceExtension,
SystemConfig->ScsiPortCount, SystemConfig->ScsiPortCount,
@ -774,10 +786,7 @@ ScsiPortInitialize(IN PVOID Argument1,
{ {
DbgPrint("ScsiPortCreatePortDevice() failed! (Status 0x%lX)\n", Status); DbgPrint("ScsiPortCreatePortDevice() failed! (Status 0x%lX)\n", Status);
ExFreePool(PortConfig->AccessRanges); goto ByeBye;
ExFreePool(PseudoDeviceExtension);
return(Status);
} }
/* Get inquiry data */ /* Get inquiry data */
@ -788,29 +797,43 @@ ScsiPortInitialize(IN PVOID Argument1,
(PUNICODE_STRING)Argument2); (PUNICODE_STRING)Argument2);
/* Update the system configuration info */ /* Update the system configuration info */
SystemConfig->AtDiskPrimaryAddressClaimed = PortConfig->AtdiskPrimaryClaimed; if (PortConfig->AtdiskPrimaryClaimed == TRUE)
SystemConfig->AtDiskSecondaryAddressClaimed = PortConfig->AtdiskSecondaryClaimed; SystemConfig->AtDiskPrimaryAddressClaimed = TRUE;
if (PortConfig->AtdiskSecondaryClaimed == TRUE)
SystemConfig->AtDiskSecondaryAddressClaimed = TRUE;
SystemConfig->ScsiPortCount++; SystemConfig->ScsiPortCount++;
PortConfig = NULL;
}
DPRINT("Bus: %lu MaxBus: %lu\n", NextBusNumber, MaxBus);
if (BusNumber >= MaxBus)
{
DPRINT("Scanned all buses!\n");
Status = STATUS_SUCCESS;
goto ByeBye;
} }
if (Again == FALSE) if (Again == FALSE)
{ {
PortConfig->SystemIoBusNumber++; BusNumber++;
PortConfig->SlotNumber = 0; SlotNumber.u.AsULONG = 0;
NextBusNumber++; }
NextDeviceNumber = 0;
NextFunctionNumber = 0;
} }
DPRINT("Bus: %lu MaxBus: %lu\n", PortConfig->SystemIoBusNumber, MaxBus); ByeBye:
if (PortConfig->SystemIoBusNumber >= MaxBus)
if (!NT_SUCCESS(Status))
{ {
DPRINT("Scanned all buses!\n"); /* Clean up the mess */
break;
} }
if (PortConfig != NULL)
{
ExFreePool(PortConfig);
} }
ExFreePool(PortConfig->AccessRanges);
ExFreePool(PseudoDeviceExtension); ExFreePool(PseudoDeviceExtension);
DPRINT("ScsiPortInitialize() done!\n"); DPRINT("ScsiPortInitialize() done!\n");
@ -994,8 +1017,7 @@ static BOOLEAN
SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData, SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig, IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig,
IN ULONG BusNumber, IN ULONG BusNumber,
IN OUT PULONG NextDeviceNumber, IN OUT PPCI_SLOT_NUMBER NextSlotNumber)
IN OUT PULONG NextFunctionNumber)
{ {
PCI_COMMON_CONFIG PciConfig; PCI_COMMON_CONFIG PciConfig;
PCI_SLOT_NUMBER SlotNumber; PCI_SLOT_NUMBER SlotNumber;
@ -1007,23 +1029,23 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
DPRINT1("SpiGetPciConfiguration() called\n"); DPRINT1("SpiGetPciConfiguration() called\n");
if (*NextFunctionNumber > 7) if (NextSlotNumber->u.bits.FunctionNumber >= PCI_MAX_FUNCTION)
{ {
*NextFunctionNumber = 0; NextSlotNumber->u.bits.FunctionNumber = 0;
(*NextDeviceNumber)++; NextSlotNumber->u.bits.DeviceNumber++;
} }
if (*NextDeviceNumber > 31) if (NextSlotNumber->u.bits.DeviceNumber >= PCI_MAX_DEVICES)
{ {
*NextDeviceNumber = 0; NextSlotNumber->u.bits.DeviceNumber = 0;
return FALSE; return FALSE;
} }
for (DeviceNumber = *NextDeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++) for (DeviceNumber = NextSlotNumber->u.bits.DeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
{ {
SlotNumber.u.bits.DeviceNumber = DeviceNumber; SlotNumber.u.bits.DeviceNumber = DeviceNumber;
for (FunctionNumber = *NextFunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++) for (FunctionNumber = NextSlotNumber->u.bits.FunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
{ {
SlotNumber.u.bits.FunctionNumber = FunctionNumber; SlotNumber.u.bits.FunctionNumber = FunctionNumber;
@ -1059,8 +1081,8 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
PortConfig->SlotNumber = SlotNumber.u.AsULONG; PortConfig->SlotNumber = SlotNumber.u.AsULONG;
*NextDeviceNumber = DeviceNumber; NextSlotNumber->u.bits.DeviceNumber = DeviceNumber;
*NextFunctionNumber = FunctionNumber + 1; NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1;
return TRUE; return TRUE;
} }
@ -1071,7 +1093,7 @@ SpiGetPciConfigData (IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
break; break;
} }
} }
*NextFunctionNumber = 0; NextSlotNumber->u.bits.FunctionNumber = 0;
} }
DPRINT1("No device found\n"); DPRINT1("No device found\n");
@ -1221,7 +1243,7 @@ ScsiPortDispatchScsi(IN PDEVICE_OBJECT DeviceObject,
case SRB_FUNCTION_SHUTDOWN: case SRB_FUNCTION_SHUTDOWN:
case SRB_FUNCTION_FLUSH: case SRB_FUNCTION_FLUSH:
if (DeviceExtension->PortConfig.CachesData == TRUE) if (DeviceExtension->PortConfig->CachesData == TRUE)
{ {
IoStartPacket(DeviceObject, Irp, NULL, NULL); IoStartPacket(DeviceObject, Irp, NULL, NULL);
return(STATUS_PENDING); return(STATUS_PENDING);
@ -1503,7 +1525,6 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
WCHAR DosNameBuffer[80]; WCHAR DosNameBuffer[80];
UNICODE_STRING DosDeviceName; UNICODE_STRING DosDeviceName;
NTSTATUS Status; NTSTATUS Status;
ULONG AccessRangeSize;
ULONG MappedIrq; ULONG MappedIrq;
KIRQL Dirql; KIRQL Dirql;
KAFFINITY Affinity; KAFFINITY Affinity;
@ -1512,13 +1533,6 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
*RealDeviceExtension = NULL; *RealDeviceExtension = NULL;
MappedIrq = HalGetInterruptVector(PseudoDeviceExtension->PortConfig.AdapterInterfaceType,
PseudoDeviceExtension->PortConfig.SystemIoBusNumber,
PseudoDeviceExtension->PortConfig.BusInterruptLevel,
PseudoDeviceExtension->PortConfig.BusInterruptVector,
&Dirql,
&Affinity);
/* Create a unicode device name */ /* Create a unicode device name */
swprintf(NameBuffer, swprintf(NameBuffer,
L"\\Device\\ScsiPort%lu", L"\\Device\\ScsiPort%lu",
@ -1555,15 +1569,6 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
PseudoDeviceExtension, PseudoDeviceExtension,
PseudoDeviceExtension->Length); PseudoDeviceExtension->Length);
/* Copy access ranges */
AccessRangeSize =
sizeof(ACCESS_RANGE) * PseudoDeviceExtension->PortConfig.NumberOfAccessRanges;
PortDeviceExtension->PortConfig.AccessRanges = ExAllocatePool(NonPagedPool,
AccessRangeSize);
memcpy(PortDeviceExtension->PortConfig.AccessRanges,
PseudoDeviceExtension->PortConfig.AccessRanges,
AccessRangeSize);
/* Copy device base list */ /* Copy device base list */
if (IsListEmpty(&PseudoDeviceExtension->DeviceBaseListHead)) if (IsListEmpty(&PseudoDeviceExtension->DeviceBaseListHead))
{ {
@ -1588,6 +1593,13 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
KeInitializeSpinLock(&PortDeviceExtension->IrpLock); KeInitializeSpinLock(&PortDeviceExtension->IrpLock);
KeInitializeSpinLock(&PortDeviceExtension->SpinLock); KeInitializeSpinLock(&PortDeviceExtension->SpinLock);
MappedIrq = HalGetInterruptVector(PseudoDeviceExtension->PortConfig->AdapterInterfaceType,
PseudoDeviceExtension->PortConfig->SystemIoBusNumber,
PseudoDeviceExtension->PortConfig->BusInterruptLevel,
PseudoDeviceExtension->PortConfig->BusInterruptVector,
&Dirql,
&Affinity);
/* Register an interrupt handler for this device */ /* Register an interrupt handler for this device */
Status = IoConnectInterrupt(&PortDeviceExtension->Interrupt, Status = IoConnectInterrupt(&PortDeviceExtension->Interrupt,
ScsiPortIsr, ScsiPortIsr,
@ -1596,14 +1608,14 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
MappedIrq, MappedIrq,
Dirql, Dirql,
Dirql, Dirql,
PortDeviceExtension->PortConfig.InterruptMode, PortDeviceExtension->PortConfig->InterruptMode,
TRUE, TRUE,
Affinity, Affinity,
FALSE); FALSE);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DbgPrint("Could not Connect Interrupt %d\n", DbgPrint("Could not Connect Interrupt %d\n",
PortDeviceExtension->PortConfig.BusInterruptVector); PortDeviceExtension->PortConfig->BusInterruptVector);
IoDeleteDevice(PortDeviceObject); IoDeleteDevice(PortDeviceObject);
return(Status); return(Status);
} }
@ -1625,16 +1637,16 @@ ScsiPortCreatePortDevice(IN PDRIVER_OBJECT DriverObject,
PortDeviceExtension->PortCapabilities = PortCapabilities; PortDeviceExtension->PortCapabilities = PortCapabilities;
PortCapabilities->Length = sizeof(IO_SCSI_CAPABILITIES); PortCapabilities->Length = sizeof(IO_SCSI_CAPABILITIES);
PortCapabilities->MaximumTransferLength = PortCapabilities->MaximumTransferLength =
PortDeviceExtension->PortConfig.MaximumTransferLength; PortDeviceExtension->PortConfig->MaximumTransferLength;
PortCapabilities->MaximumPhysicalPages = PortCapabilities->MaximumPhysicalPages =
PortCapabilities->MaximumTransferLength / PAGE_SIZE; PortCapabilities->MaximumTransferLength / PAGE_SIZE;
PortCapabilities->SupportedAsynchronousEvents = 0; /* FIXME */ PortCapabilities->SupportedAsynchronousEvents = 0; /* FIXME */
PortCapabilities->AlignmentMask = PortCapabilities->AlignmentMask =
PortDeviceExtension->PortConfig.AlignmentMask; PortDeviceExtension->PortConfig->AlignmentMask;
PortCapabilities->TaggedQueuing = PortCapabilities->TaggedQueuing =
PortDeviceExtension->PortConfig.TaggedQueuing; PortDeviceExtension->PortConfig->TaggedQueuing;
PortCapabilities->AdapterScansDown = PortCapabilities->AdapterScansDown =
PortDeviceExtension->PortConfig.AdapterScansDown; PortDeviceExtension->PortConfig->AdapterScansDown;
PortCapabilities->AdapterUsesPio = TRUE; /* FIXME */ PortCapabilities->AdapterUsesPio = TRUE; /* FIXME */
/* Initialize LUN-Extension list */ /* Initialize LUN-Extension list */
@ -1759,11 +1771,11 @@ SpiInquirePort(PSCSI_PORT_DEVICE_EXTENSION DeviceExtension)
Srb.DataTransferLength = 256; Srb.DataTransferLength = 256;
Srb.Cdb[0] = SCSIOP_INQUIRY; Srb.Cdb[0] = SCSIOP_INQUIRY;
for (Bus = 0; Bus < DeviceExtension->PortConfig.NumberOfBuses; Bus++) for (Bus = 0; Bus < DeviceExtension->PortConfig->NumberOfBuses; Bus++)
{ {
Srb.PathId = Bus; Srb.PathId = Bus;
for (Target = 0; Target < DeviceExtension->PortConfig.MaximumNumberOfTargets; Target++) for (Target = 0; Target < DeviceExtension->PortConfig->MaximumNumberOfTargets; Target++)
{ {
Srb.TargetId = Target; Srb.TargetId = Target;
@ -1816,7 +1828,7 @@ SpiGetInquiryData(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
DPRINT("SpiGetInquiryData() called\n"); DPRINT("SpiGetInquiryData() called\n");
/* Copy inquiry data to the port device extension */ /* Copy inquiry data to the port device extension */
AdapterBusInfo->NumberOfBuses = DeviceExtension->PortConfig.NumberOfBuses; AdapterBusInfo->NumberOfBuses = DeviceExtension->PortConfig->NumberOfBuses;
UnitInfo = (PSCSI_INQUIRY_DATA) UnitInfo = (PSCSI_INQUIRY_DATA)
((PUCHAR)AdapterBusInfo + sizeof(SCSI_ADAPTER_BUS_INFO) + ((PUCHAR)AdapterBusInfo + sizeof(SCSI_ADAPTER_BUS_INFO) +
@ -1825,14 +1837,14 @@ SpiGetInquiryData(IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
for (Bus = 0; Bus < AdapterBusInfo->NumberOfBuses; Bus++) for (Bus = 0; Bus < AdapterBusInfo->NumberOfBuses; Bus++)
{ {
AdapterBusInfo->BusData[Bus].InitiatorBusId = AdapterBusInfo->BusData[Bus].InitiatorBusId =
DeviceExtension->PortConfig.InitiatorBusId[Bus]; DeviceExtension->PortConfig->InitiatorBusId[Bus];
AdapterBusInfo->BusData[Bus].InquiryDataOffset = AdapterBusInfo->BusData[Bus].InquiryDataOffset =
(ULONG)((PUCHAR)UnitInfo - (PUCHAR)AdapterBusInfo); (ULONG)((PUCHAR)UnitInfo - (PUCHAR)AdapterBusInfo);
PrevUnit = NULL; PrevUnit = NULL;
UnitCount = 0; UnitCount = 0;
for (Target = 0; Target < DeviceExtension->PortConfig.MaximumNumberOfTargets; Target++) for (Target = 0; Target < DeviceExtension->PortConfig->MaximumNumberOfTargets; Target++)
{ {
for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++) for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++)
{ {
@ -2217,7 +2229,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
} }
/* Set 'Interrupt' (REG_DWORD) value (NT4 only) */ /* Set 'Interrupt' (REG_DWORD) value (NT4 only) */
UlongData = (ULONG)DeviceExtension->PortConfig.BusInterruptLevel; UlongData = (ULONG)DeviceExtension->PortConfig->BusInterruptLevel;
DPRINT(" Interrupt = %lu\n", UlongData); DPRINT(" Interrupt = %lu\n", UlongData);
RtlInitUnicodeString(&ValueName, RtlInitUnicodeString(&ValueName,
L"Interrupt"); L"Interrupt");
@ -2235,7 +2247,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
} }
/* Set 'IOAddress' (REG_DWORD) value (NT4 only) */ /* Set 'IOAddress' (REG_DWORD) value (NT4 only) */
UlongData = ScsiPortConvertPhysicalAddressToUlong(DeviceExtension->PortConfig.AccessRanges[0].RangeStart); UlongData = ScsiPortConvertPhysicalAddressToUlong(DeviceExtension->PortConfig->AccessRanges[0].RangeStart);
DPRINT(" IOAddress = %lx\n", UlongData); DPRINT(" IOAddress = %lx\n", UlongData);
RtlInitUnicodeString(&ValueName, RtlInitUnicodeString(&ValueName,
L"IOAddress"); L"IOAddress");
@ -2253,7 +2265,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
} }
/* Enumerate buses */ /* Enumerate buses */
for (BusNumber = 0; BusNumber < DeviceExtension->PortConfig.NumberOfBuses; BusNumber++) for (BusNumber = 0; BusNumber < DeviceExtension->PortConfig->NumberOfBuses; BusNumber++)
{ {
/* Create 'Scsi Bus X' key */ /* Create 'Scsi Bus X' key */
DPRINT(" Scsi Bus %lu\n", BusNumber); DPRINT(" Scsi Bus %lu\n", BusNumber);
@ -2282,10 +2294,10 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
/* Create 'Initiator Id X' key */ /* Create 'Initiator Id X' key */
DPRINT(" Initiator Id %u\n", DPRINT(" Initiator Id %u\n",
DeviceExtension->PortConfig.InitiatorBusId[BusNumber]); DeviceExtension->PortConfig->InitiatorBusId[BusNumber]);
swprintf(NameBuffer, swprintf(NameBuffer,
L"Initiator Id %u", L"Initiator Id %u",
DeviceExtension->PortConfig.InitiatorBusId[BusNumber]); DeviceExtension->PortConfig->InitiatorBusId[BusNumber]);
RtlInitUnicodeString(&KeyName, RtlInitUnicodeString(&KeyName,
NameBuffer); NameBuffer);
InitializeObjectAttributes(&ObjectAttributes, InitializeObjectAttributes(&ObjectAttributes,
@ -2315,7 +2327,7 @@ SpiBuildDeviceMap (PSCSI_PORT_DEVICE_EXTENSION DeviceExtension,
/* Enumerate targets */ /* Enumerate targets */
CurrentTarget = (ULONG)-1; CurrentTarget = (ULONG)-1;
ScsiTargetKey = NULL; ScsiTargetKey = NULL;
for (Target = 0; Target < DeviceExtension->PortConfig.MaximumNumberOfTargets; Target++) for (Target = 0; Target < DeviceExtension->PortConfig->MaximumNumberOfTargets; Target++)
{ {
for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++) for (Lun = 0; Lun < SCSI_MAXIMUM_LOGICAL_UNITS; Lun++)
{ {

View file

@ -57,7 +57,7 @@ typedef struct _SCSI_PORT_DEVICE_EXTENSION
{ {
ULONG Length; ULONG Length;
ULONG MiniPortExtensionSize; ULONG MiniPortExtensionSize;
PORT_CONFIGURATION_INFORMATION PortConfig; PPORT_CONFIGURATION_INFORMATION PortConfig;
ULONG PortNumber; ULONG PortNumber;
KSPIN_LOCK IrpLock; KSPIN_LOCK IrpLock;