From: John W. Linville Date: Mon, 8 Feb 2010 21:38:38 +0000 (-0500) Subject: Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel... X-Git-Tag: v2.6.34-rc1~233^2~49^2~111 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6e7e6213e4956828927c30e3ef5a42812d00c650;p=platform%2Fkernel%2Flinux-3.10.git Merge branch 'master' of git://git./linux/kernel/git/linville/wireless-2.6 Conflicts: net/mac80211/scan.c --- 6e7e6213e4956828927c30e3ef5a42812d00c650 diff --cc net/mac80211/scan.c index bc061f6,bc17cf7..b822dce --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@@ -345,6 -439,16 +345,13 @@@ static int __ieee80211_start_scan(struc if (local->scan_req) return -EBUSY; - if (req != local->int_scan_req && - sdata->vif.type == NL80211_IFTYPE_STATION && - !list_empty(&ifmgd->work_list)) { - /* actually wait for the work it's doing to finish/time out */ - set_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request); ++ if (!list_empty(&local->work_list)) { ++ /* wait for the work to finish/time out */ + local->scan_req = req; + local->scan_sdata = sdata; + return 0; + } + if (local->ops->hw_scan) { u8 *ies; @@@ -364,6 -468,6 +371,14 @@@ local->hw_scan_req->ie = ies; local->hw_scan_band = 0; ++ ++ /* ++ * After allocating local->hw_scan_req, we must ++ * go through until ieee80211_prep_hw_scan(), so ++ * anything that might be changed here and leave ++ * this function early must not go after this ++ * allocation. ++ */ } local->scan_req = req; @@@ -378,15 -477,15 +388,16 @@@ __set_bit(SCAN_HW_SCANNING, &local->scanning); else __set_bit(SCAN_SW_SCANNING, &local->scanning); ++ /* * Kicking off the scan need not be protected, * only the scan variable stuff, since now * local->scan_req is assigned and other callers * will abort their scan attempts. * -- * This avoids getting a scan_mtx -> iflist_mtx -- * dependency, so that the scan completed calls -- * have more locking freedom. ++ * This avoids too many locking dependencies ++ * so that the scan completed calls have more ++ * locking freedom. */ ieee80211_recalc_idle(local);