ath10k: protect wep tx key setup
authorMichal Kazior <michal.kazior@tieto.com>
Mon, 26 May 2014 09:46:03 +0000 (12:46 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 27 May 2014 09:28:14 +0000 (12:28 +0300)
All configuration sequences should be protected
with conf_mutex to avoid concurrent/conflicting
requests.

This should make sure that wep tx key setup is not
performed while hw is restarted (at least).

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

index 8ad03d530820445ae0b6c1ce6daec6f59e48b54e..f21d60fb1e1b8e0fab1477e02b7b174bbe8291f5 100644 (file)
@@ -1891,8 +1891,13 @@ static void ath10k_tx_wep_key_work(struct work_struct *work)
                                                wep_key_work);
        int ret, keyidx = arvif->def_wep_key_newidx;
 
+       mutex_lock(&arvif->ar->conf_mutex);
+
+       if (arvif->ar->state != ATH10K_STATE_ON)
+               goto unlock;
+
        if (arvif->def_wep_key_idx == keyidx)
-               return;
+               goto unlock;
 
        ath10k_dbg(ATH10K_DBG_MAC, "mac vdev %d set keyidx %d\n",
                   arvif->vdev_id, keyidx);
@@ -1905,10 +1910,13 @@ static void ath10k_tx_wep_key_work(struct work_struct *work)
                ath10k_warn("failed to update wep key index for vdev %d: %d\n",
                            arvif->vdev_id,
                            ret);
-               return;
+               goto unlock;
        }
 
        arvif->def_wep_key_idx = keyidx;
+
+unlock:
+       mutex_unlock(&arvif->ar->conf_mutex);
 }
 
 static void ath10k_tx_h_update_wep_key(struct sk_buff *skb)