OSDN Git Service

Add rtl8821ce driver version 5.5.2
[android-x86/external-kernel-drivers.git] / rtl8821ce / hal / phydm / phydm_powertracking_win.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20
21 /* ************************************************************
22  * include files
23  * ************************************************************ */
24 #include "mp_precomp.h"
25 #include "phydm_precomp.h"
26
27 /* ************************************************************
28  * Global var
29  * ************************************************************ */
30
31 u32     ofdm_swing_table[OFDM_TABLE_SIZE] = {
32         0x7f8001fe,     /* 0, +6.0dB */
33         0x788001e2,     /* 1, +5.5dB */
34         0x71c001c7,     /* 2, +5.0dB */
35         0x6b8001ae,     /* 3, +4.5dB */
36         0x65400195,     /* 4, +4.0dB */
37         0x5fc0017f,     /* 5, +3.5dB */
38         0x5a400169,     /* 6, +3.0dB */
39         0x55400155,     /* 7, +2.5dB */
40         0x50800142,     /* 8, +2.0dB */
41         0x4c000130,     /* 9, +1.5dB */
42         0x47c0011f,     /* 10, +1.0dB */
43         0x43c0010f,     /* 11, +0.5dB */
44         0x40000100,     /* 12, +0dB */
45         0x3c8000f2,     /* 13, -0.5dB */
46         0x390000e4,     /* 14, -1.0dB */
47         0x35c000d7,     /* 15, -1.5dB */
48         0x32c000cb,     /* 16, -2.0dB */
49         0x300000c0,     /* 17, -2.5dB */
50         0x2d4000b5,     /* 18, -3.0dB */
51         0x2ac000ab,     /* 19, -3.5dB */
52         0x288000a2,     /* 20, -4.0dB */
53         0x26000098,     /* 21, -4.5dB */
54         0x24000090,     /* 22, -5.0dB */
55         0x22000088,     /* 23, -5.5dB */
56         0x20000080,     /* 24, -6.0dB */
57         0x1e400079,     /* 25, -6.5dB */
58         0x1c800072,     /* 26, -7.0dB */
59         0x1b00006c,     /* 27. -7.5dB */
60         0x19800066,     /* 28, -8.0dB */
61         0x18000060,     /* 29, -8.5dB */
62         0x16c0005b,     /* 30, -9.0dB */
63         0x15800056,     /* 31, -9.5dB */
64         0x14400051,     /* 32, -10.0dB */
65         0x1300004c,     /* 33, -10.5dB */
66         0x12000048,     /* 34, -11.0dB */
67         0x11000044,     /* 35, -11.5dB */
68         0x10000040,     /* 36, -12.0dB */
69 };
70
71 u8      cck_swing_table_ch1_ch13[CCK_TABLE_SIZE][8] = {
72         {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},       /* 0, +0dB */
73         {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},       /* 1, -0.5dB */
74         {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},       /* 2, -1.0dB */
75         {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},       /* 3, -1.5dB */
76         {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},       /* 4, -2.0dB */
77         {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},       /* 5, -2.5dB */
78         {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},       /* 6, -3.0dB */
79         {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},       /* 7, -3.5dB */
80         {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},       /* 8, -4.0dB */
81         {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},       /* 9, -4.5dB */
82         {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},       /* 10, -5.0dB */
83         {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},       /* 11, -5.5dB */
84         {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},       /* 12, -6.0dB <== default */
85         {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},       /* 13, -6.5dB */
86         {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},       /* 14, -7.0dB */
87         {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},       /* 15, -7.5dB */
88         {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},       /* 16, -8.0dB */
89         {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},       /* 17, -8.5dB */
90         {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},       /* 18, -9.0dB */
91         {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       /* 19, -9.5dB */
92         {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       /* 20, -10.0dB */
93         {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},       /* 21, -10.5dB */
94         {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},       /* 22, -11.0dB */
95         {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},       /* 23, -11.5dB */
96         {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},       /* 24, -12.0dB */
97         {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},       /* 25, -12.5dB */
98         {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},       /* 26, -13.0dB */
99         {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},       /* 27, -13.5dB */
100         {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},       /* 28, -14.0dB */
101         {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},       /* 29, -14.5dB */
102         {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},       /* 30, -15.0dB */
103         {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},       /* 31, -15.5dB */
104         {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}        /* 32, -16.0dB */
105 };
106
107
108 u8      cck_swing_table_ch14[CCK_TABLE_SIZE][8] = {
109         {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},       /* 0, +0dB */
110         {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},       /* 1, -0.5dB */
111         {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},       /* 2, -1.0dB */
112         {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},       /* 3, -1.5dB */
113         {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},       /* 4, -2.0dB */
114         {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},       /* 5, -2.5dB */
115         {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},       /* 6, -3.0dB */
116         {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},       /* 7, -3.5dB */
117         {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},       /* 8, -4.0dB */
118         {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},       /* 9, -4.5dB */
119         {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},       /* 10, -5.0dB */
120         {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},       /* 11, -5.5dB */
121         {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},       /* 12, -6.0dB  <== default */
122         {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},       /* 13, -6.5dB */
123         {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},       /* 14, -7.0dB */
124         {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},       /* 15, -7.5dB */
125         {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},       /* 16, -8.0dB */
126         {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},       /* 17, -8.5dB */
127         {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},       /* 18, -9.0dB */
128         {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       /* 19, -9.5dB */
129         {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       /* 20, -10.0dB */
130         {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},       /* 21, -10.5dB */
131         {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},       /* 22, -11.0dB */
132         {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       /* 23, -11.5dB */
133         {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       /* 24, -12.0dB */
134         {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},       /* 25, -12.5dB */
135         {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       /* 26, -13.0dB */
136         {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       /* 27, -13.5dB */
137         {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 28, -14.0dB */
138         {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 29, -14.5dB */
139         {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 30, -15.0dB */
140         {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 31, -15.5dB */
141         {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}        /* 32, -16.0dB */
142 };
143
144
145 u32 ofdm_swing_table_new[OFDM_TABLE_SIZE] = {
146         0x0b40002d, /* 0,  -15.0dB */
147         0x0c000030, /* 1,  -14.5dB */
148         0x0cc00033, /* 2,  -14.0dB */
149         0x0d800036, /* 3,  -13.5dB */
150         0x0e400039, /* 4,  -13.0dB */
151         0x0f00003c, /* 5,  -12.5dB */
152         0x10000040, /* 6,  -12.0dB */
153         0x11000044, /* 7,  -11.5dB */
154         0x12000048, /* 8,  -11.0dB */
155         0x1300004c, /* 9,  -10.5dB */
156         0x14400051, /* 10, -10.0dB */
157         0x15800056, /* 11, -9.5dB */
158         0x16c0005b, /* 12, -9.0dB */
159         0x18000060, /* 13, -8.5dB */
160         0x19800066, /* 14, -8.0dB */
161         0x1b00006c, /* 15, -7.5dB */
162         0x1c800072, /* 16, -7.0dB */
163         0x1e400079, /* 17, -6.5dB */
164         0x20000080, /* 18, -6.0dB */
165         0x22000088, /* 19, -5.5dB */
166         0x24000090, /* 20, -5.0dB */
167         0x26000098, /* 21, -4.5dB */
168         0x288000a2, /* 22, -4.0dB */
169         0x2ac000ab, /* 23, -3.5dB */
170         0x2d4000b5, /* 24, -3.0dB */
171         0x300000c0, /* 25, -2.5dB */
172         0x32c000cb, /* 26, -2.0dB */
173         0x35c000d7, /* 27, -1.5dB */
174         0x390000e4, /* 28, -1.0dB */
175         0x3c8000f2, /* 29, -0.5dB */
176         0x40000100, /* 30, +0dB */
177         0x43c0010f, /* 31, +0.5dB */
178         0x47c0011f, /* 32, +1.0dB */
179         0x4c000130, /* 33, +1.5dB */
180         0x50800142, /* 34, +2.0dB */
181         0x55400155, /* 35, +2.5dB */
182         0x5a400169, /* 36, +3.0dB */
183         0x5fc0017f, /* 37, +3.5dB */
184         0x65400195, /* 38, +4.0dB */
185         0x6b8001ae, /* 39, +4.5dB */
186         0x71c001c7, /* 40, +5.0dB */
187         0x788001e2, /* 41, +5.5dB */
188         0x7f8001fe  /* 42, +6.0dB */
189 };
190
191
192 u8 cck_swing_table_ch1_ch14_88f[CCK_TABLE_SIZE_88F][16] = {
193         {0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-16dB*/
194         {0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15.5dB*/
195         {0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15dB*/
196         {0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14.5dB*/
197         {0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14dB*/
198         {0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13.5dB*/
199         {0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13dB*/
200         {0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12.5dB*/
201         {0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12dB*/
202         {0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11.5dB*/
203         {0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11dB*/
204         {0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10.5dB*/
205         {0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10dB*/
206         {0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9.5dB*/
207         {0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9dB*/
208         {0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8.5dB*/
209         {0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8dB*/
210         {0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7.5dB*/
211         {0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7dB*/
212         {0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-6.5dB*/
213         {0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     /*-6dB*/
214 };
215
216
217 u8 cck_swing_table_ch1_ch13_88f[CCK_TABLE_SIZE_88F][16] = {
218         {0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-16dB*/
219         {0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15.5dB*/
220         {0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15dB*/
221         {0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14.5dB*/
222         {0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14dB*/
223         {0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13.5dB*/
224         {0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13dB*/
225         {0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12.5dB*/
226         {0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12dB*/
227         {0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11.5dB*/
228         {0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11dB*/
229         {0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10.5dB*/
230         {0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10dB*/
231         {0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9.5dB*/
232         {0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9dB*/
233         {0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8.5dB*/
234         {0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8dB*/
235         {0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7.5dB*/
236         {0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7dB*/
237         {0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-6.5dB*/
238         {0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     /*-6dB*/
239 };
240
241
242 u8 cck_swing_table_ch14_88f[CCK_TABLE_SIZE_88F][16] = {
243         {0x44,   0x42, 0x3C, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-16dB*/
244         {0x48, 0x46, 0x3F, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15.5dB*/
245         {0x4D, 0x4A, 0x43, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-15dB*/
246         {0x51, 0x4F, 0x47, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},           /*-14.5dB*/
247         {0x56, 0x53, 0x4B, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-14dB*/
248         {0x5B, 0x58, 0x50, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13.5dB*/
249         {0x60, 0x5D, 0x54, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-13dB*/
250         {0x66, 0x63, 0x59, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12.5dB*/
251         {0x6C, 0x69, 0x5F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-12dB*/
252         {0x73, 0x6F, 0x64, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11.5dB*/
253         {0x79, 0x76, 0x6A, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-11dB*/
254         {0x81, 0x7C, 0x71, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10.5dB*/
255         {0x88, 0x84, 0x77, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-10dB*/
256         {0x90, 0x8C, 0x7E, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9.5dB*/
257         {0x99, 0x94, 0x86, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-9dB*/
258         {0xA2, 0x9D, 0x8E, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8.5dB*/
259         {0xAC, 0xA6, 0x96, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-8dB*/
260         {0xB6, 0xB0, 0x9F, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7.5dB*/
261         {0xC1, 0xBA, 0xA8, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-7dB*/
262         {0xCC, 0xC5, 0xB2, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    /*-6.5dB*/
263         {0xD8, 0xD1, 0xBD, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     /*-6dB*/
264 };
265
266
267 u8 cck_swing_table_ch1_ch13_new[CCK_TABLE_SIZE][8] = {
268         {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01},       /* 0, -16.0dB */
269         {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},       /* 1, -15.5dB */
270         {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},       /* 2, -15.0dB */
271         {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},       /* 3, -14.5dB */
272         {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},       /* 4, -14.0dB */
273         {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},       /* 5, -13.5dB */
274         {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},       /* 6, -13.0dB */
275         {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},       /* 7, -12.5dB */
276         {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},       /* 8, -12.0dB */
277         {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},       /* 9, -11.5dB */
278         {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},       /* 10, -11.0dB */
279         {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},       /* 11, -10.5dB */
280         {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       /* 12, -10.0dB */
281         {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},       /* 13, -9.5dB */
282         {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},       /* 14, -9.0dB */
283         {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},       /* 15, -8.5dB */
284         {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},       /* 16, -8.0dB */
285         {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},       /* 17, -7.5dB */
286         {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},       /* 18, -7.0dB */
287         {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},       /* 19, -6.5dB */
288         {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},       /* 20, -6.0dB */
289         {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},       /* 21, -5.5dB */
290         {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},       /* 22, -5.0dB */
291         {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},       /* 23, -4.5dB */
292         {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},       /* 24, -4.0dB */
293         {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},       /* 25, -3.5dB */
294         {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},       /* 26, -3.0dB */
295         {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},       /* 27, -2.5dB */
296         {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},       /* 28, -2.0dB */
297         {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},       /* 29, -1.5dB */
298         {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},       /* 30, -1.0dB */
299         {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},       /* 31, -0.5dB */
300         {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}        /* 32, +0dB */
301 };
302
303
304 u8 cck_swing_table_ch14_new[CCK_TABLE_SIZE][8] = {
305         {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00},       /* 0, -16.0dB */
306         {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 1, -15.5dB */
307         {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 2, -15.0dB */
308         {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 3, -14.5dB */
309         {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},       /* 4, -14.0dB */
310         {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       /* 5, -13.5dB */
311         {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},       /* 6, -13.0dB */
312         {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},       /* 7, -12.5dB */
313         {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       /* 8, -12.0dB */
314         {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},       /* 9, -11.5dB */
315         {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},       /* 10, -11.0dB */
316         {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},       /* 11, -10.5dB */
317         {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       /* 12, -10.0dB */
318         {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},       /* 13, -9.5dB */
319         {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},       /* 14, -9.0dB */
320         {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},       /* 15, -8.5dB */
321         {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},       /* 16, -8.0dB */
322         {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},       /* 17, -7.5dB */
323         {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},       /* 18, -7.0dB */
324         {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},       /* 19, -6.5dB */
325         {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},       /* 20, -6.0dB */
326         {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},       /* 21, -5.5dB */
327         {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},       /* 22, -5.0dB */
328         {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},       /* 23, -4.5dB */
329         {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},       /* 24, -4.0dB */
330         {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},       /* 25, -3.5dB */
331         {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},       /* 26, -3.0dB */
332         {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},       /* 27, -2.5dB */
333         {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},       /* 28, -2.0dB */
334         {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},       /* 29, -1.5dB */
335         {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},       /* 30, -1.0dB */
336         {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},       /* 31, -0.5dB */
337         {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}        /* 32, +0dB */
338 };
339 u32 cck_swing_table_ch1_ch14_8723d[CCK_TABLE_SIZE_8723D] = {
340         0x0CD,
341         0x0D9,
342         0x0E6,
343         0x0F3,
344         0x102,
345         0x111,
346         0x121,
347         0x132,
348         0x144,
349         0x158,
350         0x16C,
351         0x182,
352         0x198,
353         0x1B1,
354         0x1CA,
355         0x1E5,
356         0x202,
357         0x221,
358         0x241,
359         0x263,
360         0x287,
361         0x2AE,
362         0x2D6,
363         0x301,
364         0x32F,
365         0x35F,
366         0x392,
367         0x3C9,
368         0x402,
369         0x43F,
370         0x47F,
371         0x4C3,
372         0x50C,
373         0x558,
374         0x5A9,
375         0x5FF,
376         0x65A,
377         0x6BA,
378         0x720,
379         0x78C,
380         0x7FF,
381 };
382 /* JJ ADD 20161014 */
383 u32 cck_swing_table_ch1_ch14_8710b[CCK_TABLE_SIZE_8710B] = {
384         0x0CD,                   /*0 ,    -20dB*/
385         0x0D9,
386         0x0E6,
387         0x0F3,
388         0x102,
389         0x111,
390         0x121,
391         0x132,
392         0x144,
393         0x158,
394         0x16C,
395         0x182,
396         0x198,
397         0x1B1,
398         0x1CA,
399         0x1E5,
400         0x202,
401         0x221,
402         0x241,
403         0x263,          /*19*/
404         0x287,          /*20*/
405         0x2AE,          /*21*/
406         0x2D6,          /*22*/
407         0x301,          /*23*/
408         0x32F,          /*24*/
409         0x35F,          /*25*/
410         0x392,          /*26*/
411         0x3C9,          /*27*/
412         0x402,          /*28*/
413         0x43F,          /*29*/
414         0x47F,          /*30*/
415         0x4C3,          /*31*/
416         0x50C,          /*32*/
417         0x558,          /*33*/
418         0x5A9,          /*34*/
419         0x5FF,          /*35*/
420         0x65A,          /*36*/
421         0x6BA,
422         0x720,
423         0x78C,
424         0x7FF,
425 };
426
427
428 u32 tx_scaling_table_jaguar[TXSCALE_TABLE_SIZE] = {
429         0x081, /* 0,  -12.0dB */
430         0x088, /* 1,  -11.5dB */
431         0x090, /* 2,  -11.0dB */
432         0x099, /* 3,  -10.5dB */
433         0x0A2, /* 4,  -10.0dB */
434         0x0AC, /* 5,  -9.5dB */
435         0x0B6, /* 6,  -9.0dB */
436         0x0C0, /* 7,  -8.5dB */
437         0x0CC, /* 8,  -8.0dB */
438         0x0D8, /* 9,  -7.5dB */
439         0x0E5, /* 10, -7.0dB */
440         0x0F2, /* 11, -6.5dB */
441         0x101, /* 12, -6.0dB */
442         0x110, /* 13, -5.5dB */
443         0x120, /* 14, -5.0dB */
444         0x131, /* 15, -4.5dB */
445         0x143, /* 16, -4.0dB */
446         0x156, /* 17, -3.5dB */
447         0x16A, /* 18, -3.0dB */
448         0x180, /* 19, -2.5dB */
449         0x197, /* 20, -2.0dB */
450         0x1AF, /* 21, -1.5dB */
451         0x1C8, /* 22, -1.0dB */
452         0x1E3, /* 23, -0.5dB */
453         0x200, /* 24, +0  dB */
454         0x21E, /* 25, +0.5dB */
455         0x23E, /* 26, +1.0dB */
456         0x261, /* 27, +1.5dB */
457         0x285, /* 28, +2.0dB */
458         0x2AB, /* 29, +2.5dB */
459         0x2D3, /* 30, +3.0dB */
460         0x2FE, /* 31, +3.5dB */
461         0x32B, /* 32, +4.0dB */
462         0x35C, /* 33, +4.5dB */
463         0x38E, /* 34, +5.0dB */
464         0x3C4, /* 35, +5.5dB */
465         0x3FE  /* 36, +6.0dB */
466 };
467
468
469 #ifdef AP_BUILD_WORKAROUND
470
471 unsigned int tx_pwr_trk_ofdm_swing_tbl[tx_pwr_trk_ofdm_swing_tbl_len] = {
472         /*  +6.0dB */ 0x7f8001fe,
473         /*  +5.5dB */ 0x788001e2,
474         /*  +5.0dB */ 0x71c001c7,
475         /*  +4.5dB */ 0x6b8001ae,
476         /*  +4.0dB */ 0x65400195,
477         /*  +3.5dB */ 0x5fc0017f,
478         /*  +3.0dB */ 0x5a400169,
479         /*  +2.5dB */ 0x55400155,
480         /*  +2.0dB */ 0x50800142,
481         /*  +1.5dB */ 0x4c000130,
482         /*  +1.0dB */ 0x47c0011f,
483         /*  +0.5dB */ 0x43c0010f,
484         /*   0.0dB */ 0x40000100,
485         /*  -0.5dB */ 0x3c8000f2,
486         /*  -1.0dB */ 0x390000e4,
487         /*  -1.5dB */ 0x35c000d7,
488         /*  -2.0dB */ 0x32c000cb,
489         /*  -2.5dB */ 0x300000c0,
490         /*  -3.0dB */ 0x2d4000b5,
491         /*  -3.5dB */ 0x2ac000ab,
492         /*  -4.0dB */ 0x288000a2,
493         /*  -4.5dB */ 0x26000098,
494         /*  -5.0dB */ 0x24000090,
495         /*  -5.5dB */ 0x22000088,
496         /*  -6.0dB */ 0x20000080,
497         /*  -6.5dB */ 0x1a00006c,
498         /*  -7.0dB */ 0x1c800072,
499         /*  -7.5dB */ 0x18000060,
500         /*  -8.0dB */ 0x19800066,
501         /*  -8.5dB */ 0x15800056,
502         /*  -9.0dB */ 0x26c0005b,
503         /*  -9.5dB */ 0x14400051,
504         /* -10.0dB */ 0x24400051,
505         /* -10.5dB */ 0x1300004c,
506         /* -11.0dB */ 0x12000048,
507         /* -11.5dB */ 0x11000044,
508         /* -12.0dB */ 0x10000040
509 };
510
511 #endif
512
513 void
514 odm_txpowertracking_init(
515         void            *p_dm_void
516 )
517 {
518         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
519 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
520         if (!(p_dm_odm->support_ic_type & (ODM_RTL8814A | ODM_IC_11N_SERIES | ODM_RTL8822B)))
521                 return;
522 #endif
523
524         odm_txpowertracking_thermal_meter_init(p_dm_odm);
525 }
526
527 u8
528 get_swing_index(
529         void            *p_dm_void
530 )
531 {
532         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
533         struct _ADAPTER         *adapter = p_dm_odm->adapter;
534         HAL_DATA_TYPE   *p_hal_data = GET_HAL_DATA(adapter);
535         u8                      i = 0;
536         u32                     bb_swing;
537         u32                     swing_table_size;
538         u32                     *p_swing_table;
539
540         if (p_dm_odm->support_ic_type == ODM_RTL8188E || p_dm_odm->support_ic_type == ODM_RTL8723B ||
541             p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type == ODM_RTL8188F || p_dm_odm->support_ic_type == ODM_RTL8703B) {
542                 bb_swing = odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, 0xFFC00000);
543
544                 p_swing_table = ofdm_swing_table_new;
545                 swing_table_size = OFDM_TABLE_SIZE;
546         } else {
547                 bb_swing = PHY_GetTxBBSwing_8812A(adapter, p_hal_data->CurrentBandType, ODM_RF_PATH_A);
548                 p_swing_table = tx_scaling_table_jaguar;
549                 swing_table_size = TXSCALE_TABLE_SIZE;
550         }
551
552         for (i = 0; i < swing_table_size; ++i) {
553                 u32 table_value = p_swing_table[i];
554
555                 if (table_value >= 0x100000)
556                         table_value >>= 22;
557                 if (bb_swing == table_value)
558                         break;
559         }
560         return i;
561 }
562
563 u8
564 get_cck_swing_index(
565         void            *p_dm_void
566 )
567 {
568         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
569
570         u8                      i = 0;
571         u32                     bb_cck_swing;
572
573         if (p_dm_odm->support_ic_type == ODM_RTL8188E || p_dm_odm->support_ic_type == ODM_RTL8723B ||
574             p_dm_odm->support_ic_type == ODM_RTL8192E) {
575                 bb_cck_swing = odm_read_1byte(p_dm_odm, 0xa22);
576
577                 for (i = 0; i < CCK_TABLE_SIZE; i++) {
578                         if (bb_cck_swing == cck_swing_table_ch1_ch13_new[i][0])
579                                 break;
580                 }
581         } else if (p_dm_odm->support_ic_type == ODM_RTL8703B) {
582                 bb_cck_swing = odm_read_1byte(p_dm_odm, 0xa22);
583
584                 for (i = 0; i < CCK_TABLE_SIZE_88F; i++) {
585                         if (bb_cck_swing == cck_swing_table_ch1_ch14_88f[i][0])
586                                 break;
587                 }
588         }
589
590         return i;
591 }
592
593
594 void
595 odm_txpowertracking_thermal_meter_init(
596         void            *p_dm_void
597 )
598 {
599         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
600         u8 default_swing_index = get_swing_index(p_dm_odm);
601         u8 default_cck_swing_index = get_cck_swing_index(p_dm_odm);
602         struct odm_rf_calibration_structure     *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
603
604 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
605         struct _ADAPTER         *adapter = p_dm_odm->adapter;
606         HAL_DATA_TYPE   *p_hal_data = GET_HAL_DATA(adapter);
607         u8                      p = 0;
608
609         if (p_dm_odm->mp_mode == false)
610                 p_rf_calibrate_info->txpowertrack_control = true;
611 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
612 #ifdef CONFIG_RTL8188E
613         {
614                 p_rf_calibrate_info->is_txpowertracking = _TRUE;
615                 p_rf_calibrate_info->tx_powercount = 0;
616                 p_rf_calibrate_info->is_txpowertracking_init = _FALSE;
617
618                 if (p_dm_odm->mp_mode == false)
619                         p_rf_calibrate_info->txpowertrack_control = _TRUE;
620
621                 MSG_8192C("p_dm_odm txpowertrack_control = %d\n", p_rf_calibrate_info->txpowertrack_control);
622         }
623 #else
624         {
625                 struct _ADAPTER         *adapter = p_dm_odm->adapter;
626                 HAL_DATA_TYPE   *p_hal_data = GET_HAL_DATA(adapter);
627                 struct dm_priv  *pdmpriv = &p_hal_data->dmpriv;
628
629                 pdmpriv->is_txpowertracking = _TRUE;
630                 pdmpriv->tx_powercount = 0;
631                 pdmpriv->is_txpowertracking_init = _FALSE;
632
633                 if (p_dm_odm->mp_mode == false)
634                         pdmpriv->txpowertrack_control = _TRUE;
635
636                 MSG_8192C("pdmpriv->txpowertrack_control = %d\n", pdmpriv->txpowertrack_control);
637
638         }
639 #endif
640 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
641 #ifdef RTL8188E_SUPPORT
642         {
643                 p_rf_calibrate_info->is_txpowertracking = _TRUE;
644                 p_rf_calibrate_info->tx_powercount = 0;
645                 p_rf_calibrate_info->is_txpowertracking_init = _FALSE;
646                 p_rf_calibrate_info->txpowertrack_control = _TRUE;
647         }
648 #endif
649 #endif
650
651 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
652 #if (MP_DRIVER == 1)
653         p_rf_calibrate_info->txpowertrack_control = false;
654 #else
655         p_rf_calibrate_info->txpowertrack_control = true;
656 #endif
657 #else
658         p_rf_calibrate_info->txpowertrack_control = true;
659 #endif
660
661         p_rf_calibrate_info->thermal_value              = p_hal_data->eeprom_thermal_meter;
662         p_rf_calibrate_info->thermal_value_iqk  = p_hal_data->eeprom_thermal_meter;
663         p_rf_calibrate_info->thermal_value_lck  = p_hal_data->eeprom_thermal_meter;
664
665         if (p_rf_calibrate_info->default_bb_swing_index_flag != true) {
666                 /*The index of "0 dB" in SwingTable.*/
667                 if (p_dm_odm->support_ic_type == ODM_RTL8188E || p_dm_odm->support_ic_type == ODM_RTL8723B ||
668                     p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type == ODM_RTL8703B) {
669                         p_rf_calibrate_info->default_ofdm_index = (default_swing_index >= OFDM_TABLE_SIZE) ? 30 : default_swing_index;
670                         p_rf_calibrate_info->default_cck_index = (default_cck_swing_index >= CCK_TABLE_SIZE) ? 20 : default_cck_swing_index;
671                 } else if (p_dm_odm->support_ic_type == ODM_RTL8188F) {          /*add by Mingzhi.Guo  2015-03-23*/
672                         p_rf_calibrate_info->default_ofdm_index = 28;                                                   /*OFDM: -1dB*/
673                         p_rf_calibrate_info->default_cck_index = 20;                                                    /*CCK:-6dB*/
674                 } else if (p_dm_odm->support_ic_type == ODM_RTL8723D) {                  /*add by zhaohe  2015-10-27*/
675                         p_rf_calibrate_info->default_ofdm_index = 28;                                                      /*OFDM: -1dB*/
676                         p_rf_calibrate_info->default_cck_index = 28;                                                    /*CCK:   -6dB*/
677                         /* JJ ADD 20161014 */
678                 } else if (p_dm_odm->support_ic_type == ODM_RTL8710B) {
679                         p_rf_calibrate_info->default_ofdm_index = 28;                                   /*OFDM: -1dB*/
680                         p_rf_calibrate_info->default_cck_index = 28;                                    /*CCK:   -6dB*/
681                 } else {
682                         p_rf_calibrate_info->default_ofdm_index = (default_swing_index >= TXSCALE_TABLE_SIZE) ? 24 : default_swing_index;
683                         p_rf_calibrate_info->default_cck_index = 24;
684                 }
685                 p_rf_calibrate_info->default_bb_swing_index_flag = true;
686         }
687
688         p_rf_calibrate_info->bb_swing_idx_cck_base = p_rf_calibrate_info->default_cck_index;
689         p_rf_calibrate_info->CCK_index = p_rf_calibrate_info->default_cck_index;
690
691         for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) {
692                 p_rf_calibrate_info->bb_swing_idx_ofdm_base[p] = p_rf_calibrate_info->default_ofdm_index;
693                 p_rf_calibrate_info->OFDM_index[p] = p_rf_calibrate_info->default_ofdm_index;
694                 p_rf_calibrate_info->delta_power_index[p] = 0;
695                 p_rf_calibrate_info->delta_power_index_last[p] = 0;
696                 p_rf_calibrate_info->power_index_offset[p] = 0;
697                 p_rf_calibrate_info->kfree_offset[p] = 0;
698         }
699         p_rf_calibrate_info->modify_tx_agc_value_ofdm = 0;
700         p_rf_calibrate_info->modify_tx_agc_value_cck = 0;
701
702 }
703
704
705 void
706 odm_txpowertracking_check(
707         void            *p_dm_void
708 )
709 {
710
711 #if 0
712         /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate */
713         /*  at the same time. In the stage2/3, we need to prive universal interface and merge all */
714         /* HW dynamic mechanism. */
715 #endif
716
717         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
718         switch  (p_dm_odm->support_platform) {
719         case    ODM_WIN:
720                 odm_txpowertracking_check_mp(p_dm_odm);
721                 break;
722
723         case    ODM_CE:
724                 odm_txpowertracking_check_ce(p_dm_odm);
725                 break;
726
727         case    ODM_AP:
728                 odm_txpowertracking_check_ap(p_dm_odm);
729                 break;
730
731         default:
732                 break;
733         }
734
735 }
736
737 void
738 odm_txpowertracking_check_ce(
739         void            *p_dm_void
740 )
741 {
742         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
743 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
744         struct _ADAPTER *adapter = p_dm_odm->adapter;
745 #if ((RTL8188F_SUPPORT == 1))
746         rtl8192c_odm_check_txpowertracking(adapter);
747 #endif
748
749 #if (RTL8188E_SUPPORT == 1)
750
751         if (!(p_dm_odm->support_ability & ODM_RF_TX_PWR_TRACK))
752                 return;
753
754         if (!p_rf_calibrate_info->tm_trigger) {
755                 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_T_METER, RFREGOFFSETMASK, 0x60);
756                 /*DBG_8192C("Trigger 92C Thermal Meter!!\n");*/
757
758                 p_rf_calibrate_info->tm_trigger = 1;
759                 return;
760
761         } else {
762                 /*DBG_8192C("Schedule TxPowerTracking direct call!!\n");*/
763                 odm_txpowertracking_callback_thermal_meter_8188e(adapter);
764                 p_rf_calibrate_info->tm_trigger = 0;
765         }
766 #endif
767 #endif
768 }
769
770 void
771 odm_txpowertracking_check_mp(
772         void            *p_dm_void
773 )
774 {
775         struct PHY_DM_STRUCT            *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
776 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
777         struct _ADAPTER *adapter = p_dm_odm->adapter;
778
779         if (*p_dm_odm->p_is_fcs_mode_enable)
780                 return;
781
782         if (odm_check_power_status(adapter) == false) {
783                 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>odm_check_power_status() return false\n"));
784                 return;
785         }
786
787         if (IS_HARDWARE_TYPE_8821B(adapter)) /* TODO: Don't Do PowerTracking*/
788                 return;
789
790         odm_txpowertracking_thermal_meter_check(adapter);
791
792
793 #endif
794
795 }
796
797
798 void
799 odm_txpowertracking_check_ap(
800         void            *p_dm_void
801 )
802 {
803         return;
804
805 }
806
807 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
808
809 void
810 odm_txpowertracking_direct_call(
811         struct _ADAPTER         *adapter
812 )
813 {
814         HAL_DATA_TYPE           *p_hal_data     = GET_HAL_DATA(adapter);
815         struct PHY_DM_STRUCT                    *p_dm_odm = &p_hal_data->DM_OutSrc;
816
817         odm_txpowertracking_callback_thermal_meter(adapter);
818 }
819
820 void
821 odm_txpowertracking_thermal_meter_check(
822         struct _ADAPTER         *adapter
823 )
824 {
825 #ifndef AP_BUILD_WORKAROUND
826         static u8                       tm_trigger = 0;
827
828         if (!(GET_HAL_DATA(adapter)->DM_OutSrc.support_ability & ODM_RF_TX_PWR_TRACK)) {
829                 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
830                         ("===>odm_txpowertracking_thermal_meter_check(),p_mgnt_info->is_txpowertracking is false, return!!\n"));
831                 return;
832         }
833
834         if (!tm_trigger) {
835                 if (IS_HARDWARE_TYPE_8188E(adapter) || IS_HARDWARE_TYPE_JAGUAR(adapter) || IS_HARDWARE_TYPE_8192E(adapter) ||
836                     IS_HARDWARE_TYPE_8723B(adapter) || IS_HARDWARE_TYPE_8814A(adapter) || IS_HARDWARE_TYPE_8188F(adapter) || IS_HARDWARE_TYPE_8703B(adapter)
837                     || IS_HARDWARE_TYPE_8822B(adapter) || IS_HARDWARE_TYPE_8723D(adapter) || IS_HARDWARE_TYPE_8821C(adapter) || IS_HARDWARE_TYPE_8710B(adapter))/* JJ ADD 20161014 */
838                         PHY_SetRFReg(adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT(17) | BIT(16), 0x03);
839                 else
840                         PHY_SetRFReg(adapter, ODM_RF_PATH_A, RF_T_METER, RFREGOFFSETMASK, 0x60);
841
842                 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("Trigger Thermal Meter!!\n"));
843
844                 tm_trigger = 1;
845                 return;
846         } else {
847                 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("Schedule TxPowerTracking direct call!!\n"));
848                 odm_txpowertracking_direct_call(adapter);
849                 tm_trigger = 0;
850         }
851 #endif
852 }
853
854 #endif