mac80211: fix HW registration error paths
Station info state is started in allocation, so should be destroyed on free (it's just a timer); rate control must be freed if anything afterwards fails to initialize. LED exit should be later, no need for locking there, but it needs to be done also when rate init failed. Also clean up the code by moving a label so the locking doesn't have to be done separately. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
c1e140bf79
commit
54330bf63b
@ -1041,10 +1041,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
ieee80211_max_network_latency;
|
||||
result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
if (result) {
|
||||
rtnl_lock();
|
||||
if (result)
|
||||
goto fail_pm_qos;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_INET
|
||||
local->ifa_notifier.notifier_call = ieee80211_ifa_changed;
|
||||
@ -1072,15 +1070,15 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
|
||||
fail_ifa:
|
||||
pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
|
||||
&local->network_latency_notifier);
|
||||
rtnl_lock();
|
||||
#endif
|
||||
fail_pm_qos:
|
||||
ieee80211_led_exit(local);
|
||||
rtnl_lock();
|
||||
rate_control_deinitialize(local);
|
||||
ieee80211_remove_interfaces(local);
|
||||
fail_rate:
|
||||
rtnl_unlock();
|
||||
ieee80211_led_exit(local);
|
||||
ieee80211_wep_free(local);
|
||||
sta_info_stop(local);
|
||||
destroy_workqueue(local->workqueue);
|
||||
fail_workqueue:
|
||||
wiphy_unregister(local->hw.wiphy);
|
||||
@ -1176,6 +1174,8 @@ void ieee80211_free_hw(struct ieee80211_hw *hw)
|
||||
|
||||
kfree(rcu_access_pointer(local->tx_latency));
|
||||
|
||||
sta_info_stop(local);
|
||||
|
||||
wiphy_free(local->hw.wiphy);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_free_hw);
|
||||
|
Loading…
Reference in New Issue
Block a user