[kernel/f17] Fix IBSS scanning in mac80211 (rhbz 883414)

Josh Boyer jwboyer at fedoraproject.org
Tue Dec 11 17:04:10 UTC 2012


commit 9f37335d3fc08c3deac547454eefcb1f8fae5f24
Author: Josh Boyer <jwboyer at redhat.com>
Date:   Tue Dec 11 12:03:22 2012 -0500

    Fix IBSS scanning in mac80211 (rhbz 883414)

 kernel.spec                      |   12 +++-
 mac80211-fix-ibss-scanning.patch |  132 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 143 insertions(+), 1 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 4c6f048..01f6406 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -54,7 +54,7 @@ Summary: The Linux kernel
 # For non-released -rc kernels, this will be appended after the rcX and
 # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
 #
-%global baserelease 1
+%global baserelease 2
 %global fedora_build %{baserelease}
 
 # base_sublevel is the kernel version we're starting with and patching
@@ -784,6 +784,9 @@ Patch21231: 8139cp-revert-set-ring-address-before-enabling-receiver.patch
 Patch21232: 8139cp-set-ring-address-after-enabling-C-mode.patch
 Patch21233: 8139cp-re-enable-interrupts-after-tx-timeout.patch
 
+#rhbz 883414
+Patch21234: mac80211-fix-ibss-scanning.patch
+
 # END OF PATCH DEFINITIONS
 
 %endif
@@ -1522,6 +1525,10 @@ ApplyPatch 8139cp-revert-set-ring-address-before-enabling-receiver.patch -R
 ApplyPatch 8139cp-set-ring-address-after-enabling-C-mode.patch
 ApplyPatch 8139cp-re-enable-interrupts-after-tx-timeout.patch
 
+#rhbz 883414
+ApplyPatch mac80211-fix-ibss-scanning.patch
+
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -2385,6 +2392,9 @@ fi
 #    '-'      |  |
 #              '-'
 %changelog
+* Tue Dec 11 2012 Josh Boyer <jwboyer at redhat.com>
+- Fix IBSS scanning in mac80211 (rhbz 883414)
+
 * Tue Dec 11 2012 Justin M. Forbes <jforbes at redhat.com> 3.6.10-1
 - Linux 3.6.10
 
diff --git a/mac80211-fix-ibss-scanning.patch b/mac80211-fix-ibss-scanning.patch
new file mode 100644
index 0000000..c2bc698
--- /dev/null
+++ b/mac80211-fix-ibss-scanning.patch
@@ -0,0 +1,132 @@
+Do not scan on no-IBSS and disabled channels in IBSS mode. Doing this
+can trigger Microcode errors on iwlwifi and iwlegacy drivers.
+
+Also rename ieee80211_request_internal_scan() function since it is only
+used in IBSS mode and simplify calling it from ieee80211_sta_find_ibss().
+
+This patch should address:
+https://bugzilla.redhat.com/show_bug.cgi?id=883414
+https://bugzilla.kernel.org/show_bug.cgi?id=49411
+
+Reported-by: Jesse Kahtava <jesse_kahtava at f-m.fm>
+Reported-by: Mikko Rapeli  <mikko.rapeli at iki.fi>
+Cc: stable at vger.kernel.org
+Signed-off-by: Stanislaw Gruszka <sgruszka at redhat.com>
+---
+ net/mac80211/ibss.c        |    9 ++++-----
+ net/mac80211/ieee80211_i.h |    6 +++---
+ net/mac80211/scan.c        |   34 ++++++++++++++++++++++++----------
+ 3 files changed, 31 insertions(+), 18 deletions(-)
+
+diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
+index c21e33d..d9df6b8 100644
+--- a/net/mac80211/ibss.c
++++ b/net/mac80211/ibss.c
+@@ -678,8 +678,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
+ 	sdata_info(sdata,
+ 		   "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
+ 
+-	ieee80211_request_internal_scan(sdata,
+-			ifibss->ssid, ifibss->ssid_len, NULL);
++	ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
++				    NULL);
+ }
+ 
+ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
+@@ -777,9 +777,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
+ 					IEEE80211_SCAN_INTERVAL)) {
+ 		sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
+ 
+-		ieee80211_request_internal_scan(sdata,
+-				ifibss->ssid, ifibss->ssid_len,
+-				ifibss->fixed_channel ? ifibss->channel : NULL);
++		ieee80211_request_ibss_scan(sdata, ifibss->ssid,
++					    ifibss->ssid_len, chan);
+ 	} else {
+ 		int interval = IEEE80211_SCAN_INTERVAL;
+ 
+diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
+index 156e583..bc48d4d 100644
+--- a/net/mac80211/ieee80211_i.h
++++ b/net/mac80211/ieee80211_i.h
+@@ -1247,9 +1247,9 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
+ 
+ /* scan/BSS handling */
+ void ieee80211_scan_work(struct work_struct *work);
+-int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
+-				    const u8 *ssid, u8 ssid_len,
+-				    struct ieee80211_channel *chan);
++int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
++				const u8 *ssid, u8 ssid_len,
++				struct ieee80211_channel *chan);
+ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
+ 			   struct cfg80211_scan_request *req);
+ void ieee80211_scan_cancel(struct ieee80211_local *local);
+diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
+index 43e60b5..fab706f 100644
+--- a/net/mac80211/scan.c
++++ b/net/mac80211/scan.c
+@@ -819,9 +819,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
+ 	return res;
+ }
+ 
+-int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
+-				    const u8 *ssid, u8 ssid_len,
+-				    struct ieee80211_channel *chan)
++int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
++				const u8 *ssid, u8 ssid_len,
++				struct ieee80211_channel *chan)
+ {
+ 	struct ieee80211_local *local = sdata->local;
+ 	int ret = -EBUSY;
+@@ -835,22 +835,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
+ 
+ 	/* fill internal scan request */
+ 	if (!chan) {
+-		int i, nchan = 0;
++		int i, max_n;
++		int n_ch = 0;
+ 
+ 		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
+ 			if (!local->hw.wiphy->bands[band])
+ 				continue;
+-			for (i = 0;
+-			     i < local->hw.wiphy->bands[band]->n_channels;
+-			     i++) {
+-				local->int_scan_req->channels[nchan] =
++
++			max_n = local->hw.wiphy->bands[band]->n_channels;
++			for (i = 0; i < max_n; i++) {
++				struct ieee80211_channel *tmp_ch =
+ 				    &local->hw.wiphy->bands[band]->channels[i];
+-				nchan++;
++
++				if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS |
++						     IEEE80211_CHAN_DISABLED))
++					continue;
++
++				local->int_scan_req->channels[n_ch] = tmp_ch;
++				n_ch++;
+ 			}
+ 		}
+ 
+-		local->int_scan_req->n_channels = nchan;
++		if (WARN_ON_ONCE(n_ch == 0))
++			goto unlock;
++
++		local->int_scan_req->n_channels = n_ch;
+ 	} else {
++		if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
++						IEEE80211_CHAN_DISABLED)))
++			goto unlock;
++
+ 		local->int_scan_req->channels[0] = chan;
+ 		local->int_scan_req->n_channels = 1;
+ 	}
+-- 
+1.7.1
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
+the body of a message to majordomo at vger.kernel.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
\ No newline at end of file


More information about the scm-commits mailing list