* [PATCH 12/13] forcedeth: fix irq clearing and napi spin lock changes
@ 2009-03-05 18:02 Ayaz Abdulla
0 siblings, 0 replies; only message in thread
From: Ayaz Abdulla @ 2009-03-05 18:02 UTC (permalink / raw)
To: Jeff Garzik, Manfred Spraul, Andrew Morton, David S. Miller,
nedev
[-- Attachment #1: Type: text/plain, Size: 464 bytes --]
This patch clears the irqstatus register with the exact same events it
has read from it. Since the read-write operation is not atomic, a new
irqstatus bit could have been set in between these operations and would
then be cleared accidentally.
Secondly, we now don't need any spin lock protection when
scheduling/completing napi poll as the isr will not execute anymore (as
we turn off all interrupts now).
Signed-off-by: Ayaz Abdulla <aabdulla@nvidia.com>
[-- Attachment #2: patch-forcedeth-irq --]
[-- Type: text/plain, Size: 1971 bytes --]
--- old/drivers/net/forcedeth.c 2009-03-05 10:47:33.000000000 -0800
+++ new/drivers/net/forcedeth.c 2009-03-05 10:47:45.000000000 -0800
@@ -3464,10 +3464,10 @@
if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
np->events = readl(base + NvRegIrqStatus);
- writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
+ writel(np->events, base + NvRegIrqStatus);
} else {
np->events = readl(base + NvRegMSIXIrqStatus);
- writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus);
+ writel(np->events, base + NvRegMSIXIrqStatus);
}
dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, np->events);
if (!(np->events & np->irqmask))
@@ -3476,15 +3476,12 @@
nv_msi_workaround(np);
#ifdef CONFIG_FORCEDETH_NAPI
- spin_lock(&np->lock);
napi_schedule(&np->napi);
/* Disable furthur irq's
(msix not enabled with napi) */
writel(0, base + NvRegIrqMask);
- spin_unlock(&np->lock);
-
#else
do
{
@@ -3568,10 +3565,10 @@
if (!(np->msi_flags & NV_MSI_X_ENABLED)) {
np->events = readl(base + NvRegIrqStatus);
- writel(NVREG_IRQSTAT_MASK, base + NvRegIrqStatus);
+ writel(np->events, base + NvRegIrqStatus);
} else {
np->events = readl(base + NvRegMSIXIrqStatus);
- writel(NVREG_IRQSTAT_MASK, base + NvRegMSIXIrqStatus);
+ writel(np->events, base + NvRegMSIXIrqStatus);
}
dprintk(KERN_DEBUG "%s: irq: %08x\n", dev->name, np->events);
if (!(np->events & np->irqmask))
@@ -3580,15 +3577,12 @@
nv_msi_workaround(np);
#ifdef CONFIG_FORCEDETH_NAPI
- spin_lock(&np->lock);
napi_schedule(&np->napi);
/* Disable furthur irq's
(msix not enabled with napi) */
writel(0, base + NvRegIrqMask);
- spin_unlock(&np->lock);
-
#else
do
{
@@ -3758,13 +3752,9 @@
if (rx_work < budget) {
/* re-enable interrupts
(msix not enabled in napi) */
- spin_lock_irqsave(&np->lock, flags);
-
__napi_complete(napi);
writel(np->irqmask, base + NvRegIrqMask);
-
- spin_unlock_irqrestore(&np->lock, flags);
}
return rx_work;
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-03-05 21:01 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-05 18:02 [PATCH 12/13] forcedeth: fix irq clearing and napi spin lock changes Ayaz Abdulla
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.