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 //============================================================
25 #include "odm_precomp.h"
28 const u2Byte dB_Invert_Table[8][12] = {
29 { 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4},
30 { 4, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16},
31 { 18, 20, 22, 25, 28, 32, 35, 40, 45, 50, 56, 63},
32 { 71, 79, 89, 100, 112, 126, 141, 158, 178, 200, 224, 251},
33 { 282, 316, 355, 398, 447, 501, 562, 631, 708, 794, 891, 1000},
34 { 1122, 1259, 1413, 1585, 1778, 1995, 2239, 2512, 2818, 3162, 3548, 3981},
35 { 4467, 5012, 5623, 6310, 7079, 7943, 8913, 10000, 11220, 12589, 14125, 15849},
36 { 17783, 19953, 22387, 25119, 28184, 31623, 35481, 39811, 44668, 50119, 56234, 65535}};
39 //============================================================
41 //============================================================
43 u4Byte OFDMSwingTable[OFDM_TABLE_SIZE] = {
44 0x7f8001fe, // 0, +6.0dB
45 0x788001e2, // 1, +5.5dB
46 0x71c001c7, // 2, +5.0dB
47 0x6b8001ae, // 3, +4.5dB
48 0x65400195, // 4, +4.0dB
49 0x5fc0017f, // 5, +3.5dB
50 0x5a400169, // 6, +3.0dB
51 0x55400155, // 7, +2.5dB
52 0x50800142, // 8, +2.0dB
53 0x4c000130, // 9, +1.5dB
54 0x47c0011f, // 10, +1.0dB
55 0x43c0010f, // 11, +0.5dB
56 0x40000100, // 12, +0dB
57 0x3c8000f2, // 13, -0.5dB
58 0x390000e4, // 14, -1.0dB
59 0x35c000d7, // 15, -1.5dB
60 0x32c000cb, // 16, -2.0dB
61 0x300000c0, // 17, -2.5dB
62 0x2d4000b5, // 18, -3.0dB
63 0x2ac000ab, // 19, -3.5dB
64 0x288000a2, // 20, -4.0dB
65 0x26000098, // 21, -4.5dB
66 0x24000090, // 22, -5.0dB
67 0x22000088, // 23, -5.5dB
68 0x20000080, // 24, -6.0dB
69 0x1e400079, // 25, -6.5dB
70 0x1c800072, // 26, -7.0dB
71 0x1b00006c, // 27. -7.5dB
72 0x19800066, // 28, -8.0dB
73 0x18000060, // 29, -8.5dB
74 0x16c0005b, // 30, -9.0dB
75 0x15800056, // 31, -9.5dB
76 0x14400051, // 32, -10.0dB
77 0x1300004c, // 33, -10.5dB
78 0x12000048, // 34, -11.0dB
79 0x11000044, // 35, -11.5dB
80 0x10000040, // 36, -12.0dB
83 u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
84 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB
85 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB
86 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB
87 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB
88 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB
89 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB
90 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB
91 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB
92 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB
93 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB
94 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB
95 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB
96 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB <== default
97 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB
98 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB
99 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB
100 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
101 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB
102 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB
103 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB
104 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB
105 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB
106 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB
107 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB
108 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB
109 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB
110 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB
111 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB
112 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB
113 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB
114 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB
115 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB
116 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB
120 u1Byte CCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = {
121 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB
122 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB
123 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB
124 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB
125 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB
126 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB
127 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB
128 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB
129 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB
130 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB
131 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB
132 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB
133 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB <== default
134 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB
135 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB
136 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB
137 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
138 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB
139 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB
140 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB
141 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB
142 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB
143 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB
144 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB
145 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB
146 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB
147 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB
148 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB
149 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB
150 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB
151 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB
152 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB
153 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB
157 u4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE] = {
158 0x0b40002d, // 0, -15.0dB
159 0x0c000030, // 1, -14.5dB
160 0x0cc00033, // 2, -14.0dB
161 0x0d800036, // 3, -13.5dB
162 0x0e400039, // 4, -13.0dB
163 0x0f00003c, // 5, -12.5dB
164 0x10000040, // 6, -12.0dB
165 0x11000044, // 7, -11.5dB
166 0x12000048, // 8, -11.0dB
167 0x1300004c, // 9, -10.5dB
168 0x14400051, // 10, -10.0dB
169 0x15800056, // 11, -9.5dB
170 0x16c0005b, // 12, -9.0dB
171 0x18000060, // 13, -8.5dB
172 0x19800066, // 14, -8.0dB
173 0x1b00006c, // 15, -7.5dB
174 0x1c800072, // 16, -7.0dB
175 0x1e400079, // 17, -6.5dB
176 0x20000080, // 18, -6.0dB
177 0x22000088, // 19, -5.5dB
178 0x24000090, // 20, -5.0dB
179 0x26000098, // 21, -4.5dB
180 0x288000a2, // 22, -4.0dB
181 0x2ac000ab, // 23, -3.5dB
182 0x2d4000b5, // 24, -3.0dB
183 0x300000c0, // 25, -2.5dB
184 0x32c000cb, // 26, -2.0dB
185 0x35c000d7, // 27, -1.5dB
186 0x390000e4, // 28, -1.0dB
187 0x3c8000f2, // 29, -0.5dB
188 0x40000100, // 30, +0dB
189 0x43c0010f, // 31, +0.5dB
190 0x47c0011f, // 32, +1.0dB
191 0x4c000130, // 33, +1.5dB
192 0x50800142, // 34, +2.0dB
193 0x55400155, // 35, +2.5dB
194 0x5a400169, // 36, +3.0dB
195 0x5fc0017f, // 37, +3.5dB
196 0x65400195, // 38, +4.0dB
197 0x6b8001ae, // 39, +4.5dB
198 0x71c001c7, // 40, +5.0dB
199 0x788001e2, // 41, +5.5dB
200 0x7f8001fe // 42, +6.0dB
204 u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {
205 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, // 0, -16.0dB
206 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 1, -15.5dB
207 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 2, -15.0dB
208 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 3, -14.5dB
209 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 4, -14.0dB
210 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 5, -13.5dB
211 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 6, -13.0dB
212 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 7, -12.5dB
213 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 8, -12.0dB
214 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 9, -11.5dB
215 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 10, -11.0dB
216 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 11, -10.5dB
217 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 12, -10.0dB
218 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 13, -9.5dB
219 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 14, -9.0dB
220 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 15, -8.5dB
221 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
222 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 17, -7.5dB
223 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 18, -7.0dB
224 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 19, -6.5dB
225 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 20, -6.0dB
226 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 21, -5.5dB
227 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 22, -5.0dB
228 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 23, -4.5dB
229 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 24, -4.0dB
230 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 25, -3.5dB
231 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 26, -3.0dB
232 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 27, -2.5dB
233 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 28, -2.0dB
234 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 29, -1.5dB
235 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 30, -1.0dB
236 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 31, -0.5dB
237 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} // 32, +0dB
241 u1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {
242 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, // 0, -16.0dB
243 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 1, -15.5dB
244 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 2, -15.0dB
245 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 3, -14.5dB
246 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 4, -14.0dB
247 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 5, -13.5dB
248 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 6, -13.0dB
249 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 7, -12.5dB
250 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 8, -12.0dB
251 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 9, -11.5dB
252 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 10, -11.0dB
253 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 11, -10.5dB
254 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 12, -10.0dB
255 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 13, -9.5dB
256 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 14, -9.0dB
257 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 15, -8.5dB
258 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
259 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 17, -7.5dB
260 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 18, -7.0dB
261 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 19, -6.5dB
262 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 20, -6.0dB
263 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 21, -5.5dB
264 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 22, -5.0dB
265 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 23, -4.5dB
266 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 24, -4.0dB
267 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 25, -3.5dB
268 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 26, -3.0dB
269 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 27, -2.5dB
270 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 28, -2.0dB
271 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 29, -1.5dB
272 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 30, -1.0dB
273 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 31, -0.5dB
274 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} // 32, +0dB
277 u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =
318 #ifdef AP_BUILD_WORKAROUND
320 unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {
321 /* +6.0dB */ 0x7f8001fe,
322 /* +5.5dB */ 0x788001e2,
323 /* +5.0dB */ 0x71c001c7,
324 /* +4.5dB */ 0x6b8001ae,
325 /* +4.0dB */ 0x65400195,
326 /* +3.5dB */ 0x5fc0017f,
327 /* +3.0dB */ 0x5a400169,
328 /* +2.5dB */ 0x55400155,
329 /* +2.0dB */ 0x50800142,
330 /* +1.5dB */ 0x4c000130,
331 /* +1.0dB */ 0x47c0011f,
332 /* +0.5dB */ 0x43c0010f,
333 /* 0.0dB */ 0x40000100,
334 /* -0.5dB */ 0x3c8000f2,
335 /* -1.0dB */ 0x390000e4,
336 /* -1.5dB */ 0x35c000d7,
337 /* -2.0dB */ 0x32c000cb,
338 /* -2.5dB */ 0x300000c0,
339 /* -3.0dB */ 0x2d4000b5,
340 /* -3.5dB */ 0x2ac000ab,
341 /* -4.0dB */ 0x288000a2,
342 /* -4.5dB */ 0x26000098,
343 /* -5.0dB */ 0x24000090,
344 /* -5.5dB */ 0x22000088,
345 /* -6.0dB */ 0x20000080,
346 /* -6.5dB */ 0x1a00006c,
347 /* -7.0dB */ 0x1c800072,
348 /* -7.5dB */ 0x18000060,
349 /* -8.0dB */ 0x19800066,
350 /* -8.5dB */ 0x15800056,
351 /* -9.0dB */ 0x26c0005b,
352 /* -9.5dB */ 0x14400051,
353 /* -10.0dB */ 0x24400051,
354 /* -10.5dB */ 0x1300004c,
355 /* -11.0dB */ 0x12000048,
356 /* -11.5dB */ 0x11000044,
357 /* -12.0dB */ 0x10000040
361 //============================================================
362 // Local Function predefine.
363 //============================================================
365 //START------------COMMON INFO RELATED---------------//
367 odm_CommonInfoSelfInit(
372 odm_CommonInfoSelfUpdate(
377 odm_CmnInfoInit_Debug(
382 odm_CmnInfoHook_Debug(
387 odm_CmnInfoUpdate_Debug(
396 //END------------COMMON INFO RELATED---------------//
398 //START---------------DIG---------------------------//
402 //END---------------DIG---------------------------//
404 //START-------BB POWER SAVE-----------------------//
405 //Remove BB power Saving by YuChen
406 //END---------BB POWER SAVE-----------------------//
408 //START-----------------PSD-----------------------//
409 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))
410 //============================================================
411 // Function predefine.
412 //============================================================
414 //Remove PathDiversity related funtion predefine to odm_PathDiv.h
416 //Start-------------------- RX High Power------------------------//
417 VOID odm_RXHPInit( IN PDM_ODM_T pDM_Odm);
418 VOID odm_RXHP( IN PDM_ODM_T pDM_Odm);
419 VOID odm_Write_RXHP( IN PDM_ODM_T pDM_Odm);
421 VOID odm_PSD_RXHP( IN PDM_ODM_T pDM_Odm);
422 VOID odm_PSD_RXHPCallback( PRT_TIMER pTimer);
423 VOID odm_PSD_RXHPWorkitemCallback( IN PVOID pContext);
424 //End--------------------- RX High Power -----------------------//
428 //END-------------------PSD-----------------------//
430 //Remove RAMASK by RS_James
434 //Remove Rssimonitorcheck by RS_James
442 odm_SwAntDivInit_NIC(
452 odm_SwAntDivChkAntSwitch(
453 IN PDM_ODM_T pDM_Odm,
458 odm_SwAntDivChkAntSwitchNIC(
459 IN PDM_ODM_T pDM_Odm,
464 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
466 odm_SwAntDivChkAntSwitchCallback(
470 odm_SwAntDivChkAntSwitchWorkitemCallback(
474 ODM_UpdateInitRateWorkItemCallback(
477 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
478 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
479 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
480 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
486 odm_GlobalAdapterCheck(
490 //Remove RAMask by RS_James
493 ODM_TXPowerTrackingCheck(
498 odm_TXPowerTrackingCheckAP(
504 odm_TXPowerTrackingThermalMeterInit(
515 odm_TXPowerTrackingInit(
520 odm_TXPowerTrackingCheckMP(
526 odm_TXPowerTrackingCheckCE(
530 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))
533 odm_TXPowerTrackingCallbackThermalMeter92C(
538 odm_TXPowerTrackingCallbackRXGainThermalMeter92D(
543 odm_TXPowerTrackingCallbackThermalMeter92D(
548 odm_TXPowerTrackingDirectCall92C(
553 odm_TXPowerTrackingThermalMeterCheck(
559 //Remove Edca by Yu Chen
562 #define RxDefaultAnt1 0x65a9
563 #define RxDefaultAnt2 0x569a
566 odm_InitHybridAntDiv(
572 IN PDM_ODM_T pDM_Odm,
573 IN u4Byte OFDM_Ant1_Cnt,
574 IN u4Byte OFDM_Ant2_Cnt,
575 IN u4Byte CCK_Ant1_Cnt,
576 IN u4Byte CCK_Ant2_Cnt,
582 IN PDM_ODM_T pDM_Odm,
595 //============================================================
597 //============================================================
600 // 2011/09/21 MH Add to describe different team necessary resource allocate??
608 odm_CommonInfoSelfInit(pDM_Odm);
609 odm_CmnInfoInit_Debug(pDM_Odm);
610 odm_DIGInit(pDM_Odm);
611 odm_NHMCounterStatisticsInit(pDM_Odm);
612 odm_AdaptivityInit(pDM_Odm);
613 odm_RateAdaptiveMaskInit(pDM_Odm);
614 ODM_CfoTrackingInit(pDM_Odm);
615 ODM_EdcaTurboInit(pDM_Odm);
616 odm_RSSIMonitorInit(pDM_Odm);
617 odm_TXPowerTrackingInit(pDM_Odm);
619 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
620 ODM_ClearTxPowerTrackingState(pDM_Odm);
622 if ( *(pDM_Odm->mp_mode) != 1)
623 odm_PathDiversityInit(pDM_Odm);
627 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
628 if ( *(pDM_Odm->mp_mode) != 1){
629 if(pDM_Odm->SupportICType==ODM_RTL8723A)
630 odm_SwAntDivInit(pDM_Odm);
631 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
633 if(pDM_Odm->AntDivType == HW_ANTDIV)
634 odm_InitHybridAntDiv(pDM_Odm);
636 odm_SwAntDivInit(pDM_Odm);
639 ODM_AntDivInit(pDM_Odm);
643 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
645 odm_DynamicBBPowerSavingInit(pDM_Odm);
646 odm_DynamicTxPowerInit(pDM_Odm);
648 #if (RTL8188E_SUPPORT == 1)
649 if(pDM_Odm->SupportICType==ODM_RTL8188E)
651 odm_PrimaryCCA_Init(pDM_Odm);
652 ODM_RAInfo_Init_all(pDM_Odm);
656 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
658 #if (RTL8723B_SUPPORT == 1)
659 if(pDM_Odm->SupportICType == ODM_RTL8723B)
660 odm_SwAntDetectInit(pDM_Odm);
663 #if (RTL8192E_SUPPORT == 1)
664 if(pDM_Odm->SupportICType==ODM_RTL8192E)
665 odm_PrimaryCCA_Check_Init(pDM_Odm);
668 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
669 #if (RTL8723A_SUPPORT == 1)
670 if(pDM_Odm->SupportICType == ODM_RTL8723A)
671 odm_PSDMonitorInit(pDM_Odm);
674 #if (RTL8192D_SUPPORT == 1)
675 if(pDM_Odm->SupportICType==ODM_RTL8192D)
676 odm_PathDivInit_92D(pDM_Odm);
679 #if ((RTL8192C_SUPPORT == 1) || (RTL8192D_SUPPORT == 1))
680 if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
681 odm_RXHPInit(pDM_Odm);
691 // 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.
692 // You can not add any dummy function here, be care, you can only use DM structure
693 // to perform any new ODM_DM.
700 if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->SupportInterface == ODM_ITRF_USB))
702 if(pDM_Odm->RSSI_Min > 25)
703 ODM_Write1Byte(pDM_Odm, 0x4CF, 0x02);
704 else if(pDM_Odm->RSSI_Min < 20)
705 ODM_Write1Byte(pDM_Odm, 0x4CF, 0x00);
709 odm_CommonInfoSelfUpdate(pDM_Odm);
710 odm_BasicDbgMessage(pDM_Odm);
711 odm_FalseAlarmCounterStatistics(pDM_Odm);
712 odm_NHMCounterStatistics(pDM_Odm);
713 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min));
715 odm_RSSIMonitorCheck(pDM_Odm);
717 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
718 //#ifdef CONFIG_PLATFORM_SPRD
719 //For CE Platform(SPRD or Tablet)
720 //8723A or 8189ES platform
721 //NeilChen--2012--08--24--
722 //Fix Leave LPS issue
723 if( (adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) // in LPS mode
725 // (pDM_Odm->SupportICType & (ODM_RTL8723A ) )||
726 // (pDM_Odm->SupportICType & (ODM_RTL8188E) &&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) )
730 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));
731 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
732 odm_DIGbyRSSI_LPS(pDM_Odm);
742 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
743 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
745 odm_CCKPacketDetectionThresh(pDM_Odm);
747 if(*(pDM_Odm->pbPowerSaving)==TRUE)
751 odm_RefreshRateAdaptiveMask(pDM_Odm);
752 odm_RefreshBasicRateMask(pDM_Odm);
753 odm_DynamicBBPowerSaving(pDM_Odm);
754 odm_EdcaTurboCheck(pDM_Odm);
755 odm_PathDiversity(pDM_Odm);
756 ODM_CfoTracking(pDM_Odm);
757 odm_DynamicTxPower(pDM_Odm);
759 #if (RTL8192E_SUPPORT == 1)
760 if(pDM_Odm->SupportICType==ODM_RTL8192E)
761 odm_DynamicPrimaryCCA_Check(pDM_Odm);
763 //if(pDM_Odm->SupportICType == ODM_RTL8192E)
767 //#if (MP_DRIVER != 1)
768 if ( *(pDM_Odm->mp_mode) != 1) {
769 if(pDM_Odm->SupportICType==ODM_RTL8723A)
771 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
773 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
775 if(pDM_Odm->AntDivType == HW_ANTDIV)
776 odm_HwAntDiv(pDM_Odm);
778 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
785 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
787 ODM_TXPowerTrackingCheck(pDM_Odm);
789 odm_IQCalibrate(pDM_Odm);
791 else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
793 ODM_TXPowerTrackingCheck(pDM_Odm);
795 //odm_EdcaTurboCheck(pDM_Odm);
797 #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
798 if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
802 //2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
803 // so compile flags must be left here to prevent from compile errors
804 #if (RTL8192D_SUPPORT == 1)
805 if(pDM_Odm->SupportICType==ODM_RTL8192D)
806 ODM_DynamicEarlyMode(pDM_Odm);
808 odm_DynamicBBPowerSaving(pDM_Odm);
809 #if (RTL8188E_SUPPORT == 1)
810 if(pDM_Odm->SupportICType==ODM_RTL8188E)
811 odm_DynamicPrimaryCCA(pDM_Odm);
815 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;
817 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
824 // Init /.. Fixed HW value. Only init time.
828 IN PDM_ODM_T pDM_Odm,
829 IN ODM_CMNINFO_E CmnInfo,
834 // This section is used for init value
841 case ODM_CMNINFO_ABILITY:
842 pDM_Odm->SupportAbility = (u4Byte)Value;
845 case ODM_CMNINFO_RF_TYPE:
846 pDM_Odm->RFType = (u1Byte)Value;
849 case ODM_CMNINFO_PLATFORM:
850 pDM_Odm->SupportPlatform = (u1Byte)Value;
853 case ODM_CMNINFO_INTERFACE:
854 pDM_Odm->SupportInterface = (u1Byte)Value;
857 case ODM_CMNINFO_MP_TEST_CHIP:
858 pDM_Odm->bIsMPChip= (u1Byte)Value;
861 case ODM_CMNINFO_IC_TYPE:
862 pDM_Odm->SupportICType = Value;
865 case ODM_CMNINFO_CUT_VER:
866 pDM_Odm->CutVersion = (u1Byte)Value;
869 case ODM_CMNINFO_FAB_VER:
870 pDM_Odm->FabVersion = (u1Byte)Value;
873 case ODM_CMNINFO_RFE_TYPE:
874 pDM_Odm->RFEType = (u1Byte)Value;
877 case ODM_CMNINFO_RF_ANTENNA_TYPE:
878 pDM_Odm->AntDivType= (u1Byte)Value;
881 case ODM_CMNINFO_BOARD_TYPE:
882 pDM_Odm->BoardType = (u1Byte)Value;
885 case ODM_CMNINFO_PACKAGE_TYPE:
886 pDM_Odm->PackageType = (u1Byte)Value;
889 case ODM_CMNINFO_EXT_LNA:
890 pDM_Odm->ExtLNA = (u1Byte)Value;
893 case ODM_CMNINFO_5G_EXT_LNA:
894 pDM_Odm->ExtLNA5G = (u1Byte)Value;
897 case ODM_CMNINFO_EXT_PA:
898 pDM_Odm->ExtPA = (u1Byte)Value;
901 case ODM_CMNINFO_5G_EXT_PA:
902 pDM_Odm->ExtPA5G = (u1Byte)Value;
905 case ODM_CMNINFO_GPA:
906 pDM_Odm->TypeGPA= (ODM_TYPE_GPA_E)Value;
908 case ODM_CMNINFO_APA:
909 pDM_Odm->TypeAPA= (ODM_TYPE_APA_E)Value;
911 case ODM_CMNINFO_GLNA:
912 pDM_Odm->TypeGLNA= (ODM_TYPE_GLNA_E)Value;
914 case ODM_CMNINFO_ALNA:
915 pDM_Odm->TypeALNA= (ODM_TYPE_ALNA_E)Value;
918 case ODM_CMNINFO_EXT_TRSW:
919 pDM_Odm->ExtTRSW = (u1Byte)Value;
921 case ODM_CMNINFO_PATCH_ID:
922 pDM_Odm->PatchID = (u1Byte)Value;
924 case ODM_CMNINFO_BINHCT_TEST:
925 pDM_Odm->bInHctTest = (BOOLEAN)Value;
927 case ODM_CMNINFO_BWIFI_TEST:
928 pDM_Odm->bWIFITest = (BOOLEAN)Value;
930 case ODM_CMNINFO_SMART_CONCURRENT:
931 pDM_Odm->bDualMacSmartConcurrent = (BOOLEAN )Value;
933 case ODM_CMNINFO_DOMAIN_CODE_2G:
934 pDM_Odm->odm_Regulation2_4G = (u1Byte)Value;
936 case ODM_CMNINFO_DOMAIN_CODE_5G:
937 pDM_Odm->odm_Regulation5G = (u1Byte)Value;
940 //To remove the compiler warning, must add an empty default statement to handle the other values.
952 IN PDM_ODM_T pDM_Odm,
953 IN ODM_CMNINFO_E CmnInfo,
958 // Hook call by reference pointer.
963 // Dynamic call by reference pointer.
965 case ODM_CMNINFO_MAC_PHY_MODE:
966 pDM_Odm->pMacPhyMode = (u1Byte *)pValue;
969 case ODM_CMNINFO_TX_UNI:
970 pDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;
973 case ODM_CMNINFO_RX_UNI:
974 pDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;
977 case ODM_CMNINFO_WM_MODE:
978 pDM_Odm->pWirelessMode = (u1Byte *)pValue;
981 case ODM_CMNINFO_BAND:
982 pDM_Odm->pBandType = (u1Byte *)pValue;
985 case ODM_CMNINFO_SEC_CHNL_OFFSET:
986 pDM_Odm->pSecChOffset = (u1Byte *)pValue;
989 case ODM_CMNINFO_SEC_MODE:
990 pDM_Odm->pSecurity = (u1Byte *)pValue;
994 pDM_Odm->pBandWidth = (u1Byte *)pValue;
997 case ODM_CMNINFO_CHNL:
998 pDM_Odm->pChannel = (u1Byte *)pValue;
1001 case ODM_CMNINFO_DMSP_GET_VALUE:
1002 pDM_Odm->pbGetValueFromOtherMac = (BOOLEAN *)pValue;
1005 case ODM_CMNINFO_BUDDY_ADAPTOR:
1006 pDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;
1009 case ODM_CMNINFO_DMSP_IS_MASTER:
1010 pDM_Odm->pbMasterOfDMSP = (BOOLEAN *)pValue;
1013 case ODM_CMNINFO_SCAN:
1014 pDM_Odm->pbScanInProcess = (BOOLEAN *)pValue;
1017 case ODM_CMNINFO_POWER_SAVING:
1018 pDM_Odm->pbPowerSaving = (BOOLEAN *)pValue;
1021 case ODM_CMNINFO_ONE_PATH_CCA:
1022 pDM_Odm->pOnePathCCA = (u1Byte *)pValue;
1025 case ODM_CMNINFO_DRV_STOP:
1026 pDM_Odm->pbDriverStopped = (BOOLEAN *)pValue;
1029 case ODM_CMNINFO_PNP_IN:
1030 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = (BOOLEAN *)pValue;
1033 case ODM_CMNINFO_INIT_ON:
1034 pDM_Odm->pinit_adpt_in_progress = (BOOLEAN *)pValue;
1037 case ODM_CMNINFO_ANT_TEST:
1038 pDM_Odm->pAntennaTest = (u1Byte *)pValue;
1041 case ODM_CMNINFO_NET_CLOSED:
1042 pDM_Odm->pbNet_closed = (BOOLEAN *)pValue;
1045 case ODM_CMNINFO_FORCED_RATE:
1046 pDM_Odm->pForcedDataRate = (pu2Byte)pValue;
1049 case ODM_CMNINFO_FORCED_IGI_LB:
1050 pDM_Odm->pu1ForcedIgiLb = (u1Byte *)pValue;
1053 case ODM_CMNINFO_MP_MODE:
1054 pDM_Odm->mp_mode = (u1Byte *)pValue;
1057 //case ODM_CMNINFO_RTSTA_AID:
1058 // pDM_Odm->pAidMap = (u1Byte *)pValue;
1061 //case ODM_CMNINFO_BT_COEXIST:
1062 // pDM_Odm->BTCoexist = (BOOLEAN *)pValue;
1064 //case ODM_CMNINFO_STA_STATUS:
1065 //pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;
1068 //case ODM_CMNINFO_PHY_STATUS:
1069 // pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;
1072 //case ODM_CMNINFO_MAC_STATUS:
1073 // pDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;
1075 //To remove the compiler warning, must add an empty default statement to handle the other values.
1086 ODM_CmnInfoPtrArrayHook(
1087 IN PDM_ODM_T pDM_Odm,
1088 IN ODM_CMNINFO_E CmnInfo,
1094 // Hook call by reference pointer.
1099 // Dynamic call by reference pointer.
1101 case ODM_CMNINFO_STA_STATUS:
1102 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
1104 //To remove the compiler warning, must add an empty default statement to handle the other values.
1114 // Update Band/CHannel/.. The values are dynamic but non-per-packet.
1118 IN PDM_ODM_T pDM_Odm,
1124 // This init variable may be changed in run time.
1128 case ODM_CMNINFO_LINK_IN_PROGRESS:
1129 pDM_Odm->bLinkInProcess = (BOOLEAN)Value;
1132 case ODM_CMNINFO_ABILITY:
1133 pDM_Odm->SupportAbility = (u4Byte)Value;
1136 case ODM_CMNINFO_RF_TYPE:
1137 pDM_Odm->RFType = (u1Byte)Value;
1140 case ODM_CMNINFO_WIFI_DIRECT:
1141 pDM_Odm->bWIFI_Direct = (BOOLEAN)Value;
1144 case ODM_CMNINFO_WIFI_DISPLAY:
1145 pDM_Odm->bWIFI_Display = (BOOLEAN)Value;
1148 case ODM_CMNINFO_LINK:
1149 pDM_Odm->bLinked = (BOOLEAN)Value;
1152 case ODM_CMNINFO_STATION_STATE:
1153 pDM_Odm->bsta_state = (BOOLEAN)Value;
1156 case ODM_CMNINFO_RSSI_MIN:
1157 pDM_Odm->RSSI_Min= (u1Byte)Value;
1160 case ODM_CMNINFO_DBG_COMP:
1161 pDM_Odm->DebugComponents = Value;
1164 case ODM_CMNINFO_DBG_LEVEL:
1165 pDM_Odm->DebugLevel = (u4Byte)Value;
1167 case ODM_CMNINFO_RA_THRESHOLD_HIGH:
1168 pDM_Odm->RateAdaptive.HighRSSIThresh = (u1Byte)Value;
1171 case ODM_CMNINFO_RA_THRESHOLD_LOW:
1172 pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;
1174 // The following is for BT HS mode and BT coexist mechanism.
1175 case ODM_CMNINFO_BT_ENABLED:
1176 pDM_Odm->bBtEnabled = (BOOLEAN)Value;
1179 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
1180 pDM_Odm->bBtConnectProcess = (BOOLEAN)Value;
1183 case ODM_CMNINFO_BT_HS_RSSI:
1184 pDM_Odm->btHsRssi = (u1Byte)Value;
1187 case ODM_CMNINFO_BT_OPERATION:
1188 pDM_Odm->bBtHsOperation = (BOOLEAN)Value;
1191 case ODM_CMNINFO_BT_LIMITED_DIG:
1192 pDM_Odm->bBtLimitedDig = (BOOLEAN)Value;
1195 case ODM_CMNINFO_BT_DISABLE_EDCA:
1196 pDM_Odm->bBtDisableEdcaTurbo = (BOOLEAN)Value;
1200 case ODM_CMNINFO_OP_MODE:
1201 pDM_Odm->OPMode = (u1Byte)Value;
1204 case ODM_CMNINFO_WM_MODE:
1205 pDM_Odm->WirelessMode = (u1Byte)Value;
1208 case ODM_CMNINFO_BAND:
1209 pDM_Odm->BandType = (u1Byte)Value;
1212 case ODM_CMNINFO_SEC_CHNL_OFFSET:
1213 pDM_Odm->SecChOffset = (u1Byte)Value;
1216 case ODM_CMNINFO_SEC_MODE:
1217 pDM_Odm->Security = (u1Byte)Value;
1220 case ODM_CMNINFO_BW:
1221 pDM_Odm->BandWidth = (u1Byte)Value;
1224 case ODM_CMNINFO_CHNL:
1225 pDM_Odm->Channel = (u1Byte)Value;
1237 odm_CommonInfoSelfInit(
1238 IN PDM_ODM_T pDM_Odm
1241 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
1242 pDM_Odm->bCckHighPower = (BOOLEAN) ODM_GetBBReg(pDM_Odm, ODM_REG(CCK_RPT_FORMAT,pDM_Odm), ODM_BIT(CCK_RPT_FORMAT,pDM_Odm));
1243 pDM_Odm->RFPathRxEnable = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH,pDM_Odm), ODM_BIT(BB_RX_PATH,pDM_Odm));
1244 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
1245 pDM_Odm->pbNet_closed = &pDM_Odm->BOOLEAN_temp;
1248 ODM_InitDebugSetting(pDM_Odm);
1250 if(pDM_Odm->SupportICType==ODM_RTL8723A)
1252 pDM_Odm->AntDivType = SW_ANTDIV;
1254 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
1256 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1257 pDM_Odm->AntDivType = HW_ANTDIV;
1258 #elif (defined(CONFIG_SW_ANTENNA_DIVERSITY))
1259 pDM_Odm->AntDivType = SW_ANTDIV;
1262 pDM_Odm->TxRate = 0xFF;
1263 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1264 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1266 if(pDM_Odm->SupportICType==ODM_RTL8723B)
1268 if((!pDM_Odm->DM_SWAT_Table.ANTA_ON || !pDM_Odm->DM_SWAT_Table.ANTB_ON))
1269 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1272 #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
1274 #if(defined(CONFIG_NOT_SUPPORT_ANTDIV))
1275 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1276 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n"));
1277 #elif(defined(CONFIG_2G5G_SUPPORT_ANTDIV))
1278 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously \n"));
1279 pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G|ODM_ANTDIV_5G);
1280 if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)
1281 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
1282 if(*pDM_Odm->pBandType == ODM_BAND_5G )
1284 #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )
1285 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1286 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1287 #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )
1288 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1289 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1290 #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )
1291 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1292 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1295 else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
1297 #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )
1298 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1299 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1300 #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )
1301 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1302 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1303 #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )
1304 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1305 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1308 #elif(defined(CONFIG_5G_SUPPORT_ANTDIV))
1309 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n"));
1310 pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_5G);
1311 if(*pDM_Odm->pBandType == ODM_BAND_5G )
1313 if(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)
1314 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
1315 #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )
1316 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1317 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1318 #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )
1319 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1320 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1321 #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )
1322 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1323 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1326 else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
1328 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 2G AntDivType\n"));
1329 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1331 #elif(defined(CONFIG_2G_SUPPORT_ANTDIV))
1332 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n"));
1333 pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G);
1334 if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
1336 if(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)
1337 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
1338 #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )
1339 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1340 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1341 #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )
1342 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1343 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1344 #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )
1345 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1346 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1349 else if(*pDM_Odm->pBandType == ODM_BAND_5G )
1351 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 5G AntDivType\n"));
1352 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1355 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1356 #endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1361 odm_CommonInfoSelfUpdate(
1362 IN PDM_ODM_T pDM_Odm
1369 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1371 PADAPTER Adapter = pDM_Odm->Adapter;
1372 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
1374 pEntry = pDM_Odm->pODM_StaInfo[0];
1375 if(pMgntInfo->mAssoc)
1379 pEntry->MacAddr[i] = pMgntInfo->Bssid[i];
1383 pEntry->bUsed=FALSE;
1385 pEntry->MacAddr[i] = 0;
1390 if(*(pDM_Odm->pBandWidth) == ODM_BW40M)
1392 if(*(pDM_Odm->pSecChOffset) == 1)
1393 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) -2;
1394 else if(*(pDM_Odm->pSecChOffset) == 2)
1395 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) +2;
1398 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
1400 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1402 pEntry = pDM_Odm->pODM_StaInfo[i];
1403 if(IS_STA_VALID(pEntry))
1407 pDM_Odm->bOneEntryOnly = TRUE;
1409 pDM_Odm->bOneEntryOnly = FALSE;
1413 odm_CmnInfoInit_Debug(
1414 IN PDM_ODM_T pDM_Odm
1417 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug==>\n"));
1418 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform=%d\n",pDM_Odm->SupportPlatform) );
1419 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility=0x%x\n",pDM_Odm->SupportAbility) );
1420 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface=%d\n",pDM_Odm->SupportInterface) );
1421 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType=0x%x\n",pDM_Odm->SupportICType) );
1422 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion=%d\n",pDM_Odm->CutVersion) );
1423 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion=%d\n",pDM_Odm->FabVersion) );
1424 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType=%d\n",pDM_Odm->RFType) );
1425 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType=%d\n",pDM_Odm->BoardType) );
1426 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA=%d\n",pDM_Odm->ExtLNA) );
1427 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA=%d\n",pDM_Odm->ExtPA) );
1428 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW=%d\n",pDM_Odm->ExtTRSW) );
1429 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID=%d\n",pDM_Odm->PatchID) );
1430 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest=%d\n",pDM_Odm->bInHctTest) );
1431 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest=%d\n",pDM_Odm->bWIFITest) );
1432 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent=%d\n",pDM_Odm->bDualMacSmartConcurrent) );
1437 odm_CmnInfoHook_Debug(
1438 IN PDM_ODM_T pDM_Odm
1441 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoHook_Debug==>\n"));
1442 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumTxBytesUnicast=%llu\n",*(pDM_Odm->pNumTxBytesUnicast)) );
1443 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumRxBytesUnicast=%llu\n",*(pDM_Odm->pNumRxBytesUnicast)) );
1444 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pWirelessMode=0x%x\n",*(pDM_Odm->pWirelessMode)) );
1445 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecChOffset=%d\n",*(pDM_Odm->pSecChOffset)) );
1446 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecurity=%d\n",*(pDM_Odm->pSecurity)) );
1447 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandWidth=%d\n",*(pDM_Odm->pBandWidth)) );
1448 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pChannel=%d\n",*(pDM_Odm->pChannel)) );
1450 if(pDM_Odm->SupportICType==ODM_RTL8192D)
1452 if(pDM_Odm->pBandType)
1453 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandType=%d\n",*(pDM_Odm->pBandType)) );
1454 if(pDM_Odm->pMacPhyMode)
1455 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pMacPhyMode=%d\n",*(pDM_Odm->pMacPhyMode)) );
1456 if(pDM_Odm->pBuddyAdapter)
1457 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbGetValueFromOtherMac=%d\n",*(pDM_Odm->pbGetValueFromOtherMac)) );
1458 if(pDM_Odm->pBuddyAdapter)
1459 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBuddyAdapter=%p\n",*(pDM_Odm->pBuddyAdapter)) );
1460 if(pDM_Odm->pbMasterOfDMSP)
1461 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbMasterOfDMSP=%d\n",*(pDM_Odm->pbMasterOfDMSP)) );
1463 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbScanInProcess=%d\n",*(pDM_Odm->pbScanInProcess)) );
1464 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbPowerSaving=%d\n",*(pDM_Odm->pbPowerSaving)) );
1466 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1467 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pOnePathCCA=%d\n",*(pDM_Odm->pOnePathCCA)) );
1471 odm_CmnInfoUpdate_Debug(
1472 IN PDM_ODM_T pDM_Odm
1475 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoUpdate_Debug==>\n"));
1476 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Direct=%d\n",pDM_Odm->bWIFI_Direct) );
1477 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Display=%d\n",pDM_Odm->bWIFI_Display) );
1478 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked=%d\n",pDM_Odm->bLinked) );
1479 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_Min=%d\n",pDM_Odm->RSSI_Min) );
1485 IN PDM_ODM_T pDM_Odm
1488 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1489 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1491 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_BasicDbgMsg==>\n"));
1492 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, RSSI_Min = %d, CurrentIGI = 0x%x \n",
1493 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, pDM_DigTable->CurIGValue) );
1494 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n",
1495 FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));
1496 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n",
1497 pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B));
1498 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_C = %d, RSSI_D = %d\n", pDM_Odm->RSSI_C, pDM_Odm->RSSI_D));
1502 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1504 ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm )
1507 PADAPTER pAdapter = pDM_Odm->Adapter;
1509 ODM_InitializeWorkItem( pDM_Odm,
1510 &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B,
1511 (RT_WORKITEM_CALL_BACK)ODM_SW_AntDiv_WorkitemCallback,
1513 "AntennaSwitchWorkitem");
1515 ODM_InitializeWorkItem( pDM_Odm,
1516 &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem,
1517 (RT_WORKITEM_CALL_BACK)odm_SwAntDivChkAntSwitchWorkitemCallback,
1519 "AntennaSwitchWorkitem");
1522 ODM_InitializeWorkItem(
1524 &(pDM_Odm->PathDivSwitchWorkitem),
1525 (RT_WORKITEM_CALL_BACK)odm_PathDivChkAntSwitchWorkitemCallback,
1529 ODM_InitializeWorkItem(
1531 &(pDM_Odm->CCKPathDiversityWorkitem),
1532 (RT_WORKITEM_CALL_BACK)odm_CCKTXPathDiversityWorkItemCallback,
1534 "CCKTXPathDiversityWorkItem");
1536 ODM_InitializeWorkItem(
1538 &(pDM_Odm->MPT_DIGWorkitem),
1539 (RT_WORKITEM_CALL_BACK)odm_MPT_DIGWorkItemCallback,
1543 ODM_InitializeWorkItem(
1545 &(pDM_Odm->RaRptWorkitem),
1546 (RT_WORKITEM_CALL_BACK)ODM_UpdateInitRateWorkItemCallback,
1550 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1551 #if (RTL8188E_SUPPORT == 1)
1552 ODM_InitializeWorkItem(
1554 &(pDM_Odm->FastAntTrainingWorkitem),
1555 (RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback,
1557 "FastAntTrainingWorkitem");
1560 ODM_InitializeWorkItem(
1562 &(pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem),
1563 (RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback,
1565 "PSDRXHP_WorkItem");
1570 ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm )
1573 ODM_FreeWorkItem( &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B));
1575 ODM_FreeWorkItem( &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem));
1577 ODM_FreeWorkItem(&(pDM_Odm->PathDivSwitchWorkitem));
1579 ODM_FreeWorkItem(&(pDM_Odm->CCKPathDiversityWorkitem));
1581 ODM_FreeWorkItem(&(pDM_Odm->FastAntTrainingWorkitem));
1583 ODM_FreeWorkItem(&(pDM_Odm->MPT_DIGWorkitem));
1585 ODM_FreeWorkItem(&(pDM_Odm->RaRptWorkitem));
1587 ODM_FreeWorkItem((&pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem));
1595 odm_FindMinimumRSSI(
1596 IN PDM_ODM_T pDM_Odm
1600 u1Byte RSSI_Min = 0xFF;
1602 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1604 // if(pDM_Odm->pODM_StaInfo[i] != NULL)
1605 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1607 if(pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)
1609 RSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;
1614 pDM_Odm->RSSI_Min = RSSI_Min;
1620 IN PDM_ODM_T pDM_Odm
1624 BOOLEAN Linked = FALSE;
1626 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1628 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1636 pDM_Odm->bLinked = Linked;
1641 //3============================================================
1643 //3============================================================
1644 /*-----------------------------------------------------------------------------
1645 * Function: odm_DIGInit()
1647 * Overview: Set DIG scheme init value.
1658 *---------------------------------------------------------------------------*/
1660 //Remove DIG by yuchen
1662 //Remove DIG and FA check by Yu Chen
1665 //3============================================================
1667 //3============================================================
1669 //Remove BB power saving by Yuchen
1671 //3============================================================
1673 //3============================================================
1674 //3============================================================
1676 //3============================================================
1678 //Remove RAMask by RS_James
1680 //3============================================================
1681 //3 Dynamic Tx Power
1682 //3============================================================
1686 //Remove Rssimonitorcheck related function to odm_rssimonitorcheck.c
1691 IN PDM_ODM_T pDM_Odm
1694 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1695 #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
1696 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,
1697 (RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, "SwAntennaSwitchTimer_8723B");
1701 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
1702 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
1703 (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
1706 #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
1707 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1708 #if (RTL8188E_SUPPORT == 1)
1709 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,
1710 (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");
1715 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1716 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer,
1717 (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");
1720 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
1722 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer,
1723 (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");
1725 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer,
1726 (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");
1728 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer,
1729 (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer");
1731 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,
1732 (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer");
1737 ODM_CancelAllTimers(
1738 IN PDM_ODM_T pDM_Odm
1741 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1743 // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in
1746 HAL_ADAPTER_STS_CHK(pDM_Odm)
1748 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1749 #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
1750 ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
1754 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
1755 ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
1758 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1760 #if (RTL8188E_SUPPORT == 1)
1761 ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
1763 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
1766 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
1768 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
1770 ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
1772 ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
1774 ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
1780 ODM_ReleaseAllTimers(
1781 IN PDM_ODM_T pDM_Odm
1784 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1785 #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
1786 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
1790 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
1791 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
1794 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1796 #if (RTL8188E_SUPPORT == 1)
1797 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
1800 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);
1803 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
1805 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
1807 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
1809 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
1811 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
1816 //3============================================================
1817 //3 Tx Power Tracking
1818 //3============================================================
1822 IN PDM_ODM_T pDM_Odm
1825 PADAPTER Adapter = pDM_Odm->Adapter;
1827 if(!IS_HARDWARE_TYPE_JAGUAR(Adapter))
1829 else if(IS_HARDWARE_TYPE_8812AU(Adapter))
1831 #if (RTL8821A_SUPPORT == 1)
1832 if(pDM_Odm->bLinked)
1834 if((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess))
1836 pDM_Odm->preChannel = *pDM_Odm->pChannel;
1837 pDM_Odm->LinkedInterval = 0;
1840 if(pDM_Odm->LinkedInterval < 3)
1841 pDM_Odm->LinkedInterval++;
1843 if(pDM_Odm->LinkedInterval == 2)
1845 // Mark out IQK flow to prevent tx stuck. by Maddest 20130306
1846 // Open it verified by James 20130715
1847 PHY_IQCalibrate_8821A(Adapter, FALSE);
1851 pDM_Odm->LinkedInterval = 0;
1857 odm_TXPowerTrackingInit(
1858 IN PDM_ODM_T pDM_Odm
1861 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1862 if(!(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_IC_11N_SERIES)))
1866 odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
1871 IN PDM_ODM_T pDM_Odm
1874 PADAPTER Adapter = pDM_Odm->Adapter;
1875 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1878 u4Byte swingTableSize;
1879 pu4Byte pSwingTable;
1881 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
1882 pDM_Odm->SupportICType == ODM_RTL8192E)
1884 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
1886 pSwingTable = OFDMSwingTable_New;
1887 swingTableSize = OFDM_TABLE_SIZE;
1889 #if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
1890 if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
1892 bbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);
1893 pSwingTable = TxScalingTable_Jaguar;
1894 swingTableSize = TXSCALE_TABLE_SIZE;
1900 pSwingTable = OFDMSwingTable;
1901 swingTableSize = OFDM_TABLE_SIZE;
1905 for (i = 0; i < swingTableSize; ++i) {
1906 u4Byte tableValue = pSwingTable[i];
1908 if (tableValue >= 0x100000 )
1910 if (bbSwing == tableValue)
1917 odm_TXPowerTrackingThermalMeterInit(
1918 IN PDM_ODM_T pDM_Odm
1921 u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);
1923 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1924 PADAPTER Adapter = pDM_Odm->Adapter;
1925 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1927 #if MP_DRIVER != 1 //for mp driver, turn off txpwrtracking as default
1928 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl = TRUE;
1930 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
1931 PADAPTER Adapter = pDM_Odm->Adapter;
1932 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1935 if (pDM_Odm->SupportICType >= ODM_RTL8188E)
1937 pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
1938 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
1939 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
1941 if ( *(pDM_Odm->mp_mode) != 1)
1942 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
1944 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
1946 MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
1950 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1952 pdmpriv->bTXPowerTracking = _TRUE;
1953 pdmpriv->TXPowercount = 0;
1954 pdmpriv->bTXPowerTrackingInit = _FALSE;
1955 //#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
1957 if (*(pDM_Odm->mp_mode) != 1)
1958 pdmpriv->TxPowerTrackControl = _TRUE;
1960 pdmpriv->TxPowerTrackControl = _FALSE;
1963 //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
1966 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1967 #ifdef RTL8188E_SUPPORT
1969 pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
1970 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
1971 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
1972 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
1977 //pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
1978 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
1979 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
1980 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
1982 // The index of "0 dB" in SwingTable.
1983 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
1984 pDM_Odm->SupportICType == ODM_RTL8192E)
1986 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
1987 pDM_Odm->DefaultCckIndex = 20;
1991 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;
1992 pDM_Odm->DefaultCckIndex = 24;
1995 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
1996 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
1998 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
2000 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
2001 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
2002 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
2003 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
2004 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
2011 ODM_TXPowerTrackingCheck(
2012 IN PDM_ODM_T pDM_Odm
2016 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
2017 // at the same time. In the stage2/3, we need to prive universal interface and merge all
2018 // HW dynamic mechanism.
2020 switch (pDM_Odm->SupportPlatform)
2023 odm_TXPowerTrackingCheckMP(pDM_Odm);
2027 odm_TXPowerTrackingCheckCE(pDM_Odm);
2031 odm_TXPowerTrackingCheckAP(pDM_Odm);
2035 //odm_DIGAP(pDM_Odm);
2042 odm_TXPowerTrackingCheckCE(
2043 IN PDM_ODM_T pDM_Odm
2046 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2047 PADAPTER Adapter = pDM_Odm->Adapter;
2048 #if( (RTL8192C_SUPPORT==1) || (RTL8723A_SUPPORT==1) )
2049 if(IS_HARDWARE_TYPE_8192C(Adapter)){
2050 rtl8192c_odm_CheckTXPowerTracking(Adapter);
2055 #if (RTL8192D_SUPPORT==1)
2056 if(IS_HARDWARE_TYPE_8192D(Adapter)){
2057 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
2058 if(!Adapter->bSlaveOfDMSP)
2060 rtl8192d_odm_CheckTXPowerTracking(Adapter);
2065 #if(((RTL8188E_SUPPORT==1) || (RTL8812A_SUPPORT==1) || (RTL8821A_SUPPORT==1) || (RTL8192E_SUPPORT==1) || (RTL8723B_SUPPORT==1) ))
2066 if(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
2071 if(!pDM_Odm->RFCalibrateInfo.TM_Trigger) //at least delay 1 sec
2073 //pHalData->TxPowerCheckCnt++; //cosa add for debug
2074 if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)||IS_HARDWARE_TYPE_8723B(Adapter))
2075 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
2077 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);
2079 //DBG_871X("Trigger Thermal Meter!!\n");
2081 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
2086 //DBG_871X("Schedule TxPowerTracking direct call!!\n");
2087 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
2088 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
2095 odm_TXPowerTrackingCheckMP(
2096 IN PDM_ODM_T pDM_Odm
2099 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2100 PADAPTER Adapter = pDM_Odm->Adapter;
2102 if (ODM_CheckPowerStatus(Adapter) == FALSE)
2104 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>ODM_CheckPowerStatus() return FALSE\n"));
2108 if(IS_HARDWARE_TYPE_8723A(Adapter))
2111 if(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)
2112 odm_TXPowerTrackingThermalMeterCheck(Adapter);
2114 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\n"));
2122 odm_TXPowerTrackingCheckAP(
2123 IN PDM_ODM_T pDM_Odm
2126 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
2127 prtl8192cd_priv priv = pDM_Odm->priv;
2129 if ( (priv->pmib->dot11RFEntry.ther) && ((priv->up_time % priv->pshare->rf_ft_var.tpt_period) == 0)){
2130 #ifdef CONFIG_RTL_92D_SUPPORT
2131 if (GET_CHIP_VER(priv)==VERSION_8192D){
2132 tx_power_tracking_92D(priv);
2136 #ifdef CONFIG_RTL_92C_SUPPORT
2137 tx_power_tracking(priv);
2147 //antenna mapping info
2148 // 1: right-side antenna
2149 // 2/0: left-side antenna
2150 //PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt: for right-side antenna: Ant:1 RxDefaultAnt1
2151 //PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt: for left-side antenna: Ant:0 RxDefaultAnt2
2152 // We select left antenna as default antenna in initial process, modify it as needed
2155 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2158 odm_TXPowerTrackingThermalMeterCheck(
2162 #ifndef AP_BUILD_WORKAROUND
2163 static u1Byte TM_Trigger = 0;
2165 if(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))
2167 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
2168 ("===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\n"));
2172 if(!TM_Trigger) //at least delay 1 sec
2174 if(IS_HARDWARE_TYPE_8192D(Adapter))
2175 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_92D, BIT17 | BIT16, 0x03);
2176 else if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||
2177 IS_HARDWARE_TYPE_8723B(Adapter))
2178 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
2180 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
2182 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger Thermal Meter!!\n"));
2189 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));
2190 odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
2196 // Only for 8723A SW ANT DIV INIT--2012--07--17
2198 odm_SwAntDivInit_NIC_8723A(
2199 IN PDM_ODM_T pDM_Odm)
2201 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2202 PADAPTER Adapter = pDM_Odm->Adapter;
2204 u1Byte btAntNum=BT_GetPgAntNum(Adapter);
2206 if(IS_HARDWARE_TYPE_8723A(Adapter))
2208 pDM_SWAT_Table->ANTA_ON =TRUE;
2210 // Set default antenna B status by PG
2212 pDM_SWAT_Table->ANTB_ON = TRUE;
2213 else if(btAntNum == 1)
2214 pDM_SWAT_Table->ANTB_ON = FALSE;
2216 pDM_SWAT_Table->ANTB_ON = TRUE;
2225 //3============================================================
2226 //3 SW Antenna Diversity
2227 //3============================================================
2228 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
2231 IN PDM_ODM_T pDM_Odm
2234 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
2235 odm_SwAntDivInit_NIC(pDM_Odm);
2236 #elif(DM_ODM_SUPPORT_TYPE == ODM_AP)
2237 dm_SW_AntennaSwitchInit(pDM_Odm->priv);
2242 odm_SwAntDivInit_NIC(
2243 IN PDM_ODM_T pDM_Odm
2246 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2249 // Init SW ANT DIV mechanism for 8723AE/AU/AS
2250 // Neil Chen--2012--07--17---
2251 // CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
2252 //#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
2253 #if (RTL8723A_SUPPORT==1)
2254 if(pDM_Odm->SupportICType == ODM_RTL8723A)
2256 odm_SwAntDivInit_NIC_8723A(pDM_Odm);
2259 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
2260 pDM_SWAT_Table->RSSI_sum_A = 0;
2261 pDM_SWAT_Table->RSSI_cnt_A = 0;
2262 pDM_SWAT_Table->RSSI_sum_B = 0;
2263 pDM_SWAT_Table->RSSI_cnt_B = 0;
2264 pDM_SWAT_Table->CurAntenna = MAIN_ANT;
2265 pDM_SWAT_Table->PreAntenna = MAIN_ANT;
2266 pDM_SWAT_Table->try_flag = 0xff;
2267 pDM_SWAT_Table->PreRSSI = 0;
2268 pDM_SWAT_Table->SWAS_NoLink_State = 0;
2269 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
2270 pDM_SWAT_Table->SelectAntennaMap=0xAA;
2271 pDM_SWAT_Table->lastTxOkCnt = 0;
2272 pDM_SWAT_Table->lastRxOkCnt = 0;
2273 pDM_SWAT_Table->TXByteCnt_A = 0;
2274 pDM_SWAT_Table->TXByteCnt_B = 0;
2275 pDM_SWAT_Table->RXByteCnt_A = 0;
2276 pDM_SWAT_Table->RXByteCnt_B = 0;
2277 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
2278 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
2284 // Add new function to reset the state of antenna diversity before link.
2287 ODM_SwAntDivResetBeforeLink(
2288 IN PDM_ODM_T pDM_Odm
2292 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2294 pDM_SWAT_Table->SWAS_NoLink_State = 0;
2299 // 20100514 Luke/Joseph:
2300 // Add new function to reset antenna diversity state after link.
2303 ODM_SwAntDivRestAfterLink(
2304 IN PDM_ODM_T pDM_Odm
2307 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2308 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
2311 if(pDM_Odm->SupportICType == ODM_RTL8723A)
2313 pDM_SWAT_Table->RSSI_cnt_A = 0;
2314 pDM_SWAT_Table->RSSI_cnt_B = 0;
2315 pDM_Odm->RSSI_test = FALSE;
2316 pDM_SWAT_Table->try_flag = 0xff;
2317 pDM_SWAT_Table->RSSI_Trying = 0;
2318 pDM_SWAT_Table->SelectAntennaMap=0xAA;
2321 else if(pDM_Odm->SupportICType & (ODM_RTL8723B|ODM_RTL8821))
2323 pDM_Odm->RSSI_test = FALSE;
2324 pDM_SWAT_Table->try_flag = 0xff;
2325 pDM_SWAT_Table->RSSI_Trying = 0;
2326 pDM_SWAT_Table->Double_chk_flag= 0;
2328 pDM_FatTable->RxIdleAnt=MAIN_ANT;
2330 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
2332 pDM_FatTable->MainAnt_Sum[i] = 0;
2333 pDM_FatTable->AuxAnt_Sum[i] = 0;
2334 pDM_FatTable->MainAnt_Cnt[i] = 0;
2335 pDM_FatTable->AuxAnt_Cnt[i] = 0;
2342 odm_SwAntDetectInit(
2343 IN PDM_ODM_T pDM_Odm
2346 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2347 #if (RTL8723B_SUPPORT == 1)
2348 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);
2350 pDM_SWAT_Table->PreAntenna = MAIN_ANT;
2351 pDM_SWAT_Table->CurAntenna = MAIN_ANT;
2352 pDM_SWAT_Table->SWAS_NoLink_State = 0;
2356 ODM_SwAntDivChkPerPktRssi(
2357 IN PDM_ODM_T pDM_Odm,
2358 IN u1Byte StationID,
2359 IN PODM_PHY_INFO_T pPhyInfo
2362 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2364 if(!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
2367 // temporary Fix 8723A MP SW ANT DIV Bug --NeilChen--2012--07--11
2368 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
2369 if(pDM_Odm->SupportICType == ODM_RTL8723A)
2371 //if(StationID == pDM_SWAT_Table->RSSI_target)
2373 //1 RSSI for SW Antenna Switch
2374 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2376 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
2377 pDM_SWAT_Table->RSSI_cnt_A++;
2381 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
2382 pDM_SWAT_Table->RSSI_cnt_B++;
2389 if(StationID == pDM_SWAT_Table->RSSI_target)
2391 //1 RSSI for SW Antenna Switch
2392 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2394 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
2395 pDM_SWAT_Table->RSSI_cnt_A++;
2399 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
2400 pDM_SWAT_Table->RSSI_cnt_B++;
2406 if(StationID == pDM_SWAT_Table->RSSI_target)
2408 //1 RSSI for SW Antenna Switch
2409 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2411 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
2412 pDM_SWAT_Table->RSSI_cnt_A++;
2416 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
2417 pDM_SWAT_Table->RSSI_cnt_B++;
2426 odm_SwAntDivChkAntSwitch(
2427 IN PDM_ODM_T pDM_Odm,
2432 // For AP/ADSL use prtl8192cd_priv
2433 // For CE/NIC use PADAPTER
2435 prtl8192cd_priv priv = pDM_Odm->priv;
2438 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
2439 // at the same time. In the stage2/3, we need to prive universal interface and merge all
2440 // HW dynamic mechanism.
2442 switch (pDM_Odm->SupportPlatform)
2445 odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
2448 odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
2453 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP |ODM_ADSL))
2454 if (priv->pshare->rf_ft_var.antSw_enable && (priv->up_time % 4==1))
2455 dm_SW_AntennaSwitch(priv, SWAW_STEP_PEAK);
2463 // 20100514 Luke/Joseph:
2464 // Add new function for antenna diversity after link.
2465 // This is the main function of antenna diversity after link.
2466 // This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
2467 // HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
2468 // In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
2469 // After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
2470 // listened on the air with the RSSI of original antenna.
2471 // It chooses the antenna with better RSSI.
2472 // There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
2473 // penalty to get next try.
2478 IN PDM_ODM_T pDM_Odm,
2481 ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna);
2485 odm_SwAntDivChkAntSwitchNIC(
2486 IN PDM_ODM_T pDM_Odm,
2490 #if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
2491 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
2492 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2494 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
2495 PADAPTER Adapter=pDM_Odm->Adapter;
2498 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
2499 s4Byte curRSSI=100, RSSI_A, RSSI_B;
2500 u1Byte nextAntenna=AUX_ANT;
2501 //static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
2502 u8Byte curTxOkCnt=0, curRxOkCnt=0;
2503 //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
2504 u8Byte CurByteCnt=0, PreByteCnt=0;
2505 //static u1Byte TrafficLoad = TRAFFIC_LOW;
2506 u1Byte Score_A=0, Score_B=0; //A: Main; B: AUX
2509 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
2512 if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
2515 if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
2518 if(pDM_Odm->SupportPlatform & ODM_WIN)
2520 if(*(pDM_Odm->pAntennaTest))
2524 if((pDM_SWAT_Table->ANTA_ON == FALSE) ||(pDM_SWAT_Table->ANTB_ON == FALSE))
2526 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
2527 ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
2531 // Radio off: Status reset to default and return.
2532 if(*(pDM_Odm->pbPowerSaving)==TRUE) //pHalData->eRFPowerState==eRfOff
2534 ODM_SwAntDivRestAfterLink(pDM_Odm);
2539 // Handling step mismatch condition.
2540 // Peak step is not finished at last time. Recover the variable and check again.
2541 if( Step != pDM_SWAT_Table->try_flag )
2543 ODM_SwAntDivRestAfterLink(pDM_Odm);
2546 #if (DM_ODM_SUPPORT_TYPE &( ODM_WIN| ODM_CE ))
2548 if(pDM_SWAT_Table->try_flag == 0xff)
2550 pDM_SWAT_Table->RSSI_target = 0xff;
2552 #if(DM_ODM_SUPPORT_TYPE & ODM_CE)
2555 PSTA_INFO_T pEntry = NULL;
2558 for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
2560 pEntry = pDM_Odm->pODM_StaInfo[index];
2561 if(IS_STA_VALID(pEntry) ) {
2567 ODM_SwAntDivRestAfterLink(pDM_Odm);
2568 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
2573 pDM_SWAT_Table->RSSI_target = index;
2574 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
2577 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
2579 PADAPTER pAdapter = pDM_Odm->Adapter;
2580 PMGNT_INFO pMgntInfo=&pAdapter->MgntInfo;
2582 // Select RSSI checking target
2583 if(pMgntInfo->mAssoc && !ACTING_AS_AP(pAdapter))
2585 // Target: Infrastructure mode AP.
2586 //pDM_SWAT_Table->RSSI_target = NULL;
2587 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): RSSI_target is DEF AP!\n"));
2592 PSTA_INFO_T pEntry = NULL;
2593 PADAPTER pTargetAdapter = NULL;
2595 if(pMgntInfo->mIbss )
2597 // Target: AP/IBSS peer.
2598 pTargetAdapter = pAdapter;
2602 pTargetAdapter = GetFirstAPAdapter(pAdapter);
2605 if(pTargetAdapter != NULL)
2607 for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
2610 pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
2613 if(pEntry->bAssociated)
2623 ODM_SwAntDivRestAfterLink(pDM_Odm);
2624 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
2629 //pDM_SWAT_Table->RSSI_target = pEntry;
2630 pDM_SWAT_Table->RSSI_target = index;
2631 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
2633 }//end if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
2638 pDM_SWAT_Table->RSSI_cnt_A = 0;
2639 pDM_SWAT_Table->RSSI_cnt_B = 0;
2640 pDM_SWAT_Table->try_flag = 0;
2641 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
2647 // To Fix 8723A SW ANT DIV Bug issue
2648 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
2649 if (pDM_Odm->SupportICType & ODM_RTL8723A)
2651 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt;
2652 curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt;
2653 pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
2654 pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
2657 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
2658 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
2659 pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
2660 pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
2662 if(pDM_SWAT_Table->try_flag == 1)
2664 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2666 pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
2667 pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
2671 pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
2672 pDM_SWAT_Table->RXByteCnt_B += curRxOkCnt;
2675 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
2676 pDM_SWAT_Table->RSSI_Trying--;
2677 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
2678 if(pDM_SWAT_Table->RSSI_Trying == 0)
2680 CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A) : (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B);
2681 PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B) : (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A);
2683 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
2684 //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
2685 PreByteCnt = PreByteCnt*9;
2686 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
2687 //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
2688 PreByteCnt = PreByteCnt*2;
2690 if(pDM_SWAT_Table->RSSI_cnt_A > 0)
2691 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
2694 if(pDM_SWAT_Table->RSSI_cnt_B > 0)
2695 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
2698 curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
2699 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
2700 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
2701 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n",
2702 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
2703 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
2704 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
2711 if(pDM_SWAT_Table->RSSI_cnt_A > 0)
2712 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
2715 if(pDM_SWAT_Table->RSSI_cnt_B > 0)
2716 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
2719 curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
2720 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
2721 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
2722 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n",
2723 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
2725 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
2726 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
2727 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
2728 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
2732 if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
2735 if(pDM_SWAT_Table->TestMode == TP_MODE)
2737 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
2738 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
2739 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\n",PreByteCnt));
2740 if(CurByteCnt < PreByteCnt)
2742 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2743 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
2745 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
2749 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2750 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
2752 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
2754 for (i= 0; i<8; i++)
2756 if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
2761 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
2762 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Score_A=%d, Score_B=%d\n", Score_A, Score_B));
2764 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
2766 nextAntenna = (Score_A > Score_B)?MAIN_ANT:AUX_ANT;
2770 nextAntenna = (Score_B > Score_A)?AUX_ANT:MAIN_ANT;
2772 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
2773 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n",
2774 //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
2776 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
2778 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
2782 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
2786 if(pDM_SWAT_Table->TestMode == RSSI_MODE)
2788 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
2789 pDM_SWAT_Table->SelectAntennaMap=0xAA;
2790 if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
2792 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
2793 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
2795 else // current anntena is good
2797 nextAntenna =pDM_SWAT_Table->CurAntenna;
2798 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
2801 pDM_SWAT_Table->try_flag = 0;
2802 pDM_Odm->RSSI_test = FALSE;
2803 pDM_SWAT_Table->RSSI_sum_A = 0;
2804 pDM_SWAT_Table->RSSI_cnt_A = 0;
2805 pDM_SWAT_Table->RSSI_sum_B = 0;
2806 pDM_SWAT_Table->RSSI_cnt_B = 0;
2807 pDM_SWAT_Table->TXByteCnt_A = 0;
2808 pDM_SWAT_Table->TXByteCnt_B = 0;
2809 pDM_SWAT_Table->RXByteCnt_A = 0;
2810 pDM_SWAT_Table->RXByteCnt_B = 0;
2815 else if(pDM_SWAT_Table->try_flag == 0)
2817 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
2819 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
2820 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
2822 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
2824 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
2826 if ((curTxOkCnt+curRxOkCnt) > 3750000) //if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
2827 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
2829 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
2831 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
2832 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
2833 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
2835 //Prepare To Try Antenna
2836 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
2837 pDM_SWAT_Table->try_flag = 1;
2838 pDM_Odm->RSSI_test = TRUE;
2839 if((curRxOkCnt+curTxOkCnt) > 1000)
2841 pDM_SWAT_Table->RSSI_Trying = 4;
2842 pDM_SWAT_Table->TestMode = TP_MODE;
2846 pDM_SWAT_Table->RSSI_Trying = 2;
2847 pDM_SWAT_Table->TestMode = RSSI_MODE;
2850 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
2853 pDM_SWAT_Table->RSSI_sum_A = 0;
2854 pDM_SWAT_Table->RSSI_cnt_A = 0;
2855 pDM_SWAT_Table->RSSI_sum_B = 0;
2856 pDM_SWAT_Table->RSSI_cnt_B = 0;
2860 //1 4.Change TRX antenna
2861 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
2863 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
2864 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);
2865 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2866 ODM_SetAntenna(pDM_Odm,nextAntenna);
2867 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
2870 bEnqueue = (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)?FALSE :TRUE;
2871 rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
2877 //1 5.Reset Statistics
2878 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
2879 pDM_SWAT_Table->CurAntenna = nextAntenna;
2880 pDM_SWAT_Table->PreRSSI = curRSSI;
2882 //1 6.Set next timer
2884 //PADAPTER pAdapter = pDM_Odm->Adapter;
2885 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2888 if(pDM_SWAT_Table->RSSI_Trying == 0)
2891 if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
2893 if(pDM_SWAT_Table->TestMode == TP_MODE)
2895 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
2897 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
2899 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
2901 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
2903 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
2904 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
2909 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
2910 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
2915 if(pDM_SWAT_Table->TestMode == TP_MODE)
2917 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
2918 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
2919 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
2920 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
2923 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
2926 #endif // #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
2927 #endif // #if (RTL8192C_SUPPORT==1)
2931 // Remove odm_SwAntDivSelectScanChnl() and odm_SwAntDivConstructScanChnl() to odm_PathDiv.c
2935 // 20100514 Luke/Joseph:
2936 // Callback function for 500ms antenna test trying.
2938 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2940 odm_SwAntDivChkAntSwitchCallback(
2944 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
2945 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2946 pSWAT_T pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
2948 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
2950 ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
2952 odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
2955 ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
2960 odm_SwAntDivChkAntSwitchWorkitemCallback(
2965 PADAPTER pAdapter = (PADAPTER)pContext;
2966 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2968 odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
2971 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
2972 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
2974 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
2975 PADAPTER padapter = pDM_Odm->Adapter;
2976 if(padapter->net_closed == _TRUE)
2978 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
2980 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
2981 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
2983 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
2984 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
2988 #else //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
2990 VOID odm_SwAntDivInit( IN PDM_ODM_T pDM_Odm ) {}
2991 VOID ODM_SwAntDivChkPerPktRssi(
2992 IN PDM_ODM_T pDM_Odm,
2993 IN u1Byte StationID,
2994 IN PODM_PHY_INFO_T pPhyInfo
2996 VOID odm_SwAntDivChkAntSwitch(
2997 IN PDM_ODM_T pDM_Odm,
3000 VOID ODM_SwAntDivResetBeforeLink( IN PDM_ODM_T pDM_Odm ){}
3001 VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm ){}
3002 VOID odm_SwAntDetectInit( IN PDM_ODM_T pDM_Odm){}
3003 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3004 VOID odm_SwAntDivChkAntSwitchCallback( PRT_TIMER pTimer){}
3005 VOID odm_SwAntDivChkAntSwitchWorkitemCallback( IN PVOID pContext ){}
3006 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3007 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
3008 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
3009 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
3012 #endif //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
3016 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3018 ODM_SwAntDivCheckBeforeLink(
3019 IN PDM_ODM_T pDM_Odm
3023 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
3025 PADAPTER Adapter = pDM_Odm->Adapter;
3026 HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter);
3027 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
3028 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3029 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
3031 PRT_WLAN_BSS pTmpBssDesc, pTestBssDesc;
3032 s4Byte power_diff = 0, power_target = 10;
3033 u1Byte index, counter = 0;
3034 static u1Byte ScanChannel;
3035 u8Byte tStamp_diff = 0;
3038 if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
3039 { // The ODM structure is not initialized.
3043 // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
3044 if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))
3047 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
3048 PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
3049 if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
3051 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
3053 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3054 ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
3055 pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));
3057 pDM_SWAT_Table->SWAS_NoLink_State = 0;
3063 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
3065 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("pDM_SWAT_Table->SWAS_NoLink_State = %d\n", pDM_SWAT_Table->SWAS_NoLink_State));
3066 //1 Run AntDiv mechanism "Before Link" part.
3067 if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
3069 //1 Prepare to do Scan again to check current antenna state.
3071 // Set check state to next step.
3072 pDM_SWAT_Table->SWAS_NoLink_State = 1;
3074 // Copy Current Scan list.
3075 pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;
3076 PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
3078 // Go back to scan function again.
3079 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));
3080 pMgntInfo->ScanStep=0;
3081 pMgntInfo->bScanAntDetect = TRUE;
3082 ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);
3085 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
3087 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
3088 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
3090 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
3091 if(ScanChannel == 0)
3093 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3094 ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
3096 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
3098 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
3099 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
3103 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
3104 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
3109 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3110 ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
3112 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))
3114 // Switch Antenna to another one.
3115 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
3116 pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;
3118 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3119 ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
3120 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
3121 if(pDM_Odm->SupportICType == ODM_RTL8192C)
3123 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
3124 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
3126 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
3128 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
3129 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
3130 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
3134 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
3135 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
3141 //1 ScanComple() is called after antenna swiched.
3142 //1 Check scan result and determine which antenna is going
3145 for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)
3147 pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1
3148 pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2
3150 if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
3152 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));
3156 if(pDM_Odm->SupportICType != ODM_RTL8723B)
3158 if(pTmpBssDesc->ChannelNumber == ScanChannel)
3160 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
3162 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));
3163 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
3164 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
3167 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
3169 else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
3171 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));
3172 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
3173 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
3178 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)
3180 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
3181 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
3182 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));
3189 if(pTmpBssDesc->ChannelNumber == ScanChannel)
3191 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
3194 power_diff = power_diff + (pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);
3195 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
3196 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
3197 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
3198 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
3200 else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower)
3203 power_diff = power_diff + (pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);
3204 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
3205 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
3206 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
3208 else if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp)
3210 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
3211 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)
3214 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
3215 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
3216 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
3223 if(pDM_Odm->SupportICType == ODM_RTL8723B)
3225 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: %d power_diff: %d\n", counter, power_diff));
3228 power_diff = power_diff / counter;
3230 if(power_diff <= power_target && counter != 0)
3234 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
3236 if(pMgntInfo->NumBssDesc!=0 && Score<0)
3238 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3239 ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
3243 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3244 ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
3246 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
3247 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
3249 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
3252 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
3254 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
3255 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
3259 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
3260 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
3263 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
3265 pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
3266 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
3267 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
3268 ODM_SetBBReg(pDM_Odm, rDPDT_control,bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
3272 if(pMgntInfo->NumBssDesc != 0 && Score > 0)
3274 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
3276 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
3277 pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
3279 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
3283 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
3285 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
3286 pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
3287 BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);
3289 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
3293 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Igone result\n"));
3295 else if(pDM_Odm->SupportICType == ODM_RTL8192C)
3297 if(pMgntInfo->NumBssDesc!=0 && Score<=0)
3299 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3300 ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
3302 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
3306 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3307 ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));
3309 pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
3311 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
3312 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
3313 PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
3317 // Check state reset to default and wait for next time.
3318 pDM_SWAT_Table->SWAS_NoLink_State = 0;
3319 pMgntInfo->bScanAntDetect = FALSE;
3331 #endif //#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
3334 //3============================================================
3335 //3 SW Antenna Diversity
3336 //3============================================================
3338 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
3340 odm_InitHybridAntDiv_88C_92D(
3341 IN PDM_ODM_T pDM_Odm
3345 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
3346 struct rtl8192cd_priv *priv=pDM_Odm->priv;
3348 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3349 u1Byte bTxPathSel=0; //0:Path-A 1:Path-B
3352 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
3354 //whether to do antenna diversity or not
3355 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
3356 if(priv==NULL) return;
3357 if(!priv->pshare->rf_ft_var.antHw_enable)
3360 #ifdef SW_ANT_SWITCH
3361 priv->pshare->rf_ft_var.antSw_enable =0;
3365 if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
3369 bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?FALSE:TRUE;
3371 ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
3372 ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
3373 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
3374 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
3375 // check HW setting: ANTSEL pin connection
3376 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
3377 ODM_Write2Byte(pDM_Odm,ODM_REG_RF_PIN_11N, (ODM_Read2Byte(pDM_Odm,0x804)&0xf0ff )| BIT(8) ); // b11-b8=0001,update RFPin setting
3380 // only AP support different path selection temperarly
3381 if(!bTxPathSel){ //PATH-A
3382 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
3383 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1); //select TX ANTESEL from path A
3386 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
3387 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0); //select ANTESEL from path B
3390 //Set OFDM HW RX Antenna Diversity
3391 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
3392 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
3393 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1); // Decide final antenna by comparing 2 antennas' pwdb
3395 //Set CCK HW RX Antenna Diversity
3396 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
3397 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, 0xf, 0xf); //Threshold for antenna diversity. Check another antenna power if input power < ANT_lim*4
3398 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
3399 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
3402 //Enable HW Antenna Diversity
3403 if(!bTxPathSel) //PATH-A
3404 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1); // Enable Hardware antenna switch
3406 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1); // Enable Hardware antenna switch
3407 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
3409 pDM_SWAT_Table->CurAntenna=0; //choose left antenna as default antenna
3410 pDM_SWAT_Table->PreAntenna=0;
3411 for(i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
3413 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
3414 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
3415 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
3416 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
3417 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
3418 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
3420 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
3425 odm_InitHybridAntDiv(
3426 IN PDM_ODM_T pDM_Odm
3429 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
3431 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
3435 if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
3437 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
3438 odm_InitHybridAntDiv_88C_92D(pDM_Odm);
3446 IN PDM_ODM_T pDM_Odm,
3447 IN u4Byte OFDM_Ant1_Cnt,
3448 IN u4Byte OFDM_Ant2_Cnt,
3449 IN u4Byte CCK_Ant1_Cnt,
3450 IN u4Byte CCK_Ant2_Cnt,
3456 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
3458 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("OFDM_Ant1_Cnt:%d, OFDM_Ant2_Cnt:%d\n",OFDM_Ant1_Cnt,OFDM_Ant2_Cnt));
3459 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("CCK_Ant1_Cnt:%d, CCK_Ant2_Cnt:%d\n",CCK_Ant1_Cnt,CCK_Ant2_Cnt));
3462 if(((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)){
3463 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
3467 if(OFDM_Ant1_Cnt || OFDM_Ant2_Cnt ) {
3468 //if RX OFDM packet number larger than 0
3469 if(OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
3474 // else if RX CCK packet number larger than 10
3475 else if((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
3477 if(CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
3479 else if(CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
3481 else if(CCK_Ant1_Cnt > CCK_Ant2_Cnt)
3488 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
3491 //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
3492 //(*pDefAnt)= (u1Byte) antsel;
3497 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
3507 IN PDM_ODM_T pDM_Odm,
3509 IN BOOLEAN bDualPath
3512 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3514 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
3516 if(Ant != pDM_SWAT_Table->RxIdleAnt)
3520 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9); //right-side antenna
3522 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a); //left-side antenna
3527 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9); //right-side antenna
3529 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a); //left-side antenna
3532 pDM_SWAT_Table->RxIdleAnt = Ant;
3533 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("RxIdleAnt: %s Reg858=0x%x\n",(Ant==1)?"Ant1":"Ant2",(Ant==1)?0x65a9:0x569a));
3535 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
3540 ODM_AntselStatistics_88C(
3541 IN PDM_ODM_T pDM_Odm,
3544 IN BOOLEAN isCCKrate
3547 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3549 if(pDM_SWAT_Table->antsel == 1)
3552 pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
3555 pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
3556 pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
3562 pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
3565 pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
3566 pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
3575 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
3577 ODM_SetTxAntByTxInfo_88C_92D(
3578 IN PDM_ODM_T pDM_Odm,
3583 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3586 if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))
3589 if(pDM_SWAT_Table->RxIdleAnt == 1)
3590 antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?0:1;
3592 antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?1:0;
3594 SET_TX_DESC_ANTSEL_A_92C(pDesc, antsel);
3595 //SET_TX_DESC_ANTSEL_B_92C(pDesc, antsel);
3596 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("SET_TX_DESC_ANTSEL_A_92C=%d\n", pDM_SWAT_Table->TxAnt[macId]));
3598 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
3600 ODM_SetTxAntByTxInfo_88C_92D(
3601 IN PDM_ODM_T pDM_Odm
3606 #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
3608 ODM_SetTxAntByTxInfo_88C_92D(
3609 IN PDM_ODM_T pDM_Odm
3617 odm_HwAntDiv_92C_92D(
3618 IN PDM_ODM_T pDM_Odm
3621 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3622 u4Byte RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
3623 u1Byte RxIdleAnt, i;
3627 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
3628 struct rtl8192cd_priv *priv=pDM_Odm->priv;
3630 if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
3634 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
3636 if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) //if don't support antenna diveristy
3638 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
3642 if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
3644 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
3648 #if (DM_ODM_SUPPORT_TYPE&(ODM_WIN|ODM_CE))
3649 if(!pDM_Odm->bLinked)
3651 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is FALSE\n"));
3656 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
3658 pEntry = pDM_Odm->pODM_StaInfo[i];
3659 if(IS_STA_VALID(pEntry))
3662 RSSI_Ant1 = (pDM_SWAT_Table->OFDM_Ant1_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant1_Sum[i]/pDM_SWAT_Table->OFDM_Ant1_Cnt[i]);
3663 RSSI_Ant2 = (pDM_SWAT_Table->OFDM_Ant2_Cnt[i] == 0)?0:(pDM_SWAT_Table->RSSI_Ant2_Sum[i]/pDM_SWAT_Table->OFDM_Ant2_Cnt[i]);
3665 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d, RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
3667 if(RSSI_Ant1 ||RSSI_Ant2)
3669 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
3670 if(pDM_Odm->pODM_StaInfo[i]->expire_to)
3673 RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
3674 if((!RSSI) || ( RSSI < RSSI_Min) ) {
3675 pDM_SWAT_Table->TargetSTA = i;
3680 ///STA: found out default antenna
3681 bRet=odm_StaDefAntSel(pDM_Odm,
3682 pDM_SWAT_Table->OFDM_Ant1_Cnt[i],
3683 pDM_SWAT_Table->OFDM_Ant2_Cnt[i],
3684 pDM_SWAT_Table->CCK_Ant1_Cnt[i],
3685 pDM_SWAT_Table->CCK_Ant2_Cnt[i],
3686 &pDM_SWAT_Table->TxAnt[i]);
3688 //if Tx antenna selection: successful
3690 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
3691 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
3692 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
3693 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
3694 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
3695 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
3701 RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
3702 odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, FALSE);
3704 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
3706 if (!priv->pmib->dot11OperationEntry.disable_txsc) {
3707 plist = phead->next;
3708 while(plist != phead) {
3709 pstat = list_entry(plist, struct stat_info, asoc_list);
3710 if(pstat->expire_to) {
3711 for (i=0; i<TX_SC_ENTRY_NUM; i++) {
3712 struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);
3713 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
3714 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
3715 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
3716 pdesc= &(pstat->tx_sc_ent[i].hwdesc2);
3717 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
3718 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
3719 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
3723 if (plist == plist->next)
3725 plist = plist->next;
3731 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
3737 IN PDM_ODM_T pDM_Odm
3741 PADAPTER pAdapter = pDM_Odm->Adapter;
3743 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
3744 if(pAdapter->MgntInfo.AntennaTest)
3747 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
3749 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
3753 if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
3755 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
3756 odm_HwAntDiv_92C_92D(pDM_Odm);
3762 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
3766 IN PDM_ODM_T pDM_Odm
3769 struct rtl8192cd_priv *priv=pDM_Odm->priv;
3770 struct stat_info *pstat, *pstat_min=NULL;
3771 struct list_head *phead, *plist;
3772 int rssi_min= 0xff, i;
3773 u1Byte idleAnt=priv->pshare->rf_ft_var.CurAntenna;
3777 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
3779 if((!priv->pshare->rf_ft_var.antHw_enable) ||(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)))
3783 if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
3786 phead = &priv->asoc_list;
3787 plist = phead->next;
3788 ////=========================
3789 //find mimum rssi sta
3790 ////=========================
3791 while(plist != phead) {
3792 pstat = list_entry(plist, struct stat_info, asoc_list);
3793 if((pstat->expire_to) && (pstat->AntRSSI[0] || pstat->AntRSSI[1])) {
3794 int rssi = (pstat->AntRSSI[0] < pstat->AntRSSI[1]) ? pstat->AntRSSI[0] : pstat->AntRSSI[1];
3795 if((!pstat_min) || ( rssi < rssi_min) ) {
3800 ///STA: found out default antenna
3801 bRet=odm_StaDefAntSel(pDM_Odm,
3802 pstat->hwRxAntSel[1],
3803 pstat->hwRxAntSel[0],
3804 pstat->cckPktCount[1],
3805 pstat->cckPktCount[0],
3809 //if default antenna selection: successful
3811 pstat->CurAntenna = nextAnt;
3813 for(i=0; i<2; i++) {
3814 if(pstat->cckPktCount[i]==0 && pstat->hwRxAntSel[i]==0)
3815 pstat->AntRSSI[i] = 0;
3817 if(pstat->AntRSSI[idleAnt]==0)
3818 pstat->AntRSSI[idleAnt] = pstat->AntRSSI[idleAnt^1];
3820 pstat->hwRxAntSel[1] = pstat->hwRxAntSel[0] =0;
3821 pstat->cckPktCount[1]= pstat->cckPktCount[0] =0;
3824 if (plist == plist->next)
3826 plist = plist->next;
3829 ////=========================
3830 //Choose RX Idle antenna according to minmum rssi
3831 ////=========================
3833 if(priv->pshare->rf_ft_var.CurAntenna!=pstat_min->CurAntenna)
3834 odm_SetRxIdleAnt(pDM_Odm,pstat_min->CurAntenna,TRUE);
3835 priv->pshare->rf_ft_var.CurAntenna = pstat_min->CurAntenna;
3840 if (!priv->pmib->dot11OperationEntry.disable_txsc) {
3841 plist = phead->next;
3842 while(plist != phead) {
3843 pstat = list_entry(plist, struct stat_info, asoc_list);
3844 if(pstat->expire_to) {
3845 for (i=0; i<TX_SC_ENTRY_NUM; i++) {
3846 struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);
3847 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
3848 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
3849 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
3850 pdesc= &(pstat->tx_sc_ent[i].hwdesc2);
3851 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
3852 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
3853 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
3857 if (plist == plist->next)
3859 plist = plist->next;
3863 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,"<==============odm_HwAntDiv\n");
3868 ODM_Diversity_AntennaSelect(
3869 IN PDM_ODM_T pDM_Odm,
3873 struct rtl8192cd_priv *priv=pDM_Odm->priv;
3875 int ant = _atoi(data, 16);
3877 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ODM_Diversity_AntennaSelect==============>\n"));
3879 #ifdef PCIE_POWER_SAVING
3880 PCIeWakeUp(priv, POWER_DOWN_T0);
3883 if (ant==AUX_ANT || ant==MAIN_ANT)
3885 if ( !priv->pshare->rf_ft_var.antSw_select) {
3886 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(8)| BIT(9) ); // ANTSEL A as SW control
3887 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7))); // rx OFDM SW control
3888 PHY_SetBBReg(priv, 0x860, 0x300, ant);
3890 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(24)| BIT(25) ); // ANTSEL B as HW control
3891 PHY_SetBBReg(priv, 0x864, 0x300, ant);
3892 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7))); // rx OFDM SW control
3895 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7))); // rx CCK SW control
3896 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
3897 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
3899 priv->pshare->rf_ft_var.antHw_enable = 0;
3900 priv->pshare->rf_ft_var.CurAntenna = (ant%2);
3902 #ifdef SW_ANT_SWITCH
3903 priv->pshare->rf_ft_var.antSw_enable = 0;
3904 priv->pshare->DM_SWAT_Table.CurAntenna = ant;
3905 priv->pshare->RSSI_test =0;
3910 if ( !priv->pshare->rf_ft_var.antSw_select) {
3911 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(8)| BIT(9)) );
3912 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) | BIT(7)); // OFDM HW control
3914 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(24)| BIT(25)) );
3915 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) | BIT(7)); // OFDM HW control
3918 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) | BIT(7)); // CCK HW control
3919 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) | BIT(21) ); // by tx desc
3920 priv->pshare->rf_ft_var.CurAntenna = 0;
3921 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
3922 priv->pshare->rf_ft_var.antHw_enable = 1;
3923 #ifdef SW_ANT_SWITCH
3924 priv->pshare->rf_ft_var.antSw_enable = 0;
3925 priv->pshare->RSSI_test =0;
3928 #ifdef SW_ANT_SWITCH
3930 if(!priv->pshare->rf_ft_var.antSw_enable) {
3932 dm_SW_AntennaSwitchInit(priv);
3933 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
3934 priv->pshare->lastTxOkCnt = priv->net_stats.tx_bytes;
3935 priv->pshare->lastRxOkCnt = priv->net_stats.rx_bytes;
3937 if ( !priv->pshare->rf_ft_var.antSw_select)
3938 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7))); // rx OFDM SW control
3940 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7))); // rx OFDM SW control
3942 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7))); // rx CCK SW control
3943 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
3944 priv->pshare->rf_ft_var.antHw_enable = 0;
3945 priv->pshare->rf_ft_var.antSw_enable = 1;
3949 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============ODM_Diversity_AntennaSelect\n"));
3955 #else //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
3957 VOID odm_InitHybridAntDiv( IN PDM_ODM_T pDM_Odm ){}
3958 VOID odm_HwAntDiv( IN PDM_ODM_T pDM_Odm){}
3959 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
3960 VOID ODM_SetTxAntByTxInfo_88C_92D(
3961 IN PDM_ODM_T pDM_Odm,
3965 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
3966 VOID ODM_SetTxAntByTxInfo_88C_92D( IN PDM_ODM_T pDM_Odm){ }
3967 #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
3968 VOID ODM_SetTxAntByTxInfo_88C_92D( IN PDM_ODM_T pDM_Odm){ }
3971 #endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
3975 //============================================================
3977 //============================================================
3979 //Remove Edca by Yuchen
3982 #if( DM_ODM_SUPPORT_TYPE == ODM_WIN)
3984 // 2011/07/26 MH Add an API for testing IQK fail case.
3987 ODM_CheckPowerStatus(
3988 IN PADAPTER Adapter)
3991 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3992 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
3993 RT_RF_POWER_STATE rtState;
3994 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
3996 // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.
3997 if (pMgntInfo->init_adpt_in_progress == TRUE)
3999 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter"));
4004 // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.
4006 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));
4007 if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)
4009 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n",
4010 Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));
4017 // need to ODM CE Platform
4018 //move to here for ANT detection mechanism using
4020 #if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
4023 IN PDM_ODM_T pDM_Odm,
4025 u1Byte initial_gain_psd)
4027 //unsigned int val, rfval;
4031 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4033 //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
4034 //DbgPrint("Reg908 = 0x%x\n",val);
4035 //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
4036 //rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
4037 //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
4038 //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
4039 //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
4041 //Set DCO frequency index, offset=(40MHz/SamplePts)*point
4042 ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
4044 //Start PSD calculation, Reg808[22]=0->1
4045 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
4046 //Need to wait for HW PSD report
4047 ODM_StallExecution(1000);
4048 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
4049 //Read PSD report, Reg8B4[15:0]
4050 psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
4052 #if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))
4053 psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
4055 psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);
4070 Value = Value & 0xFFFF;
4074 if (Value <= dB_Invert_Table[i][11])
4082 return (96); // maximum 96 dB
4087 if (Value <= dB_Invert_Table[i][j])
4102 // PSD function will be moved to FW in future IC, but now is only implemented in MP platform
4103 // So PSD function will not be incorporated to common ODM
4105 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4107 #define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD
4108 #define MODE_40M 0 //0:20M, 1:40M
4110 #define PSD_CHMIN 20 // Minimum channel number for BT AFH
4111 #define SIR_STEP_SIZE 3
4112 #define Smooth_Size_1 5
4113 #define Smooth_TH_1 3
4114 #define Smooth_Size_2 10
4115 #define Smooth_TH_2 4
4116 #define Smooth_Size_3 20
4117 #define Smooth_TH_3 4
4118 #define Smooth_Step_Size 5
4119 #define Adaptive_SIR 1
4120 //#if(RTL8723_FPGA_VERIFICATION == 1)
4121 //#define PSD_RESCAN 1
4123 //#define PSD_RESCAN 4
4125 #define SCAN_INTERVAL 1500 //ms
4126 #define SYN_Length 5 // for 92D
4128 #define LNA_Low_Gain_1 0x64
4129 #define LNA_Low_Gain_2 0x5A
4130 #define LNA_Low_Gain_3 0x58
4132 #define pw_th_10dB 0x0
4133 #define pw_th_16dB 0x3
4135 #define FA_RXHP_TH1 5000
4136 #define FA_RXHP_TH2 1500
4137 #define FA_RXHP_TH3 800
4138 #define FA_RXHP_TH4 600
4139 #define FA_RXHP_TH5 500
4142 #define High_TP_Mode 1
4143 #define Low_TP_Mode 2
4148 IN PDM_ODM_T pDM_Odm)
4150 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
4151 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4152 //PSD Monitor Setting
4153 //Which path in ADC/DAC is turnned on for PSD: both I/Q
4154 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
4155 //Ageraged number: 8
4156 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
4157 pDM_Odm->bPSDinProcess = FALSE;
4158 pDM_Odm->bUserAssignLevel = FALSE;
4159 pDM_Odm->bPSDactive = FALSE;
4160 //pDM_Odm->bDMInitialGainEnable=TRUE; //change the initialization to DIGinit
4162 //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
4163 //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
4164 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
4165 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
4167 //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
4173 IN PDM_ODM_T pDM_Odm,
4175 u1Byte initial_gain_psd
4178 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4179 //PADAPTER pAdapter;
4183 //2 Switch to CH11 to patch CH9 and CH13 DC tone
4184 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
4186 if(pDM_Odm->SupportICType== ODM_RTL8192D)
4188 if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
4190 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
4191 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
4192 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
4193 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
4194 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);
4195 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);
4199 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
4200 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
4201 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
4202 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);
4203 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);
4208 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
4209 PSD_report[50] = psd_report;
4210 //Ch13 DC tone patch
4211 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
4212 PSD_report[70] = psd_report;
4214 //2 Switch to CH3 to patch CH1 and CH5 DC tone
4215 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
4218 if(pDM_Odm->SupportICType==ODM_RTL8192D)
4220 if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
4222 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
4223 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
4224 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
4225 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
4226 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);
4227 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
4231 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
4232 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
4233 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
4234 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);
4235 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
4240 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
4241 PSD_report[10] = psd_report;
4243 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
4244 PSD_report[30] = psd_report;
4250 GoodChannelDecision(
4255 pu1Byte PSD_bitmap_memory)
4257 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
4258 //s4Byte TH1 = SSBT-0x15; // modify TH by Neil Chen
4259 s4Byte TH1= RSSI_BT+0x14;
4260 s4Byte TH2 = RSSI_BT+85;
4263 u1Byte bitmap, Smooth_size[3], Smooth_TH[3];
4265 u4Byte i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
4266 int start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
4268 // RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
4270 if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
4272 TH1 = RSSI_BT + 0x14;
4275 Smooth_size[0]=Smooth_Size_1;
4276 Smooth_size[1]=Smooth_Size_2;
4277 Smooth_size[2]=Smooth_Size_3;
4278 Smooth_TH[0]=Smooth_TH_1;
4279 Smooth_TH[1]=Smooth_TH_2;
4280 Smooth_TH[2]=Smooth_TH_3;
4281 Smooth_Interval[0]=16;
4282 Smooth_Interval[1]=15;
4283 Smooth_Interval[2]=13;
4285 if(pDM_Odm->SupportICType==ODM_RTL8723A)
4291 else if(RSSI_BT >=38) // >= -15dBm
4293 else if((RSSI_BT >=33)&(RSSI_BT <38))
4294 TH1 = 99+(RSSI_BT-33); //0x63
4295 else if((RSSI_BT >=26)&(RSSI_BT<33))
4296 TH1 = 99-(33-RSSI_BT)+2; //0x5e
4297 else if((RSSI_BT >=24)&(RSSI_BT<26))
4298 TH1 = 88-((RSSI_BT-24)*3); //0x58
4299 else if((RSSI_BT >=18)&(RSSI_BT<24))
4300 TH1 = 77+((RSSI_BT-18)*2);
4301 else if((RSSI_BT >=14)&(RSSI_BT<18))
4302 TH1 = 63+((RSSI_BT-14)*2);
4303 else if((RSSI_BT >=8)&(RSSI_BT<14))
4304 TH1 = 58+((RSSI_BT-8)*2);
4305 else if((RSSI_BT >=3)&(RSSI_BT<8))
4306 TH1 = 52+(RSSI_BT-3);
4311 for (i = 0; i< 10; i++)
4316 for (i=0; i<80; i++)
4317 pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
4322 if(pDM_Odm->SupportICType==ODM_RTL8723A)
4324 TH1 =TH1-SIR_STEP_SIZE;
4326 while (good_cnt < PSD_CHMIN)
4329 if(pDM_Odm->SupportICType==ODM_RTL8723A)
4333 if((TH1+SIR_STEP_SIZE) < TH2)
4334 TH1 += SIR_STEP_SIZE;
4340 if(TH1==(RSSI_BT+0x1E))
4342 if((TH1+2) < (RSSI_BT+0x1E))
4348 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
4350 for (i = 0; i< 80; i++)
4352 if((s4Byte)(PSD_report[i]) < TH1)
4355 bit_idx = i -8*byte_idx;
4356 bitmap = PSD_bitmap[byte_idx];
4357 PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
4362 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
4365 //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
4366 for (i = 0; i<8; i++)
4367 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
4371 //1 Start of smoothing function
4377 for(n=0; n<Smooth_Interval[j]; n++)
4379 good_cnt_smoothing = 0;
4380 cur_bit_idx = start_bit_idx;
4381 cur_byte_idx = start_byte_idx;
4382 for ( i=0; i < Smooth_size[j]; i++)
4384 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
4385 if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
4386 good_cnt_smoothing++;
4390 if( good_cnt_smoothing < Smooth_TH[j] )
4392 cur_bit_idx = start_bit_idx;
4393 cur_byte_idx = start_byte_idx;
4394 for ( i=0; i< Smooth_size[j] ; i++)
4396 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
4397 PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
4400 start_bit_idx = start_bit_idx + Smooth_Step_Size;
4401 while ( (start_bit_idx) > 7 )
4403 start_byte_idx= start_byte_idx+start_bit_idx/8;
4404 start_bit_idx = start_bit_idx%8;
4408 ODM_RT_TRACE( pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
4411 for (i = 0; i<8; i++)
4413 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
4415 if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1) //----- Add By Gary
4417 pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
4418 } // ------end by Gary
4426 for ( i = 0; i < 10; i++)
4428 for (n = 0; n < 8; n++)
4429 if((PSD_bitmap[i]& BIT(n)) != 0)
4432 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: good channel cnt = %u",good_cnt));
4435 //RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
4436 for (i = 0; i <10; i++)
4437 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
4439 //Update bitmap memory
4440 for(i = 0; i < 80; i++)
4443 bit_idx = i -8*byte_idx;
4444 psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
4445 bitmap = PSD_bitmap_memory[i];
4446 PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
4458 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4459 //PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
4461 unsigned int pts, start_point, stop_point;
4462 u1Byte initial_gain ;
4463 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
4464 static u1Byte psd_cnt=0;
4465 static u4Byte PSD_report[80], PSD_report_tmp;
4466 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
4467 u1Byte H2C_PSD_DATA[5]={0,0,0,0,0};
4468 static u1Byte H2C_PSD_DATA_last[5] ={0,0,0,0,0};
4469 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
4470 0,3,6,10,13,16,19,22,26,29};
4471 u1Byte n, i, channel, BBReset,tone_idx;
4472 u1Byte PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
4473 s4Byte PSD_skip_start, PSD_skip_stop;
4474 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
4475 u4Byte ReScan, Interval, Is40MHz;
4476 u8Byte curTxOkCnt, curRxOkCnt;
4477 int cur_byte_idx, cur_bit_idx;
4478 PADAPTER Adapter = pDM_Odm->Adapter;
4479 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
4481 if( (*(pDM_Odm->pbScanInProcess)) ||
4482 pDM_Odm->bLinkInProcess)
4484 if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
4486 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms
4492 if(pDM_Odm->bBtHsOperation)
4495 Interval = SCAN_INTERVAL;
4499 ReScan = PSD_RESCAN;
4500 Interval = SCAN_INTERVAL;
4504 if(init_memory == 0)
4506 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
4507 for(i = 0; i < 80; i++)
4508 PSD_bitmap_memory[i] = 0xFF; // channel is always good
4513 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
4514 for(i = 0; i < 80; i++)
4518 //1 Backup Current Settings
4519 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
4521 if(pDM_Odm->SupportICType==ODM_RTL8192D)
4523 //2 Record Current synthesizer parameters based on current channel
4524 if((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))
4526 SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);
4527 SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);
4528 SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);
4529 SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);
4530 SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);
4532 else // DualMAC_DualPHY 2G
4534 SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);
4535 SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);
4536 SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);
4537 SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);
4538 SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);
4542 //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
4543 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
4545 //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
4546 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
4549 if(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))
4554 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
4556 //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
4557 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
4560 //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
4561 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
4563 //Force RX to stop TX immediately
4564 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
4566 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
4568 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
4569 //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
4570 //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
4572 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
4573 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
4577 //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
4578 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
4581 //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
4582 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
4584 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
4585 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
4586 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess
4587 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
4588 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
4589 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
4591 //1 Leave RX idle low power
4592 //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
4594 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
4595 //1 Fix initial gain
4596 //if (IS_HARDWARE_TYPE_8723AE(Adapter))
4597 //RSSI_BT = pHalData->RSSI_BT;
4598 //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
4599 // RSSI_BT = RSSI_BT_new;
4601 if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
4602 RSSI_BT=pDM_Odm->RSSI_BT; //need to check C2H to pDM_Odm RSSI BT
4607 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
4609 if(pDM_Odm->SupportICType==ODM_RTL8723A)
4611 //Neil add--2011--10--12
4612 //2 Initial Gain index
4613 if(RSSI_BT >=35) // >= -15dBm
4614 initial_gain_psd = RSSI_BT*2;
4615 else if((RSSI_BT >=33)&(RSSI_BT<35))
4616 initial_gain_psd = RSSI_BT*2+6;
4617 else if((RSSI_BT >=24)&(RSSI_BT<33))
4618 initial_gain_psd = 70-(33-RSSI_BT);
4619 else if((RSSI_BT >=19)&(RSSI_BT<24))
4620 initial_gain_psd = 64-((24-RSSI_BT)*4);
4621 else if((RSSI_BT >=14)&(RSSI_BT<19))
4622 initial_gain_psd = 44-((18-RSSI_BT)*2);
4623 else if((RSSI_BT >=8)&(RSSI_BT<14))
4624 initial_gain_psd = 35-(14-RSSI_BT);
4626 initial_gain_psd = 0x1B;
4632 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
4637 //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
4638 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
4640 //initialGainUpper = 0x5E; //Modify by neil chen
4642 if(pDM_Odm->bUserAssignLevel)
4644 pDM_Odm->bUserAssignLevel = FALSE;
4645 initialGainUpper = 0x7f;
4649 initialGainUpper = 0x5E;
4653 if (initial_gain_psd < 0x1a)
4654 initial_gain_psd = 0x1a;
4655 if (initial_gain_psd > initialGainUpper)
4656 initial_gain_psd = initialGainUpper;
4659 //if(pDM_Odm->SupportICType==ODM_RTL8723A)
4660 SSBT = RSSI_BT * 2 +0x3E;
4663 //if(IS_HARDWARE_TYPE_8723AE(Adapter))
4664 // SSBT = RSSI_BT * 2 +0x3E;
4665 //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
4667 // RSSI_BT = initial_gain_psd;
4670 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
4671 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
4672 //DbgPrint("PSD: SSBT= %d", SSBT);
4674 //pMgntInfo->bDMInitialGainEnable = FALSE;
4675 pDM_Odm->bDMInitialGainEnable = FALSE;
4676 initial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);
4678 // make sure the initial gain is under the correct range.
4679 //initial_gain_psd &= 0x7f;
4680 ODM_Write_DIG(pDM_Odm, initial_gain_psd);
4682 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
4684 //pts value = 128, 256, 512, 1024
4689 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
4695 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
4701 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
4707 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
4713 //3 Skip WLAN channels if WLAN busy
4715 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
4716 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
4717 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
4718 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
4722 wlan_channel = CurrentChannel & 0x0f;
4724 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
4725 if(pDM_Odm->SupportICType==ODM_RTL8723A)
4727 if(pDM_Odm->bBtHsOperation)
4729 if(pDM_Odm->bLinked)
4733 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
4734 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
4738 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
4739 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
4745 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
4746 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
4748 if(PSD_skip_start < 0)
4750 if(PSD_skip_stop >80)
4755 if((curRxOkCnt+curTxOkCnt) > 5)
4759 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
4760 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
4764 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
4765 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
4768 if(PSD_skip_start < 0)
4770 if(PSD_skip_stop >80)
4778 if((curRxOkCnt+curTxOkCnt) > 1000)
4780 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
4781 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
4784 #endif //Reove RXHP Issue
4785 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
4791 channel = (n/20)*4 + 1;
4793 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
4796 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
4798 PSD_report[n] = SSBT;
4799 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
4803 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
4805 if ( PSD_report_tmp > PSD_report[n])
4806 PSD_report[n] = PSD_report_tmp;
4811 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
4816 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
4817 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
4819 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
4823 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
4825 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
4826 //1 Restore Current Settings
4828 pDM_Odm->bDMInitialGainEnable = TRUE;
4830 ODM_Write_DIG(pDM_Odm, initial_gain);
4832 // restore originl center frequency
4833 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
4836 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
4837 //Restore RX idle low power
4838 if(RxIdleLowPwr == TRUE)
4839 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
4842 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
4843 if (psd_cnt < ReScan)
4844 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);
4849 //DbgPrint("psd_report[%d]= %d \n", 2402+i, PSD_report[i]);
4850 RT_TRACE( COMP_PSD, DBG_LOUD,("psd_report[%d]= %d \n", 2402+i, PSD_report[i]));
4853 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
4855 if(pDM_Odm->SupportICType==ODM_RTL8723A)
4860 //2 Restore H2C PSD Data to Last Data
4861 H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
4862 H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
4863 H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
4864 H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
4865 H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
4868 //2 Translate 80bit channel map to 40bit channel
4873 cur_byte_idx = i*2 + n/4;
4874 cur_bit_idx = (n%4)*2;
4875 if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
4876 H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
4878 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
4881 //3 To Compare the difference
4884 if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
4886 FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
4887 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("Need to Update the AFH Map \n"));
4893 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Not need to Update\n"));
4896 if(pDM_Odm->bBtHsOperation)
4898 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);
4899 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
4903 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);
4904 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
4910 //Neil for Get BT RSSI
4911 // Be Triggered by BT C2H CMD
4924 IN PDM_ODM_T pDM_Odm
4927 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4929 //if(IS_HARDWARE_TYPE_8723AE(Adapter))
4931 if(pDM_Odm->SupportICType == ODM_RTL8723A) //may need to add other IC type
4933 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
4935 if(!pDM_Odm->bBtEnabled) //need to check upper layer connection
4937 pDM_Odm->bPSDactive=FALSE;
4938 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
4942 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
4944 pDM_Odm->bPSDinProcess = TRUE;
4945 pDM_Odm->bPSDactive=TRUE;
4946 odm_PSD_Monitor(pDM_Odm);
4947 pDM_Odm->bPSDinProcess = FALSE;
4953 odm_PSDMonitorCallback(
4957 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
4958 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4960 PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
4964 odm_PSDMonitorWorkItemCallback(
4968 PADAPTER Adapter = (PADAPTER)pContext;
4969 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4970 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
4972 ODM_PSDMonitor(pDM_Odm);
4975 //Remove by Yuchen (seperate to odm_DIG.c)
4977 //cosa debug tool need to modify
4981 IN PADAPTER Adapter,
4986 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
4987 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4988 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
4990 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
4993 pDM_Odm->RSSI_BT = (u1Byte)btRssi;
4994 pDM_Odm->bUserAssignLevel = TRUE;
4995 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms
4999 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
5005 //#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
5008 IN PDM_ODM_T pDM_Odm)
5010 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
5011 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
5014 pRX_HP_Table->RXHP_enable = TRUE;
5015 pRX_HP_Table->RXHP_flag = 0;
5016 pRX_HP_Table->PSD_func_trigger = 0;
5017 pRX_HP_Table->Pre_IGI = 0x20;
5018 pRX_HP_Table->Cur_IGI = 0x20;
5019 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
5020 pRX_HP_Table->Pre_pw_th = pw_th_10dB;
5021 for(index=0; index<80; index++)
5022 pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
5024 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
5025 pRX_HP_Table->TP_Mode = Idle_Mode;
5031 IN PDM_ODM_T pDM_Odm)
5033 #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
5034 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
5035 PADAPTER Adapter = pDM_Odm->Adapter;
5036 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
5037 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
5038 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
5039 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
5043 s1Byte Intf_diff_idx, MIN_Intf_diff_idx = 16;
5045 u1Byte ch_map_intf_5M[17] = {0};
5046 static u4Byte FA_TH = 0;
5047 static u1Byte psd_intf_flag = 0;
5048 static s4Byte curRssi = 0;
5049 static s4Byte preRssi = 0;
5050 static u1Byte PSDTriggerCnt = 1;
5052 u1Byte RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31); // for debug!!
5054 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
5055 static s8Byte lastTxOkCnt = 0, lastRxOkCnt = 0;
5056 s8Byte curTxOkCnt, curRxOkCnt;
5058 s8Byte TP_Acc3, TP_Acc5;
5059 static s8Byte TP_Buff[5] = {0};
5060 static u1Byte pre_state = 0, pre_state_flag = 0;
5061 static u1Byte Intf_HighTP_flag = 0, De_counter = 16;
5062 static u1Byte TP_Degrade_flag = 0;
5064 static u1Byte LatchCnt = 0;
5066 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))
5068 //AGC RX High Power Mode is only applied on 2G band in 92D!!!
5069 if(pDM_Odm->SupportICType == ODM_RTL8192D)
5071 if(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
5075 if(!(pDM_Odm->SupportAbility==ODM_BB_RXHP))
5080 if(RX_HP_enable == 1)
5081 pRX_HP_Table->RXHP_enable = FALSE;
5083 pRX_HP_Table->RXHP_enable = TRUE;
5085 if(pRX_HP_Table->RXHP_enable == FALSE)
5087 if(pRX_HP_Table->RXHP_flag == 1)
5089 pRX_HP_Table->RXHP_flag = 0;
5095 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
5096 //2 Record current TP for USB interface
5097 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
5098 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
5099 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
5100 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
5102 curTPOkCnt = curTxOkCnt+curRxOkCnt;
5103 TP_Buff[0] = curTPOkCnt; // current TP
5104 TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
5105 TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
5108 pRX_HP_Table->TP_Mode = Idle_Mode;
5109 else if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
5110 pRX_HP_Table->TP_Mode = Low_TP_Mode;
5112 pRX_HP_Table->TP_Mode = High_TP_Mode;
5114 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
5115 // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
5116 // When LatchCnt = 0, we would Get PSD result.
5117 if(TP_Degrade_flag == 1)
5122 TP_Degrade_flag = 0;
5125 // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
5126 // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
5127 if(Intf_HighTP_flag == 1)
5132 Intf_HighTP_flag = 0;
5138 //2 AGC RX High Power Mode by PSD only applied to STA Mode
5139 //3 NOT applied 1. Ad Hoc Mode.
5140 //3 NOT applied 2. AP Mode
5141 if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
5143 Is40MHz = *(pDM_Odm->pBandWidth);
5144 curRssi = pDM_Odm->RSSI_Min;
5145 cur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
5146 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
5147 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
5148 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
5149 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
5150 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
5151 //2 PSD function would be triggered
5152 //3 1. Every 4 sec for PCIE
5153 //3 2. Before TP Mode (Idle TP<4kbps) for USB
5154 //3 3. After TP Mode (High TP) for USB
5155 if((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0)) // Only RSSI>TH and RX_HP_flag=0 will Do PSD process
5157 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
5158 //2 Before TP Mode ==> PSD would be trigger every 4 sec
5159 if(pRX_HP_Table->TP_Mode == Idle_Mode) //2.1 less wlan traffic <4kbps
5162 if(PSDTriggerCnt == 1)
5164 odm_PSD_RXHP(pDM_Odm);
5165 pRX_HP_Table->PSD_func_trigger = 1;
5172 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
5174 //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
5175 if(pRX_HP_Table->TP_Mode == High_TP_Mode)
5177 if((pre_state_flag == 0)&&(LatchCnt == 0))
5180 if((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
5183 if(pre_state == 3) // hit pre_state condition => consecutive 3 times
5195 //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
5196 if(pre_state_flag == 1)
5198 if(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3)) // degrade 20%
5200 odm_PSD_RXHP(pDM_Odm);
5201 pRX_HP_Table->PSD_func_trigger = 1;
5202 TP_Degrade_flag = 1;
5206 else if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
5208 odm_PSD_RXHP(pDM_Odm);
5209 pRX_HP_Table->PSD_func_trigger = 1;
5210 TP_Degrade_flag = 1;
5214 else if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
5216 odm_PSD_RXHP(pDM_Odm);
5217 pRX_HP_Table->PSD_func_trigger = 1;
5218 TP_Degrade_flag = 1;
5227 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
5230 TP_Buff[4-i] = TP_Buff[3-i];
5233 //2 Update PSD bitmap according to PSD report
5234 if((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
5236 //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
5237 for (i = 0 ; i < 16 ; i++)
5240 for(j = 0; j < 5 ; j++)
5241 sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
5245 ch_map_intf_5M[i] = 1; // interference flag
5248 //=============just for debug=========================
5250 //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
5251 //===============================================
5252 //2 Mask target channel 5M index
5253 for(i = 0; i < (4+4*Is40MHz) ; i++)
5255 ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;
5259 for(i = 0; i < 16; i++)
5261 if(ch_map_intf_5M[i] == 1)
5263 psd_intf_flag = 1; // interference is detected!!!
5268 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
5269 if(pRX_HP_Table->TP_Mode!=Idle_Mode)
5271 if(psd_intf_flag == 1) // to avoid psd_intf_flag always 1
5273 Intf_HighTP_flag = 1;
5274 De_counter = 32; // 0x1E -> 0x3E needs 32 times by each IGI step =1
5278 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
5279 //2 Distance between target channel and interference
5280 for(i = 0; i < 16; i++)
5282 if(ch_map_intf_5M[i] == 1)
5284 Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));
5285 if(Intf_diff_idx < MIN_Intf_diff_idx)
5286 MIN_Intf_diff_idx = Intf_diff_idx; // the min difference index between interference and target
5289 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx));
5290 //2 Choose False Alarm Threshold
5291 switch (MIN_Intf_diff_idx){
5296 FA_TH = FA_RXHP_TH1;
5300 FA_TH = FA_RXHP_TH2;
5304 FA_TH = FA_RXHP_TH3;
5308 FA_TH = FA_RXHP_TH4;
5316 FA_TH = FA_RXHP_TH5;
5319 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
5320 pRX_HP_Table->PSD_func_trigger = 0;
5322 //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
5323 if(pRX_HP_Table->RXHP_flag == 1)
5325 if ((curRssi > 80)&&(preRssi < 80))
5327 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
5329 else if ((curRssi < 80)&&(preRssi > 80))
5331 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
5333 else if ((curRssi > 72)&&(preRssi < 72))
5335 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
5337 else if ((curRssi < 72)&&( preRssi > 72))
5339 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
5341 else if (curRssi < 68) //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
5343 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
5344 pRX_HP_Table->RXHP_flag = 0; // Back to Normal DIG Mode
5348 else // pRX_HP_Table->RXHP_flag == 0
5350 //1 Decide whether to enter AGC RX High Power Mode
5351 if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&
5352 (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
5356 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
5358 else if (curRssi > 72)
5360 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
5364 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
5366 pRX_HP_Table->Cur_pw_th = pw_th_16dB; //RegC54[9:8]=2'b11: to enter AGC Flow 3
5367 pRX_HP_Table->First_time_enter = TRUE;
5368 pRX_HP_Table->RXHP_flag = 1; // RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
5372 odm_Write_RXHP(pDM_Odm);
5374 #endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
5375 #endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
5378 void odm_Write_RXHP(
5379 IN PDM_ODM_T pDM_Odm)
5381 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
5384 if(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
5386 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
5387 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
5390 if(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
5392 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th); // RegC54[9:8]=2'b11: AGC Flow 3
5395 if(pRX_HP_Table->RXHP_flag == 0)
5397 pRX_HP_Table->Cur_IGI = 0x20;
5401 currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
5404 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
5405 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
5408 pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
5409 pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
5415 IN PDM_ODM_T pDM_Odm
5418 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
5419 PADAPTER Adapter = pDM_Odm->Adapter;
5420 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
5421 unsigned int pts, start_point, stop_point, initial_gain ;
5422 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
5423 static u1Byte psd_cnt=0;
5424 static u4Byte PSD_report[80], PSD_report_tmp;
5425 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
5426 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
5427 0,3,6,10,13,16,19,22,26,29};
5428 u1Byte n, i, channel, BBReset,tone_idx;
5429 u1Byte PSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
5430 s4Byte PSD_skip_start, PSD_skip_stop;
5431 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
5432 u4Byte ReScan, Interval, Is40MHz;
5433 u8Byte curTxOkCnt, curRxOkCnt;
5434 //--------------2G band synthesizer for 92D switch RF channel using-----------------
5436 u4Byte SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
5437 u4Byte SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C}; // synthesizer RF register for 2G channel
5438 u4Byte SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}, // For CH1,2,4,9,10.11.12 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
5439 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840}, // For CH3,13,14
5440 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}}; // For Ch5,6,7,8
5441 //--------------------- Add by Gary for Debug setting ----------------------
5442 u1Byte RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
5443 u1Byte rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
5444 //---------------------------------------------------------------------
5446 if(pMgntInfo->bScanInProgress)
5451 ReScan = PSD_RESCAN;
5452 Interval = SCAN_INTERVAL;
5456 if(init_memory == 0)
5458 RT_TRACE( COMP_PSD, DBG_LOUD,("Init memory\n"));
5459 for(i = 0; i < 80; i++)
5460 PSD_bitmap_memory[i] = 0xFF; // channel is always good
5465 RT_TRACE(COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
5466 for(i = 0; i < 80; i++)
5470 //1 Backup Current Settings
5471 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
5472 if(pDM_Odm->SupportICType == ODM_RTL8192D)
5474 //2 Record Current synthesizer parameters based on current channel
5475 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
5477 SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);
5478 SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);
5479 SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);
5480 SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);
5481 SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);
5483 else // DualMAC_DualPHY 2G
5485 SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);
5486 SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);
5487 SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);
5488 SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);
5489 SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);
5492 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
5493 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
5494 Is40MHz = *(pDM_Odm->pBandWidth);
5495 ODM_RT_TRACE(pDM_Odm, COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
5497 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
5500 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
5501 //Force RX to stop TX immediately
5502 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
5504 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
5505 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
5506 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
5508 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
5510 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess
5511 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
5512 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
5513 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
5514 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
5515 //1 Leave RX idle low power
5516 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
5517 //1 Fix initial gain
5518 RSSI_BT = RSSI_BT_new;
5519 RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
5521 if(rssi_ctrl == 1) // just for debug!!
5522 initial_gain_psd = RSSI_BT_new;
5524 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
5526 RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
5528 initialGainUpper = 0x54;
5530 RSSI_BT = initial_gain_psd;
5533 //RT_TRACE( COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
5534 RT_TRACE( COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
5536 pDM_Odm->bDMInitialGainEnable = FALSE;
5537 initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
5538 //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd);
5539 ODM_Write_DIG(pDM_Odm, initial_gain_psd);
5541 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
5543 //pts value = 128, 256, 512, 1024
5548 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
5554 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
5560 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
5566 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
5572 //3 Skip WLAN channels if WLAN busy
5573 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
5574 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
5575 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
5576 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
5580 wlan_channel = CurrentChannel & 0x0f;
5582 RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
5584 if((curRxOkCnt+curTxOkCnt) > 1000)
5586 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
5587 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
5590 RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
5596 channel = (n/20)*4 + 1;
5597 if(pDM_Odm->SupportICType == ODM_RTL8192D)
5612 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
5614 for(i = 0; i < SYN_Length; i++)
5615 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
5617 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
5618 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
5620 else // DualMAC_DualPHY 2G
5622 for(i = 0; i < SYN_Length; i++)
5623 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
5625 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
5629 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
5632 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
5634 PSD_report[n] = initial_gain_psd;//SSBT;
5635 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
5639 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
5641 if ( PSD_report_tmp > PSD_report[n])
5642 PSD_report[n] = PSD_report_tmp;
5647 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
5652 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
5653 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
5655 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
5658 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
5660 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
5661 //1 Restore Current Settings
5663 pDM_Odm->bDMInitialGainEnable= TRUE;
5664 //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
5665 ODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);
5666 // restore originl center frequency
5667 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
5668 if(pDM_Odm->SupportICType == ODM_RTL8192D)
5670 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
5672 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
5673 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
5674 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
5675 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
5676 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
5677 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
5679 else // DualMAC_DualPHY
5681 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
5682 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
5683 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
5684 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
5685 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
5689 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
5690 //Restore RX idle low power
5691 if(RxIdleLowPwr == TRUE)
5692 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
5695 //gPrint("psd cnt=%d\n", psd_cnt);
5696 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
5697 if (psd_cnt < ReScan)
5699 ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval); //ms
5705 RT_TRACE( COMP_PSD, DBG_LOUD,("psd_report[%d]= %d \n", 2402+i, PSD_report[i]));
5706 //DbgPrint("psd_report[%d]= %d \n", 2402+i, PSD_report[i]);
5708 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
5714 odm_PSD_RXHPCallback(
5718 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
5719 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5720 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
5721 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
5723 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
5725 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
5727 odm_PSD_RXHP(pDM_Odm);
5730 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
5736 odm_PSD_RXHPWorkitemCallback(
5740 PADAPTER pAdapter = (PADAPTER)pContext;
5741 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
5742 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
5744 odm_PSD_RXHP(pDM_Odm);
5747 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5749 //Remove PathDiversity related function to odm_PathDiv.c
5751 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
5754 odm_PHY_SaveAFERegisters(
5755 IN PDM_ODM_T pDM_Odm,
5757 IN pu4Byte AFEBackup,
5758 IN u4Byte RegisterNum
5763 //RT_DISP(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
5764 for( i = 0 ; i < RegisterNum ; i++){
5765 AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);
5770 odm_PHY_ReloadAFERegisters(
5771 IN PDM_ODM_T pDM_Odm,
5773 IN pu4Byte AFEBackup,
5774 IN u4Byte RegiesterNum
5779 //RT_DISP(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
5780 for(i = 0 ; i < RegiesterNum; i++)
5783 ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);
5789 // Set Single/Dual Antenna default setting for products that do not do detection in advance.
5791 // Added by Joseph, 2012.03.22
5794 ODM_SingleDualAntennaDefaultSetting(
5795 IN PDM_ODM_T pDM_Odm
5798 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5799 PADAPTER pAdapter = pDM_Odm->Adapter;
5800 u1Byte btAntNum = 2;
5801 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
5802 btAntNum=BT_GetPgAntNum(pAdapter);
5803 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
5804 #ifdef CONFIG_BT_COEXIST
5805 btAntNum = hal_btcoex_GetPgAntNum(pAdapter);
5809 // Set default antenna A and B status
5812 pDM_SWAT_Table->ANTA_ON=TRUE;
5813 pDM_SWAT_Table->ANTB_ON=TRUE;
5814 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Dual antenna\n"));
5816 #ifdef CONFIG_BT_COEXIST
5817 else if(btAntNum == 1)
5818 {// Set antenna A as default
5819 pDM_SWAT_Table->ANTA_ON=TRUE;
5820 pDM_SWAT_Table->ANTB_ON=FALSE;
5821 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Single antenna\n"));
5825 //RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));
5832 //2 8723A ANT DETECT
5835 // Implement IQK single tone for RF DPK loopback and BB PSD scanning.
5836 // This function is cooperated with BB team Neil.
5838 // Added by Roger, 2011.12.15
5841 ODM_SingleDualAntennaDetection(
5842 IN PDM_ODM_T pDM_Odm,
5846 PADAPTER pAdapter = pDM_Odm->Adapter;
5847 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5848 u4Byte CurrentChannel,RfLoopReg;
5850 u4Byte Reg88c, Regc08, Reg874, Regc50, Reg948=0, Regb2c=0, Reg92c=0, AFE_rRx_Wait_CCA=0;
5851 u1Byte initial_gain = 0x5a;
5852 u4Byte PSD_report_tmp;
5853 u4Byte AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0;
5854 BOOLEAN bResult = TRUE;
5855 u4Byte AFE_Backup[16];
5856 u4Byte AFE_REG_8723A[16] = {
5857 rRx_Wait_CCA, rTx_CCK_RFON,
5858 rTx_CCK_BBON, rTx_OFDM_RFON,
5859 rTx_OFDM_BBON, rTx_To_Rx,
5861 rRx_OFDM, rRx_Wait_RIFS,
5862 rRx_TO_Rx, rStandby,
5863 rSleep, rPMPD_ANAEN,
5864 rFPGA0_XCD_SwitchControl, rBlue_Tooth};
5866 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============> \n"));
5869 if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8723B)))
5872 // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
5873 if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))
5876 if(pDM_Odm->SupportICType == ODM_RTL8192C)
5878 //Which path in ADC/DAC is turnned on for PSD: both I/Q
5879 ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);
5880 //Ageraged number: 8
5881 ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);
5883 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
5886 //1 Backup Current RF/BB Settings
5888 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
5889 RfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
5890 if(!(pDM_Odm->SupportICType == ODM_RTL8723B))
5891 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); // change to Antenna A
5892 #if (RTL8723B_SUPPORT == 1)
5895 Reg92c = ODM_GetBBReg(pDM_Odm, 0x92c, bMaskDWord);
5896 Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);
5897 Regb2c = ODM_GetBBReg(pDM_Odm, AGC_table_select, bMaskDWord);
5898 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);
5899 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
5900 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3ff, 0x000);
5901 ODM_SetBBReg(pDM_Odm, AGC_table_select, BIT31, 0x0);
5904 ODM_StallExecution(10);
5906 //Store A Path Register 88c, c08, 874, c50
5907 Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);
5908 Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);
5909 Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);
5910 Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);
5912 // Store AFE Registers
5913 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
5914 odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
5915 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
5916 AFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);
5919 ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0); //128 pts
5922 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401); //Channel 1
5925 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
5927 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);
5928 ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);
5929 ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);
5930 ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);
5931 ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);
5932 ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);
5933 ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);
5934 ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);
5935 ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);
5936 ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);
5937 ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);
5938 ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);
5939 ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);
5940 ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);
5941 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);
5942 ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);
5944 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
5946 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);
5950 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);
5953 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);
5954 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);
5956 //IQK setting tone@ 4.34Mhz
5957 ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);
5958 ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);
5961 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);
5962 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);
5963 ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);
5964 ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
5965 ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);
5966 ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);
5967 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);
5970 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
5971 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);
5973 //IQK Single tone start
5974 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
5975 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
5976 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
5978 ODM_StallExecution(10000);
5980 // PSD report of antenna A
5984 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
5985 if(PSD_report_tmp >AntA_report)
5986 AntA_report=PSD_report_tmp;
5989 // change to Antenna B
5990 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
5991 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_B);
5992 #if (RTL8723B_SUPPORT == 1)
5993 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
5994 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);
5997 ODM_StallExecution(10);
5999 // PSD report of antenna B
6003 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
6004 if(PSD_report_tmp > AntB_report)
6005 AntB_report=PSD_report_tmp;
6008 // change to open case
6009 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
6010 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, 0); // change to Antenna A
6011 #if (RTL8723B_SUPPORT == 1)
6012 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
6013 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x0);
6016 ODM_StallExecution(10);
6018 // PSD report of open case
6022 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
6023 if(PSD_report_tmp > AntO_report)
6024 AntO_report=PSD_report_tmp;
6027 //Close IQK Single Tone function
6028 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
6030 //1 Return to antanna A
6031 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
6032 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); // change to Antenna A
6033 #if (RTL8723B_SUPPORT == 1)
6034 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
6037 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);
6040 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);
6041 ODM_SetBBReg(pDM_Odm, AGC_table_select, bMaskDWord, Regb2c);
6044 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);
6045 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);
6046 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);
6047 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);
6048 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);
6049 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);
6050 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);
6052 //Reload AFE Registers
6053 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
6054 odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
6055 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
6056 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);
6058 if(pDM_Odm->SupportICType == ODM_RTL8723A)
6060 //2 Test Ant B based on Ant A is ON
6063 if(AntA_report >= 100)
6065 if(AntB_report > (AntA_report+1))
6067 pDM_SWAT_Table->ANTB_ON=FALSE;
6068 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
6072 pDM_SWAT_Table->ANTB_ON=TRUE;
6073 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));
6078 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
6079 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
6083 //2 Test Ant A and B based on DPDT Open
6084 else if(mode==ANTTESTALL)
6086 if((AntO_report >=100) && (AntO_report <=118))
6088 if(AntA_report > (AntO_report+1))
6090 pDM_SWAT_Table->ANTA_ON=FALSE;
6091 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF\n"));
6095 pDM_SWAT_Table->ANTA_ON=TRUE;
6096 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON\n"));
6099 if(AntB_report > (AntO_report+2))
6101 pDM_SWAT_Table->ANTB_ON=FALSE;
6102 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF\n"));
6106 pDM_SWAT_Table->ANTB_ON=TRUE;
6107 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON\n"));
6110 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));
6111 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));
6112 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
6114 pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
6115 pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
6116 pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
6117 pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
6122 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
6127 else if(pDM_Odm->SupportICType == ODM_RTL8192C)
6129 if(AntA_report >= 100)
6131 if(AntB_report > (AntA_report+2))
6133 pDM_SWAT_Table->ANTA_ON=FALSE;
6134 pDM_SWAT_Table->ANTB_ON=TRUE;
6135 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);
6136 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));
6138 else if(AntA_report > (AntB_report+2))
6140 pDM_SWAT_Table->ANTA_ON=TRUE;
6141 pDM_SWAT_Table->ANTB_ON=FALSE;
6142 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
6143 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
6147 pDM_SWAT_Table->ANTA_ON=TRUE;
6148 pDM_SWAT_Table->ANTB_ON=TRUE;
6149 RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna \n"));
6154 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
6155 pDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default
6156 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
6160 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
6162 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));
6163 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));
6164 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
6166 //2 Test Ant B based on Ant A is ON
6169 if(AntA_report >=100 && AntA_report <= 116)
6171 if(AntB_report >= (AntA_report+4) && AntB_report > 116)
6173 pDM_SWAT_Table->ANTB_ON=FALSE;
6174 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
6176 else if(AntB_report >=100 && AntB_report <= 116)
6178 pDM_SWAT_Table->ANTB_ON=TRUE;
6179 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));
6183 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
6184 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
6190 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
6191 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
6195 //2 Test Ant A and B based on DPDT Open
6196 else if(mode==ANTTESTALL)
6198 if((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 120) && (AntB_report <= 120))
6200 if((AntA_report - AntB_report < 2) || (AntB_report - AntA_report < 2))
6202 pDM_SWAT_Table->ANTA_ON=TRUE;
6203 pDM_SWAT_Table->ANTB_ON=TRUE;
6204 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));
6206 else if(((AntA_report - AntB_report >= 2) && (AntA_report - AntB_report <= 4)) ||
6207 ((AntB_report - AntA_report >= 2) && (AntB_report - AntA_report <= 4)))
6209 pDM_SWAT_Table->ANTA_ON=FALSE;
6210 pDM_SWAT_Table->ANTB_ON=FALSE;
6212 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
6216 pDM_SWAT_Table->ANTA_ON = TRUE;
6217 pDM_SWAT_Table->ANTB_ON=FALSE;
6218 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
6221 pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
6222 pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
6223 pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
6224 pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
6229 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
6240 #endif // end odm_CE
6242 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
6245 odm_Set_RA_DM_ARFB_by_Noisy(
6246 IN PDM_ODM_T pDM_Odm
6249 //DbgPrint("DM_ARFB ====> \n");
6250 if (pDM_Odm->bNoisyState){
6251 ODM_Write4Byte(pDM_Odm,0x430,0x00000000);
6252 ODM_Write4Byte(pDM_Odm,0x434,0x05040200);
6253 //DbgPrint("DM_ARFB ====> Noisy State\n");
6256 ODM_Write4Byte(pDM_Odm,0x430,0x02010000);
6257 ODM_Write4Byte(pDM_Odm,0x434,0x07050403);
6258 //DbgPrint("DM_ARFB ====> Clean State\n");
6264 ODM_UpdateNoisyState(
6265 IN PDM_ODM_T pDM_Odm,
6266 IN BOOLEAN bNoisyStateFromC2H
6269 //DbgPrint("Get C2H Command! NoisyState=0x%x\n ", bNoisyStateFromC2H);
6270 if(pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 ||
6271 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)
6273 pDM_Odm->bNoisyState = bNoisyStateFromC2H;
6275 odm_Set_RA_DM_ARFB_by_Noisy(pDM_Odm);
6279 Set_RA_DM_Ratrbitmap_by_Noisy(
6280 IN PDM_ODM_T pDM_Odm,
6281 IN WIRELESS_MODE WirelessMode,
6282 IN u4Byte ratr_bitmap,
6283 IN u1Byte rssi_level
6286 u4Byte ret_bitmap = ratr_bitmap;
6287 switch (WirelessMode)
6289 case WIRELESS_MODE_AC_24G :
6290 case WIRELESS_MODE_AC_5G :
6291 case WIRELESS_MODE_AC_ONLY:
6292 if (pDM_Odm->bNoisyState){ // in Noisy State
6294 ret_bitmap&=0xfe3f0e08;
6295 else if (rssi_level==2)
6296 ret_bitmap&=0xff3f8f8c;
6297 else if (rssi_level==3)
6298 ret_bitmap&=0xffffffcc ;
6300 ret_bitmap&=0xffffffff ;
6302 else{ // in SNR State
6304 ret_bitmap&=0xfc3e0c08;
6306 else if (rssi_level==2){
6307 ret_bitmap&=0xfe3f0e08;
6309 else if (rssi_level==3){
6310 ret_bitmap&=0xffbfefcc;
6313 ret_bitmap&=0x0fffffff;
6317 case WIRELESS_MODE_B:
6318 case WIRELESS_MODE_A:
6319 case WIRELESS_MODE_G:
6320 case WIRELESS_MODE_N_24G:
6321 case WIRELESS_MODE_N_5G:
6322 if (pDM_Odm->bNoisyState){
6324 ret_bitmap&=0x0f0e0c08;
6325 else if (rssi_level==2)
6326 ret_bitmap&=0x0f8f0e0c;
6327 else if (rssi_level==3)
6328 ret_bitmap&=0x0fefefcc ;
6330 ret_bitmap&=0xffffffff ;
6334 ret_bitmap&=0x0f8f0e08;
6336 else if (rssi_level==2){
6337 ret_bitmap&=0x0fcf8f8c;
6339 else if (rssi_level==3){
6340 ret_bitmap&=0x0fffffcc;
6343 ret_bitmap&=0x0fffffff;
6350 //DbgPrint("DM_RAMask ====> rssi_LV = %d, BITMAP = %x \n", rssi_level, ret_bitmap);
6359 IN PDM_ODM_T pDM_Odm,
6365 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Get C2H Command! Rate=0x%x\n", Rate));
6367 if(pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 ||
6368 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)
6370 pDM_Odm->TxRate = Rate;
6371 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6372 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
6374 PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);
6376 if(pDM_Odm->SupportICType == ODM_RTL8821)
6378 ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
6380 else if(pDM_Odm->SupportICType == ODM_RTL8812)
6382 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++)
6384 ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);
6387 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
6389 ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
6391 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
6393 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++)
6395 ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);
6398 else if(pDM_Odm->SupportICType == ODM_RTL8188E)
6400 ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
6404 PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);
6412 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6414 ODM_UpdateInitRateWorkItemCallback(
6418 PADAPTER Adapter = (PADAPTER)pContext;
6419 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6420 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
6424 if(pDM_Odm->SupportICType == ODM_RTL8821)
6426 ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
6428 else if(pDM_Odm->SupportICType == ODM_RTL8812)
6430 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++) //DOn't know how to include &c
6432 ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);
6435 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
6437 ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
6439 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
6441 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++) //DOn't know how to include &c
6443 ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);
6446 else if(pDM_Odm->SupportICType == ODM_RTL8188E)
6448 ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
6454 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
6455 /* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */
6456 void odm_dtc(PDM_ODM_T pDM_Odm)
6458 #ifdef CONFIG_DM_RESP_TXAGC
6459 #define DTC_BASE 35 /* RSSI higher than this value, start to decade TX power */
6460 #define DTC_DWN_BASE (DTC_BASE-5) /* RSSI lower than this value, start to increase TX power */
6462 /* RSSI vs TX power step mapping: decade TX power */
6463 static const u8 dtc_table_down[]={
6472 /* RSSI vs TX power step mapping: increase TX power */
6473 static const u8 dtc_table_up[]={
6493 /* As DIG is disabled, DTC is also disable */
6494 if(!(pDM_Odm->SupportAbility & ODM_XXXXXX))
6498 if (DTC_BASE < pDM_Odm->RSSI_Min) {
6499 /* need to decade the CTS TX power */
6501 for (i=0;i<ARRAY_SIZE(dtc_table_down);i++)
6503 if ((dtc_table_down[i] >= pDM_Odm->RSSI_Min) || (dtc_steps >= 6))
6510 else if (DTC_DWN_BASE > pDM_Odm->RSSI_Min)
6512 /* needs to increase the CTS TX power */
6515 for (i=0;i<ARRAY_SIZE(dtc_table_up);i++)
6517 if ((dtc_table_up[i] <= pDM_Odm->RSSI_Min) || (dtc_steps>=10))
6530 resp_txagc = dtc_steps | (sign << 4);
6531 resp_txagc = resp_txagc | (resp_txagc << 5);
6532 ODM_Write1Byte(pDM_Odm, 0x06d9, resp_txagc);
6534 DBG_871X("%s RSSI_Min:%u, set RESP_TXAGC to %s %u\n",
6535 __func__, pDM_Odm->RSSI_Min, sign?"minus":"plus", dtc_steps);
6536 #endif /* CONFIG_RESP_TXAGC_ADJUST */
6539 #endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */