gianfar: irq_of_parse_and_map() error unnoticed
Subsystems (2)
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
@@ -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; }
David Miller
maintainerFrom: 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
viarch/powerpc/kernel/irq.c+727
viarch/sparc/kernel/of_device_32.c+33
viarch/sparc/kernel/of_device_64.c+59
Quoted 6 lines
They either return 0 or
NO_IRQ- either defined 0, -1, 255 orINT_MAX. ------------------------------>8-------------8<---------------------------------priv->interruptTransmit, -Receive and -Error are unsigned, so the error path wasn't taken whenirq_of_parse_and_map()returned an incorrect irq.Signed-off-by Roel Kluin <[email protected]>
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.
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
@@ -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; }
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 whenirq_of_parse_and_map()returned an incorrect irq.Signed-off-by Roel Kluin <[email protected]>---
drivers/net/gianfar.c +0
-0@@ -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?