diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 183 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 187 |
4 files changed, 217 insertions, 166 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 77e7202c026b..0779a23729e5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -1004,14 +1004,6 @@ int iwl3945_hw_nic_init(struct iwl3945_priv *priv) | |||
1004 | CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MM); | 1004 | CSR_HW_IF_CONFIG_REG_BIT_ALMAGOR_MM); |
1005 | } | 1005 | } |
1006 | 1006 | ||
1007 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1008 | |||
1009 | /* Initialize the EEPROM */ | ||
1010 | rc = iwl3945_eeprom_init(priv); | ||
1011 | if (rc) | ||
1012 | return rc; | ||
1013 | |||
1014 | spin_lock_irqsave(&priv->lock, flags); | ||
1015 | if (EEPROM_SKU_CAP_OP_MODE_MRC == priv->eeprom.sku_cap) { | 1007 | if (EEPROM_SKU_CAP_OP_MODE_MRC == priv->eeprom.sku_cap) { |
1016 | IWL_DEBUG_INFO("SKU OP mode is mrc\n"); | 1008 | IWL_DEBUG_INFO("SKU OP mode is mrc\n"); |
1017 | iwl3945_set_bit(priv, CSR_HW_IF_CONFIG_REG, | 1009 | iwl3945_set_bit(priv, CSR_HW_IF_CONFIG_REG, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index e6a0397266fc..5fcc2a6f5bf4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -506,11 +506,6 @@ int iwl4965_hw_nic_init(struct iwl4965_priv *priv) | |||
506 | 506 | ||
507 | spin_unlock_irqrestore(&priv->lock, flags); | 507 | spin_unlock_irqrestore(&priv->lock, flags); |
508 | 508 | ||
509 | /* Read the EEPROM */ | ||
510 | rc = iwl4965_eeprom_init(priv); | ||
511 | if (rc) | ||
512 | return rc; | ||
513 | |||
514 | if (priv->eeprom.calib_version < EEPROM_TX_POWER_VERSION_NEW) { | 509 | if (priv->eeprom.calib_version < EEPROM_TX_POWER_VERSION_NEW) { |
515 | IWL_ERROR("Older EEPROM detected! Aborting.\n"); | 510 | IWL_ERROR("Older EEPROM detected! Aborting.\n"); |
516 | return -EINVAL; | 511 | return -EINVAL; |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 1830e13d5cfd..e0e9bbdf140f 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -6179,31 +6179,12 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv) | |||
6179 | } | 6179 | } |
6180 | 6180 | ||
6181 | iwl3945_init_geos(priv); | 6181 | iwl3945_init_geos(priv); |
6182 | iwl3945_reset_channel_flag(priv); | ||
6182 | 6183 | ||
6183 | if (iwl3945_is_rfkill(priv)) | 6184 | if (iwl3945_is_rfkill(priv)) |
6184 | return; | 6185 | return; |
6185 | 6186 | ||
6186 | if (!priv->mac80211_registered) { | 6187 | ieee80211_start_queues(priv->hw); |
6187 | /* Unlock so any user space entry points can call back into | ||
6188 | * the driver without a deadlock... */ | ||
6189 | mutex_unlock(&priv->mutex); | ||
6190 | iwl3945_rate_control_register(priv->hw); | ||
6191 | rc = ieee80211_register_hw(priv->hw); | ||
6192 | priv->hw->conf.beacon_int = 100; | ||
6193 | mutex_lock(&priv->mutex); | ||
6194 | |||
6195 | if (rc) { | ||
6196 | iwl3945_rate_control_unregister(priv->hw); | ||
6197 | IWL_ERROR("Failed to register network " | ||
6198 | "device (error %d)\n", rc); | ||
6199 | return; | ||
6200 | } | ||
6201 | |||
6202 | priv->mac80211_registered = 1; | ||
6203 | |||
6204 | iwl3945_reset_channel_flag(priv); | ||
6205 | } else | ||
6206 | ieee80211_start_queues(priv->hw); | ||
6207 | 6188 | ||
6208 | priv->active_rate = priv->rates_mask; | 6189 | priv->active_rate = priv->rates_mask; |
6209 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; | 6190 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; |
@@ -6236,6 +6217,7 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv) | |||
6236 | iwl3945_reg_txpower_periodic(priv); | 6217 | iwl3945_reg_txpower_periodic(priv); |
6237 | 6218 | ||
6238 | IWL_DEBUG_INFO("ALIVE processing complete.\n"); | 6219 | IWL_DEBUG_INFO("ALIVE processing complete.\n"); |
6220 | wake_up_interruptible(&priv->wait_command_queue); | ||
6239 | 6221 | ||
6240 | if (priv->error_recovering) | 6222 | if (priv->error_recovering) |
6241 | iwl3945_error_recovery(priv); | 6223 | iwl3945_error_recovery(priv); |
@@ -6348,7 +6330,6 @@ static void iwl3945_down(struct iwl3945_priv *priv) | |||
6348 | 6330 | ||
6349 | static int __iwl3945_up(struct iwl3945_priv *priv) | 6331 | static int __iwl3945_up(struct iwl3945_priv *priv) |
6350 | { | 6332 | { |
6351 | DECLARE_MAC_BUF(mac); | ||
6352 | int rc, i; | 6333 | int rc, i; |
6353 | 6334 | ||
6354 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { | 6335 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { |
@@ -6392,7 +6373,7 @@ static int __iwl3945_up(struct iwl3945_priv *priv) | |||
6392 | * This will be used to initialize the on-board processor's | 6373 | * This will be used to initialize the on-board processor's |
6393 | * data SRAM for a clean start when the runtime program first loads. */ | 6374 | * data SRAM for a clean start when the runtime program first loads. */ |
6394 | memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr, | 6375 | memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr, |
6395 | priv->ucode_data.len); | 6376 | priv->ucode_data.len); |
6396 | 6377 | ||
6397 | for (i = 0; i < MAX_HW_RESTARTS; i++) { | 6378 | for (i = 0; i < MAX_HW_RESTARTS; i++) { |
6398 | 6379 | ||
@@ -6411,13 +6392,6 @@ static int __iwl3945_up(struct iwl3945_priv *priv) | |||
6411 | /* start card; "initialize" will load runtime ucode */ | 6392 | /* start card; "initialize" will load runtime ucode */ |
6412 | iwl3945_nic_start(priv); | 6393 | iwl3945_nic_start(priv); |
6413 | 6394 | ||
6414 | /* MAC Address location in EEPROM is same for 3945/4965 */ | ||
6415 | get_eeprom_mac(priv, priv->mac_addr); | ||
6416 | IWL_DEBUG_INFO("MAC address: %s\n", | ||
6417 | print_mac(mac, priv->mac_addr)); | ||
6418 | |||
6419 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); | ||
6420 | |||
6421 | IWL_DEBUG_INFO(DRV_NAME " is coming up\n"); | 6395 | IWL_DEBUG_INFO(DRV_NAME " is coming up\n"); |
6422 | 6396 | ||
6423 | return 0; | 6397 | return 0; |
@@ -6906,23 +6880,73 @@ static void iwl3945_bg_scan_completed(struct work_struct *work) | |||
6906 | * | 6880 | * |
6907 | *****************************************************************************/ | 6881 | *****************************************************************************/ |
6908 | 6882 | ||
6883 | #define UCODE_READY_TIMEOUT (2 * HZ) | ||
6884 | |||
6909 | static int iwl3945_mac_start(struct ieee80211_hw *hw) | 6885 | static int iwl3945_mac_start(struct ieee80211_hw *hw) |
6910 | { | 6886 | { |
6911 | struct iwl3945_priv *priv = hw->priv; | 6887 | struct iwl3945_priv *priv = hw->priv; |
6888 | int ret; | ||
6912 | 6889 | ||
6913 | IWL_DEBUG_MAC80211("enter\n"); | 6890 | IWL_DEBUG_MAC80211("enter\n"); |
6914 | 6891 | ||
6892 | if (pci_enable_device(priv->pci_dev)) { | ||
6893 | IWL_ERROR("Fail to pci_enable_device\n"); | ||
6894 | return -ENODEV; | ||
6895 | } | ||
6896 | pci_restore_state(priv->pci_dev); | ||
6897 | pci_enable_msi(priv->pci_dev); | ||
6898 | |||
6899 | ret = request_irq(priv->pci_dev->irq, iwl3945_isr, IRQF_SHARED, | ||
6900 | DRV_NAME, priv); | ||
6901 | if (ret) { | ||
6902 | IWL_ERROR("Error allocating IRQ %d\n", priv->pci_dev->irq); | ||
6903 | goto out_disable_msi; | ||
6904 | } | ||
6905 | |||
6915 | /* we should be verifying the device is ready to be opened */ | 6906 | /* we should be verifying the device is ready to be opened */ |
6916 | mutex_lock(&priv->mutex); | 6907 | mutex_lock(&priv->mutex); |
6917 | 6908 | ||
6918 | priv->is_open = 1; | 6909 | memset(&priv->staging_rxon, 0, sizeof(struct iwl3945_rxon_cmd)); |
6910 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... | ||
6911 | * ucode filename and max sizes are card-specific. */ | ||
6919 | 6912 | ||
6920 | if (!iwl3945_is_rfkill(priv)) | 6913 | if (!priv->ucode_code.len) { |
6921 | ieee80211_start_queues(priv->hw); | 6914 | ret = iwl3945_read_ucode(priv); |
6915 | if (ret) { | ||
6916 | IWL_ERROR("Could not read microcode: %d\n", ret); | ||
6917 | mutex_unlock(&priv->mutex); | ||
6918 | goto out_release_irq; | ||
6919 | } | ||
6920 | } | ||
6922 | 6921 | ||
6922 | IWL_DEBUG_INFO("Start UP work.\n"); | ||
6923 | __iwl3945_up(priv); | ||
6924 | |||
6925 | priv->is_open = 1; | ||
6923 | mutex_unlock(&priv->mutex); | 6926 | mutex_unlock(&priv->mutex); |
6927 | |||
6928 | /* Wait for START_ALIVE from ucode. Otherwise callbacks from | ||
6929 | * mac80211 will not be run successfully. */ | ||
6930 | ret = wait_event_interruptible_timeout(priv->wait_command_queue, | ||
6931 | test_bit(STATUS_READY, &priv->status), | ||
6932 | UCODE_READY_TIMEOUT); | ||
6933 | if (!ret) { | ||
6934 | if (!test_bit(STATUS_READY, &priv->status)) { | ||
6935 | IWL_ERROR("Wait for START_ALIVE timeout after %dms.\n", | ||
6936 | jiffies_to_msecs(UCODE_READY_TIMEOUT)); | ||
6937 | ret = -ETIMEDOUT; | ||
6938 | goto out_release_irq; | ||
6939 | } | ||
6940 | } | ||
6941 | |||
6924 | IWL_DEBUG_MAC80211("leave\n"); | 6942 | IWL_DEBUG_MAC80211("leave\n"); |
6925 | return 0; | 6943 | return 0; |
6944 | |||
6945 | out_release_irq: | ||
6946 | free_irq(priv->pci_dev->irq, priv); | ||
6947 | out_disable_msi: | ||
6948 | pci_disable_msi(priv->pci_dev); | ||
6949 | return ret; | ||
6926 | } | 6950 | } |
6927 | 6951 | ||
6928 | static void iwl3945_mac_stop(struct ieee80211_hw *hw) | 6952 | static void iwl3945_mac_stop(struct ieee80211_hw *hw) |
@@ -6931,23 +6955,25 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw) | |||
6931 | 6955 | ||
6932 | IWL_DEBUG_MAC80211("enter\n"); | 6956 | IWL_DEBUG_MAC80211("enter\n"); |
6933 | 6957 | ||
6934 | |||
6935 | mutex_lock(&priv->mutex); | ||
6936 | /* stop mac, cancel any scan request and clear | 6958 | /* stop mac, cancel any scan request and clear |
6937 | * RXON_FILTER_ASSOC_MSK BIT | 6959 | * RXON_FILTER_ASSOC_MSK BIT |
6938 | */ | 6960 | */ |
6939 | priv->is_open = 0; | 6961 | priv->is_open = 0; |
6940 | if (!iwl3945_is_ready_rf(priv)) { | 6962 | |
6941 | IWL_DEBUG_MAC80211("leave - RF not ready\n"); | 6963 | if (iwl3945_is_ready_rf(priv)) { |
6964 | mutex_lock(&priv->mutex); | ||
6965 | iwl3945_scan_cancel_timeout(priv, 100); | ||
6966 | cancel_delayed_work(&priv->post_associate); | ||
6942 | mutex_unlock(&priv->mutex); | 6967 | mutex_unlock(&priv->mutex); |
6943 | return; | ||
6944 | } | 6968 | } |
6945 | 6969 | ||
6946 | iwl3945_scan_cancel_timeout(priv, 100); | 6970 | iwl3945_down(priv); |
6947 | cancel_delayed_work(&priv->post_associate); | 6971 | |
6948 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 6972 | flush_workqueue(priv->workqueue); |
6949 | iwl3945_commit_rxon(priv); | 6973 | free_irq(priv->pci_dev->irq, priv); |
6950 | mutex_unlock(&priv->mutex); | 6974 | pci_disable_msi(priv->pci_dev); |
6975 | pci_save_state(priv->pci_dev); | ||
6976 | pci_disable_device(priv->pci_dev); | ||
6951 | 6977 | ||
6952 | IWL_DEBUG_MAC80211("leave\n"); | 6978 | IWL_DEBUG_MAC80211("leave\n"); |
6953 | } | 6979 | } |
@@ -7000,11 +7026,12 @@ static int iwl3945_mac_add_interface(struct ieee80211_hw *hw, | |||
7000 | memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN); | 7026 | memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN); |
7001 | } | 7027 | } |
7002 | 7028 | ||
7003 | iwl3945_set_mode(priv, conf->type); | 7029 | if (iwl3945_is_ready(priv)) |
7030 | iwl3945_set_mode(priv, conf->type); | ||
7004 | 7031 | ||
7005 | IWL_DEBUG_MAC80211("leave\n"); | ||
7006 | mutex_unlock(&priv->mutex); | 7032 | mutex_unlock(&priv->mutex); |
7007 | 7033 | ||
7034 | IWL_DEBUG_MAC80211("leave\n"); | ||
7008 | return 0; | 7035 | return 0; |
7009 | } | 7036 | } |
7010 | 7037 | ||
@@ -7178,6 +7205,9 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, | |||
7178 | return 0; | 7205 | return 0; |
7179 | } | 7206 | } |
7180 | 7207 | ||
7208 | if (!iwl3945_is_alive(priv)) | ||
7209 | return -EAGAIN; | ||
7210 | |||
7181 | mutex_lock(&priv->mutex); | 7211 | mutex_lock(&priv->mutex); |
7182 | 7212 | ||
7183 | if (conf->bssid) | 7213 | if (conf->bssid) |
@@ -8390,6 +8420,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8390 | struct iwl3945_priv *priv; | 8420 | struct iwl3945_priv *priv; |
8391 | struct ieee80211_hw *hw; | 8421 | struct ieee80211_hw *hw; |
8392 | int i; | 8422 | int i; |
8423 | DECLARE_MAC_BUF(mac); | ||
8393 | 8424 | ||
8394 | /* Disabling hardware scan means that mac80211 will perform scans | 8425 | /* Disabling hardware scan means that mac80211 will perform scans |
8395 | * "the hard way", rather than using device's scan. */ | 8426 | * "the hard way", rather than using device's scan. */ |
@@ -8542,7 +8573,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8542 | /* Device-specific setup */ | 8573 | /* Device-specific setup */ |
8543 | if (iwl3945_hw_set_hw_setting(priv)) { | 8574 | if (iwl3945_hw_set_hw_setting(priv)) { |
8544 | IWL_ERROR("failed to set hw settings\n"); | 8575 | IWL_ERROR("failed to set hw settings\n"); |
8545 | mutex_unlock(&priv->mutex); | ||
8546 | goto out_iounmap; | 8576 | goto out_iounmap; |
8547 | } | 8577 | } |
8548 | 8578 | ||
@@ -8567,50 +8597,53 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8567 | 8597 | ||
8568 | iwl3945_disable_interrupts(priv); | 8598 | iwl3945_disable_interrupts(priv); |
8569 | 8599 | ||
8570 | pci_enable_msi(pdev); | ||
8571 | |||
8572 | err = request_irq(pdev->irq, iwl3945_isr, IRQF_SHARED, DRV_NAME, priv); | ||
8573 | if (err) { | ||
8574 | IWL_ERROR("Error allocating IRQ %d\n", pdev->irq); | ||
8575 | goto out_disable_msi; | ||
8576 | } | ||
8577 | |||
8578 | mutex_lock(&priv->mutex); | ||
8579 | |||
8580 | err = sysfs_create_group(&pdev->dev.kobj, &iwl3945_attribute_group); | 8600 | err = sysfs_create_group(&pdev->dev.kobj, &iwl3945_attribute_group); |
8581 | if (err) { | 8601 | if (err) { |
8582 | IWL_ERROR("failed to create sysfs device attributes\n"); | 8602 | IWL_ERROR("failed to create sysfs device attributes\n"); |
8583 | mutex_unlock(&priv->mutex); | ||
8584 | goto out_release_irq; | 8603 | goto out_release_irq; |
8585 | } | 8604 | } |
8586 | 8605 | ||
8587 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... | 8606 | /* nic init */ |
8588 | * ucode filename and max sizes are card-specific. */ | 8607 | iwl3945_set_bit(priv, CSR_GIO_CHICKEN_BITS, |
8589 | err = iwl3945_read_ucode(priv); | 8608 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); |
8609 | |||
8610 | iwl3945_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | ||
8611 | err = iwl3945_poll_bit(priv, CSR_GP_CNTRL, | ||
8612 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | ||
8613 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
8614 | if (err < 0) { | ||
8615 | IWL_DEBUG_INFO("Failed to init the card\n"); | ||
8616 | goto out_remove_sysfs; | ||
8617 | } | ||
8618 | /* Read the EEPROM */ | ||
8619 | err = iwl3945_eeprom_init(priv); | ||
8590 | if (err) { | 8620 | if (err) { |
8591 | IWL_ERROR("Could not read microcode: %d\n", err); | 8621 | IWL_ERROR("Unable to init EEPROM\n"); |
8592 | mutex_unlock(&priv->mutex); | 8622 | goto out_remove_sysfs; |
8593 | goto out_pci_alloc; | ||
8594 | } | 8623 | } |
8624 | /* MAC Address location in EEPROM same for 3945/4965 */ | ||
8625 | get_eeprom_mac(priv, priv->mac_addr); | ||
8626 | IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr)); | ||
8627 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); | ||
8595 | 8628 | ||
8596 | mutex_unlock(&priv->mutex); | 8629 | iwl3945_rate_control_register(priv->hw); |
8597 | 8630 | err = ieee80211_register_hw(priv->hw); | |
8598 | IWL_DEBUG_INFO("Queueing UP work.\n"); | 8631 | if (err) { |
8632 | IWL_ERROR("Failed to register network device (error %d)\n", err); | ||
8633 | goto out_remove_sysfs; | ||
8634 | } | ||
8599 | 8635 | ||
8600 | queue_work(priv->workqueue, &priv->up); | 8636 | priv->hw->conf.beacon_int = 100; |
8637 | priv->mac80211_registered = 1; | ||
8638 | pci_save_state(pdev); | ||
8639 | pci_disable_device(pdev); | ||
8601 | 8640 | ||
8602 | return 0; | 8641 | return 0; |
8603 | 8642 | ||
8604 | out_pci_alloc: | 8643 | out_remove_sysfs: |
8605 | iwl3945_dealloc_ucode_pci(priv); | ||
8606 | |||
8607 | sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group); | 8644 | sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group); |
8608 | 8645 | ||
8609 | out_release_irq: | 8646 | out_release_irq: |
8610 | free_irq(pdev->irq, priv); | ||
8611 | |||
8612 | out_disable_msi: | ||
8613 | pci_disable_msi(pdev); | ||
8614 | destroy_workqueue(priv->workqueue); | 8647 | destroy_workqueue(priv->workqueue); |
8615 | priv->workqueue = NULL; | 8648 | priv->workqueue = NULL; |
8616 | iwl3945_unset_hw_setting(priv); | 8649 | iwl3945_unset_hw_setting(priv); |
@@ -8676,8 +8709,6 @@ static void iwl3945_pci_remove(struct pci_dev *pdev) | |||
8676 | destroy_workqueue(priv->workqueue); | 8709 | destroy_workqueue(priv->workqueue); |
8677 | priv->workqueue = NULL; | 8710 | priv->workqueue = NULL; |
8678 | 8711 | ||
8679 | free_irq(pdev->irq, priv); | ||
8680 | pci_disable_msi(pdev); | ||
8681 | pci_iounmap(pdev, priv->hw_base); | 8712 | pci_iounmap(pdev, priv->hw_base); |
8682 | pci_release_regions(pdev); | 8713 | pci_release_regions(pdev); |
8683 | pci_disable_device(pdev); | 8714 | pci_disable_device(pdev); |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index ad824c607f36..98f09e6e9f8c 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -6608,31 +6608,12 @@ static void iwl4965_alive_start(struct iwl4965_priv *priv) | |||
6608 | } | 6608 | } |
6609 | 6609 | ||
6610 | iwl4965_init_geos(priv); | 6610 | iwl4965_init_geos(priv); |
6611 | iwl4965_reset_channel_flag(priv); | ||
6611 | 6612 | ||
6612 | if (iwl4965_is_rfkill(priv)) | 6613 | if (iwl4965_is_rfkill(priv)) |
6613 | return; | 6614 | return; |
6614 | 6615 | ||
6615 | if (!priv->mac80211_registered) { | 6616 | ieee80211_start_queues(priv->hw); |
6616 | /* Unlock so any user space entry points can call back into | ||
6617 | * the driver without a deadlock... */ | ||
6618 | mutex_unlock(&priv->mutex); | ||
6619 | iwl4965_rate_control_register(priv->hw); | ||
6620 | rc = ieee80211_register_hw(priv->hw); | ||
6621 | priv->hw->conf.beacon_int = 100; | ||
6622 | mutex_lock(&priv->mutex); | ||
6623 | |||
6624 | if (rc) { | ||
6625 | iwl4965_rate_control_unregister(priv->hw); | ||
6626 | IWL_ERROR("Failed to register network " | ||
6627 | "device (error %d)\n", rc); | ||
6628 | return; | ||
6629 | } | ||
6630 | |||
6631 | priv->mac80211_registered = 1; | ||
6632 | |||
6633 | iwl4965_reset_channel_flag(priv); | ||
6634 | } else | ||
6635 | ieee80211_start_queues(priv->hw); | ||
6636 | 6617 | ||
6637 | priv->active_rate = priv->rates_mask; | 6618 | priv->active_rate = priv->rates_mask; |
6638 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; | 6619 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; |
@@ -6663,7 +6644,9 @@ static void iwl4965_alive_start(struct iwl4965_priv *priv) | |||
6663 | set_bit(STATUS_READY, &priv->status); | 6644 | set_bit(STATUS_READY, &priv->status); |
6664 | 6645 | ||
6665 | iwl4965_rf_kill_ct_config(priv); | 6646 | iwl4965_rf_kill_ct_config(priv); |
6647 | |||
6666 | IWL_DEBUG_INFO("ALIVE processing complete.\n"); | 6648 | IWL_DEBUG_INFO("ALIVE processing complete.\n"); |
6649 | wake_up_interruptible(&priv->wait_command_queue); | ||
6667 | 6650 | ||
6668 | if (priv->error_recovering) | 6651 | if (priv->error_recovering) |
6669 | iwl4965_error_recovery(priv); | 6652 | iwl4965_error_recovery(priv); |
@@ -6777,7 +6760,6 @@ static void iwl4965_down(struct iwl4965_priv *priv) | |||
6777 | 6760 | ||
6778 | static int __iwl4965_up(struct iwl4965_priv *priv) | 6761 | static int __iwl4965_up(struct iwl4965_priv *priv) |
6779 | { | 6762 | { |
6780 | DECLARE_MAC_BUF(mac); | ||
6781 | int rc, i; | 6763 | int rc, i; |
6782 | u32 hw_rf_kill = 0; | 6764 | u32 hw_rf_kill = 0; |
6783 | 6765 | ||
@@ -6822,7 +6804,7 @@ static int __iwl4965_up(struct iwl4965_priv *priv) | |||
6822 | * This will be used to initialize the on-board processor's | 6804 | * This will be used to initialize the on-board processor's |
6823 | * data SRAM for a clean start when the runtime program first loads. */ | 6805 | * data SRAM for a clean start when the runtime program first loads. */ |
6824 | memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr, | 6806 | memcpy(priv->ucode_data_backup.v_addr, priv->ucode_data.v_addr, |
6825 | priv->ucode_data.len); | 6807 | priv->ucode_data.len); |
6826 | 6808 | ||
6827 | /* If platform's RF_KILL switch is set to KILL, | 6809 | /* If platform's RF_KILL switch is set to KILL, |
6828 | * wait for BIT_INT_RF_KILL interrupt before loading uCode | 6810 | * wait for BIT_INT_RF_KILL interrupt before loading uCode |
@@ -6853,13 +6835,6 @@ static int __iwl4965_up(struct iwl4965_priv *priv) | |||
6853 | /* start card; "initialize" will load runtime ucode */ | 6835 | /* start card; "initialize" will load runtime ucode */ |
6854 | iwl4965_nic_start(priv); | 6836 | iwl4965_nic_start(priv); |
6855 | 6837 | ||
6856 | /* MAC Address location in EEPROM is same for 3945/4965 */ | ||
6857 | get_eeprom_mac(priv, priv->mac_addr); | ||
6858 | IWL_DEBUG_INFO("MAC address: %s\n", | ||
6859 | print_mac(mac, priv->mac_addr)); | ||
6860 | |||
6861 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); | ||
6862 | |||
6863 | IWL_DEBUG_INFO(DRV_NAME " is coming up\n"); | 6838 | IWL_DEBUG_INFO(DRV_NAME " is coming up\n"); |
6864 | 6839 | ||
6865 | return 0; | 6840 | return 0; |
@@ -7365,23 +7340,73 @@ static void iwl4965_bg_scan_completed(struct work_struct *work) | |||
7365 | * | 7340 | * |
7366 | *****************************************************************************/ | 7341 | *****************************************************************************/ |
7367 | 7342 | ||
7343 | #define UCODE_READY_TIMEOUT (2 * HZ) | ||
7344 | |||
7368 | static int iwl4965_mac_start(struct ieee80211_hw *hw) | 7345 | static int iwl4965_mac_start(struct ieee80211_hw *hw) |
7369 | { | 7346 | { |
7370 | struct iwl4965_priv *priv = hw->priv; | 7347 | struct iwl4965_priv *priv = hw->priv; |
7348 | int ret; | ||
7371 | 7349 | ||
7372 | IWL_DEBUG_MAC80211("enter\n"); | 7350 | IWL_DEBUG_MAC80211("enter\n"); |
7373 | 7351 | ||
7352 | if (pci_enable_device(priv->pci_dev)) { | ||
7353 | IWL_ERROR("Fail to pci_enable_device\n"); | ||
7354 | return -ENODEV; | ||
7355 | } | ||
7356 | pci_restore_state(priv->pci_dev); | ||
7357 | pci_enable_msi(priv->pci_dev); | ||
7358 | |||
7359 | ret = request_irq(priv->pci_dev->irq, iwl4965_isr, IRQF_SHARED, | ||
7360 | DRV_NAME, priv); | ||
7361 | if (ret) { | ||
7362 | IWL_ERROR("Error allocating IRQ %d\n", priv->pci_dev->irq); | ||
7363 | goto out_disable_msi; | ||
7364 | } | ||
7365 | |||
7374 | /* we should be verifying the device is ready to be opened */ | 7366 | /* we should be verifying the device is ready to be opened */ |
7375 | mutex_lock(&priv->mutex); | 7367 | mutex_lock(&priv->mutex); |
7376 | 7368 | ||
7377 | priv->is_open = 1; | 7369 | memset(&priv->staging_rxon, 0, sizeof(struct iwl4965_rxon_cmd)); |
7370 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... | ||
7371 | * ucode filename and max sizes are card-specific. */ | ||
7378 | 7372 | ||
7379 | if (!iwl4965_is_rfkill(priv)) | 7373 | if (!priv->ucode_code.len) { |
7380 | ieee80211_start_queues(priv->hw); | 7374 | ret = iwl4965_read_ucode(priv); |
7375 | if (ret) { | ||
7376 | IWL_ERROR("Could not read microcode: %d\n", ret); | ||
7377 | mutex_unlock(&priv->mutex); | ||
7378 | goto out_release_irq; | ||
7379 | } | ||
7380 | } | ||
7381 | 7381 | ||
7382 | IWL_DEBUG_INFO("Start UP work.\n"); | ||
7383 | __iwl4965_up(priv); | ||
7384 | |||
7385 | priv->is_open = 1; | ||
7382 | mutex_unlock(&priv->mutex); | 7386 | mutex_unlock(&priv->mutex); |
7387 | |||
7388 | /* Wait for START_ALIVE from ucode. Otherwise callbacks from | ||
7389 | * mac80211 will not be run successfully. */ | ||
7390 | ret = wait_event_interruptible_timeout(priv->wait_command_queue, | ||
7391 | test_bit(STATUS_READY, &priv->status), | ||
7392 | UCODE_READY_TIMEOUT); | ||
7393 | if (!ret) { | ||
7394 | if (!test_bit(STATUS_READY, &priv->status)) { | ||
7395 | IWL_ERROR("Wait for START_ALIVE timeout after %dms.\n", | ||
7396 | jiffies_to_msecs(UCODE_READY_TIMEOUT)); | ||
7397 | ret = -ETIMEDOUT; | ||
7398 | goto out_release_irq; | ||
7399 | } | ||
7400 | } | ||
7401 | |||
7383 | IWL_DEBUG_MAC80211("leave\n"); | 7402 | IWL_DEBUG_MAC80211("leave\n"); |
7384 | return 0; | 7403 | return 0; |
7404 | |||
7405 | out_release_irq: | ||
7406 | free_irq(priv->pci_dev->irq, priv); | ||
7407 | out_disable_msi: | ||
7408 | pci_disable_msi(priv->pci_dev); | ||
7409 | return ret; | ||
7385 | } | 7410 | } |
7386 | 7411 | ||
7387 | static void iwl4965_mac_stop(struct ieee80211_hw *hw) | 7412 | static void iwl4965_mac_stop(struct ieee80211_hw *hw) |
@@ -7390,23 +7415,25 @@ static void iwl4965_mac_stop(struct ieee80211_hw *hw) | |||
7390 | 7415 | ||
7391 | IWL_DEBUG_MAC80211("enter\n"); | 7416 | IWL_DEBUG_MAC80211("enter\n"); |
7392 | 7417 | ||
7393 | |||
7394 | mutex_lock(&priv->mutex); | ||
7395 | /* stop mac, cancel any scan request and clear | 7418 | /* stop mac, cancel any scan request and clear |
7396 | * RXON_FILTER_ASSOC_MSK BIT | 7419 | * RXON_FILTER_ASSOC_MSK BIT |
7397 | */ | 7420 | */ |
7398 | priv->is_open = 0; | 7421 | priv->is_open = 0; |
7399 | if (!iwl4965_is_ready_rf(priv)) { | 7422 | |
7400 | IWL_DEBUG_MAC80211("leave - RF not ready\n"); | 7423 | if (iwl4965_is_ready_rf(priv)) { |
7424 | mutex_lock(&priv->mutex); | ||
7425 | iwl4965_scan_cancel_timeout(priv, 100); | ||
7426 | cancel_delayed_work(&priv->post_associate); | ||
7401 | mutex_unlock(&priv->mutex); | 7427 | mutex_unlock(&priv->mutex); |
7402 | return; | ||
7403 | } | 7428 | } |
7404 | 7429 | ||
7405 | iwl4965_scan_cancel_timeout(priv, 100); | 7430 | iwl4965_down(priv); |
7406 | cancel_delayed_work(&priv->post_associate); | 7431 | |
7407 | priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; | 7432 | flush_workqueue(priv->workqueue); |
7408 | iwl4965_commit_rxon(priv); | 7433 | free_irq(priv->pci_dev->irq, priv); |
7409 | mutex_unlock(&priv->mutex); | 7434 | pci_disable_msi(priv->pci_dev); |
7435 | pci_save_state(priv->pci_dev); | ||
7436 | pci_disable_device(priv->pci_dev); | ||
7410 | 7437 | ||
7411 | IWL_DEBUG_MAC80211("leave\n"); | 7438 | IWL_DEBUG_MAC80211("leave\n"); |
7412 | } | 7439 | } |
@@ -7458,11 +7485,13 @@ static int iwl4965_mac_add_interface(struct ieee80211_hw *hw, | |||
7458 | IWL_DEBUG_MAC80211("Set %s\n", print_mac(mac, conf->mac_addr)); | 7485 | IWL_DEBUG_MAC80211("Set %s\n", print_mac(mac, conf->mac_addr)); |
7459 | memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN); | 7486 | memcpy(priv->mac_addr, conf->mac_addr, ETH_ALEN); |
7460 | } | 7487 | } |
7461 | iwl4965_set_mode(priv, conf->type); | ||
7462 | 7488 | ||
7463 | IWL_DEBUG_MAC80211("leave\n"); | 7489 | if (iwl4965_is_ready(priv)) |
7490 | iwl4965_set_mode(priv, conf->type); | ||
7491 | |||
7464 | mutex_unlock(&priv->mutex); | 7492 | mutex_unlock(&priv->mutex); |
7465 | 7493 | ||
7494 | IWL_DEBUG_MAC80211("leave\n"); | ||
7466 | return 0; | 7495 | return 0; |
7467 | } | 7496 | } |
7468 | 7497 | ||
@@ -7564,9 +7593,9 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co | |||
7564 | 7593 | ||
7565 | IWL_DEBUG_MAC80211("leave\n"); | 7594 | IWL_DEBUG_MAC80211("leave\n"); |
7566 | 7595 | ||
7567 | mutex_unlock(&priv->mutex); | ||
7568 | out: | 7596 | out: |
7569 | clear_bit(STATUS_CONF_PENDING, &priv->status); | 7597 | clear_bit(STATUS_CONF_PENDING, &priv->status); |
7598 | mutex_unlock(&priv->mutex); | ||
7570 | return ret; | 7599 | return ret; |
7571 | } | 7600 | } |
7572 | 7601 | ||
@@ -7651,6 +7680,9 @@ static int iwl4965_mac_config_interface(struct ieee80211_hw *hw, | |||
7651 | return 0; | 7680 | return 0; |
7652 | } | 7681 | } |
7653 | 7682 | ||
7683 | if (!iwl4965_is_alive(priv)) | ||
7684 | return -EAGAIN; | ||
7685 | |||
7654 | mutex_lock(&priv->mutex); | 7686 | mutex_lock(&priv->mutex); |
7655 | 7687 | ||
7656 | if (conf->bssid) | 7688 | if (conf->bssid) |
@@ -8995,6 +9027,7 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8995 | struct iwl4965_priv *priv; | 9027 | struct iwl4965_priv *priv; |
8996 | struct ieee80211_hw *hw; | 9028 | struct ieee80211_hw *hw; |
8997 | int i; | 9029 | int i; |
9030 | DECLARE_MAC_BUF(mac); | ||
8998 | 9031 | ||
8999 | /* Disabling hardware scan means that mac80211 will perform scans | 9032 | /* Disabling hardware scan means that mac80211 will perform scans |
9000 | * "the hard way", rather than using device's scan. */ | 9033 | * "the hard way", rather than using device's scan. */ |
@@ -9136,7 +9169,6 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
9136 | /* Device-specific setup */ | 9169 | /* Device-specific setup */ |
9137 | if (iwl4965_hw_set_hw_setting(priv)) { | 9170 | if (iwl4965_hw_set_hw_setting(priv)) { |
9138 | IWL_ERROR("failed to set hw settings\n"); | 9171 | IWL_ERROR("failed to set hw settings\n"); |
9139 | mutex_unlock(&priv->mutex); | ||
9140 | goto out_iounmap; | 9172 | goto out_iounmap; |
9141 | } | 9173 | } |
9142 | 9174 | ||
@@ -9161,50 +9193,53 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
9161 | 9193 | ||
9162 | iwl4965_disable_interrupts(priv); | 9194 | iwl4965_disable_interrupts(priv); |
9163 | 9195 | ||
9164 | pci_enable_msi(pdev); | ||
9165 | |||
9166 | err = request_irq(pdev->irq, iwl4965_isr, IRQF_SHARED, DRV_NAME, priv); | ||
9167 | if (err) { | ||
9168 | IWL_ERROR("Error allocating IRQ %d\n", pdev->irq); | ||
9169 | goto out_disable_msi; | ||
9170 | } | ||
9171 | |||
9172 | mutex_lock(&priv->mutex); | ||
9173 | |||
9174 | err = sysfs_create_group(&pdev->dev.kobj, &iwl4965_attribute_group); | 9196 | err = sysfs_create_group(&pdev->dev.kobj, &iwl4965_attribute_group); |
9175 | if (err) { | 9197 | if (err) { |
9176 | IWL_ERROR("failed to create sysfs device attributes\n"); | 9198 | IWL_ERROR("failed to create sysfs device attributes\n"); |
9177 | mutex_unlock(&priv->mutex); | ||
9178 | goto out_release_irq; | 9199 | goto out_release_irq; |
9179 | } | 9200 | } |
9180 | 9201 | ||
9181 | /* fetch ucode file from disk, alloc and copy to bus-master buffers ... | 9202 | /* nic init */ |
9182 | * ucode filename and max sizes are card-specific. */ | 9203 | iwl4965_set_bit(priv, CSR_GIO_CHICKEN_BITS, |
9183 | err = iwl4965_read_ucode(priv); | 9204 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); |
9205 | |||
9206 | iwl4965_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | ||
9207 | err = iwl4965_poll_bit(priv, CSR_GP_CNTRL, | ||
9208 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | ||
9209 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
9210 | if (err < 0) { | ||
9211 | IWL_DEBUG_INFO("Failed to init the card\n"); | ||
9212 | goto out_remove_sysfs; | ||
9213 | } | ||
9214 | /* Read the EEPROM */ | ||
9215 | err = iwl4965_eeprom_init(priv); | ||
9184 | if (err) { | 9216 | if (err) { |
9185 | IWL_ERROR("Could not read microcode: %d\n", err); | 9217 | IWL_ERROR("Unable to init EEPROM\n"); |
9186 | mutex_unlock(&priv->mutex); | 9218 | goto out_remove_sysfs; |
9187 | goto out_pci_alloc; | ||
9188 | } | 9219 | } |
9220 | /* MAC Address location in EEPROM same for 3945/4965 */ | ||
9221 | get_eeprom_mac(priv, priv->mac_addr); | ||
9222 | IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr)); | ||
9223 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); | ||
9189 | 9224 | ||
9190 | mutex_unlock(&priv->mutex); | 9225 | iwl4965_rate_control_register(priv->hw); |
9191 | 9226 | err = ieee80211_register_hw(priv->hw); | |
9192 | IWL_DEBUG_INFO("Queueing UP work.\n"); | 9227 | if (err) { |
9228 | IWL_ERROR("Failed to register network device (error %d)\n", err); | ||
9229 | goto out_remove_sysfs; | ||
9230 | } | ||
9193 | 9231 | ||
9194 | queue_work(priv->workqueue, &priv->up); | 9232 | priv->hw->conf.beacon_int = 100; |
9233 | priv->mac80211_registered = 1; | ||
9234 | pci_save_state(pdev); | ||
9235 | pci_disable_device(pdev); | ||
9195 | 9236 | ||
9196 | return 0; | 9237 | return 0; |
9197 | 9238 | ||
9198 | out_pci_alloc: | 9239 | out_remove_sysfs: |
9199 | iwl4965_dealloc_ucode_pci(priv); | ||
9200 | |||
9201 | sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group); | 9240 | sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group); |
9202 | 9241 | ||
9203 | out_release_irq: | 9242 | out_release_irq: |
9204 | free_irq(pdev->irq, priv); | ||
9205 | |||
9206 | out_disable_msi: | ||
9207 | pci_disable_msi(pdev); | ||
9208 | destroy_workqueue(priv->workqueue); | 9243 | destroy_workqueue(priv->workqueue); |
9209 | priv->workqueue = NULL; | 9244 | priv->workqueue = NULL; |
9210 | iwl4965_unset_hw_setting(priv); | 9245 | iwl4965_unset_hw_setting(priv); |
@@ -9270,8 +9305,6 @@ static void iwl4965_pci_remove(struct pci_dev *pdev) | |||
9270 | destroy_workqueue(priv->workqueue); | 9305 | destroy_workqueue(priv->workqueue); |
9271 | priv->workqueue = NULL; | 9306 | priv->workqueue = NULL; |
9272 | 9307 | ||
9273 | free_irq(pdev->irq, priv); | ||
9274 | pci_disable_msi(pdev); | ||
9275 | pci_iounmap(pdev, priv->hw_base); | 9308 | pci_iounmap(pdev, priv->hw_base); |
9276 | pci_release_regions(pdev); | 9309 | pci_release_regions(pdev); |
9277 | pci_disable_device(pdev); | 9310 | pci_disable_device(pdev); |