535 lines · c
1/*2 * RF Gain optimization3 *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 any8 * purpose with or without fee is hereby granted, provided that the above9 * copyright notice and this permission notice appear in all copies.10 *11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.18 *19 */20 21/**22 * struct ath5k_ini_rfgain - RF Gain table23 * @rfg_register: RF Gain register address24 * @rfg_value: Register value for 5 and 2GHz25 *26 * Mode-specific RF Gain table (64bytes) for RF5111/511227 * (RF5110 only comes with AR5210 and only supports a/turbo a mode so initial28 * RF Gain values are included in AR5K_AR5210_INI)29 */30struct ath5k_ini_rfgain {31 u16 rfg_register;32 u32 rfg_value[2]; /* [freq (see below)] */33};34 35/* Initial RF Gain settings for RF5111 */36static 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 */105static 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 */174static 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 */242static 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 */311static 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 */381static 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 4449#define AR5K_GAIN_CRN_FIX_BITS_5112 7450#define AR5K_GAIN_CRN_MAX_FIX_BITS AR5K_GAIN_CRN_FIX_BITS_5112451#define AR5K_GAIN_DYN_ADJUST_HI_MARGIN 15452#define AR5K_GAIN_DYN_ADJUST_LO_MARGIN 20453#define AR5K_GAIN_CCK_PROBE_CORR 5454#define AR5K_GAIN_CCK_OFDM_GAIN_DELTA 15455#define AR5K_GAIN_STEP_COUNT 10456 457/* Check if our current measurement is inside our458 * 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 step464 * @gos_param: Set of parameters465 * @gos_gain: Gain466 */467struct 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 ladder474 * @go_default: The default step475 * @go_steps_count: How many optimization steps476 * @go_step: Array of &struct ath5k_gain_opt_step477 */478struct 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 * RF5111487 * Parameters on gos_param:488 * 1) Tx clip PHY register489 * 2) PWD 90 RF register490 * 3) PWD 84 RF register491 * 4) RFGainSel RF register492 */493static 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 * RF5112511 * Parameters on gos_param:512 * 1) Mixgain ovr RF register513 * 2) PWD 138 RF register514 * 3) PWD 137 RF register515 * 4) PWD 136 RF register516 * 5) PWD 132 RF register517 * 6) PWD 131 RF register518 * 7) PWD 130 RF register519 */520static 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