forked from Minki/linux
iwlwifi: move rate registration to module load
Having rate registration during module load enables the use of error checking as well as reliable registration/unregistration pairing. Previously this was not possible as rate registration was done during _probe where _probe could be run for more than one device on the system. Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
0359facc7b
commit
897e1cf29e
@ -976,12 +976,12 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
|
||||
iwl3945_rates[rs_sta->start_rate].plcp);
|
||||
}
|
||||
|
||||
void iwl3945_rate_control_register(struct ieee80211_hw *hw)
|
||||
int iwl3945_rate_control_register(void)
|
||||
{
|
||||
ieee80211_rate_control_register(&rs_ops);
|
||||
return ieee80211_rate_control_register(&rs_ops);
|
||||
}
|
||||
|
||||
void iwl3945_rate_control_unregister(struct ieee80211_hw *hw)
|
||||
void iwl3945_rate_control_unregister(void)
|
||||
{
|
||||
ieee80211_rate_control_unregister(&rs_ops);
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
|
||||
* ieee80211_register_hw
|
||||
*
|
||||
*/
|
||||
extern void iwl3945_rate_control_register(struct ieee80211_hw *hw);
|
||||
extern int iwl3945_rate_control_register(void);
|
||||
|
||||
/**
|
||||
* iwl3945_rate_control_unregister - Unregister the rate control callbacks
|
||||
@ -210,6 +210,6 @@ extern void iwl3945_rate_control_register(struct ieee80211_hw *hw);
|
||||
* This should be called after calling ieee80211_unregister_hw, but before
|
||||
* the driver is unloaded.
|
||||
*/
|
||||
extern void iwl3945_rate_control_unregister(struct ieee80211_hw *hw);
|
||||
extern void iwl3945_rate_control_unregister(void);
|
||||
|
||||
#endif
|
||||
|
@ -2822,12 +2822,12 @@ void iwl4965_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
|
||||
priv->lq_mngr.lq_ready = 1;
|
||||
}
|
||||
|
||||
void iwl4965_rate_control_register(struct ieee80211_hw *hw)
|
||||
int iwl4965_rate_control_register(void)
|
||||
{
|
||||
ieee80211_rate_control_register(&rs_ops);
|
||||
return ieee80211_rate_control_register(&rs_ops);
|
||||
}
|
||||
|
||||
void iwl4965_rate_control_unregister(struct ieee80211_hw *hw)
|
||||
void iwl4965_rate_control_unregister(void)
|
||||
{
|
||||
ieee80211_rate_control_unregister(&rs_ops);
|
||||
}
|
||||
|
@ -288,7 +288,7 @@ extern void iwl4965_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
|
||||
* ieee80211_register_hw
|
||||
*
|
||||
*/
|
||||
extern void iwl4965_rate_control_register(struct ieee80211_hw *hw);
|
||||
extern int iwl4965_rate_control_register(void);
|
||||
|
||||
/**
|
||||
* iwl4965_rate_control_unregister - Unregister the rate control callbacks
|
||||
@ -296,6 +296,6 @@ extern void iwl4965_rate_control_register(struct ieee80211_hw *hw);
|
||||
* This should be called after calling ieee80211_unregister_hw, but before
|
||||
* the driver is unloaded.
|
||||
*/
|
||||
extern void iwl4965_rate_control_unregister(struct ieee80211_hw *hw);
|
||||
extern void iwl4965_rate_control_unregister(void);
|
||||
|
||||
#endif
|
||||
|
@ -177,7 +177,6 @@ static int iwl4965_init_drv(struct iwl_priv *priv)
|
||||
goto err_free_channel_map;
|
||||
}
|
||||
|
||||
iwl4965_rate_control_register(priv->hw);
|
||||
ret = ieee80211_register_hw(priv->hw);
|
||||
if (ret) {
|
||||
IWL_ERROR("Failed to register network device (error %d)\n",
|
||||
|
@ -8156,7 +8156,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
||||
goto out_free_channel_map;
|
||||
}
|
||||
|
||||
iwl3945_rate_control_register(priv->hw);
|
||||
err = ieee80211_register_hw(priv->hw);
|
||||
if (err) {
|
||||
IWL_ERROR("Failed to register network device (error %d)\n", err);
|
||||
@ -8241,7 +8240,6 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
|
||||
|
||||
if (priv->mac80211_registered) {
|
||||
ieee80211_unregister_hw(priv->hw);
|
||||
iwl3945_rate_control_unregister(priv->hw);
|
||||
}
|
||||
|
||||
/*netif_stop_queue(dev); */
|
||||
@ -8322,21 +8320,35 @@ static int __init iwl3945_init(void)
|
||||
int ret;
|
||||
printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
|
||||
printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n");
|
||||
|
||||
ret = iwl3945_rate_control_register();
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to register rate control algorithm: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = pci_register_driver(&iwl3945_driver);
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to initialize PCI module\n");
|
||||
return ret;
|
||||
goto error_register;
|
||||
}
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
ret = driver_create_file(&iwl3945_driver.driver, &driver_attr_debug_level);
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to create driver sysfs file\n");
|
||||
pci_unregister_driver(&iwl3945_driver);
|
||||
return ret;
|
||||
goto error_debug;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
|
||||
#ifdef CONFIG_IWL3945_DEBUG
|
||||
error_debug:
|
||||
pci_unregister_driver(&iwl3945_driver);
|
||||
#endif
|
||||
error_register:
|
||||
iwl3945_rate_control_unregister();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit iwl3945_exit(void)
|
||||
@ -8345,6 +8357,7 @@ static void __exit iwl3945_exit(void)
|
||||
driver_remove_file(&iwl3945_driver.driver, &driver_attr_debug_level);
|
||||
#endif
|
||||
pci_unregister_driver(&iwl3945_driver);
|
||||
iwl3945_rate_control_unregister();
|
||||
}
|
||||
|
||||
module_param_named(antenna, iwl3945_param_antenna, int, 0444);
|
||||
|
@ -8243,7 +8243,6 @@ static void __devexit iwl4965_pci_remove(struct pci_dev *pdev)
|
||||
|
||||
if (priv->mac80211_registered) {
|
||||
ieee80211_unregister_hw(priv->hw);
|
||||
iwl4965_rate_control_unregister(priv->hw);
|
||||
}
|
||||
|
||||
/*netif_stop_queue(dev); */
|
||||
@ -8324,21 +8323,35 @@ static int __init iwl4965_init(void)
|
||||
int ret;
|
||||
printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
|
||||
printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\n");
|
||||
|
||||
ret = iwl4965_rate_control_register();
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to register rate control algorithm: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = pci_register_driver(&iwl4965_driver);
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to initialize PCI module\n");
|
||||
return ret;
|
||||
goto error_register;
|
||||
}
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
ret = driver_create_file(&iwl4965_driver.driver, &driver_attr_debug_level);
|
||||
if (ret) {
|
||||
IWL_ERROR("Unable to create driver sysfs file\n");
|
||||
pci_unregister_driver(&iwl4965_driver);
|
||||
return ret;
|
||||
goto error_debug;
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
error_debug:
|
||||
pci_unregister_driver(&iwl4965_driver);
|
||||
#endif
|
||||
error_register:
|
||||
iwl4965_rate_control_unregister();
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit iwl4965_exit(void)
|
||||
@ -8347,6 +8360,7 @@ static void __exit iwl4965_exit(void)
|
||||
driver_remove_file(&iwl4965_driver.driver, &driver_attr_debug_level);
|
||||
#endif
|
||||
pci_unregister_driver(&iwl4965_driver);
|
||||
iwl4965_rate_control_unregister();
|
||||
}
|
||||
|
||||
module_exit(iwl4965_exit);
|
||||
|
Loading…
Reference in New Issue
Block a user