• David Gnedt's avatar
    wl1251: fix queue stopping/waking for TX path · e7332a41
    David Gnedt authored
    The queue stopping/waking functionality was broken in a way that could
    cause the TX to stall if the right circumstances are met.
    
    The problem was caused by tx_work, which is scheduled on each TX operation.
    If the firmware buffer is full, tx_work does nothing. In combinition with
    stopped queues or non-continues transfers, tx_work is never scheduled again.
    Moreover the low watermark introduced by
    9df86e2e never takes effect because of some
    old code.
    
    Solve this by scheduling tx_work every time tx_queue is non-empty and
    firmware buffer is freed on tx_complete.
    
    This also solves a possible but unlikely case: If less frames than the high
    watermark are queued, but more than firmware buffer can hold. This results
    in queues staying awake but the only scheduled tx_work doesn't transfer all
    frames, so the remaining frames are stuck in the queue until more frames
    get queued and tx_work is scheduled again.
    Signed-off-by: default avatarDavid Gnedt <david.gnedt@davizone.at>
    Acked-by: default avatarKalle Valo <kvalo@adurom.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    e7332a41
tx.c 13 KB