Skip to contentSkip to conversation

gianfar: irq_of_parse_and_map() error unnoticed

PATCH In review Roel Kluin 3 participants 4 messages Apr 23, 2009 – Apr 27, 2009

Subsystems (2)
lore
Share & tools
lore

Roel Kluin

author
#0 lore raw

PATCH 1/1 gianfar: irq_of_parse_and_map() error unnoticed

Not sure which irq_of_parse_and_map() is used, but I found definitions here:

vi arch/microblaze/kernel/irq.c +23
vi arch/powerpc/kernel/irq.c +727
vi arch/sparc/kernel/of_device_32.c +33
vi arch/sparc/kernel/of_device_64.c +59

They either return 0 or NO_IRQ - either defined 0, -1, 255 or INT_MAX. ------------------------------>8-------------8<--------------------------------- priv->interruptTransmit, -Receive and -Error are unsigned, so the error path wasn't taken when irq_of_parse_and_map() returned an incorrect irq.

---

drivers/net/gianfar.c +6 -3
index b2c4967..e30d158 100644
@@ -203,9 +203,12 @@ static int gfar_of_init(struct net_device *dev)
 
 		priv->interruptError = irq_of_parse_and_map(np, 2);
 
-		if (priv->interruptTransmit < 0 ||
-				priv->interruptReceive < 0 ||
-				priv->interruptError < 0) {
+		if (priv->interruptTransmit == 0 ||
+				priv->interruptTransmit > 254 ||
+				priv->interruptReceive == 0 ||
+				priv->interruptReceive > 254 ||
+				priv->interruptError == 0 ||
+				priv->interruptReceive > 254) {
 			err = -EINVAL;
 			goto err_out;
 		}
maintainer
#1 lore raw

From: Roel Kluin <[email protected]>
Date: Thu, 23 Apr 2009 14:52:44 +0200

Quoted 7 lines

Not sure which irq_of_parse_and_map() is used, but I found definitions here:

vi arch/microblaze/kernel/irq.c +23
vi arch/powerpc/kernel/irq.c +727
vi arch/sparc/kernel/of_device_32.c +33
vi arch/sparc/kernel/of_device_64.c +59

Quoted 6 lines

They either return 0 or NO_IRQ - either defined 0, -1, 255 or INT_MAX. ------------------------------>8-------------8<--------------------------------- priv->interruptTransmit, -Receive and -Error are unsigned, so the error path wasn't taken when irq_of_parse_and_map() returned an incorrect irq.

This test is way too convoluted for my taste.

I would rather that the implementations of this interface use a consistent value for errors. Preferrably NO_IRQ.

Not applied.

author
#2 lore raw

PATCH 2/2 gianfar: irq_of_parse_and_map() error unnoticed

priv->interruptTransmit, -Receive and -Error are unsigned, so the error path wasn't taken when irq_of_parse_and_map() returned an incorrect irq.

---

drivers/net/gianfar.c +3 -3
index b2c4967..55c2ce8 100644
@@ -203,9 +203,9 @@ static int gfar_of_init(struct net_device *dev)
 
 		priv->interruptError = irq_of_parse_and_map(np, 2);
 
-		if (priv->interruptTransmit < 0 ||
-				priv->interruptReceive < 0 ||
-				priv->interruptError < 0) {
+		if (priv->interruptTransmit == NO_IRQ ||
+				priv->interruptReceive == NO_IRQ ||
+				priv->interruptError == NO_IRQ) {
 			err = -EINVAL;
 			goto err_out;
 		}
#3 lore raw
Quoted 12 lines · On Mon, 27 Apr 2009 13:05:30 +0200 Roel Kluin <[email protected]> wrote:

priv->interruptTransmit, -Receive and -Error are unsigned, so the error path wasn't taken when irq_of_parse_and_map() returned an incorrect irq.

---

drivers/net/gianfar.c +0 -0
index b2c4967..55c2ce8 100644
@@ -203,9 +203,9 @@ static int gfar_of_init(struct net_device *dev)
 
 		priv->interruptError = irq_of_parse_and_map(np, 2);

drivers/net/gianfar.c static int gfar_of_init(struct net_device *dev) · line 211

Quoted 10 lines
drivers/net/gianfar.c +3 -3
 
-		if (priv->interruptTransmit < 0 ||
-				priv->interruptReceive < 0 ||
-				priv->interruptError < 0) {
+		if (priv->interruptTransmit == NO_IRQ ||
+				priv->interruptReceive == NO_IRQ ||
+				priv->interruptError == NO_IRQ) {
 			err = -EINVAL;
 			goto err_out;
 		}

I guess that's OK, as gianfar.c appears to be a ppc-only thing, and ppc does implement NO_IRQ.

However what a lot (all) rtc drivers do is

	if (irq <= 0)

which (afaik) will dtrt in all cases: NO_IRQ==0, NO_IRQ<0, !defined(NO_IRQ).

Then again, it will dtwt if the platform allows irq numbers of zero.

argh, how did we get into this pickle?