1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
21 /*============================================================ */
23 /*============================================================ */
24 #include "mp_precomp.h"
25 #include "phydm_precomp.h"
27 //============================================================
29 //============================================================
31 u4Byte OFDMSwingTable[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
71 u1Byte CCKSwingTable_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
108 u1Byte CCKSwingTable_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
145 u4Byte OFDMSwingTable_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
192 u1Byte CCKSwingTable_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*/
217 u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {
218 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, // 0, -16.0dB
219 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 1, -15.5dB
220 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 2, -15.0dB
221 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 3, -14.5dB
222 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 4, -14.0dB
223 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 5, -13.5dB
224 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 6, -13.0dB
225 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 7, -12.5dB
226 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 8, -12.0dB
227 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 9, -11.5dB
228 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 10, -11.0dB
229 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 11, -10.5dB
230 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 12, -10.0dB
231 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 13, -9.5dB
232 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 14, -9.0dB
233 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 15, -8.5dB
234 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
235 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 17, -7.5dB
236 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 18, -7.0dB
237 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 19, -6.5dB
238 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 20, -6.0dB
239 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 21, -5.5dB
240 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 22, -5.0dB
241 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 23, -4.5dB
242 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 24, -4.0dB
243 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 25, -3.5dB
244 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 26, -3.0dB
245 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 27, -2.5dB
246 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 28, -2.0dB
247 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 29, -1.5dB
248 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 30, -1.0dB
249 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 31, -0.5dB
250 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} // 32, +0dB
254 u1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {
255 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, // 0, -16.0dB
256 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 1, -15.5dB
257 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 2, -15.0dB
258 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 3, -14.5dB
259 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 4, -14.0dB
260 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 5, -13.5dB
261 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 6, -13.0dB
262 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 7, -12.5dB
263 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 8, -12.0dB
264 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 9, -11.5dB
265 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 10, -11.0dB
266 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 11, -10.5dB
267 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 12, -10.0dB
268 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 13, -9.5dB
269 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 14, -9.0dB
270 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 15, -8.5dB
271 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
272 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 17, -7.5dB
273 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 18, -7.0dB
274 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 19, -6.5dB
275 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 20, -6.0dB
276 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 21, -5.5dB
277 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 22, -5.0dB
278 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 23, -4.5dB
279 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 24, -4.0dB
280 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 25, -3.5dB
281 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 26, -3.0dB
282 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 27, -2.5dB
283 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 28, -2.0dB
284 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 29, -1.5dB
285 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 30, -1.0dB
286 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 31, -0.5dB
287 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} // 32, +0dB
290 u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =
331 #ifdef AP_BUILD_WORKAROUND
333 unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {
334 /* +6.0dB */ 0x7f8001fe,
335 /* +5.5dB */ 0x788001e2,
336 /* +5.0dB */ 0x71c001c7,
337 /* +4.5dB */ 0x6b8001ae,
338 /* +4.0dB */ 0x65400195,
339 /* +3.5dB */ 0x5fc0017f,
340 /* +3.0dB */ 0x5a400169,
341 /* +2.5dB */ 0x55400155,
342 /* +2.0dB */ 0x50800142,
343 /* +1.5dB */ 0x4c000130,
344 /* +1.0dB */ 0x47c0011f,
345 /* +0.5dB */ 0x43c0010f,
346 /* 0.0dB */ 0x40000100,
347 /* -0.5dB */ 0x3c8000f2,
348 /* -1.0dB */ 0x390000e4,
349 /* -1.5dB */ 0x35c000d7,
350 /* -2.0dB */ 0x32c000cb,
351 /* -2.5dB */ 0x300000c0,
352 /* -3.0dB */ 0x2d4000b5,
353 /* -3.5dB */ 0x2ac000ab,
354 /* -4.0dB */ 0x288000a2,
355 /* -4.5dB */ 0x26000098,
356 /* -5.0dB */ 0x24000090,
357 /* -5.5dB */ 0x22000088,
358 /* -6.0dB */ 0x20000080,
359 /* -6.5dB */ 0x1a00006c,
360 /* -7.0dB */ 0x1c800072,
361 /* -7.5dB */ 0x18000060,
362 /* -8.0dB */ 0x19800066,
363 /* -8.5dB */ 0x15800056,
364 /* -9.0dB */ 0x26c0005b,
365 /* -9.5dB */ 0x14400051,
366 /* -10.0dB */ 0x24400051,
367 /* -10.5dB */ 0x1300004c,
368 /* -11.0dB */ 0x12000048,
369 /* -11.5dB */ 0x11000044,
370 /* -12.0dB */ 0x10000040
377 odm_TXPowerTrackingInit(
381 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
382 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
383 if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))
387 odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
395 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
396 PADAPTER Adapter = pDM_Odm->Adapter;
397 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
400 u4Byte swingTableSize;
403 if (pDM_Odm->SupportICType == ODM_RTL8723B
404 || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8703B
406 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
408 pSwingTable = OFDMSwingTable_New;
409 swingTableSize = OFDM_TABLE_SIZE;
411 #if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
412 if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
414 bbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);
415 pSwingTable = TxScalingTable_Jaguar;
416 swingTableSize = TXSCALE_TABLE_SIZE;
422 pSwingTable = OFDMSwingTable;
423 swingTableSize = OFDM_TABLE_SIZE;
427 for (i = 0; i < swingTableSize; ++i) {
428 u4Byte tableValue = pSwingTable[i];
430 if (tableValue >= 0x100000 )
432 if (bbSwing == tableValue)
439 odm_TXPowerTrackingThermalMeterInit(
443 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
444 u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);
446 PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
447 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
448 PADAPTER Adapter = pDM_Odm->Adapter;
449 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
451 if(pDM_Odm->mp_mode == FALSE)
452 pHalData->TxPowerTrackControl = TRUE;
453 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
454 PADAPTER Adapter = pDM_Odm->Adapter;
455 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
457 pRFCalibrateInfo->bTXPowerTracking = _TRUE;
458 pRFCalibrateInfo->TXPowercount = 0;
459 pRFCalibrateInfo->bTXPowerTrackingInit = _FALSE;
461 pRFCalibrateInfo->TxPowerTrackControl = _TRUE;
464 MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pRFCalibrateInfo->TxPowerTrackControl);
466 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
467 #ifdef RTL8188E_SUPPORT
469 pRFCalibrateInfo->bTXPowerTracking = _TRUE;
470 pRFCalibrateInfo->TXPowercount = 0;
471 pRFCalibrateInfo->bTXPowerTrackingInit = _FALSE;
472 pRFCalibrateInfo->TxPowerTrackControl = _TRUE;
477 //pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
478 pRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;
479 pRFCalibrateInfo->ThermalValue_IQK = pHalData->EEPROMThermalMeter;
480 pRFCalibrateInfo->ThermalValue_LCK = pHalData->EEPROMThermalMeter;
482 // The index of "0 dB" in SwingTable.
483 if (pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8703B) {
484 pRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
485 pRFCalibrateInfo->DefaultCckIndex = 20;
487 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
489 pRFCalibrateInfo->DefaultOfdmIndex =28; //OFDM: -1dB
490 pRFCalibrateInfo->DefaultCckIndex =20; //CCK:-6dB
492 else if(pDM_Odm->SupportICType == ODM_RTL8188F) //add by Mingzhi.Guo 2015-03-23
494 pRFCalibrateInfo->DefaultOfdmIndex =28; //OFDM: -1dB
495 pRFCalibrateInfo->DefaultCckIndex =20; //CCK:-6dB
499 pRFCalibrateInfo->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;
500 pRFCalibrateInfo->DefaultCckIndex = 24;
503 pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;
504 pRFCalibrateInfo->CCK_index = pRFCalibrateInfo->DefaultCckIndex;
506 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
508 pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;
509 pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;
510 pRFCalibrateInfo->DeltaPowerIndex[p] = 0;
511 pRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;
512 pRFCalibrateInfo->PowerIndexOffset[p] = 0;
514 pRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0; //add by Mingzhi.Guo
515 pRFCalibrateInfo->Modify_TxAGC_Value_CCK=0; //add by Mingzhi.Guo
521 ODM_TXPowerTrackingCheck(
525 /* 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
526 at the same time. In the stage2/3, we need to prive universal interface and merge all
527 HW dynamic mechanism. */
528 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
529 switch (pDM_Odm->SupportPlatform)
532 odm_TXPowerTrackingCheckMP(pDM_Odm);
536 odm_TXPowerTrackingCheckCE(pDM_Odm);
540 odm_TXPowerTrackingCheckAP(pDM_Odm);
550 odm_TXPowerTrackingCheckCE(
554 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
555 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
556 PADAPTER Adapter = pDM_Odm->Adapter;
558 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
561 if(!pDM_Odm->RFCalibrateInfo.TM_Trigger) //at least delay 1 sec
563 //pHalData->TxPowerCheckCnt++; //cosa add for debug
564 if (IS_HARDWARE_TYPE_8188F(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)
565 || IS_HARDWARE_TYPE_8723B(Adapter)
566 || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter)
568 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
570 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);
573 //DBG_871X("Trigger Thermal Meter!!\n");
575 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
580 //DBG_871X("Schedule TxPowerTracking direct call!!\n");
581 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
582 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
589 odm_TXPowerTrackingCheckMP(
593 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
594 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
595 PADAPTER Adapter = pDM_Odm->Adapter;
597 if (ODM_CheckPowerStatus(Adapter) == FALSE)
599 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>ODM_CheckPowerStatus() return FALSE\n"));
603 if(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)
604 odm_TXPowerTrackingThermalMeterCheck(Adapter);
606 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\n"));
614 odm_TXPowerTrackingCheckAP(
618 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
619 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
620 prtl8192cd_priv priv = pDM_Odm->priv;
627 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
629 odm_TXPowerTrackingThermalMeterCheck(
633 #ifndef AP_BUILD_WORKAROUND
634 static u1Byte TM_Trigger = 0;
636 if(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))
638 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
639 ("===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\n"));
643 if(!TM_Trigger) //at least delay 1 sec
645 if (IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||
646 IS_HARDWARE_TYPE_8723B(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter) || IS_HARDWARE_TYPE_8188F(Adapter))
647 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
649 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
651 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger Thermal Meter!!\n"));
658 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));
659 odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.