• Soeren Moch's avatar
    rt2x00usb: fix rx queue hang · bbe75669
    Soeren Moch authored
    commit 41a531ff upstream.
    
    Since commit ed194d13 ("usb: core: remove local_irq_save() around
     ->complete() handler") the handler rt2x00usb_interrupt_rxdone() is
    not running with interrupts disabled anymore. So this completion handler
    is not guaranteed to run completely before workqueue processing starts
    for the same queue entry.
    Be sure to set all other flags in the entry correctly before marking
    this entry ready for workqueue processing. This way we cannot miss error
    conditions that need to be signalled from the completion handler to the
    worker thread.
    Note that rt2x00usb_work_rxdone() processes all available entries, not
    only such for which queue_work() was called.
    
    This patch is similar to what commit df71c9cf ("rt2x00: fix order
    of entry flags modification") did for TX processing.
    
    This fixes a regression on a RT5370 based wifi stick in AP mode, which
    suddenly stopped data transmission after some period of heavy load. Also
    stopping the hanging hostapd resulted in the error message "ieee80211
    phy0: rt2x00queue_flush_queue: Warning - Queue 14 failed to flush".
    Other operation modes are probably affected as well, this just was
    the used testcase.
    
    Fixes: ed194d13 ("usb: core: remove local_irq_save() around ->complete() handler")
    Cc: stable@vger.kernel.org # 4.20+
    Signed-off-by: default avatarSoeren Moch <smoch@web.de>
    Acked-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    bbe75669
rt2x00usb.c 22.5 KB