1 /*
2  * RF Gain optimization
3  *
4  * Copyright (c) 2004-2009 Reyk Floeter <reyk@openbsd.org>
5  * Copyright (c) 2006-2009 Nick Kossifidis <mickflemm@gmail.com>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  *
19  */
20 
21 /**
22  * struct ath5k_ini_rfgain - RF Gain table
23  * @rfg_register: RF Gain register address
24  * @rfg_value: Register value for 5 and 2GHz
25  *
26  * Mode-specific RF Gain table (64bytes) for RF5111/5112
27  * (RF5110 only comes with AR5210 and only supports a/turbo a mode so initial
28  * RF Gain values are included in AR5K_AR5210_INI)
29  */
30 struct ath5k_ini_rfgain {
31 	u16	rfg_register;
32 	u32	rfg_value[2];	/* [freq (see below)] */
33 };
34 
35 /* Initial RF Gain settings for RF5111 */
36 static const struct ath5k_ini_rfgain rfgain_5111[] = {
37 	/*			      5GHz	2GHz	*/
38 	{ AR5K_RF_GAIN(0),	{ 0x000001a9, 0x00000000 } },
39 	{ AR5K_RF_GAIN(1),	{ 0x000001e9, 0x00000040 } },
40 	{ AR5K_RF_GAIN(2),	{ 0x00000029, 0x00000080 } },
41 	{ AR5K_RF_GAIN(3),	{ 0x00000069, 0x00000150 } },
42 	{ AR5K_RF_GAIN(4),	{ 0x00000199, 0x00000190 } },
43 	{ AR5K_RF_GAIN(5),	{ 0x000001d9, 0x000001d0 } },
44 	{ AR5K_RF_GAIN(6),	{ 0x00000019, 0x00000010 } },
45 	{ AR5K_RF_GAIN(7),	{ 0x00000059, 0x00000044 } },
46 	{ AR5K_RF_GAIN(8),	{ 0x00000099, 0x00000084 } },
47 	{ AR5K_RF_GAIN(9),	{ 0x000001a5, 0x00000148 } },
48 	{ AR5K_RF_GAIN(10),	{ 0x000001e5, 0x00000188 } },
49 	{ AR5K_RF_GAIN(11),	{ 0x00000025, 0x000001c8 } },
50 	{ AR5K_RF_GAIN(12),	{ 0x000001c8, 0x00000014 } },
51 	{ AR5K_RF_GAIN(13),	{ 0x00000008, 0x00000042 } },
52 	{ AR5K_RF_GAIN(14),	{ 0x00000048, 0x00000082 } },
53 	{ AR5K_RF_GAIN(15),	{ 0x00000088, 0x00000178 } },
54 	{ AR5K_RF_GAIN(16),	{ 0x00000198, 0x000001b8 } },
55 	{ AR5K_RF_GAIN(17),	{ 0x000001d8, 0x000001f8 } },
56 	{ AR5K_RF_GAIN(18),	{ 0x00000018, 0x00000012 } },
57 	{ AR5K_RF_GAIN(19),	{ 0x00000058, 0x00000052 } },
58 	{ AR5K_RF_GAIN(20),	{ 0x00000098, 0x00000092 } },
59 	{ AR5K_RF_GAIN(21),	{ 0x000001a4, 0x0000017c } },
60 	{ AR5K_RF_GAIN(22),	{ 0x000001e4, 0x000001bc } },
61 	{ AR5K_RF_GAIN(23),	{ 0x00000024, 0x000001fc } },
62 	{ AR5K_RF_GAIN(24),	{ 0x00000064, 0x0000000a } },
63 	{ AR5K_RF_GAIN(25),	{ 0x000000a4, 0x0000004a } },
64 	{ AR5K_RF_GAIN(26),	{ 0x000000e4, 0x0000008a } },
65 	{ AR5K_RF_GAIN(27),	{ 0x0000010a, 0x0000015a } },
66 	{ AR5K_RF_GAIN(28),	{ 0x0000014a, 0x0000019a } },
67 	{ AR5K_RF_GAIN(29),	{ 0x0000018a, 0x000001da } },
68 	{ AR5K_RF_GAIN(30),	{ 0x000001ca, 0x0000000e } },
69 	{ AR5K_RF_GAIN(31),	{ 0x0000000a, 0x0000004e } },
70 	{ AR5K_RF_GAIN(32),	{ 0x0000004a, 0x0000008e } },
71 	{ AR5K_RF_GAIN(33),	{ 0x0000008a, 0x0000015e } },
72 	{ AR5K_RF_GAIN(34),	{ 0x000001ba, 0x0000019e } },
73 	{ AR5K_RF_GAIN(35),	{ 0x000001fa, 0x000001de } },
74 	{ AR5K_RF_GAIN(36),	{ 0x0000003a, 0x00000009 } },
75 	{ AR5K_RF_GAIN(37),	{ 0x0000007a, 0x00000049 } },
76 	{ AR5K_RF_GAIN(38),	{ 0x00000186, 0x00000089 } },
77 	{ AR5K_RF_GAIN(39),	{ 0x000001c6, 0x00000179 } },
78 	{ AR5K_RF_GAIN(40),	{ 0x00000006, 0x000001b9 } },
79 	{ AR5K_RF_GAIN(41),	{ 0x00000046, 0x000001f9 } },
80 	{ AR5K_RF_GAIN(42),	{ 0x00000086, 0x00000039 } },
81 	{ AR5K_RF_GAIN(43),	{ 0x000000c6, 0x00000079 } },
82 	{ AR5K_RF_GAIN(44),	{ 0x000000c6, 0x000000b9 } },
83 	{ AR5K_RF_GAIN(45),	{ 0x000000c6, 0x000001bd } },
84 	{ AR5K_RF_GAIN(46),	{ 0x000000c6, 0x000001fd } },
85 	{ AR5K_RF_GAIN(47),	{ 0x000000c6, 0x0000003d } },
86 	{ AR5K_RF_GAIN(48),	{ 0x000000c6, 0x0000007d } },
87 	{ AR5K_RF_GAIN(49),	{ 0x000000c6, 0x000000bd } },
88 	{ AR5K_RF_GAIN(50),	{ 0x000000c6, 0x000000fd } },
89 	{ AR5K_RF_GAIN(51),	{ 0x000000c6, 0x000000fd } },
90 	{ AR5K_RF_GAIN(52),	{ 0x000000c6, 0x000000fd } },
91 	{ AR5K_RF_GAIN(53),	{ 0x000000c6, 0x000000fd } },
92 	{ AR5K_RF_GAIN(54),	{ 0x000000c6, 0x000000fd } },
93 	{ AR5K_RF_GAIN(55),	{ 0x000000c6, 0x000000fd } },
94 	{ AR5K_RF_GAIN(56),	{ 0x000000c6, 0x000000fd } },
95 	{ AR5K_RF_GAIN(57),	{ 0x000000c6, 0x000000fd } },
96 	{ AR5K_RF_GAIN(58),	{ 0x000000c6, 0x000000fd } },
97 	{ AR5K_RF_GAIN(59),	{ 0x000000c6, 0x000000fd } },
98 	{ AR5K_RF_GAIN(60),	{ 0x000000c6, 0x000000fd } },
99 	{ AR5K_RF_GAIN(61),	{ 0x000000c6, 0x000000fd } },
100 	{ AR5K_RF_GAIN(62),	{ 0x000000c6, 0x000000fd } },
101 	{ AR5K_RF_GAIN(63),	{ 0x000000c6, 0x000000fd } },
102 };
103 
104 /* Initial RF Gain settings for RF5112 */
105 static const struct ath5k_ini_rfgain rfgain_5112[] = {
106 	/*			      5GHz	2GHz	*/
107 	{ AR5K_RF_GAIN(0),	{ 0x00000007, 0x00000007 } },
108 	{ AR5K_RF_GAIN(1),	{ 0x00000047, 0x00000047 } },
109 	{ AR5K_RF_GAIN(2),	{ 0x00000087, 0x00000087 } },
110 	{ AR5K_RF_GAIN(3),	{ 0x000001a0, 0x000001a0 } },
111 	{ AR5K_RF_GAIN(4),	{ 0x000001e0, 0x000001e0 } },
112 	{ AR5K_RF_GAIN(5),	{ 0x00000020, 0x00000020 } },
113 	{ AR5K_RF_GAIN(6),	{ 0x00000060, 0x00000060 } },
114 	{ AR5K_RF_GAIN(7),	{ 0x000001a1, 0x000001a1 } },
115 	{ AR5K_RF_GAIN(8),	{ 0x000001e1, 0x000001e1 } },
116 	{ AR5K_RF_GAIN(9),	{ 0x00000021, 0x00000021 } },
117 	{ AR5K_RF_GAIN(10),	{ 0x00000061, 0x00000061 } },
118 	{ AR5K_RF_GAIN(11),	{ 0x00000162, 0x00000162 } },
119 	{ AR5K_RF_GAIN(12),	{ 0x000001a2, 0x000001a2 } },
120 	{ AR5K_RF_GAIN(13),	{ 0x000001e2, 0x000001e2 } },
121 	{ AR5K_RF_GAIN(14),	{ 0x00000022, 0x00000022 } },
122 	{ AR5K_RF_GAIN(15),	{ 0x00000062, 0x00000062 } },
123 	{ AR5K_RF_GAIN(16),	{ 0x00000163, 0x00000163 } },
124 	{ AR5K_RF_GAIN(17),	{ 0x000001a3, 0x000001a3 } },
125 	{ AR5K_RF_GAIN(18),	{ 0x000001e3, 0x000001e3 } },
126 	{ AR5K_RF_GAIN(19),	{ 0x00000023, 0x00000023 } },
127 	{ AR5K_RF_GAIN(20),	{ 0x00000063, 0x00000063 } },
128 	{ AR5K_RF_GAIN(21),	{ 0x00000184, 0x00000184 } },
129 	{ AR5K_RF_GAIN(22),	{ 0x000001c4, 0x000001c4 } },
130 	{ AR5K_RF_GAIN(23),	{ 0x00000004, 0x00000004 } },
131 	{ AR5K_RF_GAIN(24),	{ 0x000001ea, 0x0000000b } },
132 	{ AR5K_RF_GAIN(25),	{ 0x0000002a, 0x0000004b } },
133 	{ AR5K_RF_GAIN(26),	{ 0x0000006a, 0x0000008b } },
134 	{ AR5K_RF_GAIN(27),	{ 0x000000aa, 0x000001ac } },
135 	{ AR5K_RF_GAIN(28),	{ 0x000001ab, 0x000001ec } },
136 	{ AR5K_RF_GAIN(29),	{ 0x000001eb, 0x0000002c } },
137 	{ AR5K_RF_GAIN(30),	{ 0x0000002b, 0x00000012 } },
138 	{ AR5K_RF_GAIN(31),	{ 0x0000006b, 0x00000052 } },
139 	{ AR5K_RF_GAIN(32),	{ 0x000000ab, 0x00000092 } },
140 	{ AR5K_RF_GAIN(33),	{ 0x000001ac, 0x00000193 } },
141 	{ AR5K_RF_GAIN(34),	{ 0x000001ec, 0x000001d3 } },
142 	{ AR5K_RF_GAIN(35),	{ 0x0000002c, 0x00000013 } },
143 	{ AR5K_RF_GAIN(36),	{ 0x0000003a, 0x00000053 } },
144 	{ AR5K_RF_GAIN(37),	{ 0x0000007a, 0x00000093 } },
145 	{ AR5K_RF_GAIN(38),	{ 0x000000ba, 0x00000194 } },
146 	{ AR5K_RF_GAIN(39),	{ 0x000001bb, 0x000001d4 } },
147 	{ AR5K_RF_GAIN(40),	{ 0x000001fb, 0x00000014 } },
148 	{ AR5K_RF_GAIN(41),	{ 0x0000003b, 0x0000003a } },
149 	{ AR5K_RF_GAIN(42),	{ 0x0000007b, 0x0000007a } },
150 	{ AR5K_RF_GAIN(43),	{ 0x000000bb, 0x000000ba } },
151 	{ AR5K_RF_GAIN(44),	{ 0x000001bc, 0x000001bb } },
152 	{ AR5K_RF_GAIN(45),	{ 0x000001fc, 0x000001fb } },
153 	{ AR5K_RF_GAIN(46),	{ 0x0000003c, 0x0000003b } },
154 	{ AR5K_RF_GAIN(47),	{ 0x0000007c, 0x0000007b } },
155 	{ AR5K_RF_GAIN(48),	{ 0x000000bc, 0x000000bb } },
156 	{ AR5K_RF_GAIN(49),	{ 0x000000fc, 0x000001bc } },
157 	{ AR5K_RF_GAIN(50),	{ 0x000000fc, 0x000001fc } },
158 	{ AR5K_RF_GAIN(51),	{ 0x000000fc, 0x0000003c } },
159 	{ AR5K_RF_GAIN(52),	{ 0x000000fc, 0x0000007c } },
160 	{ AR5K_RF_GAIN(53),	{ 0x000000fc, 0x000000bc } },
161 	{ AR5K_RF_GAIN(54),	{ 0x000000fc, 0x000000fc } },
162 	{ AR5K_RF_GAIN(55),	{ 0x000000fc, 0x000000fc } },
163 	{ AR5K_RF_GAIN(56),	{ 0x000000fc, 0x000000fc } },
164 	{ AR5K_RF_GAIN(57),	{ 0x000000fc, 0x000000fc } },
165 	{ AR5K_RF_GAIN(58),	{ 0x000000fc, 0x000000fc } },
166 	{ AR5K_RF_GAIN(59),	{ 0x000000fc, 0x000000fc } },
167 	{ AR5K_RF_GAIN(60),	{ 0x000000fc, 0x000000fc } },
168 	{ AR5K_RF_GAIN(61),	{ 0x000000fc, 0x000000fc } },
169 	{ AR5K_RF_GAIN(62),	{ 0x000000fc, 0x000000fc } },
170 	{ AR5K_RF_GAIN(63),	{ 0x000000fc, 0x000000fc } },
171 };
172 
173 /* Initial RF Gain settings for RF2413 */
174 static const struct ath5k_ini_rfgain rfgain_2413[] = {
175 	{ AR5K_RF_GAIN(0),	{ 0x00000000, 0x00000000 } },
176 	{ AR5K_RF_GAIN(1),	{ 0x00000000, 0x00000040 } },
177 	{ AR5K_RF_GAIN(2),	{ 0x00000000, 0x00000080 } },
178 	{ AR5K_RF_GAIN(3),	{ 0x00000000, 0x00000181 } },
179 	{ AR5K_RF_GAIN(4),	{ 0x00000000, 0x000001c1 } },
180 	{ AR5K_RF_GAIN(5),	{ 0x00000000, 0x00000001 } },
181 	{ AR5K_RF_GAIN(6),	{ 0x00000000, 0x00000041 } },
182 	{ AR5K_RF_GAIN(7),	{ 0x00000000, 0x00000081 } },
183 	{ AR5K_RF_GAIN(8),	{ 0x00000000, 0x00000168 } },
184 	{ AR5K_RF_GAIN(9),	{ 0x00000000, 0x000001a8 } },
185 	{ AR5K_RF_GAIN(10),	{ 0x00000000, 0x000001e8 } },
186 	{ AR5K_RF_GAIN(11),	{ 0x00000000, 0x00000028 } },
187 	{ AR5K_RF_GAIN(12),	{ 0x00000000, 0x00000068 } },
188 	{ AR5K_RF_GAIN(13),	{ 0x00000000, 0x00000189 } },
189 	{ AR5K_RF_GAIN(14),	{ 0x00000000, 0x000001c9 } },
190 	{ AR5K_RF_GAIN(15),	{ 0x00000000, 0x00000009 } },
191 	{ AR5K_RF_GAIN(16),	{ 0x00000000, 0x00000049 } },
192 	{ AR5K_RF_GAIN(17),	{ 0x00000000, 0x00000089 } },
193 	{ AR5K_RF_GAIN(18),	{ 0x00000000, 0x00000190 } },
194 	{ AR5K_RF_GAIN(19),	{ 0x00000000, 0x000001d0 } },
195 	{ AR5K_RF_GAIN(20),	{ 0x00000000, 0x00000010 } },
196 	{ AR5K_RF_GAIN(21),	{ 0x00000000, 0x00000050 } },
197 	{ AR5K_RF_GAIN(22),	{ 0x00000000, 0x00000090 } },
198 	{ AR5K_RF_GAIN(23),	{ 0x00000000, 0x00000191 } },
199 	{ AR5K_RF_GAIN(24),	{ 0x00000000, 0x000001d1 } },
200 	{ AR5K_RF_GAIN(25),	{ 0x00000000, 0x00000011 } },
201 	{ AR5K_RF_GAIN(26),	{ 0x00000000, 0x00000051 } },
202 	{ AR5K_RF_GAIN(27),	{ 0x00000000, 0x00000091 } },
203 	{ AR5K_RF_GAIN(28),	{ 0x00000000, 0x00000178 } },
204 	{ AR5K_RF_GAIN(29),	{ 0x00000000, 0x000001b8 } },
205 	{ AR5K_RF_GAIN(30),	{ 0x00000000, 0x000001f8 } },
206 	{ AR5K_RF_GAIN(31),	{ 0x00000000, 0x00000038 } },
207 	{ AR5K_RF_GAIN(32),	{ 0x00000000, 0x00000078 } },
208 	{ AR5K_RF_GAIN(33),	{ 0x00000000, 0x00000199 } },
209 	{ AR5K_RF_GAIN(34),	{ 0x00000000, 0x000001d9 } },
210 	{ AR5K_RF_GAIN(35),	{ 0x00000000, 0x00000019 } },
211 	{ AR5K_RF_GAIN(36),	{ 0x00000000, 0x00000059 } },
212 	{ AR5K_RF_GAIN(37),	{ 0x00000000, 0x00000099 } },
213 	{ AR5K_RF_GAIN(38),	{ 0x00000000, 0x000000d9 } },
214 	{ AR5K_RF_GAIN(39),	{ 0x00000000, 0x000000f9 } },
215 	{ AR5K_RF_GAIN(40),	{ 0x00000000, 0x000000f9 } },
216 	{ AR5K_RF_GAIN(41),	{ 0x00000000, 0x000000f9 } },
217 	{ AR5K_RF_GAIN(42),	{ 0x00000000, 0x000000f9 } },
218 	{ AR5K_RF_GAIN(43),	{ 0x00000000, 0x000000f9 } },
219 	{ AR5K_RF_GAIN(44),	{ 0x00000000, 0x000000f9 } },
220 	{ AR5K_RF_GAIN(45),	{ 0x00000000, 0x000000f9 } },
221 	{ AR5K_RF_GAIN(46),	{ 0x00000000, 0x000000f9 } },
222 	{ AR5K_RF_GAIN(47),	{ 0x00000000, 0x000000f9 } },
223 	{ AR5K_RF_GAIN(48),	{ 0x00000000, 0x000000f9 } },
224 	{ AR5K_RF_GAIN(49),	{ 0x00000000, 0x000000f9 } },
225 	{ AR5K_RF_GAIN(50),	{ 0x00000000, 0x000000f9 } },
226 	{ AR5K_RF_GAIN(51),	{ 0x00000000, 0x000000f9 } },
227 	{ AR5K_RF_GAIN(52),	{ 0x00000000, 0x000000f9 } },
228 	{ AR5K_RF_GAIN(53),	{ 0x00000000, 0x000000f9 } },
229 	{ AR5K_RF_GAIN(54),	{ 0x00000000, 0x000000f9 } },
230 	{ AR5K_RF_GAIN(55),	{ 0x00000000, 0x000000f9 } },
231 	{ AR5K_RF_GAIN(56),	{ 0x00000000, 0x000000f9 } },
232 	{ AR5K_RF_GAIN(57),	{ 0x00000000, 0x000000f9 } },
233 	{ AR5K_RF_GAIN(58),	{ 0x00000000, 0x000000f9 } },
234 	{ AR5K_RF_GAIN(59),	{ 0x00000000, 0x000000f9 } },
235 	{ AR5K_RF_GAIN(60),	{ 0x00000000, 0x000000f9 } },
236 	{ AR5K_RF_GAIN(61),	{ 0x00000000, 0x000000f9 } },
237 	{ AR5K_RF_GAIN(62),	{ 0x00000000, 0x000000f9 } },
238 	{ AR5K_RF_GAIN(63),	{ 0x00000000, 0x000000f9 } },
239 };
240 
241 /* Initial RF Gain settings for AR2316 */
242 static const struct ath5k_ini_rfgain rfgain_2316[] = {
243 	{ AR5K_RF_GAIN(0),	{ 0x00000000, 0x00000000 } },
244 	{ AR5K_RF_GAIN(1),	{ 0x00000000, 0x00000040 } },
245 	{ AR5K_RF_GAIN(2),	{ 0x00000000, 0x00000080 } },
246 	{ AR5K_RF_GAIN(3),	{ 0x00000000, 0x000000c0 } },
247 	{ AR5K_RF_GAIN(4),	{ 0x00000000, 0x000000e0 } },
248 	{ AR5K_RF_GAIN(5),	{ 0x00000000, 0x000000e0 } },
249 	{ AR5K_RF_GAIN(6),	{ 0x00000000, 0x00000128 } },
250 	{ AR5K_RF_GAIN(7),	{ 0x00000000, 0x00000128 } },
251 	{ AR5K_RF_GAIN(8),	{ 0x00000000, 0x00000128 } },
252 	{ AR5K_RF_GAIN(9),	{ 0x00000000, 0x00000168 } },
253 	{ AR5K_RF_GAIN(10),	{ 0x00000000, 0x000001a8 } },
254 	{ AR5K_RF_GAIN(11),	{ 0x00000000, 0x000001e8 } },
255 	{ AR5K_RF_GAIN(12),	{ 0x00000000, 0x00000028 } },
256 	{ AR5K_RF_GAIN(13),	{ 0x00000000, 0x00000068 } },
257 	{ AR5K_RF_GAIN(14),	{ 0x00000000, 0x000000a8 } },
258 	{ AR5K_RF_GAIN(15),	{ 0x00000000, 0x000000e8 } },
259 	{ AR5K_RF_GAIN(16),	{ 0x00000000, 0x000000e8 } },
260 	{ AR5K_RF_GAIN(17),	{ 0x00000000, 0x00000130 } },
261 	{ AR5K_RF_GAIN(18),	{ 0x00000000, 0x00000130 } },
262 	{ AR5K_RF_GAIN(19),	{ 0x00000000, 0x00000170 } },
263 	{ AR5K_RF_GAIN(20),	{ 0x00000000, 0x000001b0 } },
264 	{ AR5K_RF_GAIN(21),	{ 0x00000000, 0x000001f0 } },
265 	{ AR5K_RF_GAIN(22),	{ 0x00000000, 0x00000030 } },
266 	{ AR5K_RF_GAIN(23),	{ 0x00000000, 0x00000070 } },
267 	{ AR5K_RF_GAIN(24),	{ 0x00000000, 0x000000b0 } },
268 	{ AR5K_RF_GAIN(25),	{ 0x00000000, 0x000000f0 } },
269 	{ AR5K_RF_GAIN(26),	{ 0x00000000, 0x000000f0 } },
270 	{ AR5K_RF_GAIN(27),	{ 0x00000000, 0x000000f0 } },
271 	{ AR5K_RF_GAIN(28),	{ 0x00000000, 0x000000f0 } },
272 	{ AR5K_RF_GAIN(29),	{ 0x00000000, 0x000000f0 } },
273 	{ AR5K_RF_GAIN(30),	{ 0x00000000, 0x000000f0 } },
274 	{ AR5K_RF_GAIN(31),	{ 0x00000000, 0x000000f0 } },
275 	{ AR5K_RF_GAIN(32),	{ 0x00000000, 0x000000f0 } },
276 	{ AR5K_RF_GAIN(33),	{ 0x00000000, 0x000000f0 } },
277 	{ AR5K_RF_GAIN(34),	{ 0x00000000, 0x000000f0 } },
278 	{ AR5K_RF_GAIN(35),	{ 0x00000000, 0x000000f0 } },
279 	{ AR5K_RF_GAIN(36),	{ 0x00000000, 0x000000f0 } },
280 	{ AR5K_RF_GAIN(37),	{ 0x00000000, 0x000000f0 } },
281 	{ AR5K_RF_GAIN(38),	{ 0x00000000, 0x000000f0 } },
282 	{ AR5K_RF_GAIN(39),	{ 0x00000000, 0x000000f0 } },
283 	{ AR5K_RF_GAIN(40),	{ 0x00000000, 0x000000f0 } },
284 	{ AR5K_RF_GAIN(41),	{ 0x00000000, 0x000000f0 } },
285 	{ AR5K_RF_GAIN(42),	{ 0x00000000, 0x000000f0 } },
286 	{ AR5K_RF_GAIN(43),	{ 0x00000000, 0x000000f0 } },
287 	{ AR5K_RF_GAIN(44),	{ 0x00000000, 0x000000f0 } },
288 	{ AR5K_RF_GAIN(45),	{ 0x00000000, 0x000000f0 } },
289 	{ AR5K_RF_GAIN(46),	{ 0x00000000, 0x000000f0 } },
290 	{ AR5K_RF_GAIN(47),	{ 0x00000000, 0x000000f0 } },
291 	{ AR5K_RF_GAIN(48),	{ 0x00000000, 0x000000f0 } },
292 	{ AR5K_RF_GAIN(49),	{ 0x00000000, 0x000000f0 } },
293 	{ AR5K_RF_GAIN(50),	{ 0x00000000, 0x000000f0 } },
294 	{ AR5K_RF_GAIN(51),	{ 0x00000000, 0x000000f0 } },
295 	{ AR5K_RF_GAIN(52),	{ 0x00000000, 0x000000f0 } },
296 	{ AR5K_RF_GAIN(53),	{ 0x00000000, 0x000000f0 } },
297 	{ AR5K_RF_GAIN(54),	{ 0x00000000, 0x000000f0 } },
298 	{ AR5K_RF_GAIN(55),	{ 0x00000000, 0x000000f0 } },
299 	{ AR5K_RF_GAIN(56),	{ 0x00000000, 0x000000f0 } },
300 	{ AR5K_RF_GAIN(57),	{ 0x00000000, 0x000000f0 } },
301 	{ AR5K_RF_GAIN(58),	{ 0x00000000, 0x000000f0 } },
302 	{ AR5K_RF_GAIN(59),	{ 0x00000000, 0x000000f0 } },
303 	{ AR5K_RF_GAIN(60),	{ 0x00000000, 0x000000f0 } },
304 	{ AR5K_RF_GAIN(61),	{ 0x00000000, 0x000000f0 } },
305 	{ AR5K_RF_GAIN(62),	{ 0x00000000, 0x000000f0 } },
306 	{ AR5K_RF_GAIN(63),	{ 0x00000000, 0x000000f0 } },
307 };
308 
309 
310 /* Initial RF Gain settings for RF5413 */
311 static const struct ath5k_ini_rfgain rfgain_5413[] = {
312 	/*			      5GHz	2GHz	*/
313 	{ AR5K_RF_GAIN(0),	{ 0x00000000, 0x00000000 } },
314 	{ AR5K_RF_GAIN(1),	{ 0x00000040, 0x00000040 } },
315 	{ AR5K_RF_GAIN(2),	{ 0x00000080, 0x00000080 } },
316 	{ AR5K_RF_GAIN(3),	{ 0x000001a1, 0x00000161 } },
317 	{ AR5K_RF_GAIN(4),	{ 0x000001e1, 0x000001a1 } },
318 	{ AR5K_RF_GAIN(5),	{ 0x00000021, 0x000001e1 } },
319 	{ AR5K_RF_GAIN(6),	{ 0x00000061, 0x00000021 } },
320 	{ AR5K_RF_GAIN(7),	{ 0x00000188, 0x00000061 } },
321 	{ AR5K_RF_GAIN(8),	{ 0x000001c8, 0x00000188 } },
322 	{ AR5K_RF_GAIN(9),	{ 0x00000008, 0x000001c8 } },
323 	{ AR5K_RF_GAIN(10),	{ 0x00000048, 0x00000008 } },
324 	{ AR5K_RF_GAIN(11),	{ 0x00000088, 0x00000048 } },
325 	{ AR5K_RF_GAIN(12),	{ 0x000001a9, 0x00000088 } },
326 	{ AR5K_RF_GAIN(13),	{ 0x000001e9, 0x00000169 } },
327 	{ AR5K_RF_GAIN(14),	{ 0x00000029, 0x000001a9 } },
328 	{ AR5K_RF_GAIN(15),	{ 0x00000069, 0x000001e9 } },
329 	{ AR5K_RF_GAIN(16),	{ 0x000001d0, 0x00000029 } },
330 	{ AR5K_RF_GAIN(17),	{ 0x00000010, 0x00000069 } },
331 	{ AR5K_RF_GAIN(18),	{ 0x00000050, 0x00000190 } },
332 	{ AR5K_RF_GAIN(19),	{ 0x00000090, 0x000001d0 } },
333 	{ AR5K_RF_GAIN(20),	{ 0x000001b1, 0x00000010 } },
334 	{ AR5K_RF_GAIN(21),	{ 0x000001f1, 0x00000050 } },
335 	{ AR5K_RF_GAIN(22),	{ 0x00000031, 0x00000090 } },
336 	{ AR5K_RF_GAIN(23),	{ 0x00000071, 0x00000171 } },
337 	{ AR5K_RF_GAIN(24),	{ 0x000001b8, 0x000001b1 } },
338 	{ AR5K_RF_GAIN(25),	{ 0x000001f8, 0x000001f1 } },
339 	{ AR5K_RF_GAIN(26),	{ 0x00000038, 0x00000031 } },
340 	{ AR5K_RF_GAIN(27),	{ 0x00000078, 0x00000071 } },
341 	{ AR5K_RF_GAIN(28),	{ 0x00000199, 0x00000198 } },
342 	{ AR5K_RF_GAIN(29),	{ 0x000001d9, 0x000001d8 } },
343 	{ AR5K_RF_GAIN(30),	{ 0x00000019, 0x00000018 } },
344 	{ AR5K_RF_GAIN(31),	{ 0x00000059, 0x00000058 } },
345 	{ AR5K_RF_GAIN(32),	{ 0x00000099, 0x00000098 } },
346 	{ AR5K_RF_GAIN(33),	{ 0x000000d9, 0x00000179 } },
347 	{ AR5K_RF_GAIN(34),	{ 0x000000f9, 0x000001b9 } },
348 	{ AR5K_RF_GAIN(35),	{ 0x000000f9, 0x000001f9 } },
349 	{ AR5K_RF_GAIN(36),	{ 0x000000f9, 0x00000039 } },
350 	{ AR5K_RF_GAIN(37),	{ 0x000000f9, 0x00000079 } },
351 	{ AR5K_RF_GAIN(38),	{ 0x000000f9, 0x000000b9 } },
352 	{ AR5K_RF_GAIN(39),	{ 0x000000f9, 0x000000f9 } },
353 	{ AR5K_RF_GAIN(40),	{ 0x000000f9, 0x000000f9 } },
354 	{ AR5K_RF_GAIN(41),	{ 0x000000f9, 0x000000f9 } },
355 	{ AR5K_RF_GAIN(42),	{ 0x000000f9, 0x000000f9 } },
356 	{ AR5K_RF_GAIN(43),	{ 0x000000f9, 0x000000f9 } },
357 	{ AR5K_RF_GAIN(44),	{ 0x000000f9, 0x000000f9 } },
358 	{ AR5K_RF_GAIN(45),	{ 0x000000f9, 0x000000f9 } },
359 	{ AR5K_RF_GAIN(46),	{ 0x000000f9, 0x000000f9 } },
360 	{ AR5K_RF_GAIN(47),	{ 0x000000f9, 0x000000f9 } },
361 	{ AR5K_RF_GAIN(48),	{ 0x000000f9, 0x000000f9 } },
362 	{ AR5K_RF_GAIN(49),	{ 0x000000f9, 0x000000f9 } },
363 	{ AR5K_RF_GAIN(50),	{ 0x000000f9, 0x000000f9 } },
364 	{ AR5K_RF_GAIN(51),	{ 0x000000f9, 0x000000f9 } },
365 	{ AR5K_RF_GAIN(52),	{ 0x000000f9, 0x000000f9 } },
366 	{ AR5K_RF_GAIN(53),	{ 0x000000f9, 0x000000f9 } },
367 	{ AR5K_RF_GAIN(54),	{ 0x000000f9, 0x000000f9 } },
368 	{ AR5K_RF_GAIN(55),	{ 0x000000f9, 0x000000f9 } },
369 	{ AR5K_RF_GAIN(56),	{ 0x000000f9, 0x000000f9 } },
370 	{ AR5K_RF_GAIN(57),	{ 0x000000f9, 0x000000f9 } },
371 	{ AR5K_RF_GAIN(58),	{ 0x000000f9, 0x000000f9 } },
372 	{ AR5K_RF_GAIN(59),	{ 0x000000f9, 0x000000f9 } },
373 	{ AR5K_RF_GAIN(60),	{ 0x000000f9, 0x000000f9 } },
374 	{ AR5K_RF_GAIN(61),	{ 0x000000f9, 0x000000f9 } },
375 	{ AR5K_RF_GAIN(62),	{ 0x000000f9, 0x000000f9 } },
376 	{ AR5K_RF_GAIN(63),	{ 0x000000f9, 0x000000f9 } },
377 };
378 
379 
380 /* Initial RF Gain settings for RF2425 */
381 static const struct ath5k_ini_rfgain rfgain_2425[] = {
382 	{ AR5K_RF_GAIN(0),	{ 0x00000000, 0x00000000 } },
383 	{ AR5K_RF_GAIN(1),	{ 0x00000000, 0x00000040 } },
384 	{ AR5K_RF_GAIN(2),	{ 0x00000000, 0x00000080 } },
385 	{ AR5K_RF_GAIN(3),	{ 0x00000000, 0x00000181 } },
386 	{ AR5K_RF_GAIN(4),	{ 0x00000000, 0x000001c1 } },
387 	{ AR5K_RF_GAIN(5),	{ 0x00000000, 0x00000001 } },
388 	{ AR5K_RF_GAIN(6),	{ 0x00000000, 0x00000041 } },
389 	{ AR5K_RF_GAIN(7),	{ 0x00000000, 0x00000081 } },
390 	{ AR5K_RF_GAIN(8),	{ 0x00000000, 0x00000188 } },
391 	{ AR5K_RF_GAIN(9),	{ 0x00000000, 0x000001c8 } },
392 	{ AR5K_RF_GAIN(10),	{ 0x00000000, 0x00000008 } },
393 	{ AR5K_RF_GAIN(11),	{ 0x00000000, 0x00000048 } },
394 	{ AR5K_RF_GAIN(12),	{ 0x00000000, 0x00000088 } },
395 	{ AR5K_RF_GAIN(13),	{ 0x00000000, 0x00000189 } },
396 	{ AR5K_RF_GAIN(14),	{ 0x00000000, 0x000001c9 } },
397 	{ AR5K_RF_GAIN(15),	{ 0x00000000, 0x00000009 } },
398 	{ AR5K_RF_GAIN(16),	{ 0x00000000, 0x00000049 } },
399 	{ AR5K_RF_GAIN(17),	{ 0x00000000, 0x00000089 } },
400 	{ AR5K_RF_GAIN(18),	{ 0x00000000, 0x000001b0 } },
401 	{ AR5K_RF_GAIN(19),	{ 0x00000000, 0x000001f0 } },
402 	{ AR5K_RF_GAIN(20),	{ 0x00000000, 0x00000030 } },
403 	{ AR5K_RF_GAIN(21),	{ 0x00000000, 0x00000070 } },
404 	{ AR5K_RF_GAIN(22),	{ 0x00000000, 0x00000171 } },
405 	{ AR5K_RF_GAIN(23),	{ 0x00000000, 0x000001b1 } },
406 	{ AR5K_RF_GAIN(24),	{ 0x00000000, 0x000001f1 } },
407 	{ AR5K_RF_GAIN(25),	{ 0x00000000, 0x00000031 } },
408 	{ AR5K_RF_GAIN(26),	{ 0x00000000, 0x00000071 } },
409 	{ AR5K_RF_GAIN(27),	{ 0x00000000, 0x000001b8 } },
410 	{ AR5K_RF_GAIN(28),	{ 0x00000000, 0x000001f8 } },
411 	{ AR5K_RF_GAIN(29),	{ 0x00000000, 0x00000038 } },
412 	{ AR5K_RF_GAIN(30),	{ 0x00000000, 0x00000078 } },
413 	{ AR5K_RF_GAIN(31),	{ 0x00000000, 0x000000b8 } },
414 	{ AR5K_RF_GAIN(32),	{ 0x00000000, 0x000001b9 } },
415 	{ AR5K_RF_GAIN(33),	{ 0x00000000, 0x000001f9 } },
416 	{ AR5K_RF_GAIN(34),	{ 0x00000000, 0x00000039 } },
417 	{ AR5K_RF_GAIN(35),	{ 0x00000000, 0x00000079 } },
418 	{ AR5K_RF_GAIN(36),	{ 0x00000000, 0x000000b9 } },
419 	{ AR5K_RF_GAIN(37),	{ 0x00000000, 0x000000f9 } },
420 	{ AR5K_RF_GAIN(38),	{ 0x00000000, 0x000000f9 } },
421 	{ AR5K_RF_GAIN(39),	{ 0x00000000, 0x000000f9 } },
422 	{ AR5K_RF_GAIN(40),	{ 0x00000000, 0x000000f9 } },
423 	{ AR5K_RF_GAIN(41),	{ 0x00000000, 0x000000f9 } },
424 	{ AR5K_RF_GAIN(42),	{ 0x00000000, 0x000000f9 } },
425 	{ AR5K_RF_GAIN(43),	{ 0x00000000, 0x000000f9 } },
426 	{ AR5K_RF_GAIN(44),	{ 0x00000000, 0x000000f9 } },
427 	{ AR5K_RF_GAIN(45),	{ 0x00000000, 0x000000f9 } },
428 	{ AR5K_RF_GAIN(46),	{ 0x00000000, 0x000000f9 } },
429 	{ AR5K_RF_GAIN(47),	{ 0x00000000, 0x000000f9 } },
430 	{ AR5K_RF_GAIN(48),	{ 0x00000000, 0x000000f9 } },
431 	{ AR5K_RF_GAIN(49),	{ 0x00000000, 0x000000f9 } },
432 	{ AR5K_RF_GAIN(50),	{ 0x00000000, 0x000000f9 } },
433 	{ AR5K_RF_GAIN(51),	{ 0x00000000, 0x000000f9 } },
434 	{ AR5K_RF_GAIN(52),	{ 0x00000000, 0x000000f9 } },
435 	{ AR5K_RF_GAIN(53),	{ 0x00000000, 0x000000f9 } },
436 	{ AR5K_RF_GAIN(54),	{ 0x00000000, 0x000000f9 } },
437 	{ AR5K_RF_GAIN(55),	{ 0x00000000, 0x000000f9 } },
438 	{ AR5K_RF_GAIN(56),	{ 0x00000000, 0x000000f9 } },
439 	{ AR5K_RF_GAIN(57),	{ 0x00000000, 0x000000f9 } },
440 	{ AR5K_RF_GAIN(58),	{ 0x00000000, 0x000000f9 } },
441 	{ AR5K_RF_GAIN(59),	{ 0x00000000, 0x000000f9 } },
442 	{ AR5K_RF_GAIN(60),	{ 0x00000000, 0x000000f9 } },
443 	{ AR5K_RF_GAIN(61),	{ 0x00000000, 0x000000f9 } },
444 	{ AR5K_RF_GAIN(62),	{ 0x00000000, 0x000000f9 } },
445 	{ AR5K_RF_GAIN(63),	{ 0x00000000, 0x000000f9 } },
446 };
447 
448 #define AR5K_GAIN_CRN_FIX_BITS_5111		4
449 #define AR5K_GAIN_CRN_FIX_BITS_5112		7
450 #define AR5K_GAIN_CRN_MAX_FIX_BITS		AR5K_GAIN_CRN_FIX_BITS_5112
451 #define AR5K_GAIN_DYN_ADJUST_HI_MARGIN		15
452 #define AR5K_GAIN_DYN_ADJUST_LO_MARGIN		20
453 #define AR5K_GAIN_CCK_PROBE_CORR		5
454 #define AR5K_GAIN_CCK_OFDM_GAIN_DELTA		15
455 #define AR5K_GAIN_STEP_COUNT			10
456 
457 /* Check if our current measurement is inside our
458  * current variable attenuation window */
459 #define AR5K_GAIN_CHECK_ADJUST(_g)		\
460 	((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high)
461 
462 /**
463  * struct ath5k_gain_opt_step - An RF gain optimization step
464  * @gos_param: Set of parameters
465  * @gos_gain: Gain
466  */
467 struct ath5k_gain_opt_step {
468 	s8				gos_param[AR5K_GAIN_CRN_MAX_FIX_BITS];
469 	s8				gos_gain;
470 };
471 
472 /**
473  * struct ath5k_gain_opt - RF Gain optimization ladder
474  * @go_default: The default step
475  * @go_steps_count: How many optimization steps
476  * @go_step: Array of &struct ath5k_gain_opt_step
477  */
478 struct ath5k_gain_opt {
479 	u8				go_default;
480 	u8				go_steps_count;
481 	const struct ath5k_gain_opt_step	go_step[AR5K_GAIN_STEP_COUNT];
482 };
483 
484 
485 /*
486  * RF5111
487  * Parameters on gos_param:
488  * 1) Tx clip PHY register
489  * 2) PWD 90 RF register
490  * 3) PWD 84 RF register
491  * 4) RFGainSel RF register
492  */
493 static const struct ath5k_gain_opt rfgain_opt_5111 = {
494 	4,
495 	9,
496 	{
497 		{ { 4, 1, 1, 1 }, 6 },
498 		{ { 4, 0, 1, 1 }, 4 },
499 		{ { 3, 1, 1, 1 }, 3 },
500 		{ { 4, 0, 0, 1 }, 1 },
501 		{ { 4, 1, 1, 0 }, 0 },
502 		{ { 4, 0, 1, 0 }, -2 },
503 		{ { 3, 1, 1, 0 }, -3 },
504 		{ { 4, 0, 0, 0 }, -4 },
505 		{ { 2, 1, 1, 0 }, -6 }
506 	}
507 };
508 
509 /*
510  * RF5112
511  * Parameters on gos_param:
512  * 1) Mixgain ovr RF register
513  * 2) PWD 138 RF register
514  * 3) PWD 137 RF register
515  * 4) PWD 136 RF register
516  * 5) PWD 132 RF register
517  * 6) PWD 131 RF register
518  * 7) PWD 130 RF register
519  */
520 static const struct ath5k_gain_opt rfgain_opt_5112 = {
521 	1,
522 	8,
523 	{
524 		{ { 3, 0, 0, 0, 0, 0, 0 }, 6 },
525 		{ { 2, 0, 0, 0, 0, 0, 0 }, 0 },
526 		{ { 1, 0, 0, 0, 0, 0, 0 }, -3 },
527 		{ { 0, 0, 0, 0, 0, 0, 0 }, -6 },
528 		{ { 0, 1, 1, 0, 0, 0, 0 }, -8 },
529 		{ { 0, 1, 1, 0, 1, 1, 0 }, -10 },
530 		{ { 0, 1, 0, 1, 1, 1, 0 }, -13 },
531 		{ { 0, 1, 0, 1, 1, 0, 1 }, -16 },
532 	}
533 };
534 
535