1 // SPDX-License-Identifier: GPL-2.0 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7 8 #include "odm_precomp.h" 9 10 /* Global var */ 11 12 u32 OFDMSwingTable_New[OFDM_TABLE_SIZE] = { 13 0x0b40002d, /* 0, -15.0dB */ 14 0x0c000030, /* 1, -14.5dB */ 15 0x0cc00033, /* 2, -14.0dB */ 16 0x0d800036, /* 3, -13.5dB */ 17 0x0e400039, /* 4, -13.0dB */ 18 0x0f00003c, /* 5, -12.5dB */ 19 0x10000040, /* 6, -12.0dB */ 20 0x11000044, /* 7, -11.5dB */ 21 0x12000048, /* 8, -11.0dB */ 22 0x1300004c, /* 9, -10.5dB */ 23 0x14400051, /* 10, -10.0dB */ 24 0x15800056, /* 11, -9.5dB */ 25 0x16c0005b, /* 12, -9.0dB */ 26 0x18000060, /* 13, -8.5dB */ 27 0x19800066, /* 14, -8.0dB */ 28 0x1b00006c, /* 15, -7.5dB */ 29 0x1c800072, /* 16, -7.0dB */ 30 0x1e400079, /* 17, -6.5dB */ 31 0x20000080, /* 18, -6.0dB */ 32 0x22000088, /* 19, -5.5dB */ 33 0x24000090, /* 20, -5.0dB */ 34 0x26000098, /* 21, -4.5dB */ 35 0x288000a2, /* 22, -4.0dB */ 36 0x2ac000ab, /* 23, -3.5dB */ 37 0x2d4000b5, /* 24, -3.0dB */ 38 0x300000c0, /* 25, -2.5dB */ 39 0x32c000cb, /* 26, -2.0dB */ 40 0x35c000d7, /* 27, -1.5dB */ 41 0x390000e4, /* 28, -1.0dB */ 42 0x3c8000f2, /* 29, -0.5dB */ 43 0x40000100, /* 30, +0dB */ 44 0x43c0010f, /* 31, +0.5dB */ 45 0x47c0011f, /* 32, +1.0dB */ 46 0x4c000130, /* 33, +1.5dB */ 47 0x50800142, /* 34, +2.0dB */ 48 0x55400155, /* 35, +2.5dB */ 49 0x5a400169, /* 36, +3.0dB */ 50 0x5fc0017f, /* 37, +3.5dB */ 51 0x65400195, /* 38, +4.0dB */ 52 0x6b8001ae, /* 39, +4.5dB */ 53 0x71c001c7, /* 40, +5.0dB */ 54 0x788001e2, /* 41, +5.5dB */ 55 0x7f8001fe /* 42, +6.0dB */ 56 }; 57 58 u8 CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = { 59 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, /* 0, -16.0dB */ 60 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 1, -15.5dB */ 61 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 2, -15.0dB */ 62 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 3, -14.5dB */ 63 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 4, -14.0dB */ 64 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 5, -13.5dB */ 65 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 6, -13.0dB */ 66 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 7, -12.5dB */ 67 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 8, -12.0dB */ 68 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 9, -11.5dB */ 69 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 10, -11.0dB */ 70 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 11, -10.5dB */ 71 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 12, -10.0dB */ 72 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 13, -9.5dB */ 73 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 14, -9.0dB */ 74 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 15, -8.5dB */ 75 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */ 76 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 17, -7.5dB */ 77 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 18, -7.0dB */ 78 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 19, -6.5dB */ 79 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 20, -6.0dB */ 80 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 21, -5.5dB */ 81 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 22, -5.0dB */ 82 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 23, -4.5dB */ 83 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 24, -4.0dB */ 84 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 25, -3.5dB */ 85 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 26, -3.0dB */ 86 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 27, -2.5dB */ 87 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 28, -2.0dB */ 88 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 29, -1.5dB */ 89 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 30, -1.0dB */ 90 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 31, -0.5dB */ 91 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} /* 32, +0dB */ 92 }; 93 94 u8 CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8] = { 95 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, /* 0, -16.0dB */ 96 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 1, -15.5dB */ 97 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 2, -15.0dB */ 98 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 3, -14.5dB */ 99 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 4, -14.0dB */ 100 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 5, -13.5dB */ 101 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 6, -13.0dB */ 102 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 7, -12.5dB */ 103 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 8, -12.0dB */ 104 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 9, -11.5dB */ 105 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 10, -11.0dB */ 106 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 11, -10.5dB */ 107 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 12, -10.0dB */ 108 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 13, -9.5dB */ 109 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 14, -9.0dB */ 110 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 15, -8.5dB */ 111 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */ 112 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 17, -7.5dB */ 113 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 18, -7.0dB */ 114 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 19, -6.5dB */ 115 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 20, -6.0dB */ 116 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 21, -5.5dB */ 117 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 22, -5.0dB */ 118 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 23, -4.5dB */ 119 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 24, -4.0dB */ 120 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 25, -3.5dB */ 121 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 26, -3.0dB */ 122 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 27, -2.5dB */ 123 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 28, -2.0dB */ 124 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 29, -1.5dB */ 125 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 30, -1.0dB */ 126 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 31, -0.5dB */ 127 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} /* 32, +0dB */ 128 }; 129 130 /* Remove Edca by Yu Chen */ 131 132 static void odm_CommonInfoSelfInit(struct dm_odm_t *pDM_Odm) 133 { 134 pDM_Odm->bCckHighPower = (bool) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(CCK_RPT_FORMAT), ODM_BIT(CCK_RPT_FORMAT)); 135 pDM_Odm->RFPathRxEnable = (u8) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(BB_RX_PATH), ODM_BIT(BB_RX_PATH)); 136 137 pDM_Odm->TxRate = 0xFF; 138 } 139 140 static void odm_CommonInfoSelfUpdate(struct dm_odm_t *pDM_Odm) 141 { 142 u8 EntryCnt = 0; 143 u8 i; 144 PSTA_INFO_T pEntry; 145 146 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) { 147 if (*(pDM_Odm->pSecChOffset) == 1) 148 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)-2; 149 else if (*(pDM_Odm->pSecChOffset) == 2) 150 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)+2; 151 } else 152 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel); 153 154 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 155 pEntry = pDM_Odm->pODM_StaInfo[i]; 156 if (IS_STA_VALID(pEntry)) 157 EntryCnt++; 158 } 159 160 if (EntryCnt == 1) 161 pDM_Odm->bOneEntryOnly = true; 162 else 163 pDM_Odm->bOneEntryOnly = false; 164 } 165 166 /* 3 ============================================================ */ 167 /* 3 RATR MASK */ 168 /* 3 ============================================================ */ 169 /* 3 ============================================================ */ 170 /* 3 Rate Adaptive */ 171 /* 3 ============================================================ */ 172 173 static void odm_RateAdaptiveMaskInit(struct dm_odm_t *pDM_Odm) 174 { 175 struct odm_rate_adaptive *pOdmRA = &pDM_Odm->RateAdaptive; 176 177 pOdmRA->Type = DM_Type_ByDriver; 178 if (pOdmRA->Type == DM_Type_ByDriver) 179 pDM_Odm->bUseRAMask = true; 180 else 181 pDM_Odm->bUseRAMask = false; 182 183 pOdmRA->RATRState = DM_RATR_STA_INIT; 184 pOdmRA->LdpcThres = 35; 185 pOdmRA->bUseLdpc = false; 186 pOdmRA->HighRSSIThresh = 50; 187 pOdmRA->LowRSSIThresh = 20; 188 } 189 190 u32 ODM_Get_Rate_Bitmap( 191 struct dm_odm_t *pDM_Odm, 192 u32 macid, 193 u32 ra_mask, 194 u8 rssi_level 195 ) 196 { 197 PSTA_INFO_T pEntry; 198 u32 rate_bitmap = 0; 199 u8 WirelessMode; 200 201 pEntry = pDM_Odm->pODM_StaInfo[macid]; 202 if (!IS_STA_VALID(pEntry)) 203 return ra_mask; 204 205 WirelessMode = pEntry->wireless_mode; 206 207 switch (WirelessMode) { 208 case ODM_WM_B: 209 if (ra_mask & 0x0000000c) /* 11M or 5.5M enable */ 210 rate_bitmap = 0x0000000d; 211 else 212 rate_bitmap = 0x0000000f; 213 break; 214 215 case (ODM_WM_G): 216 if (rssi_level == DM_RATR_STA_HIGH) 217 rate_bitmap = 0x00000f00; 218 else 219 rate_bitmap = 0x00000ff0; 220 break; 221 222 case (ODM_WM_B|ODM_WM_G): 223 if (rssi_level == DM_RATR_STA_HIGH) 224 rate_bitmap = 0x00000f00; 225 else if (rssi_level == DM_RATR_STA_MIDDLE) 226 rate_bitmap = 0x00000ff0; 227 else 228 rate_bitmap = 0x00000ff5; 229 break; 230 231 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G): 232 case (ODM_WM_B|ODM_WM_N24G): 233 case (ODM_WM_G|ODM_WM_N24G): 234 if (rssi_level == DM_RATR_STA_HIGH) 235 rate_bitmap = 0x000f0000; 236 else if (rssi_level == DM_RATR_STA_MIDDLE) 237 rate_bitmap = 0x000ff000; 238 else { 239 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) 240 rate_bitmap = 0x000ff015; 241 else 242 rate_bitmap = 0x000ff005; 243 } 244 break; 245 246 default: 247 rate_bitmap = 0x0fffffff; 248 break; 249 } 250 251 return ra_mask & rate_bitmap; 252 253 } 254 255 static void odm_RefreshRateAdaptiveMaskCE(struct dm_odm_t *pDM_Odm) 256 { 257 u8 i; 258 struct adapter *padapter = pDM_Odm->Adapter; 259 260 if (padapter->bDriverStopped) 261 return; 262 263 if (!pDM_Odm->bUseRAMask) 264 return; 265 266 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 267 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i]; 268 269 if (IS_STA_VALID(pstat)) { 270 if (is_multicast_ether_addr(pstat->hwaddr)) /* if (psta->mac_id == 1) */ 271 continue; 272 273 if (true == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false, &pstat->rssi_level)) { 274 rtw_hal_update_ra_mask(pstat, pstat->rssi_level); 275 } 276 277 } 278 } 279 } 280 281 /*----------------------------------------------------------------------------- 282 * Function: odm_RefreshRateAdaptiveMask() 283 * 284 * Overview: Update rate table mask according to rssi 285 * 286 * Input: NONE 287 * 288 * Output: NONE 289 * 290 * Return: NONE 291 * 292 * Revised History: 293 *When Who Remark 294 *05/27/2009 hpfan Create Version 0. 295 * 296 * -------------------------------------------------------------------------- 297 */ 298 static void odm_RefreshRateAdaptiveMask(struct dm_odm_t *pDM_Odm) 299 { 300 301 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) 302 return; 303 304 odm_RefreshRateAdaptiveMaskCE(pDM_Odm); 305 } 306 307 /* Return Value: bool */ 308 /* - true: RATRState is changed. */ 309 bool ODM_RAStateCheck( 310 struct dm_odm_t *pDM_Odm, 311 s32 RSSI, 312 bool bForceUpdate, 313 u8 *pRATRState 314 ) 315 { 316 struct odm_rate_adaptive *pRA = &pDM_Odm->RateAdaptive; 317 const u8 GoUpGap = 5; 318 u8 HighRSSIThreshForRA = pRA->HighRSSIThresh; 319 u8 LowRSSIThreshForRA = pRA->LowRSSIThresh; 320 u8 RATRState; 321 322 /* Threshold Adjustment: */ 323 /* when RSSI state trends to go up one or two levels, make sure RSSI is high enough. */ 324 /* Here GoUpGap is added to solve the boundary's level alternation issue. */ 325 switch (*pRATRState) { 326 case DM_RATR_STA_INIT: 327 case DM_RATR_STA_HIGH: 328 break; 329 330 case DM_RATR_STA_MIDDLE: 331 HighRSSIThreshForRA += GoUpGap; 332 break; 333 334 case DM_RATR_STA_LOW: 335 HighRSSIThreshForRA += GoUpGap; 336 LowRSSIThreshForRA += GoUpGap; 337 break; 338 339 default: 340 netdev_dbg(pDM_Odm->Adapter->pnetdev, 341 "wrong rssi level setting %d !", *pRATRState); 342 break; 343 } 344 345 /* Decide RATRState by RSSI. */ 346 if (RSSI > HighRSSIThreshForRA) 347 RATRState = DM_RATR_STA_HIGH; 348 else if (RSSI > LowRSSIThreshForRA) 349 RATRState = DM_RATR_STA_MIDDLE; 350 else 351 RATRState = DM_RATR_STA_LOW; 352 353 if (*pRATRState != RATRState || bForceUpdate) { 354 *pRATRState = RATRState; 355 return true; 356 } 357 358 return false; 359 } 360 361 /* */ 362 363 /* 3 ============================================================ */ 364 /* 3 RSSI Monitor */ 365 /* 3 ============================================================ */ 366 367 static void odm_RSSIMonitorInit(struct dm_odm_t *pDM_Odm) 368 { 369 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 370 371 pRA_Table->firstconnect = false; 372 373 } 374 375 static void FindMinimumRSSI(struct adapter *padapter) 376 { 377 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 378 struct dm_priv *pdmpriv = &pHalData->dmpriv; 379 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 380 381 /* 1 1.Determine the minimum RSSI */ 382 383 if ( 384 (pDM_Odm->bLinked != true) && 385 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) 386 ) { 387 pdmpriv->MinUndecoratedPWDBForDM = 0; 388 } else 389 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; 390 } 391 392 static void odm_RSSIMonitorCheckCE(struct dm_odm_t *pDM_Odm) 393 { 394 struct adapter *Adapter = pDM_Odm->Adapter; 395 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 396 struct dm_priv *pdmpriv = &pHalData->dmpriv; 397 int i; 398 int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff; 399 u8 sta_cnt = 0; 400 u32 PWDB_rssi[NUM_STA] = {0};/* 0~15]:MACID, [16~31]:PWDB_rssi */ 401 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 402 403 if (pDM_Odm->bLinked != true) 404 return; 405 406 pRA_Table->firstconnect = pDM_Odm->bLinked; 407 408 /* if (check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == true) */ 409 { 410 struct sta_info *psta; 411 412 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 413 psta = pDM_Odm->pODM_StaInfo[i]; 414 if (IS_STA_VALID(psta)) { 415 if (is_multicast_ether_addr(psta->hwaddr)) /* if (psta->mac_id == 1) */ 416 continue; 417 418 if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1)) 419 continue; 420 421 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) 422 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 423 424 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) 425 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 426 427 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) 428 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); 429 } 430 } 431 432 for (i = 0; i < sta_cnt; i++) { 433 if (PWDB_rssi[i] != (0)) { 434 if (pHalData->fw_ractrl == true)/* Report every sta's RSSI to FW */ 435 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); 436 } 437 } 438 } 439 440 441 442 if (tmpEntryMaxPWDB != 0) /* If associated entry is found */ 443 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; 444 else 445 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; 446 447 if (tmpEntryMinPWDB != 0xff) /* If associated entry is found */ 448 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; 449 else 450 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; 451 452 FindMinimumRSSI(Adapter);/* get pdmpriv->MinUndecoratedPWDBForDM */ 453 454 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; 455 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */ 456 } 457 458 static void odm_RSSIMonitorCheck(struct dm_odm_t *pDM_Odm) 459 { 460 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)) 461 return; 462 463 odm_RSSIMonitorCheckCE(pDM_Odm); 464 465 } /* odm_RSSIMonitorCheck */ 466 467 /* 3 ============================================================ */ 468 /* 3 SW Antenna Diversity */ 469 /* 3 ============================================================ */ 470 static void odm_SwAntDetectInit(struct dm_odm_t *pDM_Odm) 471 { 472 struct swat_t *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; 473 474 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = rtw_read32(pDM_Odm->Adapter, rDPDT_control); 475 pDM_SWAT_Table->PreAntenna = MAIN_ANT; 476 pDM_SWAT_Table->CurAntenna = MAIN_ANT; 477 pDM_SWAT_Table->SWAS_NoLink_State = 0; 478 } 479 480 /* 3 ============================================================ */ 481 /* 3 Tx Power Tracking */ 482 /* 3 ============================================================ */ 483 484 static u8 getSwingIndex(struct dm_odm_t *pDM_Odm) 485 { 486 struct adapter *Adapter = pDM_Odm->Adapter; 487 u8 i = 0; 488 u32 bbSwing; 489 u32 swingTableSize; 490 u32 *pSwingTable; 491 492 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000); 493 494 pSwingTable = OFDMSwingTable_New; 495 swingTableSize = OFDM_TABLE_SIZE; 496 497 for (i = 0; i < swingTableSize; ++i) { 498 u32 tableValue = pSwingTable[i]; 499 500 if (tableValue >= 0x100000) 501 tableValue >>= 22; 502 if (bbSwing == tableValue) 503 break; 504 } 505 return i; 506 } 507 508 void odm_TXPowerTrackingInit(struct dm_odm_t *pDM_Odm) 509 { 510 u8 defaultSwingIndex = getSwingIndex(pDM_Odm); 511 u8 p = 0; 512 struct adapter *Adapter = pDM_Odm->Adapter; 513 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 514 515 516 struct dm_priv *pdmpriv = &pHalData->dmpriv; 517 518 pdmpriv->bTXPowerTracking = true; 519 pdmpriv->TXPowercount = 0; 520 pdmpriv->bTXPowerTrackingInit = false; 521 522 if (*(pDM_Odm->mp_mode) != 1) 523 pdmpriv->TxPowerTrackControl = true; 524 else 525 pdmpriv->TxPowerTrackControl = false; 526 527 /* pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; */ 528 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter; 529 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter; 530 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter; 531 532 /* The index of "0 dB" in SwingTable. */ 533 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex; 534 pDM_Odm->DefaultCckIndex = 20; 535 536 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; 537 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex; 538 539 for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) { 540 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex; 541 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex; 542 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0; 543 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0; 544 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; 545 } 546 547 } 548 549 void ODM_TXPowerTrackingCheck(struct dm_odm_t *pDM_Odm) 550 { 551 struct adapter *Adapter = pDM_Odm->Adapter; 552 553 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)) 554 return; 555 556 if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) { /* at least delay 1 sec */ 557 PHY_SetRFReg(pDM_Odm->Adapter, RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03); 558 559 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1; 560 return; 561 } else { 562 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter); 563 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0; 564 } 565 } 566 567 /* */ 568 /* 3 Export Interface */ 569 /* */ 570 571 /* */ 572 /* 2011/09/21 MH Add to describe different team necessary resource allocate?? */ 573 /* */ 574 void ODM_DMInit(struct dm_odm_t *pDM_Odm) 575 { 576 577 odm_CommonInfoSelfInit(pDM_Odm); 578 odm_DIGInit(pDM_Odm); 579 odm_NHMCounterStatisticsInit(pDM_Odm); 580 odm_AdaptivityInit(pDM_Odm); 581 odm_RateAdaptiveMaskInit(pDM_Odm); 582 ODM_CfoTrackingInit(pDM_Odm); 583 ODM_EdcaTurboInit(pDM_Odm); 584 odm_RSSIMonitorInit(pDM_Odm); 585 odm_TXPowerTrackingInit(pDM_Odm); 586 587 ODM_ClearTxPowerTrackingState(pDM_Odm); 588 589 odm_DynamicBBPowerSavingInit(pDM_Odm); 590 odm_DynamicTxPowerInit(pDM_Odm); 591 592 odm_SwAntDetectInit(pDM_Odm); 593 } 594 595 /* */ 596 /* 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM. */ 597 /* You can not add any dummy function here, be care, you can only use DM structure */ 598 /* to perform any new ODM_DM. */ 599 /* */ 600 void ODM_DMWatchdog(struct dm_odm_t *pDM_Odm) 601 { 602 odm_CommonInfoSelfUpdate(pDM_Odm); 603 odm_FalseAlarmCounterStatistics(pDM_Odm); 604 odm_NHMCounterStatistics(pDM_Odm); 605 606 odm_RSSIMonitorCheck(pDM_Odm); 607 608 /* For CE Platform(SPRD or Tablet) */ 609 /* 8723A or 8189ES platform */ 610 /* NeilChen--2012--08--24-- */ 611 /* Fix Leave LPS issue */ 612 if (adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) { 613 /* in LPS mode */ 614 odm_DIGbyRSSI_LPS(pDM_Odm); 615 } else { 616 odm_DIG(pDM_Odm); 617 } 618 619 { 620 struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable; 621 622 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); 623 } 624 odm_CCKPacketDetectionThresh(pDM_Odm); 625 626 if (*(pDM_Odm->pbPowerSaving) == true) 627 return; 628 629 630 odm_RefreshRateAdaptiveMask(pDM_Odm); 631 odm_EdcaTurboCheck(pDM_Odm); 632 ODM_CfoTracking(pDM_Odm); 633 634 ODM_TXPowerTrackingCheck(pDM_Odm); 635 636 /* odm_EdcaTurboCheck(pDM_Odm); */ 637 638 /* 2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled, */ 639 /* so compile flags must be left here to prevent from compile errors */ 640 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0; 641 } 642 643 644 /* */ 645 /* Init /.. Fixed HW value. Only init time. */ 646 /* */ 647 void ODM_CmnInfoInit(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, u32 Value) 648 { 649 /* */ 650 /* This section is used for init value */ 651 /* */ 652 switch (CmnInfo) { 653 /* */ 654 /* Fixed ODM value. */ 655 /* */ 656 case ODM_CMNINFO_ABILITY: 657 pDM_Odm->SupportAbility = (u32)Value; 658 break; 659 660 case ODM_CMNINFO_PLATFORM: 661 pDM_Odm->SupportPlatform = (u8)Value; 662 break; 663 664 case ODM_CMNINFO_INTERFACE: 665 pDM_Odm->SupportInterface = (u8)Value; 666 break; 667 668 case ODM_CMNINFO_IC_TYPE: 669 pDM_Odm->SupportICType = Value; 670 break; 671 672 case ODM_CMNINFO_CUT_VER: 673 pDM_Odm->CutVersion = (u8)Value; 674 break; 675 676 case ODM_CMNINFO_FAB_VER: 677 pDM_Odm->FabVersion = (u8)Value; 678 break; 679 680 case ODM_CMNINFO_RFE_TYPE: 681 pDM_Odm->RFEType = (u8)Value; 682 break; 683 684 case ODM_CMNINFO_RF_ANTENNA_TYPE: 685 pDM_Odm->AntDivType = (u8)Value; 686 break; 687 688 case ODM_CMNINFO_PACKAGE_TYPE: 689 pDM_Odm->PackageType = (u8)Value; 690 break; 691 692 case ODM_CMNINFO_EXT_LNA: 693 pDM_Odm->ExtLNA = (u8)Value; 694 break; 695 696 case ODM_CMNINFO_EXT_PA: 697 pDM_Odm->ExtPA = (u8)Value; 698 break; 699 700 case ODM_CMNINFO_GPA: 701 pDM_Odm->TypeGPA = (enum odm_type_gpa_e)Value; 702 break; 703 case ODM_CMNINFO_APA: 704 pDM_Odm->TypeAPA = (enum odm_type_apa_e)Value; 705 break; 706 case ODM_CMNINFO_GLNA: 707 pDM_Odm->TypeGLNA = (enum odm_type_glna_e)Value; 708 break; 709 case ODM_CMNINFO_ALNA: 710 pDM_Odm->TypeALNA = (enum odm_type_alna_e)Value; 711 break; 712 713 case ODM_CMNINFO_EXT_TRSW: 714 pDM_Odm->ExtTRSW = (u8)Value; 715 break; 716 case ODM_CMNINFO_PATCH_ID: 717 pDM_Odm->PatchID = (u8)Value; 718 break; 719 case ODM_CMNINFO_BINHCT_TEST: 720 pDM_Odm->bInHctTest = (bool)Value; 721 break; 722 case ODM_CMNINFO_BWIFI_TEST: 723 pDM_Odm->bWIFITest = (bool)Value; 724 break; 725 726 case ODM_CMNINFO_SMART_CONCURRENT: 727 pDM_Odm->bDualMacSmartConcurrent = (bool)Value; 728 break; 729 730 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 731 default: 732 /* do nothing */ 733 break; 734 } 735 736 } 737 738 739 void ODM_CmnInfoHook(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, void *pValue) 740 { 741 /* */ 742 /* Hook call by reference pointer. */ 743 /* */ 744 switch (CmnInfo) { 745 /* */ 746 /* Dynamic call by reference pointer. */ 747 /* */ 748 case ODM_CMNINFO_MAC_PHY_MODE: 749 pDM_Odm->pMacPhyMode = pValue; 750 break; 751 752 case ODM_CMNINFO_TX_UNI: 753 pDM_Odm->pNumTxBytesUnicast = pValue; 754 break; 755 756 case ODM_CMNINFO_RX_UNI: 757 pDM_Odm->pNumRxBytesUnicast = pValue; 758 break; 759 760 case ODM_CMNINFO_WM_MODE: 761 pDM_Odm->pwirelessmode = pValue; 762 break; 763 764 case ODM_CMNINFO_SEC_CHNL_OFFSET: 765 pDM_Odm->pSecChOffset = pValue; 766 break; 767 768 case ODM_CMNINFO_SEC_MODE: 769 pDM_Odm->pSecurity = pValue; 770 break; 771 772 case ODM_CMNINFO_BW: 773 pDM_Odm->pBandWidth = pValue; 774 break; 775 776 case ODM_CMNINFO_CHNL: 777 pDM_Odm->pChannel = pValue; 778 break; 779 780 case ODM_CMNINFO_DMSP_GET_VALUE: 781 pDM_Odm->pbGetValueFromOtherMac = pValue; 782 break; 783 784 case ODM_CMNINFO_BUDDY_ADAPTOR: 785 pDM_Odm->pBuddyAdapter = pValue; 786 break; 787 788 case ODM_CMNINFO_DMSP_IS_MASTER: 789 pDM_Odm->pbMasterOfDMSP = pValue; 790 break; 791 792 case ODM_CMNINFO_SCAN: 793 pDM_Odm->pbScanInProcess = pValue; 794 break; 795 796 case ODM_CMNINFO_POWER_SAVING: 797 pDM_Odm->pbPowerSaving = pValue; 798 break; 799 800 case ODM_CMNINFO_ONE_PATH_CCA: 801 pDM_Odm->pOnePathCCA = pValue; 802 break; 803 804 case ODM_CMNINFO_DRV_STOP: 805 pDM_Odm->pbDriverStopped = pValue; 806 break; 807 808 case ODM_CMNINFO_PNP_IN: 809 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = pValue; 810 break; 811 812 case ODM_CMNINFO_INIT_ON: 813 pDM_Odm->pinit_adpt_in_progress = pValue; 814 break; 815 816 case ODM_CMNINFO_ANT_TEST: 817 pDM_Odm->pAntennaTest = pValue; 818 break; 819 820 case ODM_CMNINFO_NET_CLOSED: 821 pDM_Odm->pbNet_closed = pValue; 822 break; 823 824 case ODM_CMNINFO_FORCED_RATE: 825 pDM_Odm->pForcedDataRate = pValue; 826 break; 827 828 case ODM_CMNINFO_FORCED_IGI_LB: 829 pDM_Odm->pu1ForcedIgiLb = pValue; 830 break; 831 832 case ODM_CMNINFO_MP_MODE: 833 pDM_Odm->mp_mode = pValue; 834 break; 835 836 /* case ODM_CMNINFO_RTSTA_AID: */ 837 /* pDM_Odm->pAidMap = (u8 *)pValue; */ 838 /* break; */ 839 840 /* case ODM_CMNINFO_BT_COEXIST: */ 841 /* pDM_Odm->BTCoexist = (bool *)pValue; */ 842 843 /* case ODM_CMNINFO_STA_STATUS: */ 844 /* pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue; */ 845 /* break; */ 846 847 /* case ODM_CMNINFO_PHY_STATUS: */ 848 /* pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue; */ 849 /* break; */ 850 851 /* case ODM_CMNINFO_MAC_STATUS: */ 852 /* pDM_Odm->pMacInfo = (struct odm_mac_status_info *)pValue; */ 853 /* break; */ 854 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 855 default: 856 /* do nothing */ 857 break; 858 } 859 860 } 861 862 863 void ODM_CmnInfoPtrArrayHook( 864 struct dm_odm_t *pDM_Odm, 865 enum odm_cmninfo_e CmnInfo, 866 u16 Index, 867 void *pValue 868 ) 869 { 870 /* */ 871 /* Hook call by reference pointer. */ 872 /* */ 873 switch (CmnInfo) { 874 /* */ 875 /* Dynamic call by reference pointer. */ 876 /* */ 877 case ODM_CMNINFO_STA_STATUS: 878 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue; 879 break; 880 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 881 default: 882 /* do nothing */ 883 break; 884 } 885 886 } 887 888 889 /* */ 890 /* Update Band/CHannel/.. The values are dynamic but non-per-packet. */ 891 /* */ 892 void ODM_CmnInfoUpdate(struct dm_odm_t *pDM_Odm, u32 CmnInfo, u64 Value) 893 { 894 /* */ 895 /* This init variable may be changed in run time. */ 896 /* */ 897 switch (CmnInfo) { 898 case ODM_CMNINFO_LINK_IN_PROGRESS: 899 pDM_Odm->bLinkInProcess = (bool)Value; 900 break; 901 902 case ODM_CMNINFO_ABILITY: 903 pDM_Odm->SupportAbility = (u32)Value; 904 break; 905 906 case ODM_CMNINFO_WIFI_DIRECT: 907 pDM_Odm->bWIFI_Direct = (bool)Value; 908 break; 909 910 case ODM_CMNINFO_WIFI_DISPLAY: 911 pDM_Odm->bWIFI_Display = (bool)Value; 912 break; 913 914 case ODM_CMNINFO_LINK: 915 pDM_Odm->bLinked = (bool)Value; 916 break; 917 918 case ODM_CMNINFO_STATION_STATE: 919 pDM_Odm->bsta_state = (bool)Value; 920 break; 921 922 case ODM_CMNINFO_RSSI_MIN: 923 pDM_Odm->RSSI_Min = (u8)Value; 924 break; 925 926 case ODM_CMNINFO_RA_THRESHOLD_HIGH: 927 pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value; 928 break; 929 930 case ODM_CMNINFO_RA_THRESHOLD_LOW: 931 pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value; 932 break; 933 /* The following is for BT HS mode and BT coexist mechanism. */ 934 case ODM_CMNINFO_BT_ENABLED: 935 pDM_Odm->bBtEnabled = (bool)Value; 936 break; 937 938 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS: 939 pDM_Odm->bBtConnectProcess = (bool)Value; 940 break; 941 942 case ODM_CMNINFO_BT_HS_RSSI: 943 pDM_Odm->btHsRssi = (u8)Value; 944 break; 945 946 case ODM_CMNINFO_BT_OPERATION: 947 pDM_Odm->bBtHsOperation = (bool)Value; 948 break; 949 950 case ODM_CMNINFO_BT_LIMITED_DIG: 951 pDM_Odm->bBtLimitedDig = (bool)Value; 952 break; 953 954 case ODM_CMNINFO_BT_DISABLE_EDCA: 955 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value; 956 break; 957 958 /* 959 case ODM_CMNINFO_OP_MODE: 960 pDM_Odm->OPMode = (u8)Value; 961 break; 962 963 case ODM_CMNINFO_WM_MODE: 964 pDM_Odm->WirelessMode = (u8)Value; 965 break; 966 967 case ODM_CMNINFO_SEC_CHNL_OFFSET: 968 pDM_Odm->SecChOffset = (u8)Value; 969 break; 970 971 case ODM_CMNINFO_SEC_MODE: 972 pDM_Odm->Security = (u8)Value; 973 break; 974 975 case ODM_CMNINFO_BW: 976 pDM_Odm->BandWidth = (u8)Value; 977 break; 978 979 case ODM_CMNINFO_CHNL: 980 pDM_Odm->Channel = (u8)Value; 981 break; 982 */ 983 default: 984 /* do nothing */ 985 break; 986 } 987 988 989 } 990 991 /* 3 ============================================================ */ 992 /* 3 DIG */ 993 /* 3 ============================================================ */ 994 /*----------------------------------------------------------------------------- 995 * Function: odm_DIGInit() 996 * 997 * Overview: Set DIG scheme init value. 998 * 999 * Input: NONE 1000 * 1001 * Output: NONE 1002 * 1003 * Return: NONE 1004 * 1005 * Revised History: 1006 *When Who Remark 1007 * 1008 *--------------------------------------------------------------------------- 1009 */ 1010 1011 /* Remove DIG by yuchen */ 1012 1013 /* Remove DIG and FA check by Yu Chen */ 1014 1015 /* 3 ============================================================ */ 1016 /* 3 BB Power Save */ 1017 /* 3 ============================================================ */ 1018 1019 /* Remove BB power saving by Yuchen */ 1020 1021 /* 3 ============================================================ */ 1022 /* 3 Dynamic Tx Power */ 1023 /* 3 ============================================================ */ 1024 1025 /* Remove BY YuChen */ 1026 1027