summaryrefslogtreecommitdiffstats
path: root/iwlegacy-fix-IBSS-cleanup.patch
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@redhat.com>2013-01-16 08:27:12 -0500
committerJosh Boyer <jwboyer@redhat.com>2013-01-16 08:27:12 -0500
commitf6e179360940569a25dea128759e6139e9916bbe (patch)
treeb308059b74b743ab74b4a41468210cc29569b2ee /iwlegacy-fix-IBSS-cleanup.patch
parent45aa9a25561570fc0feb8d355edaf7f763b4743e (diff)
downloadkernel-f6e179360940569a25dea128759e6139e9916bbe.tar.gz
kernel-f6e179360940569a25dea128759e6139e9916bbe.tar.xz
kernel-f6e179360940569a25dea128759e6139e9916bbe.zip
Add patch from Stanislaw Gruszka to fix iwlegacy IBSS cleanup (rhbz 886946)
Diffstat (limited to 'iwlegacy-fix-IBSS-cleanup.patch')
-rw-r--r--iwlegacy-fix-IBSS-cleanup.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/iwlegacy-fix-IBSS-cleanup.patch b/iwlegacy-fix-IBSS-cleanup.patch
new file mode 100644
index 000000000..5533aed75
--- /dev/null
+++ b/iwlegacy-fix-IBSS-cleanup.patch
@@ -0,0 +1,104 @@
+From 658f1bd2dd632209df00ec66349e15941ffdd83b Mon Sep 17 00:00:00 2001
+From: Stanislaw Gruszka <sgruszka@redhat.com>
+Date: Wed, 16 Jan 2013 10:28:09 +0000
+Subject: [PATCH 3.8] iwlegacy: fix IBSS cleanup
+
+We do not correctly change interface type when switching from
+IBSS mode to STA mode, that results in microcode errors.
+
+Resolves:
+https://bugzilla.redhat.com/show_bug.cgi?id=886946
+
+Reported-by: Jaroslav Skarvada <jskarvad@redhat.com>
+Cc: stable@vger.kernel.org
+Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
+---
+ drivers/net/wireless/iwlegacy/common.c | 35 ++++++++++++++--------------------
+ 1 file changed, 14 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
+index 7e16d10..90b8970 100644
+--- a/drivers/net/wireless/iwlegacy/common.c
++++ b/drivers/net/wireless/iwlegacy/common.c
+@@ -3958,17 +3958,21 @@ il_connection_init_rx_config(struct il_priv *il)
+
+ memset(&il->staging, 0, sizeof(il->staging));
+
+- if (!il->vif) {
++ switch (il->iw_mode) {
++ case NL80211_IFTYPE_UNSPECIFIED:
+ il->staging.dev_type = RXON_DEV_TYPE_ESS;
+- } else if (il->vif->type == NL80211_IFTYPE_STATION) {
++ break;
++ case NL80211_IFTYPE_STATION:
+ il->staging.dev_type = RXON_DEV_TYPE_ESS;
+ il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK;
+- } else if (il->vif->type == NL80211_IFTYPE_ADHOC) {
++ break;
++ case NL80211_IFTYPE_ADHOC:
+ il->staging.dev_type = RXON_DEV_TYPE_IBSS;
+ il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK;
+ il->staging.filter_flags =
+ RXON_FILTER_BCON_AWARE_MSK | RXON_FILTER_ACCEPT_GRP_MSK;
+- } else {
++ break;
++ default:
+ IL_ERR("Unsupported interface type %d\n", il->vif->type);
+ return;
+ }
+@@ -4550,8 +4554,7 @@ out:
+ EXPORT_SYMBOL(il_mac_add_interface);
+
+ static void
+-il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif,
+- bool mode_change)
++il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif)
+ {
+ lockdep_assert_held(&il->mutex);
+
+@@ -4560,9 +4563,7 @@ il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif,
+ il_force_scan_end(il);
+ }
+
+- if (!mode_change)
+- il_set_mode(il);
+-
++ il_set_mode(il);
+ }
+
+ void
+@@ -4575,8 +4576,8 @@ il_mac_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
+
+ WARN_ON(il->vif != vif);
+ il->vif = NULL;
+-
+- il_teardown_interface(il, vif, false);
++ il->iw_mode = NL80211_IFTYPE_UNSPECIFIED;
++ il_teardown_interface(il, vif);
+ memset(il->bssid, 0, ETH_ALEN);
+
+ D_MAC80211("leave\n");
+@@ -4685,18 +4686,10 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+ }
+
+ /* success */
+- il_teardown_interface(il, vif, true);
+ vif->type = newtype;
+ vif->p2p = false;
+- err = il_set_mode(il);
+- WARN_ON(err);
+- /*
+- * We've switched internally, but submitting to the
+- * device may have failed for some reason. Mask this
+- * error, because otherwise mac80211 will not switch
+- * (and set the interface type back) and we'll be
+- * out of sync with it.
+- */
++ il->iw_mode = newtype;
++ il_teardown_interface(il, vif);
+ err = 0;
+
+ out:
+--
+1.8.0.2
+