mac80211: fix a few work bugs
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 6 Jan 2010 14:30:58 +0000 (15:30 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 12 Jan 2010 18:51:28 +0000 (13:51 -0500)
Kalle and Lennert reported problems with the new work
code, and at least Kalle's problem I was able to trace
to a missing jiffies initialisation.

I also ran into a problem where occasionally I couldn't
connect, which seems fixed with kicking the work items
after scanning.

Finally, also add some sanity checking code to verify
that we're not adding work items while an interface is
down -- that case could lead to something similar to
what Lennert was seeing.

There still seems to be a race condition that we're
trying to figure out separately.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Tested-by: Lennert Buytenhek <buytenh@marvell.com>
Tested-by: Kalle Valo <kalle.valo@iki.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/scan.c
net/mac80211/work.c

index a4c63d4e6845f5f9dd12836d5f566425a6ccbc0c..30cb62bb45b35de35cb2106a009f09dc422998f3 100644 (file)
@@ -284,6 +284,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
        ieee80211_mlme_notify_scan_completed(local);
        ieee80211_ibss_notify_scan_completed(local);
        ieee80211_mesh_notify_scan_completed(local);
+       ieee80211_queue_work(&local->hw, &local->work_work);
 }
 EXPORT_SYMBOL(ieee80211_scan_completed);
 
index 5ba75990c9fd4efaf00452e538b1afabe37ef093..7c5d95b1bc04ae6282a1c0332adf968cec6e6403 100644 (file)
@@ -818,6 +818,7 @@ static void ieee80211_work_work(struct work_struct *work)
                    wk->chan == local->tmp_channel &&
                    wk->chan_type == local->tmp_channel_type) {
                        wk->started = true;
+                       wk->timeout = jiffies;
                }
 
                if (!wk->started && !local->tmp_channel) {
@@ -935,6 +936,9 @@ void ieee80211_add_work(struct ieee80211_work *wk)
        if (WARN_ON(!wk->done))
                return;
 
+       if (WARN_ON(!ieee80211_sdata_running(wk->sdata)))
+               return;
+
        wk->started = false;
 
        local = wk->sdata->local;