Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * RF Gain optimization
0003  *
0004  * Copyright (c) 2004-2009 Reyk Floeter <reyk@openbsd.org>
0005  * Copyright (c) 2006-2009 Nick Kossifidis <mickflemm@gmail.com>
0006  *
0007  * Permission to use, copy, modify, and distribute this software for any
0008  * purpose with or without fee is hereby granted, provided that the above
0009  * copyright notice and this permission notice appear in all copies.
0010  *
0011  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
0012  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
0013  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
0014  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
0015  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
0016  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
0017  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
0018  *
0019  */
0020 
0021 /**
0022  * struct ath5k_ini_rfgain - RF Gain table
0023  * @rfg_register: RF Gain register address
0024  * @rfg_value: Register value for 5 and 2GHz
0025  *
0026  * Mode-specific RF Gain table (64bytes) for RF5111/5112
0027  * (RF5110 only comes with AR5210 and only supports a/turbo a mode so initial
0028  * RF Gain values are included in AR5K_AR5210_INI)
0029  */
0030 struct ath5k_ini_rfgain {
0031     u16 rfg_register;
0032     u32 rfg_value[2];   /* [freq (see below)] */
0033 };
0034 
0035 /* Initial RF Gain settings for RF5111 */
0036 static const struct ath5k_ini_rfgain rfgain_5111[] = {
0037     /*                5GHz  2GHz    */
0038     { AR5K_RF_GAIN(0),  { 0x000001a9, 0x00000000 } },
0039     { AR5K_RF_GAIN(1),  { 0x000001e9, 0x00000040 } },
0040     { AR5K_RF_GAIN(2),  { 0x00000029, 0x00000080 } },
0041     { AR5K_RF_GAIN(3),  { 0x00000069, 0x00000150 } },
0042     { AR5K_RF_GAIN(4),  { 0x00000199, 0x00000190 } },
0043     { AR5K_RF_GAIN(5),  { 0x000001d9, 0x000001d0 } },
0044     { AR5K_RF_GAIN(6),  { 0x00000019, 0x00000010 } },
0045     { AR5K_RF_GAIN(7),  { 0x00000059, 0x00000044 } },
0046     { AR5K_RF_GAIN(8),  { 0x00000099, 0x00000084 } },
0047     { AR5K_RF_GAIN(9),  { 0x000001a5, 0x00000148 } },
0048     { AR5K_RF_GAIN(10), { 0x000001e5, 0x00000188 } },
0049     { AR5K_RF_GAIN(11), { 0x00000025, 0x000001c8 } },
0050     { AR5K_RF_GAIN(12), { 0x000001c8, 0x00000014 } },
0051     { AR5K_RF_GAIN(13), { 0x00000008, 0x00000042 } },
0052     { AR5K_RF_GAIN(14), { 0x00000048, 0x00000082 } },
0053     { AR5K_RF_GAIN(15), { 0x00000088, 0x00000178 } },
0054     { AR5K_RF_GAIN(16), { 0x00000198, 0x000001b8 } },
0055     { AR5K_RF_GAIN(17), { 0x000001d8, 0x000001f8 } },
0056     { AR5K_RF_GAIN(18), { 0x00000018, 0x00000012 } },
0057     { AR5K_RF_GAIN(19), { 0x00000058, 0x00000052 } },
0058     { AR5K_RF_GAIN(20), { 0x00000098, 0x00000092 } },
0059     { AR5K_RF_GAIN(21), { 0x000001a4, 0x0000017c } },
0060     { AR5K_RF_GAIN(22), { 0x000001e4, 0x000001bc } },
0061     { AR5K_RF_GAIN(23), { 0x00000024, 0x000001fc } },
0062     { AR5K_RF_GAIN(24), { 0x00000064, 0x0000000a } },
0063     { AR5K_RF_GAIN(25), { 0x000000a4, 0x0000004a } },
0064     { AR5K_RF_GAIN(26), { 0x000000e4, 0x0000008a } },
0065     { AR5K_RF_GAIN(27), { 0x0000010a, 0x0000015a } },
0066     { AR5K_RF_GAIN(28), { 0x0000014a, 0x0000019a } },
0067     { AR5K_RF_GAIN(29), { 0x0000018a, 0x000001da } },
0068     { AR5K_RF_GAIN(30), { 0x000001ca, 0x0000000e } },
0069     { AR5K_RF_GAIN(31), { 0x0000000a, 0x0000004e } },
0070     { AR5K_RF_GAIN(32), { 0x0000004a, 0x0000008e } },
0071     { AR5K_RF_GAIN(33), { 0x0000008a, 0x0000015e } },
0072     { AR5K_RF_GAIN(34), { 0x000001ba, 0x0000019e } },
0073     { AR5K_RF_GAIN(35), { 0x000001fa, 0x000001de } },
0074     { AR5K_RF_GAIN(36), { 0x0000003a, 0x00000009 } },
0075     { AR5K_RF_GAIN(37), { 0x0000007a, 0x00000049 } },
0076     { AR5K_RF_GAIN(38), { 0x00000186, 0x00000089 } },
0077     { AR5K_RF_GAIN(39), { 0x000001c6, 0x00000179 } },
0078     { AR5K_RF_GAIN(40), { 0x00000006, 0x000001b9 } },
0079     { AR5K_RF_GAIN(41), { 0x00000046, 0x000001f9 } },
0080     { AR5K_RF_GAIN(42), { 0x00000086, 0x00000039 } },
0081     { AR5K_RF_GAIN(43), { 0x000000c6, 0x00000079 } },
0082     { AR5K_RF_GAIN(44), { 0x000000c6, 0x000000b9 } },
0083     { AR5K_RF_GAIN(45), { 0x000000c6, 0x000001bd } },
0084     { AR5K_RF_GAIN(46), { 0x000000c6, 0x000001fd } },
0085     { AR5K_RF_GAIN(47), { 0x000000c6, 0x0000003d } },
0086     { AR5K_RF_GAIN(48), { 0x000000c6, 0x0000007d } },
0087     { AR5K_RF_GAIN(49), { 0x000000c6, 0x000000bd } },
0088     { AR5K_RF_GAIN(50), { 0x000000c6, 0x000000fd } },
0089     { AR5K_RF_GAIN(51), { 0x000000c6, 0x000000fd } },
0090     { AR5K_RF_GAIN(52), { 0x000000c6, 0x000000fd } },
0091     { AR5K_RF_GAIN(53), { 0x000000c6, 0x000000fd } },
0092     { AR5K_RF_GAIN(54), { 0x000000c6, 0x000000fd } },
0093     { AR5K_RF_GAIN(55), { 0x000000c6, 0x000000fd } },
0094     { AR5K_RF_GAIN(56), { 0x000000c6, 0x000000fd } },
0095     { AR5K_RF_GAIN(57), { 0x000000c6, 0x000000fd } },
0096     { AR5K_RF_GAIN(58), { 0x000000c6, 0x000000fd } },
0097     { AR5K_RF_GAIN(59), { 0x000000c6, 0x000000fd } },
0098     { AR5K_RF_GAIN(60), { 0x000000c6, 0x000000fd } },
0099     { AR5K_RF_GAIN(61), { 0x000000c6, 0x000000fd } },
0100     { AR5K_RF_GAIN(62), { 0x000000c6, 0x000000fd } },
0101     { AR5K_RF_GAIN(63), { 0x000000c6, 0x000000fd } },
0102 };
0103 
0104 /* Initial RF Gain settings for RF5112 */
0105 static const struct ath5k_ini_rfgain rfgain_5112[] = {
0106     /*                5GHz  2GHz    */
0107     { AR5K_RF_GAIN(0),  { 0x00000007, 0x00000007 } },
0108     { AR5K_RF_GAIN(1),  { 0x00000047, 0x00000047 } },
0109     { AR5K_RF_GAIN(2),  { 0x00000087, 0x00000087 } },
0110     { AR5K_RF_GAIN(3),  { 0x000001a0, 0x000001a0 } },
0111     { AR5K_RF_GAIN(4),  { 0x000001e0, 0x000001e0 } },
0112     { AR5K_RF_GAIN(5),  { 0x00000020, 0x00000020 } },
0113     { AR5K_RF_GAIN(6),  { 0x00000060, 0x00000060 } },
0114     { AR5K_RF_GAIN(7),  { 0x000001a1, 0x000001a1 } },
0115     { AR5K_RF_GAIN(8),  { 0x000001e1, 0x000001e1 } },
0116     { AR5K_RF_GAIN(9),  { 0x00000021, 0x00000021 } },
0117     { AR5K_RF_GAIN(10), { 0x00000061, 0x00000061 } },
0118     { AR5K_RF_GAIN(11), { 0x00000162, 0x00000162 } },
0119     { AR5K_RF_GAIN(12), { 0x000001a2, 0x000001a2 } },
0120     { AR5K_RF_GAIN(13), { 0x000001e2, 0x000001e2 } },
0121     { AR5K_RF_GAIN(14), { 0x00000022, 0x00000022 } },
0122     { AR5K_RF_GAIN(15), { 0x00000062, 0x00000062 } },
0123     { AR5K_RF_GAIN(16), { 0x00000163, 0x00000163 } },
0124     { AR5K_RF_GAIN(17), { 0x000001a3, 0x000001a3 } },
0125     { AR5K_RF_GAIN(18), { 0x000001e3, 0x000001e3 } },
0126     { AR5K_RF_GAIN(19), { 0x00000023, 0x00000023 } },
0127     { AR5K_RF_GAIN(20), { 0x00000063, 0x00000063 } },
0128     { AR5K_RF_GAIN(21), { 0x00000184, 0x00000184 } },
0129     { AR5K_RF_GAIN(22), { 0x000001c4, 0x000001c4 } },
0130     { AR5K_RF_GAIN(23), { 0x00000004, 0x00000004 } },
0131     { AR5K_RF_GAIN(24), { 0x000001ea, 0x0000000b } },
0132     { AR5K_RF_GAIN(25), { 0x0000002a, 0x0000004b } },
0133     { AR5K_RF_GAIN(26), { 0x0000006a, 0x0000008b } },
0134     { AR5K_RF_GAIN(27), { 0x000000aa, 0x000001ac } },
0135     { AR5K_RF_GAIN(28), { 0x000001ab, 0x000001ec } },
0136     { AR5K_RF_GAIN(29), { 0x000001eb, 0x0000002c } },
0137     { AR5K_RF_GAIN(30), { 0x0000002b, 0x00000012 } },
0138     { AR5K_RF_GAIN(31), { 0x0000006b, 0x00000052 } },
0139     { AR5K_RF_GAIN(32), { 0x000000ab, 0x00000092 } },
0140     { AR5K_RF_GAIN(33), { 0x000001ac, 0x00000193 } },
0141     { AR5K_RF_GAIN(34), { 0x000001ec, 0x000001d3 } },
0142     { AR5K_RF_GAIN(35), { 0x0000002c, 0x00000013 } },
0143     { AR5K_RF_GAIN(36), { 0x0000003a, 0x00000053 } },
0144     { AR5K_RF_GAIN(37), { 0x0000007a, 0x00000093 } },
0145     { AR5K_RF_GAIN(38), { 0x000000ba, 0x00000194 } },
0146     { AR5K_RF_GAIN(39), { 0x000001bb, 0x000001d4 } },
0147     { AR5K_RF_GAIN(40), { 0x000001fb, 0x00000014 } },
0148     { AR5K_RF_GAIN(41), { 0x0000003b, 0x0000003a } },
0149     { AR5K_RF_GAIN(42), { 0x0000007b, 0x0000007a } },
0150     { AR5K_RF_GAIN(43), { 0x000000bb, 0x000000ba } },
0151     { AR5K_RF_GAIN(44), { 0x000001bc, 0x000001bb } },
0152     { AR5K_RF_GAIN(45), { 0x000001fc, 0x000001fb } },
0153     { AR5K_RF_GAIN(46), { 0x0000003c, 0x0000003b } },
0154     { AR5K_RF_GAIN(47), { 0x0000007c, 0x0000007b } },
0155     { AR5K_RF_GAIN(48), { 0x000000bc, 0x000000bb } },
0156     { AR5K_RF_GAIN(49), { 0x000000fc, 0x000001bc } },
0157     { AR5K_RF_GAIN(50), { 0x000000fc, 0x000001fc } },
0158     { AR5K_RF_GAIN(51), { 0x000000fc, 0x0000003c } },
0159     { AR5K_RF_GAIN(52), { 0x000000fc, 0x0000007c } },
0160     { AR5K_RF_GAIN(53), { 0x000000fc, 0x000000bc } },
0161     { AR5K_RF_GAIN(54), { 0x000000fc, 0x000000fc } },
0162     { AR5K_RF_GAIN(55), { 0x000000fc, 0x000000fc } },
0163     { AR5K_RF_GAIN(56), { 0x000000fc, 0x000000fc } },
0164     { AR5K_RF_GAIN(57), { 0x000000fc, 0x000000fc } },
0165     { AR5K_RF_GAIN(58), { 0x000000fc, 0x000000fc } },
0166     { AR5K_RF_GAIN(59), { 0x000000fc, 0x000000fc } },
0167     { AR5K_RF_GAIN(60), { 0x000000fc, 0x000000fc } },
0168     { AR5K_RF_GAIN(61), { 0x000000fc, 0x000000fc } },
0169     { AR5K_RF_GAIN(62), { 0x000000fc, 0x000000fc } },
0170     { AR5K_RF_GAIN(63), { 0x000000fc, 0x000000fc } },
0171 };
0172 
0173 /* Initial RF Gain settings for RF2413 */
0174 static const struct ath5k_ini_rfgain rfgain_2413[] = {
0175     { AR5K_RF_GAIN(0),  { 0x00000000, 0x00000000 } },
0176     { AR5K_RF_GAIN(1),  { 0x00000000, 0x00000040 } },
0177     { AR5K_RF_GAIN(2),  { 0x00000000, 0x00000080 } },
0178     { AR5K_RF_GAIN(3),  { 0x00000000, 0x00000181 } },
0179     { AR5K_RF_GAIN(4),  { 0x00000000, 0x000001c1 } },
0180     { AR5K_RF_GAIN(5),  { 0x00000000, 0x00000001 } },
0181     { AR5K_RF_GAIN(6),  { 0x00000000, 0x00000041 } },
0182     { AR5K_RF_GAIN(7),  { 0x00000000, 0x00000081 } },
0183     { AR5K_RF_GAIN(8),  { 0x00000000, 0x00000168 } },
0184     { AR5K_RF_GAIN(9),  { 0x00000000, 0x000001a8 } },
0185     { AR5K_RF_GAIN(10), { 0x00000000, 0x000001e8 } },
0186     { AR5K_RF_GAIN(11), { 0x00000000, 0x00000028 } },
0187     { AR5K_RF_GAIN(12), { 0x00000000, 0x00000068 } },
0188     { AR5K_RF_GAIN(13), { 0x00000000, 0x00000189 } },
0189     { AR5K_RF_GAIN(14), { 0x00000000, 0x000001c9 } },
0190     { AR5K_RF_GAIN(15), { 0x00000000, 0x00000009 } },
0191     { AR5K_RF_GAIN(16), { 0x00000000, 0x00000049 } },
0192     { AR5K_RF_GAIN(17), { 0x00000000, 0x00000089 } },
0193     { AR5K_RF_GAIN(18), { 0x00000000, 0x00000190 } },
0194     { AR5K_RF_GAIN(19), { 0x00000000, 0x000001d0 } },
0195     { AR5K_RF_GAIN(20), { 0x00000000, 0x00000010 } },
0196     { AR5K_RF_GAIN(21), { 0x00000000, 0x00000050 } },
0197     { AR5K_RF_GAIN(22), { 0x00000000, 0x00000090 } },
0198     { AR5K_RF_GAIN(23), { 0x00000000, 0x00000191 } },
0199     { AR5K_RF_GAIN(24), { 0x00000000, 0x000001d1 } },
0200     { AR5K_RF_GAIN(25), { 0x00000000, 0x00000011 } },
0201     { AR5K_RF_GAIN(26), { 0x00000000, 0x00000051 } },
0202     { AR5K_RF_GAIN(27), { 0x00000000, 0x00000091 } },
0203     { AR5K_RF_GAIN(28), { 0x00000000, 0x00000178 } },
0204     { AR5K_RF_GAIN(29), { 0x00000000, 0x000001b8 } },
0205     { AR5K_RF_GAIN(30), { 0x00000000, 0x000001f8 } },
0206     { AR5K_RF_GAIN(31), { 0x00000000, 0x00000038 } },
0207     { AR5K_RF_GAIN(32), { 0x00000000, 0x00000078 } },
0208     { AR5K_RF_GAIN(33), { 0x00000000, 0x00000199 } },
0209     { AR5K_RF_GAIN(34), { 0x00000000, 0x000001d9 } },
0210     { AR5K_RF_GAIN(35), { 0x00000000, 0x00000019 } },
0211     { AR5K_RF_GAIN(36), { 0x00000000, 0x00000059 } },
0212     { AR5K_RF_GAIN(37), { 0x00000000, 0x00000099 } },
0213     { AR5K_RF_GAIN(38), { 0x00000000, 0x000000d9 } },
0214     { AR5K_RF_GAIN(39), { 0x00000000, 0x000000f9 } },
0215     { AR5K_RF_GAIN(40), { 0x00000000, 0x000000f9 } },
0216     { AR5K_RF_GAIN(41), { 0x00000000, 0x000000f9 } },
0217     { AR5K_RF_GAIN(42), { 0x00000000, 0x000000f9 } },
0218     { AR5K_RF_GAIN(43), { 0x00000000, 0x000000f9 } },
0219     { AR5K_RF_GAIN(44), { 0x00000000, 0x000000f9 } },
0220     { AR5K_RF_GAIN(45), { 0x00000000, 0x000000f9 } },
0221     { AR5K_RF_GAIN(46), { 0x00000000, 0x000000f9 } },
0222     { AR5K_RF_GAIN(47), { 0x00000000, 0x000000f9 } },
0223     { AR5K_RF_GAIN(48), { 0x00000000, 0x000000f9 } },
0224     { AR5K_RF_GAIN(49), { 0x00000000, 0x000000f9 } },
0225     { AR5K_RF_GAIN(50), { 0x00000000, 0x000000f9 } },
0226     { AR5K_RF_GAIN(51), { 0x00000000, 0x000000f9 } },
0227     { AR5K_RF_GAIN(52), { 0x00000000, 0x000000f9 } },
0228     { AR5K_RF_GAIN(53), { 0x00000000, 0x000000f9 } },
0229     { AR5K_RF_GAIN(54), { 0x00000000, 0x000000f9 } },
0230     { AR5K_RF_GAIN(55), { 0x00000000, 0x000000f9 } },
0231     { AR5K_RF_GAIN(56), { 0x00000000, 0x000000f9 } },
0232     { AR5K_RF_GAIN(57), { 0x00000000, 0x000000f9 } },
0233     { AR5K_RF_GAIN(58), { 0x00000000, 0x000000f9 } },
0234     { AR5K_RF_GAIN(59), { 0x00000000, 0x000000f9 } },
0235     { AR5K_RF_GAIN(60), { 0x00000000, 0x000000f9 } },
0236     { AR5K_RF_GAIN(61), { 0x00000000, 0x000000f9 } },
0237     { AR5K_RF_GAIN(62), { 0x00000000, 0x000000f9 } },
0238     { AR5K_RF_GAIN(63), { 0x00000000, 0x000000f9 } },
0239 };
0240 
0241 /* Initial RF Gain settings for AR2316 */
0242 static const struct ath5k_ini_rfgain rfgain_2316[] = {
0243     { AR5K_RF_GAIN(0),  { 0x00000000, 0x00000000 } },
0244     { AR5K_RF_GAIN(1),  { 0x00000000, 0x00000040 } },
0245     { AR5K_RF_GAIN(2),  { 0x00000000, 0x00000080 } },
0246     { AR5K_RF_GAIN(3),  { 0x00000000, 0x000000c0 } },
0247     { AR5K_RF_GAIN(4),  { 0x00000000, 0x000000e0 } },
0248     { AR5K_RF_GAIN(5),  { 0x00000000, 0x000000e0 } },
0249     { AR5K_RF_GAIN(6),  { 0x00000000, 0x00000128 } },
0250     { AR5K_RF_GAIN(7),  { 0x00000000, 0x00000128 } },
0251     { AR5K_RF_GAIN(8),  { 0x00000000, 0x00000128 } },
0252     { AR5K_RF_GAIN(9),  { 0x00000000, 0x00000168 } },
0253     { AR5K_RF_GAIN(10), { 0x00000000, 0x000001a8 } },
0254     { AR5K_RF_GAIN(11), { 0x00000000, 0x000001e8 } },
0255     { AR5K_RF_GAIN(12), { 0x00000000, 0x00000028 } },
0256     { AR5K_RF_GAIN(13), { 0x00000000, 0x00000068 } },
0257     { AR5K_RF_GAIN(14), { 0x00000000, 0x000000a8 } },
0258     { AR5K_RF_GAIN(15), { 0x00000000, 0x000000e8 } },
0259     { AR5K_RF_GAIN(16), { 0x00000000, 0x000000e8 } },
0260     { AR5K_RF_GAIN(17), { 0x00000000, 0x00000130 } },
0261     { AR5K_RF_GAIN(18), { 0x00000000, 0x00000130 } },
0262     { AR5K_RF_GAIN(19), { 0x00000000, 0x00000170 } },
0263     { AR5K_RF_GAIN(20), { 0x00000000, 0x000001b0 } },
0264     { AR5K_RF_GAIN(21), { 0x00000000, 0x000001f0 } },
0265     { AR5K_RF_GAIN(22), { 0x00000000, 0x00000030 } },
0266     { AR5K_RF_GAIN(23), { 0x00000000, 0x00000070 } },
0267     { AR5K_RF_GAIN(24), { 0x00000000, 0x000000b0 } },
0268     { AR5K_RF_GAIN(25), { 0x00000000, 0x000000f0 } },
0269     { AR5K_RF_GAIN(26), { 0x00000000, 0x000000f0 } },
0270     { AR5K_RF_GAIN(27), { 0x00000000, 0x000000f0 } },
0271     { AR5K_RF_GAIN(28), { 0x00000000, 0x000000f0 } },
0272     { AR5K_RF_GAIN(29), { 0x00000000, 0x000000f0 } },
0273     { AR5K_RF_GAIN(30), { 0x00000000, 0x000000f0 } },
0274     { AR5K_RF_GAIN(31), { 0x00000000, 0x000000f0 } },
0275     { AR5K_RF_GAIN(32), { 0x00000000, 0x000000f0 } },
0276     { AR5K_RF_GAIN(33), { 0x00000000, 0x000000f0 } },
0277     { AR5K_RF_GAIN(34), { 0x00000000, 0x000000f0 } },
0278     { AR5K_RF_GAIN(35), { 0x00000000, 0x000000f0 } },
0279     { AR5K_RF_GAIN(36), { 0x00000000, 0x000000f0 } },
0280     { AR5K_RF_GAIN(37), { 0x00000000, 0x000000f0 } },
0281     { AR5K_RF_GAIN(38), { 0x00000000, 0x000000f0 } },
0282     { AR5K_RF_GAIN(39), { 0x00000000, 0x000000f0 } },
0283     { AR5K_RF_GAIN(40), { 0x00000000, 0x000000f0 } },
0284     { AR5K_RF_GAIN(41), { 0x00000000, 0x000000f0 } },
0285     { AR5K_RF_GAIN(42), { 0x00000000, 0x000000f0 } },
0286     { AR5K_RF_GAIN(43), { 0x00000000, 0x000000f0 } },
0287     { AR5K_RF_GAIN(44), { 0x00000000, 0x000000f0 } },
0288     { AR5K_RF_GAIN(45), { 0x00000000, 0x000000f0 } },
0289     { AR5K_RF_GAIN(46), { 0x00000000, 0x000000f0 } },
0290     { AR5K_RF_GAIN(47), { 0x00000000, 0x000000f0 } },
0291     { AR5K_RF_GAIN(48), { 0x00000000, 0x000000f0 } },
0292     { AR5K_RF_GAIN(49), { 0x00000000, 0x000000f0 } },
0293     { AR5K_RF_GAIN(50), { 0x00000000, 0x000000f0 } },
0294     { AR5K_RF_GAIN(51), { 0x00000000, 0x000000f0 } },
0295     { AR5K_RF_GAIN(52), { 0x00000000, 0x000000f0 } },
0296     { AR5K_RF_GAIN(53), { 0x00000000, 0x000000f0 } },
0297     { AR5K_RF_GAIN(54), { 0x00000000, 0x000000f0 } },
0298     { AR5K_RF_GAIN(55), { 0x00000000, 0x000000f0 } },
0299     { AR5K_RF_GAIN(56), { 0x00000000, 0x000000f0 } },
0300     { AR5K_RF_GAIN(57), { 0x00000000, 0x000000f0 } },
0301     { AR5K_RF_GAIN(58), { 0x00000000, 0x000000f0 } },
0302     { AR5K_RF_GAIN(59), { 0x00000000, 0x000000f0 } },
0303     { AR5K_RF_GAIN(60), { 0x00000000, 0x000000f0 } },
0304     { AR5K_RF_GAIN(61), { 0x00000000, 0x000000f0 } },
0305     { AR5K_RF_GAIN(62), { 0x00000000, 0x000000f0 } },
0306     { AR5K_RF_GAIN(63), { 0x00000000, 0x000000f0 } },
0307 };
0308 
0309 
0310 /* Initial RF Gain settings for RF5413 */
0311 static const struct ath5k_ini_rfgain rfgain_5413[] = {
0312     /*                5GHz  2GHz    */
0313     { AR5K_RF_GAIN(0),  { 0x00000000, 0x00000000 } },
0314     { AR5K_RF_GAIN(1),  { 0x00000040, 0x00000040 } },
0315     { AR5K_RF_GAIN(2),  { 0x00000080, 0x00000080 } },
0316     { AR5K_RF_GAIN(3),  { 0x000001a1, 0x00000161 } },
0317     { AR5K_RF_GAIN(4),  { 0x000001e1, 0x000001a1 } },
0318     { AR5K_RF_GAIN(5),  { 0x00000021, 0x000001e1 } },
0319     { AR5K_RF_GAIN(6),  { 0x00000061, 0x00000021 } },
0320     { AR5K_RF_GAIN(7),  { 0x00000188, 0x00000061 } },
0321     { AR5K_RF_GAIN(8),  { 0x000001c8, 0x00000188 } },
0322     { AR5K_RF_GAIN(9),  { 0x00000008, 0x000001c8 } },
0323     { AR5K_RF_GAIN(10), { 0x00000048, 0x00000008 } },
0324     { AR5K_RF_GAIN(11), { 0x00000088, 0x00000048 } },
0325     { AR5K_RF_GAIN(12), { 0x000001a9, 0x00000088 } },
0326     { AR5K_RF_GAIN(13), { 0x000001e9, 0x00000169 } },
0327     { AR5K_RF_GAIN(14), { 0x00000029, 0x000001a9 } },
0328     { AR5K_RF_GAIN(15), { 0x00000069, 0x000001e9 } },
0329     { AR5K_RF_GAIN(16), { 0x000001d0, 0x00000029 } },
0330     { AR5K_RF_GAIN(17), { 0x00000010, 0x00000069 } },
0331     { AR5K_RF_GAIN(18), { 0x00000050, 0x00000190 } },
0332     { AR5K_RF_GAIN(19), { 0x00000090, 0x000001d0 } },
0333     { AR5K_RF_GAIN(20), { 0x000001b1, 0x00000010 } },
0334     { AR5K_RF_GAIN(21), { 0x000001f1, 0x00000050 } },
0335     { AR5K_RF_GAIN(22), { 0x00000031, 0x00000090 } },
0336     { AR5K_RF_GAIN(23), { 0x00000071, 0x00000171 } },
0337     { AR5K_RF_GAIN(24), { 0x000001b8, 0x000001b1 } },
0338     { AR5K_RF_GAIN(25), { 0x000001f8, 0x000001f1 } },
0339     { AR5K_RF_GAIN(26), { 0x00000038, 0x00000031 } },
0340     { AR5K_RF_GAIN(27), { 0x00000078, 0x00000071 } },
0341     { AR5K_RF_GAIN(28), { 0x00000199, 0x00000198 } },
0342     { AR5K_RF_GAIN(29), { 0x000001d9, 0x000001d8 } },
0343     { AR5K_RF_GAIN(30), { 0x00000019, 0x00000018 } },
0344     { AR5K_RF_GAIN(31), { 0x00000059, 0x00000058 } },
0345     { AR5K_RF_GAIN(32), { 0x00000099, 0x00000098 } },
0346     { AR5K_RF_GAIN(33), { 0x000000d9, 0x00000179 } },
0347     { AR5K_RF_GAIN(34), { 0x000000f9, 0x000001b9 } },
0348     { AR5K_RF_GAIN(35), { 0x000000f9, 0x000001f9 } },
0349     { AR5K_RF_GAIN(36), { 0x000000f9, 0x00000039 } },
0350     { AR5K_RF_GAIN(37), { 0x000000f9, 0x00000079 } },
0351     { AR5K_RF_GAIN(38), { 0x000000f9, 0x000000b9 } },
0352     { AR5K_RF_GAIN(39), { 0x000000f9, 0x000000f9 } },
0353     { AR5K_RF_GAIN(40), { 0x000000f9, 0x000000f9 } },
0354     { AR5K_RF_GAIN(41), { 0x000000f9, 0x000000f9 } },
0355     { AR5K_RF_GAIN(42), { 0x000000f9, 0x000000f9 } },
0356     { AR5K_RF_GAIN(43), { 0x000000f9, 0x000000f9 } },
0357     { AR5K_RF_GAIN(44), { 0x000000f9, 0x000000f9 } },
0358     { AR5K_RF_GAIN(45), { 0x000000f9, 0x000000f9 } },
0359     { AR5K_RF_GAIN(46), { 0x000000f9, 0x000000f9 } },
0360     { AR5K_RF_GAIN(47), { 0x000000f9, 0x000000f9 } },
0361     { AR5K_RF_GAIN(48), { 0x000000f9, 0x000000f9 } },
0362     { AR5K_RF_GAIN(49), { 0x000000f9, 0x000000f9 } },
0363     { AR5K_RF_GAIN(50), { 0x000000f9, 0x000000f9 } },
0364     { AR5K_RF_GAIN(51), { 0x000000f9, 0x000000f9 } },
0365     { AR5K_RF_GAIN(52), { 0x000000f9, 0x000000f9 } },
0366     { AR5K_RF_GAIN(53), { 0x000000f9, 0x000000f9 } },
0367     { AR5K_RF_GAIN(54), { 0x000000f9, 0x000000f9 } },
0368     { AR5K_RF_GAIN(55), { 0x000000f9, 0x000000f9 } },
0369     { AR5K_RF_GAIN(56), { 0x000000f9, 0x000000f9 } },
0370     { AR5K_RF_GAIN(57), { 0x000000f9, 0x000000f9 } },
0371     { AR5K_RF_GAIN(58), { 0x000000f9, 0x000000f9 } },
0372     { AR5K_RF_GAIN(59), { 0x000000f9, 0x000000f9 } },
0373     { AR5K_RF_GAIN(60), { 0x000000f9, 0x000000f9 } },
0374     { AR5K_RF_GAIN(61), { 0x000000f9, 0x000000f9 } },
0375     { AR5K_RF_GAIN(62), { 0x000000f9, 0x000000f9 } },
0376     { AR5K_RF_GAIN(63), { 0x000000f9, 0x000000f9 } },
0377 };
0378 
0379 
0380 /* Initial RF Gain settings for RF2425 */
0381 static const struct ath5k_ini_rfgain rfgain_2425[] = {
0382     { AR5K_RF_GAIN(0),  { 0x00000000, 0x00000000 } },
0383     { AR5K_RF_GAIN(1),  { 0x00000000, 0x00000040 } },
0384     { AR5K_RF_GAIN(2),  { 0x00000000, 0x00000080 } },
0385     { AR5K_RF_GAIN(3),  { 0x00000000, 0x00000181 } },
0386     { AR5K_RF_GAIN(4),  { 0x00000000, 0x000001c1 } },
0387     { AR5K_RF_GAIN(5),  { 0x00000000, 0x00000001 } },
0388     { AR5K_RF_GAIN(6),  { 0x00000000, 0x00000041 } },
0389     { AR5K_RF_GAIN(7),  { 0x00000000, 0x00000081 } },
0390     { AR5K_RF_GAIN(8),  { 0x00000000, 0x00000188 } },
0391     { AR5K_RF_GAIN(9),  { 0x00000000, 0x000001c8 } },
0392     { AR5K_RF_GAIN(10), { 0x00000000, 0x00000008 } },
0393     { AR5K_RF_GAIN(11), { 0x00000000, 0x00000048 } },
0394     { AR5K_RF_GAIN(12), { 0x00000000, 0x00000088 } },
0395     { AR5K_RF_GAIN(13), { 0x00000000, 0x00000189 } },
0396     { AR5K_RF_GAIN(14), { 0x00000000, 0x000001c9 } },
0397     { AR5K_RF_GAIN(15), { 0x00000000, 0x00000009 } },
0398     { AR5K_RF_GAIN(16), { 0x00000000, 0x00000049 } },
0399     { AR5K_RF_GAIN(17), { 0x00000000, 0x00000089 } },
0400     { AR5K_RF_GAIN(18), { 0x00000000, 0x000001b0 } },
0401     { AR5K_RF_GAIN(19), { 0x00000000, 0x000001f0 } },
0402     { AR5K_RF_GAIN(20), { 0x00000000, 0x00000030 } },
0403     { AR5K_RF_GAIN(21), { 0x00000000, 0x00000070 } },
0404     { AR5K_RF_GAIN(22), { 0x00000000, 0x00000171 } },
0405     { AR5K_RF_GAIN(23), { 0x00000000, 0x000001b1 } },
0406     { AR5K_RF_GAIN(24), { 0x00000000, 0x000001f1 } },
0407     { AR5K_RF_GAIN(25), { 0x00000000, 0x00000031 } },
0408     { AR5K_RF_GAIN(26), { 0x00000000, 0x00000071 } },
0409     { AR5K_RF_GAIN(27), { 0x00000000, 0x000001b8 } },
0410     { AR5K_RF_GAIN(28), { 0x00000000, 0x000001f8 } },
0411     { AR5K_RF_GAIN(29), { 0x00000000, 0x00000038 } },
0412     { AR5K_RF_GAIN(30), { 0x00000000, 0x00000078 } },
0413     { AR5K_RF_GAIN(31), { 0x00000000, 0x000000b8 } },
0414     { AR5K_RF_GAIN(32), { 0x00000000, 0x000001b9 } },
0415     { AR5K_RF_GAIN(33), { 0x00000000, 0x000001f9 } },
0416     { AR5K_RF_GAIN(34), { 0x00000000, 0x00000039 } },
0417     { AR5K_RF_GAIN(35), { 0x00000000, 0x00000079 } },
0418     { AR5K_RF_GAIN(36), { 0x00000000, 0x000000b9 } },
0419     { AR5K_RF_GAIN(37), { 0x00000000, 0x000000f9 } },
0420     { AR5K_RF_GAIN(38), { 0x00000000, 0x000000f9 } },
0421     { AR5K_RF_GAIN(39), { 0x00000000, 0x000000f9 } },
0422     { AR5K_RF_GAIN(40), { 0x00000000, 0x000000f9 } },
0423     { AR5K_RF_GAIN(41), { 0x00000000, 0x000000f9 } },
0424     { AR5K_RF_GAIN(42), { 0x00000000, 0x000000f9 } },
0425     { AR5K_RF_GAIN(43), { 0x00000000, 0x000000f9 } },
0426     { AR5K_RF_GAIN(44), { 0x00000000, 0x000000f9 } },
0427     { AR5K_RF_GAIN(45), { 0x00000000, 0x000000f9 } },
0428     { AR5K_RF_GAIN(46), { 0x00000000, 0x000000f9 } },
0429     { AR5K_RF_GAIN(47), { 0x00000000, 0x000000f9 } },
0430     { AR5K_RF_GAIN(48), { 0x00000000, 0x000000f9 } },
0431     { AR5K_RF_GAIN(49), { 0x00000000, 0x000000f9 } },
0432     { AR5K_RF_GAIN(50), { 0x00000000, 0x000000f9 } },
0433     { AR5K_RF_GAIN(51), { 0x00000000, 0x000000f9 } },
0434     { AR5K_RF_GAIN(52), { 0x00000000, 0x000000f9 } },
0435     { AR5K_RF_GAIN(53), { 0x00000000, 0x000000f9 } },
0436     { AR5K_RF_GAIN(54), { 0x00000000, 0x000000f9 } },
0437     { AR5K_RF_GAIN(55), { 0x00000000, 0x000000f9 } },
0438     { AR5K_RF_GAIN(56), { 0x00000000, 0x000000f9 } },
0439     { AR5K_RF_GAIN(57), { 0x00000000, 0x000000f9 } },
0440     { AR5K_RF_GAIN(58), { 0x00000000, 0x000000f9 } },
0441     { AR5K_RF_GAIN(59), { 0x00000000, 0x000000f9 } },
0442     { AR5K_RF_GAIN(60), { 0x00000000, 0x000000f9 } },
0443     { AR5K_RF_GAIN(61), { 0x00000000, 0x000000f9 } },
0444     { AR5K_RF_GAIN(62), { 0x00000000, 0x000000f9 } },
0445     { AR5K_RF_GAIN(63), { 0x00000000, 0x000000f9 } },
0446 };
0447 
0448 #define AR5K_GAIN_CRN_FIX_BITS_5111     4
0449 #define AR5K_GAIN_CRN_FIX_BITS_5112     7
0450 #define AR5K_GAIN_CRN_MAX_FIX_BITS      AR5K_GAIN_CRN_FIX_BITS_5112
0451 #define AR5K_GAIN_DYN_ADJUST_HI_MARGIN      15
0452 #define AR5K_GAIN_DYN_ADJUST_LO_MARGIN      20
0453 #define AR5K_GAIN_CCK_PROBE_CORR        5
0454 #define AR5K_GAIN_CCK_OFDM_GAIN_DELTA       15
0455 #define AR5K_GAIN_STEP_COUNT            10
0456 
0457 /* Check if our current measurement is inside our
0458  * current variable attenuation window */
0459 #define AR5K_GAIN_CHECK_ADJUST(_g)      \
0460     ((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high)
0461 
0462 /**
0463  * struct ath5k_gain_opt_step - An RF gain optimization step
0464  * @gos_param: Set of parameters
0465  * @gos_gain: Gain
0466  */
0467 struct ath5k_gain_opt_step {
0468     s8              gos_param[AR5K_GAIN_CRN_MAX_FIX_BITS];
0469     s8              gos_gain;
0470 };
0471 
0472 /**
0473  * struct ath5k_gain_opt - RF Gain optimization ladder
0474  * @go_default: The default step
0475  * @go_steps_count: How many optimization steps
0476  * @go_step: Array of &struct ath5k_gain_opt_step
0477  */
0478 struct ath5k_gain_opt {
0479     u8              go_default;
0480     u8              go_steps_count;
0481     const struct ath5k_gain_opt_step    go_step[AR5K_GAIN_STEP_COUNT];
0482 };
0483 
0484 
0485 /*
0486  * RF5111
0487  * Parameters on gos_param:
0488  * 1) Tx clip PHY register
0489  * 2) PWD 90 RF register
0490  * 3) PWD 84 RF register
0491  * 4) RFGainSel RF register
0492  */
0493 static const struct ath5k_gain_opt rfgain_opt_5111 = {
0494     4,
0495     9,
0496     {
0497         { { 4, 1, 1, 1 }, 6 },
0498         { { 4, 0, 1, 1 }, 4 },
0499         { { 3, 1, 1, 1 }, 3 },
0500         { { 4, 0, 0, 1 }, 1 },
0501         { { 4, 1, 1, 0 }, 0 },
0502         { { 4, 0, 1, 0 }, -2 },
0503         { { 3, 1, 1, 0 }, -3 },
0504         { { 4, 0, 0, 0 }, -4 },
0505         { { 2, 1, 1, 0 }, -6 }
0506     }
0507 };
0508 
0509 /*
0510  * RF5112
0511  * Parameters on gos_param:
0512  * 1) Mixgain ovr RF register
0513  * 2) PWD 138 RF register
0514  * 3) PWD 137 RF register
0515  * 4) PWD 136 RF register
0516  * 5) PWD 132 RF register
0517  * 6) PWD 131 RF register
0518  * 7) PWD 130 RF register
0519  */
0520 static const struct ath5k_gain_opt rfgain_opt_5112 = {
0521     1,
0522     8,
0523     {
0524         { { 3, 0, 0, 0, 0, 0, 0 }, 6 },
0525         { { 2, 0, 0, 0, 0, 0, 0 }, 0 },
0526         { { 1, 0, 0, 0, 0, 0, 0 }, -3 },
0527         { { 0, 0, 0, 0, 0, 0, 0 }, -6 },
0528         { { 0, 1, 1, 0, 0, 0, 0 }, -8 },
0529         { { 0, 1, 1, 0, 1, 1, 0 }, -10 },
0530         { { 0, 1, 0, 1, 1, 1, 0 }, -13 },
0531         { { 0, 1, 0, 1, 1, 0, 1 }, -16 },
0532     }
0533 };
0534