aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2011-04-13 06:14:46 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-04-22 13:02:39 -0400
commit3e14c1fd75d909bfcc6caab79c544921fd02bf73 (patch)
tree81b86f6a9774ac27606a7046ffb129b65d41ddab /drivers/net/wireless
parentbc4f8adac6b30ee5f03dad267896add7e58db729 (diff)
iwlagn: refactor up path
Starting the device consists of many things, refactor out enabling the hardware and also return -ERFKILL when the rfkill signal is found to be asserted (which makes more sense anyway, but is also required now to make the __iwl_up function return right away.) Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c46
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c44
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.h2
3 files changed, 51 insertions, 41 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index 5c7eeac7484..5e62a089e9b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -2294,6 +2294,52 @@ void iwlagn_remove_notification(struct iwl_priv *priv,
2294 spin_unlock_bh(&priv->_agn.notif_wait_lock); 2294 spin_unlock_bh(&priv->_agn.notif_wait_lock);
2295} 2295}
2296 2296
2297int iwlagn_start_device(struct iwl_priv *priv)
2298{
2299 int ret;
2300
2301 iwl_prepare_card_hw(priv);
2302 if (!priv->hw_ready) {
2303 IWL_WARN(priv, "Exit HW not ready\n");
2304 return -EIO;
2305 }
2306
2307 /* If platform's RF_KILL switch is NOT set to KILL */
2308 if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
2309 clear_bit(STATUS_RF_KILL_HW, &priv->status);
2310 else
2311 set_bit(STATUS_RF_KILL_HW, &priv->status);
2312
2313 if (iwl_is_rfkill(priv)) {
2314 wiphy_rfkill_set_hw_state(priv->hw->wiphy, true);
2315 iwl_enable_interrupts(priv);
2316 return -ERFKILL;
2317 }
2318
2319 iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2320
2321 ret = iwlagn_hw_nic_init(priv);
2322 if (ret) {
2323 IWL_ERR(priv, "Unable to init nic\n");
2324 return ret;
2325 }
2326
2327 /* make sure rfkill handshake bits are cleared */
2328 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2329 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
2330 CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
2331
2332 /* clear (again), then enable host interrupts */
2333 iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2334 iwl_enable_interrupts(priv);
2335
2336 /* really make sure rfkill handshake bits are cleared */
2337 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2338 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2339
2340 return 0;
2341}
2342
2297void iwlagn_stop_device(struct iwl_priv *priv) 2343void iwlagn_stop_device(struct iwl_priv *priv)
2298{ 2344{
2299 unsigned long flags; 2345 unsigned long flags;
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index f3d90555129..e99cd9474ba 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -2416,7 +2416,7 @@ static int iwl_set_hw_ready(struct iwl_priv *priv)
2416 return ret; 2416 return ret;
2417} 2417}
2418 2418
2419static int iwl_prepare_card_hw(struct iwl_priv *priv) 2419int iwl_prepare_card_hw(struct iwl_priv *priv)
2420{ 2420{
2421 int ret = 0; 2421 int ret = 0;
2422 2422
@@ -2462,47 +2462,9 @@ static int __iwl_up(struct iwl_priv *priv)
2462 } 2462 }
2463 } 2463 }
2464 2464
2465 iwl_prepare_card_hw(priv); 2465 ret = iwlagn_start_device(priv);
2466 2466 if (ret)
2467 if (!priv->hw_ready) {
2468 IWL_WARN(priv, "Exit HW not ready\n");
2469 return -EIO;
2470 }
2471
2472 /* If platform's RF_KILL switch is NOT set to KILL */
2473 if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
2474 clear_bit(STATUS_RF_KILL_HW, &priv->status);
2475 else
2476 set_bit(STATUS_RF_KILL_HW, &priv->status);
2477
2478 if (iwl_is_rfkill(priv)) {
2479 wiphy_rfkill_set_hw_state(priv->hw->wiphy, true);
2480
2481 iwl_enable_interrupts(priv);
2482 IWL_WARN(priv, "Radio disabled by HW RF Kill switch\n");
2483 return 0;
2484 }
2485
2486 iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2487
2488 ret = iwlagn_hw_nic_init(priv);
2489 if (ret) {
2490 IWL_ERR(priv, "Unable to init nic\n");
2491 return ret; 2467 return ret;
2492 }
2493
2494 /* make sure rfkill handshake bits are cleared */
2495 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2496 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR,
2497 CSR_UCODE_DRV_GP1_BIT_CMD_BLOCKED);
2498
2499 /* clear (again), then enable host interrupts */
2500 iwl_write32(priv, CSR_INT, 0xFFFFFFFF);
2501 iwl_enable_interrupts(priv);
2502
2503 /* really make sure rfkill handshake bits are cleared */
2504 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2505 iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
2506 2468
2507 for (i = 0; i < MAX_HW_RESTARTS; i++) { 2469 for (i = 0; i < MAX_HW_RESTARTS; i++) {
2508 2470
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h
index 1211f457ee4..ef1bbd415b1 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.h
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.h
@@ -128,7 +128,9 @@ static inline void iwl_synchronize_irq(struct iwl_priv *priv)
128 tasklet_kill(&priv->irq_tasklet); 128 tasklet_kill(&priv->irq_tasklet);
129} 129}
130 130
131int iwl_prepare_card_hw(struct iwl_priv *priv);
131 132
133int iwlagn_start_device(struct iwl_priv *priv);
132void iwlagn_stop_device(struct iwl_priv *priv); 134void iwlagn_stop_device(struct iwl_priv *priv);
133 135
134/* tx queue */ 136/* tx queue */