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.
41 //RT_WLAN_BSS tmpbssDesc[MAX_BSS_DESC];
44 //avoid to warn in FreeBSD ==> To DO modify
45 u4Byte EDCAParam[HT_IOT_PEER_MAX][3] =
47 {0x5ea42b, 0x5ea42b, 0x5ea42b}, //0:unknown AP
48 {0xa44f, 0x5ea44f, 0x5e431c}, // 1:realtek AP
49 {0x5ea42b, 0x5ea42b, 0x5ea42b}, // 2:unknown AP => realtek_92SE
50 {0x5ea32b, 0x5ea42b, 0x5e4322}, // 3:broadcom AP
51 {0x5ea422, 0x00a44f, 0x00a44f}, // 4:ralink AP
52 {0x5ea322, 0x00a630, 0x00a44f}, // 5:atheros AP
53 //{0x5ea42b, 0x5ea42b, 0x5ea42b},// 6:cisco AP
54 {0x5e4322, 0x5e4322, 0x5e4322},// 6:cisco AP
55 //{0x3ea430, 0x00a630, 0x3ea44f}, // 7:cisco AP
56 {0x5ea44f, 0x00a44f, 0x5ea42b}, // 8:marvell AP
57 //{0x5ea44f, 0x5ea44f, 0x5ea44f}, // 9realtek AP
58 {0x5ea42b, 0x5ea42b, 0x5ea42b}, // 10:unknown AP=> 92U AP
59 {0x5ea42b, 0xa630, 0x5e431c}, // 11:airgocap AP
60 // {0x5e4322, 0x00a44f, 0x5ea44f}, // 12:unknown AP
62 //============================================================
63 // EDCA Paramter for AP/ADSL by Mingzhi 2011-11-22
64 //============================================================
66 //============================================================
68 //============================================================
69 u4Byte OFDMSwingTable[OFDM_TABLE_SIZE_92D] = {
70 0x7f8001fe, // 0, +6.0dB
71 0x788001e2, // 1, +5.5dB
72 0x71c001c7, // 2, +5.0dB
73 0x6b8001ae, // 3, +4.5dB
74 0x65400195, // 4, +4.0dB
75 0x5fc0017f, // 5, +3.5dB
76 0x5a400169, // 6, +3.0dB
77 0x55400155, // 7, +2.5dB
78 0x50800142, // 8, +2.0dB
79 0x4c000130, // 9, +1.5dB
80 0x47c0011f, // 10, +1.0dB
81 0x43c0010f, // 11, +0.5dB
82 0x40000100, // 12, +0dB
83 0x3c8000f2, // 13, -0.5dB
84 0x390000e4, // 14, -1.0dB
85 0x35c000d7, // 15, -1.5dB
86 0x32c000cb, // 16, -2.0dB
87 0x300000c0, // 17, -2.5dB
88 0x2d4000b5, // 18, -3.0dB
89 0x2ac000ab, // 19, -3.5dB
90 0x288000a2, // 20, -4.0dB
91 0x26000098, // 21, -4.5dB
92 0x24000090, // 22, -5.0dB
93 0x22000088, // 23, -5.5dB
94 0x20000080, // 24, -6.0dB
95 0x1e400079, // 25, -6.5dB
96 0x1c800072, // 26, -7.0dB
97 0x1b00006c, // 27. -7.5dB
98 0x19800066, // 28, -8.0dB
99 0x18000060, // 29, -8.5dB
100 0x16c0005b, // 30, -9.0dB
101 0x15800056, // 31, -9.5dB
102 0x14400051, // 32, -10.0dB
103 0x1300004c, // 33, -10.5dB
104 0x12000048, // 34, -11.0dB
105 0x11000044, // 35, -11.5dB
106 0x10000040, // 36, -12.0dB
107 0x0f00003c,// 37, -12.5dB
108 0x0e400039,// 38, -13.0dB
109 0x0d800036,// 39, -13.5dB
110 0x0cc00033,// 40, -14.0dB
111 0x0c000030,// 41, -14.5dB
112 0x0b40002d,// 42, -15.0dB
116 u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = {
117 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, // 0, +0dB
118 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, // 1, -0.5dB
119 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, // 2, -1.0dB
120 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, // 3, -1.5dB
121 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, // 4, -2.0dB
122 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, // 5, -2.5dB
123 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, // 6, -3.0dB
124 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, // 7, -3.5dB
125 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, // 8, -4.0dB
126 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, // 9, -4.5dB
127 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, // 10, -5.0dB
128 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, // 11, -5.5dB
129 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, // 12, -6.0dB
130 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, // 13, -6.5dB
131 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, // 14, -7.0dB
132 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, // 15, -7.5dB
133 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, // 16, -8.0dB
134 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, // 17, -8.5dB
135 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, // 18, -9.0dB
136 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 19, -9.5dB
137 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, // 20, -10.0dB
138 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 21, -10.5dB
139 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, // 22, -11.0dB
140 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, // 23, -11.5dB
141 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, // 24, -12.0dB
142 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, // 25, -12.5dB
143 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, // 26, -13.0dB
144 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, // 27, -13.5dB
145 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, // 28, -14.0dB
146 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, // 29, -14.5dB
147 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, // 30, -15.0dB
148 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, // 31, -15.5dB
149 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} // 32, -16.0dB
153 u8 CCKSwingTable_Ch14 [CCK_TABLE_SIZE][8]= {
154 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, // 0, +0dB
155 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, // 1, -0.5dB
156 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, // 2, -1.0dB
157 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, // 3, -1.5dB
158 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, // 4, -2.0dB
159 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, // 5, -2.5dB
160 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, // 6, -3.0dB
161 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, // 7, -3.5dB
162 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, // 8, -4.0dB
163 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, // 9, -4.5dB
164 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, // 10, -5.0dB
165 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 11, -5.5dB
166 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, // 12, -6.0dB
167 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, // 13, -6.5dB
168 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, // 14, -7.0dB
169 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 15, -7.5dB
170 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, // 16, -8.0dB
171 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 17, -8.5dB
172 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, // 18, -9.0dB
173 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 19, -9.5dB
174 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, // 20, -10.0dB
175 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, // 21, -10.5dB
176 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, // 22, -11.0dB
177 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 23, -11.5dB
178 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, // 24, -12.0dB
179 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, // 25, -12.5dB
180 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 26, -13.0dB
181 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, // 27, -13.5dB
182 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 28, -14.0dB
183 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, // 29, -14.5dB
184 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 30, -15.0dB
185 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, // 31, -15.5dB
186 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} // 32, -16.0dB
190 #ifdef AP_BUILD_WORKAROUND
192 unsigned int TxPwrTrk_OFDM_SwingTbl[TxPwrTrk_OFDM_SwingTbl_Len] = {
193 /* +6.0dB */ 0x7f8001fe,
194 /* +5.5dB */ 0x788001e2,
195 /* +5.0dB */ 0x71c001c7,
196 /* +4.5dB */ 0x6b8001ae,
197 /* +4.0dB */ 0x65400195,
198 /* +3.5dB */ 0x5fc0017f,
199 /* +3.0dB */ 0x5a400169,
200 /* +2.5dB */ 0x55400155,
201 /* +2.0dB */ 0x50800142,
202 /* +1.5dB */ 0x4c000130,
203 /* +1.0dB */ 0x47c0011f,
204 /* +0.5dB */ 0x43c0010f,
205 /* 0.0dB */ 0x40000100,
206 /* -0.5dB */ 0x3c8000f2,
207 /* -1.0dB */ 0x390000e4,
208 /* -1.5dB */ 0x35c000d7,
209 /* -2.0dB */ 0x32c000cb,
210 /* -2.5dB */ 0x300000c0,
211 /* -3.0dB */ 0x2d4000b5,
212 /* -3.5dB */ 0x2ac000ab,
213 /* -4.0dB */ 0x288000a2,
214 /* -4.5dB */ 0x26000098,
215 /* -5.0dB */ 0x24000090,
216 /* -5.5dB */ 0x22000088,
217 /* -6.0dB */ 0x20000080,
218 /* -6.5dB */ 0x1a00006c,
219 /* -7.0dB */ 0x1c800072,
220 /* -7.5dB */ 0x18000060,
221 /* -8.0dB */ 0x19800066,
222 /* -8.5dB */ 0x15800056,
223 /* -9.0dB */ 0x26c0005b,
224 /* -9.5dB */ 0x14400051,
225 /* -10.0dB */ 0x24400051,
226 /* -10.5dB */ 0x1300004c,
227 /* -11.0dB */ 0x12000048,
228 /* -11.5dB */ 0x11000044,
229 /* -12.0dB */ 0x10000040
233 //============================================================
234 // Local Function predefine.
235 //============================================================
237 //START------------COMMON INFO RELATED---------------//
239 odm_CommonInfoSelfInit(
244 odm_CommonInfoSelfUpdate(
249 odm_CmnInfoInit_Debug(
254 odm_CmnInfoHook_Debug(
259 odm_CmnInfoUpdate_Debug(
273 //END------------COMMON INFO RELATED---------------//
275 //START---------------DIG---------------------------//
277 odm_FalseAlarmCounterStatistics(
292 odm_CCKPacketDetectionThresh(
295 //END---------------DIG---------------------------//
297 //START-------BB POWER SAVE-----------------------//
299 odm_DynamicBBPowerSavingInit(
304 odm_DynamicBBPowerSaving(
312 //END---------BB POWER SAVE-----------------------//
316 odm_RefreshRateAdaptiveMaskMP(
321 odm_RefreshRateAdaptiveMaskCE(
326 odm_RefreshRateAdaptiveMaskAPADSL(
331 odm_DynamicTxPowerInit(
336 odm_DynamicTxPowerRestorePowerIndex(
341 odm_DynamicTxPowerNIC(
346 odm_DynamicTxPowerSavePowerIndex(
351 odm_DynamicTxPowerWritePowerIndex(
356 odm_DynamicTxPower_92C(
361 odm_DynamicTxPower_92D(
371 odm_RSSIMonitorCheckMP(
376 odm_RSSIMonitorCheckCE(
380 odm_RSSIMonitorCheckAP(
387 odm_RSSIMonitorCheck(
396 odm_DynamicTxPowerAP(
407 odm_SwAntDivInit_NIC(
412 odm_SwAntDivChkAntSwitch(
418 odm_SwAntDivChkAntSwitchNIC(
424 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext);
427 odm_GlobalAdapterCheck(
432 odm_RefreshRateAdaptiveMask(
437 ODM_TXPowerTrackingCheck(
442 odm_TXPowerTrackingCheckAP(
453 odm_RateAdaptiveMaskInit(
458 odm_TXPowerTrackingThermalMeterInit(
464 odm_TXPowerTrackingInit(
469 odm_TXPowerTrackingCheckMP(
475 odm_TXPowerTrackingCheckCE(
489 odm_EdcaTurboCheckCE(
493 #define RxDefaultAnt1 0x65a9
494 #define RxDefaultAnt2 0x569a
497 odm_InitHybridAntDiv(
504 u4Byte OFDM_Ant1_Cnt,
505 u4Byte OFDM_Ant2_Cnt,
526 //============================================================
528 //============================================================
531 // 2011/09/21 MH Add to describe different team necessary resource allocate??
539 #if (FPGA_TWO_MAC_VERIFICATION == 1)
540 odm_RateAdaptiveMaskInit(pDM_Odm);
544 //2012.05.03 Luke: For all IC series
545 odm_CommonInfoSelfInit(pDM_Odm);
546 odm_CmnInfoInit_Debug(pDM_Odm);
547 odm_DIGInit(pDM_Odm);
548 odm_RateAdaptiveMaskInit(pDM_Odm);
550 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
554 else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
556 #if (RTL8188E_SUPPORT == 1)
557 odm_PrimaryCCA_Init(pDM_Odm); // Gary
559 odm_DynamicBBPowerSavingInit(pDM_Odm);
560 odm_DynamicTxPowerInit(pDM_Odm);
561 odm_TXPowerTrackingInit(pDM_Odm);
562 ODM_EdcaTurboInit(pDM_Odm);
563 #if (RTL8188E_SUPPORT == 1)
564 ODM_RAInfo_Init_all(pDM_Odm);
566 if(( pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV ) ||
567 ( pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV ) ||
568 ( pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ))
570 odm_InitHybridAntDiv(pDM_Odm);
572 else if( pDM_Odm->AntDivType == CGCS_RX_SW_ANTDIV)
574 odm_SwAntDivInit(pDM_Odm);
580 // 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.
581 // You can not add any dummy function here, be care, you can only use DM structure
582 // to perform any new ODM_DM.
589 //2012.05.03 Luke: For all IC series
590 odm_GlobalAdapterCheck();
591 odm_CmnInfoHook_Debug(pDM_Odm);
592 odm_CmnInfoUpdate_Debug(pDM_Odm);
593 odm_CommonInfoSelfUpdate(pDM_Odm);
594 odm_FalseAlarmCounterStatistics(pDM_Odm);
595 odm_RSSIMonitorCheck(pDM_Odm);
597 //For CE Platform(SPRD or Tablet)
598 //8723A or 8189ES platform
599 //NeilChen--2012--08--24--
600 //Fix Leave LPS issue
601 if((pDM_Odm->Adapter->pwrctrlpriv.pwr_mode != PS_MODE_ACTIVE) &&// in LPS mode
603 (pDM_Odm->SupportICType & (ODM_RTL8723A ) )||
604 (pDM_Odm->SupportICType & (ODM_RTL8188E) &&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO)) )
606 //&&((pDM_Odm->SupportInterface == ODM_ITRF_SDIO))
610 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n"));
611 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n"));
612 odm_DIGbyRSSI_LPS(pDM_Odm);
620 odm_CCKPacketDetectionThresh(pDM_Odm);
622 if(*(pDM_Odm->pbPowerSaving)==TRUE)
625 odm_RefreshRateAdaptiveMask(pDM_Odm);
627 #if (RTL8192D_SUPPORT == 1)
628 ODM_DynamicEarlyMode(pDM_Odm);
630 odm_DynamicBBPowerSaving(pDM_Odm);
631 #if (RTL8188E_SUPPORT == 1)
632 odm_DynamicPrimaryCCA(pDM_Odm);
634 if(( pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV ) ||
635 ( pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV ) ||
636 ( pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ))
638 odm_HwAntDiv(pDM_Odm);
640 else if( pDM_Odm->AntDivType == CGCS_RX_SW_ANTDIV)
642 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_PEAK);
645 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
649 else if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
651 ODM_TXPowerTrackingCheck(pDM_Odm);
652 odm_EdcaTurboCheck(pDM_Odm);
653 odm_DynamicTxPower(pDM_Odm);
661 // Init /.. Fixed HW value. Only init time.
666 ODM_CMNINFO_E CmnInfo,
670 //ODM_RT_TRACE(pDM_Odm,);
673 // This section is used for init value
680 case ODM_CMNINFO_ABILITY:
681 pDM_Odm->SupportAbility = (u4Byte)Value;
683 case ODM_CMNINFO_PLATFORM:
684 pDM_Odm->SupportPlatform = (u8)Value;
687 case ODM_CMNINFO_INTERFACE:
688 pDM_Odm->SupportInterface = (u8)Value;
691 case ODM_CMNINFO_MP_TEST_CHIP:
692 pDM_Odm->bIsMPChip= (u8)Value;
695 case ODM_CMNINFO_IC_TYPE:
696 pDM_Odm->SupportICType = Value;
699 case ODM_CMNINFO_CUT_VER:
700 pDM_Odm->CutVersion = (u8)Value;
703 case ODM_CMNINFO_FAB_VER:
704 pDM_Odm->FabVersion = (u8)Value;
707 case ODM_CMNINFO_RF_TYPE:
708 pDM_Odm->RFType = (u8)Value;
711 case ODM_CMNINFO_RF_ANTENNA_TYPE:
712 pDM_Odm->AntDivType= (u8)Value;
715 case ODM_CMNINFO_BOARD_TYPE:
716 pDM_Odm->BoardType = (u8)Value;
719 case ODM_CMNINFO_EXT_LNA:
720 pDM_Odm->ExtLNA = (u8)Value;
723 case ODM_CMNINFO_EXT_PA:
724 pDM_Odm->ExtPA = (u8)Value;
727 case ODM_CMNINFO_EXT_TRSW:
728 pDM_Odm->ExtTRSW = (u8)Value;
730 case ODM_CMNINFO_PATCH_ID:
731 pDM_Odm->PatchID = (u8)Value;
733 case ODM_CMNINFO_BINHCT_TEST:
734 pDM_Odm->bInHctTest = (bool)Value;
736 case ODM_CMNINFO_BWIFI_TEST:
737 pDM_Odm->bWIFITest = (bool)Value;
740 case ODM_CMNINFO_SMART_CONCURRENT:
741 pDM_Odm->bDualMacSmartConcurrent = (bool )Value;
744 //To remove the compiler warning, must add an empty default statement to handle the other values.
752 // Tx power tracking BB swing table.
753 // The base index = 12. +((12-n)/2)dB 13~?? = decrease tx pwr by -((n-12)/2)dB
755 pDM_Odm->BbSwingIdxOfdm = 12; // Set defalut value as index 12.
756 pDM_Odm->BbSwingIdxOfdmCurrent = 12;
757 pDM_Odm->BbSwingFlagOfdm = FALSE;
765 ODM_CMNINFO_E CmnInfo,
770 // Hook call by reference pointer.
775 // Dynamic call by reference pointer.
777 case ODM_CMNINFO_MAC_PHY_MODE:
778 pDM_Odm->pMacPhyMode = (u8 *)pValue;
781 case ODM_CMNINFO_TX_UNI:
782 pDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;
785 case ODM_CMNINFO_RX_UNI:
786 pDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;
789 case ODM_CMNINFO_WM_MODE:
790 pDM_Odm->pWirelessMode = (u8 *)pValue;
793 case ODM_CMNINFO_BAND:
794 pDM_Odm->pBandType = (u8 *)pValue;
797 case ODM_CMNINFO_SEC_CHNL_OFFSET:
798 pDM_Odm->pSecChOffset = (u8 *)pValue;
801 case ODM_CMNINFO_SEC_MODE:
802 pDM_Odm->pSecurity = (u8 *)pValue;
806 pDM_Odm->pBandWidth = (u8 *)pValue;
809 case ODM_CMNINFO_CHNL:
810 pDM_Odm->pChannel = (u8 *)pValue;
813 case ODM_CMNINFO_DMSP_GET_VALUE:
814 pDM_Odm->pbGetValueFromOtherMac = (bool *)pValue;
817 case ODM_CMNINFO_BUDDY_ADAPTOR:
818 pDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;
821 case ODM_CMNINFO_DMSP_IS_MASTER:
822 pDM_Odm->pbMasterOfDMSP = (bool *)pValue;
825 case ODM_CMNINFO_SCAN:
826 pDM_Odm->pbScanInProcess = (bool *)pValue;
829 case ODM_CMNINFO_POWER_SAVING:
830 pDM_Odm->pbPowerSaving = (bool *)pValue;
833 case ODM_CMNINFO_ONE_PATH_CCA:
834 pDM_Odm->pOnePathCCA = (u8 *)pValue;
837 case ODM_CMNINFO_DRV_STOP:
838 pDM_Odm->pbDriverStopped = (bool *)pValue;
841 case ODM_CMNINFO_PNP_IN:
842 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = (bool *)pValue;
845 case ODM_CMNINFO_INIT_ON:
846 pDM_Odm->pinit_adpt_in_progress = (bool *)pValue;
849 case ODM_CMNINFO_ANT_TEST:
850 pDM_Odm->pAntennaTest = (u8 *)pValue;
853 case ODM_CMNINFO_NET_CLOSED:
854 pDM_Odm->pbNet_closed = (bool *)pValue;
857 //case ODM_CMNINFO_BT_COEXIST:
858 // pDM_Odm->BTCoexist = (bool *)pValue;
860 //case ODM_CMNINFO_STA_STATUS:
861 //pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;
864 //case ODM_CMNINFO_PHY_STATUS:
865 // pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;
868 //case ODM_CMNINFO_MAC_STATUS:
869 // pDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;
871 //To remove the compiler warning, must add an empty default statement to handle the other values.
882 ODM_CmnInfoPtrArrayHook(
884 ODM_CMNINFO_E CmnInfo,
890 // Hook call by reference pointer.
895 // Dynamic call by reference pointer.
897 case ODM_CMNINFO_STA_STATUS:
898 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
900 //To remove the compiler warning, must add an empty default statement to handle the other values.
910 // Update Band/CHannel/.. The values are dynamic but non-per-packet.
920 // This init variable may be changed in run time.
924 case ODM_CMNINFO_ABILITY:
925 pDM_Odm->SupportAbility = (u4Byte)Value;
928 case ODM_CMNINFO_RF_TYPE:
929 pDM_Odm->RFType = (u8)Value;
932 case ODM_CMNINFO_WIFI_DIRECT:
933 pDM_Odm->bWIFI_Direct = (bool)Value;
936 case ODM_CMNINFO_WIFI_DISPLAY:
937 pDM_Odm->bWIFI_Display = (bool)Value;
940 case ODM_CMNINFO_LINK:
941 pDM_Odm->bLinked = (bool)Value;
944 case ODM_CMNINFO_RSSI_MIN:
945 pDM_Odm->RSSI_Min= (u8)Value;
948 case ODM_CMNINFO_DBG_COMP:
949 pDM_Odm->DebugComponents = Value;
952 case ODM_CMNINFO_DBG_LEVEL:
953 pDM_Odm->DebugLevel = (u4Byte)Value;
955 case ODM_CMNINFO_RA_THRESHOLD_HIGH:
956 pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value;
959 case ODM_CMNINFO_RA_THRESHOLD_LOW:
960 pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value;
962 #if(BT_30_SUPPORT == 1)
963 // The following is for BT HS mode and BT coexist mechanism.
964 case ODM_CMNINFO_BT_DISABLED:
965 pDM_Odm->bBtDisabled = (bool)Value;
968 case ODM_CMNINFO_BT_OPERATION:
969 pDM_Odm->bBtHsOperation = (bool)Value;
972 case ODM_CMNINFO_BT_DIG:
973 pDM_Odm->btHsDigVal = (u8)Value;
976 case ODM_CMNINFO_BT_BUSY:
977 pDM_Odm->bBtBusy = (bool)Value;
980 case ODM_CMNINFO_BT_DISABLE_EDCA:
981 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value;
991 odm_CommonInfoSelfInit(
995 pDM_Odm->bCckHighPower = (bool) ODM_GetBBReg(pDM_Odm, 0x824, BIT9);
996 pDM_Odm->RFPathRxEnable = (u8) ODM_GetBBReg(pDM_Odm, 0xc04, 0x0F);
997 if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8192D))
999 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
1000 pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
1001 #elif (defined(CONFIG_SW_ANTENNA_DIVERSITY))
1002 pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
1005 if(pDM_Odm->SupportICType & (ODM_RTL8723A))
1006 pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
1008 ODM_InitDebugSetting(pDM_Odm);
1012 odm_CommonInfoSelfUpdate(
1020 if(*(pDM_Odm->pBandWidth) == ODM_BW40M)
1022 if(*(pDM_Odm->pSecChOffset) == 1)
1023 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) -2;
1024 else if(*(pDM_Odm->pSecChOffset) == 2)
1025 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) +2;
1028 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
1030 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1032 pEntry = pDM_Odm->pODM_StaInfo[i];
1033 if(IS_STA_VALID(pEntry))
1037 pDM_Odm->bOneEntryOnly = TRUE;
1039 pDM_Odm->bOneEntryOnly = FALSE;
1043 odm_CmnInfoInit_Debug(
1047 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug==>\n"));
1048 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform=%d\n",pDM_Odm->SupportPlatform) );
1049 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility=0x%x\n",pDM_Odm->SupportAbility) );
1050 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface=%d\n",pDM_Odm->SupportInterface) );
1051 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType=0x%x\n",pDM_Odm->SupportICType) );
1052 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion=%d\n",pDM_Odm->CutVersion) );
1053 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion=%d\n",pDM_Odm->FabVersion) );
1054 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType=%d\n",pDM_Odm->RFType) );
1055 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType=%d\n",pDM_Odm->BoardType) );
1056 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA=%d\n",pDM_Odm->ExtLNA) );
1057 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA=%d\n",pDM_Odm->ExtPA) );
1058 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW=%d\n",pDM_Odm->ExtTRSW) );
1059 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID=%d\n",pDM_Odm->PatchID) );
1060 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest=%d\n",pDM_Odm->bInHctTest) );
1061 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest=%d\n",pDM_Odm->bWIFITest) );
1062 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent=%d\n",pDM_Odm->bDualMacSmartConcurrent) );
1067 odm_CmnInfoHook_Debug(
1071 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoHook_Debug==>\n"));
1072 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumTxBytesUnicast=%llu\n",*(pDM_Odm->pNumTxBytesUnicast)) );
1073 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pNumRxBytesUnicast=%llu\n",*(pDM_Odm->pNumRxBytesUnicast)) );
1074 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pWirelessMode=0x%x\n",*(pDM_Odm->pWirelessMode)) );
1075 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecChOffset=%d\n",*(pDM_Odm->pSecChOffset)) );
1076 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pSecurity=%d\n",*(pDM_Odm->pSecurity)) );
1077 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandWidth=%d\n",*(pDM_Odm->pBandWidth)) );
1078 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pChannel=%d\n",*(pDM_Odm->pChannel)) );
1080 #if (RTL8192D_SUPPORT==1)
1081 if(pDM_Odm->pBandType)
1082 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBandType=%d\n",*(pDM_Odm->pBandType)) );
1083 if(pDM_Odm->pMacPhyMode)
1084 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pMacPhyMode=%d\n",*(pDM_Odm->pMacPhyMode)) );
1085 if(pDM_Odm->pBuddyAdapter)
1086 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbGetValueFromOtherMac=%d\n",*(pDM_Odm->pbGetValueFromOtherMac)) );
1087 if(pDM_Odm->pBuddyAdapter)
1088 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pBuddyAdapter=%p\n",*(pDM_Odm->pBuddyAdapter)) );
1089 if(pDM_Odm->pbMasterOfDMSP)
1090 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbMasterOfDMSP=%d\n",*(pDM_Odm->pbMasterOfDMSP)) );
1092 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbScanInProcess=%d\n",*(pDM_Odm->pbScanInProcess)) );
1093 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pbPowerSaving=%d\n",*(pDM_Odm->pbPowerSaving)) );
1095 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1096 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("pOnePathCCA=%d\n",*(pDM_Odm->pOnePathCCA)) );
1100 odm_CmnInfoUpdate_Debug(
1104 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoUpdate_Debug==>\n"));
1105 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Direct=%d\n",pDM_Odm->bWIFI_Direct) );
1106 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFI_Display=%d\n",pDM_Odm->bWIFI_Display) );
1107 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked=%d\n",pDM_Odm->bLinked) );
1108 ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI_Min=%d\n",pDM_Odm->RSSI_Min) );
1114 odm_FindMinimumRSSI(
1121 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1123 // if(pDM_Odm->pODM_StaInfo[i] != NULL)
1124 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1126 if(pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)
1128 RSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;
1133 pDM_Odm->RSSI_Min = RSSI_Min;
1143 bool Linked = FALSE;
1145 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
1147 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )
1155 pDM_Odm->bLinked = Linked;
1160 //3============================================================
1162 //3============================================================
1163 /*-----------------------------------------------------------------------------
1164 * Function: odm_DIGInit()
1166 * Overview: Set DIG scheme init value.
1177 *---------------------------------------------------------------------------*/
1179 ODM_ChangeDynamicInitGainThresh(
1185 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1187 if (DM_Type == DIG_TYPE_THRESH_HIGH)
1189 pDM_DigTable->RssiHighThresh = DM_Value;
1191 else if (DM_Type == DIG_TYPE_THRESH_LOW)
1193 pDM_DigTable->RssiLowThresh = DM_Value;
1195 else if (DM_Type == DIG_TYPE_ENABLE)
1197 pDM_DigTable->Dig_Enable_Flag = TRUE;
1199 else if (DM_Type == DIG_TYPE_DISABLE)
1201 pDM_DigTable->Dig_Enable_Flag = FALSE;
1203 else if (DM_Type == DIG_TYPE_BACKOFF)
1207 pDM_DigTable->BackoffVal = (u8)DM_Value;
1209 else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
1213 pDM_DigTable->rx_gain_range_min = (u8)DM_Value;
1215 else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
1219 pDM_DigTable->rx_gain_range_max = (u8)DM_Value;
1221 } /* DM_ChangeDynamicInitGainThresh */
1223 int getIGIForDiff(int value_IGI)
1225 #define ONERCCA_LOW_TH 0x30
1226 #define ONERCCA_LOW_DIFF 8
1228 if (value_IGI < ONERCCA_LOW_TH) {
1229 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
1230 return ONERCCA_LOW_TH;
1232 return value_IGI + ONERCCA_LOW_DIFF;
1245 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1247 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",
1248 ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
1250 if(pDM_DigTable->CurIGValue != CurrentIGI)//if(pDM_DigTable->PreIGValue != CurrentIGI)
1252 if(pDM_Odm->SupportPlatform & (ODM_CE|ODM_MP))
1254 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1255 if(pDM_Odm->SupportICType != ODM_RTL8188E)
1256 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1258 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1260 switch(*(pDM_Odm->pOnePathCCA))
1263 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1264 if(pDM_Odm->SupportICType != ODM_RTL8188E)
1265 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1268 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1269 if(pDM_Odm->SupportICType != ODM_RTL8188E)
1270 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
1273 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
1274 if(pDM_Odm->SupportICType != ODM_RTL8188E)
1275 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
1279 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurrentIGI(0x%02x). \n",CurrentIGI));
1280 //pDM_DigTable->PreIGValue = pDM_DigTable->CurIGValue;
1281 pDM_DigTable->CurIGValue = CurrentIGI;
1283 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG():CurrentIGI=0x%x \n",CurrentIGI));
1287 //Need LPS mode for CE platform --2012--08--24---
1294 PADAPTER pAdapter =pDM_Odm->Adapter;
1295 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1296 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
1297 u8 RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
1298 u8 bFwCurrentInPSMode = FALSE;
1299 u8 CurrentIGI=pDM_Odm->RSSI_Min;
1301 if(! (pDM_Odm->SupportICType & (ODM_RTL8723A |ODM_RTL8188E)))
1304 //if((pDM_Odm->SupportInterface==ODM_ITRF_PCIE)||(pDM_Odm->SupportInterface ==ODM_ITRF_USB))
1307 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
1309 bFwCurrentInPSMode = pAdapter->pwrctrlpriv.bFwCurrentInPSMode;
1312 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG_LPS, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
1314 // Using FW PS mode to make IGI
1315 if(bFwCurrentInPSMode)
1317 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("---Neil---odm_DIG is in LPS mode\n"));
1318 //Adjust by FA in LPS MODE
1319 if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
1320 CurrentIGI = CurrentIGI+2;
1321 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
1322 CurrentIGI = CurrentIGI+1;
1323 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
1324 CurrentIGI = CurrentIGI-1;
1328 CurrentIGI = RSSI_Lower;
1331 //Lower bound checking
1333 //RSSI Lower bound check
1334 if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
1335 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
1337 RSSI_Lower =DM_DIG_MIN_NIC;
1339 //Upper and Lower Bound checking
1340 if(CurrentIGI > DM_DIG_MAX_NIC)
1341 CurrentIGI=DM_DIG_MAX_NIC;
1342 else if(CurrentIGI < RSSI_Lower)
1343 CurrentIGI =RSSI_Lower;
1345 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1355 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1357 //pDM_DigTable->Dig_Enable_Flag = TRUE;
1358 //pDM_DigTable->Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
1359 pDM_DigTable->CurIGValue = (u8) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
1360 //pDM_DigTable->PreIGValue = 0x0;
1361 //pDM_DigTable->CurSTAConnectState = pDM_DigTable->PreSTAConnectState = DIG_STA_DISCONNECT;
1362 //pDM_DigTable->CurMultiSTAConnectState = DIG_MultiSTA_DISCONNECT;
1363 pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
1364 pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
1365 pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
1366 pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
1367 if(pDM_Odm->BoardType == ODM_BOARD_HIGHPWR)
1369 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
1370 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
1374 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
1375 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
1377 pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
1378 pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
1379 pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
1380 pDM_DigTable->PreCCK_CCAThres = 0xFF;
1381 pDM_DigTable->CurCCK_CCAThres = 0x83;
1382 pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
1383 pDM_DigTable->LargeFAHit = 0;
1384 pDM_DigTable->Recover_cnt = 0;
1385 pDM_DigTable->DIG_Dynamic_MIN_0 =DM_DIG_MIN_NIC;
1386 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
1387 pDM_DigTable->bMediaConnect_0 = FALSE;
1388 pDM_DigTable->bMediaConnect_1 = FALSE;
1390 //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
1391 pDM_Odm->bDMInitialGainEnable = TRUE;
1402 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1403 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
1404 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
1407 bool FirstConnect, FirstDisConnect;
1408 u8 dm_dig_max, dm_dig_min;
1409 u8 CurrentIGI = pDM_DigTable->CurIGValue;
1412 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n"));
1413 //if(!(pDM_Odm->SupportAbility & (ODM_BB_DIG|ODM_BB_FA_CNT)))
1414 if((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT)))
1416 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"));
1420 if(*(pDM_Odm->pbScanInProcess))
1422 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n"));
1426 //add by Neil Chen to avoid PSD is processing
1427 if(pDM_Odm->bDMInitialGainEnable == FALSE)
1429 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n"));
1433 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1435 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
1437 if(*(pDM_Odm->pbMasterOfDMSP))
1439 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
1440 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
1441 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
1445 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
1446 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
1447 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
1452 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
1454 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
1455 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
1456 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
1460 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
1461 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
1462 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
1468 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
1469 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
1470 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
1473 //1 Boundary Decision
1474 if((pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723A)) &&
1475 ((pDM_Odm->BoardType == ODM_BOARD_HIGHPWR) || pDM_Odm->ExtLNA))
1477 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1480 dm_dig_max = DM_DIG_MAX_AP_HP;
1481 dm_dig_min = DM_DIG_MIN_AP_HP;
1485 dm_dig_max = DM_DIG_MAX_NIC_HP;
1486 dm_dig_min = DM_DIG_MIN_NIC_HP;
1488 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
1492 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1494 dm_dig_max = DM_DIG_MAX_AP;
1495 dm_dig_min = DM_DIG_MIN_AP;
1496 DIG_MaxOfMin = dm_dig_max;
1500 dm_dig_max = DM_DIG_MAX_NIC;
1501 dm_dig_min = DM_DIG_MIN_NIC;
1502 DIG_MaxOfMin = DM_DIG_MAX_AP;
1507 if(pDM_Odm->bLinked)
1509 //2 8723A Series, offset need to be 10 //neil
1510 if(pDM_Odm->SupportICType==(ODM_RTL8723A))
1513 if(( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC )
1514 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
1515 else if(( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC )
1516 pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC;
1518 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10;
1520 //2 If BT is Concurrent, need to set Lower Bound
1522 #if(BT_30_SUPPORT == 1)
1523 if(pDM_Odm->bBtBusy)
1525 if(pDM_Odm->RSSI_Min>10)
1527 if((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC)
1528 DIG_Dynamic_MIN = DM_DIG_MAX_NIC;
1529 else if((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC)
1530 DIG_Dynamic_MIN = DM_DIG_MIN_NIC;
1532 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10;
1535 DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
1540 DIG_Dynamic_MIN=DM_DIG_MIN_NIC;
1545 //2 Modify DIG upper bound
1546 if((pDM_Odm->RSSI_Min + 20) > dm_dig_max )
1547 pDM_DigTable->rx_gain_range_max = dm_dig_max;
1548 else if((pDM_Odm->RSSI_Min + 20) < dm_dig_min )
1549 pDM_DigTable->rx_gain_range_max = dm_dig_min;
1551 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20;
1554 //2 Modify DIG lower bound
1556 if((pFalseAlmCnt->Cnt_all > 500)&&(DIG_Dynamic_MIN < 0x25))
1558 else if(((pFalseAlmCnt->Cnt_all < 500)||(pDM_Odm->RSSI_Min < 8))&&(DIG_Dynamic_MIN > dm_dig_min))
1561 if(pDM_Odm->bOneEntryOnly)
1563 if(pDM_Odm->RSSI_Min < dm_dig_min)
1564 DIG_Dynamic_MIN = dm_dig_min;
1565 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
1566 DIG_Dynamic_MIN = DIG_MaxOfMin;
1568 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1569 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : bOneEntryOnly=TRUE, DIG_Dynamic_MIN=0x%x\n",DIG_Dynamic_MIN));
1570 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : pDM_Odm->RSSI_Min=%d\n",pDM_Odm->RSSI_Min));
1572 //1 Lower Bound for 88E AntDiv
1573 #if (RTL8188E_SUPPORT == 1)
1574 else if((pDM_Odm->SupportICType == ODM_RTL8188E)&&(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
1576 if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
1578 DIG_Dynamic_MIN = (u8) pDM_DigTable->AntDiv_RSSI_max;
1579 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));
1585 DIG_Dynamic_MIN=dm_dig_min;
1591 pDM_DigTable->rx_gain_range_max = dm_dig_max;
1592 DIG_Dynamic_MIN = dm_dig_min;
1593 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n"));
1596 //1 Modify DIG lower bound, deal with abnormally large false alarm
1597 if(pFalseAlmCnt->Cnt_all > 10000)
1599 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n"));
1601 if(pDM_DigTable->LargeFAHit != 3)
1602 pDM_DigTable->LargeFAHit++;
1603 if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
1605 pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
1606 pDM_DigTable->LargeFAHit = 1;
1609 if(pDM_DigTable->LargeFAHit >= 3)
1611 if((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max)
1612 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
1614 pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
1615 pDM_DigTable->Recover_cnt = 3600; //3600=2hr
1621 //Recovery mechanism for IGI lower bound
1622 if(pDM_DigTable->Recover_cnt != 0)
1623 pDM_DigTable->Recover_cnt --;
1626 if(pDM_DigTable->LargeFAHit < 3)
1628 if((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN)
1630 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
1631 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
1632 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
1636 pDM_DigTable->ForbiddenIGI --;
1637 pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
1638 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
1643 pDM_DigTable->LargeFAHit = 0;
1647 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit));
1649 //1 Adjust initial gain by false alarm
1650 if(pDM_Odm->bLinked)
1652 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n"));
1655 CurrentIGI = pDM_Odm->RSSI_Min;
1656 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n"));
1660 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1662 if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_92D)
1663 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
1664 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_92D)
1665 CurrentIGI = CurrentIGI + 1; //pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
1666 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_92D)
1667 CurrentIGI = CurrentIGI - 1;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
1671 #if(BT_30_SUPPORT == 1)
1672 if(pDM_Odm->bBtBusy)
1674 if(pFalseAlmCnt->Cnt_all > 0x300)
1675 CurrentIGI = CurrentIGI + 2;
1676 else if (pFalseAlmCnt->Cnt_all > 0x250)
1677 CurrentIGI = CurrentIGI + 1;
1678 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
1679 CurrentIGI = CurrentIGI -1;
1684 if(pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2)
1685 CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
1686 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1)
1687 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
1688 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0)
1689 CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
1698 //CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min
1699 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n"));
1702 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1703 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect \n"));
1707 //2012.03.30 LukeLee: enable DIG before link but with very high thresholds
1708 if(pFalseAlmCnt->Cnt_all > 10000)
1709 CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2;
1710 else if (pFalseAlmCnt->Cnt_all > 8000)
1711 CurrentIGI = CurrentIGI + 1;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1;
1712 else if(pFalseAlmCnt->Cnt_all < 500)
1713 CurrentIGI = CurrentIGI - 1;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1;
1714 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG \n"));
1717 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n"));
1718 //1 Check initial gain by upper/lower bound
1720 if(pDM_DigTable->CurIGValue > pDM_DigTable->rx_gain_range_max)
1721 pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_max;
1722 if(pDM_DigTable->CurIGValue < pDM_DigTable->rx_gain_range_min)
1723 pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min;
1725 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
1726 CurrentIGI = pDM_DigTable->rx_gain_range_max;
1727 if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
1728 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1730 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",
1731 pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min));
1732 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all));
1733 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI));
1735 //2 High power RSSI threshold
1737 #if (RTL8192D_SUPPORT==1)
1738 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1740 //sherry delete DualMacSmartConncurrent 20110517
1741 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
1743 ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
1744 if(*(pDM_Odm->pbMasterOfDMSP))
1746 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1747 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1751 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1752 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1757 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1758 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
1760 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1761 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1765 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1766 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1773 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1774 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1775 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1780 //3============================================================
1781 //3 FASLE ALARM CHECK
1782 //3============================================================
1785 odm_FalseAlarmCounterStatistics(
1790 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1792 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
1795 // if(pDM_Odm->SupportICType != ODM_RTL8812)
1796 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1800 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
1801 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
1803 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
1804 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
1805 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
1806 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
1807 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
1808 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
1809 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
1810 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
1811 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
1812 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
1813 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
1815 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
1816 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
1817 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
1819 #if (RTL8188E_SUPPORT==1)
1820 if(pDM_Odm->SupportICType == ODM_RTL8188E)
1822 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
1823 FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
1824 FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
1828 #if (RTL8192D_SUPPORT==1)
1829 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1831 odm_GetCCKFalseAlarm_92D(pDM_Odm);
1837 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
1838 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
1840 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
1841 FalseAlmCnt->Cnt_Cck_fail = ret_value;
1842 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
1843 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
1845 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
1846 FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
1849 FalseAlmCnt->Cnt_all = (FalseAlmCnt->Cnt_Fast_Fsync +
1850 FalseAlmCnt->Cnt_SB_Search_fail +
1851 FalseAlmCnt->Cnt_Parity_Fail +
1852 FalseAlmCnt->Cnt_Rate_Illegal +
1853 FalseAlmCnt->Cnt_Crc8_fail +
1854 FalseAlmCnt->Cnt_Mcs_fail +
1855 FalseAlmCnt->Cnt_Cck_fail);
1857 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
1859 #if (RTL8192C_SUPPORT==1)
1860 if(pDM_Odm->SupportICType == ODM_RTL8192C)
1861 odm_ResetFACounter_92C(pDM_Odm);
1864 #if (RTL8192D_SUPPORT==1)
1865 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1866 odm_ResetFACounter_92D(pDM_Odm);
1869 if(pDM_Odm->SupportICType >=ODM_RTL8723A)
1871 //reset false alarm counter registers
1872 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
1873 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
1874 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
1875 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
1876 //update ofdm counter
1877 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
1878 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
1880 //reset CCK CCA counter
1881 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
1882 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
1883 //reset CCK FA counter
1884 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
1885 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
1888 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
1889 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
1890 FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
1891 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
1892 FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
1893 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
1894 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
1896 else //FOR ODM_IC_11AC_SERIES
1898 //read OFDM FA counter
1899 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
1900 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
1901 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
1903 // reset OFDM FA coutner
1904 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
1905 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
1906 // reset CCK FA counter
1907 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
1908 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
1910 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
1911 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
1912 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
1915 //3============================================================
1916 //3 CCK Packet Detect Threshold
1917 //3============================================================
1920 odm_CCKPacketDetectionThresh(
1925 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1927 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1929 if(!(pDM_Odm->SupportAbility & (ODM_BB_CCK_PD|ODM_BB_FA_CNT)))
1935 if(pDM_Odm->bLinked)
1937 if(pDM_Odm->RSSI_Min > 25)
1938 CurCCK_CCAThres = 0xcd;
1939 else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
1940 CurCCK_CCAThres = 0x83;
1943 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1944 CurCCK_CCAThres = 0x83;
1946 CurCCK_CCAThres = 0x40;
1951 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1952 CurCCK_CCAThres = 0x83;
1954 CurCCK_CCAThres = 0x40;
1957 #if (RTL8192D_SUPPORT==1)
1958 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1959 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
1962 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
1966 ODM_Write_CCK_CCA_Thres(
1971 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1973 if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
1975 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
1977 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
1978 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
1982 //3============================================================
1984 //3============================================================
1986 odm_DynamicBBPowerSavingInit(
1990 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
1992 pDM_PSTable->PreCCAState = CCA_MAX;
1993 pDM_PSTable->CurCCAState = CCA_MAX;
1994 pDM_PSTable->PreRFState = RF_MAX;
1995 pDM_PSTable->CurRFState = RF_MAX;
1996 pDM_PSTable->Rssi_val_min = 0;
1997 pDM_PSTable->initialize = 0;
2002 odm_DynamicBBPowerSaving(
2006 if ((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8723A))
2008 if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE))
2010 if(!(pDM_Odm->SupportPlatform & (ODM_MP|ODM_CE)))
2013 //1 2.Power Saving for 92C
2014 if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
2016 odm_1R_CCA(pDM_Odm);
2019 // 20100628 Joseph: Turn off BB power save for 88CE because it makesthroughput unstable.
2020 // 20100831 Joseph: Turn ON BB power save again after modifying AGC delay from 900ns ot 600ns.
2021 //1 3.Power Saving for 88C
2024 ODM_RF_Saving(pDM_Odm, FALSE);
2033 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
2035 if(pDM_Odm->RSSI_Min!= 0xFF)
2038 if(pDM_PSTable->PreCCAState == CCA_2R)
2040 if(pDM_Odm->RSSI_Min >= 35)
2041 pDM_PSTable->CurCCAState = CCA_1R;
2043 pDM_PSTable->CurCCAState = CCA_2R;
2047 if(pDM_Odm->RSSI_Min <= 30)
2048 pDM_PSTable->CurCCAState = CCA_2R;
2050 pDM_PSTable->CurCCAState = CCA_1R;
2054 pDM_PSTable->CurCCAState=CCA_MAX;
2057 if(pDM_PSTable->PreCCAState != pDM_PSTable->CurCCAState)
2059 if(pDM_PSTable->CurCCAState == CCA_1R)
2061 if( pDM_Odm->RFType ==ODM_2T2R )
2063 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x13);
2064 //PHY_SetBBReg(pAdapter, 0xe70, bMaskByte3, 0x20);
2068 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x23);
2069 //PHY_SetBBReg(pAdapter, 0xe70, 0x7fc00000, 0x10c); // Set RegE70[30:22] = 9b'100001100
2074 ODM_SetBBReg(pDM_Odm, 0xc04 , bMaskByte0, 0x33);
2075 //PHY_SetBBReg(pAdapter,0xe70, bMaskByte3, 0x63);
2077 pDM_PSTable->PreCCAState = pDM_PSTable->CurCCAState;
2079 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("CCAStage = %s\n",(pDM_PSTable->CurCCAState==0)?"1RCCA":"2RCCA"));
2088 pPS_T pDM_PSTable = &pDM_Odm->DM_PSTable;
2089 u8 Rssi_Up_bound = 30 ;
2090 u8 Rssi_Low_bound = 25;
2091 if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
2093 Rssi_Up_bound = 50 ;
2094 Rssi_Low_bound = 45;
2096 if(pDM_PSTable->initialize == 0){
2098 pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
2099 pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
2100 pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
2101 pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
2102 //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
2103 pDM_PSTable->initialize = 1;
2108 if(pDM_Odm->RSSI_Min != 0xFF)
2110 if(pDM_PSTable->PreRFState == RF_Normal)
2112 if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
2113 pDM_PSTable->CurRFState = RF_Save;
2115 pDM_PSTable->CurRFState = RF_Normal;
2118 if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
2119 pDM_PSTable->CurRFState = RF_Normal;
2121 pDM_PSTable->CurRFState = RF_Save;
2125 pDM_PSTable->CurRFState=RF_MAX;
2129 pDM_PSTable->CurRFState = RF_Normal;
2132 if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
2134 if(pDM_PSTable->CurRFState == RF_Save)
2136 // <tynli_note> 8723 RSSI report will be wrong. Set 0x874[5]=1 when enter BB power saving mode.
2137 // Suggested by SD3 Yu-Nan. 2011.01.20.
2138 if(pDM_Odm->SupportICType == ODM_RTL8723A)
2140 ODM_SetBBReg(pDM_Odm, 0x874 , BIT5, 0x1); //Reg874[5]=1b'1
2142 ODM_SetBBReg(pDM_Odm, 0x874 , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
2143 ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
2144 ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
2145 ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
2146 ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
2147 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
2148 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
2149 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Save"));
2153 ODM_SetBBReg(pDM_Odm, 0x874 , 0x1CC000, pDM_PSTable->Reg874);
2154 ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70);
2155 ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
2156 ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74);
2157 ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);
2159 if(pDM_Odm->SupportICType == ODM_RTL8723A)
2161 ODM_SetBBReg(pDM_Odm,0x874 , BIT5, 0x0); //Reg874[5]=1b'0
2163 //ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, (" RF_Normal"));
2165 pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
2170 //3============================================================
2172 //3============================================================
2173 //3============================================================
2175 //3============================================================
2178 odm_RateAdaptiveMaskInit(
2182 PODM_RATE_ADAPTIVE pOdmRA = &pDM_Odm->RateAdaptive;
2184 pOdmRA->Type = DM_Type_ByDriver;
2185 if (pOdmRA->Type == DM_Type_ByDriver)
2186 pDM_Odm->bUseRAMask = _TRUE;
2188 pDM_Odm->bUseRAMask = _FALSE;
2190 pOdmRA->RATRState = DM_RATR_STA_INIT;
2191 pOdmRA->HighRSSIThresh = 50;
2192 pOdmRA->LowRSSIThresh = 20;
2195 u4Byte ODM_Get_Rate_Bitmap(
2202 u4Byte rate_bitmap = 0x0fffffff;
2204 //u8 WirelessMode =*(pDM_Odm->pWirelessMode);
2207 pEntry = pDM_Odm->pODM_StaInfo[macid];
2208 if(!IS_STA_VALID(pEntry))
2211 WirelessMode = pEntry->wireless_mode;
2213 switch(WirelessMode)
2216 if(ra_mask & 0x0000000c) //11M or 5.5M enable
2217 rate_bitmap = 0x0000000d;
2219 rate_bitmap = 0x0000000f;
2222 case (ODM_WM_A|ODM_WM_G):
2223 if(rssi_level == DM_RATR_STA_HIGH)
2224 rate_bitmap = 0x00000f00;
2226 rate_bitmap = 0x00000ff0;
2229 case (ODM_WM_B|ODM_WM_G):
2230 if(rssi_level == DM_RATR_STA_HIGH)
2231 rate_bitmap = 0x00000f00;
2232 else if(rssi_level == DM_RATR_STA_MIDDLE)
2233 rate_bitmap = 0x00000ff0;
2235 rate_bitmap = 0x00000ff5;
2238 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G) :
2239 case (ODM_WM_A|ODM_WM_B|ODM_WM_G|ODM_WM_N24G) :
2241 if (pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)
2243 if(rssi_level == DM_RATR_STA_HIGH)
2245 rate_bitmap = 0x000f0000;
2247 else if(rssi_level == DM_RATR_STA_MIDDLE)
2249 rate_bitmap = 0x000ff000;
2252 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
2253 rate_bitmap = 0x000ff015;
2255 rate_bitmap = 0x000ff005;
2260 if(rssi_level == DM_RATR_STA_HIGH)
2262 rate_bitmap = 0x0f8f0000;
2264 else if(rssi_level == DM_RATR_STA_MIDDLE)
2266 rate_bitmap = 0x0f8ff000;
2270 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
2271 rate_bitmap = 0x0f8ff015;
2273 rate_bitmap = 0x0f8ff005;
2279 //case WIRELESS_11_24N:
2280 //case WIRELESS_11_5N:
2281 if(pDM_Odm->RFType == RF_1T2R)
2282 rate_bitmap = 0x000fffff;
2284 rate_bitmap = 0x0fffffff;
2289 //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);
2290 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));
2296 /*-----------------------------------------------------------------------------
2297 * Function: odm_RefreshRateAdaptiveMask()
2299 * Overview: Update rate table mask according to rssi
2309 * 05/27/2009 hpfan Create Version 0.
2311 *---------------------------------------------------------------------------*/
2313 odm_RefreshRateAdaptiveMask(
2317 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
2320 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
2321 // at the same time. In the stage2/3, we need to prive universal interface and merge all
2322 // HW dynamic mechanism.
2324 switch (pDM_Odm->SupportPlatform)
2327 odm_RefreshRateAdaptiveMaskMP(pDM_Odm);
2331 odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
2336 odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);
2343 odm_RefreshRateAdaptiveMaskMP(
2351 odm_RefreshRateAdaptiveMaskCE(
2356 PADAPTER pAdapter = pDM_Odm->Adapter;
2358 if(pAdapter->bDriverStopped)
2360 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));
2364 if(!pDM_Odm->bUseRAMask)
2366 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));
2370 //printk("==> %s \n",__FUNCTION__);
2372 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
2373 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
2374 if(IS_STA_VALID(pstat) ) {
2375 if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) )
2377 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));
2378 //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);
2379 rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
2388 odm_RefreshRateAdaptiveMaskAPADSL(
2394 // Return Value: bool
2395 // - TRUE: RATRState is changed.
2404 PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;
2405 const u8 GoUpGap = 5;
2406 u8 HighRSSIThreshForRA = pRA->HighRSSIThresh;
2407 u8 LowRSSIThreshForRA = pRA->LowRSSIThresh;
2410 // Threshold Adjustment:
2411 // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.
2412 // Here GoUpGap is added to solve the boundary's level alternation issue.
2413 switch (*pRATRState)
2415 case DM_RATR_STA_INIT:
2416 case DM_RATR_STA_HIGH:
2419 case DM_RATR_STA_MIDDLE:
2420 HighRSSIThreshForRA += GoUpGap;
2423 case DM_RATR_STA_LOW:
2424 HighRSSIThreshForRA += GoUpGap;
2425 LowRSSIThreshForRA += GoUpGap;
2429 ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );
2433 // Decide RATRState by RSSI.
2434 if(RSSI > HighRSSIThreshForRA)
2435 RATRState = DM_RATR_STA_HIGH;
2436 else if(RSSI > LowRSSIThreshForRA)
2437 RATRState = DM_RATR_STA_MIDDLE;
2439 RATRState = DM_RATR_STA_LOW;
2440 //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);
2442 if( *pRATRState!=RATRState || bForceUpdate)
2444 ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );
2445 *pRATRState = RATRState;
2453 //============================================================
2455 //3============================================================
2456 //3 Dynamic Tx Power
2457 //3============================================================
2460 odm_DynamicTxPowerInit(
2464 PADAPTER Adapter = pDM_Odm->Adapter;
2465 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2466 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2467 pdmpriv->bDynamicTxPowerEnable = _FALSE;
2469 #if (RTL8192C_SUPPORT==1)
2471 #ifdef CONFIG_INTEL_PROXIM
2472 if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
2474 if(pHalData->BoardType == BOARD_USB_High_PA)
2478 //odm_SavePowerIndex(Adapter);
2479 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
2480 pdmpriv->bDynamicTxPowerEnable = _TRUE;
2485 pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
2486 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2490 odm_DynamicTxPowerSavePowerIndex(
2495 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
2497 PADAPTER Adapter = pDM_Odm->Adapter;
2498 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2499 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2500 for(index = 0; index< 6; index++)
2501 pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
2505 odm_DynamicTxPowerRestorePowerIndex(
2510 PADAPTER Adapter = pDM_Odm->Adapter;
2512 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2513 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
2514 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2515 for(index = 0; index< 6; index++)
2516 rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
2520 odm_DynamicTxPowerWritePowerIndex(
2526 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
2528 for(index = 0; index< 6; index++)
2529 //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
2530 ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
2541 // For AP/ADSL use prtl8192cd_priv
2542 // For CE/NIC use PADAPTER
2544 //PADAPTER pAdapter = pDM_Odm->Adapter;
2545 // prtl8192cd_priv priv = pDM_Odm->priv;
2547 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
2550 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
2551 if (pDM_Odm->ExtPA == FALSE)
2556 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
2557 // at the same time. In the stage2/3, we need to prive universal interface and merge all
2558 // HW dynamic mechanism.
2560 switch (pDM_Odm->SupportPlatform)
2564 odm_DynamicTxPowerNIC(pDM_Odm);
2567 odm_DynamicTxPowerAP(pDM_Odm);
2571 //odm_DIGAP(pDM_Odm);
2580 odm_DynamicTxPowerNIC(
2584 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
2587 if(pDM_Odm->SupportICType == ODM_RTL8192C)
2589 odm_DynamicTxPower_92C(pDM_Odm);
2591 else if(pDM_Odm->SupportICType == ODM_RTL8192D)
2593 odm_DynamicTxPower_92D(pDM_Odm);
2595 else if (pDM_Odm->SupportICType & ODM_RTL8188E)
2599 else if (pDM_Odm->SupportICType == ODM_RTL8188E)
2602 // This part need to be redefined.
2607 odm_DynamicTxPowerAP(
2616 odm_DynamicTxPower_92C(
2620 #if (RTL8192C_SUPPORT==1)
2621 PADAPTER Adapter = pDM_Odm->Adapter;
2622 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2623 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2624 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
2625 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
2626 int UndecoratedSmoothedPWDB;
2628 if(!pdmpriv->bDynamicTxPowerEnable)
2631 #ifdef CONFIG_INTEL_PROXIM
2632 if(Adapter->proximity.proxim_on== _TRUE){
2633 struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
2634 // Intel set fixed tx power
2635 printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
2636 if(prox_priv!=NULL){
2637 if(prox_priv->proxim_modeinfo->power_output> 0)
2639 switch(prox_priv->proxim_modeinfo->power_output)
2642 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
2643 printk("TxHighPwrLevel_100\n");
2646 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
2647 printk("TxHighPwrLevel_70\n");
2650 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
2651 printk("TxHighPwrLevel_50\n");
2654 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
2655 printk("TxHighPwrLevel_35\n");
2658 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
2659 printk("TxHighPwrLevel_15\n");
2662 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
2663 printk("TxHighPwrLevel_100\n");
2672 // STA not connected and AP not connected
2673 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
2674 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
2676 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
2677 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2679 //the LastDTPlvl should reset when disconnect,
2680 //otherwise the tx power level wouldn't change when disconnect and connect again.
2681 // Maddest 20091220.
2682 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
2686 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
2688 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
2690 else // associated entry pwdb
2692 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
2693 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
2696 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
2698 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
2699 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
2701 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
2702 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
2704 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
2705 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
2707 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
2709 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2710 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
2713 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
2715 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
2716 if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
2717 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
2718 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
2719 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
2720 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
2721 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
2723 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
2729 odm_DynamicTxPower_92D(
2733 #if (RTL8192D_SUPPORT==1)
2734 PADAPTER Adapter = pDM_Odm->Adapter;
2735 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2736 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
2738 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2739 DM_ODM_T *podmpriv = &pHalData->odmpriv;
2740 int UndecoratedSmoothedPWDB;
2741 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
2742 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
2743 bool bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
2744 u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
2747 // If dynamic high power is disabled.
2748 if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
2749 (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
2751 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2755 // STA not connected and AP not connected
2756 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
2757 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
2759 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
2760 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2761 //the LastDTPlvl should reset when disconnect,
2762 //otherwise the tx power level wouldn't change when disconnect and connect again.
2763 // Maddest 20091220.
2764 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
2768 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
2770 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
2772 else // associated entry pwdb
2774 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
2775 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
2777 #if TX_POWER_FOR_5G_BAND == 1
2778 if(pHalData->CurrentBandType92D == BAND_ON_5G){
2779 if(UndecoratedSmoothedPWDB >= 0x33)
2781 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
2782 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
2784 else if((UndecoratedSmoothedPWDB <0x33) &&
2785 (UndecoratedSmoothedPWDB >= 0x2b) )
2787 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
2788 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
2790 else if(UndecoratedSmoothedPWDB < 0x2b)
2792 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2793 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
2799 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
2801 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
2802 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
2804 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
2805 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
2807 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
2808 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
2810 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
2812 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
2813 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
2816 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
2817 if(bGetValueFromBuddyAdapter)
2819 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
2820 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
2822 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
2823 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
2824 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
2825 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
2826 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
2827 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
2832 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
2834 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
2835 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
2836 if(BuddyAdapter == NULL)
2838 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
2839 if(!Adapter->bSlaveOfDMSP)
2841 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
2846 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
2848 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
2849 if(Adapter->bSlaveOfDMSP)
2851 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
2852 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
2853 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
2857 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
2858 if(!bGetValueFromBuddyAdapter)
2860 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
2861 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
2867 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
2868 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
2872 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
2875 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
2880 //3============================================================
2882 //3============================================================
2885 odm_RSSIMonitorInit(
2892 odm_RSSIMonitorCheck(
2897 // For AP/ADSL use prtl8192cd_priv
2898 // For CE/NIC use PADAPTER
2900 PADAPTER pAdapter = pDM_Odm->Adapter;
2901 prtl8192cd_priv priv = pDM_Odm->priv;
2903 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
2907 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
2908 // at the same time. In the stage2/3, we need to prive universal interface and merge all
2909 // HW dynamic mechanism.
2911 switch (pDM_Odm->SupportPlatform)
2914 odm_RSSIMonitorCheckMP(pDM_Odm);
2918 odm_RSSIMonitorCheckCE(pDM_Odm);
2922 odm_RSSIMonitorCheckAP(pDM_Odm);
2926 //odm_DIGAP(pDM_Odm);
2930 } // odm_RSSIMonitorCheck
2934 odm_RSSIMonitorCheckMP(
2941 //sherry move from DUSC to here 20110517
2944 FindMinimumRSSI_Dmsp(
2955 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2956 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2957 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
2959 //1 1.Determine the minimum RSSI
2961 if((pDM_Odm->bLinked != _TRUE) &&
2962 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
2964 pdmpriv->MinUndecoratedPWDBForDM = 0;
2965 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
2969 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
2972 //DBG_8723A("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);
2973 //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));
2977 odm_RSSIMonitorCheckCE(
2981 PADAPTER Adapter = pDM_Odm->Adapter;
2982 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2983 struct dm_priv *pdmpriv = &pHalData->dmpriv;
2985 int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;
2987 u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi
2989 if(pDM_Odm->bLinked != _TRUE)
2992 //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
2995 struct sta_info *psta;
2997 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {
2998 if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))
3000 if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
3001 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
3003 if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
3004 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
3006 if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {
3007 #if(RTL8192D_SUPPORT==1)
3008 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
3010 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
3017 _list *plist, *phead;
3018 struct sta_info *psta;
3019 struct sta_priv *pstapriv = &Adapter->stapriv;
3020 u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};
3022 _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
3024 for(i=0; i< NUM_STA; i++)
3026 phead = &(pstapriv->sta_hash[i]);
3027 plist = phead->next;
3029 while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)
3031 psta = container_of(plist, struct sta_info, hash_list);
3033 plist = plist->next;
3035 if (!memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) ||
3036 !memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))
3039 if(psta->state & WIFI_ASOC_STATE)
3042 if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
3043 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
3045 if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
3046 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
3048 if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){
3049 //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);
3050 #if(RTL8192D_SUPPORT==1)
3051 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));
3053 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
3062 _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
3065 //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);
3067 for(i=0; i< sta_cnt; i++)
3069 if(PWDB_rssi[i] != (0)){
3070 if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW
3072 #if(RTL8192D_SUPPORT==1)
3073 FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));
3074 #elif((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
3075 rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);
3079 #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))
3080 ODM_RA_SetRSSI_8188E(
3081 &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));
3088 if(tmpEntryMaxPWDB != 0) // If associated entry is found
3090 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
3094 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
3097 if(tmpEntryMinPWDB != 0xff) // If associated entry is found
3099 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
3103 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
3106 FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM
3108 #if(RTL8192D_SUPPORT==1)
3109 FindMinimumRSSI_Dmsp(Adapter);
3112 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
3115 odm_RSSIMonitorCheckAP(
3127 ODM_InitializeTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer,
3128 (RT_TIMER_CALL_BACK)odm_SwAntDivChkAntSwitchCallback, NULL, "SwAntennaSwitchTimer");
3132 ODM_CancelAllTimers(
3136 ODM_CancelTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
3141 ODM_ReleaseAllTimers(
3145 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->DM_SWAT_Table.SwAntennaSwitchTimer);
3147 #if (RTL8188E_SUPPORT == 1)
3148 ODM_ReleaseTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer);
3156 //3============================================================
3157 //3 Tx Power Tracking
3158 //3============================================================
3161 odm_TXPowerTrackingInit(
3165 odm_TXPowerTrackingThermalMeterInit(pDM_Odm);
3170 odm_TXPowerTrackingThermalMeterInit(
3174 #ifdef CONFIG_RTL8188E
3176 pDM_Odm->RFCalibrateInfo.bTXPowerTracking = _TRUE;
3177 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
3178 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = _FALSE;
3179 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
3180 MSG_8723A("pDM_Odm TxPowerTrackControl = %d\n", pDM_Odm->RFCalibrateInfo.TxPowerTrackControl);
3184 PADAPTER Adapter = pDM_Odm->Adapter;
3185 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3186 struct dm_priv *pdmpriv = &pHalData->dmpriv;
3188 pdmpriv->bTXPowerTracking = _TRUE;
3189 pdmpriv->TXPowercount = 0;
3190 pdmpriv->bTXPowerTrackingInit = _FALSE;
3191 pdmpriv->TxPowerTrackControl = _TRUE;
3192 MSG_8723A("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
3195 #endif//endif (CONFIG_RTL8188E==1)
3197 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = TRUE;
3202 ODM_TXPowerTrackingCheck(
3207 // For AP/ADSL use prtl8192cd_priv
3208 // For CE/NIC use PADAPTER
3210 PADAPTER pAdapter = pDM_Odm->Adapter;
3211 prtl8192cd_priv priv = pDM_Odm->priv;
3213 //if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
3217 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
3218 // at the same time. In the stage2/3, we need to prive universal interface and merge all
3219 // HW dynamic mechanism.
3221 switch (pDM_Odm->SupportPlatform)
3224 odm_TXPowerTrackingCheckMP(pDM_Odm);
3228 odm_TXPowerTrackingCheckCE(pDM_Odm);
3232 odm_TXPowerTrackingCheckAP(pDM_Odm);
3236 //odm_DIGAP(pDM_Odm);
3243 odm_TXPowerTrackingCheckCE(
3247 PADAPTER Adapter = pDM_Odm->Adapter;
3248 #if( (RTL8192C_SUPPORT==1) || (RTL8723A_SUPPORT==1) )
3249 rtl8192c_odm_CheckTXPowerTracking(Adapter);
3252 #if (RTL8192D_SUPPORT==1)
3253 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
3254 if(!Adapter->bSlaveOfDMSP)
3256 rtl8192d_odm_CheckTXPowerTracking(Adapter);
3258 #if(RTL8188E_SUPPORT==1)
3260 //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/)
3261 if(!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
3266 if(!pDM_Odm->RFCalibrateInfo.TM_Trigger) //at least delay 1 sec
3268 //pHalData->TxPowerCheckCnt++; //cosa add for debug
3269 //ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
3270 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER_88E, BIT17 | BIT16, 0x03);
3271 //DBG_8723A("Trigger 92C Thermal Meter!!\n");
3273 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
3279 //DBG_8723A("Schedule TxPowerTracking direct call!!\n");
3280 odm_TXPowerTrackingCallback_ThermalMeter_8188E(Adapter);
3281 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
3287 odm_TXPowerTrackingCheckMP(
3294 odm_TXPowerTrackingCheckAP(
3302 //antenna mapping info
3303 // 1: right-side antenna
3304 // 2/0: left-side antenna
3305 //PDM_SWAT_Table->CCK_Ant1_Cnt /OFDM_Ant1_Cnt: for right-side antenna: Ant:1 RxDefaultAnt1
3306 //PDM_SWAT_Table->CCK_Ant2_Cnt /OFDM_Ant2_Cnt: for left-side antenna: Ant:0 RxDefaultAnt2
3307 // We select left antenna as default antenna in initial process, modify it as needed
3311 //3============================================================
3312 //3 SW Antenna Diversity
3313 //3============================================================
3314 #if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
3320 odm_SwAntDivInit_NIC(pDM_Odm);
3322 #if (RTL8723A_SUPPORT==1)
3323 // Only for 8723A SW ANT DIV INIT--2012--07--17
3325 odm_SwAntDivInit_NIC_8723A(
3328 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3329 PADAPTER Adapter = pDM_Odm->Adapter;
3330 u8 btAntNum=BT_GetPGAntNum(Adapter);
3333 pDM_SWAT_Table->ANTA_ON =TRUE;
3335 // Set default antenna B status by PG
3336 if(btAntNum == Ant_x2)
3337 pDM_SWAT_Table->ANTB_ON = TRUE;
3338 else if(btAntNum ==Ant_x1)
3339 pDM_SWAT_Table->ANTB_ON = FALSE;
3341 pDM_SWAT_Table->ANTB_ON = TRUE;
3345 odm_SwAntDivInit_NIC(
3349 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3350 // Init SW ANT DIV mechanism for 8723AE/AU/AS// Neil Chen--2012--07--17---
3351 // CE/AP/ADSL no using SW ANT DIV for 8723A Series IC
3352 //#if (DM_ODM_SUPPORT_TYPE==ODM_MP)
3353 #if (RTL8723A_SUPPORT==1)
3354 if(pDM_Odm->SupportICType == ODM_RTL8723A)
3356 odm_SwAntDivInit_NIC_8723A(pDM_Odm);
3359 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS:Init SW Antenna Switch\n"));
3360 pDM_SWAT_Table->RSSI_sum_A = 0;
3361 pDM_SWAT_Table->RSSI_cnt_A = 0;
3362 pDM_SWAT_Table->RSSI_sum_B = 0;
3363 pDM_SWAT_Table->RSSI_cnt_B = 0;
3364 pDM_SWAT_Table->CurAntenna = Antenna_A;
3365 pDM_SWAT_Table->PreAntenna = Antenna_A;
3366 pDM_SWAT_Table->try_flag = 0xff;
3367 pDM_SWAT_Table->PreRSSI = 0;
3368 pDM_SWAT_Table->SWAS_NoLink_State = 0;
3369 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
3370 pDM_SWAT_Table->SelectAntennaMap=0xAA;
3371 pDM_SWAT_Table->lastTxOkCnt = 0;
3372 pDM_SWAT_Table->lastRxOkCnt = 0;
3373 pDM_SWAT_Table->TXByteCnt_A = 0;
3374 pDM_SWAT_Table->TXByteCnt_B = 0;
3375 pDM_SWAT_Table->RXByteCnt_A = 0;
3376 pDM_SWAT_Table->RXByteCnt_B = 0;
3377 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
3378 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ODM_Read4Byte(pDM_Odm, 0x860);
3383 // Add new function to reset the state of antenna diversity before link.
3386 ODM_SwAntDivResetBeforeLink(
3391 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3393 pDM_SWAT_Table->SWAS_NoLink_State = 0;
3398 // 20100514 Luke/Joseph:
3399 // Add new function to reset antenna diversity state after link.
3402 ODM_SwAntDivRestAfterLink(
3406 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3408 pDM_SWAT_Table->RSSI_cnt_A = 0;
3409 pDM_SWAT_Table->RSSI_cnt_B = 0;
3410 pDM_Odm->RSSI_test = FALSE;
3411 pDM_SWAT_Table->try_flag = 0xff;
3412 pDM_SWAT_Table->RSSI_Trying = 0;
3413 pDM_SWAT_Table->SelectAntennaMap=0xAA;
3417 ODM_SwAntDivChkPerPktRssi(
3420 PODM_PHY_INFO_T pPhyInfo
3423 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3425 if(!(pDM_Odm->SupportAbility & (ODM_BB_ANT_DIV)))
3428 if(StationID == pDM_SWAT_Table->RSSI_target)
3430 //1 RSSI for SW Antenna Switch
3431 if(pDM_SWAT_Table->CurAntenna == Antenna_A)
3433 pDM_SWAT_Table->RSSI_sum_A += pPhyInfo->RxPWDBAll;
3434 pDM_SWAT_Table->RSSI_cnt_A++;
3438 pDM_SWAT_Table->RSSI_sum_B += pPhyInfo->RxPWDBAll;
3439 pDM_SWAT_Table->RSSI_cnt_B++;
3448 odm_SwAntDivChkAntSwitch(
3454 // For AP/ADSL use prtl8192cd_priv
3455 // For CE/NIC use PADAPTER
3457 PADAPTER pAdapter = pDM_Odm->Adapter;
3458 prtl8192cd_priv priv = pDM_Odm->priv;
3461 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
3462 // at the same time. In the stage2/3, we need to prive universal interface and merge all
3463 // HW dynamic mechanism.
3465 switch (pDM_Odm->SupportPlatform)
3469 odm_SwAntDivChkAntSwitchNIC(pDM_Odm, Step);
3480 // 20100514 Luke/Joseph:
3481 // Add new function for antenna diversity after link.
3482 // This is the main function of antenna diversity after link.
3483 // This function is called in HalDmWatchDog() and ODM_SwAntDivChkAntSwitchCallback().
3484 // HalDmWatchDog() calls this function with SWAW_STEP_PEAK to initialize the antenna test.
3485 // In SWAW_STEP_PEAK, another antenna and a 500ms timer will be set for testing.
3486 // After 500ms, ODM_SwAntDivChkAntSwitchCallback() calls this function to compare the signal just
3487 // listened on the air with the RSSI of original antenna.
3488 // It chooses the antenna with better RSSI.
3489 // There is also a aged policy for error trying. Each error trying will cost more 5 seconds waiting
3490 // penalty to get next try.
3498 ODM_SetBBReg(pDM_Odm, 0x860, BIT8|BIT9, Antenna);
3500 //--------------------------------2012--09--06--
3501 //Note: Antenna_Main--> Antenna_A
3502 // Antenna_Aux---> Antenna_B
3503 //----------------------------------
3505 odm_SwAntDivChkAntSwitchNIC(
3510 #if ((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))
3511 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
3512 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
3513 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3514 s4Byte curRSSI=100, RSSI_A, RSSI_B;
3515 u8 nextAntenna=Antenna_B;
3516 //static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
3517 u8Byte curTxOkCnt, curRxOkCnt;
3518 //static u8Byte TXByteCnt_A=0, TXByteCnt_B=0, RXByteCnt_A=0, RXByteCnt_B=0;
3519 u8Byte CurByteCnt=0, PreByteCnt=0;
3520 //static u8 TrafficLoad = TRAFFIC_LOW;
3521 u8 Score_A=0, Score_B=0;
3524 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
3527 if (pDM_Odm->SupportICType & (ODM_RTL8192D|ODM_RTL8188E))
3530 if((pDM_Odm->SupportICType == ODM_RTL8192C) &&(pDM_Odm->RFType == ODM_2T2R))
3533 if(pDM_Odm->SupportPlatform & ODM_MP)
3535 if(*(pDM_Odm->pAntennaTest))
3539 if((pDM_SWAT_Table->ANTA_ON == FALSE) ||(pDM_SWAT_Table->ANTB_ON == FALSE))
3541 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
3542 ("odm_SwAntDivChkAntSwitch(): No AntDiv Mechanism, Antenna A or B is off\n"));
3546 // Radio off: Status reset to default and return.
3547 if(*(pDM_Odm->pbPowerSaving)==TRUE) //pHalData->eRFPowerState==eRfOff
3549 ODM_SwAntDivRestAfterLink(pDM_Odm);
3554 // Handling step mismatch condition.
3555 // Peak step is not finished at last time. Recover the variable and check again.
3556 if( Step != pDM_SWAT_Table->try_flag )
3558 ODM_SwAntDivRestAfterLink(pDM_Odm);
3561 if(pDM_SWAT_Table->try_flag == 0xff)
3563 pDM_SWAT_Table->RSSI_target = 0xff;
3567 PSTA_INFO_T pEntry = NULL;
3570 for(index=0; index<ODM_ASSOCIATE_ENTRY_NUM; index++)
3572 pEntry = pDM_Odm->pODM_StaInfo[index];
3573 if(IS_STA_VALID(pEntry) ) {
3579 ODM_SwAntDivRestAfterLink(pDM_Odm);
3580 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): No Link.\n"));
3585 pDM_SWAT_Table->RSSI_target = index;
3586 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SwAntDivChkAntSwitch(): RSSI_target is PEER STA\n"));
3590 pDM_SWAT_Table->RSSI_cnt_A = 0;
3591 pDM_SWAT_Table->RSSI_cnt_B = 0;
3592 pDM_SWAT_Table->try_flag = 0;
3593 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("odm_SwAntDivChkAntSwitch(): Set try_flag to 0 prepare for peak!\n"));
3598 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_SWAT_Table->lastTxOkCnt;
3599 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_SWAT_Table->lastRxOkCnt;
3600 pDM_SWAT_Table->lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
3601 pDM_SWAT_Table->lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
3602 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("curTxOkCnt = %lld\n",curTxOkCnt));
3603 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("curRxOkCnt = %lld\n",curRxOkCnt));
3604 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("lastTxOkCnt = %lld\n",pDM_SWAT_Table->lastTxOkCnt));
3605 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("lastRxOkCnt = %lld\n",pDM_SWAT_Table->lastRxOkCnt));
3607 if(pDM_SWAT_Table->try_flag == 1)
3609 if(pDM_SWAT_Table->CurAntenna == Antenna_A)
3611 pDM_SWAT_Table->TXByteCnt_A += curTxOkCnt;
3612 pDM_SWAT_Table->RXByteCnt_A += curRxOkCnt;
3616 pDM_SWAT_Table->TXByteCnt_B += curTxOkCnt;
3617 pDM_SWAT_Table->RXByteCnt_B += curRxOkCnt;
3620 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
3621 pDM_SWAT_Table->RSSI_Trying--;
3622 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = %d\n",pDM_SWAT_Table->RSSI_Trying));
3623 if(pDM_SWAT_Table->RSSI_Trying == 0)
3625 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);
3626 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);
3628 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
3629 //CurByteCnt = PlatformDivision64(CurByteCnt, 9);
3630 PreByteCnt = PreByteCnt*9;
3631 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
3632 //CurByteCnt = PlatformDivision64(CurByteCnt, 2);
3633 PreByteCnt = PreByteCnt*2;
3635 if(pDM_SWAT_Table->RSSI_cnt_A > 0)
3636 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
3639 if(pDM_SWAT_Table->RSSI_cnt_B > 0)
3640 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
3643 curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
3644 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_B : RSSI_A;
3645 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Luke:PreRSSI = %d, CurRSSI = %d\n",pDM_SWAT_Table->PreRSSI, curRSSI));
3646 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n",
3647 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
3648 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",
3649 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
3656 if(pDM_SWAT_Table->RSSI_cnt_A > 0)
3657 RSSI_A = pDM_SWAT_Table->RSSI_sum_A/pDM_SWAT_Table->RSSI_cnt_A;
3660 if(pDM_SWAT_Table->RSSI_cnt_B > 0)
3661 RSSI_B = pDM_SWAT_Table->RSSI_sum_B/pDM_SWAT_Table->RSSI_cnt_B;
3664 curRSSI = (pDM_SWAT_Table->CurAntenna == Antenna_A)? RSSI_A : RSSI_B;
3665 pDM_SWAT_Table->PreRSSI = (pDM_SWAT_Table->PreAntenna == Antenna_A)? RSSI_A : RSSI_B;
3666 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Ekul:PreRSSI = %d, CurRSSI = %d\n", pDM_SWAT_Table->PreRSSI, curRSSI));
3667 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: preAntenna= %s, curAntenna= %s \n",
3668 (pDM_SWAT_Table->PreAntenna == Antenna_A?"A":"B"), (pDM_SWAT_Table->CurAntenna == Antenna_A?"A":"B")));
3670 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",
3671 RSSI_A, pDM_SWAT_Table->RSSI_cnt_A, RSSI_B, pDM_SWAT_Table->RSSI_cnt_B));
3672 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curTxOkCnt = %d\n", curTxOkCnt));
3673 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Ekul:curRxOkCnt = %d\n", curRxOkCnt));
3677 if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0))
3680 if(pDM_SWAT_Table->TestMode == TP_MODE)
3682 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = TP_MODE"));
3683 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:CurByteCnt = %lld,", CurByteCnt));
3684 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TRY:PreByteCnt = %lld\n",PreByteCnt));
3685 if(CurByteCnt < PreByteCnt)
3687 if(pDM_SWAT_Table->CurAntenna == Antenna_A)
3688 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
3690 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
3694 if(pDM_SWAT_Table->CurAntenna == Antenna_A)
3695 pDM_SWAT_Table->SelectAntennaMap=(pDM_SWAT_Table->SelectAntennaMap<<1)+1;
3697 pDM_SWAT_Table->SelectAntennaMap=pDM_SWAT_Table->SelectAntennaMap<<1;
3699 for (i= 0; i<8; i++)
3701 if(((pDM_SWAT_Table->SelectAntennaMap>>i)&BIT0) == 1)
3706 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SelectAntennaMap=%x\n ",pDM_SWAT_Table->SelectAntennaMap));
3707 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Score_A=%d, Score_B=%d\n", Score_A, Score_B));
3709 if(pDM_SWAT_Table->CurAntenna == Antenna_A)
3711 nextAntenna = (Score_A > Score_B)?Antenna_A:Antenna_B;
3715 nextAntenna = (Score_B > Score_A)?Antenna_B:Antenna_A;
3717 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("nextAntenna=%s\n",(nextAntenna==Antenna_A)?"A":"B"));
3718 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("preAntenna= %s, curAntenna= %s \n",
3719 //(DM_SWAT_Table.PreAntenna == Antenna_A?"A":"B"), (DM_SWAT_Table.CurAntenna == Antenna_A?"A":"B")));
3721 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
3723 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
3727 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
3731 if(pDM_SWAT_Table->TestMode == RSSI_MODE)
3733 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: TestMode = RSSI_MODE"));
3734 pDM_SWAT_Table->SelectAntennaMap=0xAA;
3735 if(curRSSI < pDM_SWAT_Table->PreRSSI) //Current antenna is worse than previous antenna
3737 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Switch back to another antenna"));
3738 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
3740 else // current anntena is good
3742 nextAntenna =pDM_SWAT_Table->CurAntenna;
3743 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: current anntena is good\n"));
3746 pDM_SWAT_Table->try_flag = 0;
3747 pDM_Odm->RSSI_test = FALSE;
3748 pDM_SWAT_Table->RSSI_sum_A = 0;
3749 pDM_SWAT_Table->RSSI_cnt_A = 0;
3750 pDM_SWAT_Table->RSSI_sum_B = 0;
3751 pDM_SWAT_Table->RSSI_cnt_B = 0;
3752 pDM_SWAT_Table->TXByteCnt_A = 0;
3753 pDM_SWAT_Table->TXByteCnt_B = 0;
3754 pDM_SWAT_Table->RXByteCnt_A = 0;
3755 pDM_SWAT_Table->RXByteCnt_B = 0;
3760 else if(pDM_SWAT_Table->try_flag == 0)
3762 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
3764 if ((curTxOkCnt+curRxOkCnt) > 3750000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
3765 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
3767 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
3769 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
3771 if ((curTxOkCnt+curRxOkCnt) > 3750000) //if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000)
3772 pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
3774 pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
3776 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
3777 pDM_SWAT_Table->bTriggerAntennaSwitch = 0;
3778 //RT_TRACE(COMP_SWAS, DBG_LOUD, ("Normal:TrafficLoad = %llu\n", curTxOkCnt+curRxOkCnt));
3780 //Prepare To Try Antenna
3781 nextAntenna = (pDM_SWAT_Table->CurAntenna == Antenna_A)? Antenna_B : Antenna_A;
3782 pDM_SWAT_Table->try_flag = 1;
3783 pDM_Odm->RSSI_test = TRUE;
3784 if((curRxOkCnt+curTxOkCnt) > 1000)
3786 pDM_SWAT_Table->RSSI_Trying = 4;
3787 pDM_SWAT_Table->TestMode = TP_MODE;
3791 pDM_SWAT_Table->RSSI_Trying = 2;
3792 pDM_SWAT_Table->TestMode = RSSI_MODE;
3795 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Normal State -> Begin Trying!\n"));
3798 pDM_SWAT_Table->RSSI_sum_A = 0;
3799 pDM_SWAT_Table->RSSI_cnt_A = 0;
3800 pDM_SWAT_Table->RSSI_sum_B = 0;
3801 pDM_SWAT_Table->RSSI_cnt_B = 0;
3805 //1 4.Change TRX antenna
3806 if(nextAntenna != pDM_SWAT_Table->CurAntenna)
3808 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("SWAS: Change TX Antenna!\n "));
3809 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, nextAntenna);
3812 bEnqueue = (pDM_Odm->SupportInterface == ODM_ITRF_PCIE)?FALSE :TRUE;
3813 rtw_antenna_select_cmd(pDM_Odm->Adapter, nextAntenna, bEnqueue);
3817 //1 5.Reset Statistics
3818 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;
3819 pDM_SWAT_Table->CurAntenna = nextAntenna;
3820 pDM_SWAT_Table->PreRSSI = curRSSI;
3822 //1 6.Set next timer
3824 PADAPTER pAdapter = pDM_Odm->Adapter;
3825 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
3828 if(pDM_SWAT_Table->RSSI_Trying == 0)
3831 if(pDM_SWAT_Table->RSSI_Trying%2 == 0)
3833 if(pDM_SWAT_Table->TestMode == TP_MODE)
3835 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
3837 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 10 ); //ms
3838 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 10 ); //ms
3840 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 10 ms\n"));
3842 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
3844 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 50 ); //ms
3845 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 50 ); //ms
3846 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 50 ms\n"));
3851 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 500 ); //ms
3852 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
3853 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dm_SW_AntennaSwitch(): Test another antenna for 500 ms\n"));
3858 if(pDM_SWAT_Table->TestMode == TP_MODE)
3860 if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_HIGH)
3861 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 90 ); //ms
3862 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 90 ); //ms
3863 else if(pDM_SWAT_Table->TrafficLoad == TRAFFIC_LOW)
3864 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 100 ); //ms
3865 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 100 ); //ms
3868 //PlatformSetTimer( pAdapter, &pHalData->SwAntennaSwitchTimer, 500 ); //ms
3869 ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer, 500 ); //ms
3872 #endif // #if (RTL8192C_SUPPORT==1)
3877 // 20100514 Luke/Joseph:
3878 // Callback function for 500ms antenna test trying.
3880 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext)
3882 PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
3883 PADAPTER padapter = pDM_Odm->Adapter;
3884 if(padapter->net_closed == _TRUE)
3886 odm_SwAntDivChkAntSwitch(pDM_Odm, SWAW_STEP_DETERMINE);
3889 #else //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
3891 void odm_SwAntDivInit( PDM_ODM_T pDM_Odm ) {}
3892 void ODM_SwAntDivChkPerPktRssi(
3895 PODM_PHY_INFO_T pPhyInfo
3897 void odm_SwAntDivChkAntSwitch(
3901 void ODM_SwAntDivResetBeforeLink( PDM_ODM_T pDM_Odm ){}
3902 void ODM_SwAntDivRestAfterLink( PDM_ODM_T pDM_Odm ){}
3903 void odm_SwAntDivChkAntSwitchCallback(void *FunctionContext){}
3905 #endif //#if(defined(CONFIG_SW_ANTENNA_DIVERSITY))
3907 //3============================================================
3908 //3 SW Antenna Diversity
3909 //3============================================================
3911 #if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
3913 odm_InitHybridAntDiv_88C_92D(
3918 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
3919 u8 bTxPathSel=0; //0:Path-A 1:Path-B
3922 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_InitHybridAntDiv==============>\n"));
3924 if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
3928 bTxPathSel=(pDM_Odm->RFType==ODM_1T1R)?FALSE:TRUE;
3930 ODM_SetBBReg(pDM_Odm,ODM_REG_BB_PWR_SAV1_11N, BIT23, 0); //No update ANTSEL during GNT_BT=1
3931 ODM_SetBBReg(pDM_Odm,ODM_REG_TX_ANT_CTRL_11N, BIT21, 1); //TX atenna selection from tx_info
3932 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PIN_11N, BIT23, 1); //enable LED[1:0] pin as ANTSEL
3933 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_CTRL_11N, BIT8|BIT9, 0x01); // 0x01: left antenna, 0x02: right antenna
3934 // check HW setting: ANTSEL pin connection
3936 // only AP support different path selection temperarly
3937 if(!bTxPathSel){ //PATH-A
3938 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT8|BIT9, 0 ); // ANTSEL as HW control
3939 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 1); //select TX ANTESEL from path A
3942 ODM_SetBBReg(pDM_Odm,ODM_REG_PIN_CTRL_11N, BIT24|BIT25, 0 ); // ANTSEL as HW control
3943 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTSEL_PATH_11N, BIT13, 0); //select ANTESEL from path B
3946 //Set OFDM HW RX Antenna Diversity
3947 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, 0x7FF, 0x0c0); //Pwdb threshold=8dB
3948 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA1_11N, BIT11, 0); //Switch to another antenna by checking pwdb threshold
3949 ODM_SetBBReg(pDM_Odm,ODM_REG_ANTDIV_PARA3_11N, BIT23, 1); // Decide final antenna by comparing 2 antennas' pwdb
3951 //Set CCK HW RX Antenna Diversity
3952 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA2_11N, BIT4, 0); //Antenna diversity decision period = 32 sample
3953 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
3954 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA3_11N, BIT13, 1); //polarity ana_A=1 and ana_B=0
3955 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA4_11N, 0x1f, 0x8); //default antenna power = inpwr*(0.5 + r_ant_step/16)
3958 //Enable HW Antenna Diversity
3959 if(!bTxPathSel) //PATH-A
3960 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_A_11N, BIT7,1); // Enable Hardware antenna switch
3962 ODM_SetBBReg(pDM_Odm,ODM_REG_IGI_B_11N, BIT7,1); // Enable Hardware antenna switch
3963 ODM_SetBBReg(pDM_Odm,ODM_REG_CCK_ANTDIV_PARA1_11N, BIT15, 1);//Enable antenna diversity
3965 pDM_SWAT_Table->CurAntenna=0; //choose left antenna as default antenna
3966 pDM_SWAT_Table->PreAntenna=0;
3967 for(i=0; i<ASSOCIATE_ENTRY_NUM ; i++)
3969 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
3970 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
3971 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
3972 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
3973 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
3974 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
3976 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_InitHybridAntDiv\n"));
3981 odm_InitHybridAntDiv(
3985 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
3987 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
3991 if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
3993 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
3994 odm_InitHybridAntDiv_88C_92D(pDM_Odm);
3997 else if(pDM_Odm->SupportICType == ODM_RTL8188E)
3999 #if (RTL8188E_SUPPORT == 1)
4000 ODM_AntennaDiversityInit_88E(pDM_Odm);
4010 u4Byte OFDM_Ant1_Cnt,
4011 u4Byte OFDM_Ant2_Cnt,
4012 u4Byte CCK_Ant1_Cnt,
4013 u4Byte CCK_Ant2_Cnt,
4019 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect==============>\n"));
4021 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));
4022 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));
4025 if(((OFDM_Ant1_Cnt+OFDM_Ant2_Cnt)==0)&&((CCK_Ant1_Cnt + CCK_Ant2_Cnt) <10)){
4026 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_StaDefAntSelect Fail: No enough packet info!\n"));
4030 if(OFDM_Ant1_Cnt || OFDM_Ant2_Cnt ) {
4031 //if RX OFDM packet number larger than 0
4032 if(OFDM_Ant1_Cnt > OFDM_Ant2_Cnt)
4037 // else if RX CCK packet number larger than 10
4038 else if((CCK_Ant1_Cnt + CCK_Ant2_Cnt) >=10 )
4040 if(CCK_Ant1_Cnt > (5*CCK_Ant2_Cnt))
4042 else if(CCK_Ant2_Cnt > (5*CCK_Ant1_Cnt))
4044 else if(CCK_Ant1_Cnt > CCK_Ant2_Cnt)
4051 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("TxAnt = %s\n",((*pDefAnt)==1)?"Ant1":"Ant2"));
4054 //u4Byte antsel = ODM_GetBBReg(pDM_Odm, 0xc88, bMaskByte0);
4055 //(*pDefAnt)= (u8) antsel;
4060 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_StaDefAntSelect\n"));
4075 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4077 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_SetRxIdleAnt==============>\n"));
4079 if(Ant != pDM_SWAT_Table->RxIdleAnt)
4083 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x65a9); //right-side antenna
4085 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF, 0x569a); //left-side antenna
4090 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x65a9); //right-side antenna
4092 ODM_SetBBReg(pDM_Odm,ODM_REG_RX_DEFUALT_A_11N, 0xFFFF0000, 0x569a); //left-side antenna
4095 pDM_SWAT_Table->RxIdleAnt = Ant;
4096 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));
4098 //ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("<==============odm_SetRxIdleAnt\n"));
4103 ODM_AntselStatistics_88C(
4110 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4112 if(pDM_SWAT_Table->antsel == 1)
4115 pDM_SWAT_Table->CCK_Ant1_Cnt[MacId]++;
4118 pDM_SWAT_Table->OFDM_Ant1_Cnt[MacId]++;
4119 pDM_SWAT_Table->RSSI_Ant1_Sum[MacId] += PWDBAll;
4125 pDM_SWAT_Table->CCK_Ant2_Cnt[MacId]++;
4128 pDM_SWAT_Table->OFDM_Ant2_Cnt[MacId]++;
4129 pDM_SWAT_Table->RSSI_Ant2_Sum[MacId] += PWDBAll;
4137 ODM_SetTxAntByTxInfo_88C_92D(
4145 odm_HwAntDiv_92C_92D(
4149 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4150 u4Byte RSSI_Min=0xFF, RSSI, RSSI_Ant1, RSSI_Ant2;
4155 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv==============>\n"));
4157 if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV)) //if don't support antenna diveristy
4159 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("odm_HwAntDiv: Not supported!\n"));
4163 if((pDM_Odm->SupportICType != ODM_RTL8192C) && (pDM_Odm->SupportICType != ODM_RTL8192D))
4165 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: IC Type is not 92C or 92D\n"));
4169 if(!pDM_Odm->bLinked)
4171 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: bLinked is FALSE\n"));
4175 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
4177 pEntry = pDM_Odm->pODM_StaInfo[i];
4178 if(IS_STA_VALID(pEntry))
4181 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]);
4182 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]);
4184 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("RSSI_Ant1=%d, RSSI_Ant2=%d\n", RSSI_Ant1, RSSI_Ant2));
4186 if(RSSI_Ant1 ||RSSI_Ant2)
4188 RSSI = (RSSI_Ant1 < RSSI_Ant2) ? RSSI_Ant1 : RSSI_Ant2;
4189 if((!RSSI) || ( RSSI < RSSI_Min) ) {
4190 pDM_SWAT_Table->TargetSTA = i;
4194 ///STA: found out default antenna
4195 bRet=odm_StaDefAntSel(pDM_Odm,
4196 pDM_SWAT_Table->OFDM_Ant1_Cnt[i],
4197 pDM_SWAT_Table->OFDM_Ant2_Cnt[i],
4198 pDM_SWAT_Table->CCK_Ant1_Cnt[i],
4199 pDM_SWAT_Table->CCK_Ant2_Cnt[i],
4200 &pDM_SWAT_Table->TxAnt[i]);
4202 //if Tx antenna selection: successful
4204 pDM_SWAT_Table->RSSI_Ant1_Sum[i] = 0;
4205 pDM_SWAT_Table->RSSI_Ant2_Sum[i] = 0;
4206 pDM_SWAT_Table->OFDM_Ant1_Cnt[i] = 0;
4207 pDM_SWAT_Table->OFDM_Ant2_Cnt[i] = 0;
4208 pDM_SWAT_Table->CCK_Ant1_Cnt[i] = 0;
4209 pDM_SWAT_Table->CCK_Ant2_Cnt[i] = 0;
4215 RxIdleAnt = pDM_SWAT_Table->TxAnt[pDM_SWAT_Table->TargetSTA];
4216 odm_SetRxIdleAnt(pDM_Odm, RxIdleAnt, FALSE);
4218 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("<==============odm_HwAntDiv\n"));
4226 if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
4228 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("Return: Not Support HW AntDiv\n"));
4232 if(pDM_Odm->SupportICType & (ODM_RTL8192C | ODM_RTL8192D))
4234 #if ((RTL8192C_SUPPORT == 1)||(RTL8192D_SUPPORT == 1))
4235 odm_HwAntDiv_92C_92D(pDM_Odm);
4238 else if(pDM_Odm->SupportICType == ODM_RTL8188E)
4240 #if (RTL8188E_SUPPORT == 1)
4241 ODM_AntennaDiversity_88E(pDM_Odm);
4249 #else //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
4251 void odm_InitHybridAntDiv( PDM_ODM_T pDM_Odm ){}
4252 void odm_HwAntDiv( PDM_ODM_T pDM_Odm){}
4253 void ODM_SetTxAntByTxInfo_88C_92D( PDM_ODM_T pDM_Odm){ }
4255 #endif //#if(defined(CONFIG_HW_ANTENNA_DIVERSITY))
4259 //============================================================
4261 //============================================================
4267 PADAPTER Adapter = pDM_Odm->Adapter;
4268 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
4269 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
4270 Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
4272 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)));
4273 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)));
4274 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)));
4275 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)));
4278 } // ODM_InitEdcaTurbo
4286 // For AP/ADSL use prtl8192cd_priv
4287 // For CE/NIC use PADAPTER
4289 PADAPTER pAdapter = pDM_Odm->Adapter;
4290 prtl8192cd_priv priv = pDM_Odm->priv;
4293 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
4294 // at the same time. In the stage2/3, we need to prive universal interface and merge all
4295 // HW dynamic mechanism.
4297 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
4299 if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
4302 switch (pDM_Odm->SupportPlatform)
4308 odm_EdcaTurboCheckCE(pDM_Odm);
4315 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
4317 } // odm_CheckEdcaTurbo
4320 odm_EdcaTurboCheckCE(
4324 PADAPTER Adapter = pDM_Odm->Adapter;
4328 u64 cur_tx_bytes = 0;
4329 u64 cur_rx_bytes = 0;
4330 u8 bbtchange = _FALSE;
4331 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4332 struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
4333 struct recv_priv *precvpriv = &(Adapter->recvpriv);
4334 struct registry_priv *pregpriv = &Adapter->registrypriv;
4335 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
4336 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
4339 if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
4341 goto dm_CheckEdcaTurbo_EXIT;
4344 if (pmlmeinfo->assoc_AP_vendor >= HT_IOT_PEER_MAX)
4346 goto dm_CheckEdcaTurbo_EXIT;
4349 #ifdef CONFIG_BT_COEXIST
4350 if (BT_DisableEDCATurbo(Adapter))
4352 goto dm_CheckEdcaTurbo_EXIT;
4356 // Check if the status needs to be changed.
4357 if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
4359 cur_tx_bytes = pxmitpriv->tx_bytes - pxmitpriv->last_tx_bytes;
4360 cur_rx_bytes = precvpriv->rx_bytes - precvpriv->last_rx_bytes;
4363 if((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_RALINK)||(pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS))
4365 if (cur_tx_bytes > (cur_rx_bytes << 2))
4366 { // Uplink TP is present.
4367 trafficIndex = UP_LINK;
4370 { // Balance TP is present.
4371 trafficIndex = DOWN_LINK;
4376 if (cur_rx_bytes > (cur_tx_bytes << 2))
4377 { // Downlink TP is present.
4378 trafficIndex = DOWN_LINK;
4381 { // Balance TP is present.
4382 trafficIndex = UP_LINK;
4386 if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
4388 if((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_CISCO) && (pmlmeext->cur_wireless_mode & WIRELESS_11_24N))
4390 edca_param = EDCAParam[pmlmeinfo->assoc_AP_vendor][trafficIndex];
4394 edca_param = EDCAParam[HT_IOT_PEER_UNKNOWN][trafficIndex];
4396 rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
4398 pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
4401 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
4406 // Turn Off EDCA turbo here.
4407 // Restore original EDCA according to the declaration of AP.
4409 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
4411 rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
4412 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
4416 dm_CheckEdcaTurbo_EXIT:
4417 // Set variables for next time.
4418 precvpriv->bIsAnyNonBEPkts = _FALSE;
4419 pxmitpriv->last_tx_bytes = pxmitpriv->tx_bytes;
4420 precvpriv->last_rx_bytes = precvpriv->rx_bytes;
4424 // need to ODM CE Platform
4425 //move to here for ANT detection mechanism using
4431 u8 initial_gain_psd)
4433 //unsigned int val, rfval;
4437 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4439 //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);
4440 //DbgPrint("Reg908 = 0x%x\n",val);
4441 //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);
4442 //rfval = PHY_QueryRFReg(Adapter, RF_PATH_A, 0x00, bRFRegOffsetMask);
4443 //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);
4444 //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",
4445 //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);
4447 //Set DCO frequency index, offset=(40MHz/SamplePts)*point
4448 ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
4450 //Start PSD calculation, Reg808[22]=0->1
4451 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);
4452 //Need to wait for HW PSD report
4453 ODM_StallExecution(30);
4454 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);
4455 //Read PSD report, Reg8B4[15:0]
4456 psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;
4458 #if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))
4459 psd_report = (u4Byte) (ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);
4461 psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);
4476 Value = Value & 0xFFFF;
4480 if (Value <= dB_Invert_Table[i][11])
4488 return (96); // maximum 96 dB
4493 if (Value <= dB_Invert_Table[i][j])
4505 // 2011/09/22 MH Add for 92D global spin lock utilization.
4508 odm_GlobalAdapterCheck(
4512 } // odm_GlobalAdapterCheck
4517 // Set Single/Dual Antenna default setting for products that do not do detection in advance.
4519 // Added by Joseph, 2012.03.22
4522 ODM_SingleDualAntennaDefaultSetting(
4526 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4527 pDM_SWAT_Table->ANTA_ON=TRUE;
4528 pDM_SWAT_Table->ANTB_ON=TRUE;
4532 //2 8723A ANT DETECT
4536 odm_PHY_SaveAFERegisters(
4545 //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
4546 for( i = 0 ; i < RegisterNum ; i++){
4547 AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);
4552 odm_PHY_ReloadAFERegisters(
4561 //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
4562 for(i = 0 ; i < RegiesterNum; i++)
4565 ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);
4569 //2 8723A ANT DETECT
4572 // Implement IQK single tone for RF DPK loopback and BB PSD scanning.
4573 // This function is cooperated with BB team Neil.
4575 // Added by Roger, 2011.12.15
4578 ODM_SingleDualAntennaDetection(
4584 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
4585 //PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
4586 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
4587 u4Byte CurrentChannel,RfLoopReg;
4589 u4Byte Reg88c, Regc08, Reg874, Regc50;
4590 u8 initial_gain = 0x5a;
4591 u4Byte PSD_report_tmp;
4592 u4Byte AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0;
4593 bool bResult = TRUE;
4594 u4Byte AFE_Backup[16];
4595 u4Byte AFE_REG_8723A[16] = {
4596 rRx_Wait_CCA, rTx_CCK_RFON,
4597 rTx_CCK_BBON, rTx_OFDM_RFON,
4598 rTx_OFDM_BBON, rTx_To_Rx,
4600 rRx_OFDM, rRx_Wait_RIFS,
4601 rRx_TO_Rx, rStandby,
4602 rSleep, rPMPD_ANAEN,
4603 rFPGA0_XCD_SwitchControl, rBlue_Tooth};
4605 if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C)))
4608 if(!(pDM_Odm->SupportAbility&ODM_BB_ANT_DIV))
4611 if(pDM_Odm->SupportICType == ODM_RTL8192C)
4613 //Which path in ADC/DAC is turnned on for PSD: both I/Q
4614 ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);
4615 //Ageraged number: 8
4616 ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);
4618 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
4621 //1 Backup Current RF/BB Settings
4623 CurrentChannel = ODM_GetRFReg(pDM_Odm, RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
4624 RfLoopReg = ODM_GetRFReg(pDM_Odm, RF_PATH_A, 0x00, bRFRegOffsetMask);
4625 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A); // change to Antenna A
4626 // Step 1: USE IQK to transmitter single tone
4628 ODM_StallExecution(10);
4630 //Store A Path Register 88c, c08, 874, c50
4631 Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);
4632 Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);
4633 Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);
4634 Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);
4636 // Store AFE Registers
4637 odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
4640 ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0); //128 pts
4643 ODM_SetRFReg(pDM_Odm, RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x01); //Channel 1
4646 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);
4647 ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);
4648 ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);
4649 ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);
4650 ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);
4651 ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);
4652 ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);
4653 ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);
4654 ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);
4655 ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);
4656 ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);
4657 ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);
4658 ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);
4659 ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);
4660 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);
4661 ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);
4664 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);
4667 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);
4668 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);
4670 //IQK setting tone@ 4.34Mhz
4671 ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);
4672 ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);
4676 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);
4677 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);
4678 ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);
4679 ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
4680 ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);
4681 ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);
4682 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);
4685 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0, 0xFFFFF, 0x50008);
4687 //IQK Single tone start
4688 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80800000);
4689 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
4690 ODM_StallExecution(1000);
4695 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
4696 if(PSD_report_tmp >AntA_report)
4697 AntA_report=PSD_report_tmp;
4702 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B); // change to Antenna B
4703 ODM_StallExecution(10);
4708 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
4709 if(PSD_report_tmp > AntB_report)
4710 AntB_report=PSD_report_tmp;
4713 // change to open case
4714 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, 0); // change to Ant A and B all open case
4715 ODM_StallExecution(10);
4719 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
4720 if(PSD_report_tmp > AntO_report)
4721 AntO_report=PSD_report_tmp;
4724 //Close IQK Single Tone function
4725 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000);
4726 PSD_report_tmp = 0x0;
4728 //1 Return to antanna A
4729 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
4730 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);
4731 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);
4732 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);
4733 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);
4734 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);
4735 ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);
4736 ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);
4738 //Reload AFE Registers
4739 odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);
4741 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));
4742 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));
4743 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));
4746 if(pDM_Odm->SupportICType == ODM_RTL8723A)
4748 //2 Test Ant B based on Ant A is ON
4751 if(AntA_report >= 100)
4753 if(AntB_report > (AntA_report+1))
4755 pDM_SWAT_Table->ANTB_ON=FALSE;
4756 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
4760 pDM_SWAT_Table->ANTB_ON=TRUE;
4761 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));
4766 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
4767 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
4771 //2 Test Ant A and B based on DPDT Open
4772 else if(mode==ANTTESTALL)
4774 if((AntO_report >=100)&(AntO_report <118))
4776 if(AntA_report > (AntO_report+1))
4778 pDM_SWAT_Table->ANTA_ON=FALSE;
4779 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna A is OFF\n"));
4780 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF"));
4784 pDM_SWAT_Table->ANTA_ON=TRUE;
4785 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna A is ON\n"));
4786 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON"));
4789 if(AntB_report > (AntO_report+2))
4791 pDM_SWAT_Table->ANTB_ON=FALSE;
4792 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna B is OFF\n"));
4793 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF"));
4797 pDM_SWAT_Table->ANTB_ON=TRUE;
4798 //RT_TRACE(COMP_ANTENNA, DBG_LOUD, ("ODM_AntennaDetection(): Antenna B is ON\n"));
4799 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON"));
4804 else if(pDM_Odm->SupportICType == ODM_RTL8192C)
4806 if(AntA_report >= 100)
4808 if(AntB_report > (AntA_report+2))
4810 pDM_SWAT_Table->ANTA_ON=FALSE;
4811 pDM_SWAT_Table->ANTB_ON=TRUE;
4812 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);
4813 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));
4815 else if(AntA_report > (AntB_report+2))
4817 pDM_SWAT_Table->ANTA_ON=TRUE;
4818 pDM_SWAT_Table->ANTB_ON=FALSE;
4819 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);
4820 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));
4824 pDM_SWAT_Table->ANTA_ON=TRUE;
4825 pDM_SWAT_Table->ANTB_ON=TRUE;
4826 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna \n"));
4831 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
4832 pDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default
4833 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default
4841 /* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */
4842 void odm_dtc(PDM_ODM_T pDM_Odm)
4844 #ifdef CONFIG_DM_RESP_TXAGC
4845 #define DTC_BASE 35 /* RSSI higher than this value, start to decade TX power */
4846 #define DTC_DWN_BASE (DTC_BASE-5) /* RSSI lower than this value, start to increase TX power */
4848 /* RSSI vs TX power step mapping: decade TX power */
4849 static const u8 dtc_table_down[]={
4858 /* RSSI vs TX power step mapping: increase TX power */
4859 static const u8 dtc_table_up[]={
4878 if (DTC_BASE < pDM_Odm->RSSI_Min) {
4879 /* need to decade the CTS TX power */
4881 for (i=0;i<ARRAY_SIZE(dtc_table_down);i++)
4883 if ((dtc_table_down[i] >= pDM_Odm->RSSI_Min) || (dtc_steps >= 6))
4895 resp_txagc = dtc_steps | (sign << 4);
4896 resp_txagc = resp_txagc | (resp_txagc << 5);
4897 ODM_Write1Byte(pDM_Odm, 0x06d9, resp_txagc);
4899 DBG_8723A("%s RSSI_Min:%u, set RESP_TXAGC to %s %u\n",
4900 __func__, pDM_Odm->RSSI_Min, sign?"minus":"plus", dtc_steps);
4901 #endif /* CONFIG_RESP_TXAGC_ADJUST */