ipw2200: fix oops on missing firmware

For non-monitor interfaces, the syntax for alloc_ieee80211/free_80211
is wrong. Because alloc_ieee80211 only creates (wiphy_new) a wiphy, but
free_80211() does wiphy_unregister() also. This is only correct when
the later wiphy_register() is called successfully, which apparently
is not the case for your fw doesn't exist one.

Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by Zhu Yi and committed by John W. Linville e6c5fc53 63ca2d74

+16 -6
+4 -1
drivers/net/wireless/ipw2x00/ipw2100.c
··· 6325 6325 6326 6326 fail: 6327 6327 if (dev) { 6328 - if (registered) 6328 + if (registered) { 6329 + unregister_ieee80211(priv->ieee); 6329 6330 unregister_netdev(dev); 6331 + } 6330 6332 6331 6333 ipw2100_hw_stop_adapter(priv); 6332 6334 ··· 6385 6383 /* Unregister the device first - this results in close() 6386 6384 * being called if the device is open. If we free storage 6387 6385 * first, then close() will crash. */ 6386 + unregister_ieee80211(priv->ieee); 6388 6387 unregister_netdev(dev); 6389 6388 6390 6389 /* ipw2100_down will ensure that there is no more pending work
+2
drivers/net/wireless/ipw2x00/ipw2200.c
··· 11821 11821 if (err) { 11822 11822 IPW_ERROR("Failed to register promiscuous network " 11823 11823 "device (error %d).\n", err); 11824 + unregister_ieee80211(priv->ieee); 11824 11825 unregister_netdev(priv->net_dev); 11825 11826 goto out_remove_sysfs; 11826 11827 } ··· 11872 11871 11873 11872 mutex_unlock(&priv->mutex); 11874 11873 11874 + unregister_ieee80211(priv->ieee); 11875 11875 unregister_netdev(priv->net_dev); 11876 11876 11877 11877 if (priv->rxq) {
+1
drivers/net/wireless/ipw2x00/libipw.h
··· 1020 1020 /* ieee80211.c */ 1021 1021 extern void free_ieee80211(struct net_device *dev, int monitor); 1022 1022 extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); 1023 + extern void unregister_ieee80211(struct libipw_device *ieee); 1023 1024 extern int libipw_change_mtu(struct net_device *dev, int new_mtu); 1024 1025 1025 1026 extern void libipw_networks_age(struct libipw_device *ieee,
+9 -5
drivers/net/wireless/ipw2x00/libipw_module.c
··· 235 235 libipw_networks_free(ieee); 236 236 237 237 /* free cfg80211 resources */ 238 - if (!monitor) { 239 - wiphy_unregister(ieee->wdev.wiphy); 240 - kfree(ieee->a_band.channels); 241 - kfree(ieee->bg_band.channels); 238 + if (!monitor) 242 239 wiphy_free(ieee->wdev.wiphy); 243 - } 244 240 245 241 free_netdev(dev); 242 + } 243 + 244 + void unregister_ieee80211(struct libipw_device *ieee) 245 + { 246 + wiphy_unregister(ieee->wdev.wiphy); 247 + kfree(ieee->a_band.channels); 248 + kfree(ieee->bg_band.channels); 246 249 } 247 250 248 251 #ifdef CONFIG_LIBIPW_DEBUG ··· 333 330 334 331 EXPORT_SYMBOL(alloc_ieee80211); 335 332 EXPORT_SYMBOL(free_ieee80211); 333 + EXPORT_SYMBOL(unregister_ieee80211);