• Sriram R's avatar
    ath11k: Avoid race during regd updates · 1db2b0d0
    Sriram R authored
    Whenever ath11k is bootup with a user country already set, cfg80211
    notifies this country info to ath11k soon after registration, where the
    notification is sent to the firmware for fetching the rules of this user
    country input.
    
    Multiple race conditions could be seen in this scenario where a new
    request is either lost as pointed in [1] or a new regd overwrites the
    default regd provided by the firmware during bootup. Note that, the
    default regd is used for intersection purpose and hence it should not be
    overwritten.
    
    The main reason as pointed by [1] is the usage of ATH11K_FLAG_REGISTERED
    flag which is updated after completion of core registration, whereas the
    reg notification from cfg80211 and wmi events for the corresponding
    request can happen much before that. Since the ATH11K_FLAG_REGISTERED is
    currently used to determine if the event containing reg rules belong to
    default regd or for user request, there is a possibility of the default
    regd getting overwritten.
    
    Since the default reg rules will be received only once per pdev on
    firmware load, the above flag based check can be replaced with a check
    to see if default_regd is already set, so that we can now always update
    the new_regd. Also if the new_regd is set, this will be always used to
    update the reg rules for the registered phy.
    
    [1] https://patchwork.kernel.org/project/linux-wireless/patch/1829665.1PRlr7bOQj@ripper/
    
    Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01460-QCAHKSWPL_SILICONZ-1
    Fixes: d5c65159 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
    Signed-off-by: default avatarSriram R <srirrama@codeaurora.org>
    Signed-off-by: default avatarJouni Malinen <jouni@codeaurora.org>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210721212029.142388-4-jouni@codeaurora.org
    1db2b0d0
mac.c 205 KB