• Ganapathi Bhat's avatar
    mwifiex: handle race during mwifiex_usb_disconnect · f8c095f6
    Ganapathi Bhat authored
    Race condition is observed during rmmod of mwifiex_usb:
    
    1. The rmmod thread will call mwifiex_usb_disconnect(), download
       SHUTDOWN command and do wait_event_interruptible_timeout(),
       waiting for response.
    
    2. The main thread will handle the response and will do a
       wake_up_interruptible(), unblocking rmmod thread.
    
    3. On getting unblocked, rmmod thread  will make rx_cmd.urb = NULL in
       mwifiex_usb_free().
    
    4. The main thread will try to resubmit rx_cmd.urb in
       mwifiex_usb_submit_rx_urb(), which is NULL.
    
    To fix this, move mwifiex_usb_free() from mwifiex_usb_disconnect
    to mwifiex_unregister_dev(). Function mwifiex_unregister_dev() is
    called after flushing the command and RX work queues.
    Suggested-by: default avatarBrian Norris <briannorris@chromium.org>
    Signed-off-by: default avatarGanapathi Bhat <gbhat@marvell.com>
    Reviewed-by: default avatarBrian Norris <briannorris@chromium.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    f8c095f6
usb.c 43.3 KB