ath10k: fix patching mistake for AP/IBSS CSA
authorMichal Kazior <michal.kazior@tieto.com>
Mon, 9 Mar 2015 13:19:24 +0000 (14:19 +0100)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 12 Mar 2015 12:16:45 +0000 (14:16 +0200)
Mistakenly v1 of `ath10k: fix AP/IBSS CSA with
template based fw`
(81a9a17db5d766d2872c4ab8a77b8666d22031ec) was
applied.

This patch applies the missing bits from v2:
 * remove unnecessary locking
 * add some (sanity) checks

There are no practical functionality differences
between v1 and v2.

Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi-tlv.c

index 42be1e1..cd806c5 100644 (file)
@@ -1230,9 +1230,10 @@ static void ath10k_control_beaconing(struct ath10k_vif *arvif,
        if (!info->enable_beacon) {
                ath10k_vdev_stop(arvif);
 
-               spin_lock_bh(&arvif->ar->data_lock);
                arvif->is_started = false;
                arvif->is_up = false;
+
+               spin_lock_bh(&arvif->ar->data_lock);
                ath10k_mac_vif_beacon_free(arvif);
                spin_unlock_bh(&arvif->ar->data_lock);
 
@@ -1466,6 +1467,11 @@ static void ath10k_mac_vif_ap_csa_count_down(struct ath10k_vif *arvif)
        struct ieee80211_vif *vif = arvif->vif;
        int ret;
 
+       lockdep_assert_held(&arvif->ar->conf_mutex);
+
+       if (WARN_ON(!test_bit(WMI_SERVICE_BEACON_OFFLOAD, ar->wmi.svc_map)))
+               return;
+
        if (arvif->vdev_type != WMI_VDEV_TYPE_AP)
                return;
 
@@ -2091,9 +2097,7 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
                return;
        }
 
-       spin_lock_bh(&arvif->ar->data_lock);
        arvif->is_up = true;
-       spin_unlock_bh(&arvif->ar->data_lock);
 
        /* Workaround: Some firmware revisions (tested with qca6174
         * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
@@ -2135,9 +2139,7 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
                return;
        }
 
-       spin_lock_bh(&arvif->ar->data_lock);
        arvif->is_up = false;
-       spin_unlock_bh(&arvif->ar->data_lock);
 }
 
 static int ath10k_station_assoc(struct ath10k *ar,
index 939d86b..2e12637 100644 (file)
@@ -206,11 +206,9 @@ static int ath10k_wmi_tlv_event_bcn_tx_status(struct ath10k *ar,
                break;
        }
 
-       spin_lock_bh(&ar->data_lock);
        arvif = ath10k_get_arvif(ar, vdev_id);
-       if (arvif && arvif->is_up)
+       if (arvif && arvif->is_up && arvif->vif->csa_active)
                ieee80211_queue_work(ar->hw, &arvif->ap_csa_work);
-       spin_unlock_bh(&ar->data_lock);
 
        kfree(tb);
        return 0;