Re: WDF - how to share interrupt between two driver those are in the same stack?

Tech-Archive recommends: Fix windows errors by optimizing your registry



Thank you very much. ^_^

On 2月21日, 下午3時04分, "Doron Holan [MSFT]" <dor...@xxxxxxxxxxxxxxxxxxxx>
wrote:
1) you should connect / disconnect in D0Entry and D0Exit in the
parent....unless it belongs entirely to the child in which case you can
leave it alone in the parent and connect/disconnect in the child's
D0Entry/D0Exit routines. EvtInterruptEnable/Disable are only applicable if
you use the WDFINTERRUPT. since you are not using the WDFINTERRUPT, these
callbacks make no sense. If you need the same functionality, you can do
this

KeAcquireInterruptSpinLock(pkinterrupt object, &irql)
EvtInterruptEnable()
KeReleaseInterruptSpinLock(pkinterrupt object, irql)

and the same for EvtInterruptDisable()

2) WDF cannot mamange the interrupt in the child b/c it needs to see the
interrupt in the assigned resource list, so the child must use wdm to manage
the itnerrupt's state

d
--
Please do not send e-mail directly to this alias. this alias is for
newsgroup purposes only.
This posting is provided "AS IS" with no warranties, and confers no rights.

"泛若不?舟" <ZivHu...@xxxxxxxxx> wrote in message

news:76d0da81-7121-47a9-9170-ce4c79931735@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx



Thanks Doronh,

For answer 1:

If I connect/disconnect interrupt by myself, which functions are the
right places to place WDM IoConnectInterrupt/IoDisconnectInterrupt?

If I connect/disconnect the interrupt by myself, how can I let the WDF
management EvtInterruptEnable/EvtInterruptDisable for me? Or just to
enable interrupt before leaving EvtDeviceD0Entry and disable interrupt
when EvtDeviceD0Exit called?

For answer 2:

If I get the interrupt resource from private interface, does the WDF
management all interrupt issue for me? Or I need to take care of all
thing by myself (I think it's the right answer. Orz)?

Thanks for your reply. ^_^

On 2月21日, 上午2時38分, "Doron Holan [MSFT]"
<dor...@xxxxxxxxxxxxxxxxxxxx>
wrote:
1) if you want to control the interrupts connected state, you can do
this.
do not create a WDFINTERRUPT and then you can connect/disconnect however
you
choose
2) you can assign your own resources to child devices. this requires
internal interfaces which are not exposed to KMDF or though KMDF.
instead
you need to create a private interface to query for the interrupt
resources
and assign them through this private interface, this
articlehttp://blogs.msdn.com/doronh/archive/2007/10/24/how-to-share-hw-resou...
talks about the basic principles, although there are things you do not
need
to worry about like the interrupt resource going away before the child

d

--
Please do not send e-mail directly to this alias. this alias is for
newsgroup purposes only.
This posting is provided "AS IS" with no warranties, and confers no
rights.

"?????" <ZivHu...@xxxxxxxxx> wrote in message

news:cd6eec86-218b-4fac-999f-211ff514c11a@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Hi all,

I have a PCI card and I need to create a KMDF bus driver and create a
static KMDF child driver above that bus driver.

The bus driver can get hardware resources and the WDF automatically
connects and disconnects interrupts for the driver .

In the WDM, I can create a IOCTL to get interrupt resource from bus
driver and connect/disconnect the interrupt in the child driver.

I have no idea how to do that in WDF, because WDF will do that
automatically. My KMDF child driver never get any hardware resouces
when loaded.

I try this method below, but it can't work. The child report there is
no available resources and fail to load the driver.

May you hlep me? Thanks. ^_^

Step1:
Copy the CM_PARTIAL_RESOURCE_DESCRIPTOR about interrupt into the bus
driver's device extension.

