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"
29 const u2Byte dB_Invert_Table[8][12] = {
30 { 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4},
31 { 4, 5, 6, 6, 7, 8, 9, 10, 11, 13, 14, 16},
32 { 18, 20, 22, 25, 28, 32, 35, 40, 45, 50, 56, 63},
33 { 71, 79, 89, 100, 112, 126, 141, 158, 178, 200, 224, 251},
34 { 282, 316, 355, 398, 447, 501, 562, 631, 708, 794, 891, 1000},
35 { 1122, 1259, 1413, 1585, 1778, 1995, 2239, 2512, 2818, 3162, 3548, 3981},
36 { 4467, 5012, 5623, 6310, 7079, 7943, 8913, 10000, 11220, 12589, 14125, 15849},
37 { 17783, 19953, 22387, 25119, 28184, 31623, 35481, 39811, 44668, 50119, 56234, 65535}};
39 // 20100515 Joseph: Add global variable to keep temporary scan list for antenna switching test.
40 //u1Byte tmpNumBssDesc;
41 //RT_WLAN_BSS tmpbssDesc[MAX_BSS_DESC];
43 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
44 static u4Byte edca_setting_UL[HT_IOT_PEER_MAX] =
45 // UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MARVELL 92U_AP SELF_AP(DownLink/Tx)
46 { 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea44f, 0x5e4322, 0x5e4322};
49 static u4Byte edca_setting_DL[HT_IOT_PEER_MAX] =
50 // UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MARVELL 92U_AP SELF_AP(UpLink/Rx)
51 { 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0xa44f, 0xa42b, 0xa42b};
53 static u4Byte edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
54 // UNKNOWN REALTEK_90 REALTEK_92SE BROADCOM RALINK ATHEROS CISCO MARVELL 92U_AP SELF_AP
55 { 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0xa44f, 0x5e4322, 0x5ea42b};
58 //============================================================
59 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
62 //avoid to warn in FreeBSD ==> To DO modify
63 u4Byte EDCAParam[HT_IOT_PEER_MAX][3] =
65 {0x5ea42b, 0x5ea42b, 0x5ea42b}, //0:unknown AP
66 {0xa44f, 0x5ea44f, 0x5e431c}, // 1:realtek AP
67 {0x5ea42b, 0x5ea42b, 0x5ea42b}, // 2:unknown AP => realtek_92SE
68 {0x5ea32b, 0x5ea42b, 0x5e4322}, // 3:broadcom AP
69 {0x5ea422, 0x00a44f, 0x00a44f}, // 4:ralink AP
70 {0x5ea322, 0x00a630, 0x00a44f}, // 5:atheros AP
71 //{0x5ea42b, 0x5ea42b, 0x5ea42b},// 6:cisco AP
72 {0x5e4322, 0x5e4322, 0x5e4322},// 6:cisco AP
73 //{0x3ea430, 0x00a630, 0x3ea44f}, // 7:cisco AP
74 {0x5ea44f, 0x00a44f, 0x5ea42b}, // 8:marvell AP
75 //{0x5ea44f, 0x5ea44f, 0x5ea44f}, // 9realtek AP
76 {0x5ea42b, 0x5ea42b, 0x5ea42b}, // 10:unknown AP=> 92U AP
77 {0x5ea42b, 0xa630, 0x5e431c}, // 11:airgocap AP
78 // {0x5e4322, 0x00a44f, 0x5ea44f}, // 12:unknown AP
80 //============================================================
81 // EDCA Paramter for AP/ADSL by Mingzhi 2011-11-22
82 //============================================================
83 #elif (DM_ODM_SUPPORT_TYPE &ODM_ADSL)
84 enum qos_prio { BK, BE, VI, VO, VI_AG, VO_AG };
86 static const struct ParaRecord rtl_ap_EDCA[] =
88 //ACM,AIFSN, ECWmin, ECWmax, TXOplimit
89 {0, 7, 4, 10, 0}, //BK
91 {0, 1, 3, 4, 188}, //VI
92 {0, 1, 2, 3, 102}, //VO
93 {0, 1, 3, 4, 94}, //VI_AG
94 {0, 1, 2, 3, 47}, //VO_AG
97 static const struct ParaRecord rtl_sta_EDCA[] =
99 //ACM,AIFSN, ECWmin, ECWmax, TXOplimit
109 //============================================================
111 //============================================================
112 u4Byte OFDMSwingTable[OFDM_TABLE_SIZE_92D] = {
113 0x7f8001fe, // 0, +6.0dB
114 0x788001e2, // 1, +5.5dB
115 0x71c001c7, // 2, +5.0dB
116 0x6b8001ae, // 3, +4.5dB
117 0x65400195, // 4, +4.0dB
118 0x5fc0017f, // 5, +3.5dB
119 0x5a400169, // 6, +3.0dB
120 0x55400155, // 7, +2.5dB
121 0x50800142, // 8, +2.0dB
122 0x4c000130, // 9, +1.5dB
123 0x47c0011f, // 10, +1.0dB
124 0x43c0010f, // 11, +0.5dB
125 0x40000100, // 12, +0dB
126 0x3c8000f2, // 13, -0.5dB
127 0x390000e4, // 14, -1.0dB
128 0x35c000d7, // 15, -1.5dB
129 0x32c000cb, // 16, -2.0dB
130 0x300000c0, // 17, -2.5dB
131 0x2d4000b5, // 18, -3.0dB
132 0x2ac000ab, // 19, -3.5dB
133 0x288000a2, // 20, -4.0dB
134 0x26000098, // 21, -4.5dB
135 0x24000090, // 22, -5.0dB
136 0x22000088, // 23, -5.5dB
137 0x20000080, // 24, -6.0dB
138 0x1e400079, // 25, -6.5dB
139 0x1c800072, // 26, -7.0dB
140 0x1b00006c, // 27. -7.5dB
141 0x19800066, // 28, -8.0dB
142 0x18000060, // 29, -8.5dB
143 0x16c0005b, // 30, -9.0dB
144 0x15800056, // 31, -9.5dB
145 0x14400051, // 32, -10.0dB
146 0x1300004c, // 33, -10.5dB
147 0x12000048, // 34, -11.0dB
148 0x11000044, // 35, -11.5dB
149 0x10000040, // 36, -12.0dB
150 0x0f00003c,// 37, -12.5dB
151 0x0e400039,// 38, -13.0dB
152 0x0d800036,// 39, -13.5dB
153 0x0cc00033,// 40, -14.0dB
154 0x0c000030,// 41, -14.5dB
155 0x0b40002d,// 42, -15.0dB
159 u1Byte CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
160 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB
161 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB
162 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB
163 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB
164 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB
165 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB
166 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB
167 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB
168 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB
169 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB
170 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB
171 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB
172 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB
173 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB
174 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB
175 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB
176 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
177 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB
178 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB
179 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB
180 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB
181 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB
182 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB
183 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB
184 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB
185 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB
186 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB
187 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB
188 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB
189 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB
190 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB
191 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB
192 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB
196 u1Byte CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= {
197 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB
198 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB
199 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB
200 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB
201 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB
202 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB
203 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB
204 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB
205 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB
206 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB
207 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB
208 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB
209 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB
210 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB
211 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB
212 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB
213 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
214 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB
215 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB
216 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB
217 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB
218 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB
219 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB
220 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB
221 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB
222 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB
223 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB
224 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB
225 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB
226 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB
227 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB
228 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB
229 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB
233 #ifdef AP_BUILD_WORKAROUND
235 unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {
236 /* +6.0dB */ 0x7f8001fe,
237 /* +5.5dB */ 0x788001e2,
238 /* +5.0dB */ 0x71c001c7,
239 /* +4.5dB */ 0x6b8001ae,
240 /* +4.0dB */ 0x65400195,
241 /* +3.5dB */ 0x5fc0017f,
242 /* +3.0dB */ 0x5a400169,
243 /* +2.5dB */ 0x55400155,
244 /* +2.0dB */ 0x50800142,
245 /* +1.5dB */ 0x4c000130,
246 /* +1.0dB */ 0x47c0011f,
247 /* +0.5dB */ 0x43c0010f,
248 /* 0.0dB */ 0x40000100,
249 /* -0.5dB */ 0x3c8000f2,
250 /* -1.0dB */ 0x390000e4,
251 /* -1.5dB */ 0x35c000d7,
252 /* -2.0dB */ 0x32c000cb,
253 /* -2.5dB */ 0x300000c0,
254 /* -3.0dB */ 0x2d4000b5,
255 /* -3.5dB */ 0x2ac000ab,
256 /* -4.0dB */ 0x288000a2,
257 /* -4.5dB */ 0x26000098,
258 /* -5.0dB */ 0x24000090,
259 /* -5.5dB */ 0x22000088,
260 /* -6.0dB */ 0x20000080,
261 /* -6.5dB */ 0x1a00006c,
262 /* -7.0dB */ 0x1c800072,
263 /* -7.5dB */ 0x18000060,
264 /* -8.0dB */ 0x19800066,
265 /* -8.5dB */ 0x15800056,
266 /* -9.0dB */ 0x26c0005b,
267 /* -9.5dB */ 0x14400051,
268 /* -10.0dB */ 0x24400051,
269 /* -10.5dB */ 0x1300004c,
270 /* -11.0dB */ 0x12000048,
271 /* -11.5dB */ 0x11000044,
272 /* -12.0dB */ 0x10000040
276 //============================================================
277 // Local Function predefine.
278 //============================================================
280 //START------------COMMON INFO RELATED---------------//
282 odm_CommonInfoSelfInit(
287 odm_CommonInfoSelfUpdate(
292 odm_CmnInfoInit_Debug(
297 odm_CmnInfoHook_Debug(
302 odm_CmnInfoUpdate_Debug(
316 //END------------COMMON INFO RELATED---------------//
318 //START---------------DIG---------------------------//
320 odm_FalseAlarmCounterStatistics(
335 odm_CCKPacketDetectionThresh(
338 //END---------------DIG---------------------------//
340 //START-------BB POWER SAVE-----------------------//
342 odm_DynamicBBPowerSavingInit(
347 odm_DynamicBBPowerSaving(
355 //END---------BB POWER SAVE-----------------------//
357 //START-----------------PSD-----------------------//
358 #if (DM_ODM_SUPPORT_TYPE & (ODM_MP))
359 //============================================================
360 // Function predefine.
361 //============================================================
362 void odm_PathDiversityInit_92C( PADAPTER Adapter);
363 void odm_2TPathDiversityInit_92C( PADAPTER Adapter);
364 void odm_1TPathDiversityInit_92C( PADAPTER Adapter);
365 bool odm_IsConnected_92C(PADAPTER Adapter);
366 void odm_PathDiversityAfterLink_92C( PADAPTER Adapter);
369 odm_CCKTXPathDiversityCallback(
374 odm_CCKTXPathDiversityWorkItemCallback(
379 odm_PathDivChkAntSwitchCallback(
384 odm_PathDivChkAntSwitchWorkitemCallback(
388 void odm_SetRespPath_92C( PADAPTER Adapter, u1Byte DefaultRespPath);
389 void odm_OFDMTXPathDiversity_92C( PADAPTER Adapter);
390 void odm_CCKTXPathDiversity_92C( PADAPTER Adapter);
391 void odm_ResetPathDiversity_92C( PADAPTER Adapter);
393 //Start-------------------- RX High Power------------------------//
394 void odm_RXHPInit( PDM_ODM_T pDM_Odm);
395 void odm_RXHP( PDM_ODM_T pDM_Odm);
396 void odm_Write_RXHP( PDM_ODM_T pDM_Odm);
398 void odm_PSD_RXHP( PDM_ODM_T pDM_Odm);
399 void odm_PSD_RXHPCallback( PRT_TIMER pTimer);
400 void odm_PSD_RXHPWorkitemCallback( void * pContext);
401 //End--------------------- RX High Power -----------------------//
404 odm_PathDivInit( PDM_ODM_T pDM_Odm);
409 u1Byte DefaultRespPath
413 //END-------------------PSD-----------------------//
416 odm_RefreshRateAdaptiveMaskMP(
421 odm_RefreshRateAdaptiveMaskCE(
426 odm_RefreshRateAdaptiveMaskAPADSL(
431 odm_DynamicTxPowerInit(
436 odm_DynamicTxPowerRestorePowerIndex(
441 odm_DynamicTxPowerNIC(
445 #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE))
447 odm_DynamicTxPowerSavePowerIndex(
452 odm_DynamicTxPowerWritePowerIndex(
457 odm_DynamicTxPower_92C(
462 odm_DynamicTxPower_92D(
474 odm_RSSIMonitorCheckMP(
479 odm_RSSIMonitorCheckCE(
483 odm_RSSIMonitorCheckAP(
490 odm_RSSIMonitorCheck(
499 odm_DynamicTxPowerAP(
510 odm_SwAntDivInit_NIC(
515 odm_SwAntDivChkAntSwitch(
521 odm_SwAntDivChkAntSwitchNIC(
527 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
529 odm_SwAntDivChkAntSwitchCallback(
533 odm_SwAntDivChkAntSwitchWorkitemCallback(
536 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
537 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
538 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
539 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
545 odm_GlobalAdapterCheck(
550 odm_RefreshRateAdaptiveMask(
555 ODM_TXPowerTrackingCheck(
560 odm_TXPowerTrackingCheckAP(
571 odm_RateAdaptiveMaskInit(
576 odm_TXPowerTrackingThermalMeterInit(
582 odm_TXPowerTrackingInit(
587 odm_TXPowerTrackingCheckMP(
593 odm_TXPowerTrackingCheckCE(
597 #if (DM_ODM_SUPPORT_TYPE & (ODM_MP))
600 ODM_RateAdaptiveStateApInit(
606 odm_TXPowerTrackingCallbackThermalMeter92C(
611 odm_TXPowerTrackingCallbackRXGainThermalMeter92D(
616 odm_TXPowerTrackingCallbackThermalMeter92D(
621 odm_TXPowerTrackingDirectCall92C(
626 odm_TXPowerTrackingThermalMeterCheck(
641 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
643 odm_EdcaTurboCheckMP(
647 //check if edca turbo is disabled
649 odm_IsEdcaTurboDisable(
652 //choose edca paramter for special IOT case
654 ODM_EdcaParaSelByIot(
659 //check if it is UL or DL
661 odm_EdcaChooseTrafficIdx(
666 bool *pbIsCurRDLState
669 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
671 odm_EdcaTurboCheckCE(
688 #define RxDefaultAnt1 0x65a9
689 #define RxDefaultAnt2 0x569a
692 odm_InitHybridAntDiv(
699 u4Byte OFDM_Ant1_Cnt,
700 u4Byte OFDM_Ant2_Cnt,
715 void odm_HwAntDiv(PDM_ODM_T pDM_Odm);
717 //============================================================
719 //============================================================
722 // 2011/09/21 MH Add to describe different team necessary resource allocate??
730 #if (FPGA_TWO_MAC_VERIFICATION == 1)
731 odm_RateAdaptiveMaskInit(pDM_Odm);
735 //2012.05.03 Luke: For all IC series
736 odm_CommonInfoSelfInit(pDM_Odm);
737 odm_CmnInfoInit_Debug(pDM_Odm);
738 odm_DIGInit(pDM_Odm);
739 odm_RateAdaptiveMaskInit(pDM_Odm);
741 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
745 else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
747 #if (RTL8188E_SUPPORT == 1)
748 odm_PrimaryCCA_Init(pDM_Odm); // Gary
750 odm_DynamicBBPowerSavingInit(pDM_Odm);
751 odm_DynamicTxPowerInit(pDM_Odm);
752 odm_TXPowerTrackingInit(pDM_Odm);
753 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
754 odm_PSDMonitorInit(pDM_Odm);
755 odm_RXHPInit(pDM_Odm);
756 odm_PathDivInit(pDM_Odm); //92D Path Div Init //Neil Chen
758 ODM_EdcaTurboInit(pDM_Odm);
759 #if (RTL8188E_SUPPORT == 1)
760 ODM_RAInfo_Init_all(pDM_Odm);
762 if ( ( pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV ) ||
763 ( pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV ) ||
764 ( pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ))
766 odm_InitHybridAntDiv(pDM_Odm);
768 else if ( pDM_Odm->AntDivType == CGCS_RX_SW_ANTDIV)
770 odm_SwAntDivInit(pDM_Odm);
776 // 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.
777 // You can not add any dummy function here, be care, you can only use DM structure
778 // to perform any new ODM_DM.
785 //2012.05.03 Luke: For all IC series
786 odm_GlobalAdapterCheck();
787 odm_CmnInfoHook_Debug(pDM_Odm);
788 odm_CmnInfoUpdate_Debug(pDM_Odm);
789 odm_CommonInfoSelfUpdate(pDM_Odm);
790 odm_FalseAlarmCounterStatistics(pDM_Odm);
791 odm_RSSIMonitorCheck(pDM_Odm);
793 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
794 //8723A or 8189ES platform
795 //NeilChen--2012--08--24--
796 //Fix Leave LPS issue
797 if ((pDM_Odm->Adapter->pwrctrlpriv.pwr_mode != PS_MODE_ACTIVE) &&// in LPS mode
798 ((pDM_Odm->SupportICType & (ODM_RTL8723A ) )||
799 (pDM_Odm->SupportICType & (ODM_RTL8188E) &&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO))))) {
800 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));
801 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
802 odm_DIGbyRSSI_LPS(pDM_Odm);
810 odm_CCKPacketDetectionThresh(pDM_Odm);
812 if (*(pDM_Odm->pbPowerSaving)==true)
815 odm_RefreshRateAdaptiveMask(pDM_Odm);
817 #if (RTL8192D_SUPPORT == 1)
818 ODM_DynamicEarlyMode(pDM_Odm);
820 odm_DynamicBBPowerSaving(pDM_Odm);
821 #if (RTL8188E_SUPPORT == 1)
822 odm_DynamicPrimaryCCA(pDM_Odm);
824 if ( ( pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV ) ||
825 ( pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV ) ||
826 ( pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ))
828 odm_HwAntDiv(pDM_Odm);
830 else if ( pDM_Odm->AntDivType == CGCS_RX_SW_ANTDIV)
832 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
835 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
839 else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
841 ODM_TXPowerTrackingCheck(pDM_Odm);
842 odm_EdcaTurboCheck(pDM_Odm);
843 odm_DynamicTxPower(pDM_Odm);
844 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
852 // Init /.. Fixed HW value. Only init time.
857 ODM_CMNINFO_E CmnInfo,
861 //ODM_RT_TRACE(pDM_Odm,);
864 // This section is used for init value
871 case ODM_CMNINFO_ABILITY:
872 pDM_Odm->SupportAbility = (u4Byte)Value;
874 case ODM_CMNINFO_PLATFORM:
875 pDM_Odm->SupportPlatform = (u1Byte)Value;
878 case ODM_CMNINFO_INTERFACE:
879 pDM_Odm->SupportInterface = (u1Byte)Value;
882 case ODM_CMNINFO_MP_TEST_CHIP:
883 pDM_Odm->bIsMPChip= (u1Byte)Value;
886 case ODM_CMNINFO_IC_TYPE:
887 pDM_Odm->SupportICType = Value;
890 case ODM_CMNINFO_CUT_VER:
891 pDM_Odm->CutVersion = (u1Byte)Value;
894 case ODM_CMNINFO_FAB_VER:
895 pDM_Odm->FabVersion = (u1Byte)Value;
898 case ODM_CMNINFO_RF_TYPE:
899 pDM_Odm->RFType = (u1Byte)Value;
902 case ODM_CMNINFO_RF_ANTENNA_TYPE:
903 pDM_Odm->AntDivType= (u1Byte)Value;
906 case ODM_CMNINFO_BOARD_TYPE:
907 pDM_Odm->BoardType = (u1Byte)Value;
910 case ODM_CMNINFO_EXT_LNA:
911 pDM_Odm->ExtLNA = (u1Byte)Value;
914 case ODM_CMNINFO_EXT_PA:
915 pDM_Odm->ExtPA = (u1Byte)Value;
918 case ODM_CMNINFO_EXT_TRSW:
919 pDM_Odm->ExtTRSW = (u1Byte)Value;
921 case ODM_CMNINFO_PATCH_ID:
922 pDM_Odm->PatchID = (u1Byte)Value;
924 case ODM_CMNINFO_BINHCT_TEST:
925 pDM_Odm->bInHctTest = (bool)Value;
927 case ODM_CMNINFO_BWIFI_TEST:
928 pDM_Odm->bWIFITest = (bool)Value;
931 case ODM_CMNINFO_SMART_CONCURRENT:
932 pDM_Odm->bDualMacSmartConcurrent = (bool )Value;
935 //To remove the compiler warning, must add an empty default statement to handle the other values.
943 // Tx power tracking BB swing table.
944 // The base index = 12. +((12-n)/2)dB 13~?? = decrease tx pwr by -((n-12)/2)dB
946 pDM_Odm->BbSwingIdxOfdm = 12; // Set defalut value as index 12.
947 pDM_Odm->BbSwingIdxOfdmCurrent = 12;
948 pDM_Odm->BbSwingFlagOfdm = false;
956 ODM_CMNINFO_E CmnInfo,
961 // Hook call by reference pointer.
966 // Dynamic call by reference pointer.
968 case ODM_CMNINFO_MAC_PHY_MODE:
969 pDM_Odm->pMacPhyMode = (u1Byte *)pValue;
972 case ODM_CMNINFO_TX_UNI:
973 pDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;
976 case ODM_CMNINFO_RX_UNI:
977 pDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;
980 case ODM_CMNINFO_WM_MODE:
981 pDM_Odm->pWirelessMode = (u1Byte *)pValue;
984 case ODM_CMNINFO_BAND:
985 pDM_Odm->pBandType = (u1Byte *)pValue;
988 case ODM_CMNINFO_SEC_CHNL_OFFSET:
989 pDM_Odm->pSecChOffset = (u1Byte *)pValue;
992 case ODM_CMNINFO_SEC_MODE:
993 pDM_Odm->pSecurity = (u1Byte *)pValue;
997 pDM_Odm->pBandWidth = (u1Byte *)pValue;
1000 case ODM_CMNINFO_CHNL:
1001 pDM_Odm->pChannel = (u1Byte *)pValue;
1004 case ODM_CMNINFO_DMSP_GET_VALUE:
1005 pDM_Odm->pbGetValueFromOtherMac = (bool *)pValue;
1008 case ODM_CMNINFO_BUDDY_ADAPTOR:
1009 pDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;
1012 case ODM_CMNINFO_DMSP_IS_MASTER:
1013 pDM_Odm->pbMasterOfDMSP = (bool *)pValue;
1016 case ODM_CMNINFO_SCAN:
1017 pDM_Odm->pbScanInProcess = (bool *)pValue;
1020 case ODM_CMNINFO_POWER_SAVING:
1021 pDM_Odm->pbPowerSaving = (bool *)pValue;
1024 case ODM_CMNINFO_ONE_PATH_CCA:
1025 pDM_Odm->pOnePathCCA = (u1Byte *)pValue;
1028 case ODM_CMNINFO_DRV_STOP:
1029 pDM_Odm->pbDriverStopped = (bool *)pValue;
1032 case ODM_CMNINFO_PNP_IN:
1033 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = (bool *)pValue;
1036 case ODM_CMNINFO_INIT_ON:
1037 pDM_Odm->pinit_adpt_in_progress = (bool *)pValue;
1040 case ODM_CMNINFO_ANT_TEST:
1041 pDM_Odm->pAntennaTest = (u1Byte *)pValue;
1044 case ODM_CMNINFO_NET_CLOSED:
1045 pDM_Odm->pbNet_closed = (bool *)pValue;
1047 case ODM_CMNINFO_MP_MODE:
1048 pDM_Odm->mp_mode = (u1Byte *)pValue;
1051 //case ODM_CMNINFO_BT_COEXIST:
1052 // pDM_Odm->BTCoexist = (bool *)pValue;
1054 //case ODM_CMNINFO_STA_STATUS:
1055 //pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;
1058 //case ODM_CMNINFO_PHY_STATUS:
1059 // pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;
1062 //case ODM_CMNINFO_MAC_STATUS:
1063 // pDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;
1065 //To remove the compiler warning, must add an empty default statement to handle the other values.
1076 ODM_CmnInfoPtrArrayHook(
1078 ODM_CMNINFO_E CmnInfo,
1084 // Hook call by reference pointer.
1089 // Dynamic call by reference pointer.
1091 case ODM_CMNINFO_STA_STATUS:
1092 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
1094 //To remove the compiler warning, must add an empty default statement to handle the other values.
1104 // Update Band/CHannel/.. The values are dynamic but non-per-packet.
1114 // This init variable may be changed in run time.
1118 case ODM_CMNINFO_ABILITY:
1119 pDM_Odm->SupportAbility = (u4Byte)Value;
1122 case ODM_CMNINFO_RF_TYPE:
1123 pDM_Odm->RFType = (u1Byte)Value;
1126 case ODM_CMNINFO_WIFI_DIRECT:
1127 pDM_Odm->bWIFI_Direct = (bool)Value;
1130 case ODM_CMNINFO_WIFI_DISPLAY:
1131 pDM_Odm->bWIFI_Display = (bool)Value;
1134 case ODM_CMNINFO_LINK:
1135 pDM_Odm->bLinked = (bool)Value;
1138 case ODM_CMNINFO_RSSI_MIN:
1139 pDM_Odm->RSSI_Min= (u1Byte)Value;
1142 case ODM_CMNINFO_DBG_COMP:
1143 pDM_Odm->DebugComponents = Value;
1146 case ODM_CMNINFO_DBG_LEVEL:
1147 pDM_Odm->DebugLevel = (u4Byte)Value;
1149 case ODM_CMNINFO_RA_THRESHOLD_HIGH:
1150 pDM_Odm->RateAdaptive.HighRSSIThresh = (u1Byte)Value;
1153 case ODM_CMNINFO_RA_THRESHOLD_LOW:
1154 pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;
1156 #if (BT_30_SUPPORT == 1)
1157 // The following is for BT HS mode and BT coexist mechanism.
1158 case ODM_CMNINFO_BT_DISABLED:
1159 pDM_Odm->bBtDisabled = (bool)Value;
1162 case ODM_CMNINFO_BT_OPERATION:
1163 pDM_Odm->bBtHsOperation = (bool)Value;
1166 case ODM_CMNINFO_BT_DIG:
1167 pDM_Odm->btHsDigVal = (u1Byte)Value;
1170 case ODM_CMNINFO_BT_BUSY:
1171 pDM_Odm->bBtBusy = (bool)Value;
1174 case ODM_CMNINFO_BT_DISABLE_EDCA:
1175 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value;
1185 odm_CommonInfoSelfInit(
1189 pDM_Odm->bCckHighPower = (bool) ODM_GetBBReg(pDM_Odm, 0x824, BIT9);
1190 pDM_Odm->RFPathRxEnable = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xc04, 0x0F);
1191 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
1192 pDM_Odm->pbNet_closed = &pDM_Odm->bool_temp;
1194 if (pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
1196 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
1197 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1198 #elif (defined(CONFIG_SW_ANTENNA_DIVERSITY))
1199 pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
1202 if (pDM_Odm->SupportICType & (ODM_RTL8723A))
1203 pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
1205 ODM_InitDebugSetting(pDM_Odm);
1209 odm_CommonInfoSelfUpdate(
1217 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
1219 PADAPTER Adapter = pDM_Odm->Adapter;
1220 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
1222 pEntry = pDM_Odm->pODM_StaInfo[0];
1223 if (pMgntInfo->mAssoc)
1227 pEntry->MacAddr[i] = pMgntInfo->Bssid[i];
1231 pEntry->bUsed=false;
1233 pEntry->MacAddr[i] = 0;
1238 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
1240 if (*(pDM_Odm->pSecChOffset) == 1)
1241 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) -2;
1242 else if (*(pDM_Odm->pSecChOffset) == 2)
1243 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) +2;
1246 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
1248 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1250 pEntry = pDM_Odm->pODM_StaInfo[i];
1251 if (IS_STA_VALID(pEntry))
1255 pDM_Odm->bOneEntryOnly = true;
1257 pDM_Odm->bOneEntryOnly = false;
1261 odm_CmnInfoInit_Debug(
1265 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug==>\n"));
1266 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform=%d\n",pDM_Odm->SupportPlatform) );
1267 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility=0x%x\n",pDM_Odm->SupportAbility) );
1268 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface=%d\n",pDM_Odm->SupportInterface) );
1269 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType=0x%x\n",pDM_Odm->SupportICType) );
1270 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion=%d\n",pDM_Odm->CutVersion) );
1271 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion=%d\n",pDM_Odm->FabVersion) );
1272 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType=%d\n",pDM_Odm->RFType) );
1273 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType=%d\n",pDM_Odm->BoardType) );
1274 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA=%d\n",pDM_Odm->ExtLNA) );
1275 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA=%d\n",pDM_Odm->ExtPA) );
1276 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW=%d\n",pDM_Odm->ExtTRSW) );
1277 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID=%d\n",pDM_Odm->PatchID) );
1278 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest=%d\n",pDM_Odm->bInHctTest) );
1279 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest=%d\n",pDM_Odm->bWIFITest) );
1280 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent=%d\n",pDM_Odm->bDualMacSmartConcurrent) );
1285 odm_CmnInfoHook_Debug(
1289 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoHook_Debug==>\n"));
1290 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumTxBytesUnicast=%llu\n",*(pDM_Odm->pNumTxBytesUnicast)) );
1291 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumRxBytesUnicast=%llu\n",*(pDM_Odm->pNumRxBytesUnicast)) );
1292 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pWirelessMode=0x%x\n",*(pDM_Odm->pWirelessMode)) );
1293 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecChOffset=%d\n",*(pDM_Odm->pSecChOffset)) );
1294 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecurity=%d\n",*(pDM_Odm->pSecurity)) );
1295 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandWidth=%d\n",*(pDM_Odm->pBandWidth)) );
1296 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pChannel=%d\n",*(pDM_Odm->pChannel)) );
1298 #if (RTL8192D_SUPPORT==1)
1299 if (pDM_Odm->pBandType)
1300 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandType=%d\n",*(pDM_Odm->pBandType)) );
1301 if (pDM_Odm->pMacPhyMode)
1302 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pMacPhyMode=%d\n",*(pDM_Odm->pMacPhyMode)) );
1303 if (pDM_Odm->pBuddyAdapter)
1304 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbGetValueFromOtherMac=%d\n",*(pDM_Odm->pbGetValueFromOtherMac)) );
1305 if (pDM_Odm->pBuddyAdapter)
1306 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBuddyAdapter=%p\n",*(pDM_Odm->pBuddyAdapter)) );
1307 if (pDM_Odm->pbMasterOfDMSP)
1308 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbMasterOfDMSP=%d\n",*(pDM_Odm->pbMasterOfDMSP)) );
1310 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbScanInProcess=%d\n",*(pDM_Odm->pbScanInProcess)) );
1311 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbPowerSaving=%d\n",*(pDM_Odm->pbPowerSaving)) );
1313 if (pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1314 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pOnePathCCA=%d\n",*(pDM_Odm->pOnePathCCA)) );
1318 odm_CmnInfoUpdate_Debug(
1322 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoUpdate_Debug==>\n"));
1323 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Direct=%d\n",pDM_Odm->bWIFI_Direct) );
1324 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Display=%d\n",pDM_Odm->bWIFI_Display) );
1325 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked=%d\n",pDM_Odm->bLinked) );
1326 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_Min=%d\n",pDM_Odm->RSSI_Min) );
1329 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
1331 ODM_InitAllWorkItems(PDM_ODM_T pDM_Odm )
1334 PADAPTER pAdapter = pDM_Odm->Adapter;
1336 ODM_InitializeWorkItem( pDM_Odm,
1337 &pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem,
1338 (RT_WORKITEM_CALL_BACK)odm_SwAntDivChkAntSwitchWorkitemCallback,
1340 "AntennaSwitchWorkitem"
1343 ODM_InitializeWorkItem(
1345 &(pDM_Odm->PathDivSwitchWorkitem),
1346 (RT_WORKITEM_CALL_BACK)odm_PathDivChkAntSwitchWorkitemCallback,
1350 ODM_InitializeWorkItem(
1352 &(pDM_Odm->CCKPathDiversityWorkitem),
1353 (RT_WORKITEM_CALL_BACK)odm_CCKTXPathDiversityWorkItemCallback,
1355 "CCKTXPathDiversityWorkItem");
1356 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
1357 #if (RTL8188E_SUPPORT == 1)
1358 ODM_InitializeWorkItem(
1360 &(pDM_Odm->FastAntTrainingWorkitem),
1361 (RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback,
1363 "FastAntTrainingWorkitem");
1366 ODM_InitializeWorkItem(
1368 &(pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem),
1369 (RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback,
1371 "PSDRXHP_WorkItem");
1376 ODM_FreeAllWorkItems(PDM_ODM_T pDM_Odm )
1379 ODM_FreeWorkItem( &(pDM_Odm->DM_SWAT_Table.SwAntennaSwitchWorkitem));
1381 ODM_FreeWorkItem(&(pDM_Odm->PathDivSwitchWorkitem));
1383 ODM_FreeWorkItem(&(pDM_Odm->CCKPathDiversityWorkitem));
1385 ODM_FreeWorkItem(&(pDM_Odm->FastAntTrainingWorkitem));
1387 ODM_FreeWorkItem((&pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem));
1395 odm_FindMinimumRSSI(
1400 u1Byte RSSI_Min = 0xFF;
1402 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1404 // if (pDM_Odm->pODM_StaInfo[i] != NULL)
1405 if (IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1407 if (pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)
1409 RSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;
1414 pDM_Odm->RSSI_Min = RSSI_Min;
1424 bool Linked = false;
1426 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1428 if (IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1436 pDM_Odm->bLinked = Linked;
1441 //3============================================================
1443 //3============================================================
1444 /*-----------------------------------------------------------------------------
1445 * Function: odm_DIGInit()
1447 * Overview: Set DIG scheme init value.
1458 *---------------------------------------------------------------------------*/
1460 ODM_ChangeDynamicInitGainThresh(
1466 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1468 if (DM_Type == DIG_TYPE_THRESH_HIGH)
1470 pDM_DigTable->RssiHighThresh = DM_Value;
1472 else if (DM_Type == DIG_TYPE_THRESH_LOW)
1474 pDM_DigTable->RssiLowThresh = DM_Value;
1476 else if (DM_Type == DIG_TYPE_ENABLE)
1478 pDM_DigTable->Dig_Enable_Flag = true;
1480 else if (DM_Type == DIG_TYPE_DISABLE)
1482 pDM_DigTable->Dig_Enable_Flag = false;
1484 else if (DM_Type == DIG_TYPE_BACKOFF)
1488 pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
1490 else if (DM_Type == DIG_TYPE_RX_GAIN_MIN)
1494 pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
1496 else if (DM_Type == DIG_TYPE_RX_GAIN_MAX)
1498 if (DM_Value > 0x50)
1500 pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
1502 } /* DM_ChangeDynamicInitGainThresh */
1504 int getIGIForDiff(int value_IGI)
1506 #define ONERCCA_LOW_TH 0x30
1507 #define ONERCCA_LOW_DIFF 8
1509 if (value_IGI < ONERCCA_LOW_TH) {
1510 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
1511 return ONERCCA_LOW_TH;
1513 return value_IGI + ONERCCA_LOW_DIFF;
1520 // Add by Neil Chen to enable edcca to MP Platform
1521 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
1529 // This should be moved out of OUTSRC
1530 PADAPTER pAdapter = pDM_Odm->Adapter;
1531 // Enable EDCCA. The value is suggested by SD3 Wilson.
1534 // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
1536 if ((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
1538 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
1539 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
1540 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
1545 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
1546 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
1547 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
1550 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
1559 ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
1560 ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
1564 // Description: According to initial gain value to determine to enable or disable EDCCA.
1566 // Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
1573 PADAPTER pAdapter = pDM_Odm->Adapter;
1574 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1575 u1Byte RegC50, RegC58;
1576 bool bEDCCAenable = false;
1578 RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
1579 RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
1582 if ((RegC50 > 0x28 && RegC58 > 0x28) ||
1583 ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||
1584 (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))
1586 if (!pHalData->bPreEdccaEnable)
1588 odm_EnableEDCCA(pDM_Odm);
1589 pHalData->bPreEdccaEnable = true;
1593 else if ((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))
1595 if (pHalData->bPreEdccaEnable)
1597 odm_DisableEDCCA(pDM_Odm);
1598 pHalData->bPreEdccaEnable = false;
1604 #endif // end MP platform support
1612 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1614 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",
1615 ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
1617 if (pDM_DigTable->CurIGValue != CurrentIGI)//if (pDM_DigTable->PreIGValue != CurrentIGI)
1619 if (pDM_Odm->SupportPlatform & (ODM_CE|ODM_MP))
1621 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1622 if (pDM_Odm->SupportICType != ODM_RTL8188E)
1623 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1625 else if (pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1627 switch (*(pDM_Odm->pOnePathCCA))
1630 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1631 if (pDM_Odm->SupportICType != ODM_RTL8188E)
1632 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1635 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1636 if (pDM_Odm->SupportICType != ODM_RTL8188E)
1637 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
1640 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
1641 if (pDM_Odm->SupportICType != ODM_RTL8188E)
1642 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1646 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x).\n",CurrentIGI));
1647 //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue;
1648 pDM_DigTable->CurIGValue = CurrentIGI;
1650 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x\n",CurrentIGI));
1652 // Add by Neil Chen to enable edcca to MP Platform
1653 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
1655 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1656 odm_DynamicEDCCA(pDM_Odm);
1663 //Need LPS mode for CE platform --2012--08--24---
1665 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1672 PADAPTER pAdapter =pDM_Odm->Adapter;
1673 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1674 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
1676 u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
1677 u1Byte bFwCurrentInPSMode = false;
1678 u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
1680 if (! (pDM_Odm->SupportICType & (ODM_RTL8723A |ODM_RTL8188E)))
1683 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
1685 bFwCurrentInPSMode = pAdapter->pwrctrlpriv.bFwCurrentInPSMode;
1688 // Using FW PS mode to make IGI
1689 if (bFwCurrentInPSMode)
1691 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n"));
1692 //Adjust by FA in LPS MODE
1693 if (pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
1694 CurrentIGI = CurrentIGI+2;
1695 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
1696 CurrentIGI = CurrentIGI+1;
1697 else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
1698 CurrentIGI = CurrentIGI-1;
1702 CurrentIGI = RSSI_Lower;
1705 //Lower bound checking
1707 //RSSI Lower bound check
1708 if ((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
1709 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
1711 RSSI_Lower =DM_DIG_MIN_NIC;
1713 //Upper and Lower Bound checking
1714 if (CurrentIGI > DM_DIG_MAX_NIC)
1715 CurrentIGI=DM_DIG_MAX_NIC;
1716 else if (CurrentIGI < RSSI_Lower)
1717 CurrentIGI =RSSI_Lower;
1719 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1730 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1732 //pDM_DigTable->Dig_Enable_Flag = true;
1733 //pDM_DigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
1734 pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
1735 //pDM_DigTable->PreIGValue = 0x0;
1736 //pDM_DigTable->CurSTAConnectState = pDM_DigTable->PreSTAConnectState = DIG_STA_DISCONNECT;
1737 //pDM_DigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
1738 pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
1739 pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
1740 pDM_DigTable->FALowThresh = DMfalseALARM_THRESH_LOW;
1741 pDM_DigTable->FAHighThresh = DMfalseALARM_THRESH_HIGH;
1742 if (pDM_Odm->BoardType == ODM_BOARD_HIGHPWR)
1744 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
1745 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
1749 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
1750 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
1752 pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
1753 pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
1754 pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
1755 pDM_DigTable->PreCCK_CCAThres = 0xFF;
1756 pDM_DigTable->CurCCK_CCAThres = 0x83;
1757 pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
1758 pDM_DigTable->LargeFAHit = 0;
1759 pDM_DigTable->Recover_cnt = 0;
1760 pDM_DigTable->DIG_Dynamic_MIN_0 =DM_DIG_MIN_NIC;
1761 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
1762 pDM_DigTable->bMediaConnect_0 = false;
1763 pDM_DigTable->bMediaConnect_1 = false;
1765 //To Initialize pDM_Odm->bDMInitialGainEnable == false to avoid DIG error
1766 pDM_Odm->bDMInitialGainEnable = true;
1777 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1778 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
1779 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
1780 u1Byte DIG_Dynamic_MIN;
1781 u1Byte DIG_MaxOfMin;
1782 bool FirstConnect, FirstDisConnect;
1783 u1Byte dm_dig_max, dm_dig_min;
1784 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
1786 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
1787 // This should be moved out of OUTSRC
1788 PADAPTER pAdapter = pDM_Odm->Adapter;
1789 #if OS_WIN_FROM_WIN7(OS_VERSION)
1790 if (IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
1792 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test\n"));
1796 #if (BT_30_SUPPORT == 1)
1797 if (pDM_Odm->bBtHsOperation)
1799 odm_DigForBtHsMode(pDM_Odm);
1804 if (pRX_HP_Table->RXHP_flag == 1)
1806 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation\n"));
1809 #endif //end ODM_MP type
1811 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1812 #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
1813 if ((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
1815 printk("pDM_Odm->RSSI_Min=%d\n",pDM_Odm->RSSI_Min);
1816 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
1821 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1822 prtl8192cd_priv priv = pDM_Odm->priv;
1823 if (!((priv->up_time > 5) && (priv->up_time % 2)) )
1825 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period\n"));
1830 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
1831 if ((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT))) {
1832 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"));
1836 if (*(pDM_Odm->pbScanInProcess)) {
1837 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress\n"));
1841 //add by Neil Chen to avoid PSD is processing
1842 if (pDM_Odm->bDMInitialGainEnable == false) {
1843 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing\n"));
1847 if (pDM_Odm->SupportICType == ODM_RTL8192D) {
1848 if (*(pDM_Odm->pMacPhyMode) == ODM_DMSP) {
1849 if (*(pDM_Odm->pbMasterOfDMSP)) {
1850 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
1851 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == false);
1852 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == true);
1854 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
1855 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == false);
1856 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == true);
1859 if (*(pDM_Odm->pBandType) == ODM_BAND_5G) {
1860 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
1861 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == false);
1862 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == true);
1864 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
1865 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == false);
1866 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == true);
1870 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
1871 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == false);
1872 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == true);
1875 //1 Boundary Decision
1876 if ((pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723A)) &&
1877 ((pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) || pDM_Odm->ExtLNA))
1879 if (pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) {
1881 dm_dig_max = DM_DIG_MAX_AP_HP;
1882 dm_dig_min = DM_DIG_MIN_AP_HP;
1884 dm_dig_max = DM_DIG_MAX_NIC_HP;
1885 dm_dig_min = DM_DIG_MIN_NIC_HP;
1887 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
1889 if (pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1891 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1893 if (!priv->pmib->dot11DFSEntry.disable_DFS &&
1894 (OPMODE & WIFI_AP_STATE) &&
1895 (((pDM_Odm->ControlChannel >= 52) &&
1896 (pDM_Odm->ControlChannel <= 64)) ||
1897 ((pDM_Odm->ControlChannel >= 100) &&
1898 (pDM_Odm->ControlChannel <= 140))))
1902 if (priv->pmib->dot11RFEntry.tx2path) {
1903 if (*(pDM_Odm->pWirelessMode) == ODM_WM_B)//(priv->pmib->dot11BssType.net_work_type == WIRELESS_11B)
1910 dm_dig_max = DM_DIG_MAX_AP;
1911 dm_dig_min = DM_DIG_MIN_AP;
1912 DIG_MaxOfMin = dm_dig_max;
1916 dm_dig_max = DM_DIG_MAX_NIC;
1917 dm_dig_min = DM_DIG_MIN_NIC;
1918 DIG_MaxOfMin = DM_DIG_MAX_AP;
1923 if (pDM_Odm->bLinked)
1925 //2 8723A Series, offset need to be 10 //neil
1926 if (pDM_Odm->SupportICType==(ODM_RTL8723A))
1929 if (( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC )
1930 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
1931 else if (( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC )
1932 pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC;
1934 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
1936 //2 If BT is Concurrent, need to set Lower Bound
1938 #if (BT_30_SUPPORT == 1)
1939 if (pDM_Odm->bBtBusy)
1941 if (pDM_Odm->RSSI_Min>10)
1943 if ((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC)
1944 DIG_Dynamic_MIN = DM_DIG_MAX_NIC;
1945 else if ((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC)
1946 DIG_Dynamic_MIN = DM_DIG_MIN_NIC;
1948 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10;
1951 DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
1956 DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
1961 //2 Modify DIG upper bound
1962 if ((pDM_Odm->RSSI_Min + 20) > dm_dig_max )
1963 pDM_DigTable->rx_gain_range_max = dm_dig_max;
1964 else if ((pDM_Odm->RSSI_Min + 20) < dm_dig_min )
1965 pDM_DigTable->rx_gain_range_max = dm_dig_min;
1967 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20;
1970 //2 Modify DIG lower bound
1971 if (pDM_Odm->bOneEntryOnly)
1973 if (pDM_Odm->RSSI_Min < dm_dig_min)
1974 DIG_Dynamic_MIN = dm_dig_min;
1975 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
1976 DIG_Dynamic_MIN = DIG_MaxOfMin;
1978 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1979 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : bOneEntryOnly=true, DIG_Dynamic_MIN=0x%x\n",DIG_Dynamic_MIN));
1980 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : pDM_Odm->RSSI_Min=%d\n",pDM_Odm->RSSI_Min));
1982 //1 Lower Bound for 88E AntDiv
1983 #if (RTL8188E_SUPPORT == 1)
1984 else if ((pDM_Odm->SupportICType == ODM_RTL8188E)&&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
1986 if (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
1988 DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
1989 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));
1995 DIG_Dynamic_MIN=dm_dig_min;
2001 pDM_DigTable->rx_gain_range_max = dm_dig_max;
2002 DIG_Dynamic_MIN = dm_dig_min;
2003 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n"));
2006 //1 Modify DIG lower bound, deal with abnormally large false alarm
2007 if (pFalseAlmCnt->Cnt_all > 10000)
2009 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally false alarm case.\n"));
2011 if (pDM_DigTable->LargeFAHit != 3)
2012 pDM_DigTable->LargeFAHit++;
2013 if (pDM_DigTable->ForbiddenIGI < CurrentIGI)//if (pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
2015 pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
2016 pDM_DigTable->LargeFAHit = 1;
2019 if (pDM_DigTable->LargeFAHit >= 3)
2021 if ((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max)
2022 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
2024 pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
2025 pDM_DigTable->Recover_cnt = 3600; //3600=2hr
2031 //Recovery mechanism for IGI lower bound
2032 if (pDM_DigTable->Recover_cnt != 0)
2033 pDM_DigTable->Recover_cnt --;
2036 if (pDM_DigTable->LargeFAHit < 3)
2038 if ((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN)
2040 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
2041 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
2042 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
2046 pDM_DigTable->ForbiddenIGI --;
2047 pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
2048 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
2053 pDM_DigTable->LargeFAHit = 0;
2057 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit));
2059 //1 Adjust initial gain by false alarm
2060 if (pDM_Odm->bLinked)
2062 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n"));
2065 CurrentIGI = pDM_Odm->RSSI_Min;
2066 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n"));
2070 if (pDM_Odm->SupportICType == ODM_RTL8192D)
2072 if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D)
2073 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
2074 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D)
2075 CurrentIGI = CurrentIGI + 1; //pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
2076 else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D)
2077 CurrentIGI = CurrentIGI - 1;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
2081 #if (BT_30_SUPPORT == 1)
2082 if (pDM_Odm->bBtBusy)
2084 if (pFalseAlmCnt->Cnt_all > 0x300)
2085 CurrentIGI = CurrentIGI + 2;
2086 else if (pFalseAlmCnt->Cnt_all > 0x250)
2087 CurrentIGI = CurrentIGI + 1;
2088 else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
2089 CurrentIGI = CurrentIGI -1;
2094 if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
2095 CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
2096 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
2097 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
2098 else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
2099 CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
2108 //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min
2109 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n"));
2110 if (FirstDisConnect)
2112 CurrentIGI = pDM_DigTable->rx_gain_range_min;
2113 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect\n"));
2117 //2012.03.30 LukeLee: enable DIG before link but with very high thresholds
2118 if (pFalseAlmCnt->Cnt_all > 10000)
2119 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
2120 else if (pFalseAlmCnt->Cnt_all > 8000)
2121 CurrentIGI = CurrentIGI + 1;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
2122 else if (pFalseAlmCnt->Cnt_all < 500)
2123 CurrentIGI = CurrentIGI - 1;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
2124 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG\n"));
2127 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n"));
2128 //1 Check initial gain by upper/lower bound
2130 if (pDM_DigTable->CurIGValue > pDM_DigTable->rx_gain_range_max)
2131 pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_max;
2132 if (pDM_DigTable->CurIGValue < pDM_DigTable->rx_gain_range_min)
2133 pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min;
2135 if (CurrentIGI > pDM_DigTable->rx_gain_range_max)
2136 CurrentIGI = pDM_DigTable->rx_gain_range_max;
2137 if (CurrentIGI < pDM_DigTable->rx_gain_range_min)
2138 CurrentIGI = pDM_DigTable->rx_gain_range_min;
2140 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",
2141 pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min));
2142 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all));
2143 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI));
2145 //2 High power RSSI threshold
2146 #if (DM_ODM_SUPPORT_TYPE & ODM_MP)
2148 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
2150 // for LC issue to dymanic modify DIG lower bound----------LC Mocca Issue
2151 u8Byte curTxOkCnt=0, curRxOkCnt=0;
2152 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
2155 //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
2156 //u8Byte CurByteCnt=0, PreByteCnt=0;
2158 curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
2159 curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
2160 lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast;
2161 lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast;
2162 //----------------------------------------------------------end for LC Mocca issue
2163 if ((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
2165 // High power IGI lower bound
2166 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
2167 if (CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
2169 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
2170 //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
2171 CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
2174 if ((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
2176 if (pHalData->UndecoratedSmoothedPWDB > 0x28)
2178 if (CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
2180 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
2181 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
2188 #if (RTL8192D_SUPPORT==1)
2189 if (pDM_Odm->SupportICType == ODM_RTL8192D)
2191 //sherry delete DualMacSmartConncurrent 20110517
2192 if (*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
2194 ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
2195 if (*(pDM_Odm->pbMasterOfDMSP))
2197 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
2198 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
2202 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
2203 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
2208 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
2209 if (*(pDM_Odm->pBandType) == ODM_BAND_5G)
2211 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
2212 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
2216 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
2217 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
2224 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
2225 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
2226 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
2231 //3============================================================
2232 //3 FASLE ALARM CHECK
2233 //3============================================================
2236 odm_FalseAlarmCounterStatistics(
2241 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
2243 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
2244 prtl8192cd_priv priv = pDM_Odm->priv;
2245 if ( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
2249 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
2250 if ((pDM_Odm->SupportICType == ODM_RTL8192D) &&
2251 (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&& ////modify by Guo.Mingzhi 2011-12-29
2252 (!(*(pDM_Odm->pbMasterOfDMSP))))
2254 odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
2259 if (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
2262 // if (pDM_Odm->SupportICType != ODM_RTL8812)
2263 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2267 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
2268 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
2270 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
2271 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
2272 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
2273 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
2274 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
2275 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
2276 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
2277 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
2278 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
2279 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
2280 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
2282 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
2283 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
2284 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
2286 #if (RTL8188E_SUPPORT==1)
2287 if (pDM_Odm->SupportICType == ODM_RTL8188E)
2289 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
2290 FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
2291 FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
2295 #if (RTL8192D_SUPPORT==1)
2296 if (pDM_Odm->SupportICType == ODM_RTL8192D)
2298 odm_GetCCKFalseAlarm_92D(pDM_Odm);
2304 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
2305 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
2307 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
2308 FalseAlmCnt->Cnt_Cck_fail = ret_value;
2309 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
2310 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
2312 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
2313 FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
2316 FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
2317 FalseAlmCnt->Cnt_SB_Search_fail +
2318 FalseAlmCnt->Cnt_Parity_Fail +
2319 FalseAlmCnt->Cnt_Rate_Illegal +
2320 FalseAlmCnt->Cnt_Crc8_fail +
2321 FalseAlmCnt->Cnt_Mcs_fail +
2322 FalseAlmCnt->Cnt_Cck_fail);
2324 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
2326 #if (RTL8192C_SUPPORT==1)
2327 if (pDM_Odm->SupportICType == ODM_RTL8192C)
2328 odm_ResetFACounter_92C(pDM_Odm);
2331 #if (RTL8192D_SUPPORT==1)
2332 if (pDM_Odm->SupportICType == ODM_RTL8192D)
2333 odm_ResetFACounter_92D(pDM_Odm);
2336 if (pDM_Odm->SupportICType >=ODM_RTL8723A)
2338 //reset false alarm counter registers
2339 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
2340 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
2341 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
2342 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
2343 //update ofdm counter
2344 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
2345 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
2347 //reset CCK CCA counter
2348 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
2349 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
2350 //reset CCK FA counter
2351 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
2352 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
2355 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
2356 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
2357 FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
2358 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
2359 FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
2360 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
2361 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
2363 else //FOR ODM_IC_11AC_SERIES
2365 //read OFDM FA counter
2366 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
2367 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
2368 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
2370 // reset OFDM FA coutner
2371 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
2372 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
2373 // reset CCK FA counter
2374 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
2375 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
2377 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
2378 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
2379 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
2382 //3============================================================
2383 //3 CCK Packet Detect Threshold
2384 //3============================================================
2387 odm_CCKPacketDetectionThresh(
2392 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2393 u1Byte CurCCK_CCAThres;
2394 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
2396 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
2397 //modify by Guo.Mingzhi 2011-12-29
2398 if (pDM_Odm->bDualMacSmartConcurrent == true)
2399 // if (pDM_Odm->bDualMacSmartConcurrent == false)
2401 #if (BT_30_SUPPORT == 1)
2402 if (pDM_Odm->bBtHsOperation)
2404 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
2405 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
2411 if (!(pDM_Odm->SupportAbility & (ODM_BB_CCK_PD|ODM_BB_FA_CNT)))
2414 if (pDM_Odm->ExtLNA)
2417 if (pDM_Odm->bLinked)
2419 if (pDM_Odm->RSSI_Min > 25)
2420 CurCCK_CCAThres = 0xcd;
2421 else if ((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
2422 CurCCK_CCAThres = 0x83;
2425 if (FalseAlmCnt->Cnt_Cck_fail > 1000)
2426 CurCCK_CCAThres = 0x83;
2428 CurCCK_CCAThres = 0x40;
2433 if (FalseAlmCnt->Cnt_Cck_fail > 1000)
2434 CurCCK_CCAThres = 0x83;
2436 CurCCK_CCAThres = 0x40;
2439 #if (RTL8192D_SUPPORT==1)
2440 if (pDM_Odm->SupportICType == ODM_RTL8192D)
2441 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
2444 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
2448 ODM_Write_CCK_CCA_Thres(
2450 u1Byte CurCCK_CCAThres
2453 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2455 if (pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
2457 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
2459 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
2460 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
2464 //3============================================================
2466 //3============================================================
2468 odm_DynamicBBPowerSavingInit(
2472 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
2474 pDM_PSTable->PreCCAState = CCA_MAX;
2475 pDM_PSTable->CurCCAState = CCA_MAX;
2476 pDM_PSTable->PreRFState = RF_MAX;
2477 pDM_PSTable->CurRFState = RF_MAX;
2478 pDM_PSTable->Rssi_val_min = 0;
2479 pDM_PSTable->initialize = 0;
2484 odm_DynamicBBPowerSaving(
2488 #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE))
2490 if ((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8723A))
2492 if (!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
2494 if (!(pDM_Odm->SupportPlatform & (ODM_MP|ODM_CE)))
2497 //1 2.Power Saving for 92C
2498 if ((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
2500 odm_1R_CCA(pDM_Odm);
2503 // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
2504 // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
2505 //1 3.Power Saving for 88C
2508 ODM_RF_Saving(pDM_Odm, false);
2510 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
2519 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
2521 if (pDM_Odm->RSSI_Min!= 0xFF)
2524 if (pDM_PSTable->PreCCAState == CCA_2R)
2526 if (pDM_Odm->RSSI_Min >= 35)
2527 pDM_PSTable->CurCCAState = CCA_1R;
2529 pDM_PSTable->CurCCAState = CCA_2R;
2533 if (pDM_Odm->RSSI_Min <= 30)
2534 pDM_PSTable->CurCCAState = CCA_2R;
2536 pDM_PSTable->CurCCAState = CCA_1R;
2540 pDM_PSTable->CurCCAState=CCA_MAX;
2543 if (pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
2545 if (pDM_PSTable->CurCCAState == CCA_1R)
2547 if ( pDM_Odm->RFType ==ODM_2T2R )
2549 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x13);
2550 //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
2554 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x23);
2555 //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
2560 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x33);
2561 //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
2563 pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
2565 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("CCAStage = %s\n",(pDM_PSTable->CurCCAState==0)?"1RCCA":"2RCCA"));
2571 u1Byte bForceInNormal
2574 #if (DM_ODM_SUPPORT_TYPE != ODM_AP)
2575 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
2576 u1Byte Rssi_Up_bound = 30 ;
2577 u1Byte Rssi_Low_bound = 25;
2578 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2579 if (pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
2581 Rssi_Up_bound = 50 ;
2582 Rssi_Low_bound = 45;
2585 if (pDM_PSTable->initialize == 0) {
2587 pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
2588 pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
2589 pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
2590 pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
2591 //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
2592 pDM_PSTable->initialize = 1;
2595 if (!bForceInNormal)
2597 if (pDM_Odm->RSSI_Min != 0xFF)
2599 if (pDM_PSTable->PreRFState == RF_Normal)
2601 if (pDM_Odm->RSSI_Min >= Rssi_Up_bound)
2602 pDM_PSTable->CurRFState = RF_Save;
2604 pDM_PSTable->CurRFState = RF_Normal;
2607 if (pDM_Odm->RSSI_Min <= Rssi_Low_bound)
2608 pDM_PSTable->CurRFState = RF_Normal;
2610 pDM_PSTable->CurRFState = RF_Save;
2614 pDM_PSTable->CurRFState=RF_MAX;
2618 pDM_PSTable->CurRFState = RF_Normal;
2621 if (pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
2623 if (pDM_PSTable->CurRFState == RF_Save)
2625 // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
2626 // Suggested by SD3 Yu-Nan. 2011.01.20.
2627 if (pDM_Odm->SupportICType == ODM_RTL8723A)
2629 ODM_SetBBReg(pDM_Odm, 0x874 , BIT5, 0x1); //Reg874[5]=1b'1
2631 ODM_SetBBReg(pDM_Odm, 0x874 , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
2632 ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
2633 ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
2634 ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
2635 ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
2636 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
2637 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
2638 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Save"));
2642 ODM_SetBBReg(pDM_Odm, 0x874 , 0x1CC000, pDM_PSTable->Reg874);
2643 ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70);
2644 ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
2645 ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74);
2646 ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);
2648 if (pDM_Odm->SupportICType == ODM_RTL8723A)
2650 ODM_SetBBReg(pDM_Odm,0x874 , BIT5, 0x0); //Reg874[5]=1b'0
2652 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Normal"));
2654 pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
2660 //3============================================================
2662 //3============================================================
2663 //3============================================================
2665 //3============================================================
2668 odm_RateAdaptiveMaskInit(
2672 PODM_RATE_ADAPTIVE pOdmRA = &pDM_Odm->RateAdaptive;
2674 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
2675 PMGNT_INFO pMgntInfo = &pDM_Odm->Adapter->MgntInfo;
2676 PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pMgntInfo->RateAdaptive;
2678 pRA->RATRState = DM_RATR_STA_INIT;
2679 if (pMgntInfo->DM_Type == DM_Type_ByDriver)
2680 pMgntInfo->bUseRAMask = true;
2682 pMgntInfo->bUseRAMask = false;
2684 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
2685 pOdmRA->Type = DM_Type_ByDriver;
2686 if (pOdmRA->Type == DM_Type_ByDriver)
2687 pDM_Odm->bUseRAMask = true;
2689 pDM_Odm->bUseRAMask = false;
2693 pOdmRA->RATRState = DM_RATR_STA_INIT;
2694 pOdmRA->HighRSSIThresh = 50;
2695 pOdmRA->LowRSSIThresh = 20;
2698 #if (DM_ODM_SUPPORT_TYPE & ODM_MP)
2700 ODM_RateAdaptiveStateApInit(
2705 PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pEntry->RateAdaptive;
2706 pRA->RATRState = DM_RATR_STA_INIT;
2710 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2711 u4Byte ODM_Get_Rate_Bitmap(
2718 u4Byte rate_bitmap = 0x0fffffff;
2719 u1Byte WirelessMode;
2720 //u1Byte WirelessMode =*(pDM_Odm->pWirelessMode);
2723 pEntry = pDM_Odm->pODM_StaInfo[macid];
2724 if (!IS_STA_VALID(pEntry))
2727 WirelessMode = pEntry->wireless_mode;
2729 switch (WirelessMode)
2732 if (ra_mask & 0x0000000c) //11M or 5.5M enable
2733 rate_bitmap = 0x0000000d;
2735 rate_bitmap = 0x0000000f;
2738 case (ODM_WM_A|ODM_WM_G):
2739 if (rssi_level == DM_RATR_STA_HIGH)
2740 rate_bitmap = 0x00000f00;
2742 rate_bitmap = 0x00000ff0;
2745 case (ODM_WM_B|ODM_WM_G):
2746 if (rssi_level == DM_RATR_STA_HIGH)
2747 rate_bitmap = 0x00000f00;
2748 else if (rssi_level == DM_RATR_STA_MIDDLE)
2749 rate_bitmap = 0x00000ff0;
2751 rate_bitmap = 0x00000ff5;
2754 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G) :
2755 case (ODM_WM_A|ODM_WM_B|ODM_WM_G|ODM_WM_N24G) :
2757 if ( pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)
2759 if (rssi_level == DM_RATR_STA_HIGH)
2761 rate_bitmap = 0x000f0000;
2763 else if (rssi_level == DM_RATR_STA_MIDDLE)
2765 rate_bitmap = 0x000ff000;
2768 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
2769 rate_bitmap = 0x000ff015;
2771 rate_bitmap = 0x000ff005;
2776 if (rssi_level == DM_RATR_STA_HIGH)
2778 rate_bitmap = 0x0f8f0000;
2780 else if (rssi_level == DM_RATR_STA_MIDDLE)
2782 rate_bitmap = 0x0f8ff000;
2786 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
2787 rate_bitmap = 0x0f8ff015;
2789 rate_bitmap = 0x0f8ff005;
2795 //case WIRELESS_11_24N:
2796 //case WIRELESS_11_5N:
2797 if (pDM_Odm->RFType == RF_1T2R)
2798 rate_bitmap = 0x000fffff;
2800 rate_bitmap = 0x0fffffff;
2805 //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n",__func__,rssi_level,WirelessMode,rate_bitmap);
2806 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));
2813 /*-----------------------------------------------------------------------------
2814 * Function: odm_RefreshRateAdaptiveMask()
2816 * Overview: Update rate table mask according to rssi
2826 * 05/27/2009 hpfan Create Version 0.
2828 *---------------------------------------------------------------------------*/
2830 odm_RefreshRateAdaptiveMask(
2834 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
2837 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
2838 // at the same time. In the stage2/3, we need to prive universal interface and merge all
2839 // HW dynamic mechanism.
2841 switch (pDM_Odm->SupportPlatform)
2844 odm_RefreshRateAdaptiveMaskMP(pDM_Odm);
2848 odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
2853 odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);
2860 odm_RefreshRateAdaptiveMaskMP(
2864 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
2865 PADAPTER pAdapter = pDM_Odm->Adapter;
2866 PADAPTER pTargetAdapter = NULL;
2867 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2868 PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(pAdapter);
2869 //PRATE_ADAPTIVE pRA = (PRATE_ADAPTIVE)&pMgntInfo->RateAdaptive;
2870 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
2872 if (pAdapter->bDriverStopped)
2874 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
2878 if (!pMgntInfo->bUseRAMask)
2880 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
2884 // if default port is connected, update RA table for default port (infrastructure mode only)
2885 if (pAdapter->MgntInfo.mAssoc && (!ACTING_AS_AP(pAdapter)))
2887 if ( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pRA->RATRState) )
2889 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);
2890 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pRA->RATRState));
2891 pAdapter->HalFunc.UpdateHalRAMaskHandler(
2903 // The following part configure AP/VWifi/IBSS rate adaptive mask.
2906 if (pMgntInfo->mIbss)
2908 // Target: AP/IBSS peer.
2909 pTargetAdapter = GetDefaultAdapter(pAdapter);
2913 pTargetAdapter = GetFirstAPAdapter(pAdapter);
2916 // if extension port (softap) is started, updaet RA table for more than one clients associate
2917 if (pTargetAdapter != NULL)
2920 PRT_WLAN_STA pEntry;
2921 PRATE_ADAPTIVE pEntryRA;
2923 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
2925 pEntry = AsocEntry_EnumStation(pTargetAdapter, i);
2928 if (pEntry->bAssociated)
2930 pEntryRA = &pEntry->RateAdaptive;
2931 if ( ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntryRA->RATRState) )
2933 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);
2934 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntryRA->RATRState));
2935 pAdapter->HalFunc.UpdateHalRAMaskHandler(
2941 pEntryRA->RATRState,
2949 if (pMgntInfo->bSetTXPowerTrainingByOid)
2950 pMgntInfo->bSetTXPowerTrainingByOid = false;
2951 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
2956 odm_RefreshRateAdaptiveMaskCE(
2960 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2962 PADAPTER pAdapter = pDM_Odm->Adapter;
2964 if (pAdapter->bDriverStopped)
2966 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
2970 if (!pDM_Odm->bUseRAMask)
2972 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
2976 //printk("==> %s\n",__func__);
2978 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
2979 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
2980 if (IS_STA_VALID(pstat) ) {
2981 if ( true == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false , &pstat->rssi_level) )
2983 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));
2984 //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);
2985 rtw_hal_update_ra_mask(pAdapter,i,pstat->rssi_level);
2995 odm_RefreshRateAdaptiveMaskAPADSL(
2999 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
3000 struct rtl8192cd_priv *priv = pDM_Odm->priv;
3001 struct stat_info *pstat;
3003 if (!priv->pmib->dot11StationConfigEntry.autoRate)
3006 if (list_empty(&priv->asoc_list))
3009 list_for_each_entry(pstat, &priv->asoc_list, asoc_list) {
3010 if (ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, false, &pstat->rssi_level) ) {
3011 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);
3012 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));
3014 add_update_RATid(priv, pstat);
3020 // Return Value: bool
3021 // - true: RATRState is changed.
3030 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
3031 const u1Byte GoUpGap = 5;
3032 u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;
3033 u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;
3036 // Threshold Adjustment:
3037 // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.
3038 // Here GoUpGap is added to solve the boundary's level alternation issue.
3039 switch (*pRATRState)
3041 case DM_RATR_STA_INIT:
3042 case DM_RATR_STA_HIGH:
3045 case DM_RATR_STA_MIDDLE:
3046 HighRSSIThreshForRA += GoUpGap;
3049 case DM_RATR_STA_LOW:
3050 HighRSSIThreshForRA += GoUpGap;
3051 LowRSSIThreshForRA += GoUpGap;
3055 ODM_RT_ASSERT(pDM_Odm, false, ("wrong rssi level setting %d !", *pRATRState) );
3059 // Decide RATRState by RSSI.
3060 if (RSSI > HighRSSIThreshForRA)
3061 RATRState = DM_RATR_STA_HIGH;
3062 else if (RSSI > LowRSSIThreshForRA)
3063 RATRState = DM_RATR_STA_MIDDLE;
3065 RATRState = DM_RATR_STA_LOW;
3066 //printk("==>%s,RATRState:0x%02x ,RSSI:%d\n",__func__,RATRState,RSSI);
3068 if ( *pRATRState!=RATRState || bForceUpdate)
3070 ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );
3071 *pRATRState = RATRState;
3079 //============================================================
3081 //3============================================================
3082 //3 Dynamic Tx Power
3083 //3============================================================
3086 odm_DynamicTxPowerInit(
3090 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3091 PADAPTER Adapter = pDM_Odm->Adapter;
3092 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
3093 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3095 #if DEV_BUS_TYPE==RT_USB_INTERFACE
3096 if (RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
3098 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
3099 pMgntInfo->bDynamicTxPowerEnable = true;
3103 //so 92c pci do not need dynamic tx power? vivi check it later
3104 if (IS_HARDWARE_TYPE_8192D(Adapter))
3105 pMgntInfo->bDynamicTxPowerEnable = true;
3107 pMgntInfo->bDynamicTxPowerEnable = false;
3111 pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
3112 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3113 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3114 PADAPTER Adapter = pDM_Odm->Adapter;
3115 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3116 struct dm_priv *pdmpriv = &pHalData->dmpriv;
3117 pdmpriv->bDynamicTxPowerEnable = false;
3119 #if (RTL8192C_SUPPORT==1)
3121 #ifdef CONFIG_INTEL_PROXIM
3122 if ((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==true))
3124 if (pHalData->BoardType == BOARD_USB_High_PA)
3128 //odm_SavePowerIndex(Adapter);
3129 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
3130 pdmpriv->bDynamicTxPowerEnable = true;
3135 pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
3136 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3143 odm_DynamicTxPowerSavePowerIndex(
3148 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
3150 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3151 PADAPTER Adapter = pDM_Odm->Adapter;
3152 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3153 for (index = 0; index< 6; index++)
3154 pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
3155 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3156 PADAPTER Adapter = pDM_Odm->Adapter;
3157 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3158 struct dm_priv *pdmpriv = &pHalData->dmpriv;
3159 for (index = 0; index< 6; index++)
3160 pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
3165 odm_DynamicTxPowerRestorePowerIndex(
3170 PADAPTER Adapter = pDM_Odm->Adapter;
3172 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_MP))
3173 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3174 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
3175 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3176 for (index = 0; index< 6; index++)
3177 PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
3178 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3179 struct dm_priv *pdmpriv = &pHalData->dmpriv;
3180 for (index = 0; index< 6; index++)
3181 rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
3187 odm_DynamicTxPowerWritePowerIndex(
3193 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
3195 for (index = 0; index< 6; index++)
3196 //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
3197 ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
3208 // For AP/ADSL use prtl8192cd_priv
3209 // For CE/NIC use PADAPTER
3211 //PADAPTER pAdapter = pDM_Odm->Adapter;
3212 // prtl8192cd_priv priv = pDM_Odm->priv;
3214 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
3217 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
3218 if (pDM_Odm->ExtPA == false)
3223 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
3224 // at the same time. In the stage2/3, we need to prive universal interface and merge all
3225 // HW dynamic mechanism.
3227 switch (pDM_Odm->SupportPlatform)
3231 odm_DynamicTxPowerNIC(pDM_Odm);
3234 odm_DynamicTxPowerAP(pDM_Odm);
3238 //odm_DIGAP(pDM_Odm);
3247 odm_DynamicTxPowerNIC(
3251 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
3254 #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE))
3256 if (pDM_Odm->SupportICType == ODM_RTL8192C)
3258 odm_DynamicTxPower_92C(pDM_Odm);
3260 else if (pDM_Odm->SupportICType == ODM_RTL8192D)
3262 odm_DynamicTxPower_92D(pDM_Odm);
3264 else if (pDM_Odm->SupportICType & ODM_RTL8188E)
3268 else if (pDM_Odm->SupportICType == ODM_RTL8188E)
3271 // This part need to be redefined.
3277 odm_DynamicTxPowerAP(
3282 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
3283 prtl8192cd_priv priv = pDM_Odm->priv;
3286 if (!priv->pshare->rf_ft_var.tx_pwr_ctrl)
3289 #ifdef HIGH_POWER_EXT_PA
3291 tx_power_control(priv);
3295 * Check if station is near by to use lower tx power
3298 if ((priv->up_time % 3) == 0 ) {
3299 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
3300 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
3301 if (IS_STA_VALID(pstat) ) {
3302 if ((pstat->hp_level == 0) && (pstat->rssi > TX_POWER_NEAR_FIELD_THRESH_AP+4))
3303 pstat->hp_level = 1;
3304 else if ((pstat->hp_level == 1) && (pstat->rssi < TX_POWER_NEAR_FIELD_THRESH_AP))
3305 pstat->hp_level = 0;
3315 odm_DynamicTxPower_92C(
3319 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3320 PADAPTER Adapter = pDM_Odm->Adapter;
3321 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
3322 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3323 s4Byte UndecoratedSmoothedPWDB;
3326 // STA not connected and AP not connected
3327 if ((!pMgntInfo->bMediaConnect) &&
3328 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
3330 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any\n"));
3331 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3333 //the LastDTPlvl should reset when disconnect,
3334 //otherwise the tx power level wouldn't change when disconnect and connect again.
3335 // Maddest 20091220.
3336 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
3340 #if (INTEL_PROXIMITY_SUPPORT == 1)
3341 // Intel set fixed tx power
3342 if (pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
3344 switch (pMgntInfo->IntelProximityModeInfo.PowerOutput) {
3346 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
3347 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
3350 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
3351 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
3354 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
3355 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
3358 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
3359 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
3362 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
3363 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
3366 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
3367 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
3374 if ( (pMgntInfo->bDynamicTxPowerEnable != true) ||
3375 (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
3376 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
3378 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3382 if (pMgntInfo->bMediaConnect) // Default port
3384 if (ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
3386 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
3387 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3391 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
3392 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3395 else // associated entry pwdb
3397 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
3398 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3401 if (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
3403 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
3404 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
3406 else if ((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
3407 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
3409 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3410 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
3412 else if (UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
3414 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3415 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
3419 if ( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
3421 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d\n" , pHalData->CurrentChannel));
3422 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3423 if ( (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
3424 (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
3425 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
3426 else if (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
3427 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
3428 else if (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
3429 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
3431 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
3434 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3436 #if (RTL8192C_SUPPORT==1)
3437 PADAPTER Adapter = pDM_Odm->Adapter;
3438 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3439 struct dm_priv *pdmpriv = &pHalData->dmpriv;
3440 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
3441 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
3442 int UndecoratedSmoothedPWDB;
3444 if (!pdmpriv->bDynamicTxPowerEnable)
3447 #ifdef CONFIG_INTEL_PROXIM
3448 if (Adapter->proximity.proxim_on== true) {
3449 struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
3450 // Intel set fixed tx power
3451 printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d\n",__func__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
3452 if (prox_priv!=NULL) {
3453 if (prox_priv->proxim_modeinfo->power_output> 0)
3455 switch (prox_priv->proxim_modeinfo->power_output)
3458 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
3459 printk("TxHighPwrLevel_100\n");
3462 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
3463 printk("TxHighPwrLevel_70\n");
3466 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
3467 printk("TxHighPwrLevel_50\n");
3470 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
3471 printk("TxHighPwrLevel_35\n");
3474 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
3475 printk("TxHighPwrLevel_15\n");
3478 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
3479 printk("TxHighPwrLevel_100\n");
3488 // STA not connected and AP not connected
3489 if ((check_fwstate(pmlmepriv, _FW_LINKED) != true) &&
3490 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
3492 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any\n"));
3493 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3495 //the LastDTPlvl should reset when disconnect,
3496 //otherwise the tx power level wouldn't change when disconnect and connect again.
3497 // Maddest 20091220.
3498 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
3502 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) // Default port
3504 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
3506 else // associated entry pwdb
3508 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
3509 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3512 if (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
3514 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
3515 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
3517 else if ((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
3518 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
3520 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3521 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
3523 else if (UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
3525 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3526 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
3529 if ( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
3531 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3532 if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
3533 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
3534 else if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
3535 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
3536 else if (pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
3537 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
3539 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
3541 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3547 odm_DynamicTxPower_92D(
3551 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3552 PADAPTER Adapter = pDM_Odm->Adapter;
3553 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
3554 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3555 s4Byte UndecoratedSmoothedPWDB;
3557 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
3558 bool bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
3559 u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
3562 // If dynamic high power is disabled.
3563 if ( (pMgntInfo->bDynamicTxPowerEnable != true) ||
3564 (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
3565 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
3567 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3571 // STA not connected and AP not connected
3572 if ((!pMgntInfo->bMediaConnect) &&
3573 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
3575 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any\n"));
3576 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3578 //the LastDTPlvl should reset when disconnect,
3579 //otherwise the tx power level wouldn't change when disconnect and connect again.
3580 // Maddest 20091220.
3581 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
3585 if (pMgntInfo->bMediaConnect) // Default port
3587 if (ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
3589 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
3590 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3594 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
3595 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3598 else // associated entry pwdb
3600 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
3601 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3604 if (IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType92D == 1) {
3605 if (UndecoratedSmoothedPWDB >= 0x33)
3607 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
3608 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
3610 else if ((UndecoratedSmoothedPWDB <0x33) &&
3611 (UndecoratedSmoothedPWDB >= 0x2b) )
3613 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3614 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
3616 else if (UndecoratedSmoothedPWDB < 0x2b)
3618 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3619 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
3626 if (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
3628 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3629 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
3631 else if ((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
3632 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
3634 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3635 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
3637 else if (UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
3639 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3640 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
3645 //sherry delete flag 20110517
3646 if (bGetValueFromBuddyAdapter)
3648 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1\n"));
3649 if (Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
3651 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value\n"));
3652 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
3653 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
3654 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3655 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
3656 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = false;
3660 if ( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
3662 ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d\n" , pHalData->CurrentChannel));
3663 if (Adapter->DualMacSmartConcurrent == true)
3665 if (BuddyAdapter == NULL)
3667 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case\n"));
3668 if (!Adapter->bSlaveOfDMSP)
3670 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3675 if (pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
3677 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP\n"));
3678 if (Adapter->bSlaveOfDMSP)
3680 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
3681 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = true;
3682 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
3686 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
3687 if (!bGetValueFromBuddyAdapter)
3689 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0\n"));
3690 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3696 ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
3697 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3703 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
3707 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
3708 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
3709 #if (RTL8192D_SUPPORT==1)
3710 PADAPTER Adapter = pDM_Odm->Adapter;
3711 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3712 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
3714 struct dm_priv *pdmpriv = &pHalData->dmpriv;
3715 DM_ODM_T *podmpriv = &pHalData->odmpriv;
3716 int UndecoratedSmoothedPWDB;
3717 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
3718 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
3719 bool bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
3720 u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
3723 // If dynamic high power is disabled.
3724 if ( (pdmpriv->bDynamicTxPowerEnable != true) ||
3725 (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
3727 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3731 // STA not connected and AP not connected
3732 if ((check_fwstate(pmlmepriv, _FW_LINKED) != true) &&
3733 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
3735 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any\n"));
3736 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3737 //the LastDTPlvl should reset when disconnect,
3738 //otherwise the tx power level wouldn't change when disconnect and connect again.
3739 // Maddest 20091220.
3740 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
3744 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) // Default port
3746 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
3748 else // associated entry pwdb
3750 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
3751 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x\n", UndecoratedSmoothedPWDB));
3753 #if TX_POWER_FOR_5G_BAND == 1
3754 if (pHalData->CurrentBandType92D == BAND_ON_5G) {
3755 if (UndecoratedSmoothedPWDB >= 0x33)
3757 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
3758 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
3760 else if ((UndecoratedSmoothedPWDB <0x33) &&
3761 (UndecoratedSmoothedPWDB >= 0x2b) )
3763 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3764 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
3766 else if (UndecoratedSmoothedPWDB < 0x2b)
3768 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3769 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
3775 if (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
3777 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
3778 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
3780 else if ((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
3781 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
3783 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
3784 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
3786 else if (UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
3788 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
3789 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
3792 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
3793 if (bGetValueFromBuddyAdapter)
3795 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1\n"));
3796 if (Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
3798 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value\n"));
3799 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
3800 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
3801 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
3802 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
3803 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = false;
3808 if ( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
3810 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d\n" , pHalData->CurrentChannel));
3811 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
3812 if (BuddyAdapter == NULL)
3814 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case\n"));
3815 if (!Adapter->bSlaveOfDMSP)
3817 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
3822 if (pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
3824 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP\n"));
3825 if (Adapter->bSlaveOfDMSP)
3827 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
3828 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = true;
3829 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
3833 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
3834 if (!bGetValueFromBuddyAdapter)
3836 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0\n"));
3837 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
3843 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
3844 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
3848 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
3851 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
3853 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3858 //3============================================================
3860 //3============================================================
3863 odm_RSSIMonitorInit(
3870 odm_RSSIMonitorCheck(
3875 // For AP/ADSL use prtl8192cd_priv
3876 // For CE/NIC use PADAPTER
3878 PADAPTER pAdapter = pDM_Odm->Adapter;
3879 prtl8192cd_priv priv = pDM_Odm->priv;
3881 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
3885 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
3886 // at the same time. In the stage2/3, we need to prive universal interface and merge all
3887 // HW dynamic mechanism.
3889 switch (pDM_Odm->SupportPlatform)
3892 odm_RSSIMonitorCheckMP(pDM_Odm);
3896 odm_RSSIMonitorCheckCE(pDM_Odm);
3900 odm_RSSIMonitorCheckAP(pDM_Odm);
3904 //odm_DIGAP(pDM_Odm);
3908 } // odm_RSSIMonitorCheck
3912 odm_RSSIMonitorCheckMP(
3916 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3917 PADAPTER Adapter = pDM_Odm->Adapter;
3918 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3919 PRT_WLAN_STA pEntry;
3921 s4Byte tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
3923 RTPRINT(FDM, DM_PWDB, ("pHalData->UndecoratedSmoothedPWDB = 0x%x( %d)\n",
3924 pHalData->UndecoratedSmoothedPWDB,
3925 pHalData->UndecoratedSmoothedPWDB));
3927 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
3929 if (IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
3931 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
3935 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
3940 if (pEntry->bAssociated)
3942 RTPRINT_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);
3943 RTPRINT(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n",
3944 pEntry->rssi_stat.UndecoratedSmoothedPWDB,
3945 pEntry->rssi_stat.UndecoratedSmoothedPWDB));
3946 if (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
3947 tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
3948 if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
3949 tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;
3958 if (tmpEntryMaxPWDB != 0) // If associated entry is found
3960 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
3961 RTPRINT(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",
3962 tmpEntryMaxPWDB, tmpEntryMaxPWDB));
3966 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;
3968 if (tmpEntryMinPWDB != 0xff) // If associated entry is found
3970 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
3971 RTPRINT(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n",
3972 tmpEntryMinPWDB, tmpEntryMinPWDB));
3976 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;
3979 // Indicate Rx signal strength to FW.
3980 if (Adapter->MgntInfo.bUseRAMask)
3982 u1Byte H2C_Parameter[3] ={0};
3983 // DbgPrint("RxSS: %lx =%ld\n", pHalData->UndecoratedSmoothedPWDB, pHalData->UndecoratedSmoothedPWDB);
3984 H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);
3985 H2C_Parameter[1] = 0x20; // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1
3987 ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);
3991 PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);
3992 //DbgPrint("0x4fe write %x %d\n", pHalData->UndecoratedSmoothedPWDB, pHalData->UndecoratedSmoothedPWDB);
3994 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
3997 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
3999 //sherry move from DUSC to here 20110517
4002 FindMinimumRSSI_Dmsp(
4013 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
4014 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4015 struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv;
4017 //1 1.Determine the minimum RSSI
4020 #ifdef CONFIG_CONCURRENT_MODE
4021 // FindMinimumRSSI() per-adapter
4022 if (rtw_buddy_adapter_up(pAdapter)) {
4023 PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter;
4024 PHAL_DATA_TYPE pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter);
4025 struct dm_priv *pbuddy_dmpriv = &pbuddy_HalData->dmpriv;
4027 if ((pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) &&
4028 (pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB != 0))
4031 if (pdmpriv->EntryMinUndecoratedSmoothedPWDB > pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB)
4032 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;
4036 if (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)
4037 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;
4043 if ((check_fwstate(pmlmepriv, _FW_LINKED) == false) &&
4044 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
4045 pdmpriv->MinUndecoratedPWDBForDM = 0;
4046 if (check_fwstate(pmlmepriv, _FW_LINKED) == true) // Default port
4048 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
4050 else // associated entry pwdb
4052 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
4053 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port or disconnet PWDB = 0x%x\n", pHalData->MinUndecoratedPWDBForDM));
4055 #if (RTL8192D_SUPPORT==1)
4056 FindMinimumRSSI_Dmsp(pAdapter);
4062 odm_RSSIMonitorCheckCE(
4066 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
4067 PADAPTER Adapter = pDM_Odm->Adapter;
4068 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4069 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4071 int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
4073 u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
4075 if (!check_fwstate(&Adapter->mlmepriv, _FW_LINKED)
4076 #ifdef CONFIG_CONCURRENT_MODE
4077 && !check_buddy_fwstate(Adapter, _FW_LINKED)
4083 //if (check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == true)
4086 struct sta_info *psta;
4087 struct sta_priv *pstapriv = &Adapter->stapriv;
4088 u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
4090 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
4091 if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i])
4092 && (psta->state & WIFI_ASOC_STATE)
4093 && _rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) == false
4094 && _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN) == false
4095 #ifdef CONFIG_CONCURRENT_MODE
4096 && (!Adapter->pbuddy_adapter || _rtw_memcmp(psta->hwaddr, myid(&Adapter->pbuddy_adapter->eeprompriv), ETH_ALEN) == false)
4099 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
4100 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
4102 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
4103 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
4105 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
4106 #if (RTL8192D_SUPPORT==1)
4107 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
4109 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
4116 _list *plist, *phead;
4117 struct sta_info *psta;
4118 struct sta_priv *pstapriv = &Adapter->stapriv;
4119 u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
4121 _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
4123 for (i=0; i< NUM_STA; i++)
4125 phead = &(pstapriv->sta_hash[i]);
4126 plist = get_next(phead);
4128 while ((rtw_end_of_queue_search(phead, plist)) == false)
4130 psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
4132 plist = get_next(plist);
4134 if (_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) ||
4135 _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
4138 if (psta->state & WIFI_ASOC_STATE)
4141 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
4142 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
4144 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
4145 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
4147 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
4148 //printk("%s==> mac_id(%d),rssi(%d)\n",__func__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);
4149 #if (RTL8192D_SUPPORT==1)
4150 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
4152 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
4161 _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
4164 //printk("%s==> sta_cnt(%d)\n",__func__,sta_cnt);
4166 for (i=0; i< sta_cnt; i++)
4168 if (PWDB_rssi[i] != (0)) {
4169 if (pHalData->fw_ractrl == true)// Report every sta's RSSI to FW
4171 #if (RTL8192D_SUPPORT==1)
4172 FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));
4173 #elif ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
4174 rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
4178 #if ((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))
4179 ODM_RA_SetRSSI_8188E(
4180 &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));
4187 if (tmpEntryMaxPWDB != 0) // If associated entry is found
4189 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
4193 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
4196 if (tmpEntryMinPWDB != 0xff) // If associated entry is found
4198 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
4202 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
4205 FindMinimumRSSI(Adapter);
4206 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
4207 #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)
4210 odm_RSSIMonitorCheckAP(
4214 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
4219 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
4221 pstat = pDM_Odm->pODM_StaInfo[i];
4222 if (IS_STA_VALID(pstat) )
4225 if (REMAP_AID(pstat) < (FW_NUM_STAT - 1))
4227 add_update_rssi(pDM_Odm->priv, pstat);
4240 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
4241 (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
4243 #if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
4244 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
4245 #if (RTL8188E_SUPPORT == 1)
4246 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer,
4247 (RT_TIMER_CALL_BACK)odm_FastAntTrainingCallback, NULL, "FastAntTrainingTimer");
4252 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4253 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer,
4254 (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");
4257 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
4259 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer,
4260 (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");
4262 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer,
4263 (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");
4265 ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,
4266 (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer");
4271 ODM_CancelAllTimers(
4275 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4277 // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in
4280 HAL_ADAPTER_STS_CHK(pDM_Odm)
4283 ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
4285 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4287 #if (RTL8188E_SUPPORT == 1)
4288 ODM_CancelTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
4290 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
4293 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
4295 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
4297 ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
4299 ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
4305 ODM_ReleaseAllTimers(
4309 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
4311 #if (RTL8188E_SUPPORT == 1)
4312 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
4315 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4317 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);
4320 //Neil Chen--2011--06--16-- / 2012/02/23 MH Revise Arch.
4322 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);
4324 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);
4326 ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);
4333 //3============================================================
4334 //3 Tx Power Tracking
4335 //3============================================================
4338 odm_TXPowerTrackingInit(
4342 odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
4347 odm_TXPowerTrackingThermalMeterInit(
4351 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4352 PADAPTER Adapter = pDM_Odm->Adapter;
4353 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
4354 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4356 pMgntInfo->bTXPowerTracking = true;
4357 pHalData->TXPowercount = 0;
4358 pHalData->bTXPowerTrackingInit = false;
4359 #if MP_DRIVER != 1 //for mp driver, turn off txpwrtracking as default
4360 pHalData->TxPowerTrackControl = true;
4361 #endif//#if (MP_DRIVER != 1)
4362 ODM_RT_TRACE(pDM_Odm,COMP_POWER_TRACKING, DBG_LOUD, ("pMgntInfo->bTXPowerTracking = %d\n", pMgntInfo->bTXPowerTracking));
4363 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
4365 PADAPTER Adapter = pDM_Odm->Adapter;
4366 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4367 struct dm_priv *pdmpriv = &pHalData->dmpriv;
4369 pdmpriv->bTXPowerTracking = true;
4370 pdmpriv->TXPowercount = 0;
4371 pdmpriv->bTXPowerTrackingInit = false;
4373 if (*(pDM_Odm->mp_mode) != 1)
4374 pdmpriv->TxPowerTrackControl = true;
4375 MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
4378 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
4379 #ifdef RTL8188E_SUPPORT
4381 pDM_Odm->RFCalibrateInfo.bTXPowerTracking = true;
4382 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
4383 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = false;
4384 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true;
4389 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true;
4394 ODM_TXPowerTrackingCheck(
4399 // For AP/ADSL use prtl8192cd_priv
4400 // For CE/NIC use PADAPTER
4402 PADAPTER pAdapter = pDM_Odm->Adapter;
4403 prtl8192cd_priv priv = pDM_Odm->priv;
4405 //if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
4409 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
4410 // at the same time. In the stage2/3, we need to prive universal interface and merge all
4411 // HW dynamic mechanism.
4413 switch (pDM_Odm->SupportPlatform)
4416 odm_TXPowerTrackingCheckMP(pDM_Odm);
4420 odm_TXPowerTrackingCheckCE(pDM_Odm);
4424 odm_TXPowerTrackingCheckAP(pDM_Odm);
4428 //odm_DIGAP(pDM_Odm);
4435 odm_TXPowerTrackingCheckCE(
4439 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
4440 PADAPTER Adapter = pDM_Odm->Adapter;
4441 #if ( (RTL8192C_SUPPORT==1) || (RTL8723A_SUPPORT==1) )
4442 rtl8192c_odm_CheckTXPowerTracking(Adapter);
4445 #if (RTL8192D_SUPPORT==1)
4446 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
4447 if (!Adapter->bSlaveOfDMSP)
4449 rtl8192d_odm_CheckTXPowerTracking(Adapter);
4451 #if (RTL8188E_SUPPORT==1)
4453 //if (!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/)
4454 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
4459 if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) //at least delay 1 sec
4461 //pHalData->TxPowerCheckCnt++; //cosa add for debug
4462 //ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
4463 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
4464 //DBG_8192C("Trigger 92C Thermal Meter!!\n");
4466 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
4472 //DBG_8192C("Schedule TxPowerTracking direct call!!\n");
4473 odm_TXPowerTrackingCallback_ThermalMeter_8188E(Adapter);
4474 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
4482 odm_TXPowerTrackingCheckMP(
4486 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4487 PADAPTER Adapter = pDM_Odm->Adapter;
4489 if (ODM_CheckPowerStatus(Adapter) == false)
4492 if (IS_HARDWARE_TYPE_8723A(Adapter))
4495 if (!Adapter->bSlaveOfDMSP || Adapter->DualMacSmartConcurrent == false)
4496 odm_TXPowerTrackingThermalMeterCheck(Adapter);
4503 odm_TXPowerTrackingCheckAP(
4507 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
4508 prtl8192cd_priv priv = pDM_Odm->priv;
4514 //antenna mapping info
4515 // 1: right-side antenna
4516 // 2/0: left-side antenna
4517 //PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt: for right-side antenna: Ant:1 RxDefaultAnt1
4518 //PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt: for left-side antenna: Ant:0 RxDefaultAnt2
4519 // We select left antenna as default antenna in initial process, modify it as needed
4522 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
4525 odm_TXPowerTrackingThermalMeterCheck(
4529 #ifndef AP_BUILD_WORKAROUND
4530 #if (HAL_CODE_BASE==RTL8192_C)
4531 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
4532 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4533 static u1Byte TM_Trigger = 0;
4534 //u1Byte TxPowerCheckCnt = 5; //10 sec
4536 if (!pMgntInfo->bTXPowerTracking /*|| (!pHalData->TxPowerTrackControl && pHalData->bAPKdone)*/)
4541 if (!TM_Trigger) //at least delay 1 sec
4543 if (IS_HARDWARE_TYPE_8192D(Adapter))
4544 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER_92D, BIT17 | BIT16, 0x03);
4545 else if (IS_HARDWARE_TYPE_8188E(Adapter))
4546 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
4548 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
4549 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Trigger 92C Thermal Meter!!\n"));
4556 RT_TRACE(COMP_POWER_TRACKING, DBG_LOUD,("Schedule TxPowerTracking direct call!!\n"));
4557 odm_TXPowerTrackingDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
4568 //3============================================================
4569 //3 SW Antenna Diversity
4570 //3============================================================
4571 #if (defined(CONFIG_SW_ANTENNA_DIVERSITY))
4577 #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE))
4578 odm_SwAntDivInit_NIC(pDM_Odm);
4579 #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
4580 dm_SW_AntennaSwitchInit(pDM_Odm->priv);
4583 #if (RTL8723A_SUPPORT==1)
4584 // Only for 8723A SW ANT DIV INIT--2012--07--17
4586 odm_SwAntDivInit_NIC_8723A(
4589 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4590 PADAPTER Adapter = pDM_Odm->Adapter;
4591 u1Byte btAntNum=BT_GetPGAntNum(Adapter);
4594 if (IS_HARDWARE_TYPE_8723A(Adapter))
4596 pDM_SWAT_Table->ANTA_ON =true;
4598 // Set default antenna B status by PG
4599 if (btAntNum == Ant_x2)
4600 pDM_SWAT_Table->ANTB_ON = true;
4601 else if (btAntNum ==Ant_x1)
4602 pDM_SWAT_Table->ANTB_ON = false;
4604 pDM_SWAT_Table->ANTB_ON = true;
4610 odm_SwAntDivInit_NIC(
4614 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4615 // Init SW ANT DIV mechanism for 8723AE/AU/AS// Neil Chen--2012--07--17---
4616 // CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
4617 //#if (DM_ODM_SUPPORT_TYPE==ODM_MP)
4618 #if (RTL8723A_SUPPORT==1)
4619 if (pDM_Odm->SupportICType == ODM_RTL8723A)
4621 odm_SwAntDivInit_NIC_8723A(pDM_Odm);
4624 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
4625 pDM_SWAT_Table->RSSI_sum_A = 0;
4626 pDM_SWAT_Table->RSSI_cnt_A = 0;
4627 pDM_SWAT_Table->RSSI_sum_B = 0;
4628 pDM_SWAT_Table->RSSI_cnt_B = 0;
4629 pDM_SWAT_Table->CurAntenna = Antenna_A;
4630 pDM_SWAT_Table->PreAntenna = Antenna_A;
4631 pDM_SWAT_Table->try_flag = 0xff;
4632 pDM_SWAT_Table->PreRSSI = 0;
4633 pDM_SWAT_Table->SWAS_NoLink_State = 0;
4634 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
4635 pDM_SWAT_Table->SelectAntennaMap=0xAA;
4636 pDM_SWAT_Table->lastTxOkCnt = 0;
4637 pDM_SWAT_Table->lastRxOkCnt = 0;
4638 pDM_SWAT_Table->TXByteCnt_A = 0;
4639 pDM_SWAT_Table->TXByteCnt_B = 0;
4640 pDM_SWAT_Table->RXByteCnt_A = 0;
4641 pDM_SWAT_Table->RXByteCnt_B = 0;
4642 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
4643 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
4648 // Add new function to reset the state of antenna diversity before link.
4651 ODM_SwAntDivResetBeforeLink(
4656 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4658 pDM_SWAT_Table->SWAS_NoLink_State = 0;
4663 // 20100514 Luke/Joseph:
4664 // Add new function to reset antenna diversity state after link.
4667 ODM_SwAntDivRestAfterLink(
4671 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4673 pDM_SWAT_Table->RSSI_cnt_A = 0;
4674 pDM_SWAT_Table->RSSI_cnt_B = 0;
4675 pDM_Odm->RSSI_test = false;
4676 pDM_SWAT_Table->try_flag = 0xff;
4677 pDM_SWAT_Table->RSSI_Trying = 0;
4678 pDM_SWAT_Table->SelectAntennaMap=0xAA;
4682 ODM_SwAntDivChkPerPktRssi(
4685 PODM_PHY_INFO_T pPhyInfo
4688 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4690 if (!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
4693 if (StationID == pDM_SWAT_Table->RSSI_target)
4695 //1 RSSI for SW Antenna Switch
4696 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
4698 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
4699 pDM_SWAT_Table->RSSI_cnt_A++;
4703 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
4704 pDM_SWAT_Table->RSSI_cnt_B++;
4713 odm_SwAntDivChkAntSwitch(
4719 // For AP/ADSL use prtl8192cd_priv
4720 // For CE/NIC use PADAPTER
4722 PADAPTER pAdapter = pDM_Odm->Adapter;
4723 prtl8192cd_priv priv = pDM_Odm->priv;
4726 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
4727 // at the same time. In the stage2/3, we need to prive universal interface and merge all
4728 // HW dynamic mechanism.
4730 switch (pDM_Odm->SupportPlatform)
4734 odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
4739 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP |ODM_ADSL))
4740 if (priv->pshare->rf_ft_var.antSw_enable && (priv->up_time % 4==1))
4741 dm_SW_AntennaSwitch(priv, SWAW_STEP_PEAK);
4749 // 20100514 Luke/Joseph:
4750 // Add new function for antenna diversity after link.
4751 // This is the main function of antenna diversity after link.
4752 // This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
4753 // HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
4754 // In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
4755 // After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
4756 // listened on the air with the RSSI of original antenna.
4757 // It chooses the antenna with better RSSI.
4758 // There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
4759 // penalty to get next try.
4767 ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna);
4769 //--------------------------------2012--09--06--
4770 //Note: Antenna_Main--> Antenna_A
4771 // Antenna_Aux---> Antenna_B
4772 //----------------------------------
4774 odm_SwAntDivChkAntSwitchNIC(
4779 #if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
4780 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
4781 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4782 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4783 s4Byte curRSSI=100, RSSI_A, RSSI_B;
4784 u1Byte nextAntenna=Antenna_B;
4785 //static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
4786 u8Byte curTxOkCnt, curRxOkCnt;
4787 //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
4788 u8Byte CurByteCnt=0, PreByteCnt=0;
4789 //static u1Byte TrafficLoad = TRAFFIC_LOW;
4790 u1Byte Score_A=0, Score_B=0;
4793 if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
4796 if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
4799 if ((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
4802 if (pDM_Odm->SupportPlatform & ODM_MP)
4804 if (*(pDM_Odm->pAntennaTest))
4808 if ((pDM_SWAT_Table->ANTA_ON == false) ||(pDM_SWAT_Table->ANTB_ON == false))
4810 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
4811 ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
4815 // Radio off: Status reset to default and return.
4816 if (*(pDM_Odm->pbPowerSaving)==true) //pHalData->eRFPowerState==eRfOff
4818 ODM_SwAntDivRestAfterLink(pDM_Odm);
4823 // Handling step mismatch condition.
4824 // Peak step is not finished at last time. Recover the variable and check again.
4825 if ( Step != pDM_SWAT_Table->try_flag )
4827 ODM_SwAntDivRestAfterLink(pDM_Odm);
4830 #if (DM_ODM_SUPPORT_TYPE &( ODM_MP| ODM_CE ))
4832 if (pDM_SWAT_Table->try_flag == 0xff)
4834 pDM_SWAT_Table->RSSI_target = 0xff;
4836 #if (DM_ODM_SUPPORT_TYPE & ODM_CE)
4839 PSTA_INFO_T pEntry = NULL;
4842 for (index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
4844 pEntry = pDM_Odm->pODM_StaInfo[i];
4845 if (IS_STA_VALID(pEntry) ) {
4851 ODM_SwAntDivRestAfterLink(pDM_Odm);
4852 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
4857 pDM_SWAT_Table->RSSI_target = index;
4858 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
4861 #elif (DM_ODM_SUPPORT_TYPE & ODM_MP)
4863 PADAPTER pAdapter = pDM_Odm->Adapter;
4864 PMGNT_INFO pMgntInfo=&pAdapter->MgntInfo;
4866 // Select RSSI checking target
4867 if (pMgntInfo->mAssoc && !ACTING_AS_AP(pAdapter))
4869 // Target: Infrastructure mode AP.
4870 //pDM_SWAT_Table->RSSI_target = NULL;
4871 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): RSSI_target is DEF AP!\n"));
4876 PSTA_INFO_T pEntry = NULL;
4877 PADAPTER pTargetAdapter = NULL;
4879 if (pMgntInfo->mIbss )
4881 // Target: AP/IBSS peer.
4882 pTargetAdapter = pAdapter;
4886 pTargetAdapter = GetFirstAPAdapter(pAdapter);
4889 if (pTargetAdapter != NULL)
4891 for (index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
4894 pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
4897 if (pEntry->bAssociated)
4907 ODM_SwAntDivRestAfterLink(pDM_Odm);
4908 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
4913 //pDM_SWAT_Table->RSSI_target = pEntry;
4914 pDM_SWAT_Table->RSSI_target = index;
4915 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
4917 }//end if (pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
4922 pDM_SWAT_Table->RSSI_cnt_A = 0;
4923 pDM_SWAT_Table->RSSI_cnt_B = 0;
4924 pDM_SWAT_Table->try_flag = 0;
4925 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
4930 #if (DM_ODM_SUPPORT_TYPE &( ODM_MP))
4931 //PADAPTER Adapter = pDM_Odm->Adapter;
4932 curTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt;
4933 curRxOkCnt =pAdapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt;
4934 pDM_SWAT_Table->lastTxOkCnt = pAdapter->TxStats.NumTxBytesUnicast;
4935 pDM_SWAT_Table->lastRxOkCnt = pAdapter->RxStats.NumRxBytesUnicast;
4937 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
4938 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
4939 pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
4940 pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
4942 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("curTxOkCnt = %lld\n",curTxOkCnt));
4943 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("curRxOkCnt = %lld\n",curRxOkCnt));
4944 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("lastTxOkCnt = %lld\n",pDM_SWAT_Table->lastTxOkCnt));
4945 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("lastRxOkCnt = %lld\n",pDM_SWAT_Table->lastRxOkCnt));
4947 if (pDM_SWAT_Table->try_flag == 1)
4949 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
4951 pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
4952 pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
4956 pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
4957 pDM_SWAT_Table->RXByteCnt_B += curRxOkCnt;
4960 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
4961 pDM_SWAT_Table->RSSI_Trying--;
4962 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
4963 if (pDM_SWAT_Table->RSSI_Trying == 0)
4965 CurByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A) : (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B);
4966 PreByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (pDM_SWAT_Table->TXByteCnt_B+pDM_SWAT_Table->RXByteCnt_B) : (pDM_SWAT_Table->TXByteCnt_A+pDM_SWAT_Table->RXByteCnt_A);
4968 if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
4969 //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
4970 PreByteCnt = PreByteCnt*9;
4971 else if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
4972 //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
4973 PreByteCnt = PreByteCnt*2;
4975 if (pDM_SWAT_Table->RSSI_cnt_A > 0)
4976 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
4979 if (pDM_SWAT_Table->RSSI_cnt_B > 0)
4980 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
4983 curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
4984 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A;
4985 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
4986 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s\n",
4987 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
4988 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",
4989 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
4996 if (pDM_SWAT_Table->RSSI_cnt_A > 0)
4997 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
5000 if (pDM_SWAT_Table->RSSI_cnt_B > 0)
5001 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
5004 curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
5005 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B;
5006 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
5007 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s\n",
5008 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
5010 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",
5011 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
5012 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
5013 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
5017 if ((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
5020 if (pDM_SWAT_Table->TestMode == TP_MODE)
5022 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
5023 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
5024 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\n",PreByteCnt));
5025 if (CurByteCnt < PreByteCnt)
5027 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
5028 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
5030 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
5034 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
5035 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
5037 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
5039 for (i= 0; i<8; i++)
5041 if (((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
5046 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
5047 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Score_A=%d, Score_B=%d\n", Score_A, Score_B));
5049 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
5051 nextAntenna = (Score_A > Score_B)?Antenna_A:Antenna_B;
5055 nextAntenna = (Score_B > Score_A)?Antenna_B:Antenna_A;
5057 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
5058 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s\n",
5059 //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
5061 if (nextAntenna != pDM_SWAT_Table->CurAntenna)
5063 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
5067 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
5071 if (pDM_SWAT_Table->TestMode == RSSI_MODE)
5073 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
5074 pDM_SWAT_Table->SelectAntennaMap=0xAA;
5075 if (curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
5077 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
5078 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
5080 else // current anntena is good
5082 nextAntenna =pDM_SWAT_Table->CurAntenna;
5083 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
5086 pDM_SWAT_Table->try_flag = 0;
5087 pDM_Odm->RSSI_test = false;
5088 pDM_SWAT_Table->RSSI_sum_A = 0;
5089 pDM_SWAT_Table->RSSI_cnt_A = 0;
5090 pDM_SWAT_Table->RSSI_sum_B = 0;
5091 pDM_SWAT_Table->RSSI_cnt_B = 0;
5092 pDM_SWAT_Table->TXByteCnt_A = 0;
5093 pDM_SWAT_Table->TXByteCnt_B = 0;
5094 pDM_SWAT_Table->RXByteCnt_A = 0;
5095 pDM_SWAT_Table->RXByteCnt_B = 0;
5100 else if (pDM_SWAT_Table->try_flag == 0)
5102 if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
5104 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if (PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
5105 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
5107 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
5109 else if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
5111 if ((curTxOkCnt+curRxOkCnt) > 3750000) //if (PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
5112 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
5114 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
5116 if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
5117 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
5118 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
5120 //Prepare To Try Antenna
5121 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
5122 pDM_SWAT_Table->try_flag = 1;
5123 pDM_Odm->RSSI_test = true;
5124 if ((curRxOkCnt+curTxOkCnt) > 1000)
5126 pDM_SWAT_Table->RSSI_Trying = 4;
5127 pDM_SWAT_Table->TestMode = TP_MODE;
5131 pDM_SWAT_Table->RSSI_Trying = 2;
5132 pDM_SWAT_Table->TestMode = RSSI_MODE;
5135 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
5138 pDM_SWAT_Table->RSSI_sum_A = 0;
5139 pDM_SWAT_Table->RSSI_cnt_A = 0;
5140 pDM_SWAT_Table->RSSI_sum_B = 0;
5141 pDM_SWAT_Table->RSSI_cnt_B = 0;
5145 //1 4.Change TRX antenna
5146 if (nextAntenna != pDM_SWAT_Table->CurAntenna)
5148 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
5149 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);
5150 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5151 ODM_SetAntenna(pDM_Odm,nextAntenna);
5152 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
5155 bEnqueue = (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)?false :true;
5156 rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
5162 //1 5.Reset Statistics
5163 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
5164 pDM_SWAT_Table->CurAntenna = nextAntenna;
5165 pDM_SWAT_Table->PreRSSI = curRSSI;
5167 //1 6.Set next timer
5169 PADAPTER pAdapter = pDM_Odm->Adapter;
5170 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
5173 if (pDM_SWAT_Table->RSSI_Trying == 0)
5176 if (pDM_SWAT_Table->RSSI_Trying%2 == 0)
5178 if (pDM_SWAT_Table->TestMode == TP_MODE)
5180 if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
5182 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 10 ); //ms
5183 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
5185 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
5187 else if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
5189 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 50 ); //ms
5190 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
5191 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
5196 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 500 ); //ms
5197 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
5198 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
5203 if (pDM_SWAT_Table->TestMode == TP_MODE)
5205 if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
5206 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 90 ); //ms
5207 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
5208 else if (pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
5209 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 100 ); //ms
5210 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
5213 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 500 ); //ms
5214 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
5217 #endif // #if (DM_ODM_SUPPORT_TYPE & (ODM_MP|ODM_CE))
5218 #endif // #if (RTL8192C_SUPPORT==1)
5222 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5225 odm_SwAntDivSelectChkChnl(
5229 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
5230 u1Byte index, target_chnl=0;
5231 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5232 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
5233 u1Byte chnl_peer_cnt[14] = {0};
5235 if (Adapter->MgntInfo.tmpNumBssDesc==0)
5241 // 20100519 Joseph: Select checking channel from current scan list.
5242 // We just choose the channel with most APs to be the test scan channel.
5243 for (index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
5245 // Add by hpfan: prevent access invalid channel number
5246 // TODO: Verify channel number by channel plan
5247 if (Adapter->MgntInfo.tmpbssDesc[index].ChannelNumber == 0 ||
5248 Adapter->MgntInfo.tmpbssDesc[index].ChannelNumber > 13)
5251 chnl_peer_cnt[Adapter->MgntInfo.tmpbssDesc[index].ChannelNumber-1]++;
5253 for (index=0; index<14; index++)
5255 if (chnl_peer_cnt[index]>chnl_peer_cnt[target_chnl])
5256 target_chnl = index;
5259 ODM_RT_TRACE(pDM_Odm,COMP_SWAS, DBG_LOUD,
5260 ("odm_SwAntDivSelectChkChnl(): Channel %d is select as test channel.\n", target_chnl));
5271 odm_SwAntDivConsructChkScanChnl(
5277 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
5278 PRT_CHANNEL_LIST pChannelList = GET_RT_CHANNEL_LIST(pMgntInfo);
5283 // 20100519 Joseph: Original antenna scanned nothing.
5284 // Test antenna shall scan all channel with half period in this condition.
5285 RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, NULL, NULL);
5286 for (index=0; index<pChannelList->ChannelLen; index++)
5287 pChannelList->ChannelInfo[index].ScanPeriod /= 2;
5291 // The using of this CustomizedScanRequest is a trick to rescan the two channels
5292 // under the NORMAL scanning process. It will not affect MGNT_INFO.CustomizedScanRequest.
5293 CUSTOMIZED_SCAN_REQUEST CustomScanReq;
5295 CustomScanReq.bEnabled = true;
5296 CustomScanReq.Channels[0] = ChkChnl;
5297 CustomScanReq.Channels[1] = pMgntInfo->dot11CurrentChannelNumber;
5298 CustomScanReq.nChannels = 2;
5299 CustomScanReq.ScanType = SCAN_ACTIVE;
5300 CustomScanReq.Duration = DEFAULT_ACTIVE_SCAN_PERIOD;
5302 RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_CONSTRUCT_SCAN_LIST, &CustomScanReq, NULL);
5306 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5309 // 20100514 Luke/Joseph:
5310 // Callback function for 500ms antenna test trying.
5312 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5314 odm_SwAntDivChkAntSwitchCallback(
5318 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
5319 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
5320 pSWAT_T pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
5322 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
5324 ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
5326 odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
5329 ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem);
5334 odm_SwAntDivChkAntSwitchWorkitemCallback(
5339 PADAPTER pAdapter = (PADAPTER)pContext;
5340 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
5342 odm_SwAntDivChkAntSwitch(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
5345 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
5346 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
5348 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
5349 PADAPTER padapter = pDM_Odm->Adapter;
5350 if (padapter->net_closed == true)
5352 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
5354 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
5355 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
5357 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
5358 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
5362 #else //#if (defined(CONFIG_SW_ANTENNA_DIVERSITY))
5364 void odm_SwAntDivInit( PDM_ODM_T pDM_Odm ) {}
5365 void ODM_SwAntDivChkPerPktRssi(
5368 PODM_PHY_INFO_T pPhyInfo
5370 void odm_SwAntDivChkAntSwitch(
5374 void ODM_SwAntDivResetBeforeLink( PDM_ODM_T pDM_Odm ) {}
5375 void ODM_SwAntDivRestAfterLink( PDM_ODM_T pDM_Odm ) {}
5376 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5377 u1Byte odm_SwAntDivSelectChkChnl( PADAPTER Adapter ) { return 0;}
5379 odm_SwAntDivConsructChkScanChnl(
5384 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5385 void odm_SwAntDivChkAntSwitchCallback( PRT_TIMER pTimer) {}
5386 void odm_SwAntDivChkAntSwitchWorkitemCallback( void * pContext ) {}
5387 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
5388 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext) {}
5389 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
5390 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext) {}
5393 #endif //#if (defined(CONFIG_SW_ANTENNA_DIVERSITY))
5395 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
5396 #if ((defined(CONFIG_SW_ANTENNA_DIVERSITY))||(defined(CONFIG_HW_ANTENNA_DIVERSITY)))
5398 ODM_SwAntDivCheckBeforeLink8192C(
5403 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
5404 PADAPTER Adapter = pDM_Odm->Adapter;
5405 HAL_DATA_TYPE *pHalData=NULL;
5406 PMGNT_INFO pMgntInfo = NULL;
5407 //pSWAT_T pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
5408 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5409 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
5412 PRT_WLAN_BSS pTmpBssDesc;
5413 PRT_WLAN_BSS pTestBssDesc;
5415 u1Byte target_chnl = 0;
5419 if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
5420 { // The ODM structure is not initialized.
5423 // 2012/04/26 MH Prevent no-checked IC to execute antenna diversity.
5424 if (pDM_Odm->SupportICType == ODM_RTL8188E && pDM_Odm->SupportInterface != ODM_ITRF_PCIE)
5426 pHalData = GET_HAL_DATA(Adapter);
5427 pMgntInfo = &Adapter->MgntInfo;
5429 // Condition that does not need to use antenna diversity.
5430 if (IS_8723_SERIES(pHalData->VersionID) ||
5431 IS_92C_SERIAL(pHalData->VersionID) ||
5432 (pHalData->AntDivCfg==0) ||
5433 pMgntInfo->AntennaTest ||
5434 Adapter->bInHctTest)
5436 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5437 ("ODM_SwAntDivCheckBeforeLink8192C(): No AntDiv Mechanism.\n"));
5441 if (IS_8723_SERIES(pHalData->VersionID) || IS_92C_SERIAL(pHalData->VersionID) )
5443 if ((pDM_SWAT_Table->ANTA_ON == false) ||(pDM_SWAT_Table->ANTB_ON == false))
5445 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5446 ("ODM_SwAntDivCheckBeforeLink8192C(): No AntDiv Mechanism, Antenna A or B is off\n"));
5451 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
5452 PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
5453 if (pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
5455 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
5457 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5458 ("ODM_SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
5459 pMgntInfo->RFChangeInProgress,
5460 pHalData->eRFPowerState));
5462 pDM_SWAT_Table->SWAS_NoLink_State = 0;
5468 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
5471 //1 Run AntDiv mechanism "Before Link" part.
5472 if (pDM_SWAT_Table->SWAS_NoLink_State == 0)
5474 //1 Prepare to do Scan again to check current antenna state.
5476 // Set check state to next step.
5477 pDM_SWAT_Table->SWAS_NoLink_State = 1;
5479 // Copy Current Scan list.
5480 Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
5481 PlatformMoveMemory((void *)Adapter->MgntInfo.tmpbssDesc, (void *)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
5483 if (pDM_Odm->SupportICType == ODM_RTL8188E)
5485 if (pDM_FatTable->RxIdleAnt == MAIN_ANT)
5486 ODM_UpdateRxIdleAnt_88E(pDM_Odm, AUX_ANT);
5488 ODM_UpdateRxIdleAnt_88E(pDM_Odm, MAIN_ANT);
5490 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5491 ("ODM_SwAntDivCheckBeforeLink8192C: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
5493 if (pDM_Odm->SupportICType != ODM_RTL8188E)
5495 // Switch Antenna to another one.
5496 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
5497 pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
5499 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5500 ("ODM_SwAntDivCheckBeforeLink8192C: Change to Ant(%s) for testing.\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B"));
5501 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
5502 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
5503 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
5505 // Go back to scan function again.
5506 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink8192C: Scan one more time\n"));
5507 pMgntInfo->ScanStep=0;
5508 target_chnl = odm_SwAntDivSelectChkChnl(Adapter);
5509 odm_SwAntDivConsructChkScanChnl(Adapter, target_chnl);
5510 HTReleaseChnlOpLock(Adapter);
5511 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
5517 //1 ScanComple() is called after antenna swiched.
5518 //1 Check scan result and determine which antenna is going
5521 for (index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
5523 pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
5524 pTestBssDesc = &(pMgntInfo->bssDesc[index]);
5526 if (PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
5528 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink8192C(): ERROR!! This shall not happen.\n"));
5532 if (pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
5534 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink8192C: Compare scan entry: Score++\n"));
5535 RT_PRINT_STR(ODM_COMP_ANT_DIV, ODM_DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
5536 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
5539 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
5541 else if (pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
5543 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink8192C: Compare scan entry: Score--\n"));
5544 RT_PRINT_STR(ODM_COMP_ANT_DIV, ODM_DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
5545 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
5551 if (pDM_Odm->SupportICType == ODM_RTL8188E)
5553 if (pMgntInfo->NumBssDesc!=0 && Score<=0)
5555 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5556 ("ODM_SwAntDivCheckBeforeLink8192C(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
5560 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5561 ("ODM_SwAntDivCheckBeforeLink8192C(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
5563 if (pDM_FatTable->RxIdleAnt == MAIN_ANT)
5564 ODM_UpdateRxIdleAnt_88E(pDM_Odm, AUX_ANT);
5566 ODM_UpdateRxIdleAnt_88E(pDM_Odm, MAIN_ANT);
5570 if (pDM_Odm->SupportICType != ODM_RTL8188E)
5572 if (pMgntInfo->NumBssDesc!=0 && Score<=0)
5574 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5575 ("ODM_SwAntDivCheckBeforeLink8192C(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"Antenna_A":"Antenna_B"));
5577 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
5581 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
5582 ("ODM_SwAntDivCheckBeforeLink8192C(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==Antenna_A)?"Antenna_B":"Antenna_A"));
5584 pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
5586 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
5587 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
5588 PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
5591 // Check state reset to default and wait for next time.
5592 pDM_SWAT_Table->SWAS_NoLink_State = 0;
5604 ODM_SwAntDivCheckBeforeLink8192C(
5612 #endif //#if ((defined(CONFIG_SW_ANTENNA_DIVERSITY))||(defined(CONFIG_HW_ANTENNA_DIVERSITY)))
5613 #endif //#if (DM_ODM_SUPPORT_TYPE==ODM_MP)
5616 //3============================================================
5617 //3 SW Antenna Diversity
5618 //3============================================================
5620 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
5622 odm_InitHybridAntDiv_88C_92D(
5627 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
5628 struct rtl8192cd_priv *priv=pDM_Odm->priv;
5630 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5631 u1Byte bTxPathSel=0; //0:Path-A 1:Path-B
5634 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
5636 //whether to do antenna diversity or not
5637 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
5638 if (priv==NULL) return;
5639 if (!priv->pshare->rf_ft_var.antHw_enable)
5642 #ifdef SW_ANT_SWITCH
5643 priv->pshare->rf_ft_var.antSw_enable =0;
5647 if ((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
5651 bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?false:true;
5653 ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
5654 ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
5655 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
5656 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
5657 // check HW setting: ANTSEL pin connection
5658 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
5659 ODM_Write2Byte(pDM_Odm,ODM_REG_RF_PIN_11N, (ODM_Read2Byte(pDM_Odm,0x804)&0xf0ff )| BIT(8) ); // b11-b8=0001,update RFPin setting
5662 // only AP support different path selection temperarly
5663 if (!bTxPathSel) { //PATH-A
5664 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
5665 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1); //select TX ANTESEL from path A
5668 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
5669 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0); //select ANTESEL from path B
5672 //Set OFDM HW RX Antenna Diversity
5673 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
5674 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
5675 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1); // Decide final antenna by comparing 2 antennas' pwdb
5677 //Set CCK HW RX Antenna Diversity
5678 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
5679 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
5680 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
5681 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
5684 //Enable HW Antenna Diversity
5685 if (!bTxPathSel) //PATH-A
5686 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1); // Enable Hardware antenna switch
5688 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1); // Enable Hardware antenna switch
5689 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
5691 pDM_SWAT_Table->CurAntenna=0; //choose left antenna as default antenna
5692 pDM_SWAT_Table->PreAntenna=0;
5693 for (i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
5695 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
5696 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
5697 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
5698 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
5699 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
5700 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
5702 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
5707 odm_InitHybridAntDiv(
5711 if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
5713 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
5717 if (pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
5719 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
5720 odm_InitHybridAntDiv_88C_92D(pDM_Odm);
5723 else if (pDM_Odm->SupportICType == ODM_RTL8188E)
5725 #if (RTL8188E_SUPPORT == 1)
5726 ODM_AntennaDiversityInit_88E(pDM_Odm);
5736 u4Byte OFDM_Ant1_Cnt,
5737 u4Byte OFDM_Ant2_Cnt,
5738 u4Byte CCK_Ant1_Cnt,
5739 u4Byte CCK_Ant2_Cnt,
5745 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
5747 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));
5748 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));
5751 if (((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)) {
5752 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
5756 if (OFDM_Ant1_Cnt || OFDM_Ant2_Cnt ) {
5757 //if RX OFDM packet number larger than 0
5758 if (OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
5763 // else if RX CCK packet number larger than 10
5764 else if ((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
5766 if (CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
5768 else if (CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
5770 else if (CCK_Ant1_Cnt > CCK_Ant2_Cnt)
5777 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
5780 //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
5781 //(*pDefAnt)= (u1Byte) antsel;
5786 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
5801 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5803 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
5805 if (Ant != pDM_SWAT_Table->RxIdleAnt)
5809 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9); //right-side antenna
5811 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a); //left-side antenna
5816 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9); //right-side antenna
5818 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a); //left-side antenna
5821 pDM_SWAT_Table->RxIdleAnt = Ant;
5822 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));
5824 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
5829 ODM_AntselStatistics_88C(
5836 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5838 if (pDM_SWAT_Table->antsel == 1)
5841 pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
5844 pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
5845 pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
5851 pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
5854 pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
5855 pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
5864 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
5866 ODM_SetTxAntByTxInfo_88C_92D(
5872 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5875 if (!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))
5878 if (pDM_SWAT_Table->RxIdleAnt == 1)
5879 antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?0:1;
5881 antsel=(pDM_SWAT_Table->TxAnt[macId] == 1)?1:0;
5883 SET_TX_DESC_ANTSEL_A_92C(pDesc, antsel);
5884 //SET_TX_DESC_ANTSEL_B_92C(pDesc, antsel);
5885 //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]));
5887 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
5889 ODM_SetTxAntByTxInfo_88C_92D(
5895 #elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
5897 ODM_SetTxAntByTxInfo_88C_92D(
5906 odm_HwAntDiv_92C_92D(
5910 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
5911 u4Byte RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
5912 u1Byte RxIdleAnt, i;
5916 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
5917 struct rtl8192cd_priv *priv=pDM_Odm->priv;
5919 if (priv->pshare->rf_ft_var.CurAntenna & 0x80)
5923 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
5925 if (!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) //if don't support antenna diveristy
5927 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
5931 if ((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
5933 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
5937 #if (DM_ODM_SUPPORT_TYPE&(ODM_MP|ODM_CE))
5938 if (!pDM_Odm->bLinked)
5940 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is false\n"));
5945 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
5947 pEntry = pDM_Odm->pODM_StaInfo[i];
5948 if (IS_STA_VALID(pEntry))
5951 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]);
5952 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]);
5954 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d, RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
5956 if (RSSI_Ant1 ||RSSI_Ant2)
5958 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
5959 if (pDM_Odm->pODM_StaInfo[i]->expire_to)
5962 RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
5963 if ((!RSSI) || ( RSSI < RSSI_Min) ) {
5964 pDM_SWAT_Table->TargetSTA = i;
5969 ///STA: found out default antenna
5970 bRet=odm_StaDefAntSel(pDM_Odm,
5971 pDM_SWAT_Table->OFDM_Ant1_Cnt[i],
5972 pDM_SWAT_Table->OFDM_Ant2_Cnt[i],
5973 pDM_SWAT_Table->CCK_Ant1_Cnt[i],
5974 pDM_SWAT_Table->CCK_Ant2_Cnt[i],
5975 &pDM_SWAT_Table->TxAnt[i]);
5977 //if Tx antenna selection: successful
5979 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
5980 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
5981 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
5982 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
5983 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
5984 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
5990 RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
5991 odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, false);
5993 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
5995 if (!priv->pmib->dot11OperationEntry.disable_txsc) {
5996 plist = phead->next;
5997 while (plist != phead) {
5998 pstat = list_entry(plist, struct stat_info, asoc_list);
5999 if (pstat->expire_to) {
6000 for (i=0; i<TX_SC_ENTRY_NUM; i++) {
6001 struct tx_desc *pdesc= &(pstat->tx_sc_ent[i].hwdesc1);
6002 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
6003 if ((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
6004 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
6005 pdesc= &(pstat->tx_sc_ent[i].hwdesc2);
6006 pdesc->Dword2 &= set_desc(~ (BIT(24)|BIT(25)));
6007 if ((pstat->CurAntenna^priv->pshare->rf_ft_var.CurAntenna)&1)
6008 pdesc->Dword2 |= set_desc(BIT(24)|BIT(25));
6012 if (plist == plist->next)
6014 plist = plist->next;
6020 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
6029 if (!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
6031 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
6035 if (pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
6037 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
6038 odm_HwAntDiv_92C_92D(pDM_Odm);
6041 else if (pDM_Odm->SupportICType == ODM_RTL8188E)
6043 #if (RTL8188E_SUPPORT == 1)
6044 ODM_AntennaDiversity_88E(pDM_Odm);
6051 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
6054 ODM_Diversity_AntennaSelect(
6059 struct rtl8192cd_priv *priv=pDM_Odm->priv;
6061 int ant = _atoi(data, 16);
6063 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ODM_Diversity_AntennaSelect==============>\n"));
6065 #ifdef PCIE_POWER_SAVING
6066 PCIeWakeUp(priv, POWER_DOWN_T0);
6069 if (ant==Antenna_B || ant==Antenna_A)
6071 if ( !priv->pshare->rf_ft_var.antSw_select) {
6072 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(8)| BIT(9) ); // ANTSEL A as SW control
6073 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7))); // rx OFDM SW control
6074 PHY_SetBBReg(priv, 0x860, 0x300, ant);
6076 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) | BIT(24)| BIT(25) ); // ANTSEL B as HW control
6077 PHY_SetBBReg(priv, 0x864, 0x300, ant);
6078 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7))); // rx OFDM SW control
6081 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7))); // rx CCK SW control
6082 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
6083 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
6085 priv->pshare->rf_ft_var.antHw_enable = 0;
6086 priv->pshare->rf_ft_var.CurAntenna = (ant%2);
6088 #ifdef SW_ANT_SWITCH
6089 priv->pshare->rf_ft_var.antSw_enable = 0;
6090 priv->pshare->DM_SWAT_Table.CurAntenna = ant;
6091 priv->pshare->RSSI_test =0;
6096 if ( !priv->pshare->rf_ft_var.antSw_select) {
6097 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(8)| BIT(9)) );
6098 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) | BIT(7)); // OFDM HW control
6100 ODM_Write4Byte(pDM_Odm,0x870, ODM_Read4Byte(pDM_Odm,0x870) & ~(BIT(24)| BIT(25)) );
6101 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) | BIT(7)); // OFDM HW control
6104 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) | BIT(7)); // CCK HW control
6105 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) | BIT(21) ); // by tx desc
6106 priv->pshare->rf_ft_var.CurAntenna = 0;
6107 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
6108 priv->pshare->rf_ft_var.antHw_enable = 1;
6109 #ifdef SW_ANT_SWITCH
6110 priv->pshare->rf_ft_var.antSw_enable = 0;
6111 priv->pshare->RSSI_test =0;
6114 #ifdef SW_ANT_SWITCH
6116 if (!priv->pshare->rf_ft_var.antSw_enable) {
6118 dm_SW_AntennaSwitchInit(priv);
6119 ODM_Write4Byte(pDM_Odm,0x858, 0x569a569a);
6120 priv->pshare->lastTxOkCnt = priv->net_stats.tx_bytes;
6121 priv->pshare->lastRxOkCnt = priv->net_stats.rx_bytes;
6123 if ( !priv->pshare->rf_ft_var.antSw_select)
6124 ODM_Write1Byte(pDM_Odm,0xc50, ODM_Read1Byte(pDM_Odm,0xc50) & (~ BIT(7))); // rx OFDM SW control
6126 ODM_Write1Byte(pDM_Odm,0xc58, ODM_Read1Byte(pDM_Odm,0xc58) & (~ BIT(7))); // rx OFDM SW control
6128 ODM_Write1Byte(pDM_Odm,0xa01, ODM_Read1Byte(pDM_Odm,0xa01) & (~ BIT(7))); // rx CCK SW control
6129 ODM_Write4Byte(pDM_Odm,0x80c, ODM_Read4Byte(pDM_Odm,0x80c) & (~ BIT(21))); // select ant by tx desc
6130 priv->pshare->rf_ft_var.antHw_enable = 0;
6131 priv->pshare->rf_ft_var.antSw_enable = 1;
6135 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============ODM_Diversity_AntennaSelect\n"));
6141 #else //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
6143 void odm_InitHybridAntDiv( PDM_ODM_T pDM_Odm ) {}
6144 void odm_HwAntDiv( PDM_ODM_T pDM_Odm) {}
6145 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6146 void ODM_SetTxAntByTxInfo_88C_92D(
6151 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6152 void ODM_SetTxAntByTxInfo_88C_92D( PDM_ODM_T pDM_Odm) { }
6153 #elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
6154 void ODM_SetTxAntByTxInfo_88C_92D( PDM_ODM_T pDM_Odm) { }
6157 #endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
6161 //============================================================
6163 //============================================================
6169 #if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
6170 odm_EdcaParaInit(pDM_Odm);
6171 #elif (DM_ODM_SUPPORT_TYPE==ODM_MP)
6172 PADAPTER Adapter = NULL;
6173 HAL_DATA_TYPE *pHalData = NULL;
6175 if (pDM_Odm->Adapter==NULL) {
6176 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
6180 Adapter=pDM_Odm->Adapter;
6181 pHalData=GET_HAL_DATA(Adapter);
6183 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false;
6184 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = false;
6185 pHalData->bIsAnyNonBEPkts = false;
6187 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6188 PADAPTER Adapter = pDM_Odm->Adapter;
6189 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false;
6190 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = false;
6191 Adapter->recvpriv.bIsAnyNonBEPkts =false;
6194 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)));
6195 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)));
6196 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)));
6197 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)));
6200 } // ODM_InitEdcaTurbo
6208 // For AP/ADSL use prtl8192cd_priv
6209 // For CE/NIC use PADAPTER
6211 PADAPTER pAdapter = pDM_Odm->Adapter;
6212 prtl8192cd_priv priv = pDM_Odm->priv;
6215 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
6216 // at the same time. In the stage2/3, we need to prive universal interface and merge all
6217 // HW dynamic mechanism.
6219 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
6221 if (!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
6224 switch (pDM_Odm->SupportPlatform)
6228 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6229 odm_EdcaTurboCheckMP(pDM_Odm);
6234 #if (DM_ODM_SUPPORT_TYPE==ODM_CE)
6235 odm_EdcaTurboCheckCE(pDM_Odm);
6242 #if ((DM_ODM_SUPPORT_TYPE == ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
6243 odm_IotEngine(pDM_Odm);
6247 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
6249 } // odm_CheckEdcaTurbo
6251 #if (DM_ODM_SUPPORT_TYPE==ODM_CE)
6255 odm_EdcaTurboCheckCE(
6260 #if (DM_ODM_SUPPORT_TYPE==ODM_CE)
6262 PADAPTER Adapter = pDM_Odm->Adapter;
6266 u64 cur_tx_bytes = 0;
6267 u64 cur_rx_bytes = 0;
6268 u8 bbtchange = false;
6269 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6270 struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
6271 struct recv_priv *precvpriv = &(Adapter->recvpriv);
6272 struct registry_priv *pregpriv = &Adapter->registrypriv;
6273 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
6274 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
6277 if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
6279 goto dm_CheckEdcaTurbo_EXIT;
6282 if (pmlmeinfo->assoc_AP_vendor >= HT_IOT_PEER_MAX)
6284 goto dm_CheckEdcaTurbo_EXIT;
6287 #ifdef CONFIG_BT_COEXIST
6288 if (BT_DisableEDCATurbo(Adapter))
6290 goto dm_CheckEdcaTurbo_EXIT;
6294 // Check if the status needs to be changed.
6295 if ((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
6297 cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes;
6298 cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes;
6301 if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_RALINK)||(pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS))
6303 if (cur_tx_bytes > (cur_rx_bytes << 2))
6304 { // Uplink TP is present.
6305 trafficIndex = UP_LINK;
6308 { // Balance TP is present.
6309 trafficIndex = DOWN_LINK;
6314 if (cur_rx_bytes > (cur_tx_bytes << 2))
6315 { // Downlink TP is present.
6316 trafficIndex = DOWN_LINK;
6319 { // Balance TP is present.
6320 trafficIndex = UP_LINK;
6324 if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
6326 if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_CISCO) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N))
6328 edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex];
6332 edca_param = EDCAParam[HT_IOT_PEER_UNKNOWN][trafficIndex];
6335 rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
6337 pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
6340 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = true;
6345 // Turn Off EDCA turbo here.
6346 // Restore original EDCA according to the declaration of AP.
6348 if (pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
6350 rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
6351 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false;
6355 dm_CheckEdcaTurbo_EXIT:
6356 // Set variables for next time.
6357 precvpriv->bIsAnyNonBEPkts = false;
6358 pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
6359 precvpriv->last_rx_bytes = precvpriv->rx_bytes;
6364 #elif (DM_ODM_SUPPORT_TYPE==ODM_MP)
6366 odm_EdcaTurboCheckMP(
6372 PADAPTER Adapter = pDM_Odm->Adapter;
6373 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6375 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6376 PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
6377 PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
6378 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
6379 PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
6380 //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
6381 u8Byte Ext_curTxOkCnt = 0;
6382 u8Byte Ext_curRxOkCnt = 0;
6383 static u8Byte Ext_lastTxOkCnt = 0;
6384 static u8Byte Ext_lastRxOkCnt = 0;
6385 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
6386 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
6388 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6389 struct dm_priv *pdmpriv = &pHalData->dmpriv;
6390 struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
6391 struct recv_priv *precvpriv = &(Adapter->recvpriv);
6392 struct registry_priv *pregpriv = &Adapter->registrypriv;
6393 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
6394 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
6395 #ifdef CONFIG_BT_COEXIST
6396 struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
6398 u1Byte bbtchange =false;
6400 // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
6401 u8Byte curTxOkCnt = 0;
6402 u8Byte curRxOkCnt = 0;
6403 u8Byte lastTxOkCnt = 0;
6404 u8Byte lastRxOkCnt = 0;
6405 u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
6406 u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
6407 u4Byte EDCA_BE = 0x5ea42b;
6409 bool *pbIsCurRDLState=NULL;
6410 bool bLastIsCurRDLState=false;
6411 bool bBiasOnRx=false;
6412 bool bEdcaTurboOn=false;
6415 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
6416 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)));
6418 ////===============================
6419 ////list paramter for different platform
6420 ////===============================
6421 bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
6422 pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);
6423 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6424 // Caculate TX/RX TP:
6425 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
6426 curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
6427 if (pExtAdapter == NULL)
6428 pExtAdapter = pDefaultAdapter;
6430 Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
6431 Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
6432 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
6433 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
6434 if (TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
6436 curTxOkCnt = Ext_curTxOkCnt ;
6437 curRxOkCnt = Ext_curRxOkCnt ;
6440 IOTPeer=pMgntInfo->IOTPeer;
6441 bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?true:false;
6442 bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts) && (!pMgntInfo->bDisableFrameBursting))?true:false;
6443 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx bDisableFrameBursting : 0x%lx \n",pHalData->bIsAnyNonBEPkts,pMgntInfo->bDisableFrameBursting));
6445 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6446 // Caculate TX/RX TP:
6447 curTxOkCnt = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes;
6448 curRxOkCnt = precvpriv->rx_bytes - precvpriv->last_rx_bytes;
6449 #ifdef CONFIG_BT_COEXIST
6450 if (pbtpriv->BT_Coexist)
6452 if ( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
6456 IOTPeer=pmlmeinfo->assoc_AP_vendor;
6457 bBiasOnRx=((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))?true:false;
6458 bEdcaTurboOn=(bbtchange || (!precvpriv->bIsAnyNonBEPkts))?true:false;
6459 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bbtchange : 0x%lx bIsAnyNonBEPkts : 0x%lx \n",bbtchange,precvpriv->bIsAnyNonBEPkts));
6463 ////===============================
6464 ////check if edca turbo is disabled
6465 ////===============================
6466 if (odm_IsEdcaTurboDisable(pDM_Odm))
6467 goto dm_CheckEdcaTurbo_EXIT;
6470 ////===============================
6471 ////remove iot case out
6472 ////===============================
6473 ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
6476 ////===============================
6477 ////Check if the status needs to be changed.
6478 ////===============================
6481 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
6482 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx\n",curTxOkCnt));
6483 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx\n",curRxOkCnt));
6485 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, true, pbIsCurRDLState);
6487 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, false, pbIsCurRDLState);
6489 //modify by Guo.Mingzhi 2011-12-29
6490 EDCA_BE=((*pbIsCurRDLState)==true)?EDCA_BE_DL:EDCA_BE_UL;
6491 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
6492 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
6494 // if (((*pbIsCurRDLState)!=bLastIsCurRDLState)||(!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
6496 // EDCA_BE=((*pbIsCurRDLState)==true)?EDCA_BE_DL:EDCA_BE_UL;
6497 // ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
6499 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = true;
6501 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));
6506 // Turn Off EDCA turbo here.
6507 // Restore original EDCA according to the declaration of AP.
6508 if (pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
6510 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6511 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
6512 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6513 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, pHalData->AcParam_BE);
6516 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = false;
6517 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));
6522 ////===============================
6523 ////Set variables for next time.
6524 ////===============================
6525 dm_CheckEdcaTurbo_EXIT:
6526 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6527 pHalData->bIsAnyNonBEPkts = false;
6528 pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
6529 pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
6530 pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
6531 pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
6532 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6533 precvpriv->bIsAnyNonBEPkts = false;
6534 pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
6535 precvpriv->last_rx_bytes = precvpriv->rx_bytes;
6541 //check if edca turbo is disabled
6543 odm_IsEdcaTurboDisable(
6547 PADAPTER Adapter = pDM_Odm->Adapter;
6548 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6550 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6551 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
6552 u4Byte IOTPeer=pMgntInfo->IOTPeer;
6553 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6554 struct registry_priv *pregpriv = &Adapter->registrypriv;
6555 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
6556 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
6557 u4Byte IOTPeer=pmlmeinfo->assoc_AP_vendor;
6558 u1Byte WirelessMode=0xFF; //invalid value
6560 if (pDM_Odm->pWirelessMode!=NULL)
6561 WirelessMode=*(pDM_Odm->pWirelessMode);
6565 #if (BT_30_SUPPORT == 1)
6566 if (pDM_Odm->bBtDisableEdcaTurbo)
6568 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
6573 if ((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
6574 (pDM_Odm->bWIFITest)||
6575 (IOTPeer>= HT_IOT_PEER_MAX))
6577 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
6582 #if (DM_ODM_SUPPORT_TYPE ==ODM_MP)
6583 // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
6584 // 2. User may disable EDCA Turbo mode with OID settings.
6585 if ((pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO) ||pHalData->bForcedDisableTurboEDCA) {
6586 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
6590 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6591 //suggested by Jr.Luke: open TXOP for B/G/BG/A mode 2012-0215
6592 if ((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G)||(WirelessMode==ODM_WM_G)||(WirelessMode=ODM_WM_A))
6593 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, ODM_Read4Byte(pDM_Odm, ODM_EDCA_BE_PARAM)|0x5E0000);
6595 if (pDM_Odm->SupportICType==ODM_RTL8192D) {
6596 if ((pregpriv->wifi_spec == 1) || (pmlmeext->cur_wireless_mode == WIRELESS_11B)) {
6597 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("92D:EdcaTurboDisable\n"));
6603 if ((pregpriv->wifi_spec == 1) || (pmlmeinfo->HT_enable == 0)) {
6604 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("Others:EdcaTurboDisable\n"));
6608 #ifdef CONFIG_BT_COEXIST
6609 if (BT_DisableEDCATurbo(Adapter))
6611 goto dm_CheckEdcaTurbo_EXIT;
6622 //add iot case here: for MP/CE
6624 ODM_EdcaParaSelByIot(
6631 PADAPTER Adapter = pDM_Odm->Adapter;
6632 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
6634 u4Byte ICType=pDM_Odm->SupportICType;
6635 u1Byte WirelessMode=0xFF; //invalid value
6636 u4Byte RFType=pDM_Odm->RFType;
6638 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6639 PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
6640 PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
6641 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
6642 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
6644 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6645 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
6646 #ifdef CONFIG_BT_COEXIST
6647 struct btcoexist_priv *pbtpriv = &(pHalData->bt_coexist);
6649 u1Byte bbtchange =false;
6652 if (pDM_Odm->pWirelessMode!=NULL)
6653 WirelessMode=*(pDM_Odm->pWirelessMode);
6655 ///////////////////////////////////////////////////////////
6656 ////list paramter for different platform
6657 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6658 IOTPeer=pMgntInfo->IOTPeer;
6659 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
6661 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6662 IOTPeer=pmlmeinfo->assoc_AP_vendor;
6663 #ifdef CONFIG_BT_COEXIST
6664 if (pbtpriv->BT_Coexist)
6666 if ( (pbtpriv->BT_EDCA[UP_LINK]!=0) || (pbtpriv->BT_EDCA[DOWN_LINK]!=0))
6673 if (ICType==ODM_RTL8192D)
6676 if (pDM_Odm->RFType==ODM_2T2R)
6678 (*EDCA_BE_UL) = 0x60a42b; //0x5ea42b;
6679 (*EDCA_BE_DL) = 0x60a42b; //0x5ea42b;
6684 (*EDCA_BE_UL) = 0x6ea42b;
6685 (*EDCA_BE_DL) = 0x6ea42b;
6689 ////============================
6691 ////============================
6692 #if (DM_ODM_SUPPORT_TYPE==ODM_MP)
6696 if (pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
6697 if ((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
6698 (*EDCA_BE_UL) = 0x60a42b;
6699 (*EDCA_BE_DL) = 0x60a42b;
6703 (*EDCA_BE_UL) = 0x6ea42b;
6704 (*EDCA_BE_DL) = 0x6ea42b;
6709 if (TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
6711 (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
6712 (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
6715 #if (INTEL_PROXIMITY_SUPPORT == 1)
6716 if (pMgntInfo->IntelClassModeInfo.bEnableCA == true)
6718 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
6723 if ((!pMgntInfo->bDisableFrameBursting) &&
6724 (pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
6725 {// To check whether we shall force turn on TXOP configuration.
6726 if (!((*EDCA_BE_UL) & 0xffff0000))
6727 (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
6728 if (!((*EDCA_BE_DL) & 0xffff0000))
6729 (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
6732 //92D txop can't be set to 0x3e for cisco1250
6733 if ((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
6735 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
6736 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
6738 //merge from 92s_92c_merge temp brunch v2445 20120215
6739 else if ((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
6741 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
6743 else if ((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
6745 (*EDCA_BE_DL) = 0xa630;
6748 else if (IOTPeer == HT_IOT_PEER_MARVELL)
6750 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
6751 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
6753 else if (IOTPeer == HT_IOT_PEER_ATHEROS)
6755 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
6756 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
6759 ////============================
6761 ////============================
6762 #elif (DM_ODM_SUPPORT_TYPE==ODM_CE)
6764 if (RFType==ODM_RTL8192D)
6766 if ((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
6768 (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
6769 (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
6771 else if ((IOTPeer == HT_IOT_PEER_AIRGO) &&
6772 ((WirelessMode==ODM_WM_B)||(WirelessMode==(ODM_WM_B|ODM_WM_G))))
6773 (*EDCA_BE_DL)=0x00a630;
6775 else if ((IOTPeer== HT_IOT_PEER_ATHEROS) &&
6776 (WirelessMode&ODM_WM_N5G) &&
6777 (Adapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
6778 (*EDCA_BE_DL)=0xa42b;
6784 #ifdef CONFIG_BT_COEXIST
6787 (*EDCA_BE_UL) = pbtpriv->BT_EDCA[UP_LINK];
6788 (*EDCA_BE_DL) = pbtpriv->BT_EDCA[DOWN_LINK];
6793 if ((IOTPeer == HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
6795 (*EDCA_BE_UL) = EDCAParam[IOTPeer][UP_LINK];
6796 (*EDCA_BE_DL)=EDCAParam[IOTPeer][DOWN_LINK];
6800 (*EDCA_BE_UL)=EDCAParam[HT_IOT_PEER_UNKNOWN][UP_LINK];
6801 (*EDCA_BE_DL)=EDCAParam[HT_IOT_PEER_UNKNOWN][DOWN_LINK];
6804 if (pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
6805 if ((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))
6807 (*EDCA_BE_UL) = 0x60a42b;
6808 (*EDCA_BE_DL) = 0x60a42b;
6812 (*EDCA_BE_UL) = 0x6ea42b;
6813 (*EDCA_BE_DL) = 0x6ea42b;
6820 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)));
6826 odm_EdcaChooseTrafficIdx(
6828 u8Byte cur_tx_bytes,
6829 u8Byte cur_rx_bytes,
6831 bool *pbIsCurRDLState
6839 if (cur_tx_bytes>(cur_rx_bytes*4))
6841 *pbIsCurRDLState=false;
6842 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
6847 *pbIsCurRDLState=true;
6848 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
6854 if (cur_rx_bytes>(cur_tx_bytes*4))
6856 *pbIsCurRDLState=true;
6857 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));
6862 *pbIsCurRDLState=false;
6863 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
6872 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)||(DM_ODM_SUPPORT_TYPE==ODM_ADSL))
6874 void odm_EdcaParaInit(
6878 prtl8192cd_priv priv = pDM_Odm->priv;
6879 int mode=priv->pmib->dot11BssType.net_work_type;
6881 static unsigned int slot_time, VO_TXOP, VI_TXOP, sifs_time;
6882 struct ParaRecord EDCA[4];
6884 memset(EDCA, 0, 4*sizeof(struct ParaRecord));
6889 if (mode & (ODM_WM_N24G|ODM_WM_N5G))
6892 if (mode & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G|ODM_WM_A))
6896 #if ((defined(RTL_MANUAL_EDCA))&&(DM_ODM_SUPPORT_TYPE==ODM_AP))
6897 if ( priv->pmib->dot11QosEntry.ManualEDCA ) {
6898 if ( OPMODE & WIFI_AP_STATE )
6899 memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord));
6901 memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord));
6905 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));
6908 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));
6911 #endif //RTL_MANUAL_EDCA
6914 if (OPMODE & WIFI_AP_STATE)
6916 memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord));
6918 if (mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
6919 memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
6921 memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord));
6925 memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord));
6927 if (mode & (ODM_WM_A|ODM_WM_G|ODM_WM_N24G|ODM_WM_N5G))
6928 memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord));
6930 memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord));
6935 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));
6939 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
6940 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time));
6941 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
6942 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + 2* slot_time));
6948 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));
6949 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));
6950 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));
6951 // ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00);
6953 priv->pshare->iot_mode_enable = 0;
6954 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
6955 if (priv->pshare->rf_ft_var.wifi_beq_iot)
6956 priv->pshare->iot_mode_VI_exist = 0;
6959 priv->pshare->iot_mode_BE_exist = 0;
6963 priv->pshare->BE_cwmax_enhance = 0;
6966 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
6967 priv->pshare->iot_mode_BE_exist = 0;
6969 priv->pshare->iot_mode_VO_exist = 0;
6973 ODM_ChooseIotMainSTA(
6978 prtl8192cd_priv priv = pDM_Odm->priv;
6979 bool bhighTP_found_pstat=false;
6981 if ((GET_ROOT(priv)->up_time % 2) == 0) {
6982 unsigned int tx_2s_avg = 0;
6983 unsigned int rx_2s_avg = 0;
6984 int i=0, aggReady=0;
6985 unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes);
6987 pstat->current_tx_bytes += pstat->tx_byte_cnt;
6988 pstat->current_rx_bytes += pstat->rx_byte_cnt;
6990 if (total_sum != 0) {
6991 if (total_sum <= 100) {
6992 tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum);
6993 rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum);
6995 tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100));
6996 rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100));
7001 #if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
7002 if (pstat->ht_cap_len) {
7003 if ((tx_2s_avg + rx_2s_avg) >=25 /*50*/) {
7005 priv->pshare->highTP_found_pstat = pstat;
7006 bhighTP_found_pstat=true;
7009 #elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
7011 aggReady += (pstat->ADDBA_ready[i]);
7012 if (pstat->ht_cap_len && aggReady)
7014 if ((tx_2s_avg + rx_2s_avg >= 25)) {
7015 priv->pshare->highTP_found_pstat = pstat;
7019 if (OPMODE & WIFI_STATION_STATE) {
7020 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
7021 if ((pstat->IOTPeer==HT_IOT_PEER_RALINK) && ((tx_2s_avg + rx_2s_avg) >= 45))
7023 if (pstat->is_ralink_sta && ((tx_2s_avg + rx_2s_avg) >= 45))
7025 priv->pshare->highTP_found_pstat = pstat;
7031 pstat->current_tx_bytes = pstat->tx_byte_cnt;
7032 pstat->current_rx_bytes = pstat->rx_byte_cnt;
7035 return bhighTP_found_pstat;
7043 unsigned char enable
7046 prtl8192cd_priv priv = pDM_Odm->priv;
7047 int mode=priv->pmib->dot11BssType.net_work_type;
7048 unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94;
7049 unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs;
7051 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7052 if (!(!priv->pmib->dot11OperationEntry.wifi_specific ||
7053 ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7055 || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7061 if ((mode & (ODM_WM_N24G|ODM_WM_N5G)) && (priv->pshare->ht_sta_num
7063 || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
7068 if (mode & (ODM_WM_N24G|ODM_WM_N5G|ODM_WM_G|ODM_WM_A)) {
7077 #if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
7078 if (priv->pshare->iot_mode_VO_exist) {
7079 // to separate AC_VI and AC_BE to avoid using the same EDCA settings
7080 if (priv->pshare->iot_mode_BE_exist) {
7088 vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
7090 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);
7093 #elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
7094 if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) {
7095 if (priv->pshare->iot_mode_VO_exist) {
7097 if (priv->pshare->iot_mode_BE_exist)
7101 vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
7112 vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time);
7115 ODM_Write4Byte(pDM_Odm, ODM_EDCA_VI_PARAM, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16)
7116 | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs);
7122 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7123 if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist)
7124 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (10 << 12) | (4 << 8) | 0x4f);
7126 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
7127 if (!enable) //if iot is disable ,maintain original BEQ PARAM
7129 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8)
7130 | (sifs_time + 3 * slot_time));
7135 unsigned int cw_max;
7136 unsigned int txop_close;
7138 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
7139 cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6);
7140 txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0);
7142 if (priv->pshare->txop_enlarge == 0xe) //if intel case
7143 txop = (txop_close ? 0 : (BE_TXOP*2));
7144 else //if other case
7145 txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge));
7148 if ((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd))
7151 txop=BE_TXOP*priv->pshare->txop_enlarge;
7155 if (priv->pshare->ht_sta_num
7157 || ((OPMODE & WIFI_AP_STATE) && (mode & (ODM_WM_N24G|ODM_WM_N5G)) &&
7158 priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum)
7163 if (priv->pshare->txop_enlarge == 0xe) {
7164 // is intel client, use a different edca value
7165 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f);
7166 priv->pshare->txop_enlarge = 2;
7168 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7170 else if (priv->pshare->txop_enlarge == 0xd) {
7171 // is intel ralink, use a different edca value
7172 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) | (4 << 12) | (3 << 8) | 0x19);
7173 priv->pshare->txop_enlarge = 2;
7179 if (pDM_Odm->RFType==ODM_2T2R)
7180 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
7181 (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
7183 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP)
7184 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
7185 (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
7187 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop << 16) |
7188 (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time));
7193 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP))
7194 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
7196 ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (BE_TXOP*2 << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time));
7211 struct rtl8192cd_priv *priv=pDM_Odm->priv;
7212 PSTA_INFO_T pstat = NULL;
7216 unsigned int switch_turbo = 0;
7218 ////////////////////////////////////////////////////////
7219 // if EDCA Turbo function is not supported or Manual EDCA Setting
7221 ////////////////////////////////////////////////////////
7222 if (!(pDM_Odm->SupportAbility&ODM_MAC_EDCA_TURBO)) {
7223 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO NOT SUPPORTED\n"));
7227 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM))
7228 if (priv->pmib->dot11QosEntry.ManualEDCA) {
7229 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: MANUAL SETTING\n"));
7234 #if !(DM_ODM_SUPPORT_TYPE &ODM_AP)
7235 //////////////////////////////////////////////////////
7236 //find high TP STA every 2s
7237 //////////////////////////////////////////////////////
7238 if ((GET_ROOT(priv)->up_time % 2) == 0)
7239 priv->pshare->highTP_found_pstat==NULL;
7243 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
7244 pstat = pDM_Odm->pODM_StaInfo[i];
7245 if (IS_STA_VALID(pstat) && (ODM_ChooseIotMainSTA(pDM_Odm, pstat))) //find the correct station
7249 //////////////////////////////////////////////////////
7250 //if highTP STA is not found, then return
7251 //////////////////////////////////////////////////////
7252 if (priv->pshare->highTP_found_pstat==NULL) {
7253 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO, ODM_DBG_LOUD, ("ODM_MAC_EDCA_TURBO OFF: NO HT STA FOUND\n"));
7258 pstat=priv->pshare->highTP_found_pstat;
7263 if (!priv->pmib->dot11OperationEntry.wifi_specific
7264 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7265 ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7266 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
7267 || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
7270 if (priv->pshare->iot_mode_enable &&
7271 ((priv->pshare->phw->VO_pkt_count > 50) ||
7272 (priv->pshare->phw->VI_pkt_count > 50) ||
7273 (priv->pshare->phw->BK_pkt_count > 50))) {
7274 priv->pshare->iot_mode_enable = 0;
7276 } else if ((!priv->pshare->iot_mode_enable) &&
7277 ((priv->pshare->phw->VO_pkt_count < 50) &&
7278 (priv->pshare->phw->VI_pkt_count < 50) &&
7279 (priv->pshare->phw->BK_pkt_count < 50))) {
7280 priv->pshare->iot_mode_enable++;
7286 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7287 if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific)
7288 #elif (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
7289 if (priv->pmib->dot11OperationEntry.wifi_specific)
7292 if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) {
7293 priv->pshare->iot_mode_VO_exist++;
7295 } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) {
7296 priv->pshare->iot_mode_VO_exist = 0;
7299 #if ((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
7300 if (priv->pshare->iot_mode_VO_exist) {
7301 //printk("[%s %d] BE_pkt_count=%d\n", __func__, __LINE__, priv->pshare->phw->BE_pkt_count);
7302 if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) {
7303 priv->pshare->iot_mode_BE_exist++;
7305 } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) {
7306 priv->pshare->iot_mode_BE_exist = 0;
7312 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7313 if (priv->pshare->rf_ft_var.wifi_beq_iot)
7315 if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) {
7316 priv->pshare->iot_mode_VI_exist++;
7318 } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) {
7319 priv->pshare->iot_mode_VI_exist = 0;
7326 else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) {
7327 if (priv->pshare->txop_enlarge) {
7328 priv->pshare->txop_enlarge = 0;
7329 if (priv->pshare->iot_mode_enable)
7334 #if (defined(CLIENT_MODE) && (DM_ODM_SUPPORT_TYPE==ODM_AP))
7335 if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7337 if (priv->pshare->iot_mode_enable &&
7338 (((priv->pshare->phw->VO_pkt_count > 50) ||
7339 (priv->pshare->phw->VI_pkt_count > 50) ||
7340 (priv->pshare->phw->BK_pkt_count > 50)) ||
7341 (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3]))))
7343 priv->pshare->iot_mode_enable = 0;
7346 else if ((!priv->pshare->iot_mode_enable) &&
7347 (((priv->pshare->phw->VO_pkt_count < 50) &&
7348 (priv->pshare->phw->VI_pkt_count < 50) &&
7349 (priv->pshare->phw->BK_pkt_count < 50)) &&
7350 (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3]))))
7352 priv->pshare->iot_mode_enable++;
7358 priv->pshare->phw->VO_pkt_count = 0;
7359 priv->pshare->phw->VI_pkt_count = 0;
7360 priv->pshare->phw->BK_pkt_count = 0;
7362 #if ((DM_ODM_SUPPORT_TYPE==ODM_ADSL)||((DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined WMM_VIBE_PRI)))
7363 priv->pshare->phw->BE_pkt_count = 0;
7366 #if (DM_ODM_SUPPORT_TYPE==ODM_AP)
7367 if (priv->pshare->rf_ft_var.wifi_beq_iot)
7368 priv->pshare->phw->VI_rx_pkt_count = 0;
7374 if ((priv->up_time % 2) == 0) {
7376 * decide EDCA content for different chip vendor
7379 #if (DM_ODM_SUPPORT_TYPE==ODM_ADSL)
7380 if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)
7382 #elif (DM_ODM_SUPPORT_TYPE==ODM_AP)
7383 if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific ||
7384 ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7386 || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7393 if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) {
7395 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
7396 if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
7398 if (pstat->is_intel_sta)
7401 if (priv->pshare->txop_enlarge != 0xe)
7403 priv->pshare->txop_enlarge = 0xe;
7405 if (priv->pshare->iot_mode_enable)
7409 else if (priv->pshare->txop_enlarge != 2)
7411 priv->pshare->txop_enlarge = 2;
7412 if (priv->pshare->iot_mode_enable)
7416 if (priv->pshare->txop_enlarge != 2)
7418 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
7419 if (pstat->IOTPeer==HT_IOT_PEER_INTEL)
7421 if (pstat->is_intel_sta)
7423 priv->pshare->txop_enlarge = 0xe;
7424 #if (DM_ODM_SUPPORT_TYPE &ODM_AP) && defined(USE_OUT_SRC)
7425 else if (pstat->IOTPeer==HT_IOT_PEER_RALINK)
7427 else if (pstat->is_ralink_sta)
7429 priv->pshare->txop_enlarge = 0xd;
7431 priv->pshare->txop_enlarge = 2;
7433 if (priv->pshare->iot_mode_enable)
7438 else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower)
7440 if (priv->pshare->txop_enlarge) {
7441 priv->pshare->txop_enlarge = 0;
7442 if (priv->pshare->iot_mode_enable)
7447 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&&( defined LOW_TP_TXOP))
7448 // for Intel IOT, need to enlarge CW MAX from 6 to 10
7449 if (pstat && pstat->is_intel_sta && (((pstat->tx_avarage+pstat->rx_avarage)>>10) <
7450 priv->pshare->rf_ft_var.cwmax_enhance_thd))
7452 if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable)
7454 priv->pshare->BE_cwmax_enhance = 1;
7458 if (priv->pshare->BE_cwmax_enhance) {
7459 priv->pshare->BE_cwmax_enhance = 0;
7466 priv->pshare->current_tx_bytes = 0;
7467 priv->pshare->current_rx_bytes = 0;
7470 #if ((DM_ODM_SUPPORT_TYPE==ODM_AP)&& defined( SW_TX_QUEUE))
7471 if ((priv->assoc_num > 1) && (AMPDU_ENABLE))
7473 if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd) {
7474 if ((priv->swq_en == 0)) {
7476 if (priv->pshare->txop_enlarge == 0)
7477 priv->pshare->txop_enlarge = 2;
7482 if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0))
7484 priv->pshare->txop_enlarge = 2;
7489 else if (priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd) {
7492 else if ((priv->swq_en == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) {
7493 priv->pshare->txop_enlarge = 2;
7501 if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2))
7503 if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) {
7504 unsigned int thd_tp;
7505 unsigned char under_thd;
7506 unsigned int curr_tp;
7508 if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G| ODM_WM_G))
7510 // Determine the upper bound throughput threshold.
7511 if (priv->pmib->dot11BssType.net_work_type & (ODM_WM_N24G|ODM_WM_N5G)) {
7512 if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num)
7513 thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
7515 thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n;
7518 thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g;
7520 // Determine to close txop.
7521 curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17);
7522 if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low)
7534 priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
7535 priv->pshare->rf_ft_var.low_tp_txop_count = 0;
7537 else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) {
7538 priv->pshare->rf_ft_var.low_tp_txop_count++;
7539 if (priv->pshare->rf_ft_var.low_tp_txop_close) {
7540 priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay;;
7542 if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay)
7545 priv->pshare->rf_ft_var.low_tp_txop_count = 0;
7546 priv->pshare->rf_ft_var.low_tp_txop_close = under_thd;
7552 priv->pshare->rf_ft_var.low_tp_txop_count = 0;
7559 ODM_IotEdcaSwitch( pDM_Odm, priv->pshare->iot_mode_enable );
7565 #if ( DM_ODM_SUPPORT_TYPE == ODM_MP)
7567 // 2011/07/26 MH Add an API for testing IQK fail case.
7570 ODM_CheckPowerStatus(
7574 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
7575 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
7576 RT_RF_POWER_STATE rtState;
7577 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
7579 // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.
7580 if (pMgntInfo->init_adpt_in_progress == true)
7582 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return true, due to initadapter"));
7587 // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.
7589 Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));
7590 if (Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)
7592 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return false, due to %d/%d/%d\n",
7593 Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));
7600 // need to ODM CE Platform
7601 //move to here for ANT detection mechanism using
7603 #if ((DM_ODM_SUPPORT_TYPE == ODM_MP)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
7608 u1Byte initial_gain_psd)
7610 //unsigned int val, rfval;
7614 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
7616 //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
7617 //DbgPrint("Reg908 = 0x%x\n",val);
7618 //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
7619 //rfval = PHY_QueryRFReg(Adapter, RF_PATH_A, 0x00, bRFRegOffsetMask);
7620 //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
7621 //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
7622 //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
7624 //Set DCO frequency index, offset=(40MHz/SamplePts)*point
7625 ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
7627 //Start PSD calculation, Reg808[22]=0->1
7628 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
7629 //Need to wait for HW PSD report
7630 ODM_StallExecution(30);
7631 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
7632 //Read PSD report, Reg8B4[15:0]
7633 psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
7635 psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
7648 Value = Value & 0xFFFF;
7652 if (Value <= dB_Invert_Table[i][11])
7660 return (96); // maximum 96 dB
7665 if (Value <= dB_Invert_Table[i][j])
7680 // PSD function will be moved to FW in future IC, but now is only implemented in MP platform
7681 // So PSD function will not be incorporated to common ODM
7683 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
7685 #define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD
7686 #define MODE_40M 0 //0:20M, 1:40M
7688 #define PSD_CHM 20 // Minimum channel number for BT AFH
7689 #define SIR_STEP_SIZE 3
7690 #define Smooth_Size_1 5
7691 #define Smooth_TH_1 3
7692 #define Smooth_Size_2 10
7693 #define Smooth_TH_2 4
7694 #define Smooth_Size_3 20
7695 #define Smooth_TH_3 4
7696 #define Smooth_Step_Size 5
7697 #define Adaptive_SIR 1
7698 //#if (RTL8723_FPGA_VERIFICATION == 1)
7699 //#define PSD_RESCAN 1
7701 //#define PSD_RESCAN 4
7703 #define SCAN_INTERVAL 700 //ms
7704 #define SYN_Length 5 // for 92D
7706 #define LNA_Low_Gain_1 0x64
7707 #define LNA_Low_Gain_2 0x5A
7708 #define LNA_Low_Gain_3 0x58
7710 #define pw_th_10dB 0x0
7711 #define pw_th_16dB 0x3
7713 #define FA_RXHP_TH1 5000
7714 #define FA_RXHP_TH2 1500
7715 #define FA_RXHP_TH3 800
7716 #define FA_RXHP_TH4 600
7717 #define FA_RXHP_TH5 500
7720 #define High_TP_Mode 1
7721 #define Low_TP_Mode 2
7728 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
7729 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
7730 //PSD Monitor Setting
7731 //Which path in ADC/DAC is turnned on for PSD: both I/Q
7732 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
7733 //Ageraged number: 8
7734 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
7735 pDM_Odm->bPSDinProcess = false;
7736 pDM_Odm->bUserAssignLevel = false;
7738 //pDM_Odm->bDMInitialGainEnable=true; //change the initialization to DIGinit
7740 //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
7741 //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
7742 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
7743 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte1, 0x32); // PSDDelay
7744 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
7746 //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
7754 u1Byte initial_gain_psd
7757 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
7758 //PADAPTER pAdapter;
7762 //2 Switch to CH11 to patch CH9 and CH13 DC tone
7763 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
7765 if (pDM_Odm->SupportICType== ODM_RTL8192D)
7767 if ((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
7769 ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
7770 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x25, 0xfffff, 0x643BC);
7771 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x26, 0xfffff, 0xFC038);
7772 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
7773 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x2B, 0xfffff, 0x41289);
7774 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x2C, 0xfffff, 0x01840);
7778 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x25, 0xfffff, 0x643BC);
7779 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x26, 0xfffff, 0xFC038);
7780 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
7781 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x2B, 0xfffff, 0x41289);
7782 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x2C, 0xfffff, 0x01840);
7787 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
7788 PSD_report[50] = psd_report;
7789 //Ch13 DC tone patch
7790 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
7791 PSD_report[70] = psd_report;
7793 //2 Switch to CH3 to patch CH1 and CH5 DC tone
7794 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
7797 if (pDM_Odm->SupportICType==ODM_RTL8192D)
7799 if ((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
7801 ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
7802 //PHY_SetRFReg(Adapter, RF_PATH_B, 0x25, 0xfffff, 0x643BC);
7803 //PHY_SetRFReg(Adapter, RF_PATH_B, 0x26, 0xfffff, 0xFC038);
7804 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
7805 //PHY_SetRFReg(Adapter, RF_PATH_B, 0x2B, 0xfffff, 0x61289);
7806 //PHY_SetRFReg(Adapter, RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
7810 //PHY_SetRFReg(Adapter, RF_PATH_A, 0x25, 0xfffff, 0x643BC);
7811 //PHY_SetRFReg(Adapter, RF_PATH_A, 0x26, 0xfffff, 0xFC038);
7812 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
7813 //PHY_SetRFReg(Adapter, RF_PATH_A, 0x2B, 0xfffff, 0x61289);
7814 //PHY_SetRFReg(Adapter, RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
7819 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
7820 PSD_report[10] = psd_report;
7822 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
7823 PSD_report[30] = psd_report;
7829 GoodChannelDecision(
7834 pu1Byte PSD_bitmap_memory)
7836 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
7837 //s4Byte TH1 = SSBT-0x15; // modify TH by Neil Chen
7838 s4Byte TH1= RSSI_BT+0x14;
7839 s4Byte TH2 = RSSI_BT+85;
7842 u1Byte bitmap, Smooth_size[3], Smooth_TH[3];
7844 u4Byte i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
7845 int start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
7847 // RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
7849 if ((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
7851 TH1 = RSSI_BT + 0x14;
7854 Smooth_size[0]=Smooth_Size_1;
7855 Smooth_size[1]=Smooth_Size_2;
7856 Smooth_size[2]=Smooth_Size_3;
7857 Smooth_TH[0]=Smooth_TH_1;
7858 Smooth_TH[1]=Smooth_TH_2;
7859 Smooth_TH[2]=Smooth_TH_3;
7860 Smooth_Interval[0]=16;
7861 Smooth_Interval[1]=15;
7862 Smooth_Interval[2]=13;
7864 if (pDM_Odm->SupportICType==ODM_RTL8723A)
7870 else if (RSSI_BT >=38) // >= -15dBm
7872 else if ((RSSI_BT >=33)&(RSSI_BT <38))
7873 TH1 = 99+(RSSI_BT-33); //0x63
7874 else if ((RSSI_BT >=26)&(RSSI_BT<33))
7875 TH1 = 99-(33-RSSI_BT)+2; //0x5e
7876 else if ((RSSI_BT >=24)&(RSSI_BT<26))
7877 TH1 = 88-((RSSI_BT-24)*3); //0x58
7878 else if ((RSSI_BT >=18)&(RSSI_BT<24))
7879 TH1 = 77+((RSSI_BT-18)*2);
7880 else if ((RSSI_BT >=14)&(RSSI_BT<18))
7881 TH1 = 63+((RSSI_BT-14)*2);
7882 else if ((RSSI_BT >=8)&(RSSI_BT<14))
7883 TH1 = 58+((RSSI_BT-8)*2);
7884 else if ((RSSI_BT >=3)&(RSSI_BT<8))
7885 TH1 = 52+(RSSI_BT-3);
7890 for (i = 0; i< 10; i++)
7895 for (i=0; i<80; i++)
7896 pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
7901 if (pDM_Odm->SupportICType==ODM_RTL8723A)
7903 TH1 =TH1-SIR_STEP_SIZE;
7905 while (good_cnt < PSD_CHMIN)
7908 if (pDM_Odm->SupportICType==ODM_RTL8723A)
7912 if ((TH1+SIR_STEP_SIZE) < TH2)
7913 TH1 += SIR_STEP_SIZE;
7919 if (TH1==(RSSI_BT+0x1E))
7921 if ((TH1+2) < (RSSI_BT+0x1E))
7927 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
7929 for (i = 0; i< 80; i++)
7931 if (PSD_report[i] < TH1)
7934 bit_idx = i -8*byte_idx;
7935 bitmap = PSD_bitmap[byte_idx];
7936 PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
7941 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
7944 //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
7945 for (i = 0; i<8; i++)
7946 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
7950 //1 Start of smoothing function
7956 for (n=0; n<Smooth_Interval[j]; n++)
7958 good_cnt_smoothing = 0;
7959 cur_bit_idx = start_bit_idx;
7960 cur_byte_idx = start_byte_idx;
7961 for ( i=0; i < Smooth_size[j]; i++)
7963 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
7964 if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
7965 good_cnt_smoothing++;
7969 if ( good_cnt_smoothing < Smooth_TH[j] )
7971 cur_bit_idx = start_bit_idx;
7972 cur_byte_idx = start_byte_idx;
7973 for ( i=0; i< Smooth_size[j] ; i++)
7975 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
7976 PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
7979 start_bit_idx = start_bit_idx + Smooth_Step_Size;
7980 while ( (start_bit_idx) > 7 )
7982 start_byte_idx= start_byte_idx+start_bit_idx/8;
7983 start_bit_idx = start_bit_idx%8;
7987 ODM_RT_TRACE( pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
7990 for (i = 0; i<8; i++)
7992 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
7994 if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1) //----- Add By Gary
7996 pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
7997 } // ------end by Gary
8005 for ( i = 0; i < 10; i++)
8007 for (n = 0; n < 8; n++)
8008 if ((PSD_bitmap[i]& BIT(n)) != 0)
8011 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: good channel cnt = %u",good_cnt));
8014 //RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
8015 for (i = 0; i <10; i++)
8016 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
8018 //Update bitmap memory
8019 for (i = 0; i < 80; i++)
8022 bit_idx = i -8*byte_idx;
8023 psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
8024 bitmap = PSD_bitmap_memory[i];
8025 PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
8037 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8038 //PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
8041 unsigned int pts, start_point, stop_point, initial_gain ;
8042 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
8043 static u1Byte psd_cnt=0;
8044 static u4Byte PSD_report[80], PSD_report_tmp;
8045 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
8046 u1Byte H2C_PSD_DATA[5]={0,0,0,0,0};
8047 static u1Byte H2C_PSD_DATA_last[5] ={0,0,0,0,0};
8048 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
8049 0,3,6,10,13,16,19,22,26,29};
8050 u1Byte n, i, channel, BBReset,tone_idx;
8051 u1Byte PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
8052 s4Byte PSD_skip_start, PSD_skip_stop;
8053 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
8054 u4Byte ReScan, Interval, Is40MHz;
8055 u8Byte curTxOkCnt, curRxOkCnt;
8056 int cur_byte_idx, cur_bit_idx;
8057 PADAPTER Adapter = pDM_Odm->Adapter;
8058 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
8059 //--------------2G band synthesizer for 92D switch RF channel using-----------------
8061 u4Byte SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
8062 u4Byte SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C}; // synthesizer RF register for 2G channel
8063 u4Byte SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}, // For CH1,2,4,9,10.11.12 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
8064 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840}, // For CH3,13,14
8065 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}}; // For Ch5,6,7,8
8066 //--------------------- Add by Gary for Debug setting ----------------------
8067 s4Byte psd_result = 0;
8068 u1Byte RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
8069 u1Byte rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
8070 //---------------------------------------------------------------------
8072 if (*(pDM_Odm->pbScanInProcess))
8074 if ((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
8076 //pHalData->bPSDactive=false;
8077 //ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 )
8078 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 900); //ms
8084 ReScan = PSD_RESCAN;
8085 Interval = SCAN_INTERVAL;
8089 if (init_memory == 0)
8091 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("Init memory\n"));
8092 for (i = 0; i < 80; i++)
8093 PSD_bitmap_memory[i] = 0xFF; // channel is always good
8098 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
8099 for (i = 0; i < 80; i++)
8102 //1 Backup Current Settings
8103 CurrentChannel = ODM_GetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
8104 //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
8105 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
8107 //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
8108 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
8111 Is40MHz = pMgntInfo->pHTInfo->bCurBW40MHz;
8113 ODM_RT_TRACE(pDM_Odm, COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
8115 //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
8116 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
8119 //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
8120 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
8122 //Force RX to stop TX immediately
8123 //PHY_SetRFReg(Adapter, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
8125 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
8127 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
8128 //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
8129 //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
8131 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
8132 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
8136 //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
8137 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
8140 //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
8141 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
8143 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
8144 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
8146 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
8147 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
8149 //1 Leave RX idle low power
8150 //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
8152 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
8153 //1 Fix initial gain
8154 //if (IS_HARDWARE_TYPE_8723AE(Adapter))
8155 //RSSI_BT = pHalData->RSSI_BT;
8156 //else if ((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
8157 // RSSI_BT = RSSI_BT_new;
8159 if ((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
8160 RSSI_BT=pDM_Odm->RSSI_BT; //need to check C2H to pDM_Odm RSSI BT
8162 else if ((pDM_Odm->SupportICType==ODM_RTL8192C)||(pDM_Odm->SupportICType==ODM_RTL8192D))
8163 RSSI_BT = RSSI_BT_new;
8167 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
8169 if (pDM_Odm->SupportICType==ODM_RTL8723A)
8171 //Neil add--2011--10--12
8172 //2 Initial Gain index
8173 if (RSSI_BT >=35) // >= -15dBm
8174 initial_gain_psd = RSSI_BT*2;
8175 else if ((RSSI_BT >=33)&(RSSI_BT<35))
8176 initial_gain_psd = RSSI_BT*2+6;
8177 else if ((RSSI_BT >=24)&(RSSI_BT<33))
8178 initial_gain_psd = 70-(31-RSSI_BT);
8179 else if ((RSSI_BT >=19)&(RSSI_BT<24))
8180 initial_gain_psd = 64-((24-RSSI_BT)*4);
8181 else if ((RSSI_BT >=14)&(RSSI_BT<19))
8182 initial_gain_psd = 44-((18-RSSI_BT)*2);
8183 else if ((RSSI_BT >=8)&(RSSI_BT<14))
8184 initial_gain_psd = 35-(14-RSSI_BT);
8186 initial_gain_psd = 0x1B;
8190 if (rssi_ctrl == 1) // just for debug!!
8191 initial_gain_psd = RSSI_BT_new ;
8195 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
8200 //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
8201 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
8203 //initialGainUpper = 0x5E; //Modify by neil chen
8205 if (pDM_Odm->bUserAssignLevel)
8207 pDM_Odm->bUserAssignLevel = false;
8208 initialGainUpper = 0x7f;
8212 initialGainUpper = 0x5E;
8216 if (initial_gain_psd < 0x1a)
8217 initial_gain_psd = 0x1a;
8218 if (initial_gain_psd > initialGainUpper)
8219 initial_gain_psd = initialGainUpper;
8222 if (pDM_Odm->SupportICType==ODM_RTL8723A)
8223 SSBT = RSSI_BT * 2 +0x3E;
8224 else if ((pDM_Odm->SupportICType==ODM_RTL8192C)||(pDM_Odm->SupportICType==ODM_RTL8192D))
8226 RSSI_BT = initial_gain_psd;
8230 //if (IS_HARDWARE_TYPE_8723AE(Adapter))
8231 // SSBT = RSSI_BT * 2 +0x3E;
8232 //else if ((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
8234 // RSSI_BT = initial_gain_psd;
8237 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
8238 ODM_RT_TRACE( pDM_Odm,COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
8239 //DbgPrint("PSD: SSBT= %d", SSBT);
8241 //pMgntInfo->bDMInitialGainEnable = false;
8242 pDM_Odm->bDMInitialGainEnable = false;
8243 initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
8244 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd);
8246 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
8248 //pts value = 128, 256, 512, 1024
8253 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
8257 else if (pts == 256)
8259 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
8263 else if (pts == 512)
8265 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
8271 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
8277 //3 Skip WLAN channels if WLAN busy
8279 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
8280 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
8281 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
8282 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
8286 wlan_channel = CurrentChannel & 0x0f;
8288 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d\n", wlan_channel, Is40MHz));
8289 if (pDM_Odm->SupportICType==ODM_RTL8723A)
8291 #if (BT_30_SUPPORT == 1)
8292 if (pDM_Odm->bBtHsOperation)
8294 if (pDM_Odm->bLinked)
8298 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
8299 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
8303 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
8304 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
8310 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
8311 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
8313 if (PSD_skip_start < 0)
8315 if (PSD_skip_stop >80)
8321 if ((curRxOkCnt+curTxOkCnt) > 5)
8325 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
8326 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
8330 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
8331 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
8334 if (PSD_skip_start < 0)
8336 if (PSD_skip_stop >80)
8343 if ((curRxOkCnt+curTxOkCnt) > 1000)
8345 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
8346 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
8350 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d\n", PSD_skip_start, PSD_skip_stop));
8356 channel = (n/20)*4 + 1;
8358 if (pDM_Odm->SupportICType==ODM_RTL8192D)
8374 if ((pHalData->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY))
8376 for (i = 0; i < SYN_Length; i++)
8377 ODM_SetRFReg(pDM_Odm, RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
8379 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
8380 ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
8382 else // DualMAC_DualPHY 2G
8384 for (i = 0; i < SYN_Length; i++)
8385 ODM_SetRFReg(pDM_Odm, RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
8387 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
8391 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
8394 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
8396 PSD_report[n] = SSBT;
8397 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped\n", n));
8401 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
8403 if ( PSD_report_tmp > PSD_report[n])
8404 PSD_report[n] = PSD_report_tmp;
8409 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
8414 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
8415 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
8417 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
8421 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
8423 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
8424 //1 Restore Current Settings
8426 pDM_Odm->bDMInitialGainEnable = true;
8427 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
8428 // restore originl center frequency
8429 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
8432 if (pDM_Odm->SupportICType==ODM_RTL8192D)
8434 if ((pHalData->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY))
8436 PHY_SetRFReg(Adapter, RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
8437 PHY_SetRFReg(Adapter, RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
8438 PHY_SetRFReg(Adapter, RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
8439 PHY_SetRFReg(Adapter, RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
8440 PHY_SetRFReg(Adapter, RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
8441 PHY_SetRFReg(Adapter, RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
8443 else // DualMAC_DualPHY
8445 PHY_SetRFReg(Adapter, RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
8446 PHY_SetRFReg(Adapter, RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
8447 PHY_SetRFReg(Adapter, RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
8448 PHY_SetRFReg(Adapter, RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
8449 PHY_SetRFReg(Adapter, RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
8453 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
8454 //Restore RX idle low power
8455 if (RxIdleLowPwr == true)
8456 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
8459 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d\n",psd_cnt));
8460 if (psd_cnt < ReScan)
8461 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);
8466 //DbgPrint("psd_report[%d]= %d\n", 2402+i, PSD_report[i]);
8467 RT_TRACE( COMP_PSD, DBG_LOUD,("psd_report[%d]= %d\n", 2402+i, PSD_report[i]));
8470 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
8472 if (pDM_Odm->SupportICType==ODM_RTL8723A)
8477 //2 Restore H2C PSD Data to Last Data
8478 H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
8479 H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
8480 H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
8481 H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
8482 H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
8485 //2 Translate 80bit channel map to 40bit channel
8490 cur_byte_idx = i*2 + n/4;
8491 cur_bit_idx = (n%4)*2;
8492 if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
8493 H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
8495 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
8498 //3 To Compare the difference
8501 if (H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
8503 FillH2CCmd(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
8504 ODM_RT_TRACE(pDM_Odm, COMP_PSD, DBG_LOUD,("Need to Update the AFH Map\n"));
8510 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("Not need to Update\n"));
8513 //pHalData->bPSDactive=false;
8514 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 900);
8515 ODM_RT_TRACE( pDM_Odm,COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
8520 //Neil for Get BT RSSI
8521 // Be Triggered by BT C2H CMD
8537 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8539 //if (IS_HARDWARE_TYPE_8723AE(Adapter))
8541 if (pDM_Odm->SupportICType == ODM_RTL8723A) //may need to add other IC type
8543 if (pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
8545 #if (BT_30_SUPPORT == 1)
8546 if (pDM_Odm->bBtDisabled) //need to check upper layer connection
8548 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
8552 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
8553 //if (pHalData->bPSDactive ==false)
8555 pDM_Odm->bPSDinProcess = true;
8556 //pHalData->bPSDactive=true;
8557 odm_PSD_Monitor(pDM_Odm);
8558 pDM_Odm->bPSDinProcess = false;
8564 odm_PSDMonitorCallback(
8568 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
8569 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8570 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
8574 PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
8576 ODM_PSDMonitor(pDM_Odm);
8581 odm_PSDMonitorWorkItemCallback(
8585 PADAPTER Adapter = (PADAPTER)pContext;
8586 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8587 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
8590 ODM_PSDMonitor(pDM_Odm);
8595 //cosa debug tool need to modify
8604 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
8605 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
8606 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
8608 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
8611 pDM_Odm->RSSI_BT = (u1Byte)btRssi;
8612 pDM_Odm->bUserAssignLevel = true;
8613 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms
8617 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
8623 //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
8628 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
8629 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
8632 pRX_HP_Table->RXHP_enable = true;
8633 pRX_HP_Table->RXHP_flag = 0;
8634 pRX_HP_Table->PSD_func_trigger = 0;
8635 pRX_HP_Table->Pre_IGI = 0x20;
8636 pRX_HP_Table->Cur_IGI = 0x20;
8637 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
8638 pRX_HP_Table->Pre_pw_th = pw_th_10dB;
8639 for (index=0; index<80; index++)
8640 pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
8642 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8643 pRX_HP_Table->TP_Mode = Idle_Mode;
8651 #if ( DM_ODM_SUPPORT_TYPE & (ODM_MP))
8652 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
8653 PADAPTER Adapter = pDM_Odm->Adapter;
8654 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
8655 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
8656 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
8657 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
8661 s1Byte Intf_diff_idx, MIN_Intf_diff_idx = 16;
8663 u1Byte ch_map_intf_5M[17] = {0};
8664 static u4Byte FA_TH = 0;
8665 static u1Byte psd_intf_flag = 0;
8666 static s4Byte curRssi = 0;
8667 static s4Byte preRssi = 0;
8668 static u1Byte PSDTriggerCnt = 1;
8670 u1Byte RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31); // for debug!!
8672 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8673 static s8Byte lastTxOkCnt = 0, lastRxOkCnt = 0;
8674 s8Byte curTxOkCnt, curRxOkCnt;
8676 s8Byte TP_Acc3, TP_Acc5;
8677 static s8Byte TP_Buff[5] = {0};
8678 static u1Byte pre_state = 0, pre_state_flag = 0;
8679 static u1Byte Intf_HighTP_flag = 0, De_counter = 16;
8680 static u1Byte TP_Degrade_flag = 0;
8682 static u1Byte LatchCnt = 0;
8684 if ((pDM_Odm->SupportICType == ODM_RTL8723A)||(pDM_Odm->SupportICType == ODM_RTL8188E))
8686 //AGC RX High Power Mode is only applied on 2G band in 92D!!!
8687 if (pDM_Odm->SupportICType == ODM_RTL8192D)
8689 if (*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
8693 if (!(pDM_Odm->SupportAbility==ODM_BB_RXHP))
8698 if (RX_HP_enable == 1)
8699 pRX_HP_Table->RXHP_enable = false;
8701 pRX_HP_Table->RXHP_enable = true;
8703 if (pRX_HP_Table->RXHP_enable == false)
8705 if (pRX_HP_Table->RXHP_flag == 1)
8707 pRX_HP_Table->RXHP_flag = 0;
8713 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8714 //2 Record current TP for USB interface
8715 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
8716 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
8717 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
8718 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
8720 curTPOkCnt = curTxOkCnt+curRxOkCnt;
8721 TP_Buff[0] = curTPOkCnt; // current TP
8722 TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
8723 TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
8726 pRX_HP_Table->TP_Mode = Idle_Mode;
8727 else if ((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
8728 pRX_HP_Table->TP_Mode = Low_TP_Mode;
8730 pRX_HP_Table->TP_Mode = High_TP_Mode;
8732 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
8733 // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
8734 // When LatchCnt = 0, we would Get PSD result.
8735 if (TP_Degrade_flag == 1)
8740 TP_Degrade_flag = 0;
8743 // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
8744 // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
8745 if (Intf_HighTP_flag == 1)
8748 if (De_counter == 0)
8750 Intf_HighTP_flag = 0;
8756 //2 AGC RX High Power Mode by PSD only applied to STA Mode
8757 //3 NOT applied 1. Ad Hoc Mode.
8758 //3 NOT applied 2. AP Mode
8759 if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
8761 Is40MHz = *(pDM_Odm->pBandWidth);
8762 curRssi = pDM_Odm->RSSI_Min;
8763 cur_channel = ODM_GetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
8764 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
8765 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
8766 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
8767 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
8768 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
8769 //2 PSD function would be triggered
8770 //3 1. Every 4 sec for PCIE
8771 //3 2. Before TP Mode (Idle TP<4kbps) for USB
8772 //3 3. After TP Mode (High TP) for USB
8773 if ((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0)) // Only RSSI>TH and RX_HP_flag=0 will Do PSD process
8775 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8776 //2 Before TP Mode ==> PSD would be trigger every 4 sec
8777 if (pRX_HP_Table->TP_Mode == Idle_Mode) //2.1 less wlan traffic <4kbps
8780 if (PSDTriggerCnt == 1)
8782 odm_PSD_RXHP(pDM_Odm);
8783 pRX_HP_Table->PSD_func_trigger = 1;
8790 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8792 //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
8793 if (pRX_HP_Table->TP_Mode == High_TP_Mode)
8795 if ((pre_state_flag == 0)&&(LatchCnt == 0))
8798 if ((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
8801 if (pre_state == 3) // hit pre_state condition => consecutive 3 times
8813 //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
8814 if (pre_state_flag == 1)
8816 if (((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3)) // degrade 20%
8818 odm_PSD_RXHP(pDM_Odm);
8819 pRX_HP_Table->PSD_func_trigger = 1;
8820 TP_Degrade_flag = 1;
8824 else if (((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
8826 odm_PSD_RXHP(pDM_Odm);
8827 pRX_HP_Table->PSD_func_trigger = 1;
8828 TP_Degrade_flag = 1;
8832 else if (((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
8834 odm_PSD_RXHP(pDM_Odm);
8835 pRX_HP_Table->PSD_func_trigger = 1;
8836 TP_Degrade_flag = 1;
8845 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8848 TP_Buff[4-i] = TP_Buff[3-i];
8851 //2 Update PSD bitmap according to PSD report
8852 if ((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
8854 //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
8855 for (i = 0 ; i < 16 ; i++)
8858 for (j = 0; j < 5 ; j++)
8859 sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
8863 ch_map_intf_5M[i] = 1; // interference flag
8866 //=============just for debug=========================
8867 //for (i=0;i<16;i++)
8868 //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
8869 //===============================================
8870 //2 Mask target channel 5M index
8871 for (i = 0; i < (4+4*Is40MHz) ; i++)
8873 ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;
8877 for (i = 0; i < 16; i++)
8879 if (ch_map_intf_5M[i] == 1)
8881 psd_intf_flag = 1; // interference is detected!!!
8886 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
8887 if (pRX_HP_Table->TP_Mode!=Idle_Mode)
8889 if (psd_intf_flag == 1) // to avoid psd_intf_flag always 1
8891 Intf_HighTP_flag = 1;
8892 De_counter = 32; // 0x1E -> 0x3E needs 32 times by each IGI step =1
8896 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
8897 //2 Distance between target channel and interference
8898 for (i = 0; i < 16; i++)
8900 if (ch_map_intf_5M[i] == 1)
8902 Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));
8903 if (Intf_diff_idx < MIN_Intf_diff_idx)
8904 MIN_Intf_diff_idx = Intf_diff_idx; // the min difference index between interference and target
8907 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx));
8908 //2 Choose False Alarm Threshold
8909 switch (MIN_Intf_diff_idx) {
8914 FA_TH = FA_RXHP_TH1;
8918 FA_TH = FA_RXHP_TH2;
8922 FA_TH = FA_RXHP_TH3;
8926 FA_TH = FA_RXHP_TH4;
8934 FA_TH = FA_RXHP_TH5;
8937 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
8938 pRX_HP_Table->PSD_func_trigger = 0;
8940 //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
8941 if (pRX_HP_Table->RXHP_flag == 1)
8943 if ((curRssi > 80)&&(preRssi < 80))
8945 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
8947 else if ((curRssi < 80)&&(preRssi > 80))
8949 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
8951 else if ((curRssi > 72)&&(preRssi < 72))
8953 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
8955 else if ((curRssi < 72)&&( preRssi > 72))
8957 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
8959 else if (curRssi < 68) //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
8961 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
8962 pRX_HP_Table->RXHP_flag = 0; // Back to Normal DIG Mode
8966 else // pRX_HP_Table->RXHP_flag == 0
8968 //1 Decide whether to enter AGC RX High Power Mode
8969 if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&
8970 (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
8974 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
8976 else if (curRssi > 72)
8978 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
8982 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
8984 pRX_HP_Table->Cur_pw_th = pw_th_16dB; //RegC54[9:8]=2'b11: to enter AGC Flow 3
8985 pRX_HP_Table->First_time_enter = true;
8986 pRX_HP_Table->RXHP_flag = 1; // RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
8990 odm_Write_RXHP(pDM_Odm);
8992 #endif //#if ( DM_ODM_SUPPORT_TYPE & (ODM_MP))
8993 #endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
8996 void odm_Write_RXHP(
8999 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
9002 if (pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
9004 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
9005 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
9008 if (pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
9010 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th); // RegC54[9:8]=2'b11: AGC Flow 3
9013 if (pRX_HP_Table->RXHP_flag == 0)
9015 pRX_HP_Table->Cur_IGI = 0x20;
9019 currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
9020 if (currentIGI<0x50)
9022 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
9023 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
9026 pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
9027 pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
9036 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
9037 PADAPTER Adapter = pDM_Odm->Adapter;
9038 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
9039 unsigned int pts, start_point, stop_point, initial_gain ;
9040 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
9041 static u1Byte psd_cnt=0;
9042 static u4Byte PSD_report[80], PSD_report_tmp;
9043 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
9044 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
9045 0,3,6,10,13,16,19,22,26,29};
9046 u1Byte n, i, channel, BBReset,tone_idx;
9047 u1Byte PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
9048 s4Byte PSD_skip_start, PSD_skip_stop;
9049 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
9050 u4Byte ReScan, Interval, Is40MHz;
9051 u8Byte curTxOkCnt, curRxOkCnt;
9052 //--------------2G band synthesizer for 92D switch RF channel using-----------------
9054 u4Byte SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
9055 u4Byte SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C}; // synthesizer RF register for 2G channel
9056 u4Byte SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}, // For CH1,2,4,9,10.11.12 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
9057 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840}, // For CH3,13,14
9058 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}}; // For Ch5,6,7,8
9059 //--------------------- Add by Gary for Debug setting ----------------------
9060 s4Byte psd_result = 0;
9061 u1Byte RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
9062 u1Byte rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
9063 //---------------------------------------------------------------------
9065 if (pMgntInfo->bScanInProgress)
9070 ReScan = PSD_RESCAN;
9071 Interval = SCAN_INTERVAL;
9075 if (init_memory == 0)
9077 RT_TRACE( COMP_PSD, DBG_LOUD,("Init memory\n"));
9078 for (i = 0; i < 80; i++)
9079 PSD_bitmap_memory[i] = 0xFF; // channel is always good
9084 RT_TRACE(COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
9085 for (i = 0; i < 80; i++)
9089 //1 Backup Current Settings
9090 CurrentChannel = ODM_GetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
9091 if (pDM_Odm->SupportICType == ODM_RTL8192D)
9093 //2 Record Current synthesizer parameters based on current channel
9094 if ((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
9096 SYN_RF25 = ODM_GetRFReg(pDM_Odm, RF_PATH_B, 0x25, bMaskDWord);
9097 SYN_RF26 = ODM_GetRFReg(pDM_Odm, RF_PATH_B, 0x26, bMaskDWord);
9098 SYN_RF27 = ODM_GetRFReg(pDM_Odm, RF_PATH_B, 0x27, bMaskDWord);
9099 SYN_RF2B = ODM_GetRFReg(pDM_Odm, RF_PATH_B, 0x2B, bMaskDWord);
9100 SYN_RF2C = ODM_GetRFReg(pDM_Odm, RF_PATH_B, 0x2C, bMaskDWord);
9102 else // DualMAC_DualPHY 2G
9104 SYN_RF25 = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x25, bMaskDWord);
9105 SYN_RF26 = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x26, bMaskDWord);
9106 SYN_RF27 = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x27, bMaskDWord);
9107 SYN_RF2B = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x2B, bMaskDWord);
9108 SYN_RF2C = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x2C, bMaskDWord);
9111 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
9112 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
9113 Is40MHz = *(pDM_Odm->pBandWidth);
9114 ODM_RT_TRACE(pDM_Odm, COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
9116 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
9119 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
9120 //Force RX to stop TX immediately
9121 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
9123 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
9124 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
9125 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
9127 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
9129 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
9130 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
9131 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
9132 //1 Leave RX idle low power
9133 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
9134 //1 Fix initial gain
9135 RSSI_BT = RSSI_BT_new;
9136 RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
9138 if (rssi_ctrl == 1) // just for debug!!
9139 initial_gain_psd = RSSI_BT_new;
9141 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
9143 RT_TRACE(COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
9145 initialGainUpper = 0x54;
9147 RSSI_BT = initial_gain_psd;
9150 //RT_TRACE( COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
9151 RT_TRACE( COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
9153 pDM_Odm->bDMInitialGainEnable = false;
9154 initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
9155 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd);
9157 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
9159 //pts value = 128, 256, 512, 1024
9164 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
9168 else if (pts == 256)
9170 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
9174 else if (pts == 512)
9176 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
9182 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
9188 //3 Skip WLAN channels if WLAN busy
9189 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
9190 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
9191 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
9192 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
9196 wlan_channel = CurrentChannel & 0x0f;
9198 RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d\n", wlan_channel, Is40MHz));
9200 if ((curRxOkCnt+curTxOkCnt) > 1000)
9202 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
9203 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
9206 RT_TRACE(COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d\n", PSD_skip_start, PSD_skip_stop));
9212 channel = (n/20)*4 + 1;
9213 if (pDM_Odm->SupportICType == ODM_RTL8192D)
9228 if ((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
9230 for (i = 0; i < SYN_Length; i++)
9231 ODM_SetRFReg(pDM_Odm, RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
9233 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
9234 ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
9236 else // DualMAC_DualPHY 2G
9238 for (i = 0; i < SYN_Length; i++)
9239 ODM_SetRFReg(pDM_Odm, RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
9241 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
9245 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
9248 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
9250 PSD_report[n] = initial_gain_psd;//SSBT;
9251 ODM_RT_TRACE(pDM_Odm,COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped\n", n));
9255 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
9257 if ( PSD_report_tmp > PSD_report[n])
9258 PSD_report[n] = PSD_report_tmp;
9263 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
9268 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
9269 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
9271 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
9274 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
9276 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
9277 //1 Restore Current Settings
9279 pDM_Odm->bDMInitialGainEnable= true;
9280 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
9281 // restore originl center frequency
9282 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
9283 if (pDM_Odm->SupportICType == ODM_RTL8192D)
9285 if ((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
9287 ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
9288 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
9289 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
9290 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
9291 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
9292 ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
9294 else // DualMAC_DualPHY
9296 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
9297 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
9298 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
9299 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
9300 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
9304 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
9305 //Restore RX idle low power
9306 if (RxIdleLowPwr == true)
9307 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
9310 //gPrint("psd cnt=%d\n", psd_cnt);
9311 ODM_RT_TRACE(pDM_Odm,COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d\n",psd_cnt));
9312 if (psd_cnt < ReScan)
9314 ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval); //ms
9320 RT_TRACE( COMP_PSD, DBG_LOUD,("psd_report[%d]= %d\n", 2402+i, PSD_report[i]));
9321 //DbgPrint("psd_report[%d]= %d\n", 2402+i, PSD_report[i]);
9323 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
9329 odm_PSD_RXHPCallback(
9333 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
9334 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9335 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
9336 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
9338 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
9340 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
9342 odm_PSD_RXHP(pDM_Odm);
9345 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
9351 odm_PSD_RXHPWorkitemCallback(
9355 PADAPTER pAdapter = (PADAPTER)pContext;
9356 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
9357 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
9359 odm_PSD_RXHP(pDM_Odm);
9362 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_MP)
9365 // 2011/09/22 MH Add for 92D global spin lock utilization.
9368 odm_GlobalAdapterCheck(
9373 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
9375 //sherry delete flag 20110517
9376 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
9377 ACQUIRE_GLOBAL_SPINLOCK(&GlobalSpinlockForGlobalAdapterList);
9379 ACQUIRE_GLOBAL_MUTEX(GlobalMutexForGlobalAdapterList);
9382 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
9383 RELEASE_GLOBAL_SPINLOCK(&GlobalSpinlockForGlobalAdapterList);
9385 RELEASE_GLOBAL_MUTEX(GlobalMutexForGlobalAdapterList);
9390 } // odm_GlobalAdapterCheck
9395 // 2011/12/02 MH Copy from MP oursrc for temporarily test.
9397 #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
9399 odm_OFDMTXPathDiversity_92C(
9402 // HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9403 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
9404 PRT_WLAN_STA pEntry;
9405 u1Byte i, DefaultRespPath = 0;
9406 s4Byte MinRSSI = 0xFF;
9407 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
9408 pDM_PDTable->OFDMTXPath = 0;
9411 if (pMgntInfo->mAssoc)
9413 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n",
9414 Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1]));
9415 if (Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1])
9417 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0);
9418 MinRSSI = Adapter->RxStats.RxRSSIPercentage[1];
9419 DefaultRespPath = 0;
9420 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n"));
9424 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT0;
9425 MinRSSI = Adapter->RxStats.RxRSSIPercentage[0];
9426 DefaultRespPath = 1;
9427 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n"));
9429 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath));
9432 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
9434 if (IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
9435 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
9437 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
9441 if (pEntry->bAssociated)
9443 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n",
9444 pEntry->AID+1, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1]));
9446 if (pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1])
9448 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AID+1));
9449 //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AID+1));
9450 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AID+1));
9451 if (pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI)
9453 MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1];
9454 DefaultRespPath = 0;
9459 pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AID+1);
9460 //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AID+1));
9461 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AID+1));
9462 if (pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI)
9464 MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0];
9465 DefaultRespPath = 1;
9476 pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath;
9481 odm_IsConnected_92C(
9485 PRT_WLAN_STA pEntry;
9486 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
9488 bool bConnected=false;
9490 if (pMgntInfo->mAssoc)
9496 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
9498 if (IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
9499 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
9501 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
9505 if (pEntry->bAssociated)
9522 odm_ResetPathDiversity_92C(
9526 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9527 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
9528 PRT_WLAN_STA pEntry;
9531 pHalData->RSSI_test = false;
9532 pDM_PDTable->CCK_Pkt_Cnt = 0;
9533 pDM_PDTable->OFDM_Pkt_Cnt = 0;
9534 pHalData->CCK_Pkt_Cnt =0;
9535 pHalData->OFDM_Pkt_Cnt =0;
9537 if (pDM_PDTable->CCKPathDivEnable == true)
9538 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); //RX path = PathAB
9542 pDM_PDTable->RSSI_CCK_Path_cnt[i]=0;
9543 pDM_PDTable->RSSI_CCK_Path[i] = 0;
9545 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
9547 if (IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
9548 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
9550 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
9554 pEntry->rssi_stat.CCK_Pkt_Cnt = 0;
9555 pEntry->rssi_stat.OFDM_Pkt_Cnt = 0;
9558 pEntry->rssi_stat.RSSI_CCK_Path_cnt[i] = 0;
9559 pEntry->rssi_stat.RSSI_CCK_Path[i] = 0;
9569 odm_CCKTXPathDiversity_92C(
9573 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9574 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
9575 PRT_WLAN_STA pEntry;
9576 s4Byte MinRSSI = 0xFF;
9577 u1Byte i, DefaultRespPath = 0;
9578 // bool bBModePathDiv = false;
9579 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
9582 if (pMgntInfo->mAssoc)
9584 if (pHalData->OFDM_Pkt_Cnt == 0)
9588 if (pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded
9589 pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1);
9591 pDM_PDTable->RSSI_CCK_Path[i] = 0;
9593 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n",
9594 pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1]));
9595 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",
9596 pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1]));
9598 if (pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1])
9600 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
9601 MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
9602 DefaultRespPath = 0;
9603 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
9605 else if (pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1])
9607 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT0;
9608 MinRSSI = pDM_PDTable->RSSI_CCK_Path[0];
9609 DefaultRespPath = 1;
9610 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n"));
9614 if ((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI))
9616 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0);
9617 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n"));
9618 MinRSSI = pDM_PDTable->RSSI_CCK_Path[1];
9619 DefaultRespPath = 0;
9623 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n"));
9627 else //Follow OFDM decision
9629 pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0);
9630 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n",
9631 pDM_PDTable->CCKTXPath &BIT0));
9635 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
9637 if (IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
9638 pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i);
9640 pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i);
9644 if (pEntry->bAssociated)
9646 if (pEntry->rssi_stat.OFDM_Pkt_Cnt == 0)
9650 if (pEntry->rssi_stat.RSSI_CCK_Path_cnt[i] > 1)
9651 pEntry->rssi_stat.RSSI_CCK_Path[i] = pEntry->rssi_stat.RSSI_CCK_Path[i] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[i]-1);
9653 pEntry->rssi_stat.RSSI_CCK_Path[i] = 0;
9655 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n",
9656 pEntry->AID+1, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1]));
9658 if (pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1])
9660 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AID+1));
9661 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AID+1));
9662 if (pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI)
9664 MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
9665 DefaultRespPath = 0;
9668 else if (pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1])
9670 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AID+1);
9671 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AID+1));
9672 if (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)
9674 MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0];
9675 DefaultRespPath = 1;
9680 if ((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI))
9682 pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AID+1));
9683 MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1];
9684 DefaultRespPath = 0;
9685 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AID+1));
9689 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AID+1));
9693 else //Follow OFDM decision
9695 pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AID+1)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AID+1));
9696 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n",
9697 pEntry->AID+1, (pDM_PDTable->CCKTXPath & BIT(pEntry->AID+1))>>(pEntry->AID+1)));
9707 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C:MinRSSI=%d\n",MinRSSI));
9709 if (MinRSSI == 0xFF)
9710 DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
9712 pDM_PDTable->CCKDefaultRespPath = DefaultRespPath;
9718 odm_PathDiversityAfterLink_92C(
9722 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9723 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
9724 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
9725 u1Byte DefaultRespPath=0;
9727 if ((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg != 1) || (pHalData->eRFPowerState == eRfOff))
9729 if (pHalData->PathDivCfg == 0)
9731 RT_TRACE( COMP_SWAS, DBG_LOUD, ("No ODM_TXPathDiversity()\n"));
9735 RT_TRACE( COMP_SWAS, DBG_LOUD, ("2T ODM_TXPathDiversity()\n"));
9739 if (!odm_IsConnected_92C(Adapter))
9741 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity(): No Connections\n"));
9746 if (pDM_PDTable->TrainingState == 0)
9748 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() ==>\n"));
9749 odm_OFDMTXPathDiversity_92C(Adapter);
9751 if ((pDM_PDTable->CCKPathDivEnable == true) && (pDM_PDTable->OFDM_Pkt_Cnt < 100))
9753 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=0\n"));
9755 if (pDM_PDTable->CCK_Pkt_Cnt > 300)
9756 pDM_PDTable->Timer = 20;
9757 else if (pDM_PDTable->CCK_Pkt_Cnt > 100)
9758 pDM_PDTable->Timer = 60;
9760 pDM_PDTable->Timer = 250;
9761 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: timer=%d\n",pDM_PDTable->Timer));
9763 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // RX path = PathA
9764 pDM_PDTable->TrainingState = 1;
9765 pHalData->RSSI_test = true;
9766 ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
9770 pDM_PDTable->CCKTXPath = pDM_PDTable->OFDMTXPath;
9771 DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
9772 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Skip odm_CCKTXPathDiversity_92C, DefaultRespPath is OFDM\n"));
9773 odm_SetRespPath_92C(Adapter, DefaultRespPath);
9774 odm_ResetPathDiversity_92C(Adapter);
9775 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
9778 else if (pDM_PDTable->TrainingState == 1)
9780 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=1\n"));
9781 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // RX path = PathB
9782 pDM_PDTable->TrainingState = 2;
9783 ODM_SetTimer( pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, pDM_PDTable->Timer); //ms
9787 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: TrainingState=2\n"));
9788 pDM_PDTable->TrainingState = 0;
9789 odm_CCKTXPathDiversity_92C(Adapter);
9790 if (pDM_PDTable->OFDM_Pkt_Cnt != 0)
9792 DefaultRespPath = pDM_PDTable->OFDMDefaultRespPath;
9793 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is OFDM\n"));
9797 DefaultRespPath = pDM_PDTable->CCKDefaultRespPath;
9798 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: DefaultRespPath is CCK\n"));
9800 odm_SetRespPath_92C(Adapter, DefaultRespPath);
9801 odm_ResetPathDiversity_92C(Adapter);
9802 RT_TRACE( COMP_SWAS, DBG_LOUD, ("ODM_TXPathDiversity() <==\n"));
9810 odm_CCKTXPathDiversityCallback(
9815 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
9816 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9817 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
9819 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
9822 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
9824 PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
9826 odm_PathDiversityAfterLink_92C(Adapter);
9829 PlatformScheduleWorkItem(&pDM_Odm->CCKPathDiversityWorkitem);
9836 odm_CCKTXPathDiversityWorkItemCallback(
9840 PADAPTER Adapter = (PADAPTER)pContext;
9842 odm_CCKTXPathDiversity_92C(Adapter);
9847 ODM_CCKPathDiversityChkPerPktRssi(
9851 PRT_WLAN_STA pEntry,
9856 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
9857 bool bCount = false;
9858 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
9859 //bool isCCKrate = RX_HAL_IS_CCK_RATE_92C(pDesc);
9860 #if DEV_BUS_TYPE != RT_SDIO_INTERFACE
9861 bool isCCKrate = RX_HAL_IS_CCK_RATE(Adapter, pDesc);
9862 #else //below code would be removed if we have verified SDIO
9863 bool isCCKrate = IS_HARDWARE_TYPE_8188E(Adapter) ? RX_HAL_IS_CCK_RATE_88E(pDesc) : RX_HAL_IS_CCK_RATE_92C(pDesc);
9866 if ((pHalData->PathDivCfg != 1) || (pHalData->RSSI_test == false))
9869 if (pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
9871 else if (pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
9874 if (bCount && isCCKrate)
9876 if (pDM_PDTable->TrainingState == 1 )
9880 if (pEntry->rssi_stat.RSSI_CCK_Path_cnt[0] != 0)
9881 pEntry->rssi_stat.RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
9882 pEntry->rssi_stat.RSSI_CCK_Path_cnt[0]++;
9886 if (pDM_PDTable->RSSI_CCK_Path_cnt[0] != 0)
9887 pDM_PDTable->RSSI_CCK_Path[0] += pRfd->Status.RxPWDBAll;
9888 pDM_PDTable->RSSI_CCK_Path_cnt[0]++;
9891 else if (pDM_PDTable->TrainingState == 2 )
9895 if (pEntry->rssi_stat.RSSI_CCK_Path_cnt[1] != 0)
9896 pEntry->rssi_stat.RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
9897 pEntry->rssi_stat.RSSI_CCK_Path_cnt[1]++;
9901 if (pDM_PDTable->RSSI_CCK_Path_cnt[1] != 0)
9902 pDM_PDTable->RSSI_CCK_Path[1] += pRfd->Status.RxPWDBAll;
9903 pDM_PDTable->RSSI_CCK_Path_cnt[1]++;
9911 ODM_PathDiversityBeforeLink92C(
9916 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
9917 PADAPTER Adapter = pDM_Odm->Adapter;
9918 HAL_DATA_TYPE* pHalData = NULL;
9919 PMGNT_INFO pMgntInfo = NULL;
9920 //pSWAT_T pDM_SWAT_Table = &Adapter->DM_SWAT_Table;
9921 pPD_T pDM_PDTable = NULL;
9924 PRT_WLAN_BSS pTmpBssDesc;
9925 PRT_WLAN_BSS pTestBssDesc;
9927 u1Byte target_chnl = 0;
9930 if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
9931 { // The ODM structure is not initialized.
9934 pHalData = GET_HAL_DATA(Adapter);
9935 pMgntInfo = &Adapter->MgntInfo;
9936 pDM_PDTable = &Adapter->DM_PDTable;
9938 // Condition that does not need to use path diversity.
9939 if ((!IS_92C_SERIAL(pHalData->VersionID)) || (pHalData->PathDivCfg!=1) || pMgntInfo->AntennaTest )
9941 RT_TRACE(COMP_SWAS, DBG_LOUD,
9942 ("ODM_PathDiversityBeforeLink92C(): No PathDiv Mechanism before link.\n"));
9946 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
9947 PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
9948 if (pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
9950 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
9952 RT_TRACE(COMP_SWAS, DBG_LOUD,
9953 ("ODM_PathDiversityBeforeLink92C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
9954 pMgntInfo->RFChangeInProgress,
9955 pHalData->eRFPowerState));
9957 //pDM_SWAT_Table->SWAS_NoLink_State = 0;
9958 pDM_PDTable->PathDiv_NoLink_State = 0;
9964 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
9967 //1 Run AntDiv mechanism "Before Link" part.
9968 //if (pDM_SWAT_Table->SWAS_NoLink_State == 0)
9969 if (pDM_PDTable->PathDiv_NoLink_State == 0)
9971 //1 Prepare to do Scan again to check current antenna state.
9973 // Set check state to next step.
9974 //pDM_SWAT_Table->SWAS_NoLink_State = 1;
9975 pDM_PDTable->PathDiv_NoLink_State = 1;
9977 // Copy Current Scan list.
9978 Adapter->MgntInfo.tmpNumBssDesc = pMgntInfo->NumBssDesc;
9979 PlatformMoveMemory((void *)Adapter->MgntInfo.tmpbssDesc, (void *)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
9981 // Switch Antenna to another one.
9982 if (pDM_PDTable->DefaultRespPath == 0)
9984 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x05); // TRX path = PathB
9985 odm_SetRespPath_92C(Adapter, 1);
9986 pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
9987 pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
9991 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x00); // TRX path = PathA
9992 odm_SetRespPath_92C(Adapter, 0);
9993 pDM_PDTable->OFDMTXPath = 0x0;
9994 pDM_PDTable->CCKTXPath = 0x0;
9997 // Go back to scan function again.
9998 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Scan one more time\n"));
9999 pMgntInfo->ScanStep=0;
10000 target_chnl = odm_SwAntDivSelectChkChnl(Adapter);
10001 odm_SwAntDivConsructChkScanChnl(Adapter, target_chnl);
10002 HTReleaseChnlOpLock(Adapter);
10003 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
10009 //1 ScanComple() is called after antenna swiched.
10010 //1 Check scan result and determine which antenna is going
10013 for (index=0; index<Adapter->MgntInfo.tmpNumBssDesc; index++)
10015 pTmpBssDesc = &(Adapter->MgntInfo.tmpbssDesc[index]);
10016 pTestBssDesc = &(pMgntInfo->bssDesc[index]);
10018 if (PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
10020 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C(): ERROR!! This shall not happen.\n"));
10024 if (pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
10026 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score++\n"));
10027 RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
10028 RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
10031 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
10033 else if (pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
10035 RT_TRACE(COMP_SWAS, DBG_LOUD, ("ODM_PathDiversityBeforeLink92C: Compare scan entry: Score--\n"));
10036 RT_PRINT_STR(COMP_SWAS, DBG_LOUD, "SSID: ", pTestBssDesc->bdSsIdBuf, pTestBssDesc->bdSsIdLen);
10037 RT_TRACE(COMP_SWAS, DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
10043 if (pMgntInfo->NumBssDesc!=0 && Score<=0)
10045 RT_TRACE(COMP_SWAS, DBG_LOUD,
10046 ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
10048 //pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
10052 RT_TRACE(COMP_SWAS, DBG_LOUD,
10053 ("ODM_PathDiversityBeforeLink92C(): DefaultRespPath=%d\n", pDM_PDTable->DefaultRespPath));
10055 if (pDM_PDTable->DefaultRespPath == 0)
10057 pDM_PDTable->OFDMTXPath = 0xFFFFFFFF;
10058 pDM_PDTable->CCKTXPath = 0xFFFFFFFF;
10059 odm_SetRespPath_92C(Adapter, 1);
10063 pDM_PDTable->OFDMTXPath = 0x0;
10064 pDM_PDTable->CCKTXPath = 0x0;
10065 odm_SetRespPath_92C(Adapter, 0);
10067 PHY_SetBBReg(Adapter, rCCK0_AFESetting , 0x0F000000, 0x01); // RX path = PathAB
10069 //pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;
10071 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);
10072 //pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));
10073 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);
10076 // Check state reset to default and wait for next time.
10077 //pDM_SWAT_Table->SWAS_NoLink_State = 0;
10078 pDM_PDTable->PathDiv_NoLink_State = 0;
10089 //Neil Chen---2011--06--22
10090 //----92D Path Diversity----//
10091 //#ifdef PathDiv92D
10092 //==================================
10094 //==================================
10096 // 20100514 Luke/Joseph:
10097 // Add new function for antenna diversity after link.
10098 // This is the main function of antenna diversity after link.
10099 // This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
10100 // HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
10101 // In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
10102 // After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
10103 // listened on the air with the RSSI of original antenna.
10104 // It chooses the antenna with better RSSI.
10105 // There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
10106 // penalty to get next try.
10109 // 20100503 Joseph:
10110 // Add new function SwAntDivCheck8192C().
10111 // This is the main function of Antenna diversity function before link.
10112 // Mainly, it just retains last scan result and scan again.
10113 // After that, it compares the scan result to see which one gets better RSSI.
10114 // It selects antenna with better receiving power and returns better scan result.
10119 // 20100514 Luke/Joseph:
10120 // This function is used to gather the RSSI information for antenna testing.
10121 // It selects the RSSI of the peer STA that we want to know.
10124 ODM_PathDivChkPerPktRssi(
10128 PRT_WLAN_STA pEntry,
10132 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10133 bool bCount = false;
10134 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
10135 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
10137 if (pHalData->RSSI_target==NULL && bIsDefPort && bMatchBSSID)
10139 else if (pHalData->RSSI_target!=NULL && pEntry!=NULL && pHalData->RSSI_target==pEntry)
10144 //1 RSSI for SW Antenna Switch
10145 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
10147 pHalData->RSSI_sum_A += pRfd->Status.RxPWDBAll;
10148 pHalData->RSSI_cnt_A++;
10152 pHalData->RSSI_sum_B += pRfd->Status.RxPWDBAll;
10153 pHalData->RSSI_cnt_B++;
10162 // 20100514 Luke/Joseph:
10163 // Add new function to reset antenna diversity state after link.
10166 ODM_PathDivRestAfterLink(
10170 PADAPTER Adapter=pDM_Odm->Adapter;
10171 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10172 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
10174 pHalData->RSSI_cnt_A = 0;
10175 pHalData->RSSI_cnt_B = 0;
10176 pHalData->RSSI_test = false;
10177 pDM_SWAT_Table->try_flag = 0x0; // NOT 0xff
10178 pDM_SWAT_Table->RSSI_Trying = 0;
10179 pDM_SWAT_Table->SelectAntennaMap=0xAA;
10180 pDM_SWAT_Table->CurAntenna = Antenna_A;
10185 // 20100514 Luke/Joseph:
10186 // Callback function for 500ms antenna test trying.
10189 odm_PathDivChkAntSwitchCallback(
10193 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
10194 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10195 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
10197 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10200 PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
10202 odm_PathDivChkAntSwitch(pDM_Odm);
10205 PlatformScheduleWorkItem(&pDM_Odm->PathDivSwitchWorkitem);
10208 //odm_SwAntDivChkAntSwitch(Adapter, SWAW_STEP_DETERMINE);
10213 void odm_PathDivChkAntSwitchWorkitemCallback(void *pContext)
10215 PADAPTER pAdapter = (PADAPTER)pContext;
10216 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
10217 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
10219 odm_PathDivChkAntSwitch(pDM_Odm);
10225 // 2011-06-22 Neil Chen & Gary Hsin
10226 // Refer to Jr.Luke's SW ANT DIV
10227 // 92D Path Diversity Main function
10228 // refer to 88C software antenna diversity
10231 odm_PathDivChkAntSwitch(
10233 //PADAPTER Adapter,
10237 PADAPTER Adapter = pDM_Odm->Adapter;
10238 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10239 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
10242 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
10243 s4Byte curRSSI=100, RSSI_A, RSSI_B;
10244 u1Byte nextAntenna=Antenna_B;
10245 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
10246 u8Byte curTxOkCnt, curRxOkCnt;
10247 static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
10248 u8Byte CurByteCnt=0, PreByteCnt=0;
10249 static u1Byte TrafficLoad = TRAFFIC_LOW;
10250 u1Byte Score_A=0, Score_B=0;
10253 static u1Byte pathdiv_para=0x0;
10254 static u1Byte switchfirsttime=0x00;
10255 // u1Byte regB33 = (u1Byte) PHY_QueryBBReg(Adapter, 0xB30,BIT27);
10256 u1Byte regB33 = (u1Byte)ODM_GetBBReg(pDM_Odm, PATHDIV_REG, BIT27);
10259 //u1Byte reg637 =0x0;
10260 static u1Byte fw_value=0x0;
10262 static u8Byte lastTxOkCnt_tmp=0, lastRxOkCnt_tmp=0;
10263 //u8Byte curTxOkCnt_tmp, curRxOkCnt_tmp;
10264 PADAPTER BuddyAdapter = Adapter->BuddyAdapter; // another adapter MAC
10265 // Path Diversity //Neil Chen--2011--06--22
10267 //u1Byte PathDiv_Trigger = (u1Byte) PHY_QueryBBReg(Adapter, 0xBA0,BIT31);
10268 u1Byte PathDiv_Trigger = (u1Byte) ODM_GetBBReg(pDM_Odm, PATHDIV_TRI,BIT31);
10269 u1Byte PathDiv_Enable = pHalData->bPathDiv_Enable;
10272 //DbgPrint("Path Div PG Value:%x\n",PathDiv_Enable);
10273 if ((BuddyAdapter==NULL)||(!PathDiv_Enable)||(PathDiv_Trigger)||(pHalData->CurrentBandType92D == BAND_ON_2_4G))
10277 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD,("===================>odm_PathDivChkAntSwitch()\n"));
10279 // The first time to switch path excluding 2nd, 3rd, ....etc....
10280 if (switchfirsttime==0)
10284 pDM_SWAT_Table->CurAntenna = Antenna_A; // Default MAC0_5G-->Path A (current antenna)
10288 // Condition that does not need to use antenna diversity.
10289 if (pDM_Odm->SupportICType != ODM_RTL8192D)
10291 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDiversityMechanims(): No PathDiv Mechanism.\n"));
10295 // Radio off: Status reset to default and return.
10296 if (pHalData->eRFPowerState==eRfOff)
10298 //ODM_SwAntDivRestAfterLink(Adapter);
10303 // Handling step mismatch condition.
10304 // Peak step is not finished at last time. Recover the variable and check again.
10305 if ( Step != pDM_SWAT_Table->try_flag )
10307 ODM_SwAntDivRestAfterLink(Adapter);
10310 if (pDM_SWAT_Table->try_flag == 0xff)
10312 // Select RSSI checking target
10313 if (pMgntInfo->mAssoc && !ACTING_AS_AP(Adapter))
10315 // Target: Infrastructure mode AP.
10316 pHalData->RSSI_target = NULL;
10317 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_PathDivMechanism(): RSSI_target is DEF AP!\n"));
10322 PRT_WLAN_STA pEntry = NULL;
10323 PADAPTER pTargetAdapter = NULL;
10325 if ( pMgntInfo->mIbss || ACTING_AS_AP(Adapter) )
10327 // Target: AP/IBSS peer.
10328 pTargetAdapter = Adapter;
10330 else if (IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL)
10332 // Target: VWIFI peer.
10333 pTargetAdapter = GetFirstExtAdapter(Adapter);
10336 if (pTargetAdapter != NULL)
10338 for (index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
10340 pEntry = AsocEntry_EnumStation(pTargetAdapter, index);
10341 if (pEntry != NULL)
10343 if (pEntry->bAssociated)
10349 if (pEntry == NULL)
10351 ODM_PathDivRestAfterLink(pDM_Odm);
10352 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
10357 pHalData->RSSI_target = pEntry;
10358 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
10362 pHalData->RSSI_cnt_A = 0;
10363 pHalData->RSSI_cnt_B = 0;
10364 pDM_SWAT_Table->try_flag = 0;
10365 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
10371 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt;
10372 curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt;
10373 lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
10374 lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
10376 if (pDM_SWAT_Table->try_flag == 1) // Training State
10378 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
10380 TXByteCnt_A += curTxOkCnt;
10381 RXByteCnt_A += curRxOkCnt;
10385 TXByteCnt_B += curTxOkCnt;
10386 RXByteCnt_B += curRxOkCnt;
10389 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
10390 pDM_SWAT_Table->RSSI_Trying--;
10391 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
10392 if (pDM_SWAT_Table->RSSI_Trying == 0)
10394 CurByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (TXByteCnt_A+RXByteCnt_A) : (TXByteCnt_B+RXByteCnt_B);
10395 PreByteCnt = (pDM_SWAT_Table->CurAntenna == Antenna_A)? (TXByteCnt_B+RXByteCnt_B) : (TXByteCnt_A+RXByteCnt_A);
10397 if (TrafficLoad == TRAFFIC_HIGH)
10399 //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
10400 PreByteCnt =PreByteCnt*9;
10402 else if (TrafficLoad == TRAFFIC_LOW)
10404 //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
10405 PreByteCnt =PreByteCnt*2;
10407 if (pHalData->RSSI_cnt_A > 0)
10408 RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
10411 if (pHalData->RSSI_cnt_B > 0)
10412 RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
10415 curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
10416 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A;
10417 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
10418 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s\n",
10419 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
10420 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",
10421 RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
10428 if (pHalData->RSSI_cnt_A > 0)
10429 RSSI_A = pHalData->RSSI_sum_A/pHalData->RSSI_cnt_A;
10432 if (pHalData->RSSI_cnt_B > 0)
10433 RSSI_B = pHalData->RSSI_sum_B/pHalData->RSSI_cnt_B;
10436 curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
10437 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B;
10438 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
10439 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH DIV=: preAntenna= %s, curAntenna= %s\n",
10440 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
10442 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",
10443 RSSI_A, pHalData->RSSI_cnt_A, RSSI_B, pHalData->RSSI_cnt_B));
10444 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
10445 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
10449 if ((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
10452 if (pDM_SWAT_Table->TestMode == TP_MODE)
10454 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = TP_MODE"));
10455 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:CurByteCnt = %"i64fmt"d,", CurByteCnt));
10456 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH= TRY:PreByteCnt = %"i64fmt"d\n",PreByteCnt));
10457 if (CurByteCnt < PreByteCnt)
10459 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
10460 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
10462 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
10466 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
10467 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
10469 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
10471 for (i= 0; i<8; i++)
10473 if (((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
10478 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
10479 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Score_A=%d, Score_B=%d\n", Score_A, Score_B));
10481 if (pDM_SWAT_Table->CurAntenna == Antenna_A)
10483 nextAntenna = (Score_A >= Score_B)?Antenna_A:Antenna_B;
10487 nextAntenna = (Score_B >= Score_A)?Antenna_B:Antenna_A;
10489 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
10490 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: preAntenna= %s, curAntenna= %s\n",
10491 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
10493 if (nextAntenna != pDM_SWAT_Table->CurAntenna)
10495 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Switch back to another antenna"));
10499 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: current anntena is good\n"));
10504 if (pDM_SWAT_Table->TestMode == RSSI_MODE)
10506 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: TestMode = RSSI_MODE"));
10507 pDM_SWAT_Table->SelectAntennaMap=0xAA;
10508 if (curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
10510 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Switch back to another antenna"));
10511 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
10513 else // current anntena is good
10515 nextAntenna =pDM_SWAT_Table->CurAntenna;
10516 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: current anntena is good\n"));
10520 pDM_SWAT_Table->try_flag = 0;
10521 pHalData->RSSI_test = false;
10522 pHalData->RSSI_sum_A = 0;
10523 pHalData->RSSI_cnt_A = 0;
10524 pHalData->RSSI_sum_B = 0;
10525 pHalData->RSSI_cnt_B = 0;
10534 else if (pDM_SWAT_Table->try_flag == 0)
10536 if (TrafficLoad == TRAFFIC_HIGH)
10538 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if (PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
10539 TrafficLoad = TRAFFIC_HIGH;
10541 TrafficLoad = TRAFFIC_LOW;
10543 else if (TrafficLoad == TRAFFIC_LOW)
10545 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if (PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
10546 TrafficLoad = TRAFFIC_HIGH;
10548 TrafficLoad = TRAFFIC_LOW;
10550 if (TrafficLoad == TRAFFIC_HIGH)
10551 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
10552 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
10554 //Prepare To Try Antenna
10555 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
10556 pDM_SWAT_Table->try_flag = 1;
10557 pHalData->RSSI_test = true;
10558 if ((curRxOkCnt+curTxOkCnt) > 1000)
10560 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10561 pDM_SWAT_Table->RSSI_Trying = 4;
10563 pDM_SWAT_Table->RSSI_Trying = 2;
10565 pDM_SWAT_Table->TestMode = TP_MODE;
10569 pDM_SWAT_Table->RSSI_Trying = 2;
10570 pDM_SWAT_Table->TestMode = RSSI_MODE;
10574 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
10575 pHalData->RSSI_sum_A = 0;
10576 pHalData->RSSI_cnt_A = 0;
10577 pHalData->RSSI_sum_B = 0;
10578 pHalData->RSSI_cnt_B = 0;
10579 } // end of try_flag=0
10582 //1 4.Change TRX antenna
10583 if (nextAntenna != pDM_SWAT_Table->CurAntenna)
10586 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Change TX Antenna!\n "));
10587 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna); for 88C
10588 if (nextAntenna==Antenna_A)
10590 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH A\n "));
10591 pathdiv_para = 0x02; //02 to switchback to RF path A
10593 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10594 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
10596 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
10599 else if (nextAntenna==Antenna_B)
10601 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Next Antenna is RF PATH B\n "));
10602 if (switchfirsttime==0) // First Time To Enter Path Diversity
10604 switchfirsttime=0x01;
10605 pathdiv_para = 0x00;
10606 fw_value=0x00; // to backup RF Path A Releated Registers
10608 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10609 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
10611 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
10612 //for (u1Byte n=0; n<80,n++)
10616 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
10618 fw_value=0x01; // to backup RF Path A Releated Registers
10619 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
10621 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: FIRST TIME To DO PATH SWITCH!\n "));
10625 pathdiv_para = 0x01;
10627 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10628 odm_PathDiversity_8192D(pDM_Odm, pathdiv_para);
10630 ODM_FillH2CCmd(Adapter, ODM_H2C_PathDiv,1,(pu1Byte)(&fw_value));
10634 // odm_PathDiversity_8192D(Adapter, pathdiv_para);
10637 //1 5.Reset Statistics
10638 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
10639 pDM_SWAT_Table->CurAntenna = nextAntenna;
10640 pDM_SWAT_Table->PreRSSI = curRSSI;
10641 //lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
10642 //lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
10644 //1 6.Set next timer
10646 if (pDM_SWAT_Table->RSSI_Trying == 0)
10649 if (pDM_SWAT_Table->RSSI_Trying%2 == 0)
10651 if (pDM_SWAT_Table->TestMode == TP_MODE)
10653 if (TrafficLoad == TRAFFIC_HIGH)
10655 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10656 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 10 ); //ms
10657 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 10 ms\n"));
10659 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 20 ); //ms
10660 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 20 ms\n"));
10663 else if (TrafficLoad == TRAFFIC_LOW)
10665 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 50 ); //ms
10666 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 50 ms\n"));
10669 else // TestMode == RSSI_MODE
10671 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
10672 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 500 ms\n"));
10677 if (pDM_SWAT_Table->TestMode == TP_MODE)
10679 if (TrafficLoad == TRAFFIC_HIGH)
10681 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
10682 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 90 ); //ms
10683 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("=PATH=: Test another antenna for 90 ms\n"));
10685 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 180); //ms
10687 else if (TrafficLoad == TRAFFIC_LOW)
10688 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 100 ); //ms
10691 ODM_SetTimer( pDM_Odm, &pDM_Odm->PathDivSwitchTimer, 500 ); //ms
10695 //==================================================
10697 //==================================================
10700 odm_SetRespPath_92C(
10702 u1Byte DefaultRespPath
10705 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
10707 RT_TRACE( COMP_SWAS, DBG_LOUD, ("odm_SetRespPath_92C: Select Response Path=%d\n",DefaultRespPath));
10708 if (DefaultRespPath != pDM_PDTable->DefaultRespPath)
10710 if (DefaultRespPath == 0)
10712 PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x15);
10716 PlatformEFIOWrite1Byte(Adapter, 0x6D8, (PlatformEFIORead1Byte(Adapter, 0x6D8)&0xc0)|0x2A);
10719 pDM_PDTable->DefaultRespPath = DefaultRespPath;
10724 ODM_FillTXPathInTXDESC(
10730 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
10732 pPD_T pDM_PDTable = &Adapter->DM_PDTable;
10734 //2011.09.05 Add by Luke Lee for path diversity
10735 if (pHalData->PathDivCfg == 1)
10737 TXPath = (pDM_PDTable->OFDMTXPath >> pTcb->macId) & BIT0;
10738 //RT_TRACE( COMP_SWAS, DBG_LOUD, ("Fill TXDESC: macID=%d, TXPath=%d\n", pTcb->macId, TXPath));
10739 //SET_TX_DESC_TX_ANT_CCK(pDesc,TXPath);
10742 SET_TX_DESC_TX_ANTL_92C(pDesc,1);
10743 SET_TX_DESC_TX_ANT_HT_92C(pDesc,1);
10747 SET_TX_DESC_TX_ANTL_92C(pDesc,2);
10748 SET_TX_DESC_TX_ANT_HT_92C(pDesc,2);
10750 TXPath = (pDM_PDTable->CCKTXPath >> pTcb->macId) & BIT0;
10753 SET_TX_DESC_TX_ANT_CCK_92C(pDesc,1);
10757 SET_TX_DESC_TX_ANT_CCK_92C(pDesc,2);
10762 //Only for MP //Neil Chen--2012--0502--
10767 pPATHDIV_PARA pathIQK = &pDM_Odm->pathIQK;
10769 pathIQK->org_2g_RegC14=0x0;
10770 pathIQK->org_2g_RegC4C=0x0;
10771 pathIQK->org_2g_RegC80=0x0;
10772 pathIQK->org_2g_RegC94=0x0;
10773 pathIQK->org_2g_RegCA0=0x0;
10774 pathIQK->org_5g_RegC14=0x0;
10775 pathIQK->org_5g_RegCA0=0x0;
10776 pathIQK->org_5g_RegE30=0x0;
10777 pathIQK->swt_2g_RegC14=0x0;
10778 pathIQK->swt_2g_RegC4C=0x0;
10779 pathIQK->swt_2g_RegC80=0x0;
10780 pathIQK->swt_2g_RegC94=0x0;
10781 pathIQK->swt_2g_RegCA0=0x0;
10782 pathIQK->swt_5g_RegC14=0x0;
10783 pathIQK->swt_5g_RegCA0=0x0;
10784 pathIQK->swt_5g_RegE30=0x0;
10787 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_MP)
10789 #if ((DM_ODM_SUPPORT_TYPE == ODM_MP)||(DM_ODM_SUPPORT_TYPE == ODM_CE))
10794 // Set Single/Dual Antenna default setting for products that do not do detection in advance.
10796 // Added by Joseph, 2012.03.22
10799 ODM_SingleDualAntennaDefaultSetting(
10803 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
10804 pDM_SWAT_Table->ANTA_ON=true;
10805 pDM_SWAT_Table->ANTB_ON=true;
10809 //2 8723A ANT DETECT
10813 odm_PHY_SaveAFERegisters(
10822 //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
10823 for ( i = 0 ; i < RegisterNum ; i++) {
10824 AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);
10829 odm_PHY_ReloadAFERegisters(
10833 u4Byte RegiesterNum
10838 //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
10839 for (i = 0 ; i < RegiesterNum; i++)
10842 ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);
10846 //2 8723A ANT DETECT
10849 // Implement IQK single tone for RF DPK loopback and BB PSD scanning.
10850 // This function is cooperated with BB team Neil.
10852 // Added by Roger, 2011.12.15
10855 ODM_SingleDualAntennaDetection(
10861 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
10862 u4Byte CurrentChannel,RfLoopReg;
10864 u4Byte Reg88c, Regc08, Reg874, Regc50;
10865 u1Byte initial_gain = 0x5a;
10866 u4Byte PSD_report_tmp;
10867 u4Byte AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0;
10868 bool bResult = true;
10869 u4Byte AFE_Backup[16];
10870 u4Byte AFE_REG_8723A[16] = {
10871 rRx_Wait_CCA, rTx_CCK_RFON,
10872 rTx_CCK_BBON, rTx_OFDM_RFON,
10873 rTx_OFDM_BBON, rTx_To_Rx,
10874 rTx_To_Tx, rRx_CCK,
10875 rRx_OFDM, rRx_Wait_RIFS,
10876 rRx_TO_Rx, rStandby,
10877 rSleep, rPMPD_ANAEN,
10878 rFPGA0_XCD_SwitchControl, rBlue_Tooth};
10880 if (!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C)))
10883 if (!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))
10886 if (pDM_Odm->SupportICType == ODM_RTL8192C)
10888 //Which path in ADC/DAC is turnned on for PSD: both I/Q
10889 ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);
10890 //Ageraged number: 8
10891 ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);
10893 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
10896 //1 Backup Current RF/BB Settings
10898 CurrentChannel = ODM_GetRFReg(pDM_Odm, RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
10899 RfLoopReg = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x00, bRFRegOffsetMask);
10900 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); // change to Antenna A
10901 // Step 1: USE IQK to transmitter single tone
10903 ODM_StallExecution(10);
10905 //Store A Path Register 88c, c08, 874, c50
10906 Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);
10907 Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);
10908 Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);
10909 Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);
10911 // Store AFE Registers
10912 odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
10915 ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0); //128 pts
10917 // To SET CH1 to do
10918 ODM_SetRFReg(pDM_Odm, RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x01); //Channel 1
10921 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);
10922 ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);
10923 ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);
10924 ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);
10925 ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);
10926 ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);
10927 ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);
10928 ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);
10929 ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);
10930 ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);
10931 ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);
10932 ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);
10933 ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);
10934 ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);
10935 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);
10936 ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);
10939 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);
10942 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);
10943 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);
10945 //IQK setting tone@ 4.34Mhz
10946 ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);
10947 ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);
10951 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);
10952 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);
10953 ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);
10954 ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
10955 ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);
10956 ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);
10957 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);
10960 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0, 0xFFFFF, 0x50008);
10962 //IQK Single tone start
10963 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
10964 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
10965 ODM_StallExecution(1000);
10966 PSD_report_tmp=0x0;
10970 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
10971 if (PSD_report_tmp >AntA_report)
10972 AntA_report=PSD_report_tmp;
10975 PSD_report_tmp=0x0;
10977 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B); // change to Antenna B
10978 ODM_StallExecution(10);
10983 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
10984 if (PSD_report_tmp > AntB_report)
10985 AntB_report=PSD_report_tmp;
10988 // change to open case
10989 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, 0); // change to Ant A and B all open case
10990 ODM_StallExecution(10);
10994 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
10995 if (PSD_report_tmp > AntO_report)
10996 AntO_report=PSD_report_tmp;
10999 //Close IQK Single Tone function
11000 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
11001 PSD_report_tmp = 0x0;
11003 //1 Return to antanna A
11004 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
11005 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);
11006 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);
11007 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);
11008 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);
11009 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);
11010 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);
11011 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);
11013 //Reload AFE Registers
11014 odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
11016 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d\n", 2416, AntA_report));
11017 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d\n", 2416, AntB_report));
11018 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d\n", 2416, AntO_report));
11021 if (pDM_Odm->SupportICType == ODM_RTL8723A)
11023 //2 Test Ant B based on Ant A is ON
11024 if (mode==ANTTESTB)
11026 if (AntA_report >= 100)
11028 if (AntB_report > (AntA_report+1))
11030 pDM_SWAT_Table->ANTB_ON=false;
11031 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
11035 pDM_SWAT_Table->ANTB_ON=true;
11036 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));
11041 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
11042 pDM_SWAT_Table->ANTB_ON=false; // Set Antenna B off as default
11046 //2 Test Ant A and B based on DPDT Open
11047 else if (mode==ANTTESTALL)
11049 if ((AntO_report >=100)&(AntO_report <118))
11051 if (AntA_report > (AntO_report+1))
11053 pDM_SWAT_Table->ANTA_ON=false;
11054 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna A is OFF\n"));
11055 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF"));
11059 pDM_SWAT_Table->ANTA_ON=true;
11060 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna A is ON\n"));
11061 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON"));
11064 if (AntB_report > (AntO_report+2))
11066 pDM_SWAT_Table->ANTB_ON=false;
11067 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna B is OFF\n"));
11068 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF"));
11072 pDM_SWAT_Table->ANTB_ON=true;
11073 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna B is ON\n"));
11074 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON"));
11079 else if (pDM_Odm->SupportICType == ODM_RTL8192C)
11081 if (AntA_report >= 100)
11083 if (AntB_report > (AntA_report+2))
11085 pDM_SWAT_Table->ANTA_ON=false;
11086 pDM_SWAT_Table->ANTB_ON=true;
11087 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);
11088 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));
11090 else if (AntA_report > (AntB_report+2))
11092 pDM_SWAT_Table->ANTA_ON=true;
11093 pDM_SWAT_Table->ANTB_ON=false;
11094 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
11095 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
11099 pDM_SWAT_Table->ANTA_ON=true;
11100 pDM_SWAT_Table->ANTB_ON=true;
11101 RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));
11106 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
11107 pDM_SWAT_Table->ANTA_ON=true; // Set Antenna A on as default
11108 pDM_SWAT_Table->ANTB_ON=false; // Set Antenna B off as default
11117 #endif // end odm_CE