USB: pxa27x_udc: avoid compiler warnings and misbehavior on buggy hardware
authorEnrico Scholz <enrico.scholz@sigma-chemnitz.de>
Sun, 11 Oct 2009 09:52:48 +0000 (11:52 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 2 Mar 2010 22:53:06 +0000 (14:53 -0800)
hardware reports wrong interrupt.  Although such a situation should not
happen, the compiler complains about this access.

This patch adds a sanity check and generates warning to detect such
issues.

Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de>
Acked-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/pxa27x_udc.c

index adda1208a1ece2bacdafd343723fe1e79cf32a49..d4c6eec70edc63eca4dddcb88cf0ddc7448d5fab 100644 (file)
@@ -2218,9 +2218,13 @@ static void irq_handle_data(int irq, struct pxa_udc *udc)
                        continue;
 
                udc_writel(udc, UDCISR0, UDCISR_INT(i, UDCISR_INT_MASK));
-               ep = &udc->pxa_ep[i];
-               ep->stats.irqs++;
-               handle_ep(ep);
+
+               WARN_ON(i >= ARRAY_SIZE(udc->pxa_ep));
+               if (i < ARRAY_SIZE(udc->pxa_ep)) {
+                       ep = &udc->pxa_ep[i];
+                       ep->stats.irqs++;
+                       handle_ep(ep);
+               }
        }
 
        for (i = 16; udcisr1 != 0 && i < 24; udcisr1 >>= 2, i++) {
@@ -2228,9 +2232,12 @@ static void irq_handle_data(int irq, struct pxa_udc *udc)
                if (!(udcisr1 & UDCISR_INT_MASK))
                        continue;
 
-               ep = &udc->pxa_ep[i];
-               ep->stats.irqs++;
-               handle_ep(ep);
+               WARN_ON(i >= ARRAY_SIZE(udc->pxa_ep));
+               if (i < ARRAY_SIZE(udc->pxa_ep)) {
+                       ep = &udc->pxa_ep[i];
+                       ep->stats.irqs++;
+                       handle_ep(ep);
+               }
        }
 
 }