summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2011-04-28 11:41:07 +0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-30 04:24:34 +0400
commit5ea68d541df200d10a373c06f945f98225c2486b (patch)
tree57957c68bd0b7af0a4d4387409b8e0fcbd2fcf1b
parent6e267da8f10b1a6551b6c4dee3779f6f56e2644d (diff)
downloadlinux-5ea68d541df200d10a373c06f945f98225c2486b.tar.xz
usb: renesas_usbhs: prevent NULL pointer crash
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>
-rw-r--r--drivers/usb/renesas_usbhs/mod.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c
index 73604a1d6843..d0f5f67e0749 100644
--- a/drivers/usb/renesas_usbhs/mod.c
+++ b/drivers/usb/renesas_usbhs/mod.c
@@ -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);