Disabling an interrupt
Hi,
It's long before when I want to enable/disable an interrupt, I call
enable_irq()/disable_irq(). However, recently, I do that again. disable_irq() do nothing. I looked into the code and find disable_irq() is pointing to a empty function default_disable(). This change is started from 2.6.20.
I want to know what should I do if I want to disable an interrupt now?
Thanks.
Jacky
http://lxr.linux.no/linux+v2.6.37.2/kernel/irq/manage.c#L217
Check the above link.
--Sri
Quoted 19 lines · Jacky Lam
Hi,
? ? It's long before when I want to enable/disable an interrupt, I call enable_irq()/disable_irq(). However, recently, I do that again.
disable_irq()do nothing. I looked into the code and finddisable_irq()is pointing to a empty functiondefault_disable(). This change is started from 2.6.20.? ? I want to know what should I do if I want to disable an interrupt now?
? ? Thanks.
Jacky
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies at kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Signature · 2 lines
Regards, Sri.
Hi Jacky,
Sending to the list as well.
Quoted 9 lines · Jacky Lam
Hi,
It's long before when I want to enable/disable an interrupt, I call
enable_irq()/disable_irq(). However, recently, I do that again.disable_irq()do nothing. I looked into the code and finddisable_irq()is pointing to a empty functiondefault_disable(). This change is started from 2.6.20.I want to know what should I do if I want to disable an interrupt now?
So disable/enable_irq are nestable, and you're expected to call them in the order disable/enable.
You need to call enable_irq exactly the same number of times that you call disable_irq.
If you start wth inerrtupts enabled and doenable_irq
...do some stuff...disable_irq
then disable_irq will do nothing since it just decremented the count that enable_irq incremented.
Another way of looking at it is that disable_irq increments a count, and enable_irq decrements a count.
The interrupt is only "really" disabled when the count transitions from 0 to 1, and the interrupt is only "really" enabled when the count transitions from 1 to 0.
Dave Hylands
Hi Dave,
I have confirmed the execution has go into
desc <http://lxr.linux.no/linux+*/+code=desc>->irq_data
<http://lxr.linux.no/linux+*/+code=irq_data>.chip
<http://lxr.linux.no/linux+*/+code=chip>->irq_disable
<http://lxr.linux.no/linux+*/+code=irq_disable>(&desc
<http://lxr.linux.no/linux+*/+code=desc>->irq_data
<http://lxr.linux.no/linux+*/+code=irq_data>);
However, irq_disable points to kernel/irq/chip.c:default_disable() which do nothings. Unlike default_enable() which called by enable_irq() will unmask the IRQ accordingly.
I don't understand the reason behind.
BR,
Jacky
Quoted 28 lines · Dave Hylands
Hi Jacky,
Sending to the list as well.
Quoted 9 lines · Jacky Lam
Hi,
It's long before when I want to enable/disable an interrupt, I call
enable_irq()/disable_irq(). However, recently, I do that again.disable_irq()do nothing. I looked into the code and finddisable_irq()is pointing to a empty functiondefault_disable(). This change is started from 2.6.20.I want to know what should I do if I want to disable an interrupt now?
So disable/enable_irq are nestable, and you're expected to call them in the order disable/enable.
You need to call
enable_irqexactly the same number of times that you calldisable_irq.If you start wth inerrtupts enabled and do
enable_irq
...do some stuff...disable_irqthen
disable_irqwill do nothing since it just decremented the count thatenable_irqincremented.
Quoted 8 lines
Another way of looking at it is that
disable_irqincrements a count, andenable_irqdecrements a count.
The interrupt is only "really" disabled when the count transitions from 0 to 1, and the interrupt is only "really" enabled when the count transitions from 1 to 0.Dave Hylands
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110303/d0660954/attachment.html
Hi Jacky,
Quoted 11 lines · Jacky Lam
Hi Dave,
??? I have confirmed the execution has go into ??? ???
desc->irq_data.chip->irq_disable(&desc->irq_data);However,
irq_disablepoints to kernel/irq/chip.c:default_disable() which
do nothings.
Unlikedefault_enable()which called byenable_irq()will unmask the IRQ
accordingly.I don't understand the reason behind.
Which irq chip is being used?
It's really up to the individual irq chip driver to implement things in an appropriate manner.
Since the IRQ_DISABLED flag is set, if the interrupt happens to fire again, your handler shouldn't be called. The generic handler masks interrupts when they occur, and if the IRQ_DISABLED flag is set then it will leave the interrupt masked (i.e. disabled). Look at the the __do_IRQ function in handle.c
<http://lxr.linux.no/linux+v2.6.36.4/kernel/irq/handle.c#L446>
So even though it looks like its not doing things, the interrupt is still effectively disabled.
Signature · 3 lines
Dave Hylands Shuswap, BC, Canada http://www.davehylands.com