• Daniel Wagner's avatar
    carl9170: Fix wrong completion usage · 78a9e170
    Daniel Wagner authored
    carl9170_usb_stop() is used from several places to flush and cleanup any
    pending work. The normal pattern is to send a request and wait for the
    irq handler to call complete(). The completion is not reinitialized
    during normal operation and as the old comment indicates it is important
    to keep calls to wait_for_completion_timeout() and complete() balanced.
    
    Calling complete_all() brings this equilibirum out of balance and needs
    to be fixed by a reinit_completion(). But that opens a small race
    window. It is possible that the sequence of complete_all(),
    reinit_completion() is faster than the wait_for_completion_timeout() can
    do its work. The wake up is not lost but the done counter test is after
    reinit_completion() has been executed. The only reason we don't see
    carl9170_exec_cmd() hang forever is we use the timeout version of
    wait_for_copletion().
    
    Let's fix this by reinitializing the completion (that is just setting
    done counter to 0) just before we send out an request. Now,
    carl9170_usb_stop() can be sure a complete() call is enough to make
    progess since there is only one waiter at max. This is a common pattern
    also seen in various drivers which use completion.
    Signed-off-by: default avatarDaniel Wagner <daniel.wagner@bmw-carit.de>
    Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
    78a9e170
usb.c 26.2 KB