#include "./8192cd_cfg.h" #include "./8192cd.h" #include "./8192cd_util.h" void EdcaParaInit( struct rtl8192cd_priv *priv ) { int mode=priv->pmib->dot11BssType.net_work_type; static unsigned int slot_time, sifs_time; struct ParaRecord EDCA[4]; memset(EDCA, 0, 4*sizeof(struct ParaRecord)); sifs_time = 10; slot_time = 20; if (mode & (WIRELESS_11N)) sifs_time = 16; if (mode & (WIRELESS_11N| WIRELESS_11G|WIRELESS_11A)) slot_time = 9; #ifdef RTK_AC_SUPPORT //for 11ac logo, edit aifs time for cca test cases if(AC_SIGMA_MODE != AC_SIGMA_NONE) sifs_time = 10; #endif #if(defined(RTL_MANUAL_EDCA)) if( priv->pmib->dot11QosEntry.ManualEDCA ) { if( OPMODE & WIFI_AP_STATE ) memcpy(EDCA, priv->pmib->dot11QosEntry.AP_manualEDCA, 4*sizeof(struct ParaRecord)); else memcpy(EDCA, priv->pmib->dot11QosEntry.STA_manualEDCA, 4*sizeof(struct ParaRecord)); #ifdef WIFI_WMM if (QOS_ENABLE) RTL_W32(0x504, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time)); else #endif RTL_W32(0x504, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time)); }else #endif //RTL_MANUAL_EDCA { if(OPMODE & WIFI_AP_STATE) { memcpy(EDCA, rtl_ap_EDCA, 2*sizeof(struct ParaRecord)); if(mode & (WIRELESS_11A|WIRELESS_11G|WIRELESS_11N)) memcpy(&EDCA[VI], &rtl_ap_EDCA[VI_AG], 2*sizeof(struct ParaRecord)); else memcpy(&EDCA[VI], &rtl_ap_EDCA[VI], 2*sizeof(struct ParaRecord)); } else { memcpy(EDCA, rtl_sta_EDCA, 2*sizeof(struct ParaRecord)); if(mode & (WIRELESS_11A|WIRELESS_11G|WIRELESS_11N)) memcpy(&EDCA[VI], &rtl_sta_EDCA[VI_AG], 2*sizeof(struct ParaRecord)); else memcpy(&EDCA[VI], &rtl_sta_EDCA[VI], 2*sizeof(struct ParaRecord)); } #ifdef WIFI_WMM if (QOS_ENABLE) RTL_W32(0x504, (EDCA[VI].TXOPlimit<< 16) | (EDCA[VI].ECWmax<< 12) | (EDCA[VI].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time)); else #endif RTL_W32(0x504, (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[VI].AIFSN* slot_time)); } RTL_W32(0x500, (EDCA[VO].TXOPlimit<< 16) | (EDCA[VO].ECWmax<< 12) | (EDCA[VO].ECWmin<< 8) | (sifs_time + EDCA[VO].AIFSN* slot_time)); RTL_W32(0x508, (EDCA[BE].TXOPlimit<< 16) | (EDCA[BE].ECWmax<< 12) | (EDCA[BE].ECWmin<< 8) | (sifs_time + EDCA[BE].AIFSN* slot_time)); RTL_W32(0x50C, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | (sifs_time + EDCA[BK].AIFSN* slot_time)); #if defined(RTK_AC_SUPPORT) && defined(RTL_MANUAL_EDCA) //for 11ac logo, make BK worse to seperate with BE. if((AC_SIGMA_MODE != AC_SIGMA_NONE) && (priv->pmib->dot11QosEntry.ManualEDCA)) { RTL_W32(0x50C, (EDCA[BK].TXOPlimit<< 16) | (EDCA[BK].ECWmax<< 12) | (EDCA[BK].ECWmin<< 8) | 0xa4 ); } #endif // ODM_Write1Byte(pDM_Odm,ACMHWCTRL, 0x00); priv->pshare->iot_mode_enable = 0; if (priv->pshare->rf_ft_var.wifi_beq_iot) priv->pshare->iot_mode_VI_exist = 0; #ifdef WMM_VIBE_PRI priv->pshare->iot_mode_BE_exist = 0; #endif #ifdef WMM_BEBK_PRI priv->pshare->iot_mode_BK_exist = 0; #endif #ifdef LOW_TP_TXOP priv->pshare->BE_cwmax_enhance = 0; #endif priv->pshare->iot_mode_VO_exist = 0; } BOOLEAN ChooseIotMainSTA( struct rtl8192cd_priv *priv, IN PSTA_INFO_T pstat ) { BOOLEAN bhighTP_found_pstat=FALSE; if ((GET_ROOT(priv)->up_time % 2) == 0) { unsigned int tx_2s_avg = 0; unsigned int rx_2s_avg = 0; int i=0, aggReady=0; unsigned long total_sum = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes); int assoc_num = GET_ROOT(priv)->assoc_num; #ifdef MBSSID if (GET_ROOT(priv)->pmib->miscEntry.vap_enable){ for (i=0; ipvap_priv[i]-> assoc_num; } #endif #ifdef UNIVERSAL_REPEATER if (IS_DRV_OPEN(GET_VXD_PRIV(GET_ROOT(priv)))) assoc_num += GET_VXD_PRIV(GET_ROOT(priv))-> assoc_num; #endif #ifdef WDS if(GET_ROOT(priv)->pmib->dot11WdsInfo.wdsEnabled) assoc_num ++; #endif pstat->current_tx_bytes += pstat->tx_byte_cnt; pstat->current_rx_bytes += pstat->rx_byte_cnt; if (total_sum != 0) { if (total_sum <= 1000000) { tx_2s_avg = (unsigned int)((pstat->current_tx_bytes*100) / total_sum); rx_2s_avg = (unsigned int)((pstat->current_rx_bytes*100) / total_sum); } else { tx_2s_avg = (unsigned int)(pstat->current_tx_bytes / (total_sum / 100)); rx_2s_avg = (unsigned int)(pstat->current_rx_bytes / (total_sum / 100)); } } for(i=0; i<8; i++) aggReady += (pstat->ADDBA_ready[i]); if ((pstat->ht_cap_len && ( #ifdef SUPPORT_TX_AMSDU AMSDU_ENABLE || #endif aggReady)) || (pstat->IOTPeer==HT_IOT_PEER_INTEL) || (tx_2s_avg >= 50)) { if ((assoc_num==1) || (tx_2s_avg + rx_2s_avg >= 25)) { priv->pshare->highTP_found_pstat = pstat; } #ifdef CLIENT_MODE if (OPMODE & WIFI_STATION_STATE) { if ((tx_2s_avg + rx_2s_avg) >= 20) priv->pshare->highTP_found_pstat = pstat; } #endif } } else { pstat->current_tx_bytes = pstat->tx_byte_cnt; pstat->current_rx_bytes = pstat->rx_byte_cnt; } return bhighTP_found_pstat; } #ifdef WIFI_WMM VOID IotEdcaSwitch( struct rtl8192cd_priv *priv, IN unsigned char enable ) { int mode=priv->pmib->dot11BssType.net_work_type; unsigned int slot_time = 20, sifs_time = 10, BE_TXOP = 47, VI_TXOP = 94; unsigned int vi_cw_max = 4, vi_cw_min = 3, vi_aifs; #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) u32 be_edca, vi_edca; #endif if (!(!priv->pmib->dot11OperationEntry.wifi_specific || ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) #ifdef CLIENT_MODE || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) #endif )) return; #ifdef RTK_AC_SUPPORT //for 11ac logo, do not dynamic switch edca if(AC_SIGMA_MODE != AC_SIGMA_NONE) return; #endif if ((mode & WIRELESS_11N) && (priv->pshare->ht_sta_num #ifdef WDS || ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum) #endif )) sifs_time = 16; if (mode & (WIRELESS_11N|WIRELESS_11G|WIRELESS_11A)) { slot_time = 9; } else { BE_TXOP = 94; VI_TXOP = 188; } #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = -1; vi_edca = -1; #endif if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) { if (priv->pshare->iot_mode_VO_exist) { #ifdef WMM_VIBE_PRI if (priv->pshare->iot_mode_BE_exist) { vi_cw_max = 5; vi_cw_min = 3; vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time); } else #endif { vi_cw_max = 6; vi_cw_min = 4; vi_aifs = 0x2b; } } else { vi_aifs = (sifs_time + ((OPMODE & WIFI_AP_STATE)?1:2) * slot_time); } #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) vi_edca = ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16) | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs; #else RTL_W32(0x504, ((VI_TXOP*(1-priv->pshare->iot_mode_VO_exist)) << 16) | (vi_cw_max << 12) | (vi_cw_min << 8) | vi_aifs); #endif #ifdef WMM_BEBK_PRI #ifdef CONFIG_RTL_88E_SUPPORT if ((GET_CHIP_VER(priv) == VERSION_8188E) && priv->pshare->iot_mode_BK_exist) { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (10 << 12) | (6 << 8) | 0x4f; #else RTL_W32(0x50C, (10 << 12) | (6 << 8) | 0x4f); #endif } #endif #endif #if defined(CONFIG_WLAN_HAL_8881A) if (GET_CHIP_VER(priv) == VERSION_8881A) RTL_W32(0x50C, 0xa64f); #endif } if (priv->pshare->rf_ft_var.wifi_beq_iot && priv->pshare->iot_mode_VI_exist) { #if defined(CONFIG_RTL_88E_SUPPORT) || defined(CONFIG_RTL_8812_SUPPORT) if (GET_CHIP_VER(priv) == VERSION_8188E || GET_CHIP_VER(priv) == VERSION_8812E) { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (10 << 12) | (6 << 8) | 0x4f; #else RTL_W32(0x508, (10 << 12) | (6 << 8) | 0x4f); #endif } else #endif { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (10 << 12) | (4 << 8) | 0x4f; #else RTL_W32(0x508, (10 << 12) | (4 << 8) | 0x4f); #endif } } else if(!enable) { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8) | (sifs_time + 3 * slot_time); #else RTL_W32(0x508, (((OPMODE & WIFI_AP_STATE)?6:10) << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); #endif #ifdef CONFIG_PCI_HCI // ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) | (DIS_TXOP_CFE)); #endif } else { int txop; unsigned int cw_max; #ifdef LOW_TP_TXOP unsigned int txop_close; #endif #if(defined LOW_TP_TXOP) cw_max = ((priv->pshare->BE_cwmax_enhance) ? 10 : 6); txop_close = ((priv->pshare->rf_ft_var.low_tp_txop && priv->pshare->rf_ft_var.low_tp_txop_close) ? 1 : 0); if(priv->pshare->txop_enlarge == 0xe) //if intel case txop = (txop_close ? 0 : (BE_TXOP*2)); else //if other case txop = (txop_close ? 0: (BE_TXOP*priv->pshare->txop_enlarge)); #else cw_max=6; if((priv->pshare->txop_enlarge==0xe)||(priv->pshare->txop_enlarge==0xd)) txop=BE_TXOP*2; else txop=BE_TXOP*priv->pshare->txop_enlarge; #endif if (priv->pshare->ht_sta_num #ifdef WDS || ((OPMODE & WIFI_AP_STATE) && (mode & WIRELESS_11N) && priv->pmib->dot11WdsInfo.wdsEnabled && priv->pmib->dot11WdsInfo.wdsNum) #endif ) { if (priv->pshare->txop_enlarge == 0xe) { // is intel client, use a different edca value //ODM_Write4Byte(pDM_Odm, ODM_EDCA_BE_PARAM, (txop<< 16) | (cw_max<< 12) | (4 << 8) | 0x1f); if (get_rf_mimo_mode(priv)==MIMO_1T1R) { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (txop << 16) | (5 << 12) | (3 << 8) | 0x1f; #else RTL_W32(0x508, (txop << 16) | (5 << 12) | (3 << 8) | 0x1f); #endif } else { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (txop << 16) | (8 << 12) | (5 << 8) | 0x1f; #else RTL_W32(0x508, (txop << 16) | (8 << 12) | (5 << 8) | 0x1f); #endif } #ifdef CONFIG_PCI_HCI // ODM_Write2Byte(pDM_Odm, RD_CTRL, ODM_Read2Byte(pDM_Odm, RD_CTRL) & ~(DIS_TXOP_CFE)); #endif priv->pshare->txop_enlarge = 2; } #ifndef LOW_TP_TXOP else if (priv->pshare->txop_enlarge == 0xd) { // is intel ralink, use a different edca value #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (txop << 16) | (6 << 12) | (5 << 8) | 0x2b; #else RTL_W32(0x508, (txop << 16) | (6 << 12) | (5 << 8) | 0x2b); #endif priv->pshare->txop_enlarge = 2; } #endif else { if (get_rf_mimo_mode(priv)==MIMO_2T2R) { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time); #else RTL_W32(0x508, (txop << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); #endif } else #if(DM_ODM_SUPPORT_TYPE==ODM_AP)&&(defined LOW_TP_TXOP) { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (txop << 16) | (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time); #else RTL_W32(0x508, (txop << 16) | (((priv->pshare->BE_cwmax_enhance) ? 10 : 5) << 12) | (3 << 8) | (sifs_time + 2 * slot_time)); #endif } #else { PSTA_INFO_T pstat = priv->pshare->highTP_found_pstat; if ((GET_CHIP_VER(priv)==VERSION_8881A) && pstat && (pstat->IOTPeer == HT_IOT_PEER_HTC)) RTL_W32(0x508, 0x642b); else { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (txop << 16) | (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time); #else RTL_W32(0x508, (txop << 16) | (5 << 12) | (3 << 8) | (sifs_time + 2 * slot_time)); #endif } } #endif } } else { #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) be_edca = (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time); #else #if(defined LOW_TP_TXOP) RTL_W32(0x508, (BE_TXOP << 16) | (cw_max << 12) | (4 << 8) | (sifs_time + 3 * slot_time)); #endif #endif } } #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) notify_IOT_EDCA_switch(priv, be_edca, vi_edca); #endif } #endif VOID IotEngine( struct rtl8192cd_priv *priv ) { PSTA_INFO_T pstat = NULL; u4Byte i; #ifdef SW_TX_QUEUE int swqd = priv->swq_decision; #endif #ifdef WIFI_WMM unsigned int switch_turbo = 0, avg_tp; #endif //////////////////////////////////////////////////////// // if EDCA Turbo function is not supported or Manual EDCA Setting // then return //////////////////////////////////////////////////////// #if(defined(RTL_MANUAL_EDCA) && defined(WIFI_WMM)) if(priv->pmib->dot11QosEntry.ManualEDCA){ return ; } #endif pstat=priv->pshare->highTP_found_pstat; // if(pstat) { // if((pstat->tx_avarage + pstat->rx_avarage) < (1<<17)) // 1M bps // pstat = NULL; // } #ifdef WIFI_WMM if (QOS_ENABLE) { if (!priv->pmib->dot11OperationEntry.wifi_specific ||((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) ) { if (priv->pshare->iot_mode_enable && ((priv->pshare->phw->VO_pkt_count > 50) || (priv->pshare->phw->VI_pkt_count > 50) || (priv->pshare->phw->BK_pkt_count > 50))) { priv->pshare->iot_mode_enable = 0; switch_turbo++; #ifdef CONFIG_WLAN_HAL_8881A if (GET_CHIP_VER(priv) == VERSION_8881A) { RTL_W32(0x460, 0x03086666); } #endif //CONFIG_WLAN_HAL_8881A } else if ((!priv->pshare->iot_mode_enable) && ((priv->pshare->phw->VO_pkt_count < 50) && (priv->pshare->phw->VI_pkt_count < 50) && (priv->pshare->phw->BK_pkt_count < 50))) { priv->pshare->iot_mode_enable++; switch_turbo++; //#ifdef CONFIG_WLAN_HAL_8881A #if 0 if (GET_CHIP_VER(priv) == VERSION_8881A) { if (get_bonding_type_8881A()==BOND_8881AB) { RTL_W32(0x460, 0x03086666); } else { RTL_W32(0x460, 0x0320ffff); } } #endif //CONFIG_WLAN_HAL_8881A } } if ((OPMODE & WIFI_AP_STATE) && priv->pmib->dot11OperationEntry.wifi_specific) { if (!priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count > 50)) { priv->pshare->iot_mode_VO_exist++; switch_turbo++; } else if (priv->pshare->iot_mode_VO_exist && (priv->pshare->phw->VO_pkt_count < 50)) { priv->pshare->iot_mode_VO_exist = 0; switch_turbo++; } #if(defined WMM_VIBE_PRI) if (priv->pshare->iot_mode_VO_exist) { //printk("[%s %d] BE_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BE_pkt_count); if (!priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count > 250)) { priv->pshare->iot_mode_BE_exist++; switch_turbo++; } else if (priv->pshare->iot_mode_BE_exist && (priv->pshare->phw->BE_pkt_count < 250)) { priv->pshare->iot_mode_BE_exist = 0; switch_turbo++; } } #endif #if(defined WMM_BEBK_PRI) if (priv->pshare->phw->BE_pkt_count) { //printk("[%s %d] BK_pkt_count=%d\n", __FUNCTION__, __LINE__, priv->pshare->phw->BK_pkt_count); if (!priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count > 250)) { priv->pshare->iot_mode_BK_exist++; switch_turbo++; } else if (priv->pshare->iot_mode_BK_exist && (priv->pshare->phw->BK_pkt_count < 250)) { priv->pshare->iot_mode_BK_exist = 0; switch_turbo++; } } #endif if (priv->pshare->rf_ft_var.wifi_beq_iot) { if (!priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count > 50)) { priv->pshare->iot_mode_VI_exist++; switch_turbo++; } else if (priv->pshare->iot_mode_VI_exist && (priv->pshare->phw->VI_rx_pkt_count < 50)) { priv->pshare->iot_mode_VI_exist = 0; switch_turbo++; } } } else if (!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) { if (priv->pshare->txop_enlarge) { priv->pshare->txop_enlarge = 0; if (priv->pshare->iot_mode_enable) switch_turbo++; } } #if(defined(CLIENT_MODE) ) if ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific)) { if (priv->pshare->iot_mode_enable && (((priv->pshare->phw->VO_pkt_count > 50) || (priv->pshare->phw->VI_pkt_count > 50) || (priv->pshare->phw->BK_pkt_count > 50)) || (pstat && (!pstat->ADDBA_ready[0]) & (!pstat->ADDBA_ready[3])))) { priv->pshare->iot_mode_enable = 0; switch_turbo++; } else if ((!priv->pshare->iot_mode_enable) && (((priv->pshare->phw->VO_pkt_count < 50) && (priv->pshare->phw->VI_pkt_count < 50) && (priv->pshare->phw->BK_pkt_count < 50)) && (pstat && (pstat->ADDBA_ready[0] | pstat->ADDBA_ready[3])))) { priv->pshare->iot_mode_enable++; switch_turbo++; } } #endif priv->pshare->phw->VO_pkt_count = 0; priv->pshare->phw->VI_pkt_count = 0; priv->pshare->phw->BK_pkt_count = 0; #if(defined WMM_VIBE_PRI) priv->pshare->phw->BE_pkt_count = 0; #endif if (priv->pshare->rf_ft_var.wifi_beq_iot) priv->pshare->phw->VI_rx_pkt_count = 0; } #endif if ((priv->up_time % 2) == 0) { /* * decide EDCA content for different chip vendor */ #ifdef WIFI_WMM if (QOS_ENABLE && (!priv->pmib->dot11OperationEntry.wifi_specific || ((OPMODE & WIFI_AP_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2)) #ifdef CLIENT_MODE || ((OPMODE & WIFI_STATION_STATE) && (priv->pmib->dot11OperationEntry.wifi_specific == 2)) #endif )) { if (pstat && pstat->rssi >= priv->pshare->rf_ft_var.txop_enlarge_upper) { #ifdef LOW_TP_TXOP if (pstat->IOTPeer==HT_IOT_PEER_INTEL) { if (priv->pshare->txop_enlarge != 0xe) { priv->pshare->txop_enlarge = 0xe; if (priv->pshare->iot_mode_enable) switch_turbo++; } } else if (priv->pshare->txop_enlarge != 2) { priv->pshare->txop_enlarge = 2; if (priv->pshare->iot_mode_enable) switch_turbo++; } #else if (priv->pshare->txop_enlarge != 2) { if (pstat->IOTPeer==HT_IOT_PEER_INTEL) priv->pshare->txop_enlarge = 0xe; else if (pstat->IOTPeer==HT_IOT_PEER_RALINK) priv->pshare->txop_enlarge = 0xd; else if (pstat->IOTPeer==HT_IOT_PEER_HTC) priv->pshare->txop_enlarge = 0; else priv->pshare->txop_enlarge = 2; if (priv->pshare->iot_mode_enable) switch_turbo++; } #endif } else if ((!pstat || pstat->rssi < priv->pshare->rf_ft_var.txop_enlarge_lower) #ifdef SW_TX_QUEUE && (priv->swq_en == 0) #endif ) { if (priv->pshare->txop_enlarge) { priv->pshare->txop_enlarge = 0; if (priv->pshare->iot_mode_enable) switch_turbo++; } } #if(defined LOW_TP_TXOP) // for Intel IOT, need to enlarge CW MAX from 6 to 10 if (pstat && pstat->IOTPeer==HT_IOT_PEER_INTEL && (((pstat->tx_avarage+pstat->rx_avarage)>>10) < priv->pshare->rf_ft_var.cwmax_enhance_thd)) { if (!priv->pshare->BE_cwmax_enhance && priv->pshare->iot_mode_enable) { priv->pshare->BE_cwmax_enhance = 1; switch_turbo++; } } else { if (priv->pshare->BE_cwmax_enhance) { priv->pshare->BE_cwmax_enhance = 0; switch_turbo++; } } #endif } #endif priv->pshare->current_tx_bytes = 0; priv->pshare->current_rx_bytes = 0; }else { if ((GET_CHIP_VER(priv) == VERSION_8881A)||(GET_CHIP_VER(priv) == VERSION_8192E)|| (GET_CHIP_VER(priv) == VERSION_8188E) ){ unsigned int uldl_tp = (priv->pshare->current_tx_bytes+priv->pshare->current_rx_bytes)>>17; if((uldl_tp > 40) && (priv->pshare->agg_to!= 1)) { RTL_W8(0x462, 0x08); priv->pshare->agg_to = 1; } else if((uldl_tp < 35) && (priv->pshare->agg_to !=0)) { RTL_W8(0x462, 0x02); priv->pshare->agg_to = 0; } } } #if(defined SW_TX_QUEUE) if(AMPDU_ENABLE) { #ifdef TX_EARLY_MODE if (GET_TX_EARLY_MODE) { if (!GET_EM_SWQ_ENABLE && ((priv->assoc_num > 1) || (pstat && pstat->IOTPeer != HT_IOT_PEER_UNKNOWN))) { if ((priv->pshare->em_tx_byte_cnt >> 17) > EM_TP_UP_BOUND) priv->pshare->reach_tx_limit_cnt++; else priv->pshare->reach_tx_limit_cnt = 0; if (priv->pshare->txop_enlarge && priv->pshare->reach_tx_limit_cnt /*>= WAIT_TP_TIME*/) { GET_EM_SWQ_ENABLE = 1; priv->pshare->reach_tx_limit_cnt = 0; if (pstat->IOTPeer == HT_IOT_PEER_INTEL) MAX_EM_QUE_NUM = 12; else if (pstat->IOTPeer == HT_IOT_PEER_RALINK) MAX_EM_QUE_NUM = 10; enable_em(priv); } } else if (GET_EM_SWQ_ENABLE) { if ((priv->pshare->em_tx_byte_cnt >> 17) < EM_TP_LOW_BOUND) priv->pshare->reach_tx_limit_cnt++; else priv->pshare->reach_tx_limit_cnt = 0; if (!priv->pshare->txop_enlarge || priv->pshare->reach_tx_limit_cnt >= WAIT_TP_TIME) { GET_EM_SWQ_ENABLE = 0; priv->pshare->reach_tx_limit_cnt = 0; disable_em(priv); } } } #endif #if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE) || defined(CONFIG_RTL_8812_SUPPORT) if ((GET_CHIP_VER(priv) == VERSION_8188E) || (priv->assoc_num > 9)) #endif { if((priv->ext_stats.tx_avarage>>17)>TP_HIGH_WATER_MARK /*|| (priv->ext_stats.rx_avarage>>17)> TP_HIGH_WATER_MARK*/) { if ((priv->swq_decision == 0)){ switch_turbo++; if (pstat) { if (pstat->IOTPeer==HT_IOT_PEER_INTEL) priv->pshare->txop_enlarge = 0xe; else if (pstat->IOTPeer==HT_IOT_PEER_RALINK) priv->pshare->txop_enlarge = 0xd; else if (pstat->IOTPeer==HT_IOT_PEER_HTC) priv->pshare->txop_enlarge = 0; else priv->pshare->txop_enlarge = 2; } else if (priv->pshare->txop_enlarge == 0) { priv->pshare->txop_enlarge = 2; } priv->swq_decision = 1; } } else{ if (priv->swq_txmac_chg >= priv->pshare->rf_ft_var.swq_en_highthd){ if ((priv->swq_decision == 0)){ switch_turbo++; if (priv->pshare->txop_enlarge == 0) priv->pshare->txop_enlarge = 2; priv->swq_decision = 1; } else { if ((switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)) { priv->pshare->txop_enlarge = 2; switch_turbo--; } } } else if(priv->swq_txmac_chg <= priv->pshare->rf_ft_var.swq_dis_lowthd){ priv->swq_decision = 0; } else if ((priv->swq_decision == 1) && (switch_turbo > 0) && (priv->pshare->txop_enlarge == 0) && (priv->pshare->iot_mode_enable != 0)){ priv->pshare->txop_enlarge = 2; switch_turbo--; } } } if( swqd ^priv->swq_decision ) { if((priv->swq_decision == 1) #if (defined(TX_EARLY_MODE)) || (GET_EM_SWQ_ENABLE == 1) #endif ) { priv->swq_en = 1; priv->swqen_keeptime = priv->up_time; extern void init_STA_SWQAggNum(struct rtl8192cd_priv *priv); init_STA_SWQAggNum(priv); } else { priv->swq_en = 0; priv->swqen_keeptime = 0; } } } if(priv->pshare->rf_ft_var.swq_enable == 0) { priv->swq_en = 0; priv->swqen_keeptime = 0; } #endif #ifdef WIFI_WMM #ifdef LOW_TP_TXOP if ((!priv->pmib->dot11OperationEntry.wifi_specific || (priv->pmib->dot11OperationEntry.wifi_specific == 2)) && QOS_ENABLE) { if (switch_turbo || priv->pshare->rf_ft_var.low_tp_txop) { unsigned int thd_tp; unsigned char under_thd; unsigned int curr_tp; if (priv->pmib->dot11BssType.net_work_type & (WIRELESS_11N| WIRELESS_11G)) { // Determine the upper bound throughput threshold. if (priv->pmib->dot11BssType.net_work_type & WIRELESS_11N) { if (priv->assoc_num && priv->assoc_num != priv->pshare->ht_sta_num) thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g; else thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_n; } else thd_tp = priv->pshare->rf_ft_var.low_tp_txop_thd_g; // Determine to close txop. #if defined(UNIVERSAL_REPEATER) || defined(MBSSID) if(IS_STA_VALID(pstat)) { struct rtl8192cd_priv *tmppriv; struct aid_obj *aidarray; aidarray = container_of(pstat, struct aid_obj, station); tmppriv = aidarray->priv; curr_tp = (unsigned int)(tmppriv->ext_stats.tx_avarage>>17) + (unsigned int)(tmppriv->ext_stats.rx_avarage>>17); } else #endif curr_tp = (unsigned int)(priv->ext_stats.tx_avarage>>17) + (unsigned int)(priv->ext_stats.rx_avarage>>17); if (curr_tp <= thd_tp && curr_tp >= priv->pshare->rf_ft_var.low_tp_txop_thd_low) under_thd = 1; else under_thd = 0; } else { under_thd = 0; } if (switch_turbo) { priv->pshare->rf_ft_var.low_tp_txop_close = under_thd; priv->pshare->rf_ft_var.low_tp_txop_count = 0; } else if (priv->pshare->iot_mode_enable && (priv->pshare->rf_ft_var.low_tp_txop_close != under_thd)) { priv->pshare->rf_ft_var.low_tp_txop_count++; if (priv->pshare->rf_ft_var.low_tp_txop_close) { priv->pshare->rf_ft_var.low_tp_txop_count = priv->pshare->rf_ft_var.low_tp_txop_delay; } if (priv->pshare->rf_ft_var.low_tp_txop_count ==priv->pshare->rf_ft_var.low_tp_txop_delay) { priv->pshare->rf_ft_var.low_tp_txop_count = 0; priv->pshare->rf_ft_var.low_tp_txop_close = under_thd; switch_turbo++; } } else { priv->pshare->rf_ft_var.low_tp_txop_count = 0; } } } #endif #ifdef WMM_DSCP_C42 if (switch_turbo) { if (!priv->pshare->iot_mode_enable && !priv->pshare->aggrmax_change) { RTL_W16(0x4ca, 0x0404); priv->pshare->aggrmax_change = 1; } else if (priv->pshare->iot_mode_enable && priv->pshare->aggrmax_change) { RTL_W16(0x4ca, priv->pshare->aggrmax_bak); priv->pshare->aggrmax_change = 0; } } #endif #ifdef TX_EARLY_MODE unsigned int em_tp = ((priv->ext_stats.tx_avarage>>17) + (priv->ext_stats.rx_avarage>>17)); if (em_tp > 80) RTL_W32(0x508, (0x5e << 16) | (4 << 12) | (3 << 8) | 0x19); else //if (em_tp < 75) RTL_W32(0x508, (0x5e << 16) | (6 << 12) | (5 << 8) | 0x2b); #endif if (switch_turbo) IotEdcaSwitch( priv, priv->pshare->iot_mode_enable ); #endif }