usb: renesas_usbhs: prevent NULL pointer crash
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 28 Apr 2011 07:41:07 +0000 (16:41 +0900)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 30 Apr 2011 00:24:34 +0000 (17:24 -0700)
usbhs_status_get_each_irq/usbhs_irq_callback_update might be called
with mod == NULL

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/renesas_usbhs/mod.c

index 73604a1..d0f5f67 100644 (file)
@@ -179,15 +179,17 @@ static void usbhs_status_get_each_irq(struct usbhs_priv *priv,
        state->intsts0 = usbhs_read(priv, INTSTS0);
        state->intsts1 = usbhs_read(priv, INTSTS1);
 
-       state->brdysts = usbhs_read(priv, BRDYSTS);
-       state->nrdysts = usbhs_read(priv, NRDYSTS);
-       state->bempsts = usbhs_read(priv, BEMPSTS);
-
        state->dvstctr = usbhs_read(priv, DVSTCTR);
 
        /* mask */
-       state->bempsts &= mod->irq_bempsts;
-       state->brdysts &= mod->irq_brdysts;
+       if (mod) {
+               state->brdysts = usbhs_read(priv, BRDYSTS);
+               state->nrdysts = usbhs_read(priv, NRDYSTS);
+               state->bempsts = usbhs_read(priv, BEMPSTS);
+
+               state->bempsts &= mod->irq_bempsts;
+               state->brdysts &= mod->irq_brdysts;
+       }
 }
 
 /*
@@ -259,17 +261,19 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
         * but "mod->irq_dev_state" will be called.
         */
 
-       if (mod->irq_ctrl_stage)
-               intenb0 |= CTRE;
+       if (mod) {
+               if (mod->irq_ctrl_stage)
+                       intenb0 |= CTRE;
 
-       if (mod->irq_empty && mod->irq_bempsts) {
-               usbhs_write(priv, BEMPENB, mod->irq_bempsts);
-               intenb0 |= BEMPE;
-       }
+               if (mod->irq_empty && mod->irq_bempsts) {
+                       usbhs_write(priv, BEMPENB, mod->irq_bempsts);
+                       intenb0 |= BEMPE;
+               }
 
-       if (mod->irq_ready && mod->irq_brdysts) {
-               usbhs_write(priv, BRDYENB, mod->irq_brdysts);
-               intenb0 |= BRDYE;
+               if (mod->irq_ready && mod->irq_brdysts) {
+                       usbhs_write(priv, BRDYENB, mod->irq_brdysts);
+                       intenb0 |= BRDYE;
+               }
        }
 
        usbhs_write(priv, INTENB0, intenb0);