aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2012-01-08 06:24:57 -0500
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2012-02-02 17:36:36 -0500
commita6c684ee489a99a54f978aa92a9bf1e82f8c633b (patch)
tree2825a868624cf760fff20497fc028c5fd32e2783
parentebb7678d00b2fa0d7db76b5303a5bf46a5aed8f3 (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.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c85
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-shared.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans-pcie.c88
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 */
932int 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
1006out:
1007 return ret;
1008}
1009
1010
1011int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) 926int 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);
544void iwl_nic_config(struct iwl_priv *priv); 544void iwl_nic_config(struct iwl_priv *priv);
545void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb); 545void iwl_free_skb(struct iwl_priv *priv, struct sk_buff *skb);
546void iwl_apm_stop(struct iwl_priv *priv); 546void iwl_apm_stop(struct iwl_priv *priv);
547int iwl_apm_init(struct iwl_priv *priv);
548void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand); 547void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand);
549const char *get_cmd_string(u8 cmd); 548const char *get_cmd_string(u8 cmd);
550bool iwl_check_for_ct_kill(struct iwl_priv *priv); 549bool 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
78static int iwl_trans_rx_alloc(struct iwl_trans *trans) 79static 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 */
640static 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
713out:
714 return ret;
715}
716
634static int iwl_nic_init(struct iwl_trans *trans) 717static 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
1272error: 1358error: