Commit cee53ddb authored by Kolekar, Abhijeet's avatar Kolekar, Abhijeet Committed by John W. Linville

iwl3945 : Simplify iwl3945_pci_probe

Patch aligns iwl3945_pci_probe with iwlwifi's iwl_pci_probe.
Added few comments and code simplified to make readable.
Signed-off-by: default avatarAbhijeet Kolekar <abhijeet.kolekar@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 0e3de998
...@@ -7787,6 +7787,10 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7787,6 +7787,10 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
struct iwl_3945_cfg *cfg = (struct iwl_3945_cfg *)(ent->driver_data); struct iwl_3945_cfg *cfg = (struct iwl_3945_cfg *)(ent->driver_data);
unsigned long flags; unsigned long flags;
/***********************
* 1. Allocating HW data
* ********************/
/* Disabling hardware scan means that mac80211 will perform scans /* Disabling hardware scan means that mac80211 will perform scans
* "the hard way", rather than using device's scan. */ * "the hard way", rather than using device's scan. */
if (iwl3945_param_disable_hw_scan) { if (iwl3945_param_disable_hw_scan) {
...@@ -7810,27 +7814,24 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7810,27 +7814,24 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
err = -ENOMEM; err = -ENOMEM;
goto out; goto out;
} }
SET_IEEE80211_DEV(hw, &pdev->dev);
hw->rate_control_algorithm = "iwl-3945-rs"; SET_IEEE80211_DEV(hw, &pdev->dev);
hw->sta_data_size = sizeof(struct iwl3945_sta_priv);
IWL_DEBUG_INFO("*** LOAD DRIVER ***\n");
priv = hw->priv; priv = hw->priv;
priv->hw = hw; priv->hw = hw;
priv->pci_dev = pdev; priv->pci_dev = pdev;
priv->cfg = cfg; priv->cfg = cfg;
IWL_DEBUG_INFO("*** LOAD DRIVER ***\n");
hw->rate_control_algorithm = "iwl-3945-rs";
hw->sta_data_size = sizeof(struct iwl3945_sta_priv);
/* Select antenna (may be helpful if only one antenna is connected) */ /* Select antenna (may be helpful if only one antenna is connected) */
priv->antenna = (enum iwl3945_antenna)iwl3945_param_antenna; priv->antenna = (enum iwl3945_antenna)iwl3945_param_antenna;
#ifdef CONFIG_IWL3945_DEBUG #ifdef CONFIG_IWL3945_DEBUG
iwl3945_debug_level = iwl3945_param_debug; iwl3945_debug_level = iwl3945_param_debug;
atomic_set(&priv->restrict_refcnt, 0); atomic_set(&priv->restrict_refcnt, 0);
#endif #endif
priv->retry_rate = 1;
priv->ibss_beacon = NULL;
/* Tell mac80211 our characteristics */ /* Tell mac80211 our characteristics */
hw->flags = IEEE80211_HW_SIGNAL_DBM | hw->flags = IEEE80211_HW_SIGNAL_DBM |
...@@ -7844,14 +7845,9 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7844,14 +7845,9 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
/* 4 EDCA QOS priorities */ /* 4 EDCA QOS priorities */
hw->queues = 4; hw->queues = 4;
spin_lock_init(&priv->lock); /***************************
spin_lock_init(&priv->power_data.lock); * 2. Initializing PCI bus
spin_lock_init(&priv->sta_lock); * *************************/
spin_lock_init(&priv->hcmd_lock);
INIT_LIST_HEAD(&priv->free_frames);
mutex_init(&priv->mutex);
if (pci_enable_device(pdev)) { if (pci_enable_device(pdev)) {
err = -ENODEV; err = -ENODEV;
goto out_ieee80211_free_hw; goto out_ieee80211_free_hw;
...@@ -7859,14 +7855,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7859,14 +7855,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
pci_set_master(pdev); pci_set_master(pdev);
/* Clear the driver's (not device's) station table */
iwl3945_clear_stations_table(priv);
priv->data_retry_limit = -1;
priv->ieee_channels = NULL;
priv->ieee_rates = NULL;
priv->band = IEEE80211_BAND_2GHZ;
err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
if (!err) if (!err)
err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
...@@ -7880,10 +7868,9 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7880,10 +7868,9 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
if (err) if (err)
goto out_pci_disable_device; goto out_pci_disable_device;
/* We disable the RETRY_TIMEOUT register (0x41) to keep /***********************
* PCI Tx retries from interfering with C3 CPU state */ * 3. Read REV Register
pci_write_config_byte(pdev, 0x41, 0x00); * ********************/
priv->hw_base = pci_iomap(pdev, 0, 0); priv->hw_base = pci_iomap(pdev, 0, 0);
if (!priv->hw_base) { if (!priv->hw_base) {
err = -ENODEV; err = -ENODEV;
...@@ -7894,25 +7881,70 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7894,25 +7881,70 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
(unsigned long long) pci_resource_len(pdev, 0)); (unsigned long long) pci_resource_len(pdev, 0));
IWL_DEBUG_INFO("pci_resource_base = %p\n", priv->hw_base); IWL_DEBUG_INFO("pci_resource_base = %p\n", priv->hw_base);
/* Initialize module parameter values here */ /* We disable the RETRY_TIMEOUT register (0x41) to keep
* PCI Tx retries from interfering with C3 CPU state */
pci_write_config_byte(pdev, 0x41, 0x00);
/* Disable radio (SW RF KILL) via parameter when loading driver */ /* nic init */
if (iwl3945_param_disable) { iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS,
set_bit(STATUS_RF_KILL_SW, &priv->status); CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
IWL_DEBUG_INFO("Radio disabled.\n");
}
priv->iw_mode = NL80211_IFTYPE_STATION; iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
err = iwl3945_poll_bit(priv, CSR_GP_CNTRL,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);
if (err < 0) {
IWL_DEBUG_INFO("Failed to init the card\n");
goto out_remove_sysfs;
}
printk(KERN_INFO DRV_NAME /***********************
": Detected Intel Wireless WiFi Link %s\n", priv->cfg->name); * 4. Read EEPROM
* ********************/
/* Read the EEPROM */
err = iwl3945_eeprom_init(priv);
if (err) {
IWL_ERROR("Unable to init EEPROM\n");
goto out_remove_sysfs;
}
/* MAC Address location in EEPROM same for 3945/4965 */
get_eeprom_mac(priv, priv->mac_addr);
IWL_DEBUG_INFO("MAC address: %pM\n", priv->mac_addr);
SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr);
/***********************
* 5. Setup HW Constants
* ********************/
/* Device-specific setup */ /* Device-specific setup */
if (iwl3945_hw_set_hw_setting(priv)) { if (iwl3945_hw_set_hw_setting(priv)) {
IWL_ERROR("failed to set hw settings\n"); IWL_ERROR("failed to set hw settings\n");
goto out_iounmap; goto out_iounmap;
} }
/***********************
* 6. Setup priv
* ********************/
priv->retry_rate = 1;
priv->ibss_beacon = NULL;
spin_lock_init(&priv->lock);
spin_lock_init(&priv->power_data.lock);
spin_lock_init(&priv->sta_lock);
spin_lock_init(&priv->hcmd_lock);
INIT_LIST_HEAD(&priv->free_frames);
mutex_init(&priv->mutex);
/* Clear the driver's (not device's) station table */
iwl3945_clear_stations_table(priv);
priv->data_retry_limit = -1;
priv->ieee_channels = NULL;
priv->ieee_rates = NULL;
priv->band = IEEE80211_BAND_2GHZ;
priv->iw_mode = NL80211_IFTYPE_STATION;
if (iwl3945_param_qos_enable) if (iwl3945_param_qos_enable)
priv->qos_data.qos_enable = 1; priv->qos_data.qos_enable = 1;
...@@ -7921,70 +7953,76 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7921,70 +7953,76 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
priv->qos_data.qos_active = 0; priv->qos_data.qos_active = 0;
priv->qos_data.qos_cap.val = 0; priv->qos_data.qos_cap.val = 0;
iwl3945_set_rxon_channel(priv, IEEE80211_BAND_2GHZ, 6);
iwl3945_setup_deferred_work(priv);
iwl3945_setup_rx_handlers(priv);
priv->rates_mask = IWL_RATES_MASK; priv->rates_mask = IWL_RATES_MASK;
/* If power management is turned on, default to AC mode */ /* If power management is turned on, default to AC mode */
priv->power_mode = IWL_POWER_AC; priv->power_mode = IWL_POWER_AC;
priv->user_txpower_limit = IWL_DEFAULT_TX_POWER; priv->user_txpower_limit = IWL_DEFAULT_TX_POWER;
spin_lock_irqsave(&priv->lock, flags); err = iwl3945_init_channel_map(priv);
iwl3945_disable_interrupts(priv);
spin_unlock_irqrestore(&priv->lock, flags);
err = sysfs_create_group(&pdev->dev.kobj, &iwl3945_attribute_group);
if (err) { if (err) {
IWL_ERROR("failed to create sysfs device attributes\n"); IWL_ERROR("initializing regulatory failed: %d\n", err);
goto out_release_irq; goto out_release_irq;
} }
/* nic init */ err = iwl3945_init_geos(priv);
iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS,
CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER);
iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
err = iwl3945_poll_bit(priv, CSR_GP_CNTRL,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000);
if (err < 0) {
IWL_DEBUG_INFO("Failed to init the card\n");
goto out_remove_sysfs;
}
/* Read the EEPROM */
err = iwl3945_eeprom_init(priv);
if (err) { if (err) {
IWL_ERROR("Unable to init EEPROM\n"); IWL_ERROR("initializing geos failed: %d\n", err);
goto out_remove_sysfs; goto out_free_channel_map;
} }
/* MAC Address location in EEPROM same for 3945/4965 */
get_eeprom_mac(priv, priv->mac_addr);
IWL_DEBUG_INFO("MAC address: %pM\n", priv->mac_addr);
SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr);
err = iwl3945_init_channel_map(priv); printk(KERN_INFO DRV_NAME
if (err) { ": Detected Intel Wireless WiFi Link %s\n", priv->cfg->name);
IWL_ERROR("initializing regulatory failed: %d\n", err);
goto out_remove_sysfs; /***********************************
* 7. Initialize Module Parameters
* **********************************/
/* Initialize module parameter values here */
/* Disable radio (SW RF KILL) via parameter when loading driver */
if (iwl3945_param_disable) {
set_bit(STATUS_RF_KILL_SW, &priv->status);
IWL_DEBUG_INFO("Radio disabled.\n");
} }
err = iwl3945_init_geos(priv);
/***********************
* 8. Setup Services
* ********************/
spin_lock_irqsave(&priv->lock, flags);
iwl3945_disable_interrupts(priv);
spin_unlock_irqrestore(&priv->lock, flags);
err = sysfs_create_group(&pdev->dev.kobj, &iwl3945_attribute_group);
if (err) { if (err) {
IWL_ERROR("initializing geos failed: %d\n", err); IWL_ERROR("failed to create sysfs device attributes\n");
goto out_free_channel_map; goto out_free_geos;
} }
iwl3945_set_rxon_channel(priv, IEEE80211_BAND_2GHZ, 6);
iwl3945_setup_deferred_work(priv);
iwl3945_setup_rx_handlers(priv);
/***********************
* 9. Conclude
* ********************/
pci_save_state(pdev);
pci_disable_device(pdev);
/*********************************
* 10. Setup and Register mac80211
* *******************************/
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);
goto out_free_geos; goto out_remove_sysfs;
} }
priv->hw->conf.beacon_int = 100; priv->hw->conf.beacon_int = 100;
priv->mac80211_registered = 1; priv->mac80211_registered = 1;
pci_save_state(pdev);
pci_disable_device(pdev);
err = iwl3945_rfkill_init(priv); err = iwl3945_rfkill_init(priv);
if (err) if (err)
...@@ -7993,12 +8031,13 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -7993,12 +8031,13 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
return 0; return 0;
out_remove_sysfs:
sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
out_free_geos: out_free_geos:
iwl3945_free_geos(priv); iwl3945_free_geos(priv);
out_free_channel_map: out_free_channel_map:
iwl3945_free_channel_map(priv); iwl3945_free_channel_map(priv);
out_remove_sysfs:
sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
out_release_irq: out_release_irq:
destroy_workqueue(priv->workqueue); destroy_workqueue(priv->workqueue);
......
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