• Amitkumar Karwar's avatar
    mwifiex: prevent register accesses after host is sleeping · ec815dd2
    Amitkumar Karwar authored
    Following is mwifiex driver-firmware host sleep handshake.
    It involves three threads. suspend handler, interrupt handler, interrupt
    processing in main work queue.
    
    1) Enter suspend handler
    2) Download HS_CFG command
    3) Response from firmware for HS_CFG
    4) Suspend thread waits until handshake completes(i.e hs_activate becomes
       true)
    5) SLEEP from firmware
    6) SLEEP confirm downloaded to firmware.
    7) SLEEP confirm response from firmware
    8) Driver processes SLEEP confirm response and set hs_activate to wake up
    suspend thread
    9) Exit suspend handler
    10) Read sleep cookie in loop and wait until it indicates firmware is
    sleep.
    11) After processing SLEEP confirm response, we are at the end of interrupt
    processing routine. Recheck if there are interrupts received while we were
    processing them.
    
    During suspend-resume stress test, it's been observed that we may end up
    acessing PCIe hardware(in 10 and 11) when PCIe bus is closed which leads
    to a kernel crash.
    
    This patch solves the problem with below changes.
    a) action 10 above can be done before 8
    b) Skip 11 if hs_activated is true. SLEEP confirm response
    is the last interrupt from firmware. No need to recheck for
    pending interrupts.
    c) Add flush_workqueue() in suspend handler.
    Signed-off-by: default avatarAmitkumar Karwar <akarwar@marvell.com>
    Reviewed-by: default avatarBrian Norris <briannorris@chromium.org>
    Tested-by: default avatarBrian Norris <briannorris@chromium.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    ec815dd2
pcie.c 84 KB