• Brian Norris's avatar
    mwifiex: pcie: don't loop/retry interrupt status checks · 5d5ddb5e
    Brian Norris authored
    The following sequence occurs when using IEEE power-save on 8997:
    (a) driver sees SLEEP event
    (b) driver issues SLEEP CONFIRM
    (c) driver recevies CMD interrupt; within the interrupt processing loop,
        we do (d) and (e):
    (d) wait for FW sleep cookie (and often time out; it takes a while), FW
        is putting card into low power mode
    (e) re-check PCIE_HOST_INT_STATUS register; quit loop with 0 value
    
    But at (e), no one actually signaled an interrupt (i.e., we didn't check
    adapter->int_status). And what's more, because the card is going to
    sleep, this register read appears to take a very long time in some cases
    -- 3 milliseconds in my case!
    
    Now, I propose that (e) is completely unnecessary. If there were any
    additional interrupts signaled after the start of this loop, then the
    interrupt handler would have set adapter->int_status to non-zero and
    queued more work for the main loop -- and we'd catch it on the next
    iteration of the main loop.
    
    So this patch drops all the looping/re-reading of PCIE_HOST_INT_STATUS,
    which avoids the problematic (and slow) register read in step (e).
    
    Incidentally, this is a very similar issue to the one fixed in commit
    ec815dd2 ("mwifiex: prevent register accesses after host is
    sleeping"), except that the register read is just very slow instead of
    fatal in this case.
    
    Tested on 8997 in both MSI and (though not technically supported at the
    moment) MSI-X mode.
    Signed-off-by: default avatarBrian Norris <briannorris@chromium.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    5d5ddb5e
pcie.c 83.6 KB