|
@@ -5110,39 +5110,6 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
|
|
|
mutex_unlock(&priv->mutex);
|
|
|
}
|
|
|
|
|
|
-static void iwl3945_bg_rf_kill(struct work_struct *work)
|
|
|
-{
|
|
|
- struct iwl_priv *priv = container_of(work, struct iwl_priv, rf_kill);
|
|
|
-
|
|
|
- wake_up_interruptible(&priv->wait_command_queue);
|
|
|
-
|
|
|
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
|
|
- return;
|
|
|
-
|
|
|
- mutex_lock(&priv->mutex);
|
|
|
-
|
|
|
- if (!iwl_is_rfkill(priv)) {
|
|
|
- IWL_DEBUG(IWL_DL_INFO | IWL_DL_RF_KILL,
|
|
|
- "HW and/or SW RF Kill no longer active, restarting "
|
|
|
- "device\n");
|
|
|
- if (!test_bit(STATUS_EXIT_PENDING, &priv->status) &&
|
|
|
- test_bit(STATUS_ALIVE, &priv->status))
|
|
|
- queue_work(priv->workqueue, &priv->restart);
|
|
|
- } else {
|
|
|
-
|
|
|
- if (!test_bit(STATUS_RF_KILL_HW, &priv->status))
|
|
|
- IWL_DEBUG_RF_KILL("Can not turn radio back on - "
|
|
|
- "disabled by SW switch\n");
|
|
|
- else
|
|
|
- IWL_WARN(priv, "Radio Frequency Kill Switch is On:\n"
|
|
|
- "Kill switch must be turned off for "
|
|
|
- "wireless networking to work.\n");
|
|
|
- }
|
|
|
-
|
|
|
- mutex_unlock(&priv->mutex);
|
|
|
- iwl3945_rfkill_set_hw_state(priv);
|
|
|
-}
|
|
|
-
|
|
|
static void iwl3945_rfkill_poll(struct work_struct *data)
|
|
|
{
|
|
|
struct iwl_priv *priv =
|
|
@@ -5391,7 +5358,7 @@ static void iwl3945_bg_up(struct work_struct *data)
|
|
|
mutex_lock(&priv->mutex);
|
|
|
__iwl3945_up(priv);
|
|
|
mutex_unlock(&priv->mutex);
|
|
|
- iwl3945_rfkill_set_hw_state(priv);
|
|
|
+ iwl_rfkill_set_hw_state(priv);
|
|
|
}
|
|
|
|
|
|
static void iwl3945_bg_restart(struct work_struct *data)
|
|
@@ -5584,7 +5551,7 @@ static int iwl3945_mac_start(struct ieee80211_hw *hw)
|
|
|
|
|
|
mutex_unlock(&priv->mutex);
|
|
|
|
|
|
- iwl3945_rfkill_set_hw_state(priv);
|
|
|
+ iwl_rfkill_set_hw_state(priv);
|
|
|
|
|
|
if (ret)
|
|
|
goto out_release_irq;
|
|
@@ -6852,7 +6819,7 @@ static void iwl3945_setup_deferred_work(struct iwl_priv *priv)
|
|
|
INIT_WORK(&priv->scan_completed, iwl3945_bg_scan_completed);
|
|
|
INIT_WORK(&priv->request_scan, iwl3945_bg_request_scan);
|
|
|
INIT_WORK(&priv->abort_scan, iwl3945_bg_abort_scan);
|
|
|
- INIT_WORK(&priv->rf_kill, iwl3945_bg_rf_kill);
|
|
|
+ INIT_WORK(&priv->rf_kill, iwl_bg_rf_kill);
|
|
|
INIT_WORK(&priv->beacon_update, iwl3945_bg_beacon_update);
|
|
|
INIT_DELAYED_WORK(&priv->init_alive_start, iwl3945_bg_init_alive_start);
|
|
|
INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start);
|
|
@@ -7180,7 +7147,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|
|
priv->hw->conf.beacon_int = 100;
|
|
|
priv->mac80211_registered = 1;
|
|
|
|
|
|
- err = iwl3945_rfkill_init(priv);
|
|
|
+ err = iwl_rfkill_init(priv);
|
|
|
if (err)
|
|
|
IWL_ERR(priv, "Unable to initialize RFKILL system. "
|
|
|
"Ignoring error: %d\n", err);
|
|
@@ -7246,7 +7213,7 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev)
|
|
|
|
|
|
sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
|
|
|
|
|
|
- iwl3945_rfkill_unregister(priv);
|
|
|
+ iwl_rfkill_unregister(priv);
|
|
|
cancel_delayed_work(&priv->rfkill_poll);
|
|
|
|
|
|
iwl3945_dealloc_ucode_pci(priv);
|
|
@@ -7319,114 +7286,6 @@ static int iwl3945_pci_resume(struct pci_dev *pdev)
|
|
|
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
-/*************** RFKILL FUNCTIONS **********/
|
|
|
-#ifdef CONFIG_IWL3945_RFKILL
|
|
|
-/* software rf-kill from user */
|
|
|
-static int iwl3945_rfkill_soft_rf_kill(void *data, enum rfkill_state state)
|
|
|
-{
|
|
|
- struct iwl_priv *priv = data;
|
|
|
- int err = 0;
|
|
|
-
|
|
|
- if (!priv->rfkill)
|
|
|
- return 0;
|
|
|
-
|
|
|
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
|
|
- return 0;
|
|
|
-
|
|
|
- IWL_DEBUG_RF_KILL("we received soft RFKILL set to state %d\n", state);
|
|
|
- mutex_lock(&priv->mutex);
|
|
|
-
|
|
|
- switch (state) {
|
|
|
- case RFKILL_STATE_UNBLOCKED:
|
|
|
- if (iwl_is_rfkill_hw(priv)) {
|
|
|
- err = -EBUSY;
|
|
|
- goto out_unlock;
|
|
|
- }
|
|
|
- iwl3945_radio_kill_sw(priv, 0);
|
|
|
- break;
|
|
|
- case RFKILL_STATE_SOFT_BLOCKED:
|
|
|
- iwl3945_radio_kill_sw(priv, 1);
|
|
|
- break;
|
|
|
- default:
|
|
|
- IWL_WARN(priv, "received unexpected RFKILL state %d\n", state);
|
|
|
- break;
|
|
|
- }
|
|
|
-out_unlock:
|
|
|
- mutex_unlock(&priv->mutex);
|
|
|
-
|
|
|
- return err;
|
|
|
-}
|
|
|
-
|
|
|
-int iwl3945_rfkill_init(struct iwl_priv *priv)
|
|
|
-{
|
|
|
- struct device *device = wiphy_dev(priv->hw->wiphy);
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- BUG_ON(device == NULL);
|
|
|
-
|
|
|
- IWL_DEBUG_RF_KILL("Initializing RFKILL.\n");
|
|
|
- priv->rfkill = rfkill_allocate(device, RFKILL_TYPE_WLAN);
|
|
|
- if (!priv->rfkill) {
|
|
|
- IWL_ERR(priv, "Unable to allocate rfkill device.\n");
|
|
|
- ret = -ENOMEM;
|
|
|
- goto error;
|
|
|
- }
|
|
|
-
|
|
|
- priv->rfkill->name = priv->cfg->name;
|
|
|
- priv->rfkill->data = priv;
|
|
|
- priv->rfkill->state = RFKILL_STATE_UNBLOCKED;
|
|
|
- priv->rfkill->toggle_radio = iwl3945_rfkill_soft_rf_kill;
|
|
|
- priv->rfkill->user_claim_unsupported = 1;
|
|
|
-
|
|
|
- priv->rfkill->dev.class->suspend = NULL;
|
|
|
- priv->rfkill->dev.class->resume = NULL;
|
|
|
-
|
|
|
- ret = rfkill_register(priv->rfkill);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Unable to register rfkill: %d\n", ret);
|
|
|
- goto freed_rfkill;
|
|
|
- }
|
|
|
-
|
|
|
- IWL_DEBUG_RF_KILL("RFKILL initialization complete.\n");
|
|
|
- return ret;
|
|
|
-
|
|
|
-freed_rfkill:
|
|
|
- if (priv->rfkill != NULL)
|
|
|
- rfkill_free(priv->rfkill);
|
|
|
- priv->rfkill = NULL;
|
|
|
-
|
|
|
-error:
|
|
|
- IWL_DEBUG_RF_KILL("RFKILL initialization complete.\n");
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
-void iwl3945_rfkill_unregister(struct iwl_priv *priv)
|
|
|
-{
|
|
|
- if (priv->rfkill)
|
|
|
- rfkill_unregister(priv->rfkill);
|
|
|
-
|
|
|
- priv->rfkill = NULL;
|
|
|
-}
|
|
|
-
|
|
|
-/* set rf-kill to the right state. */
|
|
|
-void iwl3945_rfkill_set_hw_state(struct iwl_priv *priv)
|
|
|
-{
|
|
|
-
|
|
|
- if (!priv->rfkill)
|
|
|
- return;
|
|
|
-
|
|
|
- if (iwl_is_rfkill_hw(priv)) {
|
|
|
- rfkill_force_state(priv->rfkill, RFKILL_STATE_HARD_BLOCKED);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (!iwl_is_rfkill_sw(priv))
|
|
|
- rfkill_force_state(priv->rfkill, RFKILL_STATE_UNBLOCKED);
|
|
|
- else
|
|
|
- rfkill_force_state(priv->rfkill, RFKILL_STATE_SOFT_BLOCKED);
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
/*****************************************************************************
|
|
|
*
|
|
|
* driver and module entry point
|