summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAyaz Abdulla <aabdulla@nvidia.com>2009-03-05 09:02:34 +0100
committerDavid S. Miller <davem@davemloft.net>2009-03-10 13:29:51 +0100
commit1b2bb76f575699eff3f58b18dcfebf5d3b1f6ddb (patch)
tree19f8327f23dd7137b3b67588b3484d6f8dc62ade /drivers/net
parentforcedeth: performance changes (diff)
downloadlinux-1b2bb76f575699eff3f58b18dcfebf5d3b1f6ddb.tar.xz
linux-1b2bb76f575699eff3f58b18dcfebf5d3b1f6ddb.zip
forcedeth: fix irq clearing and napi spin lock changes
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> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/forcedeth.c18
1 files changed, 4 insertions, 14 deletions
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
index 28fc3357268a..514aaf189af9 100644
--- a/drivers/net/forcedeth.c
+++ b/drivers/net/forcedeth.c
@@ -3464,10 +3464,10 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
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 @@ static irqreturn_t nv_nic_irq(int foo, void *data)
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 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
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 @@ static irqreturn_t nv_nic_irq_optimized(int foo, void *data)
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 @@ static int nv_napi_poll(struct napi_struct *napi, int budget)
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;
}