mac80211_hwsim: refactor radio cleanup
authorJohannes Berg <johannes.berg@intel.com>
Mon, 6 Jan 2014 21:43:11 +0000 (22:43 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 10 Jan 2014 19:12:57 +0000 (20:12 +0100)
Refactor the radio cleanup into a new function to later
allow deleting a single radio from the list.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/mac80211_hwsim.c

index 23fa6ee8eefe78394d1c22f9076768a492c2775b..cca5b3ffb22c108cece311168db4a98d25916410 100644 (file)
@@ -1623,25 +1623,29 @@ static const struct ieee80211_ops mac80211_hwsim_ops = {
 
 static struct ieee80211_ops mac80211_hwsim_mchan_ops;
 
-static void mac80211_hwsim_free(void)
+static void mac80211_hwsim_destroy_radio(struct mac80211_hwsim_data *data)
 {
-       struct list_head tmplist, *i, *tmp;
-       struct mac80211_hwsim_data *data, *tmpdata;
+       debugfs_remove_recursive(data->debugfs);
+       ieee80211_unregister_hw(data->hw);
+       device_release_driver(data->dev);
+       device_unregister(data->dev);
+       ieee80211_free_hw(data->hw);
+}
 
-       INIT_LIST_HEAD(&tmplist);
+static void mac80211_hwsim_free(void)
+{
+       struct mac80211_hwsim_data *data;
 
        spin_lock_bh(&hwsim_radio_lock);
-       list_for_each_safe(i, tmp, &hwsim_radios)
-               list_move(i, &tmplist);
-       spin_unlock_bh(&hwsim_radio_lock);
-
-       list_for_each_entry_safe(data, tmpdata, &tmplist, list) {
-               debugfs_remove_recursive(data->debugfs);
-               ieee80211_unregister_hw(data->hw);
-               device_release_driver(data->dev);
-               device_unregister(data->dev);
-               ieee80211_free_hw(data->hw);
+       while ((data = list_first_entry_or_null(&hwsim_radios,
+                                               struct mac80211_hwsim_data,
+                                               list))) {
+               list_del(&data->list);
+               spin_unlock_bh(&hwsim_radio_lock);
+               mac80211_hwsim_destroy_radio(data);
+               spin_lock_bh(&hwsim_radio_lock);
        }
+       spin_unlock_bh(&hwsim_radio_lock);
        class_destroy(hwsim_class);
 }