aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRon Mercer <ron.mercer@qlogic.com>2009-10-05 07:46:48 -0400
committerDavid S. Miller <davem@davemloft.net>2009-10-06 20:33:36 -0400
commit5ee22a5aa9cd85527b93b24402db9ae2567d5aa6 (patch)
tree3aab2dc6c3507a3e0b5cd0d13c15d3523dab8f2c /drivers
parentd799bbfbe2dc94b95ad5735c99769892675c3ada (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/qlge/qlge_main.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 3d0efea32111..c21eda03fa5a 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -2001,15 +2001,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id)
2001 /* 2001 /*
2002 * Check MPI processor activity. 2002 * Check MPI processor activity.
2003 */ 2003 */
2004 if (var & STS_PI) { 2004 if ((var & STS_PI) &&
2005 (ql_read32(qdev, INTR_MASK) & INTR_MASK_PI)) {
2005 /* 2006 /*
2006 * We've got an async event or mailbox completion. 2007 * We've got an async event or mailbox completion.
2007 * Handle it and clear the source of the interrupt. 2008 * Handle it and clear the source of the interrupt.
2008 */ 2009 */
2009 QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n"); 2010 QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n");
2010 ql_disable_completion_interrupt(qdev, intr_context->intr); 2011 ql_disable_completion_interrupt(qdev, intr_context->intr);
2011 queue_delayed_work_on(smp_processor_id(), qdev->workqueue, 2012 ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16));
2012 &qdev->mpi_work, 0); 2013 queue_delayed_work_on(smp_processor_id(),
2014 qdev->workqueue, &qdev->mpi_work, 0);
2013 work_done++; 2015 work_done++;
2014 } 2016 }
2015 2017