cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rfgain.h (23643B)


      1/*
      2 * RF Gain optimization
      3 *
      4 * Copyright (c) 2004-2009 Reyk Floeter <reyk@openbsd.org>
      5 * Copyright (c) 2006-2009 Nick Kossifidis <mickflemm@gmail.com>
      6 *
      7 * Permission to use, copy, modify, and distribute this software for any
      8 * purpose with or without fee is hereby granted, provided that the above
      9 * copyright notice and this permission notice appear in all copies.
     10 *
     11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18 *
     19 */
     20
     21/**
     22 * struct ath5k_ini_rfgain - RF Gain table
     23 * @rfg_register: RF Gain register address
     24 * @rfg_value: Register value for 5 and 2GHz
     25 *
     26 * Mode-specific RF Gain table (64bytes) for RF5111/5112
     27 * (RF5110 only comes with AR5210 and only supports a/turbo a mode so initial
     28 * RF Gain values are included in AR5K_AR5210_INI)
     29 */
     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		4
    449#define AR5K_GAIN_CRN_FIX_BITS_5112		7
    450#define AR5K_GAIN_CRN_MAX_FIX_BITS		AR5K_GAIN_CRN_FIX_BITS_5112
    451#define AR5K_GAIN_DYN_ADJUST_HI_MARGIN		15
    452#define AR5K_GAIN_DYN_ADJUST_LO_MARGIN		20
    453#define AR5K_GAIN_CCK_PROBE_CORR		5
    454#define AR5K_GAIN_CCK_OFDM_GAIN_DELTA		15
    455#define AR5K_GAIN_STEP_COUNT			10
    456
    457/* Check if our current measurement is inside our
    458 * current variable attenuation window */
    459#define AR5K_GAIN_CHECK_ADJUST(_g)		\
    460	((_g)->g_current <= (_g)->g_low || (_g)->g_current >= (_g)->g_high)
    461
    462/**
    463 * struct ath5k_gain_opt_step - An RF gain optimization step
    464 * @gos_param: Set of parameters
    465 * @gos_gain: Gain
    466 */
    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 ladder
    474 * @go_default: The default step
    475 * @go_steps_count: How many optimization steps
    476 * @go_step: Array of &struct ath5k_gain_opt_step
    477 */
    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 * RF5111
    487 * Parameters on gos_param:
    488 * 1) Tx clip PHY register
    489 * 2) PWD 90 RF register
    490 * 3) PWD 84 RF register
    491 * 4) RFGainSel RF register
    492 */
    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 * RF5112
    511 * Parameters on gos_param:
    512 * 1) Mixgain ovr RF register
    513 * 2) PWD 138 RF register
    514 * 3) PWD 137 RF register
    515 * 4) PWD 136 RF register
    516 * 5) PWD 132 RF register
    517 * 6) PWD 131 RF register
    518 * 7) PWD 130 RF register
    519 */
    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