aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/ar9003_hw.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2010-04-15 17:39:03 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-04-16 15:43:32 -0400
commitb3950e6a52b1d0279787ef44ba1efac2f3414260 (patch)
treeab408a80790f31ad658f71346c06ee67312492a9 /drivers/net/wireless/ath/ath9k/ar9003_hw.c
parent204729fd182bd56180323d9293c31038dde32995 (diff)
ath9k_hw: split the generic hardware code by hardware family
Move out the generic hardware family code out into their own files, we have one for AR5008, AR9001, and AR9002 family (ar9002_hw.c) and another file for the new AR9003 hardware family (ar9003_hw.c). Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar9003_hw.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_hw.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
new file mode 100644
index 00000000000..6111bdb7779
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
@@ -0,0 +1,149 @@
1/*
2 * Copyright (c) 2008-2010 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "hw.h"
18#include "ar9003_initvals.h"
19
20/* General hardware code for the AR9003 hadware family */
21
22static bool ar9003_hw_macversion_supported(u32 macversion)
23{
24 switch (macversion) {
25 case AR_SREV_VERSION_9300:
26 return true;
27 default:
28 break;
29 }
30 return false;
31}
32
33/* AR9003 2.0 - new INI format (pre, core, post arrays per subsystem) */
34static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
35{
36 /* mac */
37 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
38 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
39 ar9300_2p0_mac_core,
40 ARRAY_SIZE(ar9300_2p0_mac_core), 2);
41 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
42 ar9300_2p0_mac_postamble,
43 ARRAY_SIZE(ar9300_2p0_mac_postamble), 5);
44
45 /* bb */
46 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
47 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
48 ar9300_2p0_baseband_core,
49 ARRAY_SIZE(ar9300_2p0_baseband_core), 2);
50 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
51 ar9300_2p0_baseband_postamble,
52 ARRAY_SIZE(ar9300_2p0_baseband_postamble), 5);
53
54 /* radio */
55 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
56 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
57 ar9300_2p0_radio_core,
58 ARRAY_SIZE(ar9300_2p0_radio_core), 2);
59 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
60 ar9300_2p0_radio_postamble,
61 ARRAY_SIZE(ar9300_2p0_radio_postamble), 5);
62
63 /* soc */
64 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
65 ar9300_2p0_soc_preamble,
66 ARRAY_SIZE(ar9300_2p0_soc_preamble), 2);
67 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
68 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
69 ar9300_2p0_soc_postamble,
70 ARRAY_SIZE(ar9300_2p0_soc_postamble), 5);
71
72 /* rx/tx gain */
73 INIT_INI_ARRAY(&ah->iniModesRxGain,
74 ar9300Common_rx_gain_table_2p0,
75 ARRAY_SIZE(ar9300Common_rx_gain_table_2p0), 2);
76 INIT_INI_ARRAY(&ah->iniModesTxGain,
77 ar9300Modes_lowest_ob_db_tx_gain_table_2p0,
78 ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p0),
79 5);
80
81 /* Load PCIE SERDES settings from INI */
82
83 /* Awake Setting */
84
85 INIT_INI_ARRAY(&ah->iniPcieSerdes,
86 ar9300PciePhy_pll_on_clkreq_disable_L1_2p0,
87 ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p0),
88 2);
89
90 /* Sleep Setting */
91
92 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
93 ar9300PciePhy_clkreq_enable_L1_2p0,
94 ARRAY_SIZE(ar9300PciePhy_clkreq_enable_L1_2p0),
95 2);
96
97 /* Fast clock modal settings */
98 INIT_INI_ARRAY(&ah->iniModesAdditional,
99 ar9300Modes_fast_clock_2p0,
100 ARRAY_SIZE(ar9300Modes_fast_clock_2p0),
101 3);
102}
103
104/*
105 * Helper for ASPM support.
106 *
107 * Disable PLL when in L0s as well as receiver clock when in L1.
108 * This power saving option must be enabled through the SerDes.
109 *
110 * Programming the SerDes must go through the same 288 bit serial shift
111 * register as the other analog registers. Hence the 9 writes.
112 */
113static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
114 int restore,
115 int power_off)
116{
117 if (ah->is_pciexpress != true)
118 return;
119
120 /* Do not touch SerDes registers */
121 if (ah->config.pcie_powersave_enable == 2)
122 return;
123
124 /* Nothing to do on restore for 11N */
125 if (!restore) {
126 /* set bit 19 to allow forcing of pcie core into L1 state */
127 REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
128
129 /* Several PCIe massages to ensure proper behaviour */
130 if (ah->config.pcie_waen)
131 REG_WRITE(ah, AR_WA, ah->config.pcie_waen);
132 }
133}
134
135/* Sets up the AR9003 hardware familiy callbacks */
136void ar9003_hw_attach_ops(struct ath_hw *ah)
137{
138 struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
139 struct ath_hw_ops *ops = ath9k_hw_ops(ah);
140
141 priv_ops->init_mode_regs = ar9003_hw_init_mode_regs;
142 priv_ops->macversion_supported = ar9003_hw_macversion_supported;
143
144 ops->config_pci_powersave = ar9003_hw_configpcipowersave;
145
146 ar9003_hw_attach_phy_ops(ah);
147 ar9003_hw_attach_calib_ops(ah);
148 ar9003_hw_attach_mac_ops(ah);
149}