struct mac80211_hwsim_data *data;
                        data = hwsim_radios[i]->priv;
                        ieee80211_unregister_hw(hwsim_radios[i]);
-                       if (!IS_ERR(data->dev))
-                               device_unregister(data->dev);
+                       device_unregister(data->dev);
                        ieee80211_free_hw(hwsim_radios[i]);
                }
        }
                               "mac80211_hwsim: device_create_drvdata "
                               "failed (%ld)\n", PTR_ERR(data->dev));
                        err = -ENOMEM;
-                       goto failed;
+                       goto failed_drvdata;
                }
                data->dev->driver = &mac80211_hwsim_driver;
 
                if (err < 0) {
                        printk(KERN_DEBUG "mac80211_hwsim: "
                               "ieee80211_register_hw failed (%d)\n", err);
-                       goto failed;
+                       goto failed_hw;
                }
 
                printk(KERN_DEBUG "%s: hwaddr %s registered\n",
        rtnl_lock();
 
        err = dev_alloc_name(hwsim_mon, hwsim_mon->name);
-       if (err < 0) {
+       if (err < 0)
                goto failed_mon;
-       }
+
 
        err = register_netdevice(hwsim_mon);
        if (err < 0)
 failed_mon:
        rtnl_unlock();
        free_netdev(hwsim_mon);
+       mac80211_hwsim_free();
+       return err;
 
+failed_hw:
+       device_unregister(data->dev);
+failed_drvdata:
+       ieee80211_free_hw(hw);
+       hwsim_radios[i] = 0;
 failed:
        mac80211_hwsim_free();
        return err;