[STORPORT] Initialize the port configuration and pass it to the HwFindAdapter routine.

This commit is contained in:
Eric Kohl 2017-10-15 13:10:08 +02:00
parent eb05356a26
commit dd0027ba19
3 changed files with 110 additions and 6 deletions

View file

@ -124,6 +124,28 @@ PortFdoQueryBusRelations(
} }
static
NTSTATUS
PortFdoFilterRequirements(
PFDO_DEVICE_EXTENSION DeviceExtension,
PIRP Irp)
{
PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList;
DPRINT1("PortFdoFilterRequirements(%p %p)\n", DeviceExtension, Irp);
/* Get the bus number and the slot number */
RequirementsList =(PIO_RESOURCE_REQUIREMENTS_LIST)Irp->IoStatus.Information;
if (RequirementsList != NULL)
{
DeviceExtension->BusNumber = RequirementsList->BusNumber;
DeviceExtension->SlotNumber = RequirementsList->SlotNumber;
}
return STATUS_SUCCESS;
}
NTSTATUS NTSTATUS
NTAPI NTAPI
PortFdoPnp( PortFdoPnp(
@ -197,6 +219,7 @@ PortFdoPnp(
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */ case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* 0x0d */
DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); DPRINT1("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
PortFdoFilterRequirements(DeviceExtension, Irp);
return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp); return ForwardIrpAndForget(DeviceExtension->LowerDevice, Irp);
case IRP_MN_QUERY_PNP_DEVICE_STATE: /* 0x14 */ case IRP_MN_QUERY_PNP_DEVICE_STATE: /* 0x14 */

View file

@ -15,6 +15,80 @@
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/
static
NTSTATUS
InitializeConfiguration(
_In_ PPORT_CONFIGURATION_INFORMATION PortConfig,
_In_ PHW_INITIALIZATION_DATA InitData,
_In_ ULONG BusNumber,
_In_ ULONG SlotNumber)
{
PCONFIGURATION_INFORMATION ConfigInfo;
ULONG i;
DPRINT1("InitializeConfiguration(%p %p %lu %lu)\n",
PortConfig, InitData, BusNumber, SlotNumber);
/* Get the configurration information */
ConfigInfo = IoGetConfigurationInformation();
/* Initialize the port configuration */
RtlZeroMemory(PortConfig,
sizeof(PORT_CONFIGURATION_INFORMATION));
PortConfig->Length = sizeof(PORT_CONFIGURATION_INFORMATION);
PortConfig->SystemIoBusNumber = BusNumber;
PortConfig->SlotNumber = SlotNumber;
PortConfig->AdapterInterfaceType = InitData->AdapterInterfaceType;
PortConfig->MaximumTransferLength = -1; //SP_UNINITIALIZED_VALUE;
PortConfig->DmaChannel = -1; //SP_UNINITIALIZED_VALUE;
PortConfig->DmaPort = -1; //SP_UNINITIALIZED_VALUE;
PortConfig->InterruptMode = LevelSensitive;
PortConfig->Master = TRUE;
PortConfig->AtdiskPrimaryClaimed = ConfigInfo->AtDiskPrimaryAddressClaimed;
PortConfig->AtdiskSecondaryClaimed = ConfigInfo->AtDiskSecondaryAddressClaimed;
PortConfig->Dma32BitAddresses = TRUE;
PortConfig->DemandMode = FALSE;
PortConfig->MapBuffers = InitData->MapBuffers;
PortConfig->NeedPhysicalAddresses = TRUE;
PortConfig->TaggedQueuing = TRUE;
PortConfig->AutoRequestSense = TRUE;
PortConfig->MultipleRequestPerLu = TRUE;
PortConfig->ReceiveEvent = InitData->ReceiveEvent;
PortConfig->RealModeInitialized = FALSE;
PortConfig->BufferAccessScsiPortControlled = TRUE;
PortConfig->MaximumNumberOfTargets = 128;
PortConfig->SpecificLuExtensionSize = InitData->SpecificLuExtensionSize;
PortConfig->SrbExtensionSize = InitData->SrbExtensionSize;
PortConfig->MaximumNumberOfLogicalUnits = 1;
PortConfig->WmiDataProvider = TRUE;
PortConfig->NumberOfAccessRanges = InitData->NumberOfAccessRanges;
DPRINT1("NumberOfAccessRanges: %lu\n", PortConfig->NumberOfAccessRanges);
if (PortConfig->NumberOfAccessRanges != 0)
{
PortConfig->AccessRanges = ExAllocatePoolWithTag(NonPagedPool,
PortConfig->NumberOfAccessRanges * sizeof(ACCESS_RANGE),
TAG_ACCRESS_RANGE);
if (PortConfig->AccessRanges == NULL)
return STATUS_NO_MEMORY;
RtlZeroMemory(PortConfig->AccessRanges,
PortConfig->NumberOfAccessRanges * sizeof(ACCESS_RANGE));
}
for (i = 0; i < 7; i++)
PortConfig->InitiatorBusId[i] = 0xff;
return STATUS_SUCCESS;
}
NTSTATUS NTSTATUS
MiniportInitialize( MiniportInitialize(
_In_ PMINIPORT Miniport, _In_ PMINIPORT Miniport,
@ -23,6 +97,7 @@ MiniportInitialize(
{ {
PMINIPORT_DEVICE_EXTENSION MiniportExtension; PMINIPORT_DEVICE_EXTENSION MiniportExtension;
ULONG Size; ULONG Size;
NTSTATUS Status;
DPRINT1("MiniportInitialize(%p %p %p)\n", DPRINT1("MiniportInitialize(%p %p %p)\n",
Miniport, DeviceExtension, InitData); Miniport, DeviceExtension, InitData);
@ -46,7 +121,13 @@ MiniportInitialize(
MiniportExtension->Miniport = Miniport; MiniportExtension->Miniport = Miniport;
Miniport->MiniportExtension = MiniportExtension; Miniport->MiniportExtension = MiniportExtension;
return STATUS_SUCCESS; /* Initialize the port configuration */
Status = InitializeConfiguration(&Miniport->PortConfig,
InitData,
DeviceExtension->BusNumber,
DeviceExtension->SlotNumber);
return Status;
} }
@ -65,7 +146,7 @@ MiniportFindAdapter(
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, &Miniport->PortConfig,
&Reserved); &Reserved);
DPRINT1("HwFindAdapter() returned %lu\n", Result); DPRINT1("HwFindAdapter() returned %lu\n", Result);

View file

@ -26,6 +26,7 @@
#define TAG_GLOBAL_DATA 'DGtS' #define TAG_GLOBAL_DATA 'DGtS'
#define TAG_INIT_DATA 'DItS' #define TAG_INIT_DATA 'DItS'
#define TAG_MINIPORT_DATA 'DMtS' #define TAG_MINIPORT_DATA 'DMtS'
#define TAG_ACCRESS_RANGE 'RAtS'
typedef enum typedef enum
{ {
@ -72,6 +73,7 @@ typedef struct _MINIPORT
{ {
struct _FDO_DEVICE_EXTENSION *DeviceExtension; struct _FDO_DEVICE_EXTENSION *DeviceExtension;
PHW_INITIALIZATION_DATA InitData; PHW_INITIALIZATION_DATA InitData;
PORT_CONFIGURATION_INFORMATION PortConfig;
PMINIPORT_DEVICE_EXTENSION MiniportExtension; PMINIPORT_DEVICE_EXTENSION MiniportExtension;
} MINIPORT, *PMINIPORT; } MINIPORT, *PMINIPORT;
@ -82,14 +84,12 @@ typedef struct _FDO_DEVICE_EXTENSION
PDEVICE_OBJECT Device; PDEVICE_OBJECT Device;
PDEVICE_OBJECT LowerDevice; PDEVICE_OBJECT LowerDevice;
PDEVICE_OBJECT PhysicalDevice; PDEVICE_OBJECT PhysicalDevice;
PDRIVER_OBJECT_EXTENSION DriverExtension; PDRIVER_OBJECT_EXTENSION DriverExtension;
DEVICE_STATE PnpState; DEVICE_STATE PnpState;
LIST_ENTRY AdapterListEntry; LIST_ENTRY AdapterListEntry;
MINIPORT Miniport; MINIPORT Miniport;
ULONG BusNumber;
ULONG SlotNumber;
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;