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