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 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
40 static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] =
41 // UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU MARVELL 92U_AP SELF_AP(DownLink/Tx)
42 { 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
45 static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] =
46 // UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP(UpLink/Rx)
47 { 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
49 static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
50 // UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MERU, MARVELL 92U_AP SELF_AP
51 { 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
54 //============================================================
55 // EDCA Paramter for AP/ADSL by Mingzhi 2011-11-22
56 //============================================================
57 #elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)
58 enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };
60 static const struct ParaRecord rtl_ap_EDCA[] =
62 //ACM,AIFSN, ECWmin, ECWmax, TXOplimit
63 {0, 7, 4, 10, 0}, //BK
65 {0, 1, 3, 4, 188}, //VI
66 {0, 1, 2, 3, 102}, //VO
67 {0, 1, 3, 4, 94}, //VI_AG
68 {0, 1, 2, 3, 47}, //VO_AG
71 static const struct ParaRecord rtl_sta_EDCA[] =
73 //ACM,AIFSN, ECWmin, ECWmax, TXOplimit
83 //============================================================
85 //============================================================
87 u4Byte OFDMSwingTable[OFDM_TABLE_SIZE] = {
88 0x7f8001fe, // 0, +6.0dB
89 0x788001e2, // 1, +5.5dB
90 0x71c001c7, // 2, +5.0dB
91 0x6b8001ae, // 3, +4.5dB
92 0x65400195, // 4, +4.0dB
93 0x5fc0017f, // 5, +3.5dB
94 0x5a400169, // 6, +3.0dB
95 0x55400155, // 7, +2.5dB
96 0x50800142, // 8, +2.0dB
97 0x4c000130, // 9, +1.5dB
98 0x47c0011f, // 10, +1.0dB
99 0x43c0010f, // 11, +0.5dB
100 0x40000100, // 12, +0dB
101 0x3c8000f2, // 13, -0.5dB
102 0x390000e4, // 14, -1.0dB
103 0x35c000d7, // 15, -1.5dB
104 0x32c000cb, // 16, -2.0dB
105 0x300000c0, // 17, -2.5dB
106 0x2d4000b5, // 18, -3.0dB
107 0x2ac000ab, // 19, -3.5dB
108 0x288000a2, // 20, -4.0dB
109 0x26000098, // 21, -4.5dB
110 0x24000090, // 22, -5.0dB
111 0x22000088, // 23, -5.5dB
112 0x20000080, // 24, -6.0dB
113 0x1e400079, // 25, -6.5dB
114 0x1c800072, // 26, -7.0dB
115 0x1b00006c, // 27. -7.5dB
116 0x19800066, // 28, -8.0dB
117 0x18000060, // 29, -8.5dB
118 0x16c0005b, // 30, -9.0dB
119 0x15800056, // 31, -9.5dB
120 0x14400051, // 32, -10.0dB
121 0x1300004c, // 33, -10.5dB
122 0x12000048, // 34, -11.0dB
123 0x11000044, // 35, -11.5dB
124 0x10000040, // 36, -12.0dB
127 u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
128 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB
129 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB
130 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB
131 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB
132 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB
133 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB
134 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB
135 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB
136 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB
137 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB
138 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB
139 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB
140 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB <== default
141 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB
142 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB
143 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB
144 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
145 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB
146 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB
147 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB
148 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB
149 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB
150 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB
151 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB
152 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB
153 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB
154 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB
155 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB
156 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB
157 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB
158 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB
159 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB
160 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB
164 u1Byte CCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = {
165 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB
166 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB
167 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB
168 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB
169 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB
170 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB
171 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB
172 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB
173 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB
174 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB
175 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB
176 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB
177 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB <== default
178 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB
179 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB
180 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB
181 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
182 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB
183 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB
184 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB
185 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB
186 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB
187 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB
188 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB
189 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB
190 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB
191 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB
192 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB
193 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB
194 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB
195 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB
196 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB
197 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB
201 u4Byte OFDMSwingTable_New[OFDM_TABLE_SIZE] = {
202 0x0b40002d, // 0, -15.0dB
203 0x0c000030, // 1, -14.5dB
204 0x0cc00033, // 2, -14.0dB
205 0x0d800036, // 3, -13.5dB
206 0x0e400039, // 4, -13.0dB
207 0x0f00003c, // 5, -12.5dB
208 0x10000040, // 6, -12.0dB
209 0x11000044, // 7, -11.5dB
210 0x12000048, // 8, -11.0dB
211 0x1300004c, // 9, -10.5dB
212 0x14400051, // 10, -10.0dB
213 0x15800056, // 11, -9.5dB
214 0x16c0005b, // 12, -9.0dB
215 0x18000060, // 13, -8.5dB
216 0x19800066, // 14, -8.0dB
217 0x1b00006c, // 15, -7.5dB
218 0x1c800072, // 16, -7.0dB
219 0x1e400079, // 17, -6.5dB
220 0x20000080, // 18, -6.0dB
221 0x22000088, // 19, -5.5dB
222 0x24000090, // 20, -5.0dB
223 0x26000098, // 21, -4.5dB
224 0x288000a2, // 22, -4.0dB
225 0x2ac000ab, // 23, -3.5dB
226 0x2d4000b5, // 24, -3.0dB
227 0x300000c0, // 25, -2.5dB
228 0x32c000cb, // 26, -2.0dB
229 0x35c000d7, // 27, -1.5dB
230 0x390000e4, // 28, -1.0dB
231 0x3c8000f2, // 29, -0.5dB
232 0x40000100, // 30, +0dB
233 0x43c0010f, // 31, +0.5dB
234 0x47c0011f, // 32, +1.0dB
235 0x4c000130, // 33, +1.5dB
236 0x50800142, // 34, +2.0dB
237 0x55400155, // 35, +2.5dB
238 0x5a400169, // 36, +3.0dB
239 0x5fc0017f, // 37, +3.5dB
240 0x65400195, // 38, +4.0dB
241 0x6b8001ae, // 39, +4.5dB
242 0x71c001c7, // 40, +5.0dB
243 0x788001e2, // 41, +5.5dB
244 0x7f8001fe // 42, +6.0dB
248 u1Byte CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {
249 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, // 0, -16.0dB
250 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 1, -15.5dB
251 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 2, -15.0dB
252 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 3, -14.5dB
253 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 4, -14.0dB
254 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 5, -13.5dB
255 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 6, -13.0dB
256 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 7, -12.5dB
257 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 8, -12.0dB
258 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 9, -11.5dB
259 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 10, -11.0dB
260 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 11, -10.5dB
261 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 12, -10.0dB
262 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 13, -9.5dB
263 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 14, -9.0dB
264 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 15, -8.5dB
265 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
266 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 17, -7.5dB
267 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 18, -7.0dB
268 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 19, -6.5dB
269 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 20, -6.0dB
270 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 21, -5.5dB
271 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 22, -5.0dB
272 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 23, -4.5dB
273 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 24, -4.0dB
274 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 25, -3.5dB
275 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 26, -3.0dB
276 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 27, -2.5dB
277 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 28, -2.0dB
278 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 29, -1.5dB
279 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 30, -1.0dB
280 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 31, -0.5dB
281 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} // 32, +0dB
285 u1Byte CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8]= {
286 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, // 0, -16.0dB
287 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 1, -15.5dB
288 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 2, -15.0dB
289 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 3, -14.5dB
290 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 4, -14.0dB
291 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 5, -13.5dB
292 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 6, -13.0dB
293 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 7, -12.5dB
294 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 8, -12.0dB
295 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 9, -11.5dB
296 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 10, -11.0dB
297 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 11, -10.5dB
298 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 12, -10.0dB
299 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 13, -9.5dB
300 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 14, -9.0dB
301 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 15, -8.5dB
302 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
303 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 17, -7.5dB
304 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 18, -7.0dB
305 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 19, -6.5dB
306 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 20, -6.0dB
307 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 21, -5.5dB
308 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 22, -5.0dB
309 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 23, -4.5dB
310 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 24, -4.0dB
311 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 25, -3.5dB
312 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 26, -3.0dB
313 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 27, -2.5dB
314 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 28, -2.0dB
315 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 29, -1.5dB
316 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 30, -1.0dB
317 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 31, -0.5dB
318 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} // 32, +0dB
321 u4Byte TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] =
362 #ifdef AP_BUILD_WORKAROUND
364 unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {
365 /* +6.0dB */ 0x7f8001fe,
366 /* +5.5dB */ 0x788001e2,
367 /* +5.0dB */ 0x71c001c7,
368 /* +4.5dB */ 0x6b8001ae,
369 /* +4.0dB */ 0x65400195,
370 /* +3.5dB */ 0x5fc0017f,
371 /* +3.0dB */ 0x5a400169,
372 /* +2.5dB */ 0x55400155,
373 /* +2.0dB */ 0x50800142,
374 /* +1.5dB */ 0x4c000130,
375 /* +1.0dB */ 0x47c0011f,
376 /* +0.5dB */ 0x43c0010f,
377 /* 0.0dB */ 0x40000100,
378 /* -0.5dB */ 0x3c8000f2,
379 /* -1.0dB */ 0x390000e4,
380 /* -1.5dB */ 0x35c000d7,
381 /* -2.0dB */ 0x32c000cb,
382 /* -2.5dB */ 0x300000c0,
383 /* -3.0dB */ 0x2d4000b5,
384 /* -3.5dB */ 0x2ac000ab,
385 /* -4.0dB */ 0x288000a2,
386 /* -4.5dB */ 0x26000098,
387 /* -5.0dB */ 0x24000090,
388 /* -5.5dB */ 0x22000088,
389 /* -6.0dB */ 0x20000080,
390 /* -6.5dB */ 0x1a00006c,
391 /* -7.0dB */ 0x1c800072,
392 /* -7.5dB */ 0x18000060,
393 /* -8.0dB */ 0x19800066,
394 /* -8.5dB */ 0x15800056,
395 /* -9.0dB */ 0x26c0005b,
396 /* -9.5dB */ 0x14400051,
397 /* -10.0dB */ 0x24400051,
398 /* -10.5dB */ 0x1300004c,
399 /* -11.0dB */ 0x12000048,
400 /* -11.5dB */ 0x11000044,
401 /* -12.0dB */ 0x10000040
405 //============================================================
406 // Local Function predefine.
407 //============================================================
409 //START------------COMMON INFO RELATED---------------//
411 odm_CommonInfoSelfInit(
416 odm_CommonInfoSelfUpdate(
421 odm_CmnInfoInit_Debug(
426 odm_CmnInfoHook_Debug(
431 odm_CmnInfoUpdate_Debug(
440 //END------------COMMON INFO RELATED---------------//
442 //START---------------DIG---------------------------//
444 odm_FalseAlarmCounterStatistics(
464 odm_CCKPacketDetectionThresh(
475 IN PDM_ODM_T pDM_Odm,
478 //END---------------DIG---------------------------//
480 //START-------BB POWER SAVE-----------------------//
482 odm_DynamicBBPowerSavingInit(
487 odm_DynamicBBPowerSaving(
495 //END---------BB POWER SAVE-----------------------//
497 //START-----------------PSD-----------------------//
498 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))
499 //============================================================
500 // Function predefine.
501 //============================================================
502 VOID odm_PathDiversityInit_92C( IN PADAPTER Adapter);
503 VOID odm_2TPathDiversityInit_92C( IN PADAPTER Adapter);
504 VOID odm_1TPathDiversityInit_92C( IN PADAPTER Adapter);
505 BOOLEAN odm_IsConnected_92C(IN PADAPTER Adapter);
506 VOID odm_PathDiversityAfterLink_92C( IN PADAPTER Adapter);
509 odm_CCKTXPathDiversityCallback(
514 odm_CCKTXPathDiversityWorkItemCallback(
519 odm_PathDivChkAntSwitchCallback(
524 odm_PathDivChkAntSwitchWorkitemCallback(
528 VOID odm_SetRespPath_92C( IN PADAPTER Adapter, IN u1Byte DefaultRespPath);
529 VOID odm_OFDMTXPathDiversity_92C( IN PADAPTER Adapter);
530 VOID odm_CCKTXPathDiversity_92C( IN PADAPTER Adapter);
531 VOID odm_ResetPathDiversity_92C( IN PADAPTER Adapter);
533 //Start-------------------- RX High Power------------------------//
534 VOID odm_RXHPInit( IN PDM_ODM_T pDM_Odm);
535 VOID odm_RXHP( IN PDM_ODM_T pDM_Odm);
536 VOID odm_Write_RXHP( IN PDM_ODM_T pDM_Odm);
538 VOID odm_PSD_RXHP( IN PDM_ODM_T pDM_Odm);
539 VOID odm_PSD_RXHPCallback( PRT_TIMER pTimer);
540 VOID odm_PSD_RXHPWorkitemCallback( IN PVOID pContext);
541 //End--------------------- RX High Power -----------------------//
543 VOID odm_PathDivInit_92D( IN PDM_ODM_T pDM_Odm);
548 IN u1Byte DefaultRespPath
552 //END-------------------PSD-----------------------//
555 odm_RefreshRateAdaptiveMaskMP(
560 odm_RefreshRateAdaptiveMaskCE(
565 odm_RefreshRateAdaptiveMaskAPADSL(
570 ODM_DynamicATCSwitch_init(
575 ODM_DynamicATCSwitch(
580 odm_Write_CrystalCap(
581 IN PDM_ODM_T pDM_Odm,
586 odm_DynamicTxPowerInit(
591 odm_DynamicTxPowerRestorePowerIndex(
596 odm_DynamicTxPowerNIC(
600 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
602 odm_DynamicTxPowerSavePowerIndex(
607 odm_DynamicTxPowerWritePowerIndex(
608 IN PDM_ODM_T pDM_Odm,
612 odm_DynamicTxPower_92C(
617 odm_DynamicTxPower_92D(
627 odm_MPT_DIGWorkItemCallback(
639 odm_RSSIMonitorCheckMP(
644 odm_RSSIMonitorCheckCE(
648 odm_RSSIMonitorCheckAP(
655 odm_RSSIMonitorCheck(
664 odm_DynamicTxPowerAP(
675 odm_SwAntDivInit_NIC(
685 odm_SwAntDivChkAntSwitch(
686 IN PDM_ODM_T pDM_Odm,
691 odm_SwAntDivChkAntSwitchNIC(
692 IN PDM_ODM_T pDM_Odm,
697 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
699 odm_SwAntDivChkAntSwitchCallback(
703 odm_SwAntDivChkAntSwitchWorkitemCallback(
707 ODM_UpdateInitRateWorkItemCallback(
710 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
711 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
712 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
713 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
719 odm_GlobalAdapterCheck(
724 odm_RefreshBasicRateMask(
729 odm_RefreshRateAdaptiveMask(
734 ODM_TXPowerTrackingCheck(
739 odm_TXPowerTrackingCheckAP(
750 odm_RateAdaptiveMaskInit(
755 odm_TXPowerTrackingThermalMeterInit(
766 odm_TXPowerTrackingInit(
771 odm_TXPowerTrackingCheckMP(
777 odm_TXPowerTrackingCheckCE(
781 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))
784 ODM_RateAdaptiveStateApInit(
785 IN PADAPTER Adapter ,
786 IN PRT_WLAN_STA pEntry
790 odm_TXPowerTrackingCallbackThermalMeter92C(
795 odm_TXPowerTrackingCallbackRXGainThermalMeter92D(
800 odm_TXPowerTrackingCallbackThermalMeter92D(
805 odm_TXPowerTrackingDirectCall92C(
810 odm_TXPowerTrackingThermalMeterCheck(
825 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
827 odm_EdcaTurboCheckMP(
831 //check if edca turbo is disabled
833 odm_IsEdcaTurboDisable(
836 //choose edca paramter for special IOT case
838 ODM_EdcaParaSelByIot(
839 IN PDM_ODM_T pDM_Odm,
840 OUT u4Byte *EDCA_BE_UL,
841 OUT u4Byte *EDCA_BE_DL
843 //check if it is UL or DL
845 odm_EdcaChooseTrafficIdx(
846 IN PDM_ODM_T pDM_Odm,
847 IN u8Byte cur_tx_bytes,
848 IN u8Byte cur_rx_bytes,
849 IN BOOLEAN bBiasOnRx,
850 OUT BOOLEAN *pbIsCurRDLState
853 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
855 odm_EdcaTurboCheckCE(
872 #define RxDefaultAnt1 0x65a9
873 #define RxDefaultAnt2 0x569a
876 odm_InitHybridAntDiv(
882 IN PDM_ODM_T pDM_Odm,
883 IN u4Byte OFDM_Ant1_Cnt,
884 IN u4Byte OFDM_Ant2_Cnt,
885 IN u4Byte CCK_Ant1_Cnt,
886 IN u4Byte CCK_Ant2_Cnt,
892 IN PDM_ODM_T pDM_Odm,
904 VOID odm_PathDiversityInit(IN PDM_ODM_T pDM_Odm);
905 VOID odm_PathDiversity( IN PDM_ODM_T pDM_Odm);
909 //============================================================
911 //============================================================
914 // 2011/09/21 MH Add to describe different team necessary resource allocate??
922 //2012.05.03 Luke: For all IC series
923 odm_CommonInfoSelfInit(pDM_Odm);
924 odm_CmnInfoInit_Debug(pDM_Odm);
925 odm_DIGInit(pDM_Odm);
926 odm_AdaptivityInit(pDM_Odm);
927 odm_RateAdaptiveMaskInit(pDM_Odm);
928 odm_RSSIMonitorInit(pDM_Odm);
930 #if (RTL8192E_SUPPORT == 1)
931 if(pDM_Odm->SupportICType==ODM_RTL8192E)
933 odm_PrimaryCCA_Check_Init(pDM_Odm);
937 //#if (MP_DRIVER != 1)
938 if ( *(pDM_Odm->mp_mode) != 1)
939 odm_PathDiversityInit(pDM_Odm);
941 ODM_EdcaTurboInit(pDM_Odm);
943 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
945 odm_TXPowerTrackingInit(pDM_Odm);
946 //#if (MP_DRIVER != 1)
947 if ( *(pDM_Odm->mp_mode) != 1)
948 ODM_AntDivInit(pDM_Odm);
951 else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
953 odm_DynamicBBPowerSavingInit(pDM_Odm);
954 odm_DynamicTxPowerInit(pDM_Odm);
955 odm_TXPowerTrackingInit(pDM_Odm);
956 //ODM_EdcaTurboInit(pDM_Odm);
957 //#if (MP_DRIVER != 1)
958 if ( *(pDM_Odm->mp_mode) != 1) {
959 if(pDM_Odm->SupportICType==ODM_RTL8723A)
960 odm_SwAntDivInit(pDM_Odm);
961 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
963 if(pDM_Odm->AntDivType == HW_ANTDIV)
964 odm_InitHybridAntDiv(pDM_Odm);
966 odm_SwAntDivInit(pDM_Odm);
969 ODM_AntDivInit(pDM_Odm);
971 if(pDM_Odm->SupportICType == ODM_RTL8723B)
972 odm_SwAntDetectInit(pDM_Odm);
976 //2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
977 // so compile flags must be left here to prevent from compile errors
978 #if (RTL8188E_SUPPORT == 1)
979 if(pDM_Odm->SupportICType==ODM_RTL8188E)
981 odm_PrimaryCCA_Init(pDM_Odm); // Gary
982 ODM_RAInfo_Init_all(pDM_Odm);
986 //2010.05.30 LukeLee: Following are not incorporated into ODM structure yet.
987 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
988 if(pDM_Odm->SupportICType&ODM_RTL8723A)
989 odm_PSDMonitorInit(pDM_Odm);
991 if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
993 odm_RXHPInit(pDM_Odm);
995 if(pDM_Odm->SupportICType==ODM_RTL8192D)
997 odm_PathDivInit_92D(pDM_Odm); //92D Path Div Init //Neil Chen
1002 ODM_DynamicATCSwitch_init(pDM_Odm);
1003 ODM_ClearTxPowerTrackingState(pDM_Odm);
1008 // 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.
1009 // You can not add any dummy function here, be care, you can only use DM structure
1010 // to perform any new ODM_DM.
1014 IN PDM_ODM_T pDM_Odm
1017 if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->SupportInterface == ODM_ITRF_USB))
1019 if(pDM_Odm->RSSI_Min > 25)
1020 ODM_Write1Byte(pDM_Odm, 0x4CF, 0x02);
1021 else if(pDM_Odm->RSSI_Min < 20)
1022 ODM_Write1Byte(pDM_Odm, 0x4CF, 0x00);
1026 odm_CommonInfoSelfUpdate(pDM_Odm);
1027 odm_BasicDbgMessage(pDM_Odm);
1028 odm_FalseAlarmCounterStatistics(pDM_Odm);
1029 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min));
1031 odm_RSSIMonitorCheck(pDM_Odm);
1033 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1034 //#ifdef CONFIG_PLATFORM_SPRD
1035 //For CE Platform(SPRD or Tablet)
1036 //8723A or 8189ES platform
1037 //NeilChen--2012--08--24--
1038 //Fix Leave LPS issue
1039 if( (adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) // in LPS mode
1041 // (pDM_Odm->SupportICType & (ODM_RTL8723A ) )||
1042 // (pDM_Odm->SupportICType & (ODM_RTL8188E) &&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) )
1046 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));
1047 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
1048 odm_DIGbyRSSI_LPS(pDM_Odm);
1058 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1059 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
1061 odm_CCKPacketDetectionThresh(pDM_Odm);
1063 if(*(pDM_Odm->pbPowerSaving)==TRUE)
1067 odm_RefreshRateAdaptiveMask(pDM_Odm);
1068 odm_RefreshBasicRateMask(pDM_Odm);
1069 odm_DynamicBBPowerSaving(pDM_Odm);
1070 odm_EdcaTurboCheck(pDM_Odm);
1071 odm_PathDiversity(pDM_Odm);
1072 ODM_DynamicATCSwitch(pDM_Odm);
1073 odm_DynamicTxPower(pDM_Odm);
1075 #if (RTL8192E_SUPPORT == 1)
1076 if(pDM_Odm->SupportICType==ODM_RTL8192E)
1077 odm_DynamicPrimaryCCA_Check(pDM_Odm);
1079 //if(pDM_Odm->SupportICType == ODM_RTL8192E)
1083 //#if (MP_DRIVER != 1)
1084 if ( *(pDM_Odm->mp_mode) != 1) {
1085 if(pDM_Odm->SupportICType==ODM_RTL8723A)
1087 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
1089 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
1091 if(pDM_Odm->AntDivType == HW_ANTDIV)
1092 odm_HwAntDiv(pDM_Odm);
1094 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
1097 ODM_AntDiv(pDM_Odm);
1101 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
1103 ODM_TXPowerTrackingCheck(pDM_Odm);
1105 odm_IQCalibrate(pDM_Odm);
1107 else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1109 ODM_TXPowerTrackingCheck(pDM_Odm);
1111 //odm_EdcaTurboCheck(pDM_Odm);
1113 #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
1114 if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E)))
1118 //2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled,
1119 // so compile flags must be left here to prevent from compile errors
1120 #if (RTL8192D_SUPPORT == 1)
1121 if(pDM_Odm->SupportICType==ODM_RTL8192D)
1122 ODM_DynamicEarlyMode(pDM_Odm);
1124 odm_DynamicBBPowerSaving(pDM_Odm);
1125 #if (RTL8188E_SUPPORT == 1)
1126 if(pDM_Odm->SupportICType==ODM_RTL8188E)
1127 odm_DynamicPrimaryCCA(pDM_Odm);
1131 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;
1133 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1140 // Init /.. Fixed HW value. Only init time.
1144 IN PDM_ODM_T pDM_Odm,
1145 IN ODM_CMNINFO_E CmnInfo,
1150 // This section is used for init value
1157 case ODM_CMNINFO_ABILITY:
1158 pDM_Odm->SupportAbility = (u4Byte)Value;
1161 case ODM_CMNINFO_RF_TYPE:
1162 pDM_Odm->RFType = (u1Byte)Value;
1165 case ODM_CMNINFO_PLATFORM:
1166 pDM_Odm->SupportPlatform = (u1Byte)Value;
1169 case ODM_CMNINFO_INTERFACE:
1170 pDM_Odm->SupportInterface = (u1Byte)Value;
1173 case ODM_CMNINFO_MP_TEST_CHIP:
1174 pDM_Odm->bIsMPChip= (u1Byte)Value;
1177 case ODM_CMNINFO_IC_TYPE:
1178 pDM_Odm->SupportICType = Value;
1181 case ODM_CMNINFO_CUT_VER:
1182 pDM_Odm->CutVersion = (u1Byte)Value;
1185 case ODM_CMNINFO_FAB_VER:
1186 pDM_Odm->FabVersion = (u1Byte)Value;
1189 case ODM_CMNINFO_RFE_TYPE:
1190 pDM_Odm->RFEType = (u1Byte)Value;
1193 case ODM_CMNINFO_RF_ANTENNA_TYPE:
1194 pDM_Odm->AntDivType= (u1Byte)Value;
1197 case ODM_CMNINFO_BOARD_TYPE:
1198 pDM_Odm->BoardType = (u1Byte)Value;
1201 case ODM_CMNINFO_PACKAGE_TYPE:
1202 pDM_Odm->PackageType = (u1Byte)Value;
1205 case ODM_CMNINFO_EXT_LNA:
1206 pDM_Odm->ExtLNA = (u1Byte)Value;
1209 case ODM_CMNINFO_5G_EXT_LNA:
1210 pDM_Odm->ExtLNA5G = (u1Byte)Value;
1213 case ODM_CMNINFO_EXT_PA:
1214 pDM_Odm->ExtPA = (u1Byte)Value;
1217 case ODM_CMNINFO_5G_EXT_PA:
1218 pDM_Odm->ExtPA5G = (u1Byte)Value;
1221 case ODM_CMNINFO_GPA:
1222 pDM_Odm->TypeGPA= (ODM_TYPE_GPA_E)Value;
1224 case ODM_CMNINFO_APA:
1225 pDM_Odm->TypeAPA= (ODM_TYPE_APA_E)Value;
1227 case ODM_CMNINFO_GLNA:
1228 pDM_Odm->TypeGLNA= (ODM_TYPE_GLNA_E)Value;
1230 case ODM_CMNINFO_ALNA:
1231 pDM_Odm->TypeALNA= (ODM_TYPE_ALNA_E)Value;
1234 case ODM_CMNINFO_EXT_TRSW:
1235 pDM_Odm->ExtTRSW = (u1Byte)Value;
1237 case ODM_CMNINFO_PATCH_ID:
1238 pDM_Odm->PatchID = (u1Byte)Value;
1240 case ODM_CMNINFO_BINHCT_TEST:
1241 pDM_Odm->bInHctTest = (BOOLEAN)Value;
1243 case ODM_CMNINFO_BWIFI_TEST:
1244 pDM_Odm->bWIFITest = (BOOLEAN)Value;
1247 case ODM_CMNINFO_SMART_CONCURRENT:
1248 pDM_Odm->bDualMacSmartConcurrent = (BOOLEAN )Value;
1251 //To remove the compiler warning, must add an empty default statement to handle the other values.
1263 IN PDM_ODM_T pDM_Odm,
1264 IN ODM_CMNINFO_E CmnInfo,
1269 // Hook call by reference pointer.
1274 // Dynamic call by reference pointer.
1276 case ODM_CMNINFO_MAC_PHY_MODE:
1277 pDM_Odm->pMacPhyMode = (u1Byte *)pValue;
1280 case ODM_CMNINFO_TX_UNI:
1281 pDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;
1284 case ODM_CMNINFO_RX_UNI:
1285 pDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;
1288 case ODM_CMNINFO_WM_MODE:
1289 pDM_Odm->pWirelessMode = (u1Byte *)pValue;
1292 case ODM_CMNINFO_BAND:
1293 pDM_Odm->pBandType = (u1Byte *)pValue;
1296 case ODM_CMNINFO_SEC_CHNL_OFFSET:
1297 pDM_Odm->pSecChOffset = (u1Byte *)pValue;
1300 case ODM_CMNINFO_SEC_MODE:
1301 pDM_Odm->pSecurity = (u1Byte *)pValue;
1304 case ODM_CMNINFO_BW:
1305 pDM_Odm->pBandWidth = (u1Byte *)pValue;
1308 case ODM_CMNINFO_CHNL:
1309 pDM_Odm->pChannel = (u1Byte *)pValue;
1312 case ODM_CMNINFO_DMSP_GET_VALUE:
1313 pDM_Odm->pbGetValueFromOtherMac = (BOOLEAN *)pValue;
1316 case ODM_CMNINFO_BUDDY_ADAPTOR:
1317 pDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;
1320 case ODM_CMNINFO_DMSP_IS_MASTER:
1321 pDM_Odm->pbMasterOfDMSP = (BOOLEAN *)pValue;
1324 case ODM_CMNINFO_SCAN:
1325 pDM_Odm->pbScanInProcess = (BOOLEAN *)pValue;
1328 case ODM_CMNINFO_POWER_SAVING:
1329 pDM_Odm->pbPowerSaving = (BOOLEAN *)pValue;
1332 case ODM_CMNINFO_ONE_PATH_CCA:
1333 pDM_Odm->pOnePathCCA = (u1Byte *)pValue;
1336 case ODM_CMNINFO_DRV_STOP:
1337 pDM_Odm->pbDriverStopped = (BOOLEAN *)pValue;
1340 case ODM_CMNINFO_PNP_IN:
1341 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = (BOOLEAN *)pValue;
1344 case ODM_CMNINFO_INIT_ON:
1345 pDM_Odm->pinit_adpt_in_progress = (BOOLEAN *)pValue;
1348 case ODM_CMNINFO_ANT_TEST:
1349 pDM_Odm->pAntennaTest = (u1Byte *)pValue;
1352 case ODM_CMNINFO_NET_CLOSED:
1353 pDM_Odm->pbNet_closed = (BOOLEAN *)pValue;
1356 case ODM_CMNINFO_FORCED_RATE:
1357 pDM_Odm->pForcedDataRate = (pu2Byte)pValue;
1360 case ODM_CMNINFO_FORCED_IGI_LB:
1361 pDM_Odm->pu1ForcedIgiLb = (u1Byte *)pValue;
1364 case ODM_CMNINFO_MP_MODE:
1365 pDM_Odm->mp_mode = (u1Byte *)pValue;
1368 //case ODM_CMNINFO_RTSTA_AID:
1369 // pDM_Odm->pAidMap = (u1Byte *)pValue;
1372 //case ODM_CMNINFO_BT_COEXIST:
1373 // pDM_Odm->BTCoexist = (BOOLEAN *)pValue;
1375 //case ODM_CMNINFO_STA_STATUS:
1376 //pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;
1379 //case ODM_CMNINFO_PHY_STATUS:
1380 // pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;
1383 //case ODM_CMNINFO_MAC_STATUS:
1384 // pDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;
1386 //To remove the compiler warning, must add an empty default statement to handle the other values.
1397 ODM_CmnInfoPtrArrayHook(
1398 IN PDM_ODM_T pDM_Odm,
1399 IN ODM_CMNINFO_E CmnInfo,
1405 // Hook call by reference pointer.
1410 // Dynamic call by reference pointer.
1412 case ODM_CMNINFO_STA_STATUS:
1413 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
1415 //To remove the compiler warning, must add an empty default statement to handle the other values.
1425 // Update Band/CHannel/.. The values are dynamic but non-per-packet.
1429 IN PDM_ODM_T pDM_Odm,
1435 // This init variable may be changed in run time.
1439 case ODM_CMNINFO_LINK_IN_PROGRESS:
1440 pDM_Odm->bLinkInProcess = (BOOLEAN)Value;
1443 case ODM_CMNINFO_ABILITY:
1444 pDM_Odm->SupportAbility = (u4Byte)Value;
1447 case ODM_CMNINFO_RF_TYPE:
1448 pDM_Odm->RFType = (u1Byte)Value;
1451 case ODM_CMNINFO_WIFI_DIRECT:
1452 pDM_Odm->bWIFI_Direct = (BOOLEAN)Value;
1455 case ODM_CMNINFO_WIFI_DISPLAY:
1456 pDM_Odm->bWIFI_Display = (BOOLEAN)Value;
1459 case ODM_CMNINFO_LINK:
1460 pDM_Odm->bLinked = (BOOLEAN)Value;
1463 case ODM_CMNINFO_STATION_STATE:
1464 pDM_Odm->bsta_state = (BOOLEAN)Value;
1467 case ODM_CMNINFO_RSSI_MIN:
1468 pDM_Odm->RSSI_Min= (u1Byte)Value;
1471 case ODM_CMNINFO_DBG_COMP:
1472 pDM_Odm->DebugComponents = Value;
1475 case ODM_CMNINFO_DBG_LEVEL:
1476 pDM_Odm->DebugLevel = (u4Byte)Value;
1478 case ODM_CMNINFO_RA_THRESHOLD_HIGH:
1479 pDM_Odm->RateAdaptive.HighRSSIThresh = (u1Byte)Value;
1482 case ODM_CMNINFO_RA_THRESHOLD_LOW:
1483 pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;
1485 // The following is for BT HS mode and BT coexist mechanism.
1486 case ODM_CMNINFO_BT_DISABLED:
1487 pDM_Odm->bBtDisabled = (BOOLEAN)Value;
1490 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
1491 pDM_Odm->bBtConnectProcess = (BOOLEAN)Value;
1494 case ODM_CMNINFO_BT_HS_RSSI:
1495 pDM_Odm->btHsRssi = (u1Byte)Value;
1498 case ODM_CMNINFO_BT_OPERATION:
1499 pDM_Odm->bBtHsOperation = (BOOLEAN)Value;
1502 case ODM_CMNINFO_BT_LIMITED_DIG:
1503 pDM_Odm->bBtLimitedDig = (BOOLEAN)Value;
1506 case ODM_CMNINFO_BT_DISABLE_EDCA:
1507 pDM_Odm->bBtDisableEdcaTurbo = (BOOLEAN)Value;
1511 case ODM_CMNINFO_OP_MODE:
1512 pDM_Odm->OPMode = (u1Byte)Value;
1515 case ODM_CMNINFO_WM_MODE:
1516 pDM_Odm->WirelessMode = (u1Byte)Value;
1519 case ODM_CMNINFO_BAND:
1520 pDM_Odm->BandType = (u1Byte)Value;
1523 case ODM_CMNINFO_SEC_CHNL_OFFSET:
1524 pDM_Odm->SecChOffset = (u1Byte)Value;
1527 case ODM_CMNINFO_SEC_MODE:
1528 pDM_Odm->Security = (u1Byte)Value;
1531 case ODM_CMNINFO_BW:
1532 pDM_Odm->BandWidth = (u1Byte)Value;
1535 case ODM_CMNINFO_CHNL:
1536 pDM_Odm->Channel = (u1Byte)Value;
1548 odm_CommonInfoSelfInit(
1549 IN PDM_ODM_T pDM_Odm
1552 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
1553 pDM_Odm->bCckHighPower = (BOOLEAN) ODM_GetBBReg(pDM_Odm, ODM_REG(CCK_RPT_FORMAT,pDM_Odm), ODM_BIT(CCK_RPT_FORMAT,pDM_Odm));
1554 pDM_Odm->RFPathRxEnable = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH,pDM_Odm), ODM_BIT(BB_RX_PATH,pDM_Odm));
1555 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
1556 pDM_Odm->pbNet_closed = &pDM_Odm->BOOLEAN_temp;
1559 ODM_InitDebugSetting(pDM_Odm);
1561 if(pDM_Odm->SupportICType==ODM_RTL8723A)
1563 pDM_Odm->AntDivType = SW_ANTDIV;
1565 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
1567 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1568 pDM_Odm->AntDivType = HW_ANTDIV;
1569 #elif (defined(CONFIG_SW_ANTENNA_DIVERSITY))
1570 pDM_Odm->AntDivType = SW_ANTDIV;
1573 pDM_Odm->TxRate = 0xFF;
1574 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1575 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1577 if(pDM_Odm->SupportICType==ODM_RTL8723B)
1579 if((!pDM_Odm->DM_SWAT_Table.ANTA_ON || !pDM_Odm->DM_SWAT_Table.ANTB_ON))
1580 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1583 #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
1585 #if(defined(CONFIG_NOT_SUPPORT_ANTDIV))
1586 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1587 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n"));
1588 #elif(defined(CONFIG_2G5G_SUPPORT_ANTDIV))
1589 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously \n"));
1590 pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G|ODM_ANTDIV_5G);
1591 if(pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT)
1592 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
1593 if(*pDM_Odm->pBandType == ODM_BAND_5G )
1595 #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )
1596 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1597 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1598 #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )
1599 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1600 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1601 #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )
1602 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1603 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1606 else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
1608 #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )
1609 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1610 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1611 #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )
1612 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1613 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1614 #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )
1615 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1616 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1619 #elif(defined(CONFIG_5G_SUPPORT_ANTDIV))
1620 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n"));
1621 pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_5G);
1622 if(*pDM_Odm->pBandType == ODM_BAND_5G )
1624 if(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC)
1625 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
1626 #if ( defined(CONFIG_5G_CGCS_RX_DIVERSITY) )
1627 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1628 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1629 #elif( defined(CONFIG_5G_CG_TRX_DIVERSITY) )
1630 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1631 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1632 #elif( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) )
1633 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1634 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1637 else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
1639 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 2G AntDivType\n"));
1640 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1642 #elif(defined(CONFIG_2G_SUPPORT_ANTDIV))
1643 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n"));
1644 pDM_FatTable->AntDiv_2G_5G = (ODM_ANTDIV_2G);
1645 if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
1647 if(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC)
1648 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
1649 #if ( defined(CONFIG_2G_CGCS_RX_DIVERSITY) )
1650 pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
1651 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CGCS_RX_HW_ANTDIV\n"));
1652 #elif( defined(CONFIG_2G_CG_TRX_DIVERSITY) )
1653 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1654 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_TRX_HW_ANTDIV\n"));
1655 #elif( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )
1656 pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
1657 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv Type = CG_SMART_ANTDIV\n"));
1660 else if(*pDM_Odm->pBandType == ODM_BAND_5G )
1662 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Not Support 5G AntDivType\n"));
1663 pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
1666 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1667 #endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1672 odm_CommonInfoSelfUpdate(
1673 IN PDM_ODM_T pDM_Odm
1680 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1682 PADAPTER Adapter = pDM_Odm->Adapter;
1683 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
1685 pEntry = pDM_Odm->pODM_StaInfo[0];
1686 if(pMgntInfo->mAssoc)
1690 pEntry->MacAddr[i] = pMgntInfo->Bssid[i];
1694 pEntry->bUsed=FALSE;
1696 pEntry->MacAddr[i] = 0;
1701 if(*(pDM_Odm->pBandWidth) == ODM_BW40M)
1703 if(*(pDM_Odm->pSecChOffset) == 1)
1704 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) -2;
1705 else if(*(pDM_Odm->pSecChOffset) == 2)
1706 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) +2;
1709 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
1711 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1713 pEntry = pDM_Odm->pODM_StaInfo[i];
1714 if(IS_STA_VALID(pEntry))
1718 pDM_Odm->bOneEntryOnly = TRUE;
1720 pDM_Odm->bOneEntryOnly = FALSE;
1724 odm_CmnInfoInit_Debug(
1725 IN PDM_ODM_T pDM_Odm
1728 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug==>\n"));
1729 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform=%d\n",pDM_Odm->SupportPlatform) );
1730 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility=0x%x\n",pDM_Odm->SupportAbility) );
1731 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface=%d\n",pDM_Odm->SupportInterface) );
1732 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType=0x%x\n",pDM_Odm->SupportICType) );
1733 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion=%d\n",pDM_Odm->CutVersion) );
1734 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion=%d\n",pDM_Odm->FabVersion) );
1735 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType=%d\n",pDM_Odm->RFType) );
1736 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType=%d\n",pDM_Odm->BoardType) );
1737 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA=%d\n",pDM_Odm->ExtLNA) );
1738 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA=%d\n",pDM_Odm->ExtPA) );
1739 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW=%d\n",pDM_Odm->ExtTRSW) );
1740 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID=%d\n",pDM_Odm->PatchID) );
1741 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest=%d\n",pDM_Odm->bInHctTest) );
1742 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest=%d\n",pDM_Odm->bWIFITest) );
1743 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent=%d\n",pDM_Odm->bDualMacSmartConcurrent) );
1748 odm_CmnInfoHook_Debug(
1749 IN PDM_ODM_T pDM_Odm
1752 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoHook_Debug==>\n"));
1753 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumTxBytesUnicast=%llu\n",*(pDM_Odm->pNumTxBytesUnicast)) );
1754 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumRxBytesUnicast=%llu\n",*(pDM_Odm->pNumRxBytesUnicast)) );
1755 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pWirelessMode=0x%x\n",*(pDM_Odm->pWirelessMode)) );
1756 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecChOffset=%d\n",*(pDM_Odm->pSecChOffset)) );
1757 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecurity=%d\n",*(pDM_Odm->pSecurity)) );
1758 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandWidth=%d\n",*(pDM_Odm->pBandWidth)) );
1759 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pChannel=%d\n",*(pDM_Odm->pChannel)) );
1761 if(pDM_Odm->SupportICType==ODM_RTL8192D)
1763 if(pDM_Odm->pBandType)
1764 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandType=%d\n",*(pDM_Odm->pBandType)) );
1765 if(pDM_Odm->pMacPhyMode)
1766 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pMacPhyMode=%d\n",*(pDM_Odm->pMacPhyMode)) );
1767 if(pDM_Odm->pBuddyAdapter)
1768 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbGetValueFromOtherMac=%d\n",*(pDM_Odm->pbGetValueFromOtherMac)) );
1769 if(pDM_Odm->pBuddyAdapter)
1770 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBuddyAdapter=%p\n",*(pDM_Odm->pBuddyAdapter)) );
1771 if(pDM_Odm->pbMasterOfDMSP)
1772 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbMasterOfDMSP=%d\n",*(pDM_Odm->pbMasterOfDMSP)) );
1774 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbScanInProcess=%d\n",*(pDM_Odm->pbScanInProcess)) );
1775 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbPowerSaving=%d\n",*(pDM_Odm->pbPowerSaving)) );
1777 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1778 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pOnePathCCA=%d\n",*(pDM_Odm->pOnePathCCA)) );
1782 odm_CmnInfoUpdate_Debug(
1783 IN PDM_ODM_T pDM_Odm
1786 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoUpdate_Debug==>\n"));
1787 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Direct=%d\n",pDM_Odm->bWIFI_Direct) );
1788 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Display=%d\n",pDM_Odm->bWIFI_Display) );
1789 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked=%d\n",pDM_Odm->bLinked) );
1790 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_Min=%d\n",pDM_Odm->RSSI_Min) );
1796 IN PDM_ODM_T pDM_Odm
1799 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1800 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1802 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_BasicDbgMsg==>\n"));
1803 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, RSSI_Min = %d, CurrentIGI = 0x%x \n",
1804 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, pDM_DigTable->CurIGValue) );
1805 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("Cnt_Cck_fail = %d, Cnt_Ofdm_fail = %d, Total False Alarm = %d\n",
1806 FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));
1807 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n",
1808 pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B));
1809 //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));
1813 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1815 ODM_InitAllWorkItems(IN PDM_ODM_T pDM_Odm )
1818 PADAPTER pAdapter = pDM_Odm->Adapter;
1820 ODM_InitializeWorkItem( pDM_Odm,
1821 &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B,
1822 (RT_WORKITEM_CALL_BACK)ODM_SW_AntDiv_WorkitemCallback,
1824 "AntennaSwitchWorkitem");
1826 ODM_InitializeWorkItem( pDM_Odm,
1827 &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem,
1828 (RT_WORKITEM_CALL_BACK)odm_SwAntDivChkAntSwitchWorkitemCallback,
1830 "AntennaSwitchWorkitem");
1833 ODM_InitializeWorkItem(
1835 &(pDM_Odm->PathDivSwitchWorkitem),
1836 (RT_WORKITEM_CALL_BACK)odm_PathDivChkAntSwitchWorkitemCallback,
1840 ODM_InitializeWorkItem(
1842 &(pDM_Odm->CCKPathDiversityWorkitem),
1843 (RT_WORKITEM_CALL_BACK)odm_CCKTXPathDiversityWorkItemCallback,
1845 "CCKTXPathDiversityWorkItem");
1847 ODM_InitializeWorkItem(
1849 &(pDM_Odm->MPT_DIGWorkitem),
1850 (RT_WORKITEM_CALL_BACK)odm_MPT_DIGWorkItemCallback,
1854 ODM_InitializeWorkItem(
1856 &(pDM_Odm->RaRptWorkitem),
1857 (RT_WORKITEM_CALL_BACK)ODM_UpdateInitRateWorkItemCallback,
1861 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1862 #if (RTL8188E_SUPPORT == 1)
1863 ODM_InitializeWorkItem(
1865 &(pDM_Odm->FastAntTrainingWorkitem),
1866 (RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback,
1868 "FastAntTrainingWorkitem");
1871 ODM_InitializeWorkItem(
1873 &(pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem),
1874 (RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback,
1876 "PSDRXHP_WorkItem");
1881 ODM_FreeAllWorkItems(IN PDM_ODM_T pDM_Odm )
1884 ODM_FreeWorkItem( &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem_8723B));
1886 ODM_FreeWorkItem( &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem));
1888 ODM_FreeWorkItem(&(pDM_Odm->PathDivSwitchWorkitem));
1890 ODM_FreeWorkItem(&(pDM_Odm->CCKPathDiversityWorkitem));
1892 ODM_FreeWorkItem(&(pDM_Odm->FastAntTrainingWorkitem));
1894 ODM_FreeWorkItem(&(pDM_Odm->MPT_DIGWorkitem));
1896 ODM_FreeWorkItem(&(pDM_Odm->RaRptWorkitem));
1898 ODM_FreeWorkItem((&pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem));
1906 odm_FindMinimumRSSI(
1907 IN PDM_ODM_T pDM_Odm
1911 u1Byte RSSI_Min = 0xFF;
1913 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1915 // if(pDM_Odm->pODM_StaInfo[i] != NULL)
1916 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1918 if(pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)
1920 RSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;
1925 pDM_Odm->RSSI_Min = RSSI_Min;
1931 IN PDM_ODM_T pDM_Odm
1935 BOOLEAN Linked = FALSE;
1937 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1939 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1947 pDM_Odm->bLinked = Linked;
1952 //3============================================================
1954 //3============================================================
1955 /*-----------------------------------------------------------------------------
1956 * Function: odm_DIGInit()
1958 * Overview: Set DIG scheme init value.
1969 *---------------------------------------------------------------------------*/
1971 ODM_ChangeDynamicInitGainThresh(
1972 IN PDM_ODM_T pDM_Odm,
1977 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1979 if (DM_Type == DIG_TYPE_THRESH_HIGH)
1981 pDM_DigTable->RssiHighThresh = DM_Value;
1983 else if (DM_Type == DIG_TYPE_THRESH_LOW)
1985 pDM_DigTable->RssiLowThresh = DM_Value;
1987 else if (DM_Type == DIG_TYPE_ENABLE)
1989 pDM_DigTable->Dig_Enable_Flag = TRUE;
1991 else if (DM_Type == DIG_TYPE_DISABLE)
1993 pDM_DigTable->Dig_Enable_Flag = FALSE;
1995 else if (DM_Type == DIG_TYPE_BACKOFF)
1999 pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
2001 else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
2005 pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
2007 else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
2011 pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
2013 } /* DM_ChangeDynamicInitGainThresh */
2015 int getIGIForDiff(int value_IGI)
2017 #define ONERCCA_LOW_TH 0x30
2018 #define ONERCCA_LOW_DIFF 8
2020 if (value_IGI < ONERCCA_LOW_TH) {
2021 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
2022 return ONERCCA_LOW_TH;
2024 return value_IGI + ONERCCA_LOW_DIFF;
2033 IN PDM_ODM_T pDM_Odm
2036 if(pDM_Odm->SupportICType == ODM_RTL8723B)
2038 pDM_Odm->TH_L2H_ini = 0xf8; // -8
2040 if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE))
2042 pDM_Odm->TH_L2H_ini = 0xf0; // -16
2046 pDM_Odm->TH_L2H_ini = 0xf9; // -7
2049 pDM_Odm->TH_EDCCA_HL_diff = 7;
2050 pDM_Odm->IGI_Base = 0x32;
2051 pDM_Odm->IGI_target = 0x1c;
2052 pDM_Odm->ForceEDCCA = 0;
2053 pDM_Odm->AdapEn_RSSI = 20;
2055 //Reg524[11]=0 is easily to transmit packets during adaptivity test
2057 //ODM_SetBBReg(pDM_Odm, 0x524, BIT11, 1);// stop counting if EDCCA is asserted
2060 // Add by Neil Chen to enable edcca to MP Platform
2061 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2065 IN PDM_ODM_T pDM_Odm
2069 // This should be moved out of OUTSRC
2070 PADAPTER pAdapter = pDM_Odm->Adapter;
2071 // Enable EDCCA. The value is suggested by SD3 Wilson.
2074 // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
2076 if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
2078 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
2079 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
2080 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
2085 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
2086 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
2087 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
2090 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
2095 IN PDM_ODM_T pDM_Odm
2099 ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
2100 ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
2104 // Description: According to initial gain value to determine to enable or disable EDCCA.
2106 // Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
2110 IN PDM_ODM_T pDM_Odm
2113 PADAPTER pAdapter = pDM_Odm->Adapter;
2114 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2115 u1Byte RegC50, RegC58;
2116 BOOLEAN bFwCurrentInPSMode=FALSE;
2118 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
2120 // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
2121 if(bFwCurrentInPSMode)
2124 RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
2125 RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
2128 if((RegC50 > 0x28 && RegC58 > 0x28) ||
2129 ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||
2130 (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))
2132 if(!pHalData->bPreEdccaEnable)
2134 odm_EnableEDCCA(pDM_Odm);
2135 pHalData->bPreEdccaEnable = TRUE;
2139 else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))
2141 if(pHalData->bPreEdccaEnable)
2143 odm_DisableEDCCA(pDM_Odm);
2144 pHalData->bPreEdccaEnable = FALSE;
2150 #endif // end MP platform support
2154 IN PDM_ODM_T pDM_Odm,
2158 s1Byte TH_L2H_dmc, TH_H2L_dmc;
2159 s1Byte Diff, IGI_target;
2160 BOOLEAN EDCCA_State = 0;
2161 BOOLEAN isInterference = 0;
2164 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2165 PADAPTER pAdapter = pDM_Odm->Adapter;
2166 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2167 BOOLEAN bFwCurrentInPSMode=FALSE;
2168 PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
2170 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
2172 // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
2173 if(bFwCurrentInPSMode)
2177 if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))
2179 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));
2180 // Add by Neil Chen to enable edcca to MP Platform
2181 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2183 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2184 odm_DynamicEDCCA(pDM_Odm);
2188 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));
2190 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n",
2191 pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
2193 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
2194 ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable
2196 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {
2197 ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x208);
2198 value32 = ODM_GetBBReg(pDM_Odm, 0xdf4, bMaskDWord);
2201 if (value32 & BIT30)
2202 isInterference = TRUE;
2204 isInterference = FALSE;
2206 if(((!pDM_Odm->bLinked) && (!isInterference)) || (*pDM_Odm->pChannel >= 149)) // Band4 doesn't need adaptivity
2208 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2210 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
2211 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
2214 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
2218 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
2219 if(pMgntInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
2220 ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0a);
2222 ODM_Write1Byte(pDM_Odm, REG_TRX_SIFS_OFDM, 0x0e);
2224 if(!pDM_Odm->ForceEDCCA)
2226 if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
2228 else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
2233 //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G))
2234 //IGI_target = pDM_Odm->IGI_Base;
2238 if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20
2239 IGI_target = pDM_Odm->IGI_Base;
2240 else if(*pDM_Odm->pBandWidth == ODM_BW40M)
2241 IGI_target = pDM_Odm->IGI_Base + 2;
2242 else if(*pDM_Odm->pBandWidth == ODM_BW80M)
2243 IGI_target = pDM_Odm->IGI_Base + 6;
2245 IGI_target = pDM_Odm->IGI_Base;
2248 pDM_Odm->IGI_target = (u1Byte) IGI_target;
2250 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
2251 (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State));
2253 if(EDCCA_State == 1)
2255 Diff = IGI_target -(s1Byte)IGI;
2256 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
2257 if(TH_L2H_dmc > 10) TH_L2H_dmc = 10;
2258 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
2265 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
2266 IGI, TH_L2H_dmc, TH_H2L_dmc));
2268 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2270 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
2271 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
2274 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
2278 ODM_DynamicATCSwitch_init(
2279 IN PDM_ODM_T pDM_Odm
2282 PADAPTER Adapter = pDM_Odm->Adapter;
2283 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2285 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
2287 pDM_Odm->CrystalCap = pHalData->CrystalCap;
2288 pDM_Odm->bATCStatus = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11);
2289 pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
2295 ODM_DynamicATCSwitch(
2296 IN PDM_ODM_T pDM_Odm
2299 PADAPTER Adapter = pDM_Odm->Adapter;
2300 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2301 u1Byte CrystalCap,ATC_status_temp = 0;
2302 u4Byte packet_count;
2303 int CFO_kHz_A,CFO_kHz_B,CFO_ave = 0, Adjust_Xtal = 0;
2306 #if (MP_DRIVER == 1)
2307 if ( *(pDM_Odm->mp_mode) == 1)
2308 pDM_Odm->bLinked = TRUE;
2311 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN )
2313 if(!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ATC))
2316 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("=========> ODM_DynamicATCSwitch()\n"));
2320 if(!pDM_Odm->bLinked)
2324 if(pDM_Odm->bATCStatus == ATC_Status_Off)
2326 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2327 ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
2329 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
2330 ODM_SetBBReg(pDM_Odm, rFc_area_Jaguar, BIT14, ATC_Status_On);
2332 pDM_Odm->bATCStatus = ATC_Status_On;
2335 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): No link!!\n"));
2336 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): ATCStatus = %d\n", pDM_Odm->bATCStatus));
2338 //3 2.Disable CFO tracking for BT
2339 if(!pDM_Odm->bBtDisabled)
2341 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!!\n"));
2345 //3 3.Reset Crystal Cap.
2346 if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
2348 pDM_Odm->CrystalCap = pHalData->CrystalCap;
2349 CrystalCap = pDM_Odm->CrystalCap & 0x3f;
2350 odm_Write_CrystalCap(pDM_Odm,CrystalCap);
2352 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CrystalCap = 0x%x\n", pDM_Odm->CrystalCap));
2360 //3 1. Calculate CFO for path-A & path-B
2361 CFO_kHz_A = (int)(pDM_Odm->CFO_tail[0] * 3125) / 1280;
2362 CFO_kHz_B = (int)(pDM_Odm->CFO_tail[1] * 3125) / 1280;
2363 packet_count = pDM_Odm->packetCount;
2366 if(packet_count == pDM_Odm->packetCount_pre)
2368 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter doesn't change\n"));
2371 pDM_Odm->packetCount_pre = packet_count;
2372 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): packet counter = %d\n", pDM_Odm->packetCount));
2375 if(pDM_Odm->RFType == ODM_1T1R)
2376 CFO_ave = CFO_kHz_A;
2378 CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
2380 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n",
2381 CFO_kHz_A, CFO_kHz_B, CFO_ave));
2383 //3 4.Avoid abnormal large CFO
2384 CFO_ave_diff = (pDM_Odm->CFO_ave_pre >= CFO_ave)?(pDM_Odm->CFO_ave_pre - CFO_ave):(CFO_ave - pDM_Odm->CFO_ave_pre);
2385 if(CFO_ave_diff > 20 && pDM_Odm->largeCFOHit == 0)
2387 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): first large CFO hit\n"));
2388 pDM_Odm->largeCFOHit = 1;
2392 pDM_Odm->largeCFOHit = 0;
2393 pDM_Odm->CFO_ave_pre = CFO_ave;
2395 //2 CFO tracking by adjusting Xtal cap.
2397 if (pDM_Odm->bBtDisabled)
2399 //3 1.Dynamic Xtal threshold
2400 if(CFO_ave >= -pDM_Odm->CFOThreshold && CFO_ave <= pDM_Odm->CFOThreshold && pDM_Odm->bIsfreeze == 0)
2402 if (pDM_Odm->CFOThreshold == CFO_Threshold_Xtal)
2404 pDM_Odm->CFOThreshold = CFO_Threshold_Xtal + 10;
2405 pDM_Odm->bIsfreeze = 1;
2408 pDM_Odm->CFOThreshold = CFO_Threshold_Xtal;
2410 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Dynamic threshold = %d\n", pDM_Odm->CFOThreshold));
2412 //3 2.Calculate Xtal offset
2413 if(CFO_ave > pDM_Odm->CFOThreshold && pDM_Odm->CrystalCap < 0x3f)
2414 Adjust_Xtal = ((CFO_ave - CFO_Threshold_Xtal) >> 2) + 1;
2415 else if(CFO_ave < (-pDM_Odm->CFOThreshold) && pDM_Odm->CrystalCap > 0)
2416 Adjust_Xtal = ((CFO_ave + CFO_Threshold_Xtal) >> 2) - 1;
2417 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Crystal cap = 0x%x, Crystal cap offset = %d\n", pDM_Odm->CrystalCap, Adjust_Xtal));
2419 //3 3.Adjudt Crystal Cap.
2420 if(Adjust_Xtal != 0)
2422 pDM_Odm->bIsfreeze = 0;
2423 pDM_Odm->CrystalCap = pDM_Odm->CrystalCap + Adjust_Xtal;
2425 if(pDM_Odm->CrystalCap > 0x3f)
2426 pDM_Odm->CrystalCap = 0x3f;
2427 else if (pDM_Odm->CrystalCap < 0)
2428 pDM_Odm->CrystalCap = 0;
2430 CrystalCap = pDM_Odm->CrystalCap & 0x3f;
2431 odm_Write_CrystalCap(pDM_Odm,CrystalCap);
2433 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): New crystal cap = 0x%x \n", pDM_Odm->CrystalCap));
2436 else if(pDM_Odm->CrystalCap != pHalData->CrystalCap)
2438 //3 Reset Xtal Cap when BT is enable
2439 pDM_Odm->CrystalCap = pHalData->CrystalCap;
2440 CrystalCap = pDM_Odm->CrystalCap & 0x3f;
2441 odm_Write_CrystalCap(pDM_Odm,CrystalCap);
2442 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is reset)\n"));
2445 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable CFO tracking for BT!! (CrystalCap is unchanged)\n"));
2446 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES){
2447 //2 Dynamic ATC switch
2449 //3 1.Enable ATC when CFO is larger then 80kHz
2450 if(CFO_ave < CFO_Threshold_ATC && CFO_ave > -CFO_Threshold_ATC)
2452 if(pDM_Odm->bATCStatus == ATC_Status_On)
2454 ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_Off);
2455 pDM_Odm->bATCStatus = ATC_Status_Off;
2457 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Disable ATC!!\n"));
2461 if(pDM_Odm->bATCStatus == ATC_Status_Off)
2463 ODM_SetBBReg(pDM_Odm, rOFDM1_CFOTracking, BIT11, ATC_Status_On);
2464 pDM_Odm->bATCStatus = ATC_Status_On;
2466 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_ATC, ODM_DBG_LOUD, ("ODM_DynamicATCSwitch(): Enable ATC!!\n"));
2474 odm_Write_CrystalCap(
2475 IN PDM_ODM_T pDM_Odm,
2476 IN u1Byte CrystalCap
2479 PADAPTER Adapter = pDM_Odm->Adapter;
2480 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2482 if(IS_HARDWARE_TYPE_8192D(Adapter))
2484 PHY_SetBBReg(Adapter, 0x24, 0xF0, CrystalCap & 0x0F);
2485 PHY_SetBBReg(Adapter, 0x28, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
2488 if(IS_HARDWARE_TYPE_8188E(Adapter))
2490 // write 0x24[16:11] = 0x24[22:17] = CrystalCap
2491 PHY_SetBBReg(Adapter, REG_AFE_XTAL_CTRL, 0x7ff800, (CrystalCap | (CrystalCap << 6)));
2494 if(IS_HARDWARE_TYPE_8812(Adapter))
2496 // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
2497 CrystalCap = CrystalCap & 0x3F;
2498 PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
2502 if ((IS_HARDWARE_TYPE_8723A(Adapter) && pHalData->EEPROMVersion >= 0x01) ||
2503 IS_HARDWARE_TYPE_8723B(Adapter) ||IS_HARDWARE_TYPE_8192E(Adapter) || IS_HARDWARE_TYPE_8821(Adapter))
2505 // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
2506 CrystalCap = CrystalCap & 0x3F;
2507 PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
2510 if(IS_HARDWARE_TYPE_8723AE(Adapter))
2511 PHY_SetBBReg(Adapter, REG_LDOA15_CTRL, bMaskDWord, 0x01572505);
2518 IN PDM_ODM_T pDM_Odm,
2519 IN u1Byte CurrentIGI
2522 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2524 if(pDM_Odm->StopDIG)
2526 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
2530 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x \n",
2531 ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
2533 if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI)
2535 if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_WIN))
2537 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
2538 if(pDM_Odm->RFType != ODM_1T1R)
2539 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
2541 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
2543 switch(*(pDM_Odm->pOnePathCCA))
2546 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
2547 if(pDM_Odm->RFType != ODM_1T1R)
2548 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
2551 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
2552 if(pDM_Odm->RFType != ODM_1T1R)
2553 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
2556 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
2557 if(pDM_Odm->RFType != ODM_1T1R)
2558 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
2563 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI));
2564 //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue;
2565 pDM_DigTable->CurIGValue = CurrentIGI;
2567 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI));
2573 IN PDM_ODM_T pDM_Odm
2576 //PADAPTER pAdapter =pDM_Odm->Adapter;
2577 //pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2578 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
2580 #if 0 //and 2.3.5 coding rule
2581 struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv);
2582 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2583 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2586 u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
2587 u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
2589 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
2592 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG_LPS, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
2594 // Using FW PS mode to make IGI
2596 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n"));
2597 //Adjust by FA in LPS MODE
2598 if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
2599 CurrentIGI = CurrentIGI+2;
2600 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
2601 CurrentIGI = CurrentIGI+1;
2602 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
2603 CurrentIGI = CurrentIGI-1;
2606 //Lower bound checking
2608 //RSSI Lower bound check
2609 if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
2610 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
2612 RSSI_Lower =DM_DIG_MIN_NIC;
2614 //Upper and Lower Bound checking
2615 if(CurrentIGI > DM_DIG_MAX_NIC)
2616 CurrentIGI=DM_DIG_MAX_NIC;
2617 else if(CurrentIGI < RSSI_Lower)
2618 CurrentIGI =RSSI_Lower;
2620 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
2626 IN PDM_ODM_T pDM_Odm
2629 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2631 //pDM_DigTable->Dig_Enable_Flag = TRUE;
2632 //pDM_DigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
2633 pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
2634 //pDM_DigTable->PreIGValue = 0x0;
2635 //pDM_DigTable->CurSTAConnectState = pDM_DigTable->PreSTAConnectState = DIG_STA_DISCONNECT;
2636 //pDM_DigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
2637 pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
2638 pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
2639 pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
2640 pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
2641 if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
2643 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
2644 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
2648 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
2649 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
2651 pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
2652 pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
2653 pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
2654 pDM_DigTable->PreCCK_CCAThres = 0xFF;
2655 pDM_DigTable->CurCCK_CCAThres = 0x83;
2656 pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
2657 pDM_DigTable->LargeFAHit = 0;
2658 pDM_DigTable->Recover_cnt = 0;
2659 pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
2660 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
2661 pDM_DigTable->bMediaConnect_0 = FALSE;
2662 pDM_DigTable->bMediaConnect_1 = FALSE;
2664 //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
2665 pDM_Odm->bDMInitialGainEnable = TRUE;
2668 pDM_DigTable->BT30_CurIGI=0x32;
2674 IN PDM_ODM_T pDM_Odm
2677 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2678 pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable;
2679 u1Byte digForBtHs=0;
2680 u1Byte digUpBound=0x5a;
2682 if(pDM_Odm->bBtConnectProcess)
2684 if(pDM_Odm->SupportICType&(ODM_RTL8723A))
2692 // Decide DIG value by BT HS RSSI.
2694 digForBtHs = pDM_Odm->btHsRssi+4;
2697 if(pDM_Odm->SupportICType&(ODM_RTL8723A))
2700 if(digForBtHs > digUpBound)
2701 digForBtHs = digUpBound;
2702 if(digForBtHs < 0x1c)
2705 // update Current IGI
2706 pDM_DigTable->BT30_CurIGI = digForBtHs;
2708 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
2714 IN PDM_ODM_T pDM_Odm
2717 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2718 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
2719 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
2720 u1Byte DIG_Dynamic_MIN;
2721 u1Byte DIG_MaxOfMin;
2722 BOOLEAN FirstConnect, FirstDisConnect;
2723 u1Byte dm_dig_max, dm_dig_min, offset;
2724 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
2725 u1Byte Adap_IGI_Upper = pDM_Odm->IGI_target + 30 + (u1Byte) pDM_Odm->TH_L2H_ini -(u1Byte) pDM_Odm->TH_EDCCA_HL_diff;
2727 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2728 // This should be moved out of OUTSRC
2729 PADAPTER pAdapter = pDM_Odm->Adapter;
2730 #if OS_WIN_FROM_WIN7(OS_VERSION)
2731 if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
2733 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n"));
2738 if (pDM_Odm->SupportICType==ODM_RTL8723B)
2742 if(pDM_Odm->bBtHsOperation)
2744 odm_DigForBtHsMode(pDM_Odm);
2747 if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
2749 if(pRX_HP_Table->RXHP_flag == 1)
2751 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n"));
2756 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2757 #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
2758 if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
2760 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
2761 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
2766 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
2767 prtl8192cd_priv priv = pDM_Odm->priv;
2768 if (!((priv->up_time > 5) && (priv->up_time % 2)) )
2770 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period \n"));
2775 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
2776 //if(!(pDM_Odm->SupportAbility & (ODM_BB_DIG|ODM_BB_FA_CNT)))
2777 if((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT)))
2780 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
2782 if ((pDM_Odm->SupportICType == ODM_RTL8192C) && (pDM_Odm->ExtLNA == 1))
2783 CurrentIGI = 0x30; //pDM_DigTable->CurIGValue = 0x30;
2785 CurrentIGI = 0x20; //pDM_DigTable->CurIGValue = 0x20;
2786 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
2789 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
2793 if(*(pDM_Odm->pbScanInProcess))
2795 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n"));
2799 //add by Neil Chen to avoid PSD is processing
2800 if(pDM_Odm->SupportICType==ODM_RTL8723A)
2802 if(pDM_Odm->bDMInitialGainEnable == FALSE)
2804 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n"));
2809 if(pDM_Odm->SupportICType == ODM_RTL8192D)
2811 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
2813 if(*(pDM_Odm->pbMasterOfDMSP))
2815 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
2816 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
2817 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
2821 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
2822 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
2823 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
2828 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
2830 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
2831 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
2832 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
2836 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
2837 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
2838 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
2844 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
2845 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
2846 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
2849 //1 Boundary Decision
2850 if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
2852 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
2855 dm_dig_max = DM_DIG_MAX_AP_HP;
2856 dm_dig_min = DM_DIG_MIN_AP_HP;
2860 dm_dig_max = DM_DIG_MAX_NIC_HP;
2861 dm_dig_min = DM_DIG_MIN_NIC_HP;
2863 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
2867 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
2869 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
2871 if (!priv->pmib->dot11DFSEntry.disable_DFS &&
2872 (OPMODE & WIFI_AP_STATE) &&
2873 (((pDM_Odm->ControlChannel >= 52) &&
2874 (pDM_Odm->ControlChannel <= 64)) ||
2875 ((pDM_Odm->ControlChannel >= 100) &&
2876 (pDM_Odm->ControlChannel <= 140))))
2880 if (priv->pmib->dot11RFEntry.tx2path) {
2881 if (*(pDM_Odm->pWirelessMode) == ODM_WM_B)//(priv->pmib->dot11BssType.net_work_type == WIRELESS_11B)
2888 dm_dig_max = DM_DIG_MAX_AP;
2889 dm_dig_min = DM_DIG_MIN_AP;
2890 DIG_MaxOfMin = dm_dig_max;
2894 if((pDM_Odm->SupportICType >= ODM_RTL8188E) && (pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
2897 dm_dig_max = DM_DIG_MAX_NIC;
2899 if(pDM_Odm->SupportICType != ODM_RTL8821)
2900 dm_dig_min = DM_DIG_MIN_NIC;
2904 DIG_MaxOfMin = DM_DIG_MAX_AP;
2908 if(0 < *pDM_Odm->pu1ForcedIgiLb)
2910 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): force IGI lb to: %u\n", *pDM_Odm->pu1ForcedIgiLb));
2911 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
2912 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
2915 if(pDM_Odm->bLinked)
2917 if(pDM_Odm->SupportICType&(ODM_RTL8723A/*|ODM_RTL8821*/))
2920 if(( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC )
2921 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
2922 else if(( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC )
2923 pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC;
2925 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
2929 if(pDM_Odm->bBtLimitedDig)
2931 if(pDM_Odm->RSSI_Min>10)
2933 if((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC)
2934 DIG_Dynamic_MIN = DM_DIG_MAX_NIC;
2935 else if((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC)
2936 DIG_Dynamic_MIN = DM_DIG_MIN_NIC;
2938 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10;
2941 DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
2945 if((pDM_Odm->RSSI_Min + 20) > dm_dig_max )
2946 pDM_DigTable->rx_gain_range_max = dm_dig_max;
2947 else if((pDM_Odm->RSSI_Min + 20) < dm_dig_min )
2948 pDM_DigTable->rx_gain_range_max = dm_dig_min;
2950 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20;
2956 if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821)) && (pDM_Odm->bBtLimitedDig==1)){
2957 //2 Modify DIG upper bound for 92E, 8723B, 8821 & 8812 BT
2958 if((pDM_Odm->RSSI_Min + 10) > dm_dig_max )
2959 pDM_DigTable->rx_gain_range_max = dm_dig_max;
2960 else if((pDM_Odm->RSSI_Min + 10) < dm_dig_min )
2961 pDM_DigTable->rx_gain_range_max = dm_dig_min;
2963 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
2967 //2 Modify DIG upper bound
2968 //2013.03.19 Luke: Modified upper bound for Netgear rental house test
2969 if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8192E)
2974 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
2975 pDM_DigTable->rx_gain_range_max = dm_dig_max;
2976 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
2977 pDM_DigTable->rx_gain_range_max = dm_dig_min;
2979 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
2983 //2 Modify DIG lower bound
2985 if((pFalseAlmCnt->Cnt_all > 500)&&(DIG_Dynamic_MIN < 0x25))
2987 else if(((pFalseAlmCnt->Cnt_all < 500)||(pDM_Odm->RSSI_Min < 8))&&(DIG_Dynamic_MIN > dm_dig_min))
2990 if(pDM_Odm->bOneEntryOnly)
2992 if(pDM_Odm->SupportICType != ODM_RTL8723B)
2997 if(pDM_Odm->RSSI_Min - offset < dm_dig_min)
2998 DIG_Dynamic_MIN = dm_dig_min;
2999 else if (pDM_Odm->RSSI_Min - offset > DIG_MaxOfMin)
3000 DIG_Dynamic_MIN = DIG_MaxOfMin;
3002 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - offset;
3004 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : bOneEntryOnly=TRUE, DIG_Dynamic_MIN=0x%x\n",DIG_Dynamic_MIN));
3005 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : pDM_Odm->RSSI_Min=%d",pDM_Odm->RSSI_Min));
3007 //1 Lower Bound for 88E AntDiv
3008 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
3009 else if( (pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) &&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) )
3010 //else if((pDM_Odm->SupportICType == ODM_RTL8188E)&&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
3012 if((pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)||(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV) ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
3014 DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
3015 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->AntDiv_RSSI_max=%d \n",pDM_DigTable->AntDiv_RSSI_max));
3021 DIG_Dynamic_MIN=dm_dig_min;
3027 pDM_DigTable->rx_gain_range_max = dm_dig_max;
3028 DIG_Dynamic_MIN = dm_dig_min;
3029 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n"));
3032 //1 Modify DIG lower bound, deal with abnorally large false alarm
3033 if(pFalseAlmCnt->Cnt_all > 10000)
3035 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n"));
3037 if(pDM_DigTable->LargeFAHit != 3)
3038 pDM_DigTable->LargeFAHit++;
3039 if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
3041 pDM_DigTable->ForbiddenIGI = (u1Byte)CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
3042 pDM_DigTable->LargeFAHit = 1;
3045 if(pDM_DigTable->LargeFAHit >= 3)
3047 if((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max)
3048 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
3050 pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
3051 pDM_DigTable->Recover_cnt = 3600; //3600=2hr
3057 //Recovery mechanism for IGI lower bound
3058 if(pDM_DigTable->Recover_cnt != 0)
3059 pDM_DigTable->Recover_cnt --;
3062 if(pDM_DigTable->LargeFAHit < 3)
3064 if((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN)
3066 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
3067 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
3068 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
3072 pDM_DigTable->ForbiddenIGI --;
3073 pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
3074 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
3079 pDM_DigTable->LargeFAHit = 0;
3083 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit));
3085 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3086 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
3087 pDM_Odm->bsta_state = _TRUE;
3090 if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2) && (pDM_Odm->bsta_state) )
3092 pDM_DigTable->rx_gain_range_min = dm_dig_min;
3095 if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
3096 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
3098 //1 Adjust initial gain by false alarm
3099 if(pDM_Odm->bLinked)
3101 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n"));
3104 if(pDM_Odm->RSSI_Min <= DIG_MaxOfMin)
3105 CurrentIGI = pDM_Odm->RSSI_Min;
3107 CurrentIGI = DIG_MaxOfMin;
3108 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n"));
3110 ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
3114 if(pDM_Odm->SupportICType == ODM_RTL8192D)
3116 if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D)
3117 CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
3118 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D)
3119 CurrentIGI = CurrentIGI + 2; //pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
3120 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D)
3121 CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
3125 //FA for Combo IC--NeilChen--2012--09--28
3126 if(pDM_Odm->SupportICType == ODM_RTL8723A)
3128 //WLAN and BT ConCurrent
3129 if(pDM_Odm->bBtLimitedDig)
3131 if(pFalseAlmCnt->Cnt_all > 0x300)
3132 CurrentIGI = CurrentIGI + 4;
3133 else if (pFalseAlmCnt->Cnt_all > 0x250)
3134 CurrentIGI = CurrentIGI + 2;
3135 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
3136 CurrentIGI = CurrentIGI -2;
3138 else //Not Concurrent
3140 if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
3141 CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
3142 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
3143 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
3144 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
3145 CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
3150 if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
3151 CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
3152 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
3153 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
3154 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
3155 CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
3157 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3158 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0])) //STA mode is linked to AP
3159 pDM_Odm->bsta_state = _TRUE;
3162 if((pDM_Odm->SupportPlatform&(ODM_WIN|ODM_CE))&&(pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 2)
3163 &&(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
3165 CurrentIGI = pDM_DigTable->rx_gain_range_min;
3166 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n"));
3170 value16 = (u2Byte) ODM_GetBBReg(pDM_Odm, 0x664, bMaskLWord);
3171 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): NumQryBeaconPkt = %d, OFDM_OK_Cnt = %d\n",
3172 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, value16));
3180 //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min
3181 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n"));
3184 CurrentIGI = pDM_DigTable->rx_gain_range_min;
3185 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect \n"));
3189 //2012.03.30 LukeLee: enable DIG before link but with very high thresholds
3190 if(pFalseAlmCnt->Cnt_all > 10000)
3191 CurrentIGI = CurrentIGI + 4;
3192 else if (pFalseAlmCnt->Cnt_all > 8000)
3193 CurrentIGI = CurrentIGI + 2;
3194 else if(pFalseAlmCnt->Cnt_all < 500)
3195 CurrentIGI = CurrentIGI - 2;
3196 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG \n"));
3199 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n"));
3200 //1 Check initial gain by upper/lower bound
3202 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
3203 CurrentIGI = pDM_DigTable->rx_gain_range_max;
3204 if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
3205 CurrentIGI = pDM_DigTable->rx_gain_range_min;
3207 if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)
3209 if(CurrentIGI > Adap_IGI_Upper)
3210 CurrentIGI = Adap_IGI_Upper;
3212 if(pDM_Odm->IGI_LowerBound != 0)
3214 if(CurrentIGI < pDM_Odm->IGI_LowerBound)
3215 CurrentIGI = pDM_Odm->IGI_LowerBound;
3217 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_Odm->IGI_LowerBound = %d\n", pDM_Odm->IGI_LowerBound));
3220 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): rx_gain_range_max=0x%x, rx_gain_range_min=0x%x\n",
3221 pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min));
3222 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all));
3223 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI));
3225 //2 High power RSSI threshold
3226 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
3228 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
3229 //PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
3230 // for LC issue to dymanic modify DIG lower bound----------LC Mocca Issue
3231 u8Byte curTxOkCnt=0, curRxOkCnt=0;
3232 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
3234 //u8Byte OKCntAll=0;
3235 //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
3236 //u8Byte CurByteCnt=0, PreByteCnt=0;
3238 curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
3239 curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
3240 lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast;
3241 lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast;
3242 //----------------------------------------------------------end for LC Mocca issue
3243 if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
3245 // High power IGI lower bound
3246 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
3247 if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
3249 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
3250 //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
3251 CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
3254 if((pDM_Odm->SupportICType & ODM_RTL8723A) &&
3255 IS_WIRELESS_MODE_G(pAdapter))
3257 if(pHalData->UndecoratedSmoothedPWDB > 0x28)
3259 if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
3261 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
3262 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
3267 if((pDM_Odm->SupportICType & ODM_RTL8723A)&&(pMgntInfo->CustomerID = RT_CID_LENOVO_CHINA))
3269 OKCntAll = (curTxOkCnt+curRxOkCnt);
3270 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", CurrentIGI));
3271 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
3272 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): OKCntAll(%#x)\n", OKCntAll));
3274 if(pDM_Odm->SupportInterface==ODM_ITRF_USB)
3276 if(pHalData->UndecoratedSmoothedPWDB < 12)
3278 if(CurrentIGI > DM_DIG_MIN_NIC)
3280 if(OKCntAll >= 1500000) // >=6Mbps
3282 else if(OKCntAll >= 1000000) //4Mbps
3284 else if(OKCntAll >= 500000) //2Mbps
3286 else if(OKCntAll >= 250000) //1Mbps
3290 CurrentIGI=0x17; //SCAN mode
3293 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Modify---->CurIGValue(%#x)\n", CurrentIGI));
3301 #if (RTL8192D_SUPPORT==1)
3302 if(pDM_Odm->SupportICType == ODM_RTL8192D)
3304 //sherry delete DualMacSmartConncurrent 20110517
3305 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
3307 ODM_Write_DIG_DMSP(pDM_Odm, (u1Byte)CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
3308 if(*(pDM_Odm->pbMasterOfDMSP))
3310 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
3311 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
3315 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
3316 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
3321 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
3322 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
3324 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
3325 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
3329 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
3330 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
3337 if(pDM_Odm->bBtHsOperation)
3339 if(pDM_Odm->bLinked)
3341 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
3343 ODM_Write_DIG(pDM_Odm, CurrentIGI);
3348 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
3350 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
3351 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
3355 if(pDM_Odm->bLinkInProcess)
3357 ODM_Write_DIG(pDM_Odm, 0x1c);
3359 else if(pDM_Odm->bBtConnectProcess)
3361 ODM_Write_DIG(pDM_Odm, 0x28);
3365 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
3369 else // BT is not using
3371 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
3372 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
3373 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
3381 IN PDM_ODM_T pDM_Odm
3384 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3385 // This should be moved out of OUTSRC
3386 PADAPTER pAdapter = pDM_Odm->Adapter;
3387 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
3389 #if OS_WIN_FROM_WIN7(OS_VERSION)
3390 if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
3392 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n"));
3397 if(pRX_HP_Table->RXHP_flag == 1)
3399 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n"));
3404 #else // For Other team any special case for DIG?
3411 //3============================================================
3412 //3 FASLE ALARM CHECK
3413 //3============================================================
3416 odm_FalseAlarmCounterStatistics(
3417 IN PDM_ODM_T pDM_Odm
3421 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
3423 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3424 prtl8192cd_priv priv = pDM_Odm->priv;
3425 if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
3429 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3430 if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
3431 (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&& ////modify by Guo.Mingzhi 2011-12-29
3432 (!(*(pDM_Odm->pbMasterOfDMSP))))
3434 odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
3439 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
3442 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
3446 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
3447 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
3449 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
3450 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
3451 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
3452 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
3453 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
3454 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
3455 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
3456 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
3457 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
3458 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
3459 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
3461 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
3462 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
3463 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
3465 #if (RTL8188E_SUPPORT==1)
3466 if((pDM_Odm->SupportICType == ODM_RTL8188E)||(pDM_Odm->SupportICType == ODM_RTL8192E))
3468 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
3469 FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
3470 FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
3474 #if (RTL8192D_SUPPORT==1)
3475 if(pDM_Odm->SupportICType == ODM_RTL8192D)
3477 odm_GetCCKFalseAlarm_92D(pDM_Odm);
3483 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
3484 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
3486 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
3487 FalseAlmCnt->Cnt_Cck_fail = ret_value;
3488 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
3489 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
3491 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
3492 FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
3495 FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
3496 FalseAlmCnt->Cnt_SB_Search_fail +
3497 FalseAlmCnt->Cnt_Parity_Fail +
3498 FalseAlmCnt->Cnt_Rate_Illegal +
3499 FalseAlmCnt->Cnt_Crc8_fail +
3500 FalseAlmCnt->Cnt_Mcs_fail +
3501 FalseAlmCnt->Cnt_Cck_fail);
3503 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
3505 #if (RTL8192C_SUPPORT==1)
3506 if(pDM_Odm->SupportICType == ODM_RTL8192C)
3507 odm_ResetFACounter_92C(pDM_Odm);
3510 #if (RTL8192D_SUPPORT==1)
3511 if(pDM_Odm->SupportICType == ODM_RTL8192D)
3512 odm_ResetFACounter_92D(pDM_Odm);
3515 if(pDM_Odm->SupportICType >=ODM_RTL8723A)
3517 //reset false alarm counter registers
3518 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
3519 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
3520 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
3521 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
3522 //update ofdm counter
3523 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
3524 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
3526 //reset CCK CCA counter
3527 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
3528 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
3529 //reset CCK FA counter
3530 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
3531 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
3534 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
3535 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
3536 FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
3537 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
3538 FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
3539 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
3540 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
3542 else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
3545 //read OFDM FA counter
3546 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
3547 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
3549 CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
3550 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
3551 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
3553 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
3555 // reset OFDM FA coutner
3556 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
3557 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
3558 // reset CCK FA counter
3559 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
3560 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
3562 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
3563 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
3564 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
3567 //3============================================================
3568 //3 CCK Packet Detect Threshold
3569 //3============================================================
3572 odm_CCKPacketDetectionThresh(
3573 IN PDM_ODM_T pDM_Odm
3577 u1Byte CurCCK_CCAThres;
3578 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
3580 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3581 //modify by Guo.Mingzhi 2011-12-29
3582 if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
3583 // if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
3586 if(pDM_Odm->bBtHsOperation)
3588 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
3589 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
3595 if(!(pDM_Odm->SupportAbility & (ODM_BB_CCK_PD|ODM_BB_FA_CNT)))
3601 if(pDM_Odm->bLinked)
3603 if(pDM_Odm->RSSI_Min > 25)
3604 CurCCK_CCAThres = 0xcd;
3605 else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
3606 CurCCK_CCAThres = 0x83;
3609 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
3610 CurCCK_CCAThres = 0x83;
3612 CurCCK_CCAThres = 0x40;
3617 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
3618 CurCCK_CCAThres = 0x83;
3620 CurCCK_CCAThres = 0x40;
3623 #if (RTL8192D_SUPPORT==1)
3624 if((pDM_Odm->SupportICType == ODM_RTL8192D)&&(*pDM_Odm->pBandType == ODM_BAND_2_4G))
3625 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
3628 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
3632 ODM_Write_CCK_CCA_Thres(
3633 IN PDM_ODM_T pDM_Odm,
3634 IN u1Byte CurCCK_CCAThres
3637 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
3639 if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
3641 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
3643 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
3644 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
3648 //3============================================================
3650 //3============================================================
3652 odm_DynamicBBPowerSavingInit(
3653 IN PDM_ODM_T pDM_Odm
3656 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
3658 pDM_PSTable->PreCCAState = CCA_MAX;
3659 pDM_PSTable->CurCCAState = CCA_MAX;
3660 pDM_PSTable->PreRFState = RF_MAX;
3661 pDM_PSTable->CurRFState = RF_MAX;
3662 pDM_PSTable->Rssi_val_min = 0;
3663 pDM_PSTable->initialize = 0;
3668 odm_DynamicBBPowerSaving(
3669 IN PDM_ODM_T pDM_Odm
3672 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
3674 if (pDM_Odm->SupportICType != ODM_RTL8723A)
3676 if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
3678 if(!(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)))
3681 //1 2.Power Saving for 92C
3682 if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
3684 odm_1R_CCA(pDM_Odm);
3687 // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
3688 // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
3689 //1 3.Power Saving for 88C
3692 ODM_RF_Saving(pDM_Odm, FALSE);
3694 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3700 IN PDM_ODM_T pDM_Odm
3703 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
3705 if(pDM_Odm->RSSI_Min!= 0xFF)
3708 if(pDM_PSTable->PreCCAState == CCA_2R)
3710 if(pDM_Odm->RSSI_Min >= 35)
3711 pDM_PSTable->CurCCAState = CCA_1R;
3713 pDM_PSTable->CurCCAState = CCA_2R;
3717 if(pDM_Odm->RSSI_Min <= 30)
3718 pDM_PSTable->CurCCAState = CCA_2R;
3720 pDM_PSTable->CurCCAState = CCA_1R;
3724 pDM_PSTable->CurCCAState=CCA_MAX;
3727 if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
3729 if(pDM_PSTable->CurCCAState == CCA_1R)
3731 if( pDM_Odm->RFType ==ODM_2T2R )
3733 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x13);
3734 //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
3738 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x23);
3739 //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
3744 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x33);
3745 //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
3747 pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
3749 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("CCAStage = %s\n",(pDM_PSTable->CurCCAState==0)?"1RCCA":"2RCCA"));
3754 IN PDM_ODM_T pDM_Odm,
3755 IN u1Byte bForceInNormal
3758 #if (DM_ODM_SUPPORT_TYPE != ODM_AP)
3759 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
3760 u1Byte Rssi_Up_bound = 30 ;
3761 u1Byte Rssi_Low_bound = 25;
3762 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
3763 if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
3765 Rssi_Up_bound = 50 ;
3766 Rssi_Low_bound = 45;
3769 if(pDM_PSTable->initialize == 0){
3771 pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
3772 pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
3773 pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
3774 pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
3775 //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
3776 pDM_PSTable->initialize = 1;
3781 if(pDM_Odm->RSSI_Min != 0xFF)
3783 if(pDM_PSTable->PreRFState == RF_Normal)
3785 if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
3786 pDM_PSTable->CurRFState = RF_Save;
3788 pDM_PSTable->CurRFState = RF_Normal;
3791 if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
3792 pDM_PSTable->CurRFState = RF_Normal;
3794 pDM_PSTable->CurRFState = RF_Save;
3798 pDM_PSTable->CurRFState=RF_MAX;
3802 pDM_PSTable->CurRFState = RF_Normal;
3805 if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
3807 if(pDM_PSTable->CurRFState == RF_Save)
3809 // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
3810 // Suggested by SD3 Yu-Nan. 2011.01.20.
3811 if(pDM_Odm->SupportICType == ODM_RTL8723A)
3813 ODM_SetBBReg(pDM_Odm, 0x874 , BIT5, 0x1); //Reg874[5]=1b'1
3815 ODM_SetBBReg(pDM_Odm, 0x874 , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
3816 ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
3817 ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
3818 ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
3819 ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
3820 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
3821 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
3822 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Save"));
3826 ODM_SetBBReg(pDM_Odm, 0x874 , 0x1CC000, pDM_PSTable->Reg874);
3827 ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70);
3828 ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
3829 ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74);
3830 ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);
3832 if(pDM_Odm->SupportICType == ODM_RTL8723A)
3834 ODM_SetBBReg(pDM_Odm,0x874 , BIT5, 0x0); //Reg874[5]=1b'0
3836 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Normal"));
3838 pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
3844 //3============================================================
3846 //3============================================================
3847 //3============================================================
3849 //3============================================================
3852 odm_RateAdaptiveMaskInit(
3853 IN PDM_ODM_T pDM_Odm
3856 PODM_RATE_ADAPTIVE pOdmRA = &pDM_Odm->RateAdaptive;
3858 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3859 PMGNT_INFO pMgntInfo = &pDM_Odm->Adapter->MgntInfo;
3860 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
3862 pMgntInfo->Ratr_State = DM_RATR_STA_INIT;
3864 if (pMgntInfo->DM_Type == DM_Type_ByDriver)
3865 pHalData->bUseRAMask = TRUE;
3867 pHalData->bUseRAMask = FALSE;
3869 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3870 pOdmRA->Type = DM_Type_ByDriver;
3871 if (pOdmRA->Type == DM_Type_ByDriver)
3872 pDM_Odm->bUseRAMask = _TRUE;
3874 pDM_Odm->bUseRAMask = _FALSE;
3877 pOdmRA->RATRState = DM_RATR_STA_INIT;
3878 pOdmRA->LdpcThres = 35;
3879 pOdmRA->bUseLdpc = FALSE;
3880 pOdmRA->HighRSSIThresh = 50;
3881 pOdmRA->LowRSSIThresh = 20;
3884 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
3886 ODM_RateAdaptiveStateApInit(
3887 IN PADAPTER Adapter ,
3888 IN PRT_WLAN_STA pEntry
3891 pEntry->Ratr_State = DM_RATR_STA_INIT;
3895 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
3896 u4Byte ODM_Get_Rate_Bitmap(
3897 IN PDM_ODM_T pDM_Odm,
3900 IN u1Byte rssi_level)
3903 u4Byte rate_bitmap = 0;
3904 u1Byte WirelessMode;
3905 //u1Byte WirelessMode =*(pDM_Odm->pWirelessMode);
3908 pEntry = pDM_Odm->pODM_StaInfo[macid];
3909 if(!IS_STA_VALID(pEntry))
3912 WirelessMode = pEntry->wireless_mode;
3914 switch(WirelessMode)
3917 if(ra_mask & 0x0000000c) //11M or 5.5M enable
3918 rate_bitmap = 0x0000000d;
3920 rate_bitmap = 0x0000000f;
3925 if(rssi_level == DM_RATR_STA_HIGH)
3926 rate_bitmap = 0x00000f00;
3928 rate_bitmap = 0x00000ff0;
3931 case (ODM_WM_B|ODM_WM_G):
3932 if(rssi_level == DM_RATR_STA_HIGH)
3933 rate_bitmap = 0x00000f00;
3934 else if(rssi_level == DM_RATR_STA_MIDDLE)
3935 rate_bitmap = 0x00000ff0;
3937 rate_bitmap = 0x00000ff5;
3940 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G) :
3941 case (ODM_WM_B|ODM_WM_N24G) :
3942 case (ODM_WM_G|ODM_WM_N24G) :
3943 case (ODM_WM_A|ODM_WM_N5G) :
3945 if ( pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)
3947 if(rssi_level == DM_RATR_STA_HIGH)
3949 rate_bitmap = 0x000f0000;
3951 else if(rssi_level == DM_RATR_STA_MIDDLE)
3953 rate_bitmap = 0x000ff000;
3956 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
3957 rate_bitmap = 0x000ff015;
3959 rate_bitmap = 0x000ff005;
3964 if(rssi_level == DM_RATR_STA_HIGH)
3966 rate_bitmap = 0x0f8f0000;
3968 else if(rssi_level == DM_RATR_STA_MIDDLE)
3970 rate_bitmap = 0x0f8ff000;
3974 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
3975 rate_bitmap = 0x0f8ff015;
3977 rate_bitmap = 0x0f8ff005;
3983 case (ODM_WM_AC|ODM_WM_G):
3985 rate_bitmap = 0xfc3f0000;
3986 else if(rssi_level == 2)
3987 rate_bitmap = 0xfffff000;
3989 rate_bitmap = 0xffffffff;
3992 case (ODM_WM_AC|ODM_WM_A):
3994 if (pDM_Odm->RFType == RF_1T1R)
3996 if(rssi_level == 1) // add by Gary for ac-series
3997 rate_bitmap = 0x003f8000;
3998 else if (rssi_level == 2)
3999 rate_bitmap = 0x003ff000;
4001 rate_bitmap = 0x003ff010;
4005 if(rssi_level == 1) // add by Gary for ac-series
4006 rate_bitmap = 0xfe3f8000; // VHT 2SS MCS3~9
4007 else if (rssi_level == 2)
4008 rate_bitmap = 0xfffff000; // VHT 2SS MCS0~9
4010 rate_bitmap = 0xfffff010; // All
4015 if(pDM_Odm->RFType == RF_1T2R)
4016 rate_bitmap = 0x000fffff;
4018 rate_bitmap = 0x0fffffff;
4023 //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);
4024 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",rssi_level,WirelessMode,rate_bitmap));
4026 return (ra_mask&rate_bitmap);
4033 odm_RefreshBasicRateMask(
4034 IN PDM_ODM_T pDM_Odm
4037 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4038 PADAPTER Adapter = pDM_Odm->Adapter;
4039 static u1Byte Stage = 0;
4040 u1Byte CurStage = 0;
4041 OCTET_STRING osRateSet;
4042 PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(Adapter);
4043 u1Byte RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};
4045 if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 )
4048 if(pDM_Odm->bLinked == FALSE) // unlink Default port information
4050 else if(pDM_Odm->RSSI_Min < 40) // link RSSI < 40%
4052 else if(pDM_Odm->RSSI_Min > 45) // link RSSI > 45%
4055 CurStage = 2; // link 25% <= RSSI <= 30%
4057 if(CurStage != Stage)
4061 FillOctetString(osRateSet, RateSet, 5);
4062 FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);
4063 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);
4065 else if(CurStage == 3 && (Stage == 1 || Stage == 2))
4067 Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
4075 /*-----------------------------------------------------------------------------
4076 * Function: odm_RefreshRateAdaptiveMask()
4078 * Overview: Update rate table mask according to rssi
4088 * 05/27/2009 hpfan Create Version 0.
4090 *---------------------------------------------------------------------------*/
4092 odm_RefreshRateAdaptiveMask(
4093 IN PDM_ODM_T pDM_Odm
4097 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n"));
4098 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
4100 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));
4104 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
4105 // at the same time. In the stage2/3, we need to prive universal interface and merge all
4106 // HW dynamic mechanism.
4108 switch (pDM_Odm->SupportPlatform)
4111 odm_RefreshRateAdaptiveMaskMP(pDM_Odm);
4115 odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
4120 odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);
4127 odm_RefreshRateAdaptiveMaskMP(
4128 IN PDM_ODM_T pDM_Odm
4131 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4132 PADAPTER pAdapter = pDM_Odm->Adapter;
4133 PADAPTER pTargetAdapter = NULL;
4134 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
4135 PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter);
4136 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
4138 if(pAdapter->bDriverStopped)
4140 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
4144 if(!pHalData->bUseRAMask)
4146 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
4150 // if default port is connected, update RA table for default port (infrastructure mode only)
4151 if(pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter)))
4154 if(pHalData->UndecoratedSmoothedPWDB < pRA->LdpcThres)
4156 pRA->bUseLdpc = TRUE;
4157 pRA->bLowerRtsRate = TRUE;
4158 if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
4159 MgntSet_TX_LDPC(pAdapter,0,TRUE);
4160 //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
4162 else if(pHalData->UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
4164 pRA->bUseLdpc = FALSE;
4165 pRA->bLowerRtsRate = FALSE;
4166 if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
4167 MgntSet_TX_LDPC(pAdapter,0,FALSE);
4168 //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
4171 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));
4172 if( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State) )
4174 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);
4175 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));
4176 pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);
4181 // The following part configure AP/VWifi/IBSS rate adaptive mask.
4184 if(pMgntInfo->mIbss) // Target: AP/IBSS peer.
4185 pTargetAdapter = GetDefaultAdapter(pAdapter);
4187 pTargetAdapter = GetFirstAPAdapter(pAdapter);
4189 // if extension port (softap) is started, updaet RA table for more than one clients associate
4190 if(pTargetAdapter != NULL)
4193 PRT_WLAN_STA pEntry;
4195 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
4197 pEntry = AsocEntry_EnumStation(pTargetAdapter, i);
4200 if(pEntry->bAssociated)
4202 if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) )
4204 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);
4205 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State));
4206 pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);
4213 if(pMgntInfo->bSetTXPowerTrainingByOid)
4214 pMgntInfo->bSetTXPowerTrainingByOid = FALSE;
4215 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4220 odm_RefreshRateAdaptiveMaskCE(
4221 IN PDM_ODM_T pDM_Odm
4224 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
4226 PADAPTER pAdapter = pDM_Odm->Adapter;
4227 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
4229 if(pAdapter->bDriverStopped)
4231 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
4235 if(!pDM_Odm->bUseRAMask)
4237 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
4241 //printk("==> %s \n",__FUNCTION__);
4243 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
4244 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
4245 if(IS_STA_VALID(pstat) ) {
4246 if(IS_MCAST( pstat->hwaddr)) //if(psta->mac_id ==1)
4248 if(IS_MCAST( pstat->hwaddr))
4251 #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
4252 if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
4254 if(pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres)
4256 pRA->bUseLdpc = TRUE;
4257 pRA->bLowerRtsRate = TRUE;
4258 if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
4259 Set_RA_LDPC_8812(pstat, TRUE);
4260 //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);
4262 else if(pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))
4264 pRA->bUseLdpc = FALSE;
4265 pRA->bLowerRtsRate = FALSE;
4266 if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))
4267 Set_RA_LDPC_8812(pstat, FALSE);
4268 //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);
4273 if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) )
4275 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level));
4276 //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);
4277 rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
4287 odm_RefreshRateAdaptiveMaskAPADSL(
4288 IN PDM_ODM_T pDM_Odm
4291 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
4292 struct rtl8192cd_priv *priv = pDM_Odm->priv;
4293 struct stat_info *pstat;
4295 if (!priv->pmib->dot11StationConfigEntry.autoRate)
4298 if (list_empty(&priv->asoc_list))
4301 list_for_each_entry(pstat, &priv->asoc_list, asoc_list) {
4302 if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) {
4303 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);
4304 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));
4306 #ifdef CONFIG_RTL_88E_SUPPORT
4307 if (GET_CHIP_VER(priv)==VERSION_8188E) {
4309 add_RATid(priv, pstat);
4314 #if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
4315 add_update_RATid(priv, pstat);
4323 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4325 ODM_DynamicARFBSelect(
4326 IN PDM_ODM_T pDM_Odm,
4328 IN BOOLEAN Collision_State
4332 if(pDM_Odm->SupportICType != ODM_RTL8192E)
4335 if (rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS12){
4336 if (Collision_State == 1){
4337 if(rate == DESC_RATEMCS12){
4339 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
4340 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);
4342 else if(rate == DESC_RATEMCS11){
4344 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
4345 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);
4347 else if(rate == DESC_RATEMCS10){
4349 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
4350 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);
4352 else if(rate == DESC_RATEMCS9){
4354 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
4355 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);
4359 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);
4360 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);
4363 else{ // Collision_State == 0
4364 if(rate == DESC_RATEMCS12){
4366 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);
4367 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);
4369 else if(rate == DESC_RATEMCS11){
4371 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);
4372 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);
4374 else if(rate == DESC_RATEMCS10){
4376 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);
4377 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);
4379 else if(rate == DESC_RATEMCS9){
4381 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);
4382 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);
4386 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);
4387 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);
4391 else{ // MCS13~MCS15, 1SS, G-mode
4392 if (Collision_State == 1){
4393 if(rate == DESC_RATEMCS15){
4395 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
4396 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);
4398 else if(rate == DESC_RATEMCS14){
4400 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
4401 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);
4403 else if(rate == DESC_RATEMCS13){
4405 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
4406 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);
4410 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);
4411 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);
4414 else{ // Collision_State == 0
4415 if(rate == DESC_RATEMCS15){
4417 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
4418 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);
4420 else if(rate == DESC_RATEMCS14){
4422 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);
4423 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);
4425 else if(rate == DESC_RATEMCS13){
4427 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);
4428 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);
4432 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);
4433 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);
4445 // Return Value: BOOLEAN
4446 // - TRUE: RATRState is changed.
4449 IN PDM_ODM_T pDM_Odm,
4451 IN BOOLEAN bForceUpdate,
4452 OUT pu1Byte pRATRState
4455 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
4456 const u1Byte GoUpGap = 5;
4457 u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;
4458 u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;
4461 // Threshold Adjustment:
4462 // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.
4463 // Here GoUpGap is added to solve the boundary's level alternation issue.
4464 switch (*pRATRState)
4466 case DM_RATR_STA_INIT:
4467 case DM_RATR_STA_HIGH:
4470 case DM_RATR_STA_MIDDLE:
4471 HighRSSIThreshForRA += GoUpGap;
4474 case DM_RATR_STA_LOW:
4475 HighRSSIThreshForRA += GoUpGap;
4476 LowRSSIThreshForRA += GoUpGap;
4480 ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );
4484 // Decide RATRState by RSSI.
4485 if(RSSI > HighRSSIThreshForRA)
4486 RATRState = DM_RATR_STA_HIGH;
4487 else if(RSSI > LowRSSIThreshForRA)
4488 RATRState = DM_RATR_STA_MIDDLE;
4490 RATRState = DM_RATR_STA_LOW;
4491 //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);
4493 if( *pRATRState!=RATRState || bForceUpdate)
4495 ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );
4496 *pRATRState = RATRState;
4504 //============================================================
4506 //3============================================================
4507 //3 Dynamic Tx Power
4508 //3============================================================
4511 odm_DynamicTxPowerInit(
4512 IN PDM_ODM_T pDM_Odm
4515 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4516 PADAPTER Adapter = pDM_Odm->Adapter;
4517 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
4518 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4520 #if DEV_BUS_TYPE==RT_USB_INTERFACE
4521 if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
4523 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
4524 pMgntInfo->bDynamicTxPowerEnable = TRUE;
4528 //so 92c pci do not need dynamic tx power? vivi check it later
4529 if(IS_HARDWARE_TYPE_8192D(Adapter))
4530 pMgntInfo->bDynamicTxPowerEnable = TRUE;
4532 pMgntInfo->bDynamicTxPowerEnable = FALSE;
4536 pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
4537 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4538 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
4539 PADAPTER Adapter = pDM_Odm->Adapter;
4540 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4541 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4542 pdmpriv->bDynamicTxPowerEnable = _FALSE;
4544 #if (RTL8192C_SUPPORT==1)
4545 #ifdef CONFIG_USB_HCI
4547 #ifdef CONFIG_INTEL_PROXIM
4548 if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
4550 if(pHalData->BoardType == BOARD_USB_High_PA)
4554 //odm_SavePowerIndex(Adapter);
4555 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
4556 pdmpriv->bDynamicTxPowerEnable = _TRUE;
4560 pdmpriv->bDynamicTxPowerEnable = _FALSE;
4564 pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
4565 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4572 odm_DynamicTxPowerSavePowerIndex(
4573 IN PDM_ODM_T pDM_Odm
4577 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
4579 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4580 PADAPTER Adapter = pDM_Odm->Adapter;
4581 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4582 for(index = 0; index< 6; index++)
4583 pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
4584 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
4585 PADAPTER Adapter = pDM_Odm->Adapter;
4586 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4587 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4588 for(index = 0; index< 6; index++)
4589 pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
4594 odm_DynamicTxPowerRestorePowerIndex(
4595 IN PDM_ODM_T pDM_Odm
4599 PADAPTER Adapter = pDM_Odm->Adapter;
4601 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
4602 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4603 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
4604 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4605 for(index = 0; index< 6; index++)
4606 PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
4607 #elif(DM_ODM_SUPPORT_TYPE == ODM_CE)
4608 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4609 for(index = 0; index< 6; index++)
4610 rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
4616 odm_DynamicTxPowerWritePowerIndex(
4617 IN PDM_ODM_T pDM_Odm,
4622 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
4624 for(index = 0; index< 6; index++)
4625 //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
4626 ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
4633 IN PDM_ODM_T pDM_Odm
4637 // For AP/ADSL use prtl8192cd_priv
4638 // For CE/NIC use PADAPTER
4640 //PADAPTER pAdapter = pDM_Odm->Adapter;
4641 // prtl8192cd_priv priv = pDM_Odm->priv;
4643 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
4647 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
4648 // at the same time. In the stage2/3, we need to prive universal interface and merge all
4649 // HW dynamic mechanism.
4651 switch (pDM_Odm->SupportPlatform)
4655 odm_DynamicTxPowerNIC(pDM_Odm);
4658 odm_DynamicTxPowerAP(pDM_Odm);
4662 //odm_DIGAP(pDM_Odm);
4671 odm_DynamicTxPowerNIC(
4672 IN PDM_ODM_T pDM_Odm
4675 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
4678 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
4680 if(pDM_Odm->SupportICType == ODM_RTL8192C)
4682 odm_DynamicTxPower_92C(pDM_Odm);
4684 else if(pDM_Odm->SupportICType == ODM_RTL8192D)
4686 odm_DynamicTxPower_92D(pDM_Odm);
4688 else if (pDM_Odm->SupportICType == ODM_RTL8821)
4690 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
4691 PADAPTER Adapter = pDM_Odm->Adapter;
4692 PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(Adapter);
4694 if (pMgntInfo->RegRspPwr == 1)
4696 if(pDM_Odm->RSSI_Min > 60)
4698 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
4701 else if(pDM_Odm->RSSI_Min < 55)
4703 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
4712 odm_DynamicTxPowerAP(
4713 IN PDM_ODM_T pDM_Odm
4717 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
4718 prtl8192cd_priv priv = pDM_Odm->priv;
4721 if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
4724 #ifdef HIGH_POWER_EXT_PA
4726 tx_power_control(priv);
4730 * Check if station is near by to use lower tx power
4733 if ((priv->up_time % 3) == 0 ) {
4734 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
4735 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
4736 if(IS_STA_VALID(pstat) ) {
4737 if ((pstat->hp_level == 0) && (pstat->rssi > TX_POWER_NEAR_FIELD_THRESH_AP+4))
4738 pstat->hp_level = 1;
4739 else if ((pstat->hp_level == 1) && (pstat->rssi < TX_POWER_NEAR_FIELD_THRESH_AP))
4740 pstat->hp_level = 0;
4750 odm_DynamicTxPower_92C(
4751 IN PDM_ODM_T pDM_Odm
4754 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
4755 PADAPTER Adapter = pDM_Odm->Adapter;
4756 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
4757 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4758 s4Byte UndecoratedSmoothedPWDB;
4760 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
4761 if (pDM_Odm->ExtPA == FALSE)
4764 // STA not connected and AP not connected
4765 if((!pMgntInfo->bMediaConnect) &&
4766 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
4768 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
4769 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4771 //the LastDTPlvl should reset when disconnect,
4772 //otherwise the tx power level wouldn't change when disconnect and connect again.
4773 // Maddest 20091220.
4774 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
4778 #if (INTEL_PROXIMITY_SUPPORT == 1)
4779 // Intel set fixed tx power
4780 if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
4782 switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
4784 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
4785 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
4788 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
4789 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
4792 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
4793 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
4796 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
4797 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
4800 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
4801 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
4804 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
4805 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
4812 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
4813 (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
4814 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
4816 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4820 if(pMgntInfo->bMediaConnect) // Default port
4822 if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
4824 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
4825 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
4829 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
4830 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
4833 else // associated entry pwdb
4835 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
4836 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
4839 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
4841 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
4842 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
4844 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
4845 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
4847 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
4848 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
4850 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
4852 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4853 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
4857 if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
4859 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
4860 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
4861 if( (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
4862 (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
4863 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
4864 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
4865 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
4866 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
4867 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
4869 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
4872 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
4874 #if (RTL8192C_SUPPORT==1)
4875 PADAPTER Adapter = pDM_Odm->Adapter;
4876 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4877 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4878 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
4879 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
4880 int UndecoratedSmoothedPWDB;
4882 if(!pdmpriv->bDynamicTxPowerEnable)
4885 #ifdef CONFIG_INTEL_PROXIM
4886 if(Adapter->proximity.proxim_on== _TRUE){
4887 struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
4888 // Intel set fixed tx power
4889 printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
4890 if(prox_priv!=NULL){
4891 if(prox_priv->proxim_modeinfo->power_output> 0)
4893 switch(prox_priv->proxim_modeinfo->power_output)
4896 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
4897 printk("TxHighPwrLevel_100\n");
4900 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
4901 printk("TxHighPwrLevel_70\n");
4904 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
4905 printk("TxHighPwrLevel_50\n");
4908 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
4909 printk("TxHighPwrLevel_35\n");
4912 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
4913 printk("TxHighPwrLevel_15\n");
4916 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
4917 printk("TxHighPwrLevel_100\n");
4926 // STA not connected and AP not connected
4927 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
4928 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
4930 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
4931 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4933 //the LastDTPlvl should reset when disconnect,
4934 //otherwise the tx power level wouldn't change when disconnect and connect again.
4935 // Maddest 20091220.
4936 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
4940 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
4944 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
4945 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
4947 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
4948 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
4952 UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
4953 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
4956 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
4959 else // associated entry pwdb
4961 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
4962 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
4965 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
4967 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
4968 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
4970 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
4971 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
4973 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
4974 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
4976 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
4978 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
4979 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
4982 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
4984 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
4985 if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
4986 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
4987 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
4988 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
4989 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
4990 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
4992 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
4994 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5000 odm_DynamicTxPower_92D(
5001 IN PDM_ODM_T pDM_Odm
5004 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5005 PADAPTER Adapter = pDM_Odm->Adapter;
5006 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
5007 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5008 s4Byte UndecoratedSmoothedPWDB;
5010 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
5011 BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
5012 u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
5014 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
5015 if (pDM_Odm->ExtPA == FALSE)
5018 // If dynamic high power is disabled.
5019 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
5020 (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
5021 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
5023 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5027 // STA not connected and AP not connected
5028 if((!pMgntInfo->bMediaConnect) &&
5029 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
5031 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
5032 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5034 //the LastDTPlvl should reset when disconnect,
5035 //otherwise the tx power level wouldn't change when disconnect and connect again.
5036 // Maddest 20091220.
5037 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
5041 if(pMgntInfo->bMediaConnect) // Default port
5043 if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
5045 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
5046 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
5050 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
5051 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
5054 else // associated entry pwdb
5056 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
5057 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
5060 if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
5061 if(UndecoratedSmoothedPWDB >= 0x33)
5063 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
5064 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
5066 else if((UndecoratedSmoothedPWDB <0x33) &&
5067 (UndecoratedSmoothedPWDB >= 0x2b) )
5069 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
5070 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
5072 else if(UndecoratedSmoothedPWDB < 0x2b)
5074 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5075 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
5082 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
5084 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
5085 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
5087 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
5088 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
5090 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
5091 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
5093 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
5095 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5096 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
5101 //sherry delete flag 20110517
5102 if(bGetValueFromBuddyAdapter)
5104 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
5105 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
5107 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
5108 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
5109 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
5110 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
5111 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
5112 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
5116 if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
5118 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
5119 if(Adapter->DualMacSmartConcurrent == TRUE)
5121 if(BuddyAdapter == NULL)
5123 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
5124 if(!Adapter->bSlaveOfDMSP)
5126 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
5131 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
5133 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
5134 if(Adapter->bSlaveOfDMSP)
5136 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
5137 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
5138 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
5142 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
5143 if(!bGetValueFromBuddyAdapter)
5145 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
5146 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
5152 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
5153 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
5159 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
5163 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
5164 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
5165 #if (RTL8192D_SUPPORT==1)
5166 PADAPTER Adapter = pDM_Odm->Adapter;
5167 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5168 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
5170 struct dm_priv *pdmpriv = &pHalData->dmpriv;
5171 DM_ODM_T *podmpriv = &pHalData->odmpriv;
5172 int UndecoratedSmoothedPWDB;
5173 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
5174 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
5175 BOOLEAN bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
5176 u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
5179 // If dynamic high power is disabled.
5180 if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
5181 (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
5183 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5187 // STA not connected and AP not connected
5188 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
5189 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
5191 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
5192 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5193 //the LastDTPlvl should reset when disconnect,
5194 //otherwise the tx power level wouldn't change when disconnect and connect again.
5195 // Maddest 20091220.
5196 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
5200 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
5204 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
5205 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
5207 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
5208 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
5212 UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
5213 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
5216 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
5219 else // associated entry pwdb
5221 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
5222 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
5224 #if TX_POWER_FOR_5G_BAND == 1
5225 if(pHalData->CurrentBandType92D == BAND_ON_5G){
5226 if(UndecoratedSmoothedPWDB >= 0x33)
5228 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
5229 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
5231 else if((UndecoratedSmoothedPWDB <0x33) &&
5232 (UndecoratedSmoothedPWDB >= 0x2b) )
5234 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
5235 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
5237 else if(UndecoratedSmoothedPWDB < 0x2b)
5239 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5240 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
5246 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
5248 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
5249 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
5251 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
5252 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
5254 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
5255 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
5257 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
5259 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
5260 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
5263 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
5264 if(bGetValueFromBuddyAdapter)
5266 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
5267 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
5269 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
5270 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
5271 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
5272 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
5273 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
5274 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
5279 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
5281 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
5282 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
5283 if(BuddyAdapter == NULL)
5285 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
5286 if(!Adapter->bSlaveOfDMSP)
5288 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
5293 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
5295 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
5296 if(Adapter->bSlaveOfDMSP)
5298 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
5299 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
5300 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
5304 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
5305 if(!bGetValueFromBuddyAdapter)
5307 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
5308 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
5314 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
5315 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
5319 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
5322 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
5324 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5329 //3============================================================
5331 //3============================================================
5334 odm_RSSIDumpToRegister(
5335 IN PDM_ODM_T pDM_Odm
5338 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5339 PADAPTER Adapter = pDM_Odm->Adapter;
5341 if(pDM_Odm->SupportICType == ODM_RTL8812)
5343 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);
5344 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);
5347 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);
5348 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);
5351 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
5352 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
5355 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);
5356 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);
5359 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);
5360 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);
5362 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
5364 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);
5365 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);
5367 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);
5368 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);
5370 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));
5371 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));
5373 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);
5374 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);
5376 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);
5377 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);
5384 odm_RSSIMonitorInit(
5385 IN PDM_ODM_T pDM_Odm
5388 pRA_T pRA_Table = &pDM_Odm->DM_RA_Table;
5390 pRA_Table->firstconnect = FALSE;
5395 odm_RSSIMonitorCheck(
5396 IN PDM_ODM_T pDM_Odm
5400 // For AP/ADSL use prtl8192cd_priv
5401 // For CE/NIC use PADAPTER
5404 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
5408 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
5409 // at the same time. In the stage2/3, we need to prive universal interface and merge all
5410 // HW dynamic mechanism.
5412 switch (pDM_Odm->SupportPlatform)
5415 odm_RSSIMonitorCheckMP(pDM_Odm);
5419 odm_RSSIMonitorCheckCE(pDM_Odm);
5423 odm_RSSIMonitorCheckAP(pDM_Odm);
5427 //odm_DIGAP(pDM_Odm);
5431 } // odm_RSSIMonitorCheck
5435 odm_RSSIMonitorCheckMP(
5436 IN PDM_ODM_T pDM_Odm
5439 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5440 PADAPTER Adapter = pDM_Odm->Adapter;
5441 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5442 PRT_WLAN_STA pEntry;
5444 s4Byte tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
5445 u1Byte H2C_Parameter[4] ={0};
5446 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
5447 u8Byte curTxOkCnt = 0, curRxOkCnt = 0;
5449 BOOLEAN FirstConnect;
5450 pRA_T pRA_Table = &pDM_Odm->DM_RA_Table;
5451 #if (BEAMFORMING_SUPPORT == 1)
5452 BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;
5456 RT_DISP(FDM, DM_PWDB, ("pHalData->UndecoratedSmoothedPWDB = 0x%x( %d)\n",
5457 pHalData->UndecoratedSmoothedPWDB,
5458 pHalData->UndecoratedSmoothedPWDB));
5460 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
5461 curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
5462 pMgntInfo->lastTxOkCnt = curTxOkCnt;
5463 pMgntInfo->lastRxOkCnt = curRxOkCnt;
5465 RT_DISP(FDM, DM_PWDB, ("Tx = %d Rx = %d\n", curTxOkCnt, curRxOkCnt));
5467 FirstConnect = (pHalData->bLinked) && (pRA_Table->firstconnect == FALSE);
5468 pRA_Table->firstconnect = pHalData->bLinked;
5469 H2C_Parameter[3] |= FirstConnect << 5;
5471 if(pDM_Odm->SupportICType == ODM_RTL8188E && (pMgntInfo->CustomerID==RT_CID_819x_HP))
5473 if(curRxOkCnt >(curTxOkCnt*6))
5474 PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);
5476 PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);
5479 if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
5481 if(curRxOkCnt >(curTxOkCnt*6))
5482 H2C_Parameter[3]=0x01;
5484 H2C_Parameter[3]=0x00;
5487 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
5489 if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
5491 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
5495 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
5500 if(pEntry->bAssociated)
5503 RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);
5504 RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n",
5505 pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));
5507 if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
5510 #if (BEAMFORMING_SUPPORT == 1)
5511 Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pEntry->AssociatedMacId);
5512 if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
5517 H2C_Parameter[3] |= TxBF_EN << 6;
5524 if(IS_WIRELESS_MODE_AC(Adapter))
5525 STBC_TX = TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX);
5527 STBC_TX = TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX);
5530 H2C_Parameter[3] |= STBC_TX << 1;
5533 if(pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
5534 tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
5535 if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
5536 tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
5538 H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);
5539 H2C_Parameter[1] = 0x20; // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
5540 H2C_Parameter[0] = (pEntry->AssociatedMacId);
5541 if(pDM_Odm->SupportICType == ODM_RTL8812)
5542 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
5543 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
5544 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
5546 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
5555 if(tmpEntryMaxPWDB != 0) // If associated entry is found
5557 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
5558 RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n", tmpEntryMaxPWDB, tmpEntryMaxPWDB));
5562 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;
5565 if(tmpEntryMinPWDB != 0xff) // If associated entry is found
5567 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
5568 RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));
5573 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;
5576 // Indicate Rx signal strength to FW.
5577 if(pHalData->bUseRAMask)
5579 if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
5581 PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo);
5582 PRT_VERY_HIGH_THROUGHPUT pVHTInfo = GET_VHT_INFO(pMgntInfo);
5584 #if (BEAMFORMING_SUPPORT == 1)
5586 Beamform_cap = Beamforming_GetEntryBeamCapByMacId(pMgntInfo, pMgntInfo->mMacId);
5588 if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
5593 H2C_Parameter[3] |= TxBF_EN << 6;
5600 if(IS_WIRELESS_MODE_AC(Adapter))
5601 STBC_TX = TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX);
5603 STBC_TX = TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX);
5606 H2C_Parameter[3] |= STBC_TX << 1;
5609 H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);
5610 H2C_Parameter[1] = 0x20; // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
5611 H2C_Parameter[0] = 0; // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
5612 if(pDM_Odm->SupportICType == ODM_RTL8812)
5613 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
5614 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
5615 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);
5617 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
5621 PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);
5624 if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E))
5625 odm_RSSIDumpToRegister(pDM_Odm);
5627 odm_FindMinimumRSSI(Adapter);
5628 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)pHalData->bLinked);
5629 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)pHalData->MinUndecoratedPWDBForDM);
5630 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5633 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
5635 //sherry move from DUSC to here 20110517
5638 FindMinimumRSSI_Dmsp(
5639 IN PADAPTER pAdapter
5643 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
5644 struct dm_priv *pdmpriv = &pHalData->dmpriv;
5645 s32 Rssi_val_min_back_for_mac0;
5646 BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(pAdapter);
5647 BOOLEAN bRestoreRssi = _FALSE;
5648 PADAPTER BuddyAdapter = pAdapter->BuddyAdapter;
5650 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
5652 if(BuddyAdapter!= NULL)
5654 if(pHalData->bSlaveOfDMSP)
5656 //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("bSlavecase of dmsp\n"));
5657 BuddyAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP = pdmpriv->MinUndecoratedPWDBForDM;
5661 if(bGetValueFromBuddyAdapter)
5663 //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("get new RSSI\n"));
5664 bRestoreRssi = _TRUE;
5665 Rssi_val_min_back_for_mac0 = pdmpriv->MinUndecoratedPWDBForDM;
5666 pdmpriv->MinUndecoratedPWDBForDM = pAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP;
5675 bRestoreRssi = _FALSE;
5676 pdmpriv->MinUndecoratedPWDBForDM = Rssi_val_min_back_for_mac0;
5683 IN PADAPTER pAdapter
5686 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
5687 struct dm_priv *pdmpriv = &pHalData->dmpriv;
5688 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
5690 //1 1.Determine the minimum RSSI
5692 if((pDM_Odm->bLinked != _TRUE) &&
5693 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
5695 pdmpriv->MinUndecoratedPWDBForDM = 0;
5696 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
5700 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
5703 //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);
5704 //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));
5709 odm_RSSIMonitorCheckCE(
5710 IN PDM_ODM_T pDM_Odm
5713 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
5714 PADAPTER Adapter = pDM_Odm->Adapter;
5715 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5716 struct dm_priv *pdmpriv = &pHalData->dmpriv;
5717 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
5719 int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
5721 u32 UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;
5722 u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
5723 BOOLEAN FirstConnect = FALSE;
5724 pRA_T pRA_Table = &pDM_Odm->DM_RA_Table;
5726 if(pDM_Odm->bLinked != _TRUE)
5729 #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
5730 if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
5732 u64 curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;
5733 u64 curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;
5735 if(curRxOkCnt >(curTxOkCnt*6))
5742 FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);
5743 pRA_Table->firstconnect = pDM_Odm->bLinked;
5745 //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
5748 struct sta_info *psta;
5750 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
5751 if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))
5753 if(IS_MCAST( psta->hwaddr)) //if(psta->mac_id ==1)
5756 if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))
5759 if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
5760 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
5762 if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
5763 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
5766 DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,
5767 psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);
5770 if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
5772 #ifdef CONFIG_80211N_HT
5773 if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)
5775 #ifdef CONFIG_BEAMFORMING
5776 BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id);
5778 if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))
5789 #ifdef CONFIG_80211AC_VHT
5790 if(IsSupportedVHT(psta->wireless_mode))
5791 STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);
5794 STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);
5799 if(pDM_Odm->SupportICType == ODM_RTL8192D)
5800 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
5801 else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))
5802 PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) |(STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30));
5804 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
5810 _list *plist, *phead;
5811 struct sta_info *psta;
5812 struct sta_priv *pstapriv = &Adapter->stapriv;
5813 u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
5815 _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
5817 for(i=0; i< NUM_STA; i++)
5819 phead = &(pstapriv->sta_hash[i]);
5820 plist = get_next(phead);
5822 while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
5824 psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
5826 plist = get_next(plist);
5828 if(_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) ||
5829 _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
5832 if(psta->state & WIFI_ASOC_STATE)
5835 if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
5836 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
5838 if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
5839 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
5841 if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){
5842 //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);
5843 #if(RTL8192D_SUPPORT==1)
5844 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
5846 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
5855 _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
5858 //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);
5860 for(i=0; i< sta_cnt; i++)
5862 if(PWDB_rssi[i] != (0)){
5863 if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW
5865 #if(RTL8192D_SUPPORT==1)
5866 if(pDM_Odm->SupportICType == ODM_RTL8192D){
5867 FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));
5871 #if((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
5872 if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8723A)){
5873 rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
5877 #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
5878 if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)){
5879 PWDB_rssi[i] |= (UL_DL_STATE << 24);
5880 rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
5883 #if(RTL8192E_SUPPORT==1)
5884 if(pDM_Odm->SupportICType == ODM_RTL8192E){
5885 rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
5888 #if(RTL8723B_SUPPORT==1)
5889 if(pDM_Odm->SupportICType == ODM_RTL8723B){
5890 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
5895 #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))
5896 if(pDM_Odm->SupportICType == ODM_RTL8188E){
5897 ODM_RA_SetRSSI_8188E(
5898 &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));
5908 if(tmpEntryMaxPWDB != 0) // If associated entry is found
5910 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
5914 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
5917 if(tmpEntryMinPWDB != 0xff) // If associated entry is found
5919 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
5923 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
5926 FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM
5928 #if(RTL8192D_SUPPORT==1)
5929 FindMinimumRSSI_Dmsp(Adapter);
5931 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
5932 //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
5933 #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)
5936 odm_RSSIMonitorCheckAP(
5937 IN PDM_ODM_T pDM_Odm
5940 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
5941 #ifdef CONFIG_RTL_92C_SUPPORT || defined(CONFIG_RTL_92D_SUPPORT)
5946 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
5948 pstat = pDM_Odm->pODM_StaInfo[i];
5949 if(IS_STA_VALID(pstat) )
5952 if (REMAP_AID(pstat) < (FW_NUM_STAT - 1))
5954 add_update_rssi(pDM_Odm->priv, pstat);
5967 IN PDM_ODM_T pDM_Odm
5970 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
5971 #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
5972 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B,
5973 (RT_TIMER_CALL_BACK)ODM_SW_AntDiv_Callback, NULL, "SwAntennaSwitchTimer_8723B");
5977 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
5978 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
5979 (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
5982 #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
5983 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
5984 #if (RTL8188E_SUPPORT == 1)
5985 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,
5986 (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");
5991 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
5992 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer,
5993 (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");
5996 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
5998 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer,
5999 (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");
6001 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer,
6002 (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");
6004 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer,
6005 (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer");
6007 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,
6008 (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer");
6013 ODM_CancelAllTimers(
6014 IN PDM_ODM_T pDM_Odm
6017 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6019 // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in
6022 HAL_ADAPTER_STS_CHK(pDM_Odm)
6024 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
6025 #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
6026 ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
6030 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
6031 ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
6034 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6036 #if (RTL8188E_SUPPORT == 1)
6037 ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
6039 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
6042 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
6044 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
6046 ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
6048 ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
6050 ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
6056 ODM_ReleaseAllTimers(
6057 IN PDM_ODM_T pDM_Odm
6060 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
6061 #if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
6062 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer_8723B);
6066 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
6067 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
6070 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6072 #if (RTL8188E_SUPPORT == 1)
6073 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
6076 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);
6079 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
6081 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
6083 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
6085 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);
6087 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
6092 //3============================================================
6093 //3 Tx Power Tracking
6094 //3============================================================
6098 IN PDM_ODM_T pDM_Odm
6101 PADAPTER Adapter = pDM_Odm->Adapter;
6103 if(!IS_HARDWARE_TYPE_JAGUAR(Adapter))
6105 else if(IS_HARDWARE_TYPE_8812AU(Adapter))
6107 #if (RTL8821A_SUPPORT == 1)
6108 if(pDM_Odm->bLinked)
6110 if((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess))
6112 pDM_Odm->preChannel = *pDM_Odm->pChannel;
6113 pDM_Odm->LinkedInterval = 0;
6116 if(pDM_Odm->LinkedInterval < 3)
6117 pDM_Odm->LinkedInterval++;
6119 if(pDM_Odm->LinkedInterval == 2)
6121 // Mark out IQK flow to prevent tx stuck. by Maddest 20130306
6122 // Open it verified by James 20130715
6123 PHY_IQCalibrate_8821A(Adapter, FALSE);
6127 pDM_Odm->LinkedInterval = 0;
6133 odm_TXPowerTrackingInit(
6134 IN PDM_ODM_T pDM_Odm
6137 odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
6142 IN PDM_ODM_T pDM_Odm
6145 PADAPTER Adapter = pDM_Odm->Adapter;
6146 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6149 u4Byte swingTableSize;
6150 pu4Byte pSwingTable;
6152 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
6153 pDM_Odm->SupportICType == ODM_RTL8192E)
6155 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
6157 pSwingTable = OFDMSwingTable_New;
6158 swingTableSize = OFDM_TABLE_SIZE;
6160 #if ((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))
6161 if (pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)
6163 bbSwing = PHY_GetTxBBSwing_8812A(Adapter, pHalData->CurrentBandType, ODM_RF_PATH_A);
6164 pSwingTable = TxScalingTable_Jaguar;
6165 swingTableSize = TXSCALE_TABLE_SIZE;
6171 pSwingTable = OFDMSwingTable;
6172 swingTableSize = OFDM_TABLE_SIZE;
6176 for (i = 0; i < swingTableSize; ++i) {
6177 u4Byte tableValue = pSwingTable[i];
6179 if (tableValue >= 0x100000 )
6181 if (bbSwing == tableValue)
6188 odm_TXPowerTrackingThermalMeterInit(
6189 IN PDM_ODM_T pDM_Odm
6192 u1Byte defaultSwingIndex = getSwingIndex(pDM_Odm);
6194 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6195 PADAPTER Adapter = pDM_Odm->Adapter;
6196 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6198 #if MP_DRIVER != 1 //for mp driver, turn off txpwrtracking as default
6199 pHalData->TxPowerTrackControl = TRUE;
6201 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
6202 PADAPTER Adapter = pDM_Odm->Adapter;
6203 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6206 if (pDM_Odm->SupportICType >= ODM_RTL8188E)
6208 pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
6209 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
6210 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
6211 //#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
6212 if ( *(pDM_Odm->mp_mode) != 1)
6213 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
6214 //#endif//#if (MP_DRIVER != 1)
6215 MSG_8192C("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
6219 struct dm_priv *pdmpriv = &pHalData->dmpriv;
6221 pdmpriv->bTXPowerTracking = _TRUE;
6222 pdmpriv->TXPowercount = 0;
6223 pdmpriv->bTXPowerTrackingInit = _FALSE;
6224 //#if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
6226 if (*(pDM_Odm->mp_mode) != 1)
6227 pdmpriv->TxPowerTrackControl = _TRUE;
6228 //#endif//#if (MP_DRIVER != 1)
6230 //MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
6233 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
6234 #ifdef RTL8188E_SUPPORT
6236 pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
6237 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
6238 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
6239 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
6244 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
6245 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
6246 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
6247 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
6249 // The index of "0 dB" in SwingTable.
6250 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723B ||
6251 pDM_Odm->SupportICType == ODM_RTL8192E)
6253 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
6254 pDM_Odm->DefaultCckIndex = 20;
6258 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= TXSCALE_TABLE_SIZE) ? 24 : defaultSwingIndex;
6259 pDM_Odm->DefaultCckIndex = 24;
6262 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
6263 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
6265 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
6267 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
6268 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
6269 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
6270 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
6271 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
6278 ODM_TXPowerTrackingCheck(
6279 IN PDM_ODM_T pDM_Odm
6283 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
6284 // at the same time. In the stage2/3, we need to prive universal interface and merge all
6285 // HW dynamic mechanism.
6287 switch (pDM_Odm->SupportPlatform)
6290 odm_TXPowerTrackingCheckMP(pDM_Odm);
6294 odm_TXPowerTrackingCheckCE(pDM_Odm);
6298 odm_TXPowerTrackingCheckAP(pDM_Odm);
6302 //odm_DIGAP(pDM_Odm);
6309 odm_TXPowerTrackingCheckCE(
6310 IN PDM_ODM_T pDM_Odm
6313 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
6314 PADAPTER Adapter = pDM_Odm->Adapter;
6315 #if( (RTL8192C_SUPPORT==1) || (RTL8723A_SUPPORT==1) )
6316 if(IS_HARDWARE_TYPE_8192C(Adapter)){
6317 rtl8192c_odm_CheckTXPowerTracking(Adapter);
6322 #if (RTL8192D_SUPPORT==1)
6323 if(IS_HARDWARE_TYPE_8192D(Adapter)){
6324 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
6325 if(!Adapter->bSlaveOfDMSP)
6327 rtl8192d_odm_CheckTXPowerTracking(Adapter);
6332 #if(((RTL8188E_SUPPORT==1) || (RTL8812A_SUPPORT==1) || (RTL8821A_SUPPORT==1) || (RTL8192E_SUPPORT==1) || (RTL8723B_SUPPORT==1) ))
6333 if(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
6338 if(!pDM_Odm->RFCalibrateInfo.TM_Trigger) //at least delay 1 sec
6340 //pHalData->TxPowerCheckCnt++; //cosa add for debug
6341 if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter)||IS_HARDWARE_TYPE_8723B(Adapter))
6342 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
6344 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_T_METER_OLD, bRFRegOffsetMask, 0x60);
6346 //DBG_871X("Trigger Thermal Meter!!\n");
6348 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
6353 //DBG_871X("Schedule TxPowerTracking direct call!!\n");
6354 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
6355 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
6362 odm_TXPowerTrackingCheckMP(
6363 IN PDM_ODM_T pDM_Odm
6366 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6367 PADAPTER Adapter = pDM_Odm->Adapter;
6369 if (ODM_CheckPowerStatus(Adapter) == FALSE)
6371 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("===>ODM_CheckPowerStatus() return FALSE\n"));
6375 if(IS_HARDWARE_TYPE_8723A(Adapter))
6378 if(!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE)
6379 odm_TXPowerTrackingThermalMeterCheck(Adapter);
6381 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD, ("!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == FALSE\n"));
6389 odm_TXPowerTrackingCheckAP(
6390 IN PDM_ODM_T pDM_Odm
6393 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
6394 prtl8192cd_priv priv = pDM_Odm->priv;
6396 if ( (priv->pmib->dot11RFEntry.ther) && ((priv->up_time % priv->pshare->rf_ft_var.tpt_period) == 0)){
6397 #ifdef CONFIG_RTL_92D_SUPPORT
6398 if (GET_CHIP_VER(priv)==VERSION_8192D){
6399 tx_power_tracking_92D(priv);
6403 #ifdef CONFIG_RTL_92C_SUPPORT
6404 tx_power_tracking(priv);
6414 //antenna mapping info
6415 // 1: right-side antenna
6416 // 2/0: left-side antenna
6417 //PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt: for right-side antenna: Ant:1 RxDefaultAnt1
6418 //PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt: for left-side antenna: Ant:0 RxDefaultAnt2
6419 // We select left antenna as default antenna in initial process, modify it as needed
6422 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
6425 odm_TXPowerTrackingThermalMeterCheck(
6429 #ifndef AP_BUILD_WORKAROUND
6430 static u1Byte TM_Trigger = 0;
6432 if(!(GET_HAL_DATA(Adapter)->DM_OutSrc.SupportAbility & ODM_RF_TX_PWR_TRACK))
6434 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,
6435 ("===>odm_TXPowerTrackingThermalMeterCheck(),pMgntInfo->bTXPowerTracking is FALSE, return!!\n"));
6439 if(!TM_Trigger) //at least delay 1 sec
6441 if(IS_HARDWARE_TYPE_8192D(Adapter))
6442 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_92D, BIT17 | BIT16, 0x03);
6443 else if(IS_HARDWARE_TYPE_8188E(Adapter) || IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8192E(Adapter) ||
6444 IS_HARDWARE_TYPE_8723B(Adapter))
6445 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
6447 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
6449 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger Thermal Meter!!\n"));
6456 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));
6457 odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
6463 // Only for 8723A SW ANT DIV INIT--2012--07--17
6465 odm_SwAntDivInit_NIC_8723A(
6466 IN PDM_ODM_T pDM_Odm)
6468 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6469 PADAPTER Adapter = pDM_Odm->Adapter;
6471 u1Byte btAntNum=BT_GetPgAntNum(Adapter);
6473 if(IS_HARDWARE_TYPE_8723A(Adapter))
6475 pDM_SWAT_Table->ANTA_ON =TRUE;
6477 // Set default antenna B status by PG
6479 pDM_SWAT_Table->ANTB_ON = TRUE;
6480 else if(btAntNum == 1)
6481 pDM_SWAT_Table->ANTB_ON = FALSE;
6483 pDM_SWAT_Table->ANTB_ON = TRUE;
6492 //3============================================================
6493 //3 SW Antenna Diversity
6494 //3============================================================
6495 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
6498 IN PDM_ODM_T pDM_Odm
6501 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
6502 odm_SwAntDivInit_NIC(pDM_Odm);
6503 #elif(DM_ODM_SUPPORT_TYPE == ODM_AP)
6504 dm_SW_AntennaSwitchInit(pDM_Odm->priv);
6509 odm_SwAntDivInit_NIC(
6510 IN PDM_ODM_T pDM_Odm
6513 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6516 // Init SW ANT DIV mechanism for 8723AE/AU/AS
6517 // Neil Chen--2012--07--17---
6518 // CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
6519 //#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
6520 #if (RTL8723A_SUPPORT==1)
6521 if(pDM_Odm->SupportICType == ODM_RTL8723A)
6523 odm_SwAntDivInit_NIC_8723A(pDM_Odm);
6526 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
6527 pDM_SWAT_Table->RSSI_sum_A = 0;
6528 pDM_SWAT_Table->RSSI_cnt_A = 0;
6529 pDM_SWAT_Table->RSSI_sum_B = 0;
6530 pDM_SWAT_Table->RSSI_cnt_B = 0;
6531 pDM_SWAT_Table->CurAntenna = MAIN_ANT;
6532 pDM_SWAT_Table->PreAntenna = MAIN_ANT;
6533 pDM_SWAT_Table->try_flag = 0xff;
6534 pDM_SWAT_Table->PreRSSI = 0;
6535 pDM_SWAT_Table->SWAS_NoLink_State = 0;
6536 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
6537 pDM_SWAT_Table->SelectAntennaMap=0xAA;
6538 pDM_SWAT_Table->lastTxOkCnt = 0;
6539 pDM_SWAT_Table->lastRxOkCnt = 0;
6540 pDM_SWAT_Table->TXByteCnt_A = 0;
6541 pDM_SWAT_Table->TXByteCnt_B = 0;
6542 pDM_SWAT_Table->RXByteCnt_A = 0;
6543 pDM_SWAT_Table->RXByteCnt_B = 0;
6544 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
6545 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
6551 // Add new function to reset the state of antenna diversity before link.
6554 ODM_SwAntDivResetBeforeLink(
6555 IN PDM_ODM_T pDM_Odm
6559 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6561 pDM_SWAT_Table->SWAS_NoLink_State = 0;
6566 // 20100514 Luke/Joseph:
6567 // Add new function to reset antenna diversity state after link.
6570 ODM_SwAntDivRestAfterLink(
6571 IN PDM_ODM_T pDM_Odm
6574 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6575 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
6578 if(pDM_Odm->SupportICType == ODM_RTL8723A)
6580 pDM_SWAT_Table->RSSI_cnt_A = 0;
6581 pDM_SWAT_Table->RSSI_cnt_B = 0;
6582 pDM_Odm->RSSI_test = FALSE;
6583 pDM_SWAT_Table->try_flag = 0xff;
6584 pDM_SWAT_Table->RSSI_Trying = 0;
6585 pDM_SWAT_Table->SelectAntennaMap=0xAA;
6588 else if(pDM_Odm->SupportICType & (ODM_RTL8723B|ODM_RTL8821))
6590 pDM_Odm->RSSI_test = FALSE;
6591 pDM_SWAT_Table->try_flag = 0xff;
6592 pDM_SWAT_Table->RSSI_Trying = 0;
6593 pDM_SWAT_Table->Double_chk_flag= 0;
6595 pDM_FatTable->RxIdleAnt=MAIN_ANT;
6597 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
6599 pDM_FatTable->MainAnt_Sum[i] = 0;
6600 pDM_FatTable->AuxAnt_Sum[i] = 0;
6601 pDM_FatTable->MainAnt_Cnt[i] = 0;
6602 pDM_FatTable->AuxAnt_Cnt[i] = 0;
6609 odm_SwAntDetectInit(
6610 IN PDM_ODM_T pDM_Odm
6613 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6614 #if (RTL8723B_SUPPORT == 1)
6615 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);
6617 pDM_SWAT_Table->PreAntenna = MAIN_ANT;
6618 pDM_SWAT_Table->CurAntenna = MAIN_ANT;
6619 pDM_SWAT_Table->SWAS_NoLink_State = 0;
6623 ODM_SwAntDivChkPerPktRssi(
6624 IN PDM_ODM_T pDM_Odm,
6625 IN u1Byte StationID,
6626 IN PODM_PHY_INFO_T pPhyInfo
6629 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6631 if(!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
6634 // temporary Fix 8723A MP SW ANT DIV Bug --NeilChen--2012--07--11
6635 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
6636 if(pDM_Odm->SupportICType == ODM_RTL8723A)
6638 //if(StationID == pDM_SWAT_Table->RSSI_target)
6640 //1 RSSI for SW Antenna Switch
6641 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
6643 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
6644 pDM_SWAT_Table->RSSI_cnt_A++;
6648 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
6649 pDM_SWAT_Table->RSSI_cnt_B++;
6656 if(StationID == pDM_SWAT_Table->RSSI_target)
6658 //1 RSSI for SW Antenna Switch
6659 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
6661 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
6662 pDM_SWAT_Table->RSSI_cnt_A++;
6666 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
6667 pDM_SWAT_Table->RSSI_cnt_B++;
6673 if(StationID == pDM_SWAT_Table->RSSI_target)
6675 //1 RSSI for SW Antenna Switch
6676 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
6678 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
6679 pDM_SWAT_Table->RSSI_cnt_A++;
6683 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
6684 pDM_SWAT_Table->RSSI_cnt_B++;
6693 odm_SwAntDivChkAntSwitch(
6694 IN PDM_ODM_T pDM_Odm,
6699 // For AP/ADSL use prtl8192cd_priv
6700 // For CE/NIC use PADAPTER
6702 prtl8192cd_priv priv = pDM_Odm->priv;
6705 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
6706 // at the same time. In the stage2/3, we need to prive universal interface and merge all
6707 // HW dynamic mechanism.
6709 switch (pDM_Odm->SupportPlatform)
6712 odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
6715 odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
6720 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP |ODM_ADSL))
6721 if (priv->pshare->rf_ft_var.antSw_enable && (priv->up_time % 4==1))
6722 dm_SW_AntennaSwitch(priv, SWAW_STEP_PEAK);
6730 // 20100514 Luke/Joseph:
6731 // Add new function for antenna diversity after link.
6732 // This is the main function of antenna diversity after link.
6733 // This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
6734 // HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
6735 // In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
6736 // After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
6737 // listened on the air with the RSSI of original antenna.
6738 // It chooses the antenna with better RSSI.
6739 // There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
6740 // penalty to get next try.
6745 IN PDM_ODM_T pDM_Odm,
6748 ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna);
6752 odm_SwAntDivChkAntSwitchNIC(
6753 IN PDM_ODM_T pDM_Odm,
6757 #if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
6758 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
6759 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6761 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
6762 PADAPTER Adapter=pDM_Odm->Adapter;
6765 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
6766 s4Byte curRSSI=100, RSSI_A, RSSI_B;
6767 u1Byte nextAntenna=AUX_ANT;
6768 //static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
6769 u8Byte curTxOkCnt=0, curRxOkCnt=0;
6770 //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
6771 u8Byte CurByteCnt=0, PreByteCnt=0;
6772 //static u1Byte TrafficLoad = TRAFFIC_LOW;
6773 u1Byte Score_A=0, Score_B=0; //A: Main; B: AUX
6776 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
6779 if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
6782 if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
6785 if(pDM_Odm->SupportPlatform & ODM_WIN)
6787 if(*(pDM_Odm->pAntennaTest))
6791 if((pDM_SWAT_Table->ANTA_ON == FALSE) ||(pDM_SWAT_Table->ANTB_ON == FALSE))
6793 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
6794 ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
6798 // Radio off: Status reset to default and return.
6799 if(*(pDM_Odm->pbPowerSaving)==TRUE) //pHalData->eRFPowerState==eRfOff
6801 ODM_SwAntDivRestAfterLink(pDM_Odm);
6806 // Handling step mismatch condition.
6807 // Peak step is not finished at last time. Recover the variable and check again.
6808 if( Step != pDM_SWAT_Table->try_flag )
6810 ODM_SwAntDivRestAfterLink(pDM_Odm);
6813 #if (DM_ODM_SUPPORT_TYPE &( ODM_WIN| ODM_CE ))
6815 if(pDM_SWAT_Table->try_flag == 0xff)
6817 pDM_SWAT_Table->RSSI_target = 0xff;
6819 #if(DM_ODM_SUPPORT_TYPE & ODM_CE)
6822 PSTA_INFO_T pEntry = NULL;
6825 for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
6827 pEntry = pDM_Odm->pODM_StaInfo[index];
6828 if(IS_STA_VALID(pEntry) ) {
6834 ODM_SwAntDivRestAfterLink(pDM_Odm);
6835 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
6840 pDM_SWAT_Table->RSSI_target = index;
6841 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
6844 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
6846 PADAPTER pAdapter = pDM_Odm->Adapter;
6847 PMGNT_INFO pMgntInfo=&pAdapter->MgntInfo;
6849 // Select RSSI checking target
6850 if(pMgntInfo->mAssoc && !ACTING_AS_AP(pAdapter))
6852 // Target: Infrastructure mode AP.
6853 //pDM_SWAT_Table->RSSI_target = NULL;
6854 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): RSSI_target is DEF AP!\n"));
6859 PSTA_INFO_T pEntry = NULL;
6860 PADAPTER pTargetAdapter = NULL;
6862 if(pMgntInfo->mIbss )
6864 // Target: AP/IBSS peer.
6865 pTargetAdapter = pAdapter;
6869 pTargetAdapter = GetFirstAPAdapter(pAdapter);
6872 if(pTargetAdapter != NULL)
6874 for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
6877 pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
6880 if(pEntry->bAssociated)
6890 ODM_SwAntDivRestAfterLink(pDM_Odm);
6891 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
6896 //pDM_SWAT_Table->RSSI_target = pEntry;
6897 pDM_SWAT_Table->RSSI_target = index;
6898 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
6900 }//end if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
6905 pDM_SWAT_Table->RSSI_cnt_A = 0;
6906 pDM_SWAT_Table->RSSI_cnt_B = 0;
6907 pDM_SWAT_Table->try_flag = 0;
6908 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
6914 // To Fix 8723A SW ANT DIV Bug issue
6915 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
6916 if (pDM_Odm->SupportICType & ODM_RTL8723A)
6918 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt;
6919 curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt;
6920 pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
6921 pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
6924 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
6925 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
6926 pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
6927 pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
6929 if(pDM_SWAT_Table->try_flag == 1)
6931 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
6933 pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
6934 pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
6938 pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
6939 pDM_SWAT_Table->RXByteCnt_B += curRxOkCnt;
6942 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
6943 pDM_SWAT_Table->RSSI_Trying--;
6944 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
6945 if(pDM_SWAT_Table->RSSI_Trying == 0)
6947 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);
6948 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);
6950 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
6951 //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
6952 PreByteCnt = PreByteCnt*9;
6953 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
6954 //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
6955 PreByteCnt = PreByteCnt*2;
6957 if(pDM_SWAT_Table->RSSI_cnt_A > 0)
6958 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
6961 if(pDM_SWAT_Table->RSSI_cnt_B > 0)
6962 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
6965 curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
6966 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
6967 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
6968 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n",
6969 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
6970 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",
6971 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
6978 if(pDM_SWAT_Table->RSSI_cnt_A > 0)
6979 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
6982 if(pDM_SWAT_Table->RSSI_cnt_B > 0)
6983 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
6986 curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
6987 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
6988 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
6989 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n",
6990 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
6992 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",
6993 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
6994 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
6995 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
6999 if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
7002 if(pDM_SWAT_Table->TestMode == TP_MODE)
7004 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
7005 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
7006 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\n",PreByteCnt));
7007 if(CurByteCnt < PreByteCnt)
7009 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
7010 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
7012 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
7016 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
7017 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
7019 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
7021 for (i= 0; i<8; i++)
7023 if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
7028 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
7029 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Score_A=%d, Score_B=%d\n", Score_A, Score_B));
7031 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
7033 nextAntenna = (Score_A > Score_B)?MAIN_ANT:AUX_ANT;
7037 nextAntenna = (Score_B > Score_A)?AUX_ANT:MAIN_ANT;
7039 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
7040 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n",
7041 //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
7043 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
7045 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
7049 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
7053 if(pDM_SWAT_Table->TestMode == RSSI_MODE)
7055 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
7056 pDM_SWAT_Table->SelectAntennaMap=0xAA;
7057 if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
7059 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
7060 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
7062 else // current anntena is good
7064 nextAntenna =pDM_SWAT_Table->CurAntenna;
7065 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
7068 pDM_SWAT_Table->try_flag = 0;
7069 pDM_Odm->RSSI_test = FALSE;
7070 pDM_SWAT_Table->RSSI_sum_A = 0;
7071 pDM_SWAT_Table->RSSI_cnt_A = 0;
7072 pDM_SWAT_Table->RSSI_sum_B = 0;
7073 pDM_SWAT_Table->RSSI_cnt_B = 0;
7074 pDM_SWAT_Table->TXByteCnt_A = 0;
7075 pDM_SWAT_Table->TXByteCnt_B = 0;
7076 pDM_SWAT_Table->RXByteCnt_A = 0;
7077 pDM_SWAT_Table->RXByteCnt_B = 0;
7082 else if(pDM_SWAT_Table->try_flag == 0)
7084 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
7086 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
7087 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
7089 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
7091 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
7093 if ((curTxOkCnt+curRxOkCnt) > 3750000) //if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
7094 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
7096 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
7098 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
7099 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
7100 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
7102 //Prepare To Try Antenna
7103 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
7104 pDM_SWAT_Table->try_flag = 1;
7105 pDM_Odm->RSSI_test = TRUE;
7106 if((curRxOkCnt+curTxOkCnt) > 1000)
7108 pDM_SWAT_Table->RSSI_Trying = 4;
7109 pDM_SWAT_Table->TestMode = TP_MODE;
7113 pDM_SWAT_Table->RSSI_Trying = 2;
7114 pDM_SWAT_Table->TestMode = RSSI_MODE;
7117 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
7120 pDM_SWAT_Table->RSSI_sum_A = 0;
7121 pDM_SWAT_Table->RSSI_cnt_A = 0;
7122 pDM_SWAT_Table->RSSI_sum_B = 0;
7123 pDM_SWAT_Table->RSSI_cnt_B = 0;
7127 //1 4.Change TRX antenna
7128 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
7130 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
7131 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);
7132 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
7133 ODM_SetAntenna(pDM_Odm,nextAntenna);
7134 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
7137 bEnqueue = (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)?FALSE :TRUE;
7138 rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
7144 //1 5.Reset Statistics
7145 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
7146 pDM_SWAT_Table->CurAntenna = nextAntenna;
7147 pDM_SWAT_Table->PreRSSI = curRSSI;
7149 //1 6.Set next timer
7151 //PADAPTER pAdapter = pDM_Odm->Adapter;
7152 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
7155 if(pDM_SWAT_Table->RSSI_Trying == 0)
7158 if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
7160 if(pDM_SWAT_Table->TestMode == TP_MODE)
7162 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
7164 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
7166 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
7168 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
7170 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
7171 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
7176 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
7177 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
7182 if(pDM_SWAT_Table->TestMode == TP_MODE)
7184 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
7185 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
7186 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
7187 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
7190 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
7193 #endif // #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
7194 #endif // #if (RTL8192C_SUPPORT==1)
7198 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
7201 odm_SwAntDivSelectScanChnl(
7205 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
7206 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
7207 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
7208 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
7209 u1Byte i, j, ScanChannel = 0, ChannelNum = 0;
7210 PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
7211 u1Byte EachChannelSTAs[MAX_SCAN_CHANNEL_NUM] = {0};
7213 if(pMgntInfo->tmpNumBssDesc == 0)
7216 for(i = 0; i < pMgntInfo->tmpNumBssDesc; i++)
7218 ChannelNum = pMgntInfo->tmpbssDesc[i].ChannelNumber;
7219 for(j = 0; j < pChannelList->ChannelLen; j++)
7221 if(pChannelList->ChnlListEntry[j].ChannelNum == ChannelNum)
7223 EachChannelSTAs[j]++;
7229 for(i = 0; i < MAX_SCAN_CHANNEL_NUM; i++)
7231 if(EachChannelSTAs[i] > EachChannelSTAs[ScanChannel])
7235 if(EachChannelSTAs[ScanChannel] == 0)
7237 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("odm_SwAntDivSelectScanChnl(): Scan List is empty.\n"));
7241 ScanChannel = pChannelList->ChnlListEntry[ScanChannel].ChannelNum;
7245 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD,
7246 ("odm_SwAntDivSelectScanChnl(): Channel %d is select as scan channel.\n", ScanChannel));
7256 odm_SwAntDivConstructScanChnl(
7257 IN PADAPTER Adapter,
7262 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
7267 PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
7269 // 20100519 Joseph: Original antenna scanned nothing.
7270 // Test antenna shall scan all channel with half period in this condition.
7271 RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
7272 for(i = 0; i < pChannelList->ChannelLen; i++)
7273 pChannelList->ChnlListEntry[i].ScanPeriod /= 2;
7277 // The using of this CustomizedScanRequest is a trick to rescan the two channels
7278 // under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
7279 CUSTOMIZED_SCAN_REQUEST CustomScanReq;
7281 CustomScanReq.bEnabled = TRUE;
7282 CustomScanReq.Channels[0] = ScanChnl;
7283 CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
7284 CustomScanReq.nChannels = 2;
7285 CustomScanReq.ScanType = SCAN_ACTIVE;
7286 CustomScanReq.Duration = DEFAULT_PASSIVE_SCAN_PERIOD;
7288 RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
7292 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
7295 // 20100514 Luke/Joseph:
7296 // Callback function for 500ms antenna test trying.
7298 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
7300 odm_SwAntDivChkAntSwitchCallback(
7304 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
7305 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
7306 pSWAT_T pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
7308 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
7310 ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
7312 odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
7315 ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
7320 odm_SwAntDivChkAntSwitchWorkitemCallback(
7325 PADAPTER pAdapter = (PADAPTER)pContext;
7326 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
7328 odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
7331 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
7332 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
7334 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
7335 PADAPTER padapter = pDM_Odm->Adapter;
7336 if(padapter->net_closed == _TRUE)
7338 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
7340 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
7341 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
7343 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
7344 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
7348 #else //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
7350 VOID odm_SwAntDivInit( IN PDM_ODM_T pDM_Odm ) {}
7351 VOID ODM_SwAntDivChkPerPktRssi(
7352 IN PDM_ODM_T pDM_Odm,
7353 IN u1Byte StationID,
7354 IN PODM_PHY_INFO_T pPhyInfo
7356 VOID odm_SwAntDivChkAntSwitch(
7357 IN PDM_ODM_T pDM_Odm,
7360 VOID ODM_SwAntDivResetBeforeLink( IN PDM_ODM_T pDM_Odm ){}
7361 VOID ODM_SwAntDivRestAfterLink( IN PDM_ODM_T pDM_Odm ){}
7362 VOID odm_SwAntDetectInit( IN PDM_ODM_T pDM_Odm){}
7363 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
7364 VOID odm_SwAntDivChkAntSwitchCallback( PRT_TIMER pTimer){}
7365 VOID odm_SwAntDivChkAntSwitchWorkitemCallback( IN PVOID pContext ){}
7366 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
7367 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
7368 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
7369 VOID odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
7372 #endif //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
7376 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
7378 ODM_SwAntDivCheckBeforeLink(
7379 IN PDM_ODM_T pDM_Odm
7383 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
7385 PADAPTER Adapter = pDM_Odm->Adapter;
7386 HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter);
7387 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
7388 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
7389 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
7391 PRT_WLAN_BSS pTmpBssDesc, pTestBssDesc;
7392 s4Byte power_diff = 0, power_target = 10;
7393 u1Byte index, counter = 0;
7394 static u1Byte ScanChannel;
7395 u8Byte tStamp_diff = 0;
7398 if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
7399 { // The ODM structure is not initialized.
7403 // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
7404 if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))
7407 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
7408 PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
7409 if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
7411 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
7413 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7414 ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
7415 pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));
7417 pDM_SWAT_Table->SWAS_NoLink_State = 0;
7423 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
7425 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));
7426 //1 Run AntDiv mechanism "Before Link" part.
7427 if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
7429 //1 Prepare to do Scan again to check current antenna state.
7431 // Set check state to next step.
7432 pDM_SWAT_Table->SWAS_NoLink_State = 1;
7434 // Copy Current Scan list.
7435 pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;
7436 PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
7438 // Go back to scan function again.
7439 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));
7440 pMgntInfo->ScanStep=0;
7441 pMgntInfo->bScanAntDetect = TRUE;
7442 ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);
7445 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
7447 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
7448 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
7450 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
7451 if(ScanChannel == 0)
7453 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7454 ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
7456 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
7458 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
7459 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"));
7463 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
7464 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"));
7469 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7470 ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
7472 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))
7474 // Switch Antenna to another one.
7475 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
7476 pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;
7478 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7479 ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
7480 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
7481 if(pDM_Odm->SupportICType == ODM_RTL8192C)
7483 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
7484 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
7486 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
7488 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
7489 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
7490 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
7494 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
7495 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
7501 //1 ScanComple() is called after antenna swiched.
7502 //1 Check scan result and determine which antenna is going
7505 for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)
7507 pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1
7508 pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2
7510 if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
7512 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));
7516 if(pDM_Odm->SupportICType != ODM_RTL8723B)
7518 if(pTmpBssDesc->ChannelNumber == ScanChannel)
7520 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
7522 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));
7523 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
7524 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));
7527 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
7529 else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
7531 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));
7532 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
7533 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));
7538 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)
7540 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
7541 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));
7542 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));
7549 if(pTmpBssDesc->ChannelNumber == ScanChannel)
7551 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
7554 power_diff = power_diff + (pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);
7555 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
7556 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
7557 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
7558 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
7560 else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower)
7563 power_diff = power_diff + (pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);
7564 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
7565 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
7566 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
7568 else if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp)
7570 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
7571 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)
7574 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
7575 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
7576 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf)
7583 if(pDM_Odm->SupportICType == ODM_RTL8723B)
7585 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: %d power_diff: %d\n", counter, power_diff));
7588 power_diff = power_diff / counter;
7590 if(power_diff <= power_target && counter != 0)
7594 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
7596 if(pMgntInfo->NumBssDesc!=0 && Score<0)
7598 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7599 ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
7603 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7604 ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
7606 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
7607 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
7609 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
7612 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
7614 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
7615 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"));
7619 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
7620 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"));
7623 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
7625 pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
7626 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c & 0xfffffffc) | (pDM_SWAT_Table->CurAntenna));
7627 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
7628 ODM_SetBBReg(pDM_Odm, rDPDT_control,bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c);
7632 if(pMgntInfo->NumBssDesc != 0 && Score > 0)
7634 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
7636 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
7637 pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
7639 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
7643 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
7645 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
7646 pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
7647 BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);
7649 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
7653 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Igone result\n"));
7655 else if(pDM_Odm->SupportICType == ODM_RTL8192C)
7657 if(pMgntInfo->NumBssDesc!=0 && Score<=0)
7659 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7660 ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));
7662 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
7666 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
7667 ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));
7669 pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
7671 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
7672 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
7673 PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
7677 // Check state reset to default and wait for next time.
7678 pDM_SWAT_Table->SWAS_NoLink_State = 0;
7679 pMgntInfo->bScanAntDetect = FALSE;
7691 #endif //#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
7694 //3============================================================
7695 //3 SW Antenna Diversity
7696 //3============================================================
7698 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
7700 odm_InitHybridAntDiv_88C_92D(
7701 IN PDM_ODM_T pDM_Odm
7705 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
7706 struct rtl8192cd_priv *priv=pDM_Odm->priv;
7708 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
7709 u1Byte bTxPathSel=0; //0:Path-A 1:Path-B
7712 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
7714 //whether to do antenna diversity or not
7715 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
7716 if(priv==NULL) return;
7717 if(!priv->pshare->rf_ft_var.antHw_enable)
7720 #ifdef SW_ANT_SWITCH
7721 priv->pshare->rf_ft_var.antSw_enable =0;
7725 if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
7729 bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?FALSE:TRUE;
7731 ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
7732 ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
7733 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
7734 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
7735 // check HW setting: ANTSEL pin connection
7736 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
7737 ODM_Write2Byte(pDM_Odm,ODM_REG_RF_PIN_11N, (ODM_Read2Byte(pDM_Odm,0x804)&0xf0ff )| BIT(8) ); // b11-b8=0001,update RFPin setting
7740 // only AP support different path selection temperarly
7741 if(!bTxPathSel){ //PATH-A
7742 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
7743 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1); //select TX ANTESEL from path A
7746 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
7747 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0); //select ANTESEL from path B
7750 //Set OFDM HW RX Antenna Diversity
7751 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
7752 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
7753 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1); // Decide final antenna by comparing 2 antennas' pwdb
7755 //Set CCK HW RX Antenna Diversity
7756 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
7757 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
7758 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
7759 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
7762 //Enable HW Antenna Diversity
7763 if(!bTxPathSel) //PATH-A
7764 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1); // Enable Hardware antenna switch
7766 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1); // Enable Hardware antenna switch
7767 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
7769 pDM_SWAT_Table->CurAntenna=0; //choose left antenna as default antenna
7770 pDM_SWAT_Table->PreAntenna=0;
7771 for(i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
7773 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
7774 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
7775 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
7776 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
7777 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
7778 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
7780 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
7785 odm_InitHybridAntDiv(
7786 IN PDM_ODM_T pDM_Odm
7789 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
7791 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
7795 if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
7797 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
7798 odm_InitHybridAntDiv_88C_92D(pDM_Odm);
7806 IN PDM_ODM_T pDM_Odm,
7807 IN u4Byte OFDM_Ant1_Cnt,
7808 IN u4Byte OFDM_Ant2_Cnt,
7809 IN u4Byte CCK_Ant1_Cnt,
7810 IN u4Byte CCK_Ant2_Cnt,
7816 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
7818 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));
7819 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));
7822 if(((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)){
7823 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
7827 if(OFDM_Ant1_Cnt || OFDM_Ant2_Cnt ) {
7828 //if RX OFDM packet number larger than 0
7829 if(OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
7834 // else if RX CCK packet number larger than 10
7835 else if((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
7837 if(CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
7839 else if(CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
7841 else if(CCK_Ant1_Cnt > CCK_Ant2_Cnt)
7848 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
7851 //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
7852 //(*pDefAnt)= (u1Byte) antsel;
7857 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
7867 IN PDM_ODM_T pDM_Odm,
7869 IN BOOLEAN bDualPath
7872 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
7874 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
7876 if(Ant != pDM_SWAT_Table->RxIdleAnt)
7880 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9); //right-side antenna
7882 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a); //left-side antenna
7887 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9); //right-side antenna
7889 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a); //left-side antenna
7892 pDM_SWAT_Table->RxIdleAnt = Ant;
7893 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));
7895 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
7900 ODM_AntselStatistics_88C(
7901 IN PDM_ODM_T pDM_Odm,
7904 IN BOOLEAN isCCKrate
7907 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
7909 if(pDM_SWAT_Table->antsel == 1)
7912 pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
7915 pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
7916 pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
7922 pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
7925 pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
7926 pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
7935 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
7937 ODM_SetTxAntByTxInfo_88C_92D(
7938 IN PDM_ODM_T pDM_Odm,
7943 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
7946 if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))
7949 if(pDM_SWAT_Table->RxIdleAnt == 1)
7950 antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?0:1;
7952 antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?1:0;
7954 SET_TX_DESC_ANTSEL_A_92C(pDesc, antsel);
7955 //SET_TX_DESC_ANTSEL_B_92C(pDesc, antsel);
7956 //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]));
7958 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
7960 ODM_SetTxAntByTxInfo_88C_92D(
7961 IN PDM_ODM_T pDM_Odm
7966 #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
7968 ODM_SetTxAntByTxInfo_88C_92D(
7969 IN PDM_ODM_T pDM_Odm
7977 odm_HwAntDiv_92C_92D(
7978 IN PDM_ODM_T pDM_Odm
7981 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
7982 u4Byte RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
7983 u1Byte RxIdleAnt, i;
7987 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7988 struct rtl8192cd_priv *priv=pDM_Odm->priv;
7990 if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
7994 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
7996 if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) //if don't support antenna diveristy
7998 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
8002 if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
8004 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
8008 #if (DM_ODM_SUPPORT_TYPE&(ODM_WIN|ODM_CE))
8009 if(!pDM_Odm->bLinked)
8011 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is FALSE\n"));
8016 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
8018 pEntry = pDM_Odm->pODM_StaInfo[i];
8019 if(IS_STA_VALID(pEntry))
8022 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]);
8023 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]);
8025 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d, RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
8027 if(RSSI_Ant1 ||RSSI_Ant2)
8029 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
8030 if(pDM_Odm->pODM_StaInfo[i]->expire_to)
8033 RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
8034 if((!RSSI) || ( RSSI < RSSI_Min) ) {
8035 pDM_SWAT_Table->TargetSTA = i;
8040 ///STA: found out default antenna
8041 bRet=odm_StaDefAntSel(pDM_Odm,
8042 pDM_SWAT_Table->OFDM_Ant1_Cnt[i],
8043 pDM_SWAT_Table->OFDM_Ant2_Cnt[i],
8044 pDM_SWAT_Table->CCK_Ant1_Cnt[i],
8045 pDM_SWAT_Table->CCK_Ant2_Cnt[i],
8046 &pDM_SWAT_Table->TxAnt[i]);
8048 //if Tx antenna selection: successful
8050 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
8051 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
8052 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
8053 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
8054 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
8055 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
8061 RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
8062 odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, FALSE);
8064 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
8066 if (!priv->pmib->dot11OperationEntry.disable_txsc) {
8067 plist = phead->next;
8068 while(plist != phead) {
8069 pstat = list_entry(plist, struct stat_info, asoc_list);
8070 if(pstat->expire_to) {
8071 for (i=0; i<TX_SC_ENTRY_NUM; i++) {
8072 struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);
8073 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
8074 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
8075 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
8076 pdesc= &(pstat->tx_sc_ent[i].hwdesc2);
8077 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
8078 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
8079 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
8083 if (plist == plist->next)
8085 plist = plist->next;
8091 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
8097 IN PDM_ODM_T pDM_Odm
8101 PADAPTER pAdapter = pDM_Odm->Adapter;
8103 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
8104 if(pAdapter->MgntInfo.AntennaTest)
8107 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
8109 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
8113 if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
8115 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
8116 odm_HwAntDiv_92C_92D(pDM_Odm);
8122 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
8126 IN PDM_ODM_T pDM_Odm
8129 struct rtl8192cd_priv *priv=pDM_Odm->priv;
8130 struct stat_info *pstat, *pstat_min=NULL;
8131 struct list_head *phead, *plist;
8132 int rssi_min= 0xff, i;
8133 u1Byte idleAnt=priv->pshare->rf_ft_var.CurAntenna;
8137 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
8139 if((!priv->pshare->rf_ft_var.antHw_enable) ||(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)))
8143 if(priv->pshare->rf_ft_var.CurAntenna & 0x80)
8146 phead = &priv->asoc_list;
8147 plist = phead->next;
8148 ////=========================
8149 //find mimum rssi sta
8150 ////=========================
8151 while(plist != phead) {
8152 pstat = list_entry(plist, struct stat_info, asoc_list);
8153 if((pstat->expire_to) && (pstat->AntRSSI[0] || pstat->AntRSSI[1])) {
8154 int rssi = (pstat->AntRSSI[0] < pstat->AntRSSI[1]) ? pstat->AntRSSI[0] : pstat->AntRSSI[1];
8155 if((!pstat_min) || ( rssi < rssi_min) ) {
8160 ///STA: found out default antenna
8161 bRet=odm_StaDefAntSel(pDM_Odm,
8162 pstat->hwRxAntSel[1],
8163 pstat->hwRxAntSel[0],
8164 pstat->cckPktCount[1],
8165 pstat->cckPktCount[0],
8169 //if default antenna selection: successful
8171 pstat->CurAntenna = nextAnt;
8173 for(i=0; i<2; i++) {
8174 if(pstat->cckPktCount[i]==0 && pstat->hwRxAntSel[i]==0)
8175 pstat->AntRSSI[i] = 0;
8177 if(pstat->AntRSSI[idleAnt]==0)
8178 pstat->AntRSSI[idleAnt] = pstat->AntRSSI[idleAnt^1];
8180 pstat->hwRxAntSel[1] = pstat->hwRxAntSel[0] =0;
8181 pstat->cckPktCount[1]= pstat->cckPktCount[0] =0;
8184 if (plist == plist->next)
8186 plist = plist->next;
8189 ////=========================
8190 //Choose RX Idle antenna according to minmum rssi
8191 ////=========================
8193 if(priv->pshare->rf_ft_var.CurAntenna!=pstat_min->CurAntenna)
8194 odm_SetRxIdleAnt(pDM_Odm,pstat_min->CurAntenna,TRUE);
8195 priv->pshare->rf_ft_var.CurAntenna = pstat_min->CurAntenna;
8200 if (!priv->pmib->dot11OperationEntry.disable_txsc) {
8201 plist = phead->next;
8202 while(plist != phead) {
8203 pstat = list_entry(plist, struct stat_info, asoc_list);
8204 if(pstat->expire_to) {
8205 for (i=0; i<TX_SC_ENTRY_NUM; i++) {
8206 struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);
8207 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
8208 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
8209 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
8210 pdesc= &(pstat->tx_sc_ent[i].hwdesc2);
8211 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
8212 if((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
8213 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
8217 if (plist == plist->next)
8219 plist = plist->next;
8223 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,"<==============odm_HwAntDiv\n");
8228 ODM_Diversity_AntennaSelect(
8229 IN PDM_ODM_T pDM_Odm,
8233 struct rtl8192cd_priv *priv=pDM_Odm->priv;
8235 int ant = _atoi(data, 16);
8237 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ODM_Diversity_AntennaSelect==============>\n"));
8239 #ifdef PCIE_POWER_SAVING
8240 PCIeWakeUp(priv, POWER_DOWN_T0);
8243 if (ant==AUX_ANT || ant==MAIN_ANT)
8245 if ( !priv->pshare->rf_ft_var.antSw_select) {
8246 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(8)| BIT(9) ); // ANTSEL A as SW control
8247 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7))); // rx OFDM SW control
8248 PHY_SetBBReg(priv, 0x860, 0x300, ant);
8250 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(24)| BIT(25) ); // ANTSEL B as HW control
8251 PHY_SetBBReg(priv, 0x864, 0x300, ant);
8252 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7))); // rx OFDM SW control
8255 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7))); // rx CCK SW control
8256 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
8257 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
8259 priv->pshare->rf_ft_var.antHw_enable = 0;
8260 priv->pshare->rf_ft_var.CurAntenna = (ant%2);
8262 #ifdef SW_ANT_SWITCH
8263 priv->pshare->rf_ft_var.antSw_enable = 0;
8264 priv->pshare->DM_SWAT_Table.CurAntenna = ant;
8265 priv->pshare->RSSI_test =0;
8270 if ( !priv->pshare->rf_ft_var.antSw_select) {
8271 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(8)| BIT(9)) );
8272 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) | BIT(7)); // OFDM HW control
8274 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(24)| BIT(25)) );
8275 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) | BIT(7)); // OFDM HW control
8278 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) | BIT(7)); // CCK HW control
8279 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) | BIT(21) ); // by tx desc
8280 priv->pshare->rf_ft_var.CurAntenna = 0;
8281 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
8282 priv->pshare->rf_ft_var.antHw_enable = 1;
8283 #ifdef SW_ANT_SWITCH
8284 priv->pshare->rf_ft_var.antSw_enable = 0;
8285 priv->pshare->RSSI_test =0;
8288 #ifdef SW_ANT_SWITCH
8290 if(!priv->pshare->rf_ft_var.antSw_enable) {
8292 dm_SW_AntennaSwitchInit(priv);
8293 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
8294 priv->pshare->lastTxOkCnt = priv->net_stats.tx_bytes;
8295 priv->pshare->lastRxOkCnt = priv->net_stats.rx_bytes;
8297 if ( !priv->pshare->rf_ft_var.antSw_select)
8298 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7))); // rx OFDM SW control
8300 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7))); // rx OFDM SW control
8302 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7))); // rx CCK SW control
8303 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
8304 priv->pshare->rf_ft_var.antHw_enable = 0;
8305 priv->pshare->rf_ft_var.antSw_enable = 1;
8309 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============ODM_Diversity_AntennaSelect\n"));
8315 #else //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
8317 VOID odm_InitHybridAntDiv( IN PDM_ODM_T pDM_Odm ){}
8318 VOID odm_HwAntDiv( IN PDM_ODM_T pDM_Odm){}
8319 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
8320 VOID ODM_SetTxAntByTxInfo_88C_92D(
8321 IN PDM_ODM_T pDM_Odm,
8325 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
8326 VOID ODM_SetTxAntByTxInfo_88C_92D( IN PDM_ODM_T pDM_Odm){ }
8327 #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
8328 VOID ODM_SetTxAntByTxInfo_88C_92D( IN PDM_ODM_T pDM_Odm){ }
8331 #endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
8335 //============================================================
8337 //============================================================
8340 IN PDM_ODM_T pDM_Odm)
8343 #if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
8344 odm_EdcaParaInit(pDM_Odm);
8345 #elif (DM_ODM_SUPPORT_TYPE==ODM_WIN)
8346 PADAPTER Adapter = NULL;
8347 HAL_DATA_TYPE *pHalData = NULL;
8349 if(pDM_Odm->Adapter==NULL) {
8350 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
8354 Adapter=pDM_Odm->Adapter;
8355 pHalData=GET_HAL_DATA(Adapter);
8357 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
8358 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
8359 pHalData->bIsAnyNonBEPkts = FALSE;
8361 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
8362 PADAPTER Adapter = pDM_Odm->Adapter;
8363 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
8364 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
8365 Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
8368 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));
8369 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));
8370 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
8371 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));
8374 } // ODM_InitEdcaTurbo
8378 IN PDM_ODM_T pDM_Odm
8382 // For AP/ADSL use prtl8192cd_priv
8383 // For CE/NIC use PADAPTER
8387 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
8388 // at the same time. In the stage2/3, we need to prive universal interface and merge all
8389 // HW dynamic mechanism.
8391 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
8393 if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
8396 switch (pDM_Odm->SupportPlatform)
8400 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
8401 odm_EdcaTurboCheckMP(pDM_Odm);
8406 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
8407 odm_EdcaTurboCheckCE(pDM_Odm);
8414 #if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
8415 odm_IotEngine(pDM_Odm);
8419 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
8421 } // odm_CheckEdcaTurbo
8423 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
8427 odm_EdcaTurboCheckCE(
8428 IN PDM_ODM_T pDM_Odm
8432 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
8434 PADAPTER Adapter = pDM_Odm->Adapter;
8435 u32 EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
8436 u32 EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
8437 u32 ICType=pDM_Odm->SupportICType;
8439 u8 WirelessMode=0xFF; //invalid value
8442 u64 cur_tx_bytes = 0;
8443 u64 cur_rx_bytes = 0;
8444 u8 bbtchange = _FALSE;
8445 u8 bBiasOnRx = _FALSE;
8446 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8447 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
8448 struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
8449 struct recv_priv *precvpriv = &(Adapter->recvpriv);
8450 struct registry_priv *pregpriv = &Adapter->registrypriv;
8451 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
8452 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
8454 if(pDM_Odm->bLinked != _TRUE)
8455 goto dm_CheckEdcaTurbo_EXIT;
8457 if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
8459 goto dm_CheckEdcaTurbo_EXIT;
8462 if(pDM_Odm->pWirelessMode!=NULL)
8463 WirelessMode=*(pDM_Odm->pWirelessMode);
8465 IOTPeer = pmlmeinfo->assoc_AP_vendor;
8467 if (IOTPeer >= HT_IOT_PEER_MAX)
8469 goto dm_CheckEdcaTurbo_EXIT;
8472 if( (pDM_Odm->SupportICType == ODM_RTL8192C) ||
8473 (pDM_Odm->SupportICType == ODM_RTL8723A) ||
8474 (pDM_Odm->SupportICType == ODM_RTL8188E))
8476 if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
8480 // Check if the status needs to be changed.
8481 if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
8483 cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
8484 cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
8489 if (cur_tx_bytes > (cur_rx_bytes << 2))
8490 { // Uplink TP is present.
8491 trafficIndex = UP_LINK;
8494 { // Balance TP is present.
8495 trafficIndex = DOWN_LINK;
8500 if (cur_rx_bytes > (cur_tx_bytes << 2))
8501 { // Downlink TP is present.
8502 trafficIndex = DOWN_LINK;
8505 { // Balance TP is present.
8506 trafficIndex = UP_LINK;
8510 //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
8512 if(ICType==ODM_RTL8192D)
8515 if(pDM_Odm->RFType==ODM_2T2R)
8517 EDCA_BE_UL = 0x60a42b; //0x5ea42b;
8518 EDCA_BE_DL = 0x60a42b; //0x5ea42b;
8522 EDCA_BE_UL = 0x6ea42b;
8523 EDCA_BE_DL = 0x6ea42b;
8528 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
8529 if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
8530 EDCA_BE_UL = 0x60a42b;
8531 EDCA_BE_DL = 0x60a42b;
8535 EDCA_BE_UL = 0x6ea42b;
8536 EDCA_BE_DL = 0x6ea42b;
8541 //92D txop can't be set to 0x3e for cisco1250
8542 if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
8544 EDCA_BE_DL = edca_setting_DL[IOTPeer];
8545 EDCA_BE_UL = edca_setting_UL[IOTPeer];
8547 //merge from 92s_92c_merge temp brunch v2445 20120215
8548 else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
8550 EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
8552 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
8554 EDCA_BE_DL = 0xa630;
8556 else if(IOTPeer == HT_IOT_PEER_MARVELL)
8558 EDCA_BE_DL = edca_setting_DL[IOTPeer];
8559 EDCA_BE_UL = edca_setting_UL[IOTPeer];
8561 else if(IOTPeer == HT_IOT_PEER_ATHEROS)
8563 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
8564 EDCA_BE_DL = edca_setting_DL[IOTPeer];
8567 if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
8569 EDCA_BE_UL = 0x5ea42b;
8570 EDCA_BE_DL = 0x5ea42b;
8572 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));
8575 if (trafficIndex == DOWN_LINK)
8576 edca_param = EDCA_BE_DL;
8578 edca_param = EDCA_BE_UL;
8580 rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
8582 pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
8585 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
8590 // Turn Off EDCA turbo here.
8591 // Restore original EDCA according to the declaration of AP.
8593 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
8595 rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
8596 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
8600 dm_CheckEdcaTurbo_EXIT:
8601 // Set variables for next time.
8602 precvpriv->bIsAnyNonBEPkts = _FALSE;
8607 #elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
8609 odm_EdcaTurboCheckMP(
8610 IN PDM_ODM_T pDM_Odm
8615 PADAPTER Adapter = pDM_Odm->Adapter;
8616 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8618 PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
8619 PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
8620 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
8621 PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
8622 //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
8623 u8Byte Ext_curTxOkCnt = 0;
8624 u8Byte Ext_curRxOkCnt = 0;
8625 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
8626 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
8628 // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
8629 u8Byte curTxOkCnt = 0;
8630 u8Byte curRxOkCnt = 0;
8631 u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
8632 u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
8633 u4Byte EDCA_BE = 0x5ea42b;
8635 BOOLEAN *pbIsCurRDLState=NULL;
8636 BOOLEAN bLastIsCurRDLState=FALSE;
8637 BOOLEAN bBiasOnRx=FALSE;
8638 BOOLEAN bEdcaTurboOn=FALSE;
8639 u1Byte TxRate = 0xFF;
8642 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
8643 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
8645 ////===============================
8646 ////list paramter for different platform
8647 ////===============================
8648 bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
8649 pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);
8652 if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
8653 pHalData->bIsAnyNonBEPkts = TRUE;
8655 pMgntInfo->NumNonBePkt = 0;
8657 // Caculate TX/RX TP:
8658 //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
8659 //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
8660 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;
8661 curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;
8662 pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
8663 pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
8665 if(pExtAdapter == NULL)
8666 pExtAdapter = pDefaultAdapter;
8668 Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
8669 Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
8670 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
8671 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
8672 if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
8674 curTxOkCnt = Ext_curTxOkCnt ;
8675 curRxOkCnt = Ext_curRxOkCnt ;
8678 IOTPeer=pMgntInfo->IOTPeer;
8679 bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
8680 bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts) && (!pMgntInfo->bDisableFrameBursting))?TRUE:FALSE;
8681 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx bDisableFrameBursting : 0x%lx \n",pHalData->bIsAnyNonBEPkts,pMgntInfo->bDisableFrameBursting));
8684 ////===============================
8685 ////check if edca turbo is disabled
8686 ////===============================
8687 if(odm_IsEdcaTurboDisable(pDM_Odm))
8688 goto dm_CheckEdcaTurbo_EXIT;
8691 ////===============================
8692 ////remove iot case out
8693 ////===============================
8694 ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
8697 ////===============================
8698 ////Check if the status needs to be changed.
8699 ////===============================
8702 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
8703 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
8704 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
8706 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, TRUE, pbIsCurRDLState);
8708 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, FALSE, pbIsCurRDLState);
8710 //modify by Guo.Mingzhi 2011-12-29
8711 EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
8712 if(IS_HARDWARE_TYPE_8821U(Adapter))
8714 if(pMgntInfo->RegTxDutyEnable)
8716 //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
8717 if(!pMgntInfo->ForcedDataRate) //auto rate
8719 if(pDM_Odm->TxRate != 0xFF)
8720 TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
8724 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
8727 value64 = (curRxOkCnt<<2);
8728 if(curTxOkCnt < value64) //Downlink
8729 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8732 //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
8733 //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
8734 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
8735 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8740 case MGN_VHT1SS_MCS6:
8741 case MGN_VHT1SS_MCS5:
8746 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
8748 case MGN_VHT1SS_MCS4:
8751 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
8753 case MGN_VHT1SS_MCS3:
8756 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
8758 case MGN_VHT1SS_MCS2:
8761 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
8763 case MGN_VHT1SS_MCS1:
8767 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
8769 case MGN_VHT1SS_MCS0:
8772 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
8775 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8783 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8787 else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
8788 if(pMgntInfo->RegTxDutyEnable)
8790 //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
8791 // it;s the same issue as 8811AU
8792 if(!pMgntInfo->ForcedDataRate) //auto rate
8794 if(pDM_Odm->TxRate != 0xFF)
8795 TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
8799 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
8802 value64 = (curRxOkCnt<<2);
8803 if(curTxOkCnt < value64) //Downlink
8804 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8807 //DbgPrint("pDM_Odm->RFCalibrateInfo.ThermalValue = 0x%X\n", pDM_Odm->RFCalibrateInfo.ThermalValue);
8808 //if(pDM_Odm->RFCalibrateInfo.ThermalValue < pHalData->EEPROMThermalMeter)
8809 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
8810 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8815 case MGN_VHT2SS_MCS9:
8816 case MGN_VHT1SS_MCS9:
8817 case MGN_VHT1SS_MCS8:
8820 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);
8821 case MGN_VHT2SS_MCS8:
8822 case MGN_VHT1SS_MCS7:
8826 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
8827 case MGN_VHT2SS_MCS7:
8828 case MGN_VHT2SS_MCS6:
8829 case MGN_VHT1SS_MCS6:
8830 case MGN_VHT1SS_MCS5:
8834 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
8836 case MGN_VHT2SS_MCS5:
8837 case MGN_VHT2SS_MCS4:
8838 case MGN_VHT1SS_MCS4:
8839 case MGN_VHT1SS_MCS3:
8845 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
8847 case MGN_VHT2SS_MCS3:
8848 case MGN_VHT2SS_MCS2:
8849 case MGN_VHT2SS_MCS1:
8850 case MGN_VHT1SS_MCS2:
8851 case MGN_VHT1SS_MCS1:
8859 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
8861 case MGN_VHT2SS_MCS0:
8862 case MGN_VHT1SS_MCS0:
8867 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
8870 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8878 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8882 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
8884 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
8886 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
8888 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx EDCA_BE_UL : 0x%lx EDCA_BE : 0x%lx \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));
8893 // Turn Off EDCA turbo here.
8894 // Restore original EDCA according to the declaration of AP.
8895 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
8897 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
8899 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
8900 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));
8905 ////===============================
8906 ////Set variables for next time.
8907 ////===============================
8908 dm_CheckEdcaTurbo_EXIT:
8909 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
8910 pHalData->bIsAnyNonBEPkts = FALSE;
8911 pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
8912 pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
8913 pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
8914 pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
8915 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
8916 precvpriv->bIsAnyNonBEPkts = FALSE;
8917 pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
8918 precvpriv->last_rx_bytes = precvpriv->rx_bytes;
8924 //check if edca turbo is disabled
8926 odm_IsEdcaTurboDisable(
8927 IN PDM_ODM_T pDM_Odm
8930 PADAPTER Adapter = pDM_Odm->Adapter;
8932 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
8933 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
8934 u4Byte IOTPeer=pMgntInfo->IOTPeer;
8935 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
8936 struct registry_priv *pregpriv = &Adapter->registrypriv;
8937 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
8938 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
8939 u4Byte IOTPeer=pmlmeinfo->assoc_AP_vendor;
8940 u1Byte WirelessMode=0xFF; //invalid value
8942 if(pDM_Odm->pWirelessMode!=NULL)
8943 WirelessMode=*(pDM_Odm->pWirelessMode);
8947 if(pDM_Odm->bBtDisableEdcaTurbo)
8949 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
8953 if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
8954 (pDM_Odm->bWIFITest)||
8955 (IOTPeer>= HT_IOT_PEER_MAX))
8957 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
8962 #if (DM_ODM_SUPPORT_TYPE ==ODM_WIN)
8963 // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
8964 // 2. User may disable EDCA Turbo mode with OID settings.
8965 if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
8966 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
8970 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
8971 //suggested by Jr.Luke: open TXOP for B/G/BG/A mode 2012-0215
8972 if((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)||(WirelessMode==ODM_WM_G)||(WirelessMode=ODM_WM_A))
8973 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, ODM_Read4Byte(pDM_Odm, ODM_EDCA_BE_PARAM)|0x5E0000);
8975 if(pDM_Odm->SupportICType==ODM_RTL8192D) {
8976 if ((pregpriv->wifi_spec == 1) || (pmlmeext->cur_wireless_mode == WIRELESS_11B)) {
8977 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("92D:EdcaTurboDisable\n"));
8983 if((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)){
8984 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("Others:EdcaTurboDisable\n"));
8996 //add iot case here: for MP/CE
8998 ODM_EdcaParaSelByIot(
8999 IN PDM_ODM_T pDM_Odm,
9000 OUT u4Byte *EDCA_BE_UL,
9001 OUT u4Byte *EDCA_BE_DL
9005 PADAPTER Adapter = pDM_Odm->Adapter;
9006 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9008 u4Byte ICType=pDM_Odm->SupportICType;
9009 u1Byte WirelessMode=0xFF; //invalid value
9010 u4Byte RFType=pDM_Odm->RFType;
9011 u4Byte IOTPeerSubType=0;
9013 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
9014 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
9015 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
9017 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
9018 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
9019 #ifdef CONFIG_BT_COEXIST
9020 struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
9022 u1Byte bbtchange =FALSE;
9025 if(pDM_Odm->pWirelessMode!=NULL)
9026 WirelessMode=*(pDM_Odm->pWirelessMode);
9028 ///////////////////////////////////////////////////////////
9029 ////list paramter for different platform
9030 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
9031 IOTPeer=pMgntInfo->IOTPeer;
9032 IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
9033 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
9035 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
9036 IOTPeer=pmlmeinfo->assoc_AP_vendor;
9037 #ifdef CONFIG_BT_COEXIST
9038 if(pbtpriv->BT_Coexist)
9040 if( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
9047 if(ICType==ODM_RTL8192D)
9050 if(pDM_Odm->RFType==ODM_2T2R)
9052 (*EDCA_BE_UL) = 0x60a42b; //0x5ea42b;
9053 (*EDCA_BE_DL) = 0x60a42b; //0x5ea42b;
9058 (*EDCA_BE_UL) = 0x6ea42b;
9059 (*EDCA_BE_DL) = 0x6ea42b;
9063 ////============================
9065 ////============================
9066 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
9070 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
9071 if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
9072 (*EDCA_BE_UL) = 0x60a42b;
9073 (*EDCA_BE_DL) = 0x60a42b;
9077 (*EDCA_BE_UL) = 0x6ea42b;
9078 (*EDCA_BE_DL) = 0x6ea42b;
9083 if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
9085 (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
9086 (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
9089 #if (INTEL_PROXIMITY_SUPPORT == 1)
9090 if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
9092 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
9097 if((!pMgntInfo->bDisableFrameBursting) &&
9098 (pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
9099 {// To check whether we shall force turn on TXOP configuration.
9100 if(!((*EDCA_BE_UL) & 0xffff0000))
9101 (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
9102 if(!((*EDCA_BE_DL) & 0xffff0000))
9103 (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
9106 //92D txop can't be set to 0x3e for cisco1250
9107 if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
9109 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
9110 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
9112 //merge from 92s_92c_merge temp brunch v2445 20120215
9113 else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
9115 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
9117 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
9119 (*EDCA_BE_DL) = 0xa630;
9122 else if(IOTPeer == HT_IOT_PEER_MARVELL)
9124 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
9125 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
9127 else if(IOTPeer == HT_IOT_PEER_ATHEROS)
9129 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
9130 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
9132 if(ICType == ODM_RTL8821)
9133 (*EDCA_BE_DL) = 0x5ea630;
9138 if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
9140 (*EDCA_BE_DL) = 0x432b;
9141 (*EDCA_BE_UL) = 0x432b;
9146 if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
9148 (*EDCA_BE_UL) = 0x5ea42b;
9149 (*EDCA_BE_DL) = 0x5ea42b;
9151 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
9154 // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.
9155 if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) &&
9156 (pMgntInfo->dot11CurrentChannelNumber == 6))
9158 (*EDCA_BE_DL) = 0xa92b;
9161 ////============================
9163 ////============================
9164 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
9166 if(RFType==ODM_RTL8192D)
9168 if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
9170 (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
9171 (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
9173 else if((IOTPeer == HT_IOT_PEER_AIRGO) &&
9174 ((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G))))
9175 (*EDCA_BE_DL)=0x00a630;
9177 else if((IOTPeer== HT_IOT_PEER_ATHEROS) &&
9178 (WirelessMode&ODM_WM_N5G) &&
9179 (Adapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
9180 (*EDCA_BE_DL)=0xa42b;
9186 #ifdef CONFIG_BT_COEXIST
9189 (*EDCA_BE_UL) = pbtpriv->BT_EDCA[UP_LINK];
9190 (*EDCA_BE_DL) = pbtpriv->BT_EDCA[DOWN_LINK];
9195 if((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
9197 (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
9198 (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
9202 (*EDCA_BE_UL)=EDCAParam[HT_IOT_PEER_UNKNOWN][UP_LINK];
9203 (*EDCA_BE_DL)=EDCAParam[HT_IOT_PEER_UNKNOWN][DOWN_LINK];
9206 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
9207 if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))
9209 (*EDCA_BE_UL) = 0x60a42b;
9210 (*EDCA_BE_DL) = 0x60a42b;
9214 (*EDCA_BE_UL) = 0x6ea42b;
9215 (*EDCA_BE_DL) = 0x6ea42b;
9222 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx",(*EDCA_BE_UL),(*EDCA_BE_DL)));
9228 odm_EdcaChooseTrafficIdx(
9229 IN PDM_ODM_T pDM_Odm,
9230 IN u8Byte cur_tx_bytes,
9231 IN u8Byte cur_rx_bytes,
9232 IN BOOLEAN bBiasOnRx,
9233 OUT BOOLEAN *pbIsCurRDLState
9241 if(cur_tx_bytes>(cur_rx_bytes*4))
9243 *pbIsCurRDLState=FALSE;
9244 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
9249 *pbIsCurRDLState=TRUE;
9250 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
9256 if(cur_rx_bytes>(cur_tx_bytes*4))
9258 *pbIsCurRDLState=TRUE;
9259 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));
9264 *pbIsCurRDLState=FALSE;
9265 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
9274 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
9276 void odm_EdcaParaInit(
9277 IN PDM_ODM_T pDM_Odm
9280 prtl8192cd_priv priv = pDM_Odm->priv;
9281 int mode=priv->pmib->dot11BssType.net_work_type;
9283 static unsigned int slot_time, VO_TXOP, VI_TXOP, sifs_time;
9284 struct ParaRecord EDCA[4];
9286 memset(EDCA, 0, 4*sizeof(struct ParaRecord));
9291 if (mode & (ODM_WM_N24G|ODM_WM_N5G))
9294 if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))
9298 #if((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))
9299 if( priv->pmib->dot11QosEntry.ManualEDCA ) {
9300 if( OPMODE & WIFI_AP_STATE )
9301 memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));
9303 memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));
9307 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
9310 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
9313 #endif //RTL_MANUAL_EDCA
9316 if(OPMODE & WIFI_AP_STATE)
9318 memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));
9320 if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
9321 memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
9323 memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));
9327 memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));
9329 if(mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
9330 memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
9332 memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));
9337 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
9341 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
9342 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
9343 #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9344 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));
9350 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VO_PARAM, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time));
9351 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time));
9352 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BK_PARAM, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time));
9353 // ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);
9355 priv->pshare->iot_mode_enable = 0;
9356 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9357 if (priv->pshare->rf_ft_var.wifi_beq_iot)
9358 priv->pshare->iot_mode_VI_exist = 0;
9361 priv->pshare->iot_mode_BE_exist = 0;
9365 priv->pshare->BE_cwmax_enhance = 0;
9368 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9369 priv->pshare->iot_mode_BE_exist = 0;
9371 priv->pshare->iot_mode_VO_exist = 0;
9375 ODM_ChooseIotMainSTA(
9376 IN PDM_ODM_T pDM_Odm,
9377 IN PSTA_INFO_T pstat
9380 prtl8192cd_priv priv = pDM_Odm->priv;
9381 BOOLEAN bhighTP_found_pstat=FALSE;
9383 if ((GET_ROOT(priv)->up_time % 2) == 0) {
9384 unsigned int tx_2s_avg = 0;
9385 unsigned int rx_2s_avg = 0;
9386 int i=0, aggReady=0;
9387 unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);
9389 pstat->current_tx_bytes += pstat->tx_byte_cnt;
9390 pstat->current_rx_bytes += pstat->rx_byte_cnt;
9392 if (total_sum != 0) {
9393 if (total_sum <= 100) {
9394 tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);
9395 rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);
9397 tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));
9398 rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));
9403 #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9404 if (pstat->ht_cap_len) {
9405 if ((tx_2s_avg + rx_2s_avg) >=25 /*50*/) {
9407 priv->pshare->highTP_found_pstat = pstat;
9408 bhighTP_found_pstat=TRUE;
9411 #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
9413 aggReady += (pstat->ADDBA_ready[i]);
9414 if (pstat->ht_cap_len && aggReady)
9416 if ((tx_2s_avg + rx_2s_avg >= 25)) {
9417 priv->pshare->highTP_found_pstat = pstat;
9421 if (OPMODE & WIFI_STATION_STATE) {
9422 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
9423 if ((pstat->IOTPeer==HT_IOT_PEER_RALINK) && ((tx_2s_avg + rx_2s_avg) >= 45))
9425 if(pstat->is_ralink_sta && ((tx_2s_avg + rx_2s_avg) >= 45))
9427 priv->pshare->highTP_found_pstat = pstat;
9433 pstat->current_tx_bytes = pstat->tx_byte_cnt;
9434 pstat->current_rx_bytes = pstat->rx_byte_cnt;
9437 return bhighTP_found_pstat;
9444 IN PDM_ODM_T pDM_Odm,
9445 IN unsigned char enable
9448 prtl8192cd_priv priv = pDM_Odm->priv;
9449 int mode=priv->pmib->dot11BssType.net_work_type;
9450 unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;
9451 unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;
9453 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
9454 if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||
9455 ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9457 || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9463 if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num
9465 || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
9470 if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {
9479 #if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9480 if (priv->pshare->iot_mode_VO_exist) {
9481 // to separate AC_VI and AC_BE to avoid using the same EDCA settings
9482 if (priv->pshare->iot_mode_BE_exist) {
9490 vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
9492 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)| (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
9495 #elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
9496 if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {
9497 if (priv->pshare->iot_mode_VO_exist) {
9499 if (priv->pshare->iot_mode_BE_exist)
9503 vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
9514 vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
9517 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)
9518 | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
9524 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
9525 if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist)
9526 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);
9528 #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9529 if(!enable) //if iot is disable ,maintain original BEQ PARAM
9531 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
9532 | (sifs_time + 3 * slot_time));
9537 unsigned int cw_max;
9538 unsigned int txop_close;
9540 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
9541 cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);
9542 txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);
9544 if(priv->pshare->txop_enlarge == 0xe) //if intel case
9545 txop = (txop_close ? 0 : (BE_TXOP*2));
9546 else //if other case
9547 txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));
9550 if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))
9553 txop=BE_TXOP*priv->pshare->txop_enlarge;
9557 if (priv->pshare->ht_sta_num
9559 || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&
9560 priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
9565 if (priv->pshare->txop_enlarge == 0xe) {
9566 // is intel client, use a different edca value
9567 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);
9568 priv->pshare->txop_enlarge = 2;
9570 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9572 else if (priv->pshare->txop_enlarge == 0xd) {
9573 // is intel ralink, use a different edca value
9574 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (4 << 12) | (3 << 8) | 0x19);
9575 priv->pshare->txop_enlarge = 2;
9581 if (pDM_Odm->RFType==ODM_2T2R)
9582 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
9583 (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
9585 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)
9586 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
9587 (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
9589 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
9590 (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
9597 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
9598 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
9600 #if defined(CONFIG_RTL_8196D) || defined(CONFIG_RTL_8196E) || (defined(CONFIG_RTL_8197D) && !defined(CONFIG_PORT0_EXT_GIGA))
9601 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (5 << 8) | (sifs_time + 3 * slot_time));
9603 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
9615 IN PDM_ODM_T pDM_Odm
9619 struct rtl8192cd_priv *priv=pDM_Odm->priv;
9620 PSTA_INFO_T pstat = NULL;
9624 unsigned int switch_turbo = 0;
9626 ////////////////////////////////////////////////////////
9627 // if EDCA Turbo function is not supported or Manual EDCA Setting
9629 ////////////////////////////////////////////////////////
9630 if(!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)){
9631 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));
9635 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))
9636 if(priv->pmib->dot11QosEntry.ManualEDCA){
9637 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));
9642 #if !(DM_ODM_SUPPORT_TYPE &ODM_AP)
9643 //////////////////////////////////////////////////////
9644 //find high TP STA every 2s
9645 //////////////////////////////////////////////////////
9646 if ((GET_ROOT(priv)->up_time % 2) == 0)
9647 priv->pshare->highTP_found_pstat==NULL;
9650 phead = &priv->asoc_list;
9651 plist = phead->next;
9652 while(plist != phead) {
9653 pstat = list_entry(plist, struct stat_info, asoc_list);
9655 if(ODM_ChooseIotMainSTA(pDM_Odm, pstat)); //find the correct station
9657 if (plist == plist->next) //the last plist
9659 plist = plist->next;
9664 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
9665 pstat = pDM_Odm->pODM_StaInfo[i];
9666 if(IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat))) //find the correct station
9670 //////////////////////////////////////////////////////
9671 //if highTP STA is not found, then return
9672 //////////////////////////////////////////////////////
9673 if(priv->pshare->highTP_found_pstat==NULL) {
9674 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));
9679 pstat=priv->pshare->highTP_found_pstat;
9684 if (!priv->pmib->dot11OperationEntry.wifi_specific
9685 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9686 ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9687 #elif(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9688 || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
9691 if (priv->pshare->iot_mode_enable &&
9692 ((priv->pshare->phw->VO_pkt_count > 50) ||
9693 (priv->pshare->phw->VI_pkt_count > 50) ||
9694 (priv->pshare->phw->BK_pkt_count > 50))) {
9695 priv->pshare->iot_mode_enable = 0;
9697 } else if ((!priv->pshare->iot_mode_enable) &&
9698 ((priv->pshare->phw->VO_pkt_count < 50) &&
9699 (priv->pshare->phw->VI_pkt_count < 50) &&
9700 (priv->pshare->phw->BK_pkt_count < 50))) {
9701 priv->pshare->iot_mode_enable++;
9707 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9708 if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)
9709 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9710 if (priv->pmib->dot11OperationEntry.wifi_specific)
9713 if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {
9714 priv->pshare->iot_mode_VO_exist++;
9716 } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {
9717 priv->pshare->iot_mode_VO_exist = 0;
9720 #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
9721 if (priv->pshare->iot_mode_VO_exist) {
9722 //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count);
9723 if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {
9724 priv->pshare->iot_mode_BE_exist++;
9726 } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {
9727 priv->pshare->iot_mode_BE_exist = 0;
9733 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
9734 if (priv->pshare->rf_ft_var.wifi_beq_iot)
9736 if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {
9737 priv->pshare->iot_mode_VI_exist++;
9739 } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {
9740 priv->pshare->iot_mode_VI_exist = 0;
9747 else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {
9748 if (priv->pshare->txop_enlarge) {
9749 priv->pshare->txop_enlarge = 0;
9750 if (priv->pshare->iot_mode_enable)
9755 #if(defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))
9756 if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9758 if (priv->pshare->iot_mode_enable &&
9759 (((priv->pshare->phw->VO_pkt_count > 50) ||
9760 (priv->pshare->phw->VI_pkt_count > 50) ||
9761 (priv->pshare->phw->BK_pkt_count > 50)) ||
9762 (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))
9764 priv->pshare->iot_mode_enable = 0;
9767 else if ((!priv->pshare->iot_mode_enable) &&
9768 (((priv->pshare->phw->VO_pkt_count < 50) &&
9769 (priv->pshare->phw->VI_pkt_count < 50) &&
9770 (priv->pshare->phw->BK_pkt_count < 50)) &&
9771 (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))
9773 priv->pshare->iot_mode_enable++;
9779 priv->pshare->phw->VO_pkt_count = 0;
9780 priv->pshare->phw->VI_pkt_count = 0;
9781 priv->pshare->phw->BK_pkt_count = 0;
9783 #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
9784 priv->pshare->phw->BE_pkt_count = 0;
9787 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9788 if (priv->pshare->rf_ft_var.wifi_beq_iot)
9789 priv->pshare->phw->VI_rx_pkt_count = 0;
9795 if ((priv->up_time % 2) == 0) {
9797 * decide EDCA content for different chip vendor
9800 #if(DM_ODM_SUPPORT_TYPE==ODM_ADSL)
9801 if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
9803 #elif(DM_ODM_SUPPORT_TYPE==ODM_AP)
9804 if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific ||
9805 ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9807 || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9814 if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {
9816 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
9817 if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
9819 if (pstat->is_intel_sta)
9822 if (priv->pshare->txop_enlarge != 0xe)
9824 priv->pshare->txop_enlarge = 0xe;
9826 if (priv->pshare->iot_mode_enable)
9830 else if (priv->pshare->txop_enlarge != 2)
9832 priv->pshare->txop_enlarge = 2;
9833 if (priv->pshare->iot_mode_enable)
9837 if (priv->pshare->txop_enlarge != 2)
9839 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
9840 if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
9842 if (pstat->is_intel_sta)
9844 priv->pshare->txop_enlarge = 0xe;
9845 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
9846 else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
9848 else if (pstat->is_ralink_sta)
9850 priv->pshare->txop_enlarge = 0xd;
9852 priv->pshare->txop_enlarge = 2;
9854 if (priv->pshare->iot_mode_enable)
9859 if (priv->pshare->txop_enlarge != 2)
9861 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9862 if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
9864 if (pstat->is_intel_sta)
9866 priv->pshare->txop_enlarge = 0xe;
9867 #if(DM_ODM_SUPPORT_TYPE==ODM_AP)
9868 else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
9869 priv->pshare->txop_enlarge = 0xd;
9872 priv->pshare->txop_enlarge = 2;
9873 if (priv->pshare->iot_mode_enable)
9878 else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower)
9880 if (priv->pshare->txop_enlarge) {
9881 priv->pshare->txop_enlarge = 0;
9882 if (priv->pshare->iot_mode_enable)
9887 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))
9888 // for Intel IOT, need to enlarge CW MAX from 6 to 10
9889 if (pstat && pstat->is_intel_sta && (((pstat->tx_avarage+pstat->rx_avarage)>>10) <
9890 priv->pshare->rf_ft_var.cwmax_enhance_thd))
9892 if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)
9894 priv->pshare->BE_cwmax_enhance = 1;
9898 if (priv->pshare->BE_cwmax_enhance) {
9899 priv->pshare->BE_cwmax_enhance = 0;
9906 priv->pshare->current_tx_bytes = 0;
9907 priv->pshare->current_rx_bytes = 0;
9910 #if((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))
9911 if ((priv->assoc_num > 1) && (AMPDU_ENABLE))
9913 if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){
9914 if ((priv->swq_en == 0)){
9916 if (priv->pshare->txop_enlarge == 0)
9917 priv->pshare->txop_enlarge = 2;
9922 if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
9924 priv->pshare->txop_enlarge = 2;
9929 else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){
9932 else if ((priv->swq_en == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) {
9933 priv->pshare->txop_enlarge = 2;
9937 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined CONFIG_RTL_819XD))
9938 else if( (priv->assoc_num == 1) && (AMPDU_ENABLE)) {
9940 int en_thd = 14417920>>(priv->up_time % 2);
9941 if ((priv->swq_en == 0) && (pstat->current_tx_bytes > en_thd) && (pstat->current_rx_bytes > en_thd) ) { //50Mbps
9943 priv->swqen_keeptime = priv->up_time;
9945 else if ((priv->swq_en == 1) && ((pstat->tx_avarage < 4587520) || (pstat->rx_avarage < 4587520))) { //35Mbps
9947 priv->swqen_keeptime = 0;
9952 priv->swqen_keeptime = 0;
9960 if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))
9962 if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {
9963 unsigned int thd_tp;
9964 unsigned char under_thd;
9965 unsigned int curr_tp;
9967 if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))
9969 // Determine the upper bound throughput threshold.
9970 if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {
9971 if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)
9972 thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
9974 thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;
9977 thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
9979 // Determine to close txop.
9980 curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);
9981 if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)
9993 priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
9994 priv->pshare->rf_ft_var.low_tp_txop_count = 0;
9996 else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {
9997 priv->pshare->rf_ft_var.low_tp_txop_count++;
9998 if (priv->pshare->rf_ft_var.low_tp_txop_close) {
9999 priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;
10001 if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay)
10004 priv->pshare->rf_ft_var.low_tp_txop_count = 0;
10005 priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
10011 priv->pshare->rf_ft_var.low_tp_txop_count = 0;
10018 ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );
10024 #if( DM_ODM_SUPPORT_TYPE == ODM_WIN)
10026 // 2011/07/26 MH Add an API for testing IQK fail case.
10029 ODM_CheckPowerStatus(
10030 IN PADAPTER Adapter)
10033 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10034 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
10035 RT_RF_POWER_STATE rtState;
10036 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
10038 // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.
10039 if (pMgntInfo->init_adpt_in_progress == TRUE)
10041 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter"));
10046 // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.
10048 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));
10049 if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)
10051 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n",
10052 Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));
10059 // need to ODM CE Platform
10060 //move to here for ANT detection mechanism using
10062 #if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
10065 IN PDM_ODM_T pDM_Odm,
10066 unsigned int point,
10067 u1Byte initial_gain_psd)
10069 //unsigned int val, rfval;
10073 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10075 //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
10076 //DbgPrint("Reg908 = 0x%x\n",val);
10077 //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
10078 //rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
10079 //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
10080 //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
10081 //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
10083 //Set DCO frequency index, offset=(40MHz/SamplePts)*point
10084 ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
10086 //Start PSD calculation, Reg808[22]=0->1
10087 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
10088 //Need to wait for HW PSD report
10089 ODM_StallExecution(1000);
10090 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
10091 //Read PSD report, Reg8B4[15:0]
10092 psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
10094 #if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))
10095 psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
10097 psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);
10112 Value = Value & 0xFFFF;
10116 if (Value <= dB_Invert_Table[i][11])
10124 return (96); // maximum 96 dB
10129 if (Value <= dB_Invert_Table[i][j])
10144 // PSD function will be moved to FW in future IC, but now is only implemented in MP platform
10145 // So PSD function will not be incorporated to common ODM
10147 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
10149 #define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD
10150 #define MODE_40M 0 //0:20M, 1:40M
10152 #define PSD_CHMIN 20 // Minimum channel number for BT AFH
10153 #define SIR_STEP_SIZE 3
10154 #define Smooth_Size_1 5
10155 #define Smooth_TH_1 3
10156 #define Smooth_Size_2 10
10157 #define Smooth_TH_2 4
10158 #define Smooth_Size_3 20
10159 #define Smooth_TH_3 4
10160 #define Smooth_Step_Size 5
10161 #define Adaptive_SIR 1
10162 //#if(RTL8723_FPGA_VERIFICATION == 1)
10163 //#define PSD_RESCAN 1
10165 //#define PSD_RESCAN 4
10167 #define SCAN_INTERVAL 1500 //ms
10168 #define SYN_Length 5 // for 92D
10170 #define LNA_Low_Gain_1 0x64
10171 #define LNA_Low_Gain_2 0x5A
10172 #define LNA_Low_Gain_3 0x58
10174 #define pw_th_10dB 0x0
10175 #define pw_th_16dB 0x3
10177 #define FA_RXHP_TH1 5000
10178 #define FA_RXHP_TH2 1500
10179 #define FA_RXHP_TH3 800
10180 #define FA_RXHP_TH4 600
10181 #define FA_RXHP_TH5 500
10183 #define Idle_Mode 0
10184 #define High_TP_Mode 1
10185 #define Low_TP_Mode 2
10189 odm_PSDMonitorInit(
10190 IN PDM_ODM_T pDM_Odm)
10192 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
10193 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10194 //PSD Monitor Setting
10195 //Which path in ADC/DAC is turnned on for PSD: both I/Q
10196 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
10197 //Ageraged number: 8
10198 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
10199 pDM_Odm->bPSDinProcess = FALSE;
10200 pDM_Odm->bUserAssignLevel = FALSE;
10201 pDM_Odm->bPSDactive = FALSE;
10202 //pDM_Odm->bDMInitialGainEnable=TRUE; //change the initialization to DIGinit
10204 //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
10205 //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
10206 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
10207 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
10209 //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
10215 IN PDM_ODM_T pDM_Odm,
10216 pu4Byte PSD_report,
10217 u1Byte initial_gain_psd
10220 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10221 //PADAPTER pAdapter;
10225 //2 Switch to CH11 to patch CH9 and CH13 DC tone
10226 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
10228 if(pDM_Odm->SupportICType== ODM_RTL8192D)
10230 if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
10232 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
10233 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
10234 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
10235 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
10236 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);
10237 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);
10241 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
10242 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
10243 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
10244 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);
10245 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);
10249 //Ch9 DC tone patch
10250 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
10251 PSD_report[50] = psd_report;
10252 //Ch13 DC tone patch
10253 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
10254 PSD_report[70] = psd_report;
10256 //2 Switch to CH3 to patch CH1 and CH5 DC tone
10257 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
10260 if(pDM_Odm->SupportICType==ODM_RTL8192D)
10262 if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
10264 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
10265 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
10266 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
10267 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
10268 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);
10269 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
10273 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
10274 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
10275 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
10276 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);
10277 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
10281 //Ch1 DC tone patch
10282 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
10283 PSD_report[10] = psd_report;
10284 //Ch5 DC tone patch
10285 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
10286 PSD_report[30] = psd_report;
10292 GoodChannelDecision(
10294 pu4Byte PSD_report,
10295 pu1Byte PSD_bitmap,
10297 pu1Byte PSD_bitmap_memory)
10299 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
10300 //s4Byte TH1 = SSBT-0x15; // modify TH by Neil Chen
10301 s4Byte TH1= RSSI_BT+0x14;
10302 s4Byte TH2 = RSSI_BT+85;
10305 u1Byte bitmap, Smooth_size[3], Smooth_TH[3];
10307 u4Byte i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
10308 int start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
10310 // RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
10312 if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
10314 TH1 = RSSI_BT + 0x14;
10317 Smooth_size[0]=Smooth_Size_1;
10318 Smooth_size[1]=Smooth_Size_2;
10319 Smooth_size[2]=Smooth_Size_3;
10320 Smooth_TH[0]=Smooth_TH_1;
10321 Smooth_TH[1]=Smooth_TH_2;
10322 Smooth_TH[2]=Smooth_TH_3;
10323 Smooth_Interval[0]=16;
10324 Smooth_Interval[1]=15;
10325 Smooth_Interval[2]=13;
10327 if(pDM_Odm->SupportICType==ODM_RTL8723A)
10333 else if(RSSI_BT >=38) // >= -15dBm
10335 else if((RSSI_BT >=33)&(RSSI_BT <38))
10336 TH1 = 99+(RSSI_BT-33); //0x63
10337 else if((RSSI_BT >=26)&(RSSI_BT<33))
10338 TH1 = 99-(33-RSSI_BT)+2; //0x5e
10339 else if((RSSI_BT >=24)&(RSSI_BT<26))
10340 TH1 = 88-((RSSI_BT-24)*3); //0x58
10341 else if((RSSI_BT >=18)&(RSSI_BT<24))
10342 TH1 = 77+((RSSI_BT-18)*2);
10343 else if((RSSI_BT >=14)&(RSSI_BT<18))
10344 TH1 = 63+((RSSI_BT-14)*2);
10345 else if((RSSI_BT >=8)&(RSSI_BT<14))
10346 TH1 = 58+((RSSI_BT-8)*2);
10347 else if((RSSI_BT >=3)&(RSSI_BT<8))
10348 TH1 = 52+(RSSI_BT-3);
10353 for (i = 0; i< 10; i++)
10358 for (i=0; i<80; i++)
10359 pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
10364 if(pDM_Odm->SupportICType==ODM_RTL8723A)
10366 TH1 =TH1-SIR_STEP_SIZE;
10368 while (good_cnt < PSD_CHMIN)
10371 if(pDM_Odm->SupportICType==ODM_RTL8723A)
10375 if((TH1+SIR_STEP_SIZE) < TH2)
10376 TH1 += SIR_STEP_SIZE;
10382 if(TH1==(RSSI_BT+0x1E))
10384 if((TH1+2) < (RSSI_BT+0x1E))
10387 TH1 = RSSI_BT+0x1E;
10390 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
10392 for (i = 0; i< 80; i++)
10394 if((s4Byte)(PSD_report[i]) < TH1)
10397 bit_idx = i -8*byte_idx;
10398 bitmap = PSD_bitmap[byte_idx];
10399 PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
10404 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
10407 //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
10408 for (i = 0; i<8; i++)
10409 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
10413 //1 Start of smoothing function
10419 for(n=0; n<Smooth_Interval[j]; n++)
10421 good_cnt_smoothing = 0;
10422 cur_bit_idx = start_bit_idx;
10423 cur_byte_idx = start_byte_idx;
10424 for ( i=0; i < Smooth_size[j]; i++)
10426 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
10427 if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
10428 good_cnt_smoothing++;
10432 if( good_cnt_smoothing < Smooth_TH[j] )
10434 cur_bit_idx = start_bit_idx;
10435 cur_byte_idx = start_byte_idx;
10436 for ( i=0; i< Smooth_size[j] ; i++)
10438 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
10439 PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
10442 start_bit_idx = start_bit_idx + Smooth_Step_Size;
10443 while ( (start_bit_idx) > 7 )
10445 start_byte_idx= start_byte_idx+start_bit_idx/8;
10446 start_bit_idx = start_bit_idx%8;
10450 ODM_RT_TRACE( pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
10453 for (i = 0; i<8; i++)
10455 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
10457 if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1) //----- Add By Gary
10459 pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
10460 } // ------end by Gary
10468 for ( i = 0; i < 10; i++)
10470 for (n = 0; n < 8; n++)
10471 if((PSD_bitmap[i]& BIT(n)) != 0)
10474 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: good channel cnt = %u",good_cnt));
10477 //RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
10478 for (i = 0; i <10; i++)
10479 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
10481 //Update bitmap memory
10482 for(i = 0; i < 80; i++)
10485 bit_idx = i -8*byte_idx;
10486 psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
10487 bitmap = PSD_bitmap_memory[i];
10488 PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
10500 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10501 //PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
10503 unsigned int pts, start_point, stop_point;
10504 u1Byte initial_gain ;
10505 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
10506 static u1Byte psd_cnt=0;
10507 static u4Byte PSD_report[80], PSD_report_tmp;
10508 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
10509 u1Byte H2C_PSD_DATA[5]={0,0,0,0,0};
10510 static u1Byte H2C_PSD_DATA_last[5] ={0,0,0,0,0};
10511 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
10512 0,3,6,10,13,16,19,22,26,29};
10513 u1Byte n, i, channel, BBReset,tone_idx;
10514 u1Byte PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
10515 s4Byte PSD_skip_start, PSD_skip_stop;
10516 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
10517 u4Byte ReScan, Interval, Is40MHz;
10518 u8Byte curTxOkCnt, curRxOkCnt;
10519 int cur_byte_idx, cur_bit_idx;
10520 PADAPTER Adapter = pDM_Odm->Adapter;
10521 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
10523 if( (*(pDM_Odm->pbScanInProcess)) ||
10524 pDM_Odm->bLinkInProcess)
10526 if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
10528 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms
10534 if(pDM_Odm->bBtHsOperation)
10537 Interval = SCAN_INTERVAL;
10541 ReScan = PSD_RESCAN;
10542 Interval = SCAN_INTERVAL;
10546 if(init_memory == 0)
10548 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
10549 for(i = 0; i < 80; i++)
10550 PSD_bitmap_memory[i] = 0xFF; // channel is always good
10555 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
10556 for(i = 0; i < 80; i++)
10560 //1 Backup Current Settings
10561 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
10563 if(pDM_Odm->SupportICType==ODM_RTL8192D)
10565 //2 Record Current synthesizer parameters based on current channel
10566 if((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))
10568 SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);
10569 SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);
10570 SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);
10571 SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);
10572 SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);
10574 else // DualMAC_DualPHY 2G
10576 SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);
10577 SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);
10578 SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);
10579 SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);
10580 SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);
10584 //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
10585 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
10587 //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
10588 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
10591 if(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))
10596 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
10598 //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
10599 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
10602 //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
10603 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
10605 //Force RX to stop TX immediately
10606 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
10608 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
10610 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
10611 //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
10612 //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
10614 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
10615 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
10619 //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
10620 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
10623 //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
10624 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
10626 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
10627 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
10628 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess
10629 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
10630 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
10631 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
10633 //1 Leave RX idle low power
10634 //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
10636 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
10637 //1 Fix initial gain
10638 //if (IS_HARDWARE_TYPE_8723AE(Adapter))
10639 //RSSI_BT = pHalData->RSSI_BT;
10640 //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
10641 // RSSI_BT = RSSI_BT_new;
10643 if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
10644 RSSI_BT=pDM_Odm->RSSI_BT; //need to check C2H to pDM_Odm RSSI BT
10649 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
10651 if(pDM_Odm->SupportICType==ODM_RTL8723A)
10653 //Neil add--2011--10--12
10654 //2 Initial Gain index
10655 if(RSSI_BT >=35) // >= -15dBm
10656 initial_gain_psd = RSSI_BT*2;
10657 else if((RSSI_BT >=33)&(RSSI_BT<35))
10658 initial_gain_psd = RSSI_BT*2+6;
10659 else if((RSSI_BT >=24)&(RSSI_BT<33))
10660 initial_gain_psd = 70-(33-RSSI_BT);
10661 else if((RSSI_BT >=19)&(RSSI_BT<24))
10662 initial_gain_psd = 64-((24-RSSI_BT)*4);
10663 else if((RSSI_BT >=14)&(RSSI_BT<19))
10664 initial_gain_psd = 44-((18-RSSI_BT)*2);
10665 else if((RSSI_BT >=8)&(RSSI_BT<14))
10666 initial_gain_psd = 35-(14-RSSI_BT);
10668 initial_gain_psd = 0x1B;
10674 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
10679 //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
10680 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
10682 //initialGainUpper = 0x5E; //Modify by neil chen
10684 if(pDM_Odm->bUserAssignLevel)
10686 pDM_Odm->bUserAssignLevel = FALSE;
10687 initialGainUpper = 0x7f;
10691 initialGainUpper = 0x5E;
10695 if (initial_gain_psd < 0x1a)
10696 initial_gain_psd = 0x1a;
10697 if (initial_gain_psd > initialGainUpper)
10698 initial_gain_psd = initialGainUpper;
10701 //if(pDM_Odm->SupportICType==ODM_RTL8723A)
10702 SSBT = RSSI_BT * 2 +0x3E;
10705 //if(IS_HARDWARE_TYPE_8723AE(Adapter))
10706 // SSBT = RSSI_BT * 2 +0x3E;
10707 //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
10709 // RSSI_BT = initial_gain_psd;
10712 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
10713 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
10714 //DbgPrint("PSD: SSBT= %d", SSBT);
10716 //pMgntInfo->bDMInitialGainEnable = FALSE;
10717 pDM_Odm->bDMInitialGainEnable = FALSE;
10718 initial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);
10720 // make sure the initial gain is under the correct range.
10721 //initial_gain_psd &= 0x7f;
10722 ODM_Write_DIG(pDM_Odm, initial_gain_psd);
10723 //1 Turn off 3-wire
10724 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
10726 //pts value = 128, 256, 512, 1024
10731 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
10735 else if(pts == 256)
10737 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
10741 else if(pts == 512)
10743 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
10749 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
10755 //3 Skip WLAN channels if WLAN busy
10757 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
10758 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
10759 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
10760 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
10764 wlan_channel = CurrentChannel & 0x0f;
10766 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
10767 if(pDM_Odm->SupportICType==ODM_RTL8723A)
10769 if(pDM_Odm->bBtHsOperation)
10771 if(pDM_Odm->bLinked)
10775 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
10776 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
10780 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
10781 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
10787 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
10788 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
10790 if(PSD_skip_start < 0)
10791 PSD_skip_start = 0;
10792 if(PSD_skip_stop >80)
10793 PSD_skip_stop = 80;
10797 if((curRxOkCnt+curTxOkCnt) > 5)
10801 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
10802 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
10806 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
10807 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
10810 if(PSD_skip_start < 0)
10811 PSD_skip_start = 0;
10812 if(PSD_skip_stop >80)
10813 PSD_skip_stop = 80;
10820 if((curRxOkCnt+curTxOkCnt) > 1000)
10822 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
10823 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
10826 #endif //Reove RXHP Issue
10827 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
10833 channel = (n/20)*4 + 1;
10835 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
10838 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
10840 PSD_report[n] = SSBT;
10841 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
10845 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
10847 if ( PSD_report_tmp > PSD_report[n])
10848 PSD_report[n] = PSD_report_tmp;
10853 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
10858 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
10859 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
10861 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
10865 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
10867 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
10868 //1 Restore Current Settings
10870 pDM_Odm->bDMInitialGainEnable = TRUE;
10872 ODM_Write_DIG(pDM_Odm, initial_gain);
10874 // restore originl center frequency
10875 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
10878 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
10879 //Restore RX idle low power
10880 if(RxIdleLowPwr == TRUE)
10881 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
10884 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
10885 if (psd_cnt < ReScan)
10886 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);
10891 //DbgPrint("psd_report[%d]= %d \n", 2402+i, PSD_report[i]);
10892 RT_TRACE( COMP_PSD, DBG_LOUD,("psd_report[%d]= %d \n", 2402+i, PSD_report[i]));
10895 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
10897 if(pDM_Odm->SupportICType==ODM_RTL8723A)
10902 //2 Restore H2C PSD Data to Last Data
10903 H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
10904 H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
10905 H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
10906 H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
10907 H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
10910 //2 Translate 80bit channel map to 40bit channel
10915 cur_byte_idx = i*2 + n/4;
10916 cur_bit_idx = (n%4)*2;
10917 if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
10918 H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
10920 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
10923 //3 To Compare the difference
10926 if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
10928 FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
10929 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("Need to Update the AFH Map \n"));
10935 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Not need to Update\n"));
10938 if(pDM_Odm->bBtHsOperation)
10940 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);
10941 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
10945 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);
10946 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
10952 //Neil for Get BT RSSI
10953 // Be Triggered by BT C2H CMD
10966 IN PDM_ODM_T pDM_Odm
10969 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10971 //if(IS_HARDWARE_TYPE_8723AE(Adapter))
10973 if(pDM_Odm->SupportICType == ODM_RTL8723A) //may need to add other IC type
10975 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
10977 if(pDM_Odm->bBtDisabled) //need to check upper layer connection
10979 pDM_Odm->bPSDactive=FALSE;
10980 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
10984 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
10986 pDM_Odm->bPSDinProcess = TRUE;
10987 pDM_Odm->bPSDactive=TRUE;
10988 odm_PSD_Monitor(pDM_Odm);
10989 pDM_Odm->bPSDinProcess = FALSE;
10995 odm_PSDMonitorCallback(
10999 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
11000 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11002 PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
11006 odm_PSDMonitorWorkItemCallback(
11010 PADAPTER Adapter = (PADAPTER)pContext;
11011 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11012 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
11014 ODM_PSDMonitor(pDM_Odm);
11017 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
11020 IN PDM_ODM_T pDM_Odm,
11024 PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
11025 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11026 static u1Byte TRSW_HighPwr = 0;
11028 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
11029 RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
11031 if (pHalData->RFEType == 3) {
11033 pDM_Odm->RSSI_TRSW = RSSIVal;
11035 if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
11037 TRSW_HighPwr = 1; // Switch to
11038 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
11039 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); // Set ANTSW=1/ANTSWB=0 for SW control
11042 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
11044 TRSW_HighPwr = 0; // Switched back
11045 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
11046 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0); // Set ANTSW=1/ANTSWB=0 for SW control
11052 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));
11053 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n",
11054 RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
11055 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));
11060 IN PDM_ODM_T pDM_Odm
11063 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
11064 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
11065 u1Byte CurrentIGI = (u1Byte)pDM_DigTable->CurIGValue;
11066 u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20, C50, E50;
11068 u1Byte IGI_A = 0x20, IGI_B = 0x20;
11075 ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
11077 odm_FalseAlarmCounterStatistics( pDM_Odm);
11078 pDM_Odm->LastNumQryPhyStatusAll = pDM_Odm->NumQryPhyStatusAll;
11079 pDM_Odm->NumQryPhyStatusAll = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
11080 RXOK_cal = pDM_Odm->NumQryPhyStatusAll - pDM_Odm->LastNumQryPhyStatusAll;
11083 pDM_Odm->RxPWDBAve_final= 0;
11085 pDM_Odm->RxPWDBAve_final= pDM_Odm->RxPWDBAve/RXOK_cal;
11087 pDM_Odm->RxPWDBAve = 0;
11088 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
11089 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
11091 // <20130315, Kordan> Except Cameo, we should always trun on 2.4G/5G DIG.
11092 // (Cameo fixes the IGI of 2.4G, so only DIG on 5G. Asked by James.)
11094 if (*pDM_Odm->pBandType == BAND_ON_5G){ // for 5G
11096 if (1){ // for both 2G/5G
11098 pDM_Odm->MPDIG_2G = FALSE;
11099 pDM_Odm->Times_2G = 0;
11101 if (RXOK_cal >= 70 && pDM_Odm->RxPWDBAve_final<= 30)
11103 if (CurrentIGI > 0x24){
11104 ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, 0x24);
11105 ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, 0x24);
11110 if(pFalseAlmCnt->Cnt_all > 1000){
11111 CurrentIGI = CurrentIGI + 8;
11113 else if(pFalseAlmCnt->Cnt_all > 200){
11114 CurrentIGI = CurrentIGI + 4;
11116 else if (pFalseAlmCnt->Cnt_all > 50){
11117 CurrentIGI = CurrentIGI + 2;
11119 else if (pFalseAlmCnt->Cnt_all < 2){
11120 CurrentIGI = CurrentIGI - 2;
11123 if (CurrentIGI < DIG_Lower ){
11124 CurrentIGI = DIG_Lower;
11126 else if(CurrentIGI > DIG_Upper){
11127 CurrentIGI = DIG_Upper;
11130 pDM_DigTable->CurIGValue = CurrentIGI;
11132 ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)CurrentIGI);
11133 ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)CurrentIGI);
11135 C50 = ODM_Read1Byte( pDM_Odm, 0xc50);
11136 E50 = ODM_Read1Byte( pDM_Odm, 0xe50);
11137 //pDM_Odm->MPDIG_2G = FALSE;
11138 ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("DIG = (%x, %x), Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", C50, E50, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
11144 ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("MPDIG_2G = %d,\n", pDM_Odm->MPDIG_2G));
11146 if(pDM_Odm->MPDIG_2G == FALSE){
11147 ODM_RT_TRACE(pDM_Odm,ODM_COMP_MP, DBG_LOUD, ("===> Fix IGI\n"));
11148 ODM_Write1Byte( pDM_Odm, rA_IGI_Jaguar, (u1Byte)IGI_A);
11149 ODM_Write1Byte( pDM_Odm, rB_IGI_Jaguar, (u1Byte)IGI_B);
11151 if (pDM_Odm->Times_2G == 2)
11152 pDM_Odm->MPDIG_2G = TRUE;
11153 pDM_Odm->Times_2G++;
11155 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, DBG_LOUD, ("pDM_Odm->RxPWDBAve_final = %d\n", pDM_Odm->RxPWDBAve_final));
11157 if (pDM_Odm->SupportICType == ODM_RTL8812)
11158 odm_RFEControl(pDM_Odm, pDM_Odm->RxPWDBAve_final);
11160 ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
11165 odm_MPT_DIGCallback(
11169 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
11170 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11171 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
11174 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
11176 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
11178 ODM_MPT_DIG(pDM_Odm);
11181 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
11187 odm_MPT_DIGWorkItemCallback(
11191 PADAPTER Adapter = (PADAPTER)pContext;
11192 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11193 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
11195 ODM_MPT_DIG(pDM_Odm);
11201 //cosa debug tool need to modify
11205 IN PADAPTER Adapter,
11210 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
11211 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11212 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
11214 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
11217 pDM_Odm->RSSI_BT = (u1Byte)btRssi;
11218 pDM_Odm->bUserAssignLevel = TRUE;
11219 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms
11223 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
11229 //#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
11232 IN PDM_ODM_T pDM_Odm)
11234 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
11235 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
11238 pRX_HP_Table->RXHP_enable = TRUE;
11239 pRX_HP_Table->RXHP_flag = 0;
11240 pRX_HP_Table->PSD_func_trigger = 0;
11241 pRX_HP_Table->Pre_IGI = 0x20;
11242 pRX_HP_Table->Cur_IGI = 0x20;
11243 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
11244 pRX_HP_Table->Pre_pw_th = pw_th_10dB;
11245 for(index=0; index<80; index++)
11246 pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
11248 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
11249 pRX_HP_Table->TP_Mode = Idle_Mode;
11255 IN PDM_ODM_T pDM_Odm)
11257 #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
11258 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
11259 PADAPTER Adapter = pDM_Odm->Adapter;
11260 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
11261 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
11262 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
11263 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
11267 s1Byte Intf_diff_idx, MIN_Intf_diff_idx = 16;
11268 s4Byte cur_channel;
11269 u1Byte ch_map_intf_5M[17] = {0};
11270 static u4Byte FA_TH = 0;
11271 static u1Byte psd_intf_flag = 0;
11272 static s4Byte curRssi = 0;
11273 static s4Byte preRssi = 0;
11274 static u1Byte PSDTriggerCnt = 1;
11276 u1Byte RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31); // for debug!!
11278 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
11279 static s8Byte lastTxOkCnt = 0, lastRxOkCnt = 0;
11280 s8Byte curTxOkCnt, curRxOkCnt;
11282 s8Byte TP_Acc3, TP_Acc5;
11283 static s8Byte TP_Buff[5] = {0};
11284 static u1Byte pre_state = 0, pre_state_flag = 0;
11285 static u1Byte Intf_HighTP_flag = 0, De_counter = 16;
11286 static u1Byte TP_Degrade_flag = 0;
11288 static u1Byte LatchCnt = 0;
11290 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))
11292 //AGC RX High Power Mode is only applied on 2G band in 92D!!!
11293 if(pDM_Odm->SupportICType == ODM_RTL8192D)
11295 if(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
11299 if(!(pDM_Odm->SupportAbility==ODM_BB_RXHP))
11304 if(RX_HP_enable == 1)
11305 pRX_HP_Table->RXHP_enable = FALSE;
11307 pRX_HP_Table->RXHP_enable = TRUE;
11309 if(pRX_HP_Table->RXHP_enable == FALSE)
11311 if(pRX_HP_Table->RXHP_flag == 1)
11313 pRX_HP_Table->RXHP_flag = 0;
11319 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
11320 //2 Record current TP for USB interface
11321 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
11322 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
11323 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
11324 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
11326 curTPOkCnt = curTxOkCnt+curRxOkCnt;
11327 TP_Buff[0] = curTPOkCnt; // current TP
11328 TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
11329 TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
11332 pRX_HP_Table->TP_Mode = Idle_Mode;
11333 else if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
11334 pRX_HP_Table->TP_Mode = Low_TP_Mode;
11336 pRX_HP_Table->TP_Mode = High_TP_Mode;
11338 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
11339 // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
11340 // When LatchCnt = 0, we would Get PSD result.
11341 if(TP_Degrade_flag == 1)
11346 TP_Degrade_flag = 0;
11349 // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
11350 // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
11351 if(Intf_HighTP_flag == 1)
11354 if(De_counter == 0)
11356 Intf_HighTP_flag = 0;
11362 //2 AGC RX High Power Mode by PSD only applied to STA Mode
11363 //3 NOT applied 1. Ad Hoc Mode.
11364 //3 NOT applied 2. AP Mode
11365 if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
11367 Is40MHz = *(pDM_Odm->pBandWidth);
11368 curRssi = pDM_Odm->RSSI_Min;
11369 cur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
11370 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
11371 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
11372 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
11373 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
11374 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
11375 //2 PSD function would be triggered
11376 //3 1. Every 4 sec for PCIE
11377 //3 2. Before TP Mode (Idle TP<4kbps) for USB
11378 //3 3. After TP Mode (High TP) for USB
11379 if((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0)) // Only RSSI>TH and RX_HP_flag=0 will Do PSD process
11381 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
11382 //2 Before TP Mode ==> PSD would be trigger every 4 sec
11383 if(pRX_HP_Table->TP_Mode == Idle_Mode) //2.1 less wlan traffic <4kbps
11386 if(PSDTriggerCnt == 1)
11388 odm_PSD_RXHP(pDM_Odm);
11389 pRX_HP_Table->PSD_func_trigger = 1;
11396 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
11398 //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
11399 if(pRX_HP_Table->TP_Mode == High_TP_Mode)
11401 if((pre_state_flag == 0)&&(LatchCnt == 0))
11404 if((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
11407 if(pre_state == 3) // hit pre_state condition => consecutive 3 times
11409 pre_state_flag = 1;
11419 //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
11420 if(pre_state_flag == 1)
11422 if(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3)) // degrade 20%
11424 odm_PSD_RXHP(pDM_Odm);
11425 pRX_HP_Table->PSD_func_trigger = 1;
11426 TP_Degrade_flag = 1;
11428 pre_state_flag = 0;
11430 else if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
11432 odm_PSD_RXHP(pDM_Odm);
11433 pRX_HP_Table->PSD_func_trigger = 1;
11434 TP_Degrade_flag = 1;
11436 pre_state_flag = 0;
11438 else if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
11440 odm_PSD_RXHP(pDM_Odm);
11441 pRX_HP_Table->PSD_func_trigger = 1;
11442 TP_Degrade_flag = 1;
11444 pre_state_flag = 0;
11451 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
11454 TP_Buff[4-i] = TP_Buff[3-i];
11457 //2 Update PSD bitmap according to PSD report
11458 if((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
11460 //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
11461 for (i = 0 ; i < 16 ; i++)
11464 for(j = 0; j < 5 ; j++)
11465 sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
11469 ch_map_intf_5M[i] = 1; // interference flag
11472 //=============just for debug=========================
11473 //for(i=0;i<16;i++)
11474 //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
11475 //===============================================
11476 //2 Mask target channel 5M index
11477 for(i = 0; i < (4+4*Is40MHz) ; i++)
11479 ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;
11483 for(i = 0; i < 16; i++)
11485 if(ch_map_intf_5M[i] == 1)
11487 psd_intf_flag = 1; // interference is detected!!!
11492 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
11493 if(pRX_HP_Table->TP_Mode!=Idle_Mode)
11495 if(psd_intf_flag == 1) // to avoid psd_intf_flag always 1
11497 Intf_HighTP_flag = 1;
11498 De_counter = 32; // 0x1E -> 0x3E needs 32 times by each IGI step =1
11502 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
11503 //2 Distance between target channel and interference
11504 for(i = 0; i < 16; i++)
11506 if(ch_map_intf_5M[i] == 1)
11508 Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));
11509 if(Intf_diff_idx < MIN_Intf_diff_idx)
11510 MIN_Intf_diff_idx = Intf_diff_idx; // the min difference index between interference and target
11513 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx));
11514 //2 Choose False Alarm Threshold
11515 switch (MIN_Intf_diff_idx){
11520 FA_TH = FA_RXHP_TH1;
11524 FA_TH = FA_RXHP_TH2;
11528 FA_TH = FA_RXHP_TH3;
11532 FA_TH = FA_RXHP_TH4;
11540 FA_TH = FA_RXHP_TH5;
11543 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
11544 pRX_HP_Table->PSD_func_trigger = 0;
11546 //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
11547 if(pRX_HP_Table->RXHP_flag == 1)
11549 if ((curRssi > 80)&&(preRssi < 80))
11551 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
11553 else if ((curRssi < 80)&&(preRssi > 80))
11555 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
11557 else if ((curRssi > 72)&&(preRssi < 72))
11559 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
11561 else if ((curRssi < 72)&&( preRssi > 72))
11563 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
11565 else if (curRssi < 68) //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
11567 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
11568 pRX_HP_Table->RXHP_flag = 0; // Back to Normal DIG Mode
11572 else // pRX_HP_Table->RXHP_flag == 0
11574 //1 Decide whether to enter AGC RX High Power Mode
11575 if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&
11576 (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
11580 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
11582 else if (curRssi > 72)
11584 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
11588 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
11590 pRX_HP_Table->Cur_pw_th = pw_th_16dB; //RegC54[9:8]=2'b11: to enter AGC Flow 3
11591 pRX_HP_Table->First_time_enter = TRUE;
11592 pRX_HP_Table->RXHP_flag = 1; // RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
11596 odm_Write_RXHP(pDM_Odm);
11598 #endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
11599 #endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
11602 void odm_Write_RXHP(
11603 IN PDM_ODM_T pDM_Odm)
11605 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
11608 if(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
11610 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
11611 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
11614 if(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
11616 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th); // RegC54[9:8]=2'b11: AGC Flow 3
11619 if(pRX_HP_Table->RXHP_flag == 0)
11621 pRX_HP_Table->Cur_IGI = 0x20;
11625 currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
11626 if(currentIGI<0x50)
11628 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
11629 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
11632 pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
11633 pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
11639 IN PDM_ODM_T pDM_Odm
11642 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
11643 PADAPTER Adapter = pDM_Odm->Adapter;
11644 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
11645 unsigned int pts, start_point, stop_point, initial_gain ;
11646 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
11647 static u1Byte psd_cnt=0;
11648 static u4Byte PSD_report[80], PSD_report_tmp;
11649 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
11650 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
11651 0,3,6,10,13,16,19,22,26,29};
11652 u1Byte n, i, channel, BBReset,tone_idx;
11653 u1Byte PSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
11654 s4Byte PSD_skip_start, PSD_skip_stop;
11655 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
11656 u4Byte ReScan, Interval, Is40MHz;
11657 u8Byte curTxOkCnt, curRxOkCnt;
11658 //--------------2G band synthesizer for 92D switch RF channel using-----------------
11659 u1Byte group_idx=0;
11660 u4Byte SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
11661 u4Byte SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C}; // synthesizer RF register for 2G channel
11662 u4Byte SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}, // For CH1,2,4,9,10.11.12 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
11663 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840}, // For CH3,13,14
11664 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}}; // For Ch5,6,7,8
11665 //--------------------- Add by Gary for Debug setting ----------------------
11666 u1Byte RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
11667 u1Byte rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
11668 //---------------------------------------------------------------------
11670 if(pMgntInfo->bScanInProgress)
11675 ReScan = PSD_RESCAN;
11676 Interval = SCAN_INTERVAL;
11680 if(init_memory == 0)
11682 RT_TRACE( COMP_PSD, DBG_LOUD,("Init memory\n"));
11683 for(i = 0; i < 80; i++)
11684 PSD_bitmap_memory[i] = 0xFF; // channel is always good
11689 RT_TRACE(COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
11690 for(i = 0; i < 80; i++)
11694 //1 Backup Current Settings
11695 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
11696 if(pDM_Odm->SupportICType == ODM_RTL8192D)
11698 //2 Record Current synthesizer parameters based on current channel
11699 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
11701 SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);
11702 SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);
11703 SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);
11704 SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);
11705 SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);
11707 else // DualMAC_DualPHY 2G
11709 SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);
11710 SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);
11711 SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);
11712 SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);
11713 SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);
11716 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
11717 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
11718 Is40MHz = *(pDM_Odm->pBandWidth);
11719 ODM_RT_TRACE(pDM_Odm, COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
11721 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
11724 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
11725 //Force RX to stop TX immediately
11726 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
11728 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
11729 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
11730 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
11732 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
11734 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess
11735 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
11736 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
11737 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
11738 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
11739 //1 Leave RX idle low power
11740 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
11741 //1 Fix initial gain
11742 RSSI_BT = RSSI_BT_new;
11743 RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
11745 if(rssi_ctrl == 1) // just for debug!!
11746 initial_gain_psd = RSSI_BT_new;
11748 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
11750 RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
11752 initialGainUpper = 0x54;
11754 RSSI_BT = initial_gain_psd;
11757 //RT_TRACE( COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
11758 RT_TRACE( COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
11760 pDM_Odm->bDMInitialGainEnable = FALSE;
11761 initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
11762 //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd);
11763 ODM_Write_DIG(pDM_Odm, initial_gain_psd);
11764 //1 Turn off 3-wire
11765 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
11767 //pts value = 128, 256, 512, 1024
11772 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
11776 else if(pts == 256)
11778 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
11782 else if(pts == 512)
11784 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
11790 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
11796 //3 Skip WLAN channels if WLAN busy
11797 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
11798 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
11799 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
11800 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
11804 wlan_channel = CurrentChannel & 0x0f;
11806 RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
11808 if((curRxOkCnt+curTxOkCnt) > 1000)
11810 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
11811 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
11814 RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
11820 channel = (n/20)*4 + 1;
11821 if(pDM_Odm->SupportICType == ODM_RTL8192D)
11836 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
11838 for(i = 0; i < SYN_Length; i++)
11839 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
11841 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
11842 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
11844 else // DualMAC_DualPHY 2G
11846 for(i = 0; i < SYN_Length; i++)
11847 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
11849 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
11853 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
11856 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
11858 PSD_report[n] = initial_gain_psd;//SSBT;
11859 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
11863 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
11865 if ( PSD_report_tmp > PSD_report[n])
11866 PSD_report[n] = PSD_report_tmp;
11871 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
11876 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
11877 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
11879 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
11882 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
11884 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
11885 //1 Restore Current Settings
11887 pDM_Odm->bDMInitialGainEnable= TRUE;
11888 //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
11889 ODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);
11890 // restore originl center frequency
11891 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
11892 if(pDM_Odm->SupportICType == ODM_RTL8192D)
11894 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
11896 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
11897 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
11898 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
11899 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
11900 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
11901 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
11903 else // DualMAC_DualPHY
11905 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
11906 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
11907 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
11908 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
11909 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
11913 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
11914 //Restore RX idle low power
11915 if(RxIdleLowPwr == TRUE)
11916 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
11919 //gPrint("psd cnt=%d\n", psd_cnt);
11920 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
11921 if (psd_cnt < ReScan)
11923 ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval); //ms
11929 RT_TRACE( COMP_PSD, DBG_LOUD,("psd_report[%d]= %d \n", 2402+i, PSD_report[i]));
11930 //DbgPrint("psd_report[%d]= %d \n", 2402+i, PSD_report[i]);
11932 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
11938 odm_PSD_RXHPCallback(
11942 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
11943 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
11944 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
11945 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
11947 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
11949 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
11951 odm_PSD_RXHP(pDM_Odm);
11954 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
11960 odm_PSD_RXHPWorkitemCallback(
11964 PADAPTER pAdapter = (PADAPTER)pContext;
11965 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
11966 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
11968 odm_PSD_RXHP(pDM_Odm);
11971 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
11974 odm_PathDiversityInit(
11975 IN PDM_ODM_T pDM_Odm
11978 if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
11980 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
11984 #if RTL8812A_SUPPORT
11986 if(pDM_Odm->SupportICType & ODM_RTL8812)
11987 ODM_PathDiversityInit_8812A(pDM_Odm);
11994 IN PDM_ODM_T pDM_Odm
11997 if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
11999 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
12003 #if RTL8812A_SUPPORT
12005 if(pDM_Odm->SupportICType & ODM_RTL8812)
12006 ODM_PathDiversity_8812A(pDM_Odm);
12012 // 2011/12/02 MH Copy from MP oursrc for temporarily test.
12014 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
12016 odm_OFDMTXPathDiversity_92C(
12017 IN PADAPTER Adapter)
12019 // HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12020 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
12021 PRT_WLAN_STA pEntry;
12022 u1Byte i, DefaultRespPath = 0;
12023 s4Byte MinRSSI = 0xFF;
12024 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
12025 pDM_PDTable->OFDMTXPath = 0;
12028 if(pMgntInfo->mAssoc)
12030 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
12031 Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
12032 if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
12034 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
12035 MinRSSI = Adapter->RxStats.RxRSSIPercentage[1];
12036 DefaultRespPath = 0;
12037 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
12041 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT0;
12042 MinRSSI = Adapter->RxStats.RxRSSIPercentage[0];
12043 DefaultRespPath = 1;
12044 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
12046 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));
12049 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
12051 if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
12052 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
12054 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
12058 if(pEntry->bAssociated)
12060 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n",
12061 pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
12063 if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
12065 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId));
12066 //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId));
12067 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId));
12068 if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
12070 MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
12071 DefaultRespPath = 0;
12076 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId);
12077 //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId));
12078 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId));
12079 if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
12081 MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
12082 DefaultRespPath = 1;
12093 pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
12098 odm_IsConnected_92C(
12099 IN PADAPTER Adapter
12102 PRT_WLAN_STA pEntry;
12103 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
12105 BOOLEAN bConnected=FALSE;
12107 if(pMgntInfo->mAssoc)
12113 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
12115 if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
12116 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
12118 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
12122 if(pEntry->bAssociated)
12139 odm_ResetPathDiversity_92C(
12140 IN PADAPTER Adapter
12143 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12144 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
12145 PRT_WLAN_STA pEntry;
12148 pHalData->RSSI_test = FALSE;
12149 pDM_PDTable->CCK_Pkt_Cnt = 0;
12150 pDM_PDTable->OFDM_Pkt_Cnt = 0;
12151 pHalData->CCK_Pkt_Cnt =0;
12152 pHalData->OFDM_Pkt_Cnt =0;
12154 if(pDM_PDTable->CCKPathDivEnable == TRUE)
12155 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); //RX path = PathAB
12159 pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
12160 pDM_PDTable->RSSI_CCK_Path[i] = 0;
12162 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
12164 if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
12165 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
12167 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
12171 pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
12172 pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
12175 pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] = 0;
12176 pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
12186 odm_CCKTXPathDiversity_92C(
12187 IN PADAPTER Adapter
12190 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12191 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
12192 PRT_WLAN_STA pEntry;
12193 s4Byte MinRSSI = 0xFF;
12194 u1Byte i, DefaultRespPath = 0;
12195 // BOOLEAN bBModePathDiv = FALSE;
12196 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
12199 if(pMgntInfo->mAssoc)
12201 if(pHalData->OFDM_Pkt_Cnt == 0)
12205 if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
12206 pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
12208 pDM_PDTable->RSSI_CCK_Path[i] = 0;
12210 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
12211 pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
12212 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n",
12213 pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
12215 if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
12217 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
12218 MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
12219 DefaultRespPath = 0;
12220 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
12222 else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
12224 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT0;
12225 MinRSSI = pDM_PDTable->RSSI_CCK_Path[0];
12226 DefaultRespPath = 1;
12227 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
12231 if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
12233 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
12234 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
12235 MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
12236 DefaultRespPath = 0;
12240 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
12244 else //Follow OFDM decision
12246 pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
12247 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
12248 pDM_PDTable->CCKTXPath &BIT0));
12252 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
12254 if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
12255 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
12257 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
12261 if(pEntry->bAssociated)
12263 if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
12268 if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1)
12269 pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1);
12271 pEntry->rssi_stat.RSSI_CCK_Path[j] = 0;
12273 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n",
12274 pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
12276 if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
12278 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
12279 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
12280 if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
12282 MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
12283 DefaultRespPath = 0;
12286 else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
12288 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId);
12289 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId));
12290 if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
12292 MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
12293 DefaultRespPath = 1;
12298 if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
12300 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId));
12301 MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
12302 DefaultRespPath = 0;
12303 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId));
12307 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId));
12311 else //Follow OFDM decision
12313 pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId));
12314 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
12315 pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId)));
12325 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
12327 if(MinRSSI == 0xFF)
12328 DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
12330 pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
12336 odm_PathDiversityAfterLink_92C(
12337 IN PADAPTER Adapter
12340 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12341 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
12342 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
12343 u1Byte DefaultRespPath=0;
12345 if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
12347 if(pHalData->PathDivCfg == 0)
12349 RT_TRACE( COMP_SWAS, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
12353 RT_TRACE( COMP_SWAS, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
12357 if(!odm_IsConnected_92C(Adapter))
12359 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
12364 if(pDM_PDTable->TrainingState == 0)
12366 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
12367 odm_OFDMTXPathDiversity_92C(Adapter);
12369 if((pDM_PDTable->CCKPathDivEnable == TRUE) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
12371 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
12373 if(pDM_PDTable->CCK_Pkt_Cnt > 300)
12374 pDM_PDTable->Timer = 20;
12375 else if(pDM_PDTable->CCK_Pkt_Cnt > 100)
12376 pDM_PDTable->Timer = 60;
12378 pDM_PDTable->Timer = 250;
12379 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
12381 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // RX path = PathA
12382 pDM_PDTable->TrainingState = 1;
12383 pHalData->RSSI_test = TRUE;
12384 ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
12388 pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
12389 DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
12390 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
12391 odm_SetRespPath_92C(Adapter, DefaultRespPath);
12392 odm_ResetPathDiversity_92C(Adapter);
12393 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
12396 else if(pDM_PDTable->TrainingState == 1)
12398 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));
12399 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // RX path = PathB
12400 pDM_PDTable->TrainingState = 2;
12401 ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
12405 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));
12406 pDM_PDTable->TrainingState = 0;
12407 odm_CCKTXPathDiversity_92C(Adapter);
12408 if(pDM_PDTable->OFDM_Pkt_Cnt != 0)
12410 DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
12411 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
12415 DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
12416 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
12418 odm_SetRespPath_92C(Adapter, DefaultRespPath);
12419 odm_ResetPathDiversity_92C(Adapter);
12420 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
12428 odm_CCKTXPathDiversityCallback(
12433 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
12434 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12435 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
12437 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
12440 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
12442 PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
12444 odm_PathDiversityAfterLink_92C(Adapter);
12447 PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
12454 odm_CCKTXPathDiversityWorkItemCallback(
12458 PADAPTER Adapter = (PADAPTER)pContext;
12460 odm_CCKTXPathDiversity_92C(Adapter);
12465 ODM_CCKPathDiversityChkPerPktRssi(
12467 BOOLEAN bIsDefPort,
12468 BOOLEAN bMatchBSSID,
12469 PRT_WLAN_STA pEntry,
12474 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12475 BOOLEAN bCount = FALSE;
12476 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
12477 //BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
12478 #if DEV_BUS_TYPE != RT_SDIO_INTERFACE
12479 BOOLEAN isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
12480 #else //below code would be removed if we have verified SDIO
12481 BOOLEAN isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
12484 if((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == FALSE))
12487 if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
12489 else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
12492 if(bCount && isCCKrate)
12494 if(pDM_PDTable->TrainingState == 1 )
12498 if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
12499 pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
12500 pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
12504 if(pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
12505 pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
12506 pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
12509 else if(pDM_PDTable->TrainingState == 2 )
12513 if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
12514 pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
12515 pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
12519 if(pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
12520 pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
12521 pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
12529 ODM_PathDiversityBeforeLink92C(
12530 //IN PADAPTER Adapter
12531 IN PDM_ODM_T pDM_Odm
12534 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
12535 PADAPTER Adapter = pDM_Odm->Adapter;
12536 HAL_DATA_TYPE* pHalData = NULL;
12537 PMGNT_INFO pMgntInfo = NULL;
12538 //pSWAT_T pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
12539 pPD_T pDM_PDTable = NULL;
12542 PRT_WLAN_BSS pTmpBssDesc;
12543 PRT_WLAN_BSS pTestBssDesc;
12545 u1Byte target_chnl = 0;
12548 if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
12549 { // The ODM structure is not initialized.
12552 pHalData = GET_HAL_DATA(Adapter);
12553 pMgntInfo = &Adapter->MgntInfo;
12554 pDM_PDTable = &Adapter->DM_PDTable;
12556 // Condition that does not need to use path diversity.
12557 if((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
12559 RT_TRACE(COMP_SWAS, DBG_LOUD,
12560 ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
12564 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
12565 PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
12566 if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
12568 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
12570 RT_TRACE(COMP_SWAS, DBG_LOUD,
12571 ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
12572 pMgntInfo->RFChangeInProgress,
12573 pHalData->eRFPowerState));
12575 //pDM_SWAT_Table->SWAS_NoLink_State = 0;
12576 pDM_PDTable->PathDiv_NoLink_State = 0;
12582 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
12585 //1 Run AntDiv mechanism "Before Link" part.
12586 //if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
12587 if(pDM_PDTable->PathDiv_NoLink_State == 0)
12589 //1 Prepare to do Scan again to check current antenna state.
12591 // Set check state to next step.
12592 //pDM_SWAT_Table->SWAS_NoLink_State = 1;
12593 pDM_PDTable->PathDiv_NoLink_State = 1;
12595 // Copy Current Scan list.
12596 Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
12597 PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
12599 // Switch Antenna to another one.
12600 if(pDM_PDTable->DefaultRespPath == 0)
12602 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // TRX path = PathB
12603 odm_SetRespPath_92C(Adapter, 1);
12604 pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
12605 pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
12609 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // TRX path = PathA
12610 odm_SetRespPath_92C(Adapter, 0);
12611 pDM_PDTable->OFDMTXPath = 0x0;
12612 pDM_PDTable->CCKTXPath = 0x0;
12616 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
12617 pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
12619 RT_TRACE(COMP_SWAS, DBG_LOUD,
12620 ("ODM_SwAntDivCheckBeforeLink: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
12621 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
12622 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
12623 PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
12626 // Go back to scan function again.
12627 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
12628 pMgntInfo->ScanStep=0;
12629 target_chnl = odm_SwAntDivSelectScanChnl(Adapter);
12630 odm_SwAntDivConstructScanChnl(Adapter, target_chnl);
12631 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
12637 //1 ScanComple() is called after antenna swiched.
12638 //1 Check scan result and determine which antenna is going
12641 for(index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
12643 pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
12644 pTestBssDesc = &(pMgntInfo->bssDesc[index]);
12646 if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
12648 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
12652 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
12654 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
12655 RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
12656 RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
12659 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
12661 else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
12663 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
12664 RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
12665 RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
12671 if(pMgntInfo->NumBssDesc!=0 && Score<=0)
12673 RT_TRACE(COMP_SWAS, DBG_LOUD,
12674 ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
12676 //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
12680 RT_TRACE(COMP_SWAS, DBG_LOUD,
12681 ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
12683 if(pDM_PDTable->DefaultRespPath == 0)
12685 pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
12686 pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
12687 odm_SetRespPath_92C(Adapter, 1);
12691 pDM_PDTable->OFDMTXPath = 0x0;
12692 pDM_PDTable->CCKTXPath = 0x0;
12693 odm_SetRespPath_92C(Adapter, 0);
12695 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); // RX path = PathAB
12697 //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
12699 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
12700 //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
12701 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
12704 // Check state reset to default and wait for next time.
12705 //pDM_SWAT_Table->SWAS_NoLink_State = 0;
12706 pDM_PDTable->PathDiv_NoLink_State = 0;
12717 //Neil Chen---2011--06--22
12718 //----92D Path Diversity----//
12719 //#ifdef PathDiv92D
12720 //==================================
12722 //==================================
12724 // 20100514 Luke/Joseph:
12725 // Add new function for antenna diversity after link.
12726 // This is the main function of antenna diversity after link.
12727 // This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
12728 // HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
12729 // In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
12730 // After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
12731 // listened on the air with the RSSI of original antenna.
12732 // It chooses the antenna with better RSSI.
12733 // There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
12734 // penalty to get next try.
12737 // 20100503 Joseph:
12738 // Add new function SwAntDivCheck8192C().
12739 // This is the main function of Antenna diversity function before link.
12740 // Mainly, it just retains last scan result and scan again.
12741 // After that, it compares the scan result to see which one gets better RSSI.
12742 // It selects antenna with better receiving power and returns better scan result.
12747 // 20100514 Luke/Joseph:
12748 // This function is used to gather the RSSI information for antenna testing.
12749 // It selects the RSSI of the peer STA that we want to know.
12752 ODM_PathDivChkPerPktRssi(
12754 BOOLEAN bIsDefPort,
12755 BOOLEAN bMatchBSSID,
12756 PRT_WLAN_STA pEntry,
12760 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12761 BOOLEAN bCount = FALSE;
12762 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
12763 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
12765 if(pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
12767 else if(pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
12772 //1 RSSI for SW Antenna Switch
12773 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
12775 pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
12776 pHalData->RSSI_cnt_A++;
12780 pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
12781 pHalData->RSSI_cnt_B++;
12790 // 20100514 Luke/Joseph:
12791 // Add new function to reset antenna diversity state after link.
12794 ODM_PathDivRestAfterLink(
12795 IN PDM_ODM_T pDM_Odm
12798 PADAPTER Adapter=pDM_Odm->Adapter;
12799 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12800 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
12802 pHalData->RSSI_cnt_A = 0;
12803 pHalData->RSSI_cnt_B = 0;
12804 pHalData->RSSI_test = FALSE;
12805 pDM_SWAT_Table->try_flag = 0x0; // NOT 0xff
12806 pDM_SWAT_Table->RSSI_Trying = 0;
12807 pDM_SWAT_Table->SelectAntennaMap=0xAA;
12808 pDM_SWAT_Table->CurAntenna = MAIN_ANT;
12813 // 20100514 Luke/Joseph:
12814 // Callback function for 500ms antenna test trying.
12817 odm_PathDivChkAntSwitchCallback(
12821 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
12822 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12823 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
12825 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
12828 PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
12830 odm_PathDivChkAntSwitch(pDM_Odm);
12833 PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
12836 //odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
12842 odm_PathDivChkAntSwitchWorkitemCallback(
12846 PADAPTER pAdapter = (PADAPTER)pContext;
12847 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
12848 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
12850 odm_PathDivChkAntSwitch(pDM_Odm);
12856 // 2011-06-22 Neil Chen & Gary Hsin
12857 // Refer to Jr.Luke's SW ANT DIV
12858 // 92D Path Diversity Main function
12859 // refer to 88C software antenna diversity
12862 odm_PathDivChkAntSwitch(
12864 //PADAPTER Adapter,
12868 PADAPTER Adapter = pDM_Odm->Adapter;
12869 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
12870 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
12873 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
12874 s4Byte curRSSI=100, RSSI_A, RSSI_B;
12875 u1Byte nextAntenna=AUX_ANT;
12876 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
12877 u8Byte curTxOkCnt, curRxOkCnt;
12878 static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
12879 u8Byte CurByteCnt=0, PreByteCnt=0;
12880 static u1Byte TrafficLoad = TRAFFIC_LOW;
12881 u1Byte Score_A=0, Score_B=0;
12884 static u1Byte pathdiv_para=0x0;
12885 static u1Byte switchfirsttime=0x00;
12886 // u1Byte regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
12887 u1Byte regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
12890 //u1Byte reg637 =0x0;
12891 static u1Byte fw_value=0x0;
12892 //u8Byte curTxOkCnt_tmp, curRxOkCnt_tmp;
12893 PADAPTER BuddyAdapter = Adapter->BuddyAdapter; // another adapter MAC
12894 // Path Diversity //Neil Chen--2011--06--22
12896 //u1Byte PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
12897 u1Byte PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
12898 u1Byte PathDiv_Enable = pHalData->bPathDiv_Enable;
12901 //DbgPrint("Path Div PG Value:%x \n",PathDiv_Enable);
12902 if((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType == BAND_ON_2_4G))
12906 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
12908 // The first time to switch path excluding 2nd, 3rd, ....etc....
12909 if(switchfirsttime==0)
12913 pDM_SWAT_Table->CurAntenna = MAIN_ANT; // Default MAC0_5G-->Path A (current antenna)
12917 // Condition that does not need to use antenna diversity.
12918 if(pDM_Odm->SupportICType != ODM_RTL8192D)
12920 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
12924 // Radio off: Status reset to default and return.
12925 if(pHalData->eRFPowerState==eRfOff)
12927 //ODM_SwAntDivRestAfterLink(Adapter);
12932 // Handling step mismatch condition.
12933 // Peak step is not finished at last time. Recover the variable and check again.
12934 if( Step != pDM_SWAT_Table->try_flag )
12936 ODM_SwAntDivRestAfterLink(Adapter);
12939 if(pDM_SWAT_Table->try_flag == 0xff)
12941 // Select RSSI checking target
12942 if(pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
12944 // Target: Infrastructure mode AP.
12945 pHalData->RSSI_target = NULL;
12946 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
12951 PRT_WLAN_STA pEntry = NULL;
12952 PADAPTER pTargetAdapter = NULL;
12954 if( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
12956 // Target: AP/IBSS peer.
12957 pTargetAdapter = Adapter;
12959 else if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
12961 // Target: VWIFI peer.
12962 pTargetAdapter = GetFirstExtAdapter(Adapter);
12965 if(pTargetAdapter != NULL)
12967 for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
12969 pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
12972 if(pEntry->bAssociated)
12980 ODM_PathDivRestAfterLink(pDM_Odm);
12981 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
12986 pHalData->RSSI_target = pEntry;
12987 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
12991 pHalData->RSSI_cnt_A = 0;
12992 pHalData->RSSI_cnt_B = 0;
12993 pDM_SWAT_Table->try_flag = 0;
12994 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
13000 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
13001 curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
13002 lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
13003 lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
13005 if(pDM_SWAT_Table->try_flag == 1) // Training State
13007 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
13009 TXByteCnt_A += curTxOkCnt;
13010 RXByteCnt_A += curRxOkCnt;
13014 TXByteCnt_B += curTxOkCnt;
13015 RXByteCnt_B += curRxOkCnt;
13018 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
13019 pDM_SWAT_Table->RSSI_Trying--;
13020 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
13021 if(pDM_SWAT_Table->RSSI_Trying == 0)
13023 CurByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
13024 PreByteCnt = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
13026 if(TrafficLoad == TRAFFIC_HIGH)
13028 //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
13029 PreByteCnt =PreByteCnt*9;
13031 else if(TrafficLoad == TRAFFIC_LOW)
13033 //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
13034 PreByteCnt =PreByteCnt*2;
13036 if(pHalData->RSSI_cnt_A > 0)
13037 RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
13040 if(pHalData->RSSI_cnt_B > 0)
13041 RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
13044 curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
13045 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_B : RSSI_A;
13046 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
13047 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n",
13048 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
13049 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
13050 RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
13057 if(pHalData->RSSI_cnt_A > 0)
13058 RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
13061 if(pHalData->RSSI_cnt_B > 0)
13062 RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
13065 curRSSI = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
13066 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == MAIN_ANT)? RSSI_A : RSSI_B;
13067 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
13068 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s \n",
13069 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
13071 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_A= %d, RSSI_cnt_A = %d, RSSI_B= %d, RSSI_cnt_B = %d\n",
13072 RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
13073 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
13074 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
13078 if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
13081 if(pDM_SWAT_Table->TestMode == TP_MODE)
13083 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
13084 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
13085 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));
13086 if(CurByteCnt < PreByteCnt)
13088 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
13089 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
13091 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
13095 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
13096 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
13098 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
13100 for (i= 0; i<8; i++)
13102 if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
13107 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
13108 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
13110 if(pDM_SWAT_Table->CurAntenna == MAIN_ANT)
13112 nextAntenna = (Score_A >= Score_B)?MAIN_ANT:AUX_ANT;
13116 nextAntenna = (Score_B >= Score_A)?AUX_ANT:MAIN_ANT;
13118 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==MAIN_ANT)?"MAIN":"AUX"));
13119 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s \n",
13120 (pDM_SWAT_Table->PreAntenna == MAIN_ANT?"MAIN":"AUX"), (pDM_SWAT_Table->CurAntenna == MAIN_ANT?"MAIN":"AUX")));
13122 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
13124 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
13128 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
13133 if(pDM_SWAT_Table->TestMode == RSSI_MODE)
13135 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
13136 pDM_SWAT_Table->SelectAntennaMap=0xAA;
13137 if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
13139 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Switch back to another antenna"));
13140 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?AUX_ANT : MAIN_ANT;
13142 else // current anntena is good
13144 nextAntenna =pDM_SWAT_Table->CurAntenna;
13145 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: current anntena is good\n"));
13149 pDM_SWAT_Table->try_flag = 0;
13150 pHalData->RSSI_test = FALSE;
13151 pHalData->RSSI_sum_A = 0;
13152 pHalData->RSSI_cnt_A = 0;
13153 pHalData->RSSI_sum_B = 0;
13154 pHalData->RSSI_cnt_B = 0;
13163 else if(pDM_SWAT_Table->try_flag == 0)
13165 if(TrafficLoad == TRAFFIC_HIGH)
13167 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
13168 TrafficLoad = TRAFFIC_HIGH;
13170 TrafficLoad = TRAFFIC_LOW;
13172 else if(TrafficLoad == TRAFFIC_LOW)
13174 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
13175 TrafficLoad = TRAFFIC_HIGH;
13177 TrafficLoad = TRAFFIC_LOW;
13179 if(TrafficLoad == TRAFFIC_HIGH)
13180 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
13181 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
13183 //Prepare To Try Antenna
13184 nextAntenna = (pDM_SWAT_Table->CurAntenna == MAIN_ANT)? AUX_ANT : MAIN_ANT;
13185 pDM_SWAT_Table->try_flag = 1;
13186 pHalData->RSSI_test = TRUE;
13187 if((curRxOkCnt+curTxOkCnt) > 1000)
13189 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
13190 pDM_SWAT_Table->RSSI_Trying = 4;
13192 pDM_SWAT_Table->RSSI_Trying = 2;
13194 pDM_SWAT_Table->TestMode = TP_MODE;
13198 pDM_SWAT_Table->RSSI_Trying = 2;
13199 pDM_SWAT_Table->TestMode = RSSI_MODE;
13203 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
13204 pHalData->RSSI_sum_A = 0;
13205 pHalData->RSSI_cnt_A = 0;
13206 pHalData->RSSI_sum_B = 0;
13207 pHalData->RSSI_cnt_B = 0;
13208 } // end of try_flag=0
13211 //1 4.Change TRX antenna
13212 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
13215 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
13216 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
13217 if(nextAntenna==MAIN_ANT)
13219 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
13220 pathdiv_para = 0x02; //02 to switchback to RF path A
13222 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
13223 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
13225 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
13228 else if(nextAntenna==AUX_ANT)
13230 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
13231 if(switchfirsttime==0) // First Time To Enter Path Diversity
13233 switchfirsttime=0x01;
13234 pathdiv_para = 0x00;
13235 fw_value=0x00; // to backup RF Path A Releated Registers
13237 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
13238 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
13240 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
13241 //for(u1Byte n=0; n<80,n++)
13245 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
13247 fw_value=0x01; // to backup RF Path A Releated Registers
13248 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
13250 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));
13254 pathdiv_para = 0x01;
13256 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
13257 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
13259 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
13263 // odm_PathDiversity_8192D(Adapter, pathdiv_para);
13266 //1 5.Reset Statistics
13267 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
13268 pDM_SWAT_Table->CurAntenna = nextAntenna;
13269 pDM_SWAT_Table->PreRSSI = curRSSI;
13271 //1 6.Set next timer
13273 if(pDM_SWAT_Table->RSSI_Trying == 0)
13276 if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
13278 if(pDM_SWAT_Table->TestMode == TP_MODE)
13280 if(TrafficLoad == TRAFFIC_HIGH)
13282 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
13283 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
13284 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
13286 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
13287 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
13290 else if(TrafficLoad == TRAFFIC_LOW)
13292 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
13293 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
13296 else // TestMode == RSSI_MODE
13298 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
13299 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
13304 if(pDM_SWAT_Table->TestMode == TP_MODE)
13306 if(TrafficLoad == TRAFFIC_HIGH)
13308 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
13309 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
13310 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
13312 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
13314 else if(TrafficLoad == TRAFFIC_LOW)
13315 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
13318 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
13322 //==================================================
13324 //==================================================
13327 odm_SetRespPath_92C(
13328 IN PADAPTER Adapter,
13329 IN u1Byte DefaultRespPath
13332 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
13334 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
13335 if(DefaultRespPath != pDM_PDTable->DefaultRespPath)
13337 if(DefaultRespPath == 0)
13339 PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);
13343 PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
13346 pDM_PDTable->DefaultRespPath = DefaultRespPath;
13351 ODM_FillTXPathInTXDESC(
13352 IN PADAPTER Adapter,
13357 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
13359 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
13361 //2011.09.05 Add by Luke Lee for path diversity
13362 if(pHalData->PathDivCfg == 1)
13364 TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
13365 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
13366 //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
13369 SET_TX_DESC_TX_ANTL_92C(pDesc,1);
13370 SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
13374 SET_TX_DESC_TX_ANTL_92C(pDesc,2);
13375 SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
13377 TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
13380 SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
13384 SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
13389 //Only for MP //Neil Chen--2012--0502--
13391 odm_PathDivInit_92D(
13392 IN PDM_ODM_T pDM_Odm)
13394 pPATHDIV_PARA pathIQK = &pDM_Odm->pathIQK;
13396 pathIQK->org_2g_RegC14=0x0;
13397 pathIQK->org_2g_RegC4C=0x0;
13398 pathIQK->org_2g_RegC80=0x0;
13399 pathIQK->org_2g_RegC94=0x0;
13400 pathIQK->org_2g_RegCA0=0x0;
13401 pathIQK->org_5g_RegC14=0x0;
13402 pathIQK->org_5g_RegCA0=0x0;
13403 pathIQK->org_5g_RegE30=0x0;
13404 pathIQK->swt_2g_RegC14=0x0;
13405 pathIQK->swt_2g_RegC4C=0x0;
13406 pathIQK->swt_2g_RegC80=0x0;
13407 pathIQK->swt_2g_RegC94=0x0;
13408 pathIQK->swt_2g_RegCA0=0x0;
13409 pathIQK->swt_5g_RegC14=0x0;
13410 pathIQK->swt_5g_RegCA0=0x0;
13411 pathIQK->swt_5g_RegE30=0x0;
13415 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
13417 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
13420 odm_PHY_SaveAFERegisters(
13421 IN PDM_ODM_T pDM_Odm,
13423 IN pu4Byte AFEBackup,
13424 IN u4Byte RegisterNum
13429 //RT_DISP(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
13430 for( i = 0 ; i < RegisterNum ; i++){
13431 AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);
13436 odm_PHY_ReloadAFERegisters(
13437 IN PDM_ODM_T pDM_Odm,
13439 IN pu4Byte AFEBackup,
13440 IN u4Byte RegiesterNum
13445 //RT_DISP(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
13446 for(i = 0 ; i < RegiesterNum; i++)
13449 ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);
13455 // Set Single/Dual Antenna default setting for products that do not do detection in advance.
13457 // Added by Joseph, 2012.03.22
13460 ODM_SingleDualAntennaDefaultSetting(
13461 IN PDM_ODM_T pDM_Odm
13464 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
13465 PADAPTER pAdapter = pDM_Odm->Adapter;
13466 u1Byte btAntNum = 2;
13467 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
13468 btAntNum=BT_GetPgAntNum(pAdapter);
13469 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
13470 #ifdef CONFIG_BT_COEXIST
13471 btAntNum = hal_btcoex_GetPgAntNum(pAdapter);
13475 // Set default antenna A and B status
13478 pDM_SWAT_Table->ANTA_ON=TRUE;
13479 pDM_SWAT_Table->ANTB_ON=TRUE;
13480 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Dual antenna\n"));
13482 #ifdef CONFIG_BT_COEXIST
13483 else if(btAntNum == 1)
13484 {// Set antenna A as default
13485 pDM_SWAT_Table->ANTA_ON=TRUE;
13486 pDM_SWAT_Table->ANTB_ON=FALSE;
13487 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("Single antenna\n"));
13491 //RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));
13498 //2 8723A ANT DETECT
13501 // Implement IQK single tone for RF DPK loopback and BB PSD scanning.
13502 // This function is cooperated with BB team Neil.
13504 // Added by Roger, 2011.12.15
13507 ODM_SingleDualAntennaDetection(
13508 IN PDM_ODM_T pDM_Odm,
13512 PADAPTER pAdapter = pDM_Odm->Adapter;
13513 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
13514 u4Byte CurrentChannel,RfLoopReg;
13516 u4Byte Reg88c, Regc08, Reg874, Regc50, Reg948=0, Regb2c=0, Reg92c=0, AFE_rRx_Wait_CCA=0;
13517 u1Byte initial_gain = 0x5a;
13518 u4Byte PSD_report_tmp;
13519 u4Byte AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0;
13520 BOOLEAN bResult = TRUE;
13521 u4Byte AFE_Backup[16];
13522 u4Byte AFE_REG_8723A[16] = {
13523 rRx_Wait_CCA, rTx_CCK_RFON,
13524 rTx_CCK_BBON, rTx_OFDM_RFON,
13525 rTx_OFDM_BBON, rTx_To_Rx,
13526 rTx_To_Tx, rRx_CCK,
13527 rRx_OFDM, rRx_Wait_RIFS,
13528 rRx_TO_Rx, rStandby,
13529 rSleep, rPMPD_ANAEN,
13530 rFPGA0_XCD_SwitchControl, rBlue_Tooth};
13532 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============> \n"));
13535 if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8723B)))
13538 // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
13539 if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))
13542 if(pDM_Odm->SupportICType == ODM_RTL8192C)
13544 //Which path in ADC/DAC is turnned on for PSD: both I/Q
13545 ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);
13546 //Ageraged number: 8
13547 ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);
13549 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
13552 //1 Backup Current RF/BB Settings
13554 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
13555 RfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
13556 if(!(pDM_Odm->SupportICType == ODM_RTL8723B))
13557 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); // change to Antenna A
13558 #if (RTL8723B_SUPPORT == 1)
13561 Reg92c = ODM_GetBBReg(pDM_Odm, 0x92c, bMaskDWord);
13562 Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);
13563 Regb2c = ODM_GetBBReg(pDM_Odm, AGC_table_select, bMaskDWord);
13564 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);
13565 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
13566 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3ff, 0x000);
13567 ODM_SetBBReg(pDM_Odm, AGC_table_select, BIT31, 0x0);
13570 ODM_StallExecution(10);
13572 //Store A Path Register 88c, c08, 874, c50
13573 Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);
13574 Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);
13575 Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);
13576 Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);
13578 // Store AFE Registers
13579 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13580 odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
13581 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13582 AFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);
13585 ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0); //128 pts
13587 // To SET CH1 to do
13588 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401); //Channel 1
13591 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13593 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);
13594 ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);
13595 ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);
13596 ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);
13597 ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);
13598 ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);
13599 ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);
13600 ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);
13601 ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);
13602 ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);
13603 ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);
13604 ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);
13605 ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);
13606 ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);
13607 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);
13608 ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);
13610 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13612 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);
13616 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);
13619 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);
13620 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);
13622 //IQK setting tone@ 4.34Mhz
13623 ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);
13624 ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);
13627 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);
13628 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);
13629 ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);
13630 ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
13631 ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);
13632 ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);
13633 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);
13636 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13637 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);
13639 //IQK Single tone start
13640 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
13641 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
13642 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
13644 ODM_StallExecution(10000);
13646 // PSD report of antenna A
13647 PSD_report_tmp=0x0;
13650 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
13651 if(PSD_report_tmp >AntA_report)
13652 AntA_report=PSD_report_tmp;
13655 // change to Antenna B
13656 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13657 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_B);
13658 #if (RTL8723B_SUPPORT == 1)
13659 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13660 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);
13663 ODM_StallExecution(10);
13665 // PSD report of antenna B
13666 PSD_report_tmp=0x0;
13669 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
13670 if(PSD_report_tmp > AntB_report)
13671 AntB_report=PSD_report_tmp;
13674 // change to open case
13675 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13676 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, 0); // change to Antenna A
13677 #if (RTL8723B_SUPPORT == 1)
13678 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13679 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x0);
13682 ODM_StallExecution(10);
13684 // PSD report of open case
13685 PSD_report_tmp=0x0;
13688 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
13689 if(PSD_report_tmp > AntO_report)
13690 AntO_report=PSD_report_tmp;
13693 //Close IQK Single Tone function
13694 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
13696 //1 Return to antanna A
13697 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13698 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); // change to Antenna A
13699 #if (RTL8723B_SUPPORT == 1)
13700 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13703 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);
13706 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);
13707 ODM_SetBBReg(pDM_Odm, AGC_table_select, bMaskDWord, Regb2c);
13710 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);
13711 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);
13712 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);
13713 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);
13714 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);
13715 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);
13716 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);
13718 //Reload AFE Registers
13719 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))
13720 odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
13721 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13722 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);
13724 if(pDM_Odm->SupportICType == ODM_RTL8723A)
13726 //2 Test Ant B based on Ant A is ON
13729 if(AntA_report >= 100)
13731 if(AntB_report > (AntA_report+1))
13733 pDM_SWAT_Table->ANTB_ON=FALSE;
13734 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
13738 pDM_SWAT_Table->ANTB_ON=TRUE;
13739 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));
13744 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
13745 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
13749 //2 Test Ant A and B based on DPDT Open
13750 else if(mode==ANTTESTALL)
13752 if((AntO_report >=100) && (AntO_report <=118))
13754 if(AntA_report > (AntO_report+1))
13756 pDM_SWAT_Table->ANTA_ON=FALSE;
13757 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF\n"));
13761 pDM_SWAT_Table->ANTA_ON=TRUE;
13762 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON\n"));
13765 if(AntB_report > (AntO_report+2))
13767 pDM_SWAT_Table->ANTB_ON=FALSE;
13768 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF\n"));
13772 pDM_SWAT_Table->ANTB_ON=TRUE;
13773 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON\n"));
13776 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));
13777 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));
13778 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
13780 pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
13781 pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
13782 pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
13783 pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
13788 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
13793 else if(pDM_Odm->SupportICType == ODM_RTL8192C)
13795 if(AntA_report >= 100)
13797 if(AntB_report > (AntA_report+2))
13799 pDM_SWAT_Table->ANTA_ON=FALSE;
13800 pDM_SWAT_Table->ANTB_ON=TRUE;
13801 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);
13802 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));
13804 else if(AntA_report > (AntB_report+2))
13806 pDM_SWAT_Table->ANTA_ON=TRUE;
13807 pDM_SWAT_Table->ANTB_ON=FALSE;
13808 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
13809 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
13813 pDM_SWAT_Table->ANTA_ON=TRUE;
13814 pDM_SWAT_Table->ANTB_ON=TRUE;
13815 RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna \n"));
13820 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
13821 pDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default
13822 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
13826 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
13828 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));
13829 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));
13830 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
13832 //2 Test Ant B based on Ant A is ON
13835 if(AntA_report >=100 && AntA_report <= 116)
13837 if(AntB_report >= (AntA_report+4) && AntB_report > 116)
13839 pDM_SWAT_Table->ANTB_ON=FALSE;
13840 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
13842 else if(AntB_report >=100 && AntB_report <= 116)
13844 pDM_SWAT_Table->ANTB_ON=TRUE;
13845 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));
13849 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
13850 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
13856 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
13857 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
13861 //2 Test Ant A and B based on DPDT Open
13862 else if(mode==ANTTESTALL)
13864 if((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 120) && (AntB_report <= 120))
13866 if((AntA_report - AntB_report < 2) || (AntB_report - AntA_report < 2))
13868 pDM_SWAT_Table->ANTA_ON=TRUE;
13869 pDM_SWAT_Table->ANTB_ON=TRUE;
13870 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));
13872 else if(((AntA_report - AntB_report >= 2) && (AntA_report - AntB_report <= 4)) ||
13873 ((AntB_report - AntA_report >= 2) && (AntB_report - AntA_report <= 4)))
13875 pDM_SWAT_Table->ANTA_ON=FALSE;
13876 pDM_SWAT_Table->ANTB_ON=FALSE;
13878 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
13882 pDM_SWAT_Table->ANTA_ON = TRUE;
13883 pDM_SWAT_Table->ANTB_ON=FALSE;
13884 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
13887 pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
13888 pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
13889 pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
13890 pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
13895 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
13906 #endif // end odm_CE
13908 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))
13911 odm_Set_RA_DM_ARFB_by_Noisy(
13912 IN PDM_ODM_T pDM_Odm
13915 //DbgPrint("DM_ARFB ====> \n");
13916 if (pDM_Odm->bNoisyState){
13917 ODM_Write4Byte(pDM_Odm,0x430,0x00000000);
13918 ODM_Write4Byte(pDM_Odm,0x434,0x05040200);
13919 //DbgPrint("DM_ARFB ====> Noisy State\n");
13922 ODM_Write4Byte(pDM_Odm,0x430,0x02010000);
13923 ODM_Write4Byte(pDM_Odm,0x434,0x07050403);
13924 //DbgPrint("DM_ARFB ====> Clean State\n");
13930 ODM_UpdateNoisyState(
13931 IN PDM_ODM_T pDM_Odm,
13932 IN BOOLEAN bNoisyStateFromC2H
13935 //DbgPrint("Get C2H Command! NoisyState=0x%x\n ", bNoisyStateFromC2H);
13936 if(pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 ||
13937 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)
13939 pDM_Odm->bNoisyState = bNoisyStateFromC2H;
13941 odm_Set_RA_DM_ARFB_by_Noisy(pDM_Odm);
13945 Set_RA_DM_Ratrbitmap_by_Noisy(
13946 IN PDM_ODM_T pDM_Odm,
13947 IN WIRELESS_MODE WirelessMode,
13948 IN u4Byte ratr_bitmap,
13949 IN u1Byte rssi_level
13952 u4Byte ret_bitmap = ratr_bitmap;
13953 switch (WirelessMode)
13955 case WIRELESS_MODE_AC_24G :
13956 case WIRELESS_MODE_AC_5G :
13957 case WIRELESS_MODE_AC_ONLY:
13958 if (pDM_Odm->bNoisyState){ // in Noisy State
13960 ret_bitmap&=0xfe3f0e08;
13961 else if (rssi_level==2)
13962 ret_bitmap&=0xff3f8f8c;
13963 else if (rssi_level==3)
13964 ret_bitmap&=0xffffffcc ;
13966 ret_bitmap&=0xffffffff ;
13968 else{ // in SNR State
13969 if (rssi_level==1){
13970 ret_bitmap&=0xfc3e0c08;
13972 else if (rssi_level==2){
13973 ret_bitmap&=0xfe3f0e08;
13975 else if (rssi_level==3){
13976 ret_bitmap&=0xffbfefcc;
13979 ret_bitmap&=0x0fffffff;
13983 case WIRELESS_MODE_B:
13984 case WIRELESS_MODE_A:
13985 case WIRELESS_MODE_G:
13986 case WIRELESS_MODE_N_24G:
13987 case WIRELESS_MODE_N_5G:
13988 if (pDM_Odm->bNoisyState){
13990 ret_bitmap&=0x0f0e0c08;
13991 else if (rssi_level==2)
13992 ret_bitmap&=0x0f8f0e0c;
13993 else if (rssi_level==3)
13994 ret_bitmap&=0x0fefefcc ;
13996 ret_bitmap&=0xffffffff ;
13999 if (rssi_level==1){
14000 ret_bitmap&=0x0f8f0e08;
14002 else if (rssi_level==2){
14003 ret_bitmap&=0x0fcf8f8c;
14005 else if (rssi_level==3){
14006 ret_bitmap&=0x0fffffcc;
14009 ret_bitmap&=0x0fffffff;
14016 //DbgPrint("DM_RAMask ====> rssi_LV = %d, BITMAP = %x \n", rssi_level, ret_bitmap);
14024 ODM_UpdateInitRate(
14025 IN PDM_ODM_T pDM_Odm,
14031 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Get C2H Command! Rate=0x%x\n", Rate));
14033 if(pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 ||
14034 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)
14036 pDM_Odm->TxRate = Rate;
14037 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
14038 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
14040 PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);
14042 if(pDM_Odm->SupportICType == ODM_RTL8821)
14044 ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
14046 else if(pDM_Odm->SupportICType == ODM_RTL8812)
14048 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++)
14050 ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);
14053 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
14055 ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
14057 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
14059 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++)
14061 ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);
14064 else if(pDM_Odm->SupportICType == ODM_RTL8188E)
14066 ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
14070 PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);
14078 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
14080 ODM_UpdateInitRateWorkItemCallback(
14084 PADAPTER Adapter = (PADAPTER)pContext;
14085 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
14086 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
14090 if(pDM_Odm->SupportICType == ODM_RTL8821)
14092 ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
14094 else if(pDM_Odm->SupportICType == ODM_RTL8812)
14096 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++) //DOn't know how to include &c
14098 ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);
14101 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
14103 ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
14105 else if(pDM_Odm->SupportICType == ODM_RTL8192E)
14107 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++) //DOn't know how to include &c
14109 ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);
14112 else if(pDM_Odm->SupportICType == ODM_RTL8188E)
14114 ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);
14120 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
14121 /* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */
14122 void odm_dtc(PDM_ODM_T pDM_Odm)
14124 #ifdef CONFIG_DM_RESP_TXAGC
14125 #define DTC_BASE 35 /* RSSI higher than this value, start to decade TX power */
14126 #define DTC_DWN_BASE (DTC_BASE-5) /* RSSI lower than this value, start to increase TX power */
14128 /* RSSI vs TX power step mapping: decade TX power */
14129 static const u8 dtc_table_down[]={
14138 /* RSSI vs TX power step mapping: increase TX power */
14139 static const u8 dtc_table_up[]={
14159 /* As DIG is disabled, DTC is also disable */
14160 if(!(pDM_Odm->SupportAbility & ODM_XXXXXX))
14164 if (DTC_BASE < pDM_Odm->RSSI_Min) {
14165 /* need to decade the CTS TX power */
14167 for (i=0;i<ARRAY_SIZE(dtc_table_down);i++)
14169 if ((dtc_table_down[i] >= pDM_Odm->RSSI_Min) || (dtc_steps >= 6))
14176 else if (DTC_DWN_BASE > pDM_Odm->RSSI_Min)
14178 /* needs to increase the CTS TX power */
14181 for (i=0;i<ARRAY_SIZE(dtc_table_up);i++)
14183 if ((dtc_table_up[i] <= pDM_Odm->RSSI_Min) || (dtc_steps>=10))
14196 resp_txagc = dtc_steps | (sign << 4);
14197 resp_txagc = resp_txagc | (resp_txagc << 5);
14198 ODM_Write1Byte(pDM_Odm, 0x06d9, resp_txagc);
14200 DBG_871X("%s RSSI_Min:%u, set RESP_TXAGC to %s %u\n",
14201 __func__, pDM_Odm->RSSI_Min, sign?"minus":"plus", dtc_steps);
14202 #endif /* CONFIG_RESP_TXAGC_ADJUST */
14205 #endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */