mirror of
https://github.com/reactos/reactos.git
synced 2025-04-26 16:40:27 +00:00
- Store DeviceObject before calling IMiniportWaveCyclic as the driver might immediately call port functions
- Pass the PhysicalDeviceObject to IoGetDmaAdapter svn path=/trunk/; revision=38857
This commit is contained in:
parent
51d20d699d
commit
f781b11878
2 changed files with 27 additions and 14 deletions
|
@ -484,15 +484,20 @@ PcNewDmaChannel(
|
||||||
ULONG MapRegisters;
|
ULONG MapRegisters;
|
||||||
INTERFACE_TYPE BusType;
|
INTERFACE_TYPE BusType;
|
||||||
ULONG ResultLength;
|
ULONG ResultLength;
|
||||||
|
PCExtension* DeviceExt;
|
||||||
|
|
||||||
IDmaChannelSlaveImpl * This;
|
IDmaChannelSlaveImpl * This;
|
||||||
|
|
||||||
|
DPRINT1("OutDmaChannel %p OuterUnknown %p PoolType %p DeviceDescription %p DeviceObject %p\n",
|
||||||
|
OutDmaChannel, OuterUnknown, PoolType, DeviceDescription, DeviceObject);
|
||||||
|
|
||||||
This = AllocateItem(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
|
This = AllocateItem(PoolType, sizeof(IDmaChannelSlaveImpl), TAG_PORTCLASS);
|
||||||
if (!This)
|
if (!This)
|
||||||
{
|
{
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeviceExt = (PCExtension*) DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
Status = IoGetDeviceProperty(DeviceObject, DevicePropertyLegacyBusType, sizeof(BusType), (PVOID)&BusType, &ResultLength);
|
Status = IoGetDeviceProperty(DeviceObject, DevicePropertyLegacyBusType, sizeof(BusType), (PVOID)&BusType, &ResultLength);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
|
@ -500,7 +505,9 @@ PcNewDmaChannel(
|
||||||
DeviceDescription->InterfaceType = BusType;
|
DeviceDescription->InterfaceType = BusType;
|
||||||
}
|
}
|
||||||
|
|
||||||
Adapter = IoGetDmaAdapter(DeviceObject, DeviceDescription, &MapRegisters);
|
DPRINT1("Calling IoGetDmaAdapter\n");
|
||||||
|
|
||||||
|
Adapter = IoGetDmaAdapter(DeviceExt->PhysicalDeviceObject, DeviceDescription, &MapRegisters);
|
||||||
if (!Adapter)
|
if (!Adapter)
|
||||||
{
|
{
|
||||||
FreeItem(This, TAG_PORTCLASS);
|
FreeItem(This, TAG_PORTCLASS);
|
||||||
|
@ -516,7 +523,7 @@ PcNewDmaChannel(
|
||||||
This->MaxMapRegisters = MapRegisters;
|
This->MaxMapRegisters = MapRegisters;
|
||||||
|
|
||||||
*OutDmaChannel = (PVOID)(&This->lpVtbl);
|
*OutDmaChannel = (PVOID)(&This->lpVtbl);
|
||||||
|
DPRINT1("PcNewDmaChannel result %p\n", *OutDmaChannel);
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,8 @@ IPortWaveCyclic_fnInit(
|
||||||
PPOWERNOTIFY PowerNotify;
|
PPOWERNOTIFY PowerNotify;
|
||||||
IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
|
IPortWaveCyclicImpl * This = (IPortWaveCyclicImpl*)iface;
|
||||||
|
|
||||||
|
DPRINT1("IPortWaveCyclic_Init entered\n");
|
||||||
|
|
||||||
if (This->bInitialized)
|
if (This->bInitialized)
|
||||||
{
|
{
|
||||||
DPRINT("IPortWaveCyclic_Init called again\n");
|
DPRINT("IPortWaveCyclic_Init called again\n");
|
||||||
|
@ -152,11 +154,21 @@ IPortWaveCyclic_fnInit(
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize port object */
|
||||||
|
This->pMiniport = Miniport;
|
||||||
|
This->pDeviceObject = DeviceObject;
|
||||||
|
This->bInitialized = TRUE;
|
||||||
|
This->pResourceList = ResourceList;
|
||||||
|
|
||||||
|
/* increment reference on miniport adapter */
|
||||||
|
Miniport->lpVtbl->AddRef(Miniport);
|
||||||
|
|
||||||
Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface);
|
Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status);
|
DPRINT("IMiniportWaveCyclic_Init failed with %x\n", Status);
|
||||||
Miniport->lpVtbl->Release(Miniport);
|
Miniport->lpVtbl->Release(Miniport);
|
||||||
|
This->bInitialized = FALSE;
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,6 +184,7 @@ IPortWaveCyclic_fnInit(
|
||||||
Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor);
|
Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
DPRINT1("failed to get description\n");
|
||||||
Miniport->lpVtbl->Release(Miniport);
|
Miniport->lpVtbl->Release(Miniport);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
@ -188,18 +201,11 @@ IPortWaveCyclic_fnInit(
|
||||||
This->pPowerNotify = NULL;
|
This->pPowerNotify = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Initialize port object */
|
|
||||||
This->pMiniport = Miniport;
|
|
||||||
This->pDeviceObject = DeviceObject;
|
|
||||||
This->bInitialized = TRUE;
|
|
||||||
This->pResourceList = ResourceList;
|
|
||||||
|
|
||||||
/* increment reference on miniport adapter */
|
|
||||||
Miniport->lpVtbl->AddRef(Miniport);
|
|
||||||
/* increment reference on resource list */
|
/* increment reference on resource list */
|
||||||
ResourceList->lpVtbl->AddRef(ResourceList);
|
ResourceList->lpVtbl->AddRef(ResourceList);
|
||||||
|
|
||||||
|
|
||||||
|
DPRINT1("IPortWaveCyclic successfully initialized\n");
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,7 +320,7 @@ IPortWaveCyclic_fnNotify(
|
||||||
ServiceGroup->lpVtbl->RequestService (ServiceGroup);
|
ServiceGroup->lpVtbl->RequestService (ServiceGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const IPortWaveCyclicVtbl vt_IPortWaveCyclicVtbl =
|
static IPortWaveCyclicVtbl vt_IPortWaveCyclicVtbl =
|
||||||
{
|
{
|
||||||
IPortWaveCyclic_fnQueryInterface,
|
IPortWaveCyclic_fnQueryInterface,
|
||||||
IPortWaveCyclic_fnAddRef,
|
IPortWaveCyclic_fnAddRef,
|
||||||
|
@ -506,8 +512,8 @@ NewPortWaveCyclic(
|
||||||
if (!This)
|
if (!This)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
This->lpVtbl = (IPortWaveCyclicVtbl*)&vt_IPortWaveCyclicVtbl;
|
This->lpVtbl = &vt_IPortWaveCyclicVtbl;
|
||||||
This->lpVtblSubDevice = (ISubdeviceVtbl*)&vt_ISubdeviceVtbl;
|
This->lpVtblSubDevice = &vt_ISubdeviceVtbl;
|
||||||
This->ref = 1;
|
This->ref = 1;
|
||||||
*OutPort = (PPORT)(&This->lpVtbl);
|
*OutPort = (PPORT)(&This->lpVtbl);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue