diff options
Diffstat (limited to 'drivers/staging/rtl8723bs/hal/odm_HWConfig.c')
-rw-r--r-- | drivers/staging/rtl8723bs/hal/odm_HWConfig.c | 343 |
1 files changed, 175 insertions, 168 deletions
diff --git a/drivers/staging/rtl8723bs/hal/odm_HWConfig.c b/drivers/staging/rtl8723bs/hal/odm_HWConfig.c index 32f7eb952ca8..994b8c578e7a 100644 --- a/drivers/staging/rtl8723bs/hal/odm_HWConfig.c +++ b/drivers/staging/rtl8723bs/hal/odm_HWConfig.c @@ -9,54 +9,52 @@ #define READ_AND_CONFIG_MP(ic, txt) (ODM_ReadAndConfig_MP_##ic##txt(pDM_Odm)) #define READ_AND_CONFIG READ_AND_CONFIG_MP -#define GET_VERSION_MP(ic, txt) (ODM_GetVersion_MP_##ic##txt()) -#define GET_VERSION(ic, txt) (pDM_Odm->bIsMPChip?GET_VERSION_MP(ic, txt):GET_VERSION_TC(ic, txt)) -static u8 odm_QueryRxPwrPercentage(s8 AntPower) +static u8 odm_query_rx_pwr_percentage(s8 ant_power) { - if ((AntPower <= -100) || (AntPower >= 20)) + if ((ant_power <= -100) || (ant_power >= 20)) return 0; - else if (AntPower >= 0) + else if (ant_power >= 0) return 100; else - return 100 + AntPower; + return 100 + ant_power; } -s32 odm_SignalScaleMapping(struct dm_odm_t *pDM_Odm, s32 CurrSig) +s32 odm_signal_scale_mapping(struct dm_odm_t *dm_odm, s32 curr_sig) { - s32 RetSig = 0; - - if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO) { - if (CurrSig >= 51 && CurrSig <= 100) - RetSig = 100; - else if (CurrSig >= 41 && CurrSig <= 50) - RetSig = 80 + ((CurrSig - 40)*2); - else if (CurrSig >= 31 && CurrSig <= 40) - RetSig = 66 + (CurrSig - 30); - else if (CurrSig >= 21 && CurrSig <= 30) - RetSig = 54 + (CurrSig - 20); - else if (CurrSig >= 10 && CurrSig <= 20) - RetSig = 42 + (((CurrSig - 10) * 2) / 3); - else if (CurrSig >= 5 && CurrSig <= 9) - RetSig = 22 + (((CurrSig - 5) * 3) / 2); - else if (CurrSig >= 1 && CurrSig <= 4) - RetSig = 6 + (((CurrSig - 1) * 3) / 2); + s32 ret_sig = 0; + + if (dm_odm->SupportInterface == ODM_ITRF_SDIO) { + if (curr_sig >= 51 && curr_sig <= 100) + ret_sig = 100; + else if (curr_sig >= 41 && curr_sig <= 50) + ret_sig = 80 + ((curr_sig - 40)*2); + else if (curr_sig >= 31 && curr_sig <= 40) + ret_sig = 66 + (curr_sig - 30); + else if (curr_sig >= 21 && curr_sig <= 30) + ret_sig = 54 + (curr_sig - 20); + else if (curr_sig >= 10 && curr_sig <= 20) + ret_sig = 42 + (((curr_sig - 10) * 2) / 3); + else if (curr_sig >= 5 && curr_sig <= 9) + ret_sig = 22 + (((curr_sig - 5) * 3) / 2); + else if (curr_sig >= 1 && curr_sig <= 4) + ret_sig = 6 + (((curr_sig - 1) * 3) / 2); else - RetSig = CurrSig; + ret_sig = curr_sig; } - return RetSig; + return ret_sig; } -static u8 odm_EVMdbToPercentage(s8 Value) +static u8 odm_evm_db_to_percentage(s8 value) { /* */ /* -33dB~0dB to 0%~99% */ /* */ s8 ret_val; - ret_val = Value; + ret_val = value; ret_val /= 2; if (ret_val >= 0) @@ -73,153 +71,177 @@ static u8 odm_EVMdbToPercentage(s8 Value) return ret_val; } -static void odm_RxPhyStatus92CSeries_Parsing( - struct dm_odm_t *pDM_Odm, - struct odm_phy_info *pPhyInfo, - u8 *pPhyStatus, - struct odm_packet_info *pPktinfo -) +static s8 odm_cck_rssi(u8 lna_idx, u8 vga_idx) { - u8 i, Max_spatial_stream; + s8 rx_pwr_all = 0x00; + + switch (lna_idx) { + /* 46 53 73 95 201301231630 */ + /* 46 53 77 99 201301241630 */ + + case 6: + rx_pwr_all = -34 - (2 * vga_idx); + break; + case 4: + rx_pwr_all = -14 - (2 * vga_idx); + break; + case 1: + rx_pwr_all = 6 - (2 * vga_idx); + break; + case 0: + rx_pwr_all = 16 - (2 * vga_idx); + break; + default: + /* rx_pwr_all = -53+(2*(31-VGA_idx)); */ + break; + } + return rx_pwr_all; +} + +static void odm_rx_phy_status_parsing(struct dm_odm_t *dm_odm, + struct odm_phy_info *phy_info, + u8 *phy_status, + struct odm_packet_info *pkt_info) +{ + u8 i; s8 rx_pwr[4], rx_pwr_all = 0; - u8 EVM, PWDB_ALL = 0, PWDB_ALL_BT; - u8 RSSI, total_rssi = 0; - bool isCCKrate = false; + u8 evm, pwdb_all = 0, pwdb_all_bt; + u8 rssi, total_rssi = 0; + bool is_cck_rate = false; u8 rf_rx_num = 0; - u8 LNA_idx, VGA_idx; - struct phy_status_rpt_8192cd_t *pPhyStaRpt = (struct phy_status_rpt_8192cd_t *)pPhyStatus; + u8 lna_idx, vga_idx; + struct phy_status_rpt_8192cd_t *phy_sta_rpt = (struct phy_status_rpt_8192cd_t *)phy_status; - isCCKrate = pPktinfo->data_rate <= DESC_RATE11M; - pPhyInfo->rx_mimo_signal_quality[ODM_RF_PATH_A] = -1; - pPhyInfo->rx_mimo_signal_quality[ODM_RF_PATH_B] = -1; + is_cck_rate = pkt_info->data_rate <= DESC_RATE11M; + phy_info->rx_mimo_signal_quality[RF_PATH_A] = -1; + phy_info->rx_mimo_signal_quality[RF_PATH_B] = -1; - if (isCCKrate) { + if (is_cck_rate) { u8 cck_agc_rpt; - pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK++; - /* */ - /* (1)Hardware does not provide RSSI for CCK */ - /* (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) */ - /* */ - - cck_agc_rpt = pPhyStaRpt->cck_agc_rpt_ofdm_cfosho_a; - - /* 2011.11.28 LukeLee: 88E use different LNA & VGA gain table */ - /* The RSSI formula should be modified according to the gain table */ - LNA_idx = ((cck_agc_rpt & 0xE0)>>5); - VGA_idx = (cck_agc_rpt & 0x1F); - rx_pwr_all = odm_CCKRSSI_8723B(LNA_idx, VGA_idx); - PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - if (PWDB_ALL > 100) - PWDB_ALL = 100; - - pPhyInfo->rx_pwd_ba11 = PWDB_ALL; - pPhyInfo->bt_rx_rssi_percentage = PWDB_ALL; - pPhyInfo->recv_signal_power = rx_pwr_all; - /* */ + dm_odm->PhyDbgInfo.NumQryPhyStatusCCK++; + + /* + * (1)Hardware does not provide RSSI for CCK/ + * (2)PWDB, Average PWDB calculated by + * hardware (for rate adaptive) + */ + + cck_agc_rpt = phy_sta_rpt->cck_agc_rpt_ofdm_cfosho_a; + + /* + * 2011.11.28 LukeLee: 88E use different LNA & VGA gain table + * The RSSI formula should be modified according to the gain table + */ + lna_idx = ((cck_agc_rpt & 0xE0)>>5); + vga_idx = (cck_agc_rpt & 0x1F); + rx_pwr_all = odm_cck_rssi(lna_idx, vga_idx); + pwdb_all = odm_query_rx_pwr_percentage(rx_pwr_all); + if (pwdb_all > 100) + pwdb_all = 100; + + phy_info->rx_pwd_ba11 = pwdb_all; + phy_info->bt_rx_rssi_percentage = pwdb_all; + phy_info->recv_signal_power = rx_pwr_all; + /* (3) Get Signal Quality (EVM) */ - /* */ + /* if (pPktinfo->bPacketMatchBSSID) */ { - u8 SQ, SQ_rpt; + u8 sq, sq_rpt; - if (pPhyInfo->rx_pwd_ba11 > 40 && !pDM_Odm->bInHctTest) - SQ = 100; + if (phy_info->rx_pwd_ba11 > 40 && !dm_odm->bInHctTest) + sq = 100; else { - SQ_rpt = pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all; + sq_rpt = phy_sta_rpt->cck_sig_qual_ofdm_pwdb_all; - if (SQ_rpt > 64) - SQ = 0; - else if (SQ_rpt < 20) - SQ = 100; + if (sq_rpt > 64) + sq = 0; + else if (sq_rpt < 20) + sq = 100; else - SQ = ((64-SQ_rpt) * 100) / 44; + sq = ((64-sq_rpt) * 100) / 44; } - pPhyInfo->signal_quality = SQ; - pPhyInfo->rx_mimo_signal_quality[ODM_RF_PATH_A] = SQ; - pPhyInfo->rx_mimo_signal_quality[ODM_RF_PATH_B] = -1; + phy_info->signal_quality = sq; + phy_info->rx_mimo_signal_quality[RF_PATH_A] = sq; + phy_info->rx_mimo_signal_quality[RF_PATH_B] = -1; } } else { /* is OFDM rate */ - pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM++; + dm_odm->PhyDbgInfo.NumQryPhyStatusOFDM++; - /* */ - /* (1)Get RSSI for HT rate */ - /* */ + /* + * (1)Get RSSI for HT rate + */ - for (i = ODM_RF_PATH_A; i < ODM_RF_PATH_MAX; i++) { + for (i = RF_PATH_A; i < RF_PATH_MAX; i++) { /* 2008/01/30 MH we will judge RF RX path now. */ - if (pDM_Odm->RFPathRxEnable & BIT(i)) + if (dm_odm->RFPathRxEnable & BIT(i)) rf_rx_num++; /* else */ /* continue; */ - rx_pwr[i] = ((pPhyStaRpt->path_agc[i].gain&0x3F)*2) - 110; - + rx_pwr[i] = ((phy_sta_rpt->path_agc[i].gain & 0x3F) * 2) - 110; - pPhyInfo->rx_pwr[i] = rx_pwr[i]; + phy_info->rx_pwr[i] = rx_pwr[i]; /* Translate DBM to percentage. */ - RSSI = odm_QueryRxPwrPercentage(rx_pwr[i]); - total_rssi += RSSI; + rssi = odm_query_rx_pwr_percentage(rx_pwr[i]); + total_rssi += rssi; - pPhyInfo->rx_mimo_signal_strength[i] = (u8) RSSI; + phy_info->rx_mimo_signal_strength[i] = (u8)rssi; /* Get Rx snr value in DB */ - pPhyInfo->rx_snr[i] = pDM_Odm->PhyDbgInfo.RxSNRdB[i] = (s32)(pPhyStaRpt->path_rxsnr[i]/2); - } - - - /* */ - /* (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) */ - /* */ - rx_pwr_all = (((pPhyStaRpt->cck_sig_qual_ofdm_pwdb_all) >> 1)&0x7f)-110; - - PWDB_ALL_BT = PWDB_ALL = odm_QueryRxPwrPercentage(rx_pwr_all); - - pPhyInfo->rx_pwd_ba11 = PWDB_ALL; - pPhyInfo->bt_rx_rssi_percentage = PWDB_ALL_BT; - pPhyInfo->rx_power = rx_pwr_all; - pPhyInfo->recv_signal_power = rx_pwr_all; - - {/* pMgntInfo->CustomerID != RT_CID_819x_Lenovo */ - /* */ - /* (3)EVM of HT rate */ - /* */ - if (pPktinfo->data_rate >= DESC_RATEMCS8 && pPktinfo->data_rate <= DESC_RATEMCS15) - Max_spatial_stream = 2; /* both spatial stream make sense */ - else - Max_spatial_stream = 1; /* only spatial stream 1 makes sense */ - - for (i = 0; i < Max_spatial_stream; i++) { - /* Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment */ - /* fill most significant bit to "zero" when doing shifting operation which may change a negative */ - /* value to positive one, then the dbm value (which is supposed to be negative) is not correct anymore. */ - EVM = odm_EVMdbToPercentage((pPhyStaRpt->stream_rxevm[i])); /* dbm */ - - /* if (pPktinfo->bPacketMatchBSSID) */ - { - if (i == ODM_RF_PATH_A) /* Fill value in RFD, Get the first spatial stream only */ - pPhyInfo->signal_quality = (u8)(EVM & 0xff); - - pPhyInfo->rx_mimo_signal_quality[i] = (u8)(EVM & 0xff); - } - } + phy_info->rx_snr[i] = dm_odm->PhyDbgInfo.RxSNRdB[i] = (s32)(phy_sta_rpt->path_rxsnr[i]/2); } - ODM_ParsingCFO(pDM_Odm, pPktinfo, pPhyStaRpt->path_cfotail); - + /* + * (2)PWDB, Average PWDB calculated by hardware (for rate adaptive) + */ + rx_pwr_all = ((phy_sta_rpt->cck_sig_qual_ofdm_pwdb_all >> 1) & 0x7f) - 110; + + pwdb_all_bt = pwdb_all = odm_query_rx_pwr_percentage(rx_pwr_all); + + phy_info->rx_pwd_ba11 = pwdb_all; + phy_info->bt_rx_rssi_percentage = pwdb_all_bt; + phy_info->rx_power = rx_pwr_all; + phy_info->recv_signal_power = rx_pwr_all; + + /* + * (3)EVM of HT rate + * + * Only spatial stream 1 makes sense + * + * Do not use shift operation like "rx_evmX >>= 1" + * because the compiler of free build environment + * fill most significant bit to "zero" when doing + * shifting operation which may change a negative + * value to positive one, then the dbm value (which + * is supposed to be negative) is not correct + * anymore. + */ + evm = odm_evm_db_to_percentage(phy_sta_rpt->stream_rxevm[0]); /* dbm */ + + /* Fill value in RFD, Get the first spatial stream only */ + phy_info->signal_quality = (u8)(evm & 0xff); + + phy_info->rx_mimo_signal_quality[RF_PATH_A] = (u8)(evm & 0xff); + + odm_parsing_cfo(dm_odm, pkt_info, phy_sta_rpt->path_cfotail); } - /* UI BSS List signal strength(in percentage), make it good looking, from 0~100. */ - /* It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). */ - if (isCCKrate) { - pPhyInfo->signal_strength = (u8)(odm_SignalScaleMapping(pDM_Odm, PWDB_ALL));/* PWDB_ALL; */ + /* + * UI BSS List signal strength(in percentage), make it good + * looking, from 0~100. + * It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp(). + */ + if (is_cck_rate) { + phy_info->signal_strength = (u8)(odm_signal_scale_mapping(dm_odm, pwdb_all)); } else { if (rf_rx_num != 0) { - pPhyInfo->signal_strength = (u8)(odm_SignalScaleMapping(pDM_Odm, total_rssi /= rf_rx_num)); + phy_info->signal_strength = (u8)(odm_signal_scale_mapping(dm_odm, total_rssi /= rf_rx_num)); } } } @@ -268,23 +290,23 @@ static void odm_Process_RSSIForDM( if (pPktinfo->to_self || pPktinfo->is_beacon) { if (!isCCKrate) { /* ofdm rate */ - if (pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_B] == 0) { - RSSI_Ave = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_A = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_A]; + if (pPhyInfo->rx_mimo_signal_strength[RF_PATH_B] == 0) { + RSSI_Ave = pPhyInfo->rx_mimo_signal_strength[RF_PATH_A]; + pDM_Odm->RSSI_A = pPhyInfo->rx_mimo_signal_strength[RF_PATH_A]; pDM_Odm->RSSI_B = 0; } else { - pDM_Odm->RSSI_A = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_A]; - pDM_Odm->RSSI_B = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_B]; + pDM_Odm->RSSI_A = pPhyInfo->rx_mimo_signal_strength[RF_PATH_A]; + pDM_Odm->RSSI_B = pPhyInfo->rx_mimo_signal_strength[RF_PATH_B]; if ( - pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_A] > - pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_B] + pPhyInfo->rx_mimo_signal_strength[RF_PATH_A] > + pPhyInfo->rx_mimo_signal_strength[RF_PATH_B] ) { - RSSI_max = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_A]; - RSSI_min = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_B]; + RSSI_max = pPhyInfo->rx_mimo_signal_strength[RF_PATH_A]; + RSSI_min = pPhyInfo->rx_mimo_signal_strength[RF_PATH_B]; } else { - RSSI_max = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_B]; - RSSI_min = pPhyInfo->rx_mimo_signal_strength[ODM_RF_PATH_A]; + RSSI_max = pPhyInfo->rx_mimo_signal_strength[RF_PATH_B]; + RSSI_min = pPhyInfo->rx_mimo_signal_strength[RF_PATH_A]; } if ((RSSI_max-RSSI_min) < 3) @@ -371,29 +393,14 @@ static void odm_Process_RSSIForDM( /* */ /* Endianness before calling this API */ /* */ -static void ODM_PhyStatusQuery_92CSeries( - struct dm_odm_t *pDM_Odm, - struct odm_phy_info *pPhyInfo, - u8 *pPhyStatus, - struct odm_packet_info *pPktinfo -) +void odm_phy_status_query(struct dm_odm_t *dm_odm, struct odm_phy_info *phy_info, + u8 *phy_status, struct odm_packet_info *pkt_info) { - odm_RxPhyStatus92CSeries_Parsing(pDM_Odm, pPhyInfo, pPhyStatus, pPktinfo); - - if (!pDM_Odm->RSSI_test) - odm_Process_RSSIForDM(pDM_Odm, pPhyInfo, pPktinfo); -} - -void ODM_PhyStatusQuery( - struct dm_odm_t *pDM_Odm, - struct odm_phy_info *pPhyInfo, - u8 *pPhyStatus, - struct odm_packet_info *pPktinfo -) -{ + odm_rx_phy_status_parsing(dm_odm, phy_info, phy_status, pkt_info); - ODM_PhyStatusQuery_92CSeries(pDM_Odm, pPhyInfo, pPhyStatus, pPktinfo); + if (!dm_odm->RSSI_test) + odm_Process_RSSIForDM(dm_odm, phy_info, pkt_info); } /* */ @@ -404,7 +411,7 @@ void ODM_PhyStatusQuery( enum hal_status ODM_ConfigRFWithHeaderFile( struct dm_odm_t *pDM_Odm, enum ODM_RF_Config_Type ConfigType, - enum odm_rf_radio_path_e eRFPath + enum rf_path eRFPath ) { if (ConfigType == CONFIG_RF_RADIO) |