diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2012-01-08 06:24:57 -0500 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2012-02-02 17:36:36 -0500 |
commit | a6c684ee489a99a54f978aa92a9bf1e82f8c633b (patch) | |
tree | 2825a868624cf760fff20497fc028c5fd32e2783 | |
parent | ebb7678d00b2fa0d7db76b5303a5bf46a5aed8f3 (diff) |
iwlwifi: move apm_init to start_hw
This is transport related
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 85 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-shared.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | 88 |
4 files changed, 87 insertions, 89 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 5ab7f681991e..3aeaa890e644 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -1836,8 +1836,6 @@ int iwl_probe(struct iwl_bus *bus, const struct iwl_trans_ops *trans_ops, | |||
1836 | /***************** | 1836 | /***************** |
1837 | * 4. Read EEPROM | 1837 | * 4. Read EEPROM |
1838 | *****************/ | 1838 | *****************/ |
1839 | /* switch the NIC on before accessing the EEPROM */ | ||
1840 | iwl_apm_init(priv); | ||
1841 | /* Read the EEPROM */ | 1839 | /* Read the EEPROM */ |
1842 | err = iwl_eeprom_init(priv, hw_rev); | 1840 | err = iwl_eeprom_init(priv, hw_rev); |
1843 | /* Reset chip to save power until we load uCode during "up". */ | 1841 | /* Reset chip to save power until we load uCode during "up". */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index c9022c5fa817..3ba59fa31086 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -923,91 +923,6 @@ void iwl_apm_stop(struct iwl_priv *priv) | |||
923 | CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | 923 | CSR_GP_CNTRL_REG_FLAG_INIT_DONE); |
924 | } | 924 | } |
925 | 925 | ||
926 | |||
927 | /* | ||
928 | * Start up NIC's basic functionality after it has been reset | ||
929 | * (e.g. after platform boot, or shutdown via iwl_apm_stop()) | ||
930 | * NOTE: This does not load uCode nor start the embedded processor | ||
931 | */ | ||
932 | int iwl_apm_init(struct iwl_priv *priv) | ||
933 | { | ||
934 | int ret = 0; | ||
935 | IWL_DEBUG_INFO(priv, "Init card's basic functions\n"); | ||
936 | |||
937 | /* | ||
938 | * Use "set_bit" below rather than "write", to preserve any hardware | ||
939 | * bits already set by default after reset. | ||
940 | */ | ||
941 | |||
942 | /* Disable L0S exit timer (platform NMI Work/Around) */ | ||
943 | iwl_set_bit(trans(priv), CSR_GIO_CHICKEN_BITS, | ||
944 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); | ||
945 | |||
946 | /* | ||
947 | * Disable L0s without affecting L1; | ||
948 | * don't wait for ICH L0s (ICH bug W/A) | ||
949 | */ | ||
950 | iwl_set_bit(trans(priv), CSR_GIO_CHICKEN_BITS, | ||
951 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); | ||
952 | |||
953 | /* Set FH wait threshold to maximum (HW error during stress W/A) */ | ||
954 | iwl_set_bit(trans(priv), CSR_DBG_HPET_MEM_REG, | ||
955 | CSR_DBG_HPET_MEM_REG_VAL); | ||
956 | |||
957 | /* | ||
958 | * Enable HAP INTA (interrupt from management bus) to | ||
959 | * wake device's PCI Express link L1a -> L0s | ||
960 | */ | ||
961 | iwl_set_bit(trans(priv), CSR_HW_IF_CONFIG_REG, | ||
962 | CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A); | ||
963 | |||
964 | bus_apm_config(bus(priv)); | ||
965 | |||
966 | /* Configure analog phase-lock-loop before activating to D0A */ | ||
967 | if (cfg(priv)->base_params->pll_cfg_val) | ||
968 | iwl_set_bit(trans(priv), CSR_ANA_PLL_CFG, | ||
969 | cfg(priv)->base_params->pll_cfg_val); | ||
970 | |||
971 | /* | ||
972 | * Set "initialization complete" bit to move adapter from | ||
973 | * D0U* --> D0A* (powered-up active) state. | ||
974 | */ | ||
975 | iwl_set_bit(trans(priv), CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | ||
976 | |||
977 | /* | ||
978 | * Wait for clock stabilization; once stabilized, access to | ||
979 | * device-internal resources is supported, e.g. iwl_write_prph() | ||
980 | * and accesses to uCode SRAM. | ||
981 | */ | ||
982 | ret = iwl_poll_bit(trans(priv), CSR_GP_CNTRL, | ||
983 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | ||
984 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
985 | if (ret < 0) { | ||
986 | IWL_DEBUG_INFO(priv, "Failed to init the card\n"); | ||
987 | goto out; | ||
988 | } | ||
989 | |||
990 | /* | ||
991 | * Enable DMA clock and wait for it to stabilize. | ||
992 | * | ||
993 | * Write to "CLK_EN_REG"; "1" bits enable clocks, while "0" bits | ||
994 | * do not disable clocks. This preserves any hardware bits already | ||
995 | * set by default in "CLK_CTRL_REG" after reset. | ||
996 | */ | ||
997 | iwl_write_prph(trans(priv), APMG_CLK_EN_REG, APMG_CLK_VAL_DMA_CLK_RQT); | ||
998 | udelay(20); | ||
999 | |||
1000 | /* Disable L1-Active */ | ||
1001 | iwl_set_bits_prph(trans(priv), APMG_PCIDEV_STT_REG, | ||
1002 | APMG_PCIDEV_STT_VAL_L1_ACT_DIS); | ||
1003 | |||
1004 | set_bit(STATUS_DEVICE_ENABLED, &priv->shrd->status); | ||
1005 | |||
1006 | out: | ||
1007 | return ret; | ||
1008 | } | ||
1009 | |||
1010 | |||
1011 | int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) | 926 | int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) |
1012 | { | 927 | { |
1013 | int ret; | 928 | int ret; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-shared.h b/drivers/net/wireless/iwlwifi/iwl-shared.h index 04975b7b65b3..338a55f403df 100644 --- a/drivers/net/wireless/iwlwifi/iwl-shared.h +++ b/drivers/net/wireless/iwlwifi/iwl-shared.h | |||
@@ -544,7 +544,6 @@ void iwl_set_hw_rfkill_state(struct iwl_priv *priv, bool state); | |||
544 | void iwl_nic_config(struct iwl_priv *priv); | 544 | void iwl_nic_config(struct iwl_priv *priv); |
545 | void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb); | 545 | void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb); |
546 | void iwl_apm_stop(struct iwl_priv *priv); | 546 | void iwl_apm_stop(struct iwl_priv *priv); |
547 | int iwl_apm_init(struct iwl_priv *priv); | ||
548 | void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); | 547 | void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); |
549 | const char *get_cmd_string(u8 cmd); | 548 | const char *get_cmd_string(u8 cmd); |
550 | bool iwl_check_for_ct_kill(struct iwl_priv *priv); | 549 | bool iwl_check_for_ct_kill(struct iwl_priv *priv); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c index d1ab57a7988f..335d4b1508cf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c | |||
@@ -74,6 +74,7 @@ | |||
74 | #include "iwl-shared.h" | 74 | #include "iwl-shared.h" |
75 | #include "iwl-eeprom.h" | 75 | #include "iwl-eeprom.h" |
76 | #include "iwl-agn-hw.h" | 76 | #include "iwl-agn-hw.h" |
77 | #include "iwl-core.h" | ||
77 | 78 | ||
78 | static int iwl_trans_rx_alloc(struct iwl_trans *trans) | 79 | static int iwl_trans_rx_alloc(struct iwl_trans *trans) |
79 | { | 80 | { |
@@ -631,13 +632,95 @@ static void iwl_set_pwr_vmain(struct iwl_trans *trans) | |||
631 | ~APMG_PS_CTRL_MSK_PWR_SRC); | 632 | ~APMG_PS_CTRL_MSK_PWR_SRC); |
632 | } | 633 | } |
633 | 634 | ||
635 | /* | ||
636 | * Start up NIC's basic functionality after it has been reset | ||
637 | * (e.g. after platform boot, or shutdown via iwl_apm_stop()) | ||
638 | * NOTE: This does not load uCode nor start the embedded processor | ||
639 | */ | ||
640 | static int iwl_apm_init(struct iwl_trans *trans) | ||
641 | { | ||
642 | int ret = 0; | ||
643 | IWL_DEBUG_INFO(trans, "Init card's basic functions\n"); | ||
644 | |||
645 | /* | ||
646 | * Use "set_bit" below rather than "write", to preserve any hardware | ||
647 | * bits already set by default after reset. | ||
648 | */ | ||
649 | |||
650 | /* Disable L0S exit timer (platform NMI Work/Around) */ | ||
651 | iwl_set_bit(trans, CSR_GIO_CHICKEN_BITS, | ||
652 | CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); | ||
653 | |||
654 | /* | ||
655 | * Disable L0s without affecting L1; | ||
656 | * don't wait for ICH L0s (ICH bug W/A) | ||
657 | */ | ||
658 | iwl_set_bit(trans, CSR_GIO_CHICKEN_BITS, | ||
659 | CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); | ||
660 | |||
661 | /* Set FH wait threshold to maximum (HW error during stress W/A) */ | ||
662 | iwl_set_bit(trans, CSR_DBG_HPET_MEM_REG, CSR_DBG_HPET_MEM_REG_VAL); | ||
663 | |||
664 | /* | ||
665 | * Enable HAP INTA (interrupt from management bus) to | ||
666 | * wake device's PCI Express link L1a -> L0s | ||
667 | */ | ||
668 | iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG, | ||
669 | CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A); | ||
670 | |||
671 | bus_apm_config(bus(trans)); | ||
672 | |||
673 | /* Configure analog phase-lock-loop before activating to D0A */ | ||
674 | if (cfg(trans)->base_params->pll_cfg_val) | ||
675 | iwl_set_bit(trans, CSR_ANA_PLL_CFG, | ||
676 | cfg(trans)->base_params->pll_cfg_val); | ||
677 | |||
678 | /* | ||
679 | * Set "initialization complete" bit to move adapter from | ||
680 | * D0U* --> D0A* (powered-up active) state. | ||
681 | */ | ||
682 | iwl_set_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | ||
683 | |||
684 | /* | ||
685 | * Wait for clock stabilization; once stabilized, access to | ||
686 | * device-internal resources is supported, e.g. iwl_write_prph() | ||
687 | * and accesses to uCode SRAM. | ||
688 | */ | ||
689 | ret = iwl_poll_bit(trans, CSR_GP_CNTRL, | ||
690 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, | ||
691 | CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); | ||
692 | if (ret < 0) { | ||
693 | IWL_DEBUG_INFO(trans, "Failed to init the card\n"); | ||
694 | goto out; | ||
695 | } | ||
696 | |||
697 | /* | ||
698 | * Enable DMA clock and wait for it to stabilize. | ||
699 | * | ||
700 | * Write to "CLK_EN_REG"; "1" bits enable clocks, while "0" bits | ||
701 | * do not disable clocks. This preserves any hardware bits already | ||
702 | * set by default in "CLK_CTRL_REG" after reset. | ||
703 | */ | ||
704 | iwl_write_prph(trans, APMG_CLK_EN_REG, APMG_CLK_VAL_DMA_CLK_RQT); | ||
705 | udelay(20); | ||
706 | |||
707 | /* Disable L1-Active */ | ||
708 | iwl_set_bits_prph(trans, APMG_PCIDEV_STT_REG, | ||
709 | APMG_PCIDEV_STT_VAL_L1_ACT_DIS); | ||
710 | |||
711 | set_bit(STATUS_DEVICE_ENABLED, &trans->shrd->status); | ||
712 | |||
713 | out: | ||
714 | return ret; | ||
715 | } | ||
716 | |||
634 | static int iwl_nic_init(struct iwl_trans *trans) | 717 | static int iwl_nic_init(struct iwl_trans *trans) |
635 | { | 718 | { |
636 | unsigned long flags; | 719 | unsigned long flags; |
637 | 720 | ||
638 | /* nic_init */ | 721 | /* nic_init */ |
639 | spin_lock_irqsave(&trans->shrd->lock, flags); | 722 | spin_lock_irqsave(&trans->shrd->lock, flags); |
640 | iwl_apm_init(priv(trans)); | 723 | iwl_apm_init(trans); |
641 | 724 | ||
642 | /* Set interrupt coalescing calibration timer to default (512 usecs) */ | 725 | /* Set interrupt coalescing calibration timer to default (512 usecs) */ |
643 | iwl_write8(trans, CSR_INT_COALESCING, | 726 | iwl_write8(trans, CSR_INT_COALESCING, |
@@ -1267,6 +1350,9 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans) | |||
1267 | IWL_ERR(trans, "Error while preparing HW: %d", err); | 1350 | IWL_ERR(trans, "Error while preparing HW: %d", err); |
1268 | goto error; | 1351 | goto error; |
1269 | } | 1352 | } |
1353 | |||
1354 | iwl_apm_init(trans); | ||
1355 | |||
1270 | return err; | 1356 | return err; |
1271 | 1357 | ||
1272 | error: | 1358 | error: |