diff options
author | Johannes Berg <johannes.berg@intel.com> | 2011-04-13 06:14:46 -0400 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-04-22 13:02:39 -0400 |
commit | 3e14c1fd75d909bfcc6caab79c544921fd02bf73 (patch) | |
tree | 81b86f6a9774ac27606a7046ffb129b65d41ddab /drivers/net/wireless | |
parent | bc4f8adac6b30ee5f03dad267896add7e58db729 (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.c | 46 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 44 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.h | 2 |
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 | ||
2297 | int 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 | |||
2297 | void iwlagn_stop_device(struct iwl_priv *priv) | 2343 | void 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 | ||
2419 | static int iwl_prepare_card_hw(struct iwl_priv *priv) | 2419 | int 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 | ||
131 | int iwl_prepare_card_hw(struct iwl_priv *priv); | ||
131 | 132 | ||
133 | int iwlagn_start_device(struct iwl_priv *priv); | ||
132 | void iwlagn_stop_device(struct iwl_priv *priv); | 134 | void iwlagn_stop_device(struct iwl_priv *priv); |
133 | 135 | ||
134 | /* tx queue */ | 136 | /* tx queue */ |