diff options
| author | Stanislaw Gruszka <sgruszka@redhat.com> | 2012-03-13 16:11:27 +0100 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-04-13 09:13:56 -0700 |
| commit | def81951735b03781b5e775a3f95c8fadf1a9b4b (patch) | |
| tree | c19492d036fef12478ab69534512f2be03cf53d5 /drivers/net | |
| parent | ba0aa95727fe064e8edbb1523829c520994bca95 (diff) | |
iwlegacy: do not nulify il->vif on reset
commit 883a649b737cdbe3ede7e50f3f939fd706ed5c4e upstream.
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.
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/wireless/iwlegacy/3945-mac.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlegacy/4965-mac.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlegacy/common.c | 18 |
3 files changed, 16 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlegacy/3945-mac.c b/drivers/net/wireless/iwlegacy/3945-mac.c index a7dfba8d164e..a2ec36911bd9 100644 --- a/drivers/net/wireless/iwlegacy/3945-mac.c +++ b/drivers/net/wireless/iwlegacy/3945-mac.c @@ -2684,7 +2684,6 @@ il3945_bg_restart(struct work_struct *data) 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); diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c index 1667232af647..b00712ccd9b3 100644 --- a/drivers/net/wireless/iwlegacy/4965-mac.c +++ b/drivers/net/wireless/iwlegacy/4965-mac.c @@ -5381,7 +5381,6 @@ il4965_bg_restart(struct work_struct *data) 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); diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c index 36454d0bbeed..a608bc7ca33a 100644 --- a/drivers/net/wireless/iwlegacy/common.c +++ b/drivers/net/wireless/iwlegacy/common.c @@ -4575,6 +4575,7 @@ il_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 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 *hw, struct ieee80211_vif *vif) 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 *hw, struct ieee80211_vif *vif) 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: |