Step2:
//----------------------------------------------------------------------
// When the bus driver create PDO for that child
//----------------------------------------------------------------------
WDF_PDO_EVENT_CALLBACKS_INIT(&pdoCallbacks);
pdoCallbacks.EvtDeviceResourceRequirementsQuery =
BusPdo_EvtDeviceResourceRequirementsQuery;
WdfPdoInitSetEventCallbacks(pDeviceInit, &pdoCallbacks);

Step3

In the BusPdo_EvtDeviceResourceRequirementsQuery function,
I try to copy the interrupt resource from step 2. Like this

//-----------------------------------------------------------------------
NTSTATUS status = STATUS_SUCCESS;
WDFIORESLIST logConfig;
IO_RESOURCE_DESCRIPTOR descriptor;

status = WdfIoResourceListCreate(
IoResourceRequirementsList,
WDF_NO_OBJECT_ATTRIBUTES,
&logConfig
);
if(!NT_SUCCESS(status)){
return status;
}

RtlZeroMemory(&descriptor, sizeof(descriptor));

descriptor.Option = 0;
descriptor.Type = CmResourceTypeInterrupt;
descriptor.ShareDisposition = CmResourceShareShared
descriptor.Flags= RESOURCE_INTERRUPT_LEVEL_SENSITIVE
descriptor.u.Interrupt.MinimumVector =
fdoData->InterruptDescriptor.u.Interrupt.Vector;

descriptor.u.Interrupt.MaximumVector =
fdoData->InterruptDescriptor.u.Interrupt.Vector;

descriptor.u.Interrupt.TargetedProcessors=
fdoData->InterruptDescriptor.u.Interrupt.Affinity;

descriptor.u.Interrupt.AffinityPolicy= IrqPolicyMachineDefault;
descriptor.u.Interrupt.PriorityPolicy = IrqPriorityUndefined;

status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor);
if(!NT_SUCCESS(status)){
return status;
}

status = WdfIoResourceRequirementsListAppendIoResList(

IoResourceRequirementsList,
logConfig
);

status = WdfIoResourceListAppendDescriptor(logConfig, &descriptor);
if(!NT_SUCCESS(status)){
return status;
}

return status;- 隱藏被引用文字 -

- 顯示被引用文字 -- 隱藏被引用文字 -

- 顯示被引用文字 -

.



Relevant Pages

  • Re: WDF - how to share interrupt between two driver those are in the same stack?
    ... parent....unless it belongs entirely to the child in which case you can leave it alone in the parent and connect/disconnect in the child's D0Entry/D0Exit routines. ... WDF cannot mamange the interrupt in the child b/c it needs to see the interrupt in the assigned resource list, so the child must use wdm to manage the itnerrupt's state ... If I get the interrupt resource from private interface, ... > static KMDF child driver above that bus driver. ...
    (microsoft.public.development.device.drivers)
  • Re: WDF - how to share interrupt between two driver those are in the same stack?
    ... My consideration is that the user may disable driver A and let driver ... provide some function and let the bus share it's interrupt with child ... Then the child can call this function and let the WDF management ... interrupt in the assigned resource list, so the child must use wdm to manage ...
    (microsoft.public.development.device.drivers)
  • Re: WDF - how to share interrupt between two driver those are in the same stack?
    ... as long as the child stack behave properly and turns off the interrupt when it is disabled, i do not see a problem with the design. ... My consideration is that the user may disable driver A and let driver ... > If I get the interrupt resource from private interface, ...
    (microsoft.public.development.device.drivers)
  • Re: WDF - how to share interrupt between two driver those are in the same stack?
    ... you can assign your own resources to child devices. ... instead you need to create a private interface to query for the interrupt resources and assign them through this private interface, this article talks about the basic principles, although there are things you do not need to worry about like the interrupt resource going away before the child ... static KMDF child driver above that bus driver. ... I can create a IOCTL to get interrupt resource from bus ...
    (microsoft.public.development.device.drivers)
  • Re: global data via module howto
    ... : M. Warner Losh wrote: ... In common case we have a driver for "bus": ... : If child could work on several buses it declares itself several times: one for each ...
    (freebsd-hackers)