提交 5ee22a5a 编写于 作者: R Ron Mercer 提交者: David S. Miller

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: NRon Mercer <ron.mercer@qlogic.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 d799bbfb
...@@ -2001,15 +2001,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) ...@@ -2001,15 +2001,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
/* /*
* Check MPI processor activity. * 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. * We've got an async event or mailbox completion.
* Handle it and clear the source of the interrupt. * Handle it and clear the source of the interrupt.
*/ */
QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n"); QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n");
ql_disable_completion_interrupt(qdev, intr_context->intr); ql_disable_completion_interrupt(qdev, intr_context->intr);
queue_delayed_work_on(smp_processor_id(), qdev->workqueue, ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
&qdev->mpi_work, 0); queue_delayed_work_on(smp_processor_id(),
qdev->workqueue, &qdev->mpi_work, 0);
work_done++; work_done++;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册