mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
qlge: Fix queueing of firmware handler in ISR.
Check that we are not already polling firmware events before we queue the firmware event worker, then disable firmware interrupts. Otherwise we can queue the same event multiple times. Signed-off-by: Ron Mercer <ron.mercer@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d799bbfbe2
commit
5ee22a5aa9
1 changed files with 5 additions and 3 deletions
|
@ -2001,15 +2001,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
|
|||
/*
|
||||
* Check MPI processor activity.
|
||||
*/
|
||||
if (var & STS_PI) {
|
||||
if ((var & STS_PI) &&
|
||||
(ql_read32(qdev, INTR_MASK) & INTR_MASK_PI)) {
|
||||
/*
|
||||
* We've got an async event or mailbox completion.
|
||||
* Handle it and clear the source of the interrupt.
|
||||
*/
|
||||
QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n");
|
||||
ql_disable_completion_interrupt(qdev, intr_context->intr);
|
||||
queue_delayed_work_on(smp_processor_id(), qdev->workqueue,
|
||||
&qdev->mpi_work, 0);
|
||||
ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
|
||||
queue_delayed_work_on(smp_processor_id(),
|
||||
qdev->workqueue, &qdev->mpi_work, 0);
|
||||
work_done++;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue