mirror of
https://github.com/torvalds/linux.git
synced 2024-12-14 15:13:52 +00:00
iwlegacy: do not nulify il->vif on reset
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 <sgruszka@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
8a78335442
commit
883a649b73
@ -2673,8 +2673,6 @@ il3945_bg_restart(struct work_struct *data)
|
|||||||
|
|
||||||
if (test_and_clear_bit(S_FW_ERROR, &il->status)) {
|
if (test_and_clear_bit(S_FW_ERROR, &il->status)) {
|
||||||
mutex_lock(&il->mutex);
|
mutex_lock(&il->mutex);
|
||||||
/* FIXME: vif can be dereferenced */
|
|
||||||
il->vif = NULL;
|
|
||||||
il->is_open = 0;
|
il->is_open = 0;
|
||||||
mutex_unlock(&il->mutex);
|
mutex_unlock(&il->mutex);
|
||||||
il3945_down(il);
|
il3945_down(il);
|
||||||
|
@ -5651,8 +5651,6 @@ il4965_bg_restart(struct work_struct *data)
|
|||||||
|
|
||||||
if (test_and_clear_bit(S_FW_ERROR, &il->status)) {
|
if (test_and_clear_bit(S_FW_ERROR, &il->status)) {
|
||||||
mutex_lock(&il->mutex);
|
mutex_lock(&il->mutex);
|
||||||
/* FIXME: do we dereference vif without mutex locked ? */
|
|
||||||
il->vif = NULL;
|
|
||||||
il->is_open = 0;
|
il->is_open = 0;
|
||||||
|
|
||||||
__il4965_down(il);
|
__il4965_down(il);
|
||||||
|
@ -4508,6 +4508,7 @@ il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|||||||
{
|
{
|
||||||
struct il_priv *il = hw->priv;
|
struct il_priv *il = hw->priv;
|
||||||
int err;
|
int err;
|
||||||
|
bool reset;
|
||||||
|
|
||||||
mutex_lock(&il->mutex);
|
mutex_lock(&il->mutex);
|
||||||
D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
|
D_MAC80211("enter: type %d, addr %pM\n", vif->type, vif->addr);
|
||||||
@ -4518,7 +4519,12 @@ il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (il->vif) {
|
/*
|
||||||
|
* We do not support multiple virtual interfaces, but on hardware reset
|
||||||
|
* we have to add the same interface again.
|
||||||
|
*/
|
||||||
|
reset = (il->vif == vif);
|
||||||
|
if (il->vif && !reset) {
|
||||||
err = -EOPNOTSUPP;
|
err = -EOPNOTSUPP;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -4528,8 +4534,11 @@ il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|||||||
|
|
||||||
err = il_set_mode(il);
|
err = il_set_mode(il);
|
||||||
if (err) {
|
if (err) {
|
||||||
il->vif = NULL;
|
IL_WARN("Fail to set mode %d\n", vif->type);
|
||||||
il->iw_mode = NL80211_IFTYPE_STATION;
|
if (!reset) {
|
||||||
|
il->vif = NULL;
|
||||||
|
il->iw_mode = NL80211_IFTYPE_STATION;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user