From 44e6a69b2a5a7cfb8251561c2bfb2d3057eaded9 Mon Sep 17 00:00:00 2001 From: Josh Boyer Date: Wed, 28 Mar 2012 11:56:33 -0400 Subject: [PATCH] iwl{wifi,legacy}: Fix warnings on remove interface from Stanislaw Gruszka (rhbz 770467) --- iwlegacy-do-not-nulify-il-vif-on-reset.patch | 77 ++++++++++++++++++++ iwlwifi-do-not-nulify-ctx-vif-on-reset.patch | 66 +++++++++++++++++ kernel.spec | 12 +++ 3 files changed, 155 insertions(+) create mode 100644 iwlegacy-do-not-nulify-il-vif-on-reset.patch create mode 100644 iwlwifi-do-not-nulify-ctx-vif-on-reset.patch diff --git a/iwlegacy-do-not-nulify-il-vif-on-reset.patch b/iwlegacy-do-not-nulify-il-vif-on-reset.patch new file mode 100644 index 000000000..d1913d708 --- /dev/null +++ b/iwlegacy-do-not-nulify-il-vif-on-reset.patch @@ -0,0 +1,77 @@ +This il->vif is dereferenced in different part of iwlegacy code, so do +not nullify it. This should fix random crashes observed in companion +with microcode errors i.e. crash in il3945_config_ap(). + +Additionally this should address also +WARNING: at drivers/net/wireless/iwlegacy/common.c:4656 il_mac_remove_interface +at least one of the possible reasons of that warning. + +Cc: stable@vger.kernel.org +Signed-off-by: Stanislaw Gruszka +--- + drivers/net/wireless/iwlegacy/3945-mac.c | 2 -- + drivers/net/wireless/iwlegacy/4965-mac.c | 2 -- + drivers/net/wireless/iwlegacy/common.c | 15 ++++++++++++--- + 3 files changed, 12 insertions(+), 7 deletions(-) + +--- linux-3.3.noarch.orig/drivers/net/wireless/iwlegacy/3945-mac.c ++++ linux-3.3.noarch/drivers/net/wireless/iwlegacy/3945-mac.c +@@ -2684,7 +2684,6 @@ il3945_bg_restart(struct work_struct *da + + if (test_and_clear_bit(S_FW_ERROR, &il->status)) { + mutex_lock(&il->mutex); +- il->ctx.vif = NULL; + il->is_open = 0; + mutex_unlock(&il->mutex); + il3945_down(il); +--- linux-3.3.noarch.orig/drivers/net/wireless/iwlegacy/4965-mac.c ++++ linux-3.3.noarch/drivers/net/wireless/iwlegacy/4965-mac.c +@@ -5381,7 +5381,6 @@ il4965_bg_restart(struct work_struct *da + + if (test_and_clear_bit(S_FW_ERROR, &il->status)) { + mutex_lock(&il->mutex); +- il->ctx.vif = NULL; + il->is_open = 0; + + __il4965_down(il); +--- linux-3.3.noarch.orig/drivers/net/wireless/iwlegacy/common.c ++++ linux-3.3.noarch/drivers/net/wireless/iwlegacy/common.c +@@ -4575,6 +4575,7 @@ il_mac_add_interface(struct ieee80211_hw + struct il_priv *il = hw->priv; + struct il_vif_priv *vif_priv = (void *)vif->drv_priv; + int err; ++ bool reset; + u32 modes; + + D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr); +@@ -4594,6 +4595,16 @@ il_mac_add_interface(struct ieee80211_hw + goto out; + } + ++ /* ++ * We do not support multiple virtual interfaces, but on hardware reset ++ * we have to add the same interface again. ++ */ ++ reset = (il->ctx.vif == vif); ++ if (il->ctx.vif && !reset) { ++ err = -EOPNOTSUPP; ++ goto out; ++ } ++ + modes = il->ctx.interface_modes | il->ctx.exclusive_interface_modes; + if (!(modes & BIT(vif->type))) { + err = -EOPNOTSUPP; +@@ -4605,8 +4616,11 @@ il_mac_add_interface(struct ieee80211_hw + + err = il_setup_interface(il, &il->ctx); + if (err) { +- il->ctx.vif = NULL; +- il->iw_mode = NL80211_IFTYPE_STATION; ++ IL_WARN("Fail to set mode %d\n", vif->type); ++ if (!reset) { ++ il->ctx.vif = NULL; ++ il->iw_mode = NL80211_IFTYPE_STATION; ++ } + } + + out: diff --git a/iwlwifi-do-not-nulify-ctx-vif-on-reset.patch b/iwlwifi-do-not-nulify-ctx-vif-on-reset.patch new file mode 100644 index 000000000..e03f2d304 --- /dev/null +++ b/iwlwifi-do-not-nulify-ctx-vif-on-reset.patch @@ -0,0 +1,66 @@ +ctx->vif is dereferenced in different part of iwlwifi code, so do not +nullify it. + +This should address at least one of the possible reasons of WARNING at +iwlagn_mac_remove_interface, and perhaps some random crashes when +firmware reset is performed. + +Cc: stable@vger.kernel.org +Signed-off-by: Stanislaw Gruszka +--- + drivers/net/wireless/iwlwifi/iwl-agn.c | 3 --- + drivers/net/wireless/iwlwifi/iwl-mac80211.c | 10 +++++++++- + 2 files changed, 9 insertions(+), 4 deletions(-) + +--- linux-3.3.noarch.orig/drivers/net/wireless/iwlwifi/iwl-agn.c ++++ linux-3.3.noarch/drivers/net/wireless/iwlwifi/iwl-agn.c +@@ -1403,7 +1403,6 @@ static void iwl_bg_run_time_calib_work(s + + void iwlagn_prepare_restart(struct iwl_priv *priv) + { +- struct iwl_rxon_context *ctx; + bool bt_full_concurrent; + u8 bt_ci_compliance; + u8 bt_load; +@@ -1412,8 +1411,6 @@ void iwlagn_prepare_restart(struct iwl_p + + lockdep_assert_held(&priv->shrd->mutex); + +- for_each_context(priv, ctx) +- ctx->vif = NULL; + priv->is_open = 0; + + /* +--- linux-3.3.noarch.orig/drivers/net/wireless/iwlwifi/iwl-mac80211.c ++++ linux-3.3.noarch/drivers/net/wireless/iwlwifi/iwl-mac80211.c +@@ -1226,6 +1226,7 @@ static int iwlagn_mac_add_interface(stru + struct iwl_rxon_context *tmp, *ctx = NULL; + int err; + enum nl80211_iftype viftype = ieee80211_vif_type_p2p(vif); ++ bool reset = false; + + IWL_DEBUG_MAC80211(priv, "enter: type %d, addr %pM\n", + viftype, vif->addr); +@@ -1247,6 +1248,13 @@ static int iwlagn_mac_add_interface(stru + tmp->interface_modes | tmp->exclusive_interface_modes; + + if (tmp->vif) { ++ /* On reset we need to add the same interface again */ ++ if (tmp->vif == vif) { ++ reset = true; ++ ctx = tmp; ++ break; ++ } ++ + /* check if this busy context is exclusive */ + if (tmp->exclusive_interface_modes & + BIT(tmp->vif->type)) { +@@ -1273,7 +1281,7 @@ static int iwlagn_mac_add_interface(stru + ctx->vif = vif; + + err = iwl_setup_interface(priv, ctx); +- if (!err) ++ if (!err || reset) + goto out; + + ctx->vif = NULL; diff --git a/kernel.spec b/kernel.spec index f1f4c2255..9ea0ec36a 100644 --- a/kernel.spec +++ b/kernel.spec @@ -785,6 +785,10 @@ Patch21351: x86-add-io_apic_ops-to-allow-interception.patch Patch21352: x86-apic_ops-Replace-apic_ops-with-x86_apic_ops.patch Patch21353: xen-x86-Implement-x86_apic_ops.patch +#rhbz 770476 +Patch21370: iwlegacy-do-not-nulify-il-vif-on-reset.patch +Patch21371: iwlwifi-do-not-nulify-ctx-vif-on-reset.patch + Patch21500: ASPM-Fix-pcie-devs-with-non-pcie-children.patch Patch22000: weird-root-dentry-name-debug.patch @@ -1459,6 +1463,10 @@ ApplyPatch x86-add-io_apic_ops-to-allow-interception.patch ApplyPatch x86-apic_ops-Replace-apic_ops-with-x86_apic_ops.patch ApplyPatch xen-x86-Implement-x86_apic_ops.patch +#rhbz 770476 +ApplyPatch iwlegacy-do-not-nulify-il-vif-on-reset.patch +ApplyPatch iwlwifi-do-not-nulify-ctx-vif-on-reset.patch + #rhbz 803809 CVE-2012-1179 ApplyPatch mm-thp-fix-pmd_bad-triggering.patch @@ -2202,6 +2210,10 @@ fi # and build. %changelog +* Thu Mar 29 2012 Josh Boyer +- iwl{wifi,legacy}: Fix warnings on remove interface from Stanislaw Gruszka + (rhbz 770467) + * Wed Mar 28 2012 Josh Boyer - Fix disabled ASPM regression