• Benjamin Li's avatar
    wcn36xx: ensure pairing of init_scan/finish_scan and start_scan/end_scan · 8f1ba8b0
    Benjamin Li authored
    An SMD capture from the downstream prima driver on WCN3680B shows the
    following command sequence for connected scans:
    
    - init_scan_req
        - start_scan_req, channel 1
        - end_scan_req, channel 1
        - start_scan_req, channel 2
        - ...
        - end_scan_req, channel 3
    - finish_scan_req
    - init_scan_req
        - start_scan_req, channel 4
        - ...
        - end_scan_req, channel 6
    - finish_scan_req
    - ...
        - end_scan_req, channel 165
    - finish_scan_req
    
    Upstream currently never calls wcn36xx_smd_end_scan, and in some cases[1]
    still sends finish_scan_req twice in a row or before init_scan_req. A
    typical connected scan looks like this:
    
    - init_scan_req
        - start_scan_req, channel 1
    - finish_scan_req
    - init_scan_req
        - start_scan_req, channel 2
    - ...
        - start_scan_req, channel 165
    - finish_scan_req
    - finish_scan_req
    
    This patch cleans up scanning so that init/finish and start/end are always
    paired together and correctly nested.
    
    - init_scan_req
        - start_scan_req, channel 1
        - end_scan_req, channel 1
    - finish_scan_req
    - init_scan_req
        - start_scan_req, channel 2
        - end_scan_req, channel 2
    - ...
        - start_scan_req, channel 165
        - end_scan_req, channel 165
    - finish_scan_req
    
    Note that upstream will not do batching of 3 active-probe scans before
    returning to the operating channel, and this patch does not change that.
    To match downstream in this aspect, adjust IEEE80211_PROBE_DELAY and/or
    the 125ms max off-channel time in ieee80211_scan_state_decision.
    
    [1]: commit d195d7aa ("wcn36xx: Ensure finish scan is not requested
    before start scan") addressed one case of finish_scan_req being sent
    without a preceding init_scan_req (the case of the operating channel
    coinciding with the first scan channel); two other cases are:
    1) if SW scan is started and aborted immediately, without scanning any
       channels, we send a finish_scan_req without ever sending init_scan_req,
       and
    2) as SW scan logic always returns us to the operating channel before
       calling wcn36xx_sw_scan_complete, finish_scan_req is always sent twice
       at the end of a SW scan
    
    Fixes: 8e84c258 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware")
    Signed-off-by: default avatarBenjamin Li <benl@squareup.com>
    Tested-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20211027170306.555535-4-benl@squareup.com
    8f1ba8b0
main.c 44.5 KB