Skip to content

Commit

Permalink
iwlwifi: move rate registration to module load
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Reinette Chatre authored and John W. Linville committed Apr 1, 2008
1 parent 0359fac commit 897e1cf
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 20 deletions.
6 changes: 3 additions & 3 deletions drivers/net/wireless/iwlwifi/iwl-3945-rs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/wireless/iwlwifi/iwl-3945-rs.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,14 +202,14 @@ 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
*
* 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
6 changes: 3 additions & 3 deletions drivers/net/wireless/iwlwifi/iwl-4965-rs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/wireless/iwlwifi/iwl-4965-rs.h
Original file line number Diff line number Diff line change
Expand Up @@ -288,14 +288,14 @@ 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
*
* 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
1 change: 0 additions & 1 deletion drivers/net/wireless/iwlwifi/iwl-4965.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
23 changes: 18 additions & 5 deletions drivers/net/wireless/iwlwifi/iwl3945-base.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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); */
Expand Down Expand Up @@ -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)
Expand All @@ -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);
Expand Down
22 changes: 18 additions & 4 deletions drivers/net/wireless/iwlwifi/iwl4965-base.c
Original file line number Diff line number Diff line change
Expand Up @@ -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); */
Expand Down Expand Up @@ -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)
Expand All @@ -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);
Expand Down

0 comments on commit 897e1cf

Please sign in to comment.