Commit 897e1cf2 authored by Reinette Chatre's avatar Reinette Chatre Committed by John W. Linville

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: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 0359facc
...@@ -976,12 +976,12 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id) ...@@ -976,12 +976,12 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
iwl3945_rates[rs_sta->start_rate].plcp); 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); ieee80211_rate_control_unregister(&rs_ops);
} }
......
...@@ -202,7 +202,7 @@ extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id); ...@@ -202,7 +202,7 @@ extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
* ieee80211_register_hw * 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 * iwl3945_rate_control_unregister - Unregister the rate control callbacks
...@@ -210,6 +210,6 @@ extern void iwl3945_rate_control_register(struct ieee80211_hw *hw); ...@@ -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 * This should be called after calling ieee80211_unregister_hw, but before
* the driver is unloaded. * the driver is unloaded.
*/ */
extern void iwl3945_rate_control_unregister(struct ieee80211_hw *hw); extern void iwl3945_rate_control_unregister(void);
#endif #endif
...@@ -2822,12 +2822,12 @@ void iwl4965_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id) ...@@ -2822,12 +2822,12 @@ void iwl4965_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
priv->lq_mngr.lq_ready = 1; 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); ieee80211_rate_control_unregister(&rs_ops);
} }
......
...@@ -288,7 +288,7 @@ extern void iwl4965_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id); ...@@ -288,7 +288,7 @@ extern void iwl4965_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id);
* ieee80211_register_hw * 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 * iwl4965_rate_control_unregister - Unregister the rate control callbacks
...@@ -296,6 +296,6 @@ extern void iwl4965_rate_control_register(struct ieee80211_hw *hw); ...@@ -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 * This should be called after calling ieee80211_unregister_hw, but before
* the driver is unloaded. * the driver is unloaded.
*/ */
extern void iwl4965_rate_control_unregister(struct ieee80211_hw *hw); extern void iwl4965_rate_control_unregister(void);
#endif #endif
...@@ -177,7 +177,6 @@ static int iwl4965_init_drv(struct iwl_priv *priv) ...@@ -177,7 +177,6 @@ static int iwl4965_init_drv(struct iwl_priv *priv)
goto err_free_channel_map; goto err_free_channel_map;
} }
iwl4965_rate_control_register(priv->hw);
ret = ieee80211_register_hw(priv->hw); ret = ieee80211_register_hw(priv->hw);
if (ret) { if (ret) {
IWL_ERROR("Failed to register network device (error %d)\n", 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 ...@@ -8156,7 +8156,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
goto out_free_channel_map; goto out_free_channel_map;
} }
iwl3945_rate_control_register(priv->hw);
err = ieee80211_register_hw(priv->hw); err = ieee80211_register_hw(priv->hw);
if (err) { if (err) {
IWL_ERROR("Failed to register network device (error %d)\n", 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) ...@@ -8241,7 +8240,6 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
if (priv->mac80211_registered) { if (priv->mac80211_registered) {
ieee80211_unregister_hw(priv->hw); ieee80211_unregister_hw(priv->hw);
iwl3945_rate_control_unregister(priv->hw);
} }
/*netif_stop_queue(dev); */ /*netif_stop_queue(dev); */
...@@ -8322,21 +8320,35 @@ static int __init iwl3945_init(void) ...@@ -8322,21 +8320,35 @@ static int __init iwl3945_init(void)
int ret; int ret;
printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n"); printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\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); ret = pci_register_driver(&iwl3945_driver);
if (ret) { if (ret) {
IWL_ERROR("Unable to initialize PCI module\n"); IWL_ERROR("Unable to initialize PCI module\n");
return ret; goto error_register;
} }
#ifdef CONFIG_IWL3945_DEBUG #ifdef CONFIG_IWL3945_DEBUG
ret = driver_create_file(&iwl3945_driver.driver, &driver_attr_debug_level); ret = driver_create_file(&iwl3945_driver.driver, &driver_attr_debug_level);
if (ret) { if (ret) {
IWL_ERROR("Unable to create driver sysfs file\n"); IWL_ERROR("Unable to create driver sysfs file\n");
pci_unregister_driver(&iwl3945_driver); goto error_debug;
return ret;
} }
#endif #endif
return ret; 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) static void __exit iwl3945_exit(void)
...@@ -8345,6 +8357,7 @@ 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); driver_remove_file(&iwl3945_driver.driver, &driver_attr_debug_level);
#endif #endif
pci_unregister_driver(&iwl3945_driver); pci_unregister_driver(&iwl3945_driver);
iwl3945_rate_control_unregister();
} }
module_param_named(antenna, iwl3945_param_antenna, int, 0444); module_param_named(antenna, iwl3945_param_antenna, int, 0444);
......
...@@ -8243,7 +8243,6 @@ static void __devexit iwl4965_pci_remove(struct pci_dev *pdev) ...@@ -8243,7 +8243,6 @@ static void __devexit iwl4965_pci_remove(struct pci_dev *pdev)
if (priv->mac80211_registered) { if (priv->mac80211_registered) {
ieee80211_unregister_hw(priv->hw); ieee80211_unregister_hw(priv->hw);
iwl4965_rate_control_unregister(priv->hw);
} }
/*netif_stop_queue(dev); */ /*netif_stop_queue(dev); */
...@@ -8324,21 +8323,35 @@ static int __init iwl4965_init(void) ...@@ -8324,21 +8323,35 @@ static int __init iwl4965_init(void)
int ret; int ret;
printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n"); printk(KERN_INFO DRV_NAME ": " DRV_DESCRIPTION ", " DRV_VERSION "\n");
printk(KERN_INFO DRV_NAME ": " DRV_COPYRIGHT "\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); ret = pci_register_driver(&iwl4965_driver);
if (ret) { if (ret) {
IWL_ERROR("Unable to initialize PCI module\n"); IWL_ERROR("Unable to initialize PCI module\n");
return ret; goto error_register;
} }
#ifdef CONFIG_IWLWIFI_DEBUG #ifdef CONFIG_IWLWIFI_DEBUG
ret = driver_create_file(&iwl4965_driver.driver, &driver_attr_debug_level); ret = driver_create_file(&iwl4965_driver.driver, &driver_attr_debug_level);
if (ret) { if (ret) {
IWL_ERROR("Unable to create driver sysfs file\n"); IWL_ERROR("Unable to create driver sysfs file\n");
pci_unregister_driver(&iwl4965_driver); goto error_debug;
return ret;
} }
#endif #endif
return ret; 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) static void __exit iwl4965_exit(void)
...@@ -8347,6 +8360,7 @@ 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); driver_remove_file(&iwl4965_driver.driver, &driver_attr_debug_level);
#endif #endif
pci_unregister_driver(&iwl4965_driver); pci_unregister_driver(&iwl4965_driver);
iwl4965_rate_control_unregister();
} }
module_exit(iwl4965_exit); module_exit(iwl4965_exit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment