local_irq_save not masking interrupts
Alex Zeffertt
ajz at cambridgebroadband.com
Tue Sep 26 20:28:00 EST 2006
Liu Dave-r63238 wrote:
> <snip>
>> I'm having a strange problem with interrupts. My platform is
>> the MPC832xEMDS and the BSP I'm using (from Freescale) uses
>> Linux-2.6.11.
>>
>> In the code below I enter a critical section with
>> local_irq_save(), call request_irq() (from
>> mpc832xemds_phy_interrupt_enable) 4 times, then exit the
>> critical section using local_irq_restore.
>>
>> /* Enable interrupts from PHYs */
>> local_irq_save(flags);
>> for (i = 0; i < driver_data->num_phys; i++) {
>> struct atm_dev *dev = driver_data->dev_data[i]->dev;
>> printk("%s/%d\n",__FUNCTION__,__LINE__);
>> RETURN_ON_ERROR(mpc832xemds_phy_interrupt_enable(dev));
>> }
>> local_irq_restore(flags);
>>
>> The problem is that I get an interrupt *before* exiting the
>> critical section. This causes a problem for me, because the
>> interrupts are shared and the correct handler has not yet
>> been registered, so the interrupt never gets deasserted.
>>
>> My question is: why is local_irq_save()/local_irq_restore()
>> not working?
>
> Really? local_irq_save not working?
> I don't believe it.
> Please check if exist any re-enable the interrupt in the critical
> section.
>
> -DAve
Well, mpc832xemds_phy_interrupt_enable() does nothing except call
request_irq(,,SA_SHIRQ,,). I suspect that request_irq() is somehow
reenabling interrupts, but I can't see where it might be doing so.
Is this a possible?
Alex
More information about the Linuxppc-embedded
mailing list