All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.