xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8189fs/hal/phydm/halrf/halrf_powertracking_ce.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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