1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 /*@===========================================================
27 * include files
28 *============================================================
29 */
30
31 #include "mp_precomp.h"
32 #include "phydm_precomp.h"
33
34 /*@************************************************************
35 * Global var
36 * ************************************************************
37 */
38
39 u32 ofdm_swing_table[OFDM_TABLE_SIZE] = {
40 0x7f8001fe, /* 0, +6.0dB */
41 0x788001e2, /* 1, +5.5dB */
42 0x71c001c7, /* 2, +5.0dB*/
43 0x6b8001ae, /* 3, +4.5dB*/
44 0x65400195, /* 4, +4.0dB*/
45 0x5fc0017f, /* 5, +3.5dB*/
46 0x5a400169, /* 6, +3.0dB*/
47 0x55400155, /* 7, +2.5dB*/
48 0x50800142, /* 8, +2.0dB*/
49 0x4c000130, /* 9, +1.5dB*/
50 0x47c0011f, /* 10, +1.0dB*/
51 0x43c0010f, /* 11, +0.5dB*/
52 0x40000100, /* 12, +0dB*/
53 0x3c8000f2, /* 13, -0.5dB*/
54 0x390000e4, /* 14, -1.0dB*/
55 0x35c000d7, /* 15, -1.5dB*/
56 0x32c000cb, /* 16, -2.0dB*/
57 0x300000c0, /* 17, -2.5dB*/
58 0x2d4000b5, /* 18, -3.0dB*/
59 0x2ac000ab, /* 19, -3.5dB*/
60 0x288000a2, /* 20, -4.0dB*/
61 0x26000098, /* 21, -4.5dB*/
62 0x24000090, /* 22, -5.0dB*/
63 0x22000088, /* 23, -5.5dB*/
64 0x20000080, /* 24, -6.0dB*/
65 0x1e400079, /* 25, -6.5dB*/
66 0x1c800072, /* 26, -7.0dB*/
67 0x1b00006c, /* 27. -7.5dB*/
68 0x19800066, /* 28, -8.0dB*/
69 0x18000060, /* 29, -8.5dB*/
70 0x16c0005b, /* 30, -9.0dB*/
71 0x15800056, /* 31, -9.5dB*/
72 0x14400051, /* 32, -10.0dB*/
73 0x1300004c, /* 33, -10.5dB*/
74 0x12000048, /* 34, -11.0dB*/
75 0x11000044, /* 35, -11.5dB*/
76 0x10000040, /* 36, -12.0dB*/
77 };
78
79 u8 cck_swing_table_ch1_ch13[CCK_TABLE_SIZE][8] = {
80 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0dB */
81 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 1, -0.5dB */
82 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 2, -1.0dB */
83 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 3, -1.5dB */
84 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 4, -2.0dB */
85 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 5, -2.5dB */
86 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 6, -3.0dB */
87 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 7, -3.5dB */
88 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 8, -4.0dB */
89 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 9, -4.5dB */
90 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 10, -5.0dB */
91 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 11, -5.5dB */
92 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 12, -6.0 default*/
93 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 13, -6.5dB */
94 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 14, -7.0dB */
95 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 15, -7.5dB */
96 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
97 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 17, -8.5dB */
98 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 18, -9.0dB */
99 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 19, -9.5dB */
100 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 20, -10.0dB */
101 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 21, -10.5dB */
102 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 22, -11.0dB */
103 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 23, -11.5dB */
104 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 24, -12.0dB */
105 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 25, -12.5dB */
106 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 26, -13.0dB */
107 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 27, -13.5dB */
108 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 28, -14.0dB */
109 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 29, -14.5dB */
110 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 30, -15.0dB */
111 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 31, -15.5dB */
112 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} /* 32, -16.0dB */
113 };
114
115 u8 cck_swing_table_ch14[CCK_TABLE_SIZE][8] = {
116 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0dB */
117 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 1, -0.5dB */
118 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 2, -1.0dB */
119 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 3, -1.5dB */
120 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 4, -2.0dB */
121 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 5, -2.5dB */
122 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 6, -3.0dB */
123 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 7, -3.5dB */
124 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 8, -4.0dB */
125 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 9, -4.5dB */
126 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 10, -5.0dB */
127 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 11, -5.5dB */
128 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 12, -6.0 default*/
129 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 13, -6.5dB */
130 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 14, -7.0dB */
131 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 15, -7.5dB */
132 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
133 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 17, -8.5dB */
134 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 18, -9.0dB */
135 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 19, -9.5dB */
136 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 20, -10.0dB */
137 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 21, -10.5dB */
138 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 22, -11.0dB */
139 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 23, -11.5dB */
140 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 24, -12.0dB */
141 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 25, -12.5dB */
142 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 26, -13.0dB */
143 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 27, -13.5dB */
144 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 28, -14.0dB */
145 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 29, -14.5dB */
146 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 30, -15.0dB */
147 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 31, -15.5dB */
148 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} /* 32, -16.0dB */
149 };
150
151 u32 ofdm_swing_table_new[OFDM_TABLE_SIZE] = {
152 0x0b40002d, /* 0, -15.0dB */
153 0x0c000030, /* 1, -14.5dB */
154 0x0cc00033, /* 2, -14.0dB */
155 0x0d800036, /* 3, -13.5dB */
156 0x0e400039, /* 4, -13.0dB */
157 0x0f00003c, /* 5, -12.5dB */
158 0x10000040, /* 6, -12.0dB */
159 0x11000044, /* 7, -11.5dB */
160 0x12000048, /* 8, -11.0dB */
161 0x1300004c, /* 9, -10.5dB */
162 0x14400051, /* 10, -10.0dB */
163 0x15800056, /* 11, -9.5dB */
164 0x16c0005b, /* 12, -9.0dB */
165 0x18000060, /* 13, -8.5dB */
166 0x19800066, /* 14, -8.0dB */
167 0x1b00006c, /* 15, -7.5dB */
168 0x1c800072, /* 16, -7.0dB */
169 0x1e400079, /* 17, -6.5dB */
170 0x20000080, /* 18, -6.0dB */
171 0x22000088, /* 19, -5.5dB */
172 0x24000090, /* 20, -5.0dB */
173 0x26000098, /* 21, -4.5dB */
174 0x288000a2, /* 22, -4.0dB */
175 0x2ac000ab, /* 23, -3.5dB */
176 0x2d4000b5, /* 24, -3.0dB */
177 0x300000c0, /* 25, -2.5dB */
178 0x32c000cb, /* 26, -2.0dB */
179 0x35c000d7, /* 27, -1.5dB */
180 0x390000e4, /* 28, -1.0dB */
181 0x3c8000f2, /* 29, -0.5dB */
182 0x40000100, /* 30, +0dB */
183 0x43c0010f, /* 31, +0.5dB */
184 0x47c0011f, /* 32, +1.0dB */
185 0x4c000130, /* 33, +1.5dB */
186 0x50800142, /* 34, +2.0dB */
187 0x55400155, /* 35, +2.5dB */
188 0x5a400169, /* 36, +3.0dB */
189 0x5fc0017f, /* 37, +3.5dB */
190 0x65400195, /* 38, +4.0dB */
191 0x6b8001ae, /* 39, +4.5dB */
192 0x71c001c7, /* 40, +5.0dB */
193 0x788001e2, /* 41, +5.5dB */
194 0x7f8001fe /* 42, +6.0dB */
195 };
196
197 u8 cck_swing_table_ch1_ch14_88f[CCK_TABLE_SIZE_88F][16] = {
198 {0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-16dB*/
200 {0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15.5dB*/
202 {0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02,
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15dB*/
204 {0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14.5dB*/
206 {0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14dB*/
208 {0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13.5dB*/
210 {0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02,
211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13dB*/
212 {0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02,
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12.5dB*/
214 {0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03,
215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12dB*/
216 {0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11.5dB*/
218 {0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03,
219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11dB*/
220 {0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03,
221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10.5dB*/
222 {0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10dB*/
224 {0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9.5dB*/
226 {0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9dB*/
228 {0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8.5dB*/
230 {0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8dB*/
232 {0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7.5dB*/
234 {0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04,
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7dB*/
236 {0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-6.5dB*/
238 {0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /*-6dB*/
240 };
241
242 u8 cck_swing_table_ch1_ch13_88f[CCK_TABLE_SIZE_88F][16] = {
243 {0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-16dB*/
245 {0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15.5dB*/
247 {0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15dB*/
249 {0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14.5dB*/
251 {0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14dB*/
253 {0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13.5dB*/
255 {0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02,
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13dB*/
257 {0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02,
258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12.5dB*/
259 {0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03,
260 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12dB*/
261 {0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11.5dB*/
263 {0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03,
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11dB*/
265 {0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10.5dB*/
267 {0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10dB*/
269 {0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9.5dB*/
271 {0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04,
272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9dB*/
273 {0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04,
274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8.5dB*/
275 {0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04,
276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8dB*/
277 {0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7.5dB*/
279 {0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04,
280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7dB*/
281 {0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05,
282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-6.5dB*/
283 {0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05,
284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /*-6dB*/
285 };
286
287 u8 cck_swing_table_ch14_88f[CCK_TABLE_SIZE_88F][16] = {
288 {0x44, 0x42, 0x3C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-16dB*/
290 {0x48, 0x46, 0x3F, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15.5dB*/
292 {0x4D, 0x4A, 0x43, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15dB*/
294 {0x51, 0x4F, 0x47, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14.5dB*/
296 {0x56, 0x53, 0x4B, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14dB*/
298 {0x5B, 0x58, 0x50, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13.5dB*/
300 {0x60, 0x5D, 0x54, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13dB*/
302 {0x66, 0x63, 0x59, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12.5dB*/
304 {0x6C, 0x69, 0x5F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12dB*/
306 {0x73, 0x6F, 0x64, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11.5dB*/
308 {0x79, 0x76, 0x6A, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11dB*/
310 {0x81, 0x7C, 0x71, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10.5dB*/
312 {0x88, 0x84, 0x77, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10dB*/
314 {0x90, 0x8C, 0x7E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9.5dB*/
316 {0x99, 0x94, 0x86, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9dB*/
318 {0xA2, 0x9D, 0x8E, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8.5dB*/
320 {0xAC, 0xA6, 0x96, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8dB*/
322 {0xB6, 0xB0, 0x9F, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7.5dB*/
324 {0xC1, 0xBA, 0xA8, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7dB*/
326 {0xCC, 0xC5, 0xB2, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-6.5dB*/
328 {0xD8, 0xD1, 0xBD, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /*-6dB*/
330 };
331
332 u8 cck_swing_table_ch1_ch13_new[CCK_TABLE_SIZE][8] = {
333 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, /* 0, -16.0dB*/
334 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 1, -15.5dB*/
335 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 2, -15.0dB*/
336 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 3, -14.5dB*/
337 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 4, -14.0dB*/
338 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 5, -13.5dB*/
339 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 6, -13.0dB*/
340 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 7, -12.5dB*/
341 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 8, -12.0dB*/
342 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 9, -11.5dB*/
343 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 10, -11.0dB*/
344 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 11, -10.5dB*/
345 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 12, -10.0dB*/
346 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 13, -9.5dB*/
347 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 14, -9.0dB */
348 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 15, -8.5dB*/
349 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
350 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 17, -7.5dB*/
351 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 18, -7.0dB */
352 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 19, -6.5dB*/
353 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 20, -6.0dB */
354 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 21, -5.5dB*/
355 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 22, -5.0dB */
356 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 23, -4.5dB*/
357 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 24, -4.0dB */
358 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 25, -3.5dB*/
359 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 26, -3.0dB*/
360 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 27, -2.5dB*/
361 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 28, -2.0dB */
362 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 29, -1.5dB*/
363 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 30, -1.0dB*/
364 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 31, -0.5dB*/
365 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} /* 32, +0dB*/
366 };
367
368 u8 cck_swing_table_ch14_new[CCK_TABLE_SIZE][8] = {
369 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, /* 0, -16.0dB*/
370 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 1, -15.5dB*/
371 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 2, -15.0dB*/
372 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 3, -14.5dB*/
373 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 4, -14.0dB*/
374 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /*5, -13.5dB*/
375 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 6, -13.0dB*/
376 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 7, -12.5dB*/
377 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 8, -12.0dB*/
378 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 9, -11.5dB*/
379 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 10, -11.0dB*/
380 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /*11, -10.5dB*/
381 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 12, -10.0dB*/
382 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 13, -9.5dB*/
383 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /*14, -9.0dB */
384 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 15, -8.5dB*/
385 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
386 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 17, -7.5dB*/
387 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 18, -7.0dB */
388 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 19, -6.5dB */
389 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 20, -6.0dB */
390 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 21, -5.5dB*/
391 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 22, -5.0dB */
392 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /*23, -4.5dB*/
393 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 24, -4.0dB */
394 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 25, -3.5dB */
395 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 26, -3.0dB */
396 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /*27, -2.5dB*/
397 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 28, -2.0dB */
398 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /*29, -1.5dB*/
399 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 30, -1.0dB */
400 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 31, -0.5dB */
401 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} /* 32, +0dB */
402 };
403
404 u32 cck_swing_table_ch1_ch14_8723d[CCK_TABLE_SIZE_8723D] = {
405 0x0CD, /*0 , -20dB*/
406 0x0D9,
407 0x0E6,
408 0x0F3,
409 0x102,
410 0x111,
411 0x121,
412 0x132,
413 0x144,
414 0x158,
415 0x16C,
416 0x182,
417 0x198,
418 0x1B1,
419 0x1CA,
420 0x1E5,
421 0x202,
422 0x221,
423 0x241,
424 0x263,
425 0x287,
426 0x2AE,
427 0x2D6,
428 0x301,
429 0x32F,
430 0x35F,
431 0x392,
432 0x3C9,
433 0x402,
434 0x43F,
435 0x47F,
436 0x4C3,
437 0x50C,
438 0x558,
439 0x5A9,
440 0x5FF,
441 0x65A,
442 0x6BA,
443 0x720,
444 0x78C,
445 0x7FF,
446 };
447
448 /*@JJ ADD 20161014 */
449 u32 cck_swing_table_ch1_ch14_8710b[CCK_TABLE_SIZE_8710B] = {
450 0x0CD, /*0 , -20dB*/
451 0x0D9,
452 0x0E6,
453 0x0F3,
454 0x102,
455 0x111,
456 0x121,
457 0x132,
458 0x144,
459 0x158,
460 0x16C,
461 0x182,
462 0x198,
463 0x1B1,
464 0x1CA,
465 0x1E5,
466 0x202,
467 0x221,
468 0x241,
469 0x263,
470 0x287,
471 0x2AE,
472 0x2D6,
473 0x301,
474 0x32F,
475 0x35F,
476 0x392,
477 0x3C9,
478 0x402,
479 0x43F,
480 0x47F,
481 0x4C3,
482 0x50C,
483 0x558,
484 0x5A9,
485 0x5FF,
486 0x65A,
487 0x6BA,
488 0x720,
489 0x78C,
490 0x7FF,
491 };
492
493 /*@Winnita ADD 20171116 PathA 0xAB4[10:0],PathB 0xAB4[21:11]*/
494 u32 cck_swing_table_ch1_ch14_8192f[CCK_TABLE_SIZE_8192F] = {
495 0x0CD, /*0 , -20dB*/
496 0x0D9,
497 0x0E6,
498 0x0F3,
499 0x102,
500 0x111,
501 0x121,
502 0x132,
503 0x144,
504 0x158,
505 0x16C,
506 0x182,
507 0x198,
508 0x1B1,
509 0x1CA,
510 0x1E5,
511 0x202,
512 0x221,
513 0x241,
514 0x263, /*19*/
515 0x287, /*20*/
516 0x2AE, /*21*/
517 0x2D6, /*22*/
518 0x301, /*23*/
519 0x32F, /*24*/
520 0x35F, /*25*/
521 0x392, /*26*/
522 0x3C9, /*27*/
523 0x402, /*28*/
524 0x43F, /*29*/
525 0x47F, /*30*/
526 0x4C3, /*31*/
527 0x50C, /*32*/
528 0x558, /*33*/
529 0x5A9, /*34*/
530 0x5FF, /*35*/
531 0x65A, /*36*/
532 0x6BA,
533 0x720,
534 0x78C,
535 0x7FF,
536 };
537
538 u32 tx_scaling_table_jaguar[TXSCALE_TABLE_SIZE] = {
539 0x081, /* 0, -12.0dB*/
540 0x088, /* 1, -11.5dB*/
541 0x090, /* 2, -11.0dB*/
542 0x099, /* 3, -10.5dB*/
543 0x0A2, /* 4, -10.0dB*/
544 0x0AC, /* 5, -9.5dB*/
545 0x0B6, /* 6, -9.0dB*/
546 0x0C0, /*7, -8.5dB*/
547 0x0CC, /* 8, -8.0dB*/
548 0x0D8, /* 9, -7.5dB*/
549 0x0E5, /* 10, -7.0dB*/
550 0x0F2, /* 11, -6.5dB*/
551 0x101, /* 12, -6.0dB*/
552 0x110, /* 13, -5.5dB*/
553 0x120, /* 14, -5.0dB*/
554 0x131, /* 15, -4.5dB*/
555 0x143, /* 16, -4.0dB*/
556 0x156, /* 17, -3.5dB*/
557 0x16A, /* 18, -3.0dB*/
558 0x180, /* 19, -2.5dB*/
559 0x197, /* 20, -2.0dB*/
560 0x1AF, /* 21, -1.5dB*/
561 0x1C8, /* 22, -1.0dB*/
562 0x1E3, /* 23, -0.5dB*/
563 0x200, /* 24, +0 dB*/
564 0x21E, /* 25, +0.5dB*/
565 0x23E, /* 26, +1.0dB*/
566 0x261, /* 27, +1.5dB*/
567 0x285, /* 28, +2.0dB*/
568 0x2AB, /* 29, +2.5dB*/
569 0x2D3, /*30, +3.0dB*/
570 0x2FE, /* 31, +3.5dB*/
571 0x32B, /* 32, +4.0dB*/
572 0x35C, /* 33, +4.5dB*/
573 0x38E, /* 34, +5.0dB*/
574 0x3C4, /* 35, +5.5dB*/
575 0x3FE /* 36, +6.0dB */
576 };
577
578 #if (DM_ODM_SUPPORT_TYPE == ODM_CE) && defined(DM_ODM_CE_MAC80211)
579 #else
580 u8 delta_swing_table_idx_2ga_p_8188e[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3,
581 4, 4, 4, 4, 4, 4, 4, 4, 5, 5,
582 7, 7, 8, 8, 8, 9, 9, 9, 9, 9};
583 u8 delta_swing_table_idx_2ga_n_8188e[] = {0, 0, 0, 2, 2, 3, 3, 4, 4, 4,
584 4, 5, 5, 6, 6, 7, 7, 7, 7, 8,
585 8, 9, 9, 10, 10, 10, 11, 11, 11, 11};
586 #endif
587
odm_txpowertracking_init(void * dm_void)588 void odm_txpowertracking_init(void *dm_void)
589 {
590 struct dm_struct *dm = (struct dm_struct *)dm_void;
591
592 odm_txpowertracking_thermal_meter_init(dm);
593 }
594
get_swing_index(void * dm_void)595 u8 get_swing_index(void *dm_void)
596 {
597 struct dm_struct *dm = (struct dm_struct *)dm_void;
598 #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
599 void *adapter = dm->adapter;
600 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
601 #endif
602 u8 i = 0;
603 u32 bb_swing, table_value;
604
605 if (dm->support_ic_type &
606 (ODM_RTL8188E | ODM_RTL8723B | ODM_RTL8192E |
607 ODM_RTL8188F | ODM_RTL8703B | ODM_RTL8723D |
608 ODM_RTL8710B)) {
609
610 bb_swing = odm_get_bb_reg(dm, R_0xc80, 0xFFC00000);
611
612 for (i = 0; i < OFDM_TABLE_SIZE; i++) {
613 table_value = ofdm_swing_table_new[i];
614
615 if (table_value >= 0x100000)
616 table_value >>= 22;
617 if (bb_swing == table_value)
618 break;
619 }
620 } else {
621 #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
622 bb_swing =
623 phy_get_tx_bb_swing_8812a(adapter,
624 hal_data->current_band_type,
625 RF_PATH_A);
626 #else
627 bb_swing = odm_get_bb_reg(dm, R_0xc1c, 0xFFE00000);
628 #endif
629 for (i = 0; i < TXSCALE_TABLE_SIZE; i++) {
630 table_value = tx_scaling_table_jaguar[i];
631
632 if (bb_swing == table_value)
633 break;
634 }
635 }
636
637 return i;
638 }
639
get_cck_swing_index(void * dm_void)640 u8 get_cck_swing_index(void *dm_void)
641 {
642 struct dm_struct *dm = (struct dm_struct *)dm_void;
643
644 u8 i = 0;
645 u32 bb_cck_swing;
646
647 if (dm->support_ic_type &
648 (ODM_RTL8188E | ODM_RTL8723B | ODM_RTL8192E)) {
649 bb_cck_swing = odm_read_1byte(dm, 0xa22);
650
651 for (i = 0; i < CCK_TABLE_SIZE; i++) {
652 if (bb_cck_swing == cck_swing_table_ch1_ch13_new[i][0])
653 break;
654 }
655 } else if (dm->support_ic_type & ODM_RTL8703B) {
656 bb_cck_swing = odm_read_1byte(dm, 0xa22);
657
658 for (i = 0; i < CCK_TABLE_SIZE_88F; i++) {
659 if (bb_cck_swing == cck_swing_table_ch1_ch14_88f[i][0])
660 break;
661 }
662 }
663
664 return i;
665 }
666
667 s8
get_txagc_default_index(void * dm_void)668 get_txagc_default_index(
669 void *dm_void
670 )
671 {
672 struct dm_struct *dm = (struct dm_struct *)dm_void;
673 s8 tmp;
674
675 if (dm->support_ic_type == ODM_RTL8814B) {
676 tmp = (s8)(odm_get_bb_reg(dm, R_0x18a0, 0x7f) & 0xff);
677 if (tmp & BIT(6))
678 tmp = tmp | 0x80;
679 return tmp;
680 } else
681 return 0;
682 }
683
odm_txpowertracking_thermal_meter_init(void * dm_void)684 void odm_txpowertracking_thermal_meter_init(void *dm_void)
685 {
686 struct dm_struct *dm = (struct dm_struct *)dm_void;
687 struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
688 struct _hal_rf_ *rf = &dm->rf_table;
689 struct _halrf_tssi_data *tssi = &rf->halrf_tssi_data;
690
691 u8 swing_idx = get_swing_index(dm);
692 u8 cckswing_idx = get_cck_swing_index(dm);
693 u8 p = 0;
694
695 cali_info->is_txpowertracking = true;
696 cali_info->tx_powercount = 0;
697 cali_info->is_txpowertracking_init = false;
698
699 if (!(*dm->mp_mode))
700 cali_info->txpowertrack_control = true;
701 else
702 cali_info->txpowertrack_control = false;
703
704 if (!(*dm->mp_mode))
705 cali_info->txpowertrack_control = true;
706
707 RF_DBG(dm, DBG_RF_IQK, "dm txpowertrack_control = %d\n",
708 cali_info->txpowertrack_control);
709 #if 0
710 /* dm->rf_calibrate_info.txpowertrack_control = true; */
711 #endif
712 cali_info->thermal_value = rf->eeprom_thermal;
713 cali_info->thermal_value_iqk = rf->eeprom_thermal;
714 cali_info->thermal_value_lck = rf->eeprom_thermal;
715
716 #if (RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
717 if (dm->support_ic_type == ODM_RTL8822C) {
718 cali_info->thermal_value_path[RF_PATH_A] = tssi->thermal[RF_PATH_A];
719 cali_info->thermal_value_path[RF_PATH_B] = tssi->thermal[RF_PATH_B];
720 cali_info->thermal_value_iqk = tssi->thermal[RF_PATH_A];
721 cali_info->thermal_value_lck = tssi->thermal[RF_PATH_A];
722 }
723
724 if (dm->support_ic_type == ODM_RTL8814B) {
725 cali_info->thermal_value_path[RF_PATH_A] = tssi->thermal[RF_PATH_A];
726 cali_info->thermal_value_path[RF_PATH_B] = tssi->thermal[RF_PATH_B];
727 cali_info->thermal_value_path[RF_PATH_C] = tssi->thermal[RF_PATH_C];
728 cali_info->thermal_value_path[RF_PATH_D] = tssi->thermal[RF_PATH_D];
729 cali_info->thermal_value_iqk = tssi->thermal[RF_PATH_A];
730 cali_info->thermal_value_lck = tssi->thermal[RF_PATH_A];
731 }
732 #endif
733
734 if (!cali_info->default_bb_swing_index_flag) {
735 if (dm->support_ic_type &
736 (ODM_RTL8188E | ODM_RTL8723B | ODM_RTL8192E |
737 ODM_RTL8703B | ODM_RTL8821)) {
738 if (swing_idx >= OFDM_TABLE_SIZE)
739 cali_info->default_ofdm_index = 30;
740 else
741 cali_info->default_ofdm_index = swing_idx;
742
743 if (cckswing_idx >= CCK_TABLE_SIZE)
744 cali_info->default_cck_index = 20;
745 else
746 cali_info->default_cck_index = cckswing_idx;
747 /*@add by Mingzhi.Guo 2015-03-23*/
748 } else if (dm->support_ic_type == ODM_RTL8188F) {
749 cali_info->default_ofdm_index = 28; /*OFDM: -1dB*/
750 cali_info->default_cck_index = 20; /*CCK:-6dB*/
751 /*@add by zhaohe 2015-10-27*/
752 } else if (dm->support_ic_type == ODM_RTL8723D) {
753 cali_info->default_ofdm_index = 28; /*OFDM: -1dB*/
754 cali_info->default_cck_index = 28; /*CCK: -6dB*/
755 /*@JJ ADD 20161014 */
756 } else if (dm->support_ic_type == ODM_RTL8710B) {
757 cali_info->default_ofdm_index = 28; /*OFDM: -1dB*/
758 cali_info->default_cck_index = 28; /*CCK: -6dB*/
759 } else if (dm->support_ic_type == ODM_RTL8192F) {
760 cali_info->default_ofdm_index = 30;/*OFDM: 0dB*/
761 cali_info->default_cck_index = 28; /*CCK: -6dB*/
762 } else {
763 if (swing_idx >= TXSCALE_TABLE_SIZE)
764 cali_info->default_ofdm_index = 24;
765 else
766 cali_info->default_ofdm_index = swing_idx;
767
768 cali_info->default_txagc_index = get_txagc_default_index(dm);
769
770 cali_info->default_cck_index = 24;
771 }
772 cali_info->default_bb_swing_index_flag = true;
773 }
774
775 cali_info->bb_swing_idx_cck_base = cali_info->default_cck_index;
776 cali_info->CCK_index = cali_info->default_cck_index;
777
778 for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) {
779 cali_info->bb_swing_idx_ofdm_base[p] =
780 cali_info->default_ofdm_index;
781 cali_info->OFDM_index[p] = cali_info->default_ofdm_index;
782 cali_info->delta_power_index[p] = 0;
783 cali_info->delta_power_index_last[p] = 0;
784 cali_info->power_index_offset[p] = 0;
785 }
786 cali_info->modify_tx_agc_value_ofdm = 0;
787 cali_info->modify_tx_agc_value_cck = 0;
788 cali_info->tm_trigger = 0;
789 }
790
odm_txpowertracking_check(void * dm_void)791 void odm_txpowertracking_check(void *dm_void)
792 {
793 /*@2011/09/29 MH In HW integration first stage
794 * we provide 4 different handle to operate at the same time.
795 * In the stage2/3, we need to prive universal interface and merge all
796 * HW dynamic mechanism.
797 */
798 struct dm_struct *dm = (struct dm_struct *)dm_void;
799
800 switch (dm->support_platform) {
801 case ODM_WIN:
802 odm_txpowertracking_check_mp(dm);
803 break;
804
805 case ODM_CE:
806 odm_txpowertracking_check_ce(dm);
807 break;
808
809 case ODM_AP:
810 odm_txpowertracking_check_ap(dm);
811 break;
812
813 default:
814 break;
815 }
816 }
817
odm_txpowertracking_check_ce(void * dm_void)818 void odm_txpowertracking_check_ce(void *dm_void)
819 {
820 struct dm_struct *dm = (struct dm_struct *)dm_void;
821 struct _hal_rf_ *rf = &dm->rf_table;
822 struct _halrf_tssi_data *tssi = &rf->halrf_tssi_data;
823
824 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
825 if (!(rf->rf_supportability & HAL_RF_TX_PWR_TRACK))
826 return;
827
828 if ((rf->power_track_type & 0xf0) >> 4 != 0) {
829 if (dm->support_ic_type & ODM_RTL8822C) {
830 /*halrf_tssi_cck(dm);*/
831 /*halrf_thermal_cck(dm);*/
832 return;
833 }
834 }
835
836 if (!dm->rf_calibrate_info.tm_trigger) {
837 if (dm->support_ic_type &
838 (ODM_RTL8188E | ODM_RTL8188F | ODM_RTL8192E |
839 ODM_RTL8723B | ODM_RTL8812 | ODM_RTL8821 |
840 ODM_RTL8814A | ODM_RTL8703B | ODM_RTL8723D |
841 ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8710B |
842 ODM_RTL8192F))
843 odm_set_rf_reg(dm, RF_PATH_A, RF_T_METER_NEW,
844 (BIT(17) | BIT(16)), 0x03);
845 else if (dm->support_ic_type & ODM_RTL8822C) {
846 odm_set_rf_reg(dm, RF_PATH_A, R_0x42, BIT(19), 0x01);
847 odm_set_rf_reg(dm, RF_PATH_A, R_0x42, BIT(19), 0x00);
848 odm_set_rf_reg(dm, RF_PATH_A, R_0x42, BIT(19), 0x01);
849
850 odm_set_rf_reg(dm, RF_PATH_B, R_0x42, BIT(19), 0x01);
851 odm_set_rf_reg(dm, RF_PATH_B, R_0x42, BIT(19), 0x00);
852 odm_set_rf_reg(dm, RF_PATH_B, R_0x42, BIT(19), 0x01);
853 } else if (dm->support_ic_type & ODM_RTL8814B) {
854 odm_set_rf_reg(dm, RF_PATH_A, 0x42, BIT(17), 0x1);
855 odm_set_rf_reg(dm, RF_PATH_B, 0x42, BIT(17), 0x1);
856 odm_set_rf_reg(dm, RF_PATH_C, 0x42, BIT(17), 0x1);
857 odm_set_rf_reg(dm, RF_PATH_D, 0x42, BIT(17), 0x1);
858 } else
859 odm_set_rf_reg(dm, RF_PATH_A, RF_T_METER_OLD,
860 RFREGOFFSETMASK, 0x60);
861
862 #if (RTL8814B_SUPPORT == 1)
863 if (dm->support_ic_type & ODM_RTL8814B) {
864 ODM_delay_us(300);
865 odm_txpowertracking_new_callback_thermal_meter(dm);
866 tssi->thermal_trigger = 1;
867 }
868 #endif
869 dm->rf_calibrate_info.tm_trigger = 1;
870 return;
871 }
872
873 if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8814B)) {
874 #if (RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
875 odm_txpowertracking_new_callback_thermal_meter(dm);
876 if (dm->support_ic_type & ODM_RTL8814B)
877 tssi->thermal_trigger = 0;
878 #endif
879 } else
880 odm_txpowertracking_callback_thermal_meter(dm);
881 dm->rf_calibrate_info.tm_trigger = 0;
882 #endif
883 }
884
885 void
odm_txpowertracking_direct_ce(void * dm_void)886 odm_txpowertracking_direct_ce(void *dm_void)
887 {
888 struct dm_struct *dm = (struct dm_struct *)dm_void;
889 struct _hal_rf_ *rf = &dm->rf_table;
890 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
891
892 if (!(rf->rf_supportability & HAL_RF_TX_PWR_TRACK))
893 return;
894
895 if (dm->support_ic_type & ODM_RTL8822C) {
896 /*halrf_tssi_cck(dm);*/
897 /*halrf_thermal_cck(dm);*/
898 return;
899 }
900
901 if (dm->support_ic_type &
902 (ODM_RTL8188E | ODM_RTL8188F | ODM_RTL8192E |
903 ODM_RTL8723B | ODM_RTL8812 | ODM_RTL8821 |
904 ODM_RTL8814A | ODM_RTL8703B | ODM_RTL8723D |
905 ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8710B |
906 ODM_RTL8192F | ODM_RTL8814B))
907 odm_set_rf_reg(dm, RF_PATH_A, RF_T_METER_NEW, (BIT(17) | BIT(16)), 0x03);
908 else if (dm->support_ic_type & ODM_RTL8822C) {
909 odm_set_rf_reg(dm, RF_PATH_A, R_0x42, BIT(19), 0x01);
910 odm_set_rf_reg(dm, RF_PATH_A, R_0x42, BIT(19), 0x00);
911 odm_set_rf_reg(dm, RF_PATH_A, R_0x42, BIT(19), 0x01);
912
913 odm_set_rf_reg(dm, RF_PATH_B, R_0x42, BIT(19), 0x01);
914 odm_set_rf_reg(dm, RF_PATH_B, R_0x42, BIT(19), 0x00);
915 odm_set_rf_reg(dm, RF_PATH_B, R_0x42, BIT(19), 0x01);
916 } else
917 odm_set_rf_reg(dm, RF_PATH_A, RF_T_METER_OLD, RFREGOFFSETMASK, 0x60);
918
919 if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8814B)) {
920 #if (RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
921 odm_txpowertracking_new_callback_thermal_meter(dm);
922 #endif
923 } else
924 odm_txpowertracking_callback_thermal_meter(dm);
925 #endif
926
927 }
928
929
odm_txpowertracking_check_mp(void * dm_void)930 void odm_txpowertracking_check_mp(void *dm_void)
931 {
932 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
933 struct dm_struct *dm = (struct dm_struct *)dm_void;
934 void *adapter = dm->adapter;
935
936 if (odm_check_power_status(adapter) == false) {
937 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
938 ("check_pow_status, return false\n"));
939 return;
940 }
941
942 odm_txpowertracking_thermal_meter_check(adapter);
943 #endif
944 }
945
odm_txpowertracking_check_ap(void * dm_void)946 void odm_txpowertracking_check_ap(void *dm_void)
947 {
948 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
949 struct dm_struct *dm = (struct dm_struct *)dm_void;
950 struct rtl8192cd_priv *priv = dm->priv;
951
952 return;
953
954 #endif
955 }
956