|
|
1.1 root 1: /*
2: * RF Gain optimization
3: *
4: * Copyright (c) 2004-2009 Reyk Floeter <[email protected]>
5: * Copyright (c) 2006-2009 Nick Kossifidis <[email protected]>
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.