]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - net/mac80211/work.c
Merge tag 'v2.6.37' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / net / mac80211 / work.c
index 81d4ad64184a2e76d35414586746fa6d03f8cf9d..146097cb43a710d756ab997770faa812293ba85e 100644 (file)
@@ -43,7 +43,7 @@ enum work_action {
 /* utils */
 static inline void ASSERT_WORK_MTX(struct ieee80211_local *local)
 {
-       WARN_ON(!mutex_is_locked(&local->work_mtx));
+       lockdep_assert_held(&local->mtx);
 }
 
 /*
@@ -757,7 +757,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
        mgmt = (struct ieee80211_mgmt *) skb->data;
        fc = le16_to_cpu(mgmt->frame_control);
 
-       mutex_lock(&local->work_mtx);
+       mutex_lock(&local->mtx);
 
        list_for_each_entry(wk, &local->work_list, list) {
                const u8 *bssid = NULL;
@@ -833,7 +833,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
                WARN(1, "unexpected: %d", rma);
        }
 
-       mutex_unlock(&local->work_mtx);
+       mutex_unlock(&local->mtx);
 
        if (rma != WORK_ACT_DONE)
                goto out;
@@ -845,9 +845,9 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
        case WORK_DONE_REQUEUE:
                synchronize_rcu();
                wk->started = false; /* restart */
-               mutex_lock(&local->work_mtx);
+               mutex_lock(&local->mtx);
                list_add_tail(&wk->list, &local->work_list);
-               mutex_unlock(&local->work_mtx);
+               mutex_unlock(&local->mtx);
        }
 
  out:
@@ -888,9 +888,9 @@ static void ieee80211_work_work(struct work_struct *work)
        while ((skb = skb_dequeue(&local->work_skb_queue)))
                ieee80211_work_rx_queued_mgmt(local, skb);
 
-       ieee80211_recalc_idle(local);
+       mutex_lock(&local->mtx);
 
-       mutex_lock(&local->work_mtx);
+       ieee80211_recalc_idle(local);
 
        list_for_each_entry_safe(wk, tmp, &local->work_list, list) {
                bool started = wk->started;
@@ -995,20 +995,16 @@ static void ieee80211_work_work(struct work_struct *work)
                run_again(local, jiffies + HZ/2);
        }
 
-       mutex_lock(&local->scan_mtx);
-
        if (list_empty(&local->work_list) && local->scan_req &&
            !local->scanning)
                ieee80211_queue_delayed_work(&local->hw,
                                             &local->scan_work,
                                             round_jiffies_relative(0));
 
-       mutex_unlock(&local->scan_mtx);
-
-       mutex_unlock(&local->work_mtx);
-
        ieee80211_recalc_idle(local);
 
+       mutex_unlock(&local->mtx);
+
        list_for_each_entry_safe(wk, tmp, &free_work, list) {
                wk->done(wk, NULL);
                list_del(&wk->list);
@@ -1035,16 +1031,15 @@ void ieee80211_add_work(struct ieee80211_work *wk)
        wk->started = false;
 
        local = wk->sdata->local;
-       mutex_lock(&local->work_mtx);
+       mutex_lock(&local->mtx);
        list_add_tail(&wk->list, &local->work_list);
-       mutex_unlock(&local->work_mtx);
+       mutex_unlock(&local->mtx);
 
        ieee80211_queue_work(&local->hw, &local->work_work);
 }
 
 void ieee80211_work_init(struct ieee80211_local *local)
 {
-       mutex_init(&local->work_mtx);
        INIT_LIST_HEAD(&local->work_list);
        setup_timer(&local->work_timer, ieee80211_work_timer,
                    (unsigned long)local);
@@ -1056,28 +1051,31 @@ void ieee80211_work_purge(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_work *wk;
+       bool cleanup = false;
 
-       mutex_lock(&local->work_mtx);
+       mutex_lock(&local->mtx);
        list_for_each_entry(wk, &local->work_list, list) {
                if (wk->sdata != sdata)
                        continue;
+               cleanup = true;
                wk->type = IEEE80211_WORK_ABORT;
                wk->started = true;
                wk->timeout = jiffies;
        }
-       mutex_unlock(&local->work_mtx);
+       mutex_unlock(&local->mtx);
 
        /* run cleanups etc. */
-       ieee80211_work_work(&local->work_work);
+       if (cleanup)
+               ieee80211_work_work(&local->work_work);
 
-       mutex_lock(&local->work_mtx);
+       mutex_lock(&local->mtx);
        list_for_each_entry(wk, &local->work_list, list) {
                if (wk->sdata != sdata)
                        continue;
                WARN_ON(1);
                break;
        }
-       mutex_unlock(&local->work_mtx);
+       mutex_unlock(&local->mtx);
 }
 
 ieee80211_rx_result ieee80211_work_rx_mgmt(struct ieee80211_sub_if_data *sdata,
@@ -1163,7 +1161,7 @@ int ieee80211_wk_cancel_remain_on_channel(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_work *wk, *tmp;
        bool found = false;
 
-       mutex_lock(&local->work_mtx);
+       mutex_lock(&local->mtx);
        list_for_each_entry_safe(wk, tmp, &local->work_list, list) {
                if ((unsigned long) wk == cookie) {
                        wk->timeout = jiffies;
@@ -1171,7 +1169,7 @@ int ieee80211_wk_cancel_remain_on_channel(struct ieee80211_sub_if_data *sdata,
                        break;
                }
        }
-       mutex_unlock(&local->work_mtx);
+       mutex_unlock(&local->mtx);
 
        if (!found)
                return -ENOENT;