• Vincent Palatin's avatar
    USB: ohci-exynos: initialize registers pointer earlier · 57465109
    Vincent Palatin authored
    In the former code, we have a race condition between the first interrupt
    and the regs field initilization in the usb_hcd structure.
    If the OHCI irq fires before hcd->regs is set, we are getting a null
    pointer dereference in ohci_irq.
    
    When calling usb_add_hcd(), it first executes the reset() callback,
    then enables the ohci interrupt, and finally executes the start()
    callback. So moving the ohci_init() call which actually initializes the
    reg field from start() to reset() should remove the race.
    
    Tested by enabling the external HSIC hub in the bootloader on an exynos5
    machine and booting. With the former code, this triggers an early interrupt
    about 50% of the boots and a subsequent kernel panic in ohci_irq when trying
    to access the registers.
    
    Cc: Olof Johansson <olofj@chromium.org>
    Cc: Doug Anderson <dianders@chromium.org>
    Cc: Arjun.K.V <arjun.kv@samsung.com>
    Cc: Vikas Sajjan <vikas.sajjan@samsung.com>
    Cc: Abhilash Kesavan <a.kesavan@samsung.com>
    Signed-off-by: default avatarVincent Palatin <vpalatin@chromium.org>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    57465109
ohci-exynos.c 6.81 KB