iwlwifi: mvm: add some missing cleanups in iwl_mvm_mac_add_interface
authorEliad Peller <eliad@wizery.com>
Tue, 16 Jul 2013 14:50:17 +0000 (17:50 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 6 Aug 2013 08:34:52 +0000 (10:34 +0200)
iwl_mvm_mac_add_interface() didn't clean up beacon filtering
configuration and ctxt allocation in some error cases.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Reviewed-by: Alexander Bondar <alexander.bondar@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/iwlwifi/mvm/mac80211.c

index deebe8f..05daa90 100644 (file)
@@ -564,6 +564,10 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
        iwl_mvm_power_update_mode(mvm, vif);
 
        /* beacon filtering */
+       ret = iwl_mvm_disable_beacon_filter(mvm, vif);
+       if (ret)
+               goto out_remove_mac;
+
        if (!mvm->bf_allowed_vif &&
            vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
            mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BF_UPDATED){
@@ -571,10 +575,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
                vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
        }
 
-       ret = iwl_mvm_disable_beacon_filter(mvm, vif);
-       if (ret)
-               goto out_release;
-
        /*
         * P2P_DEVICE interface does not have a channel context assigned to it,
         * so a dedicated PHY context is allocated to it and the corresponding
@@ -585,7 +585,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
                mvmvif->phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
                if (!mvmvif->phy_ctxt) {
                        ret = -ENOSPC;
-                       goto out_remove_mac;
+                       goto out_free_bf;
                }
 
                iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
@@ -609,6 +609,11 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
        iwl_mvm_binding_remove_vif(mvm, vif);
  out_unref_phy:
        iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
+ out_free_bf:
+       if (mvm->bf_allowed_vif == mvmvif) {
+               mvm->bf_allowed_vif = NULL;
+               vif->driver_flags &= ~IEEE80211_VIF_BEACON_FILTER;
+       }
  out_remove_mac:
        mvmvif->phy_ctxt = NULL;
        iwl_mvm_mac_ctxt_remove(mvm, vif);