The idea of tasklets is that you should be able to run a "bottom half" of the IRQ handler with hard IRQs enabled.
Data that is shared between a hard interrupt handler and a tasklet or a normal process should use spin_lock_irqsave() whereas data shared between a tasklet and a normal process should use spin_lock_bh()
So in this case, I think we should be using spin_lock_bh() to avoid unnecessary disabling of hard IRQs.
I think this fix is partially incorrect.
The idea of tasklets is that you should be able to run a "bottom half" of the IRQ handler with hard IRQs enabled.
Data that is shared between a hard interrupt handler and a tasklet or a normal process should use spin_lock_irqsave() whereas data shared between a tasklet and a normal process should use spin_lock_bh()
So in this case, I think we should be using spin_lock_bh() to avoid unnecessary disabling of hard IRQs.
/Thomas