1/* 2 * ============================================================================ 3 * MTO.C - 4 * 5 * Description: 6 * MAC Throughput Optimization for W89C33 802.11g WLAN STA. 7 * 8 * The following MIB attributes or internal variables will be affected 9 * while the MTO is being executed: 10 * dot11FragmentationThreshold, 11 * dot11RTSThreshold, 12 * transmission rate and PLCP preamble type, 13 * CCA mode, 14 * antenna diversity. 15 * 16 * Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. 17 * ============================================================================ 18 */ 19 20#include "sysdef.h" 21#include "sme_api.h" 22#include "wbhal_f.h" 23 24/* Declare SQ3 to rate and fragmentation threshold table */ 25/* Declare fragmentation thresholds table */ 26#define MTO_MAX_FRAG_TH_LEVELS 5 27#define MTO_MAX_DATA_RATE_LEVELS 12 28 29u16 MTO_Frag_Th_Tbl[MTO_MAX_FRAG_TH_LEVELS] = { 30 256, 384, 512, 768, 1536 31}; 32 33/* 34 * Declare data rate table: 35 * The following table will be changed at anytime if the opration rate 36 * supported by AP don't match the table 37 */ 38static u8 MTO_Data_Rate_Tbl[MTO_MAX_DATA_RATE_LEVELS] = { 39 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 40}; 41 42static int TotalTxPkt; 43static int TotalTxPktRetry; 44/* this record the retry rate at different data rate */ 45static int retryrate_rec[MTO_MAX_DATA_RATE_LEVELS]; 46 47static int PeriodTotalTxPkt; 48static int PeriodTotalTxPktRetry; 49 50static u8 boSparseTxTraffic; 51 52void MTO_Init(struct wbsoft_priv *adapter); 53void TxRateReductionCtrl(struct wbsoft_priv *adapter); 54void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 t0, u8 index); 55void MTO_TxFailed(struct wbsoft_priv *adapter); 56void hal_get_dto_para(struct wbsoft_priv *adapter, char *buffer); 57 58/* 59 * =========================================================================== 60 * MTO_Init -- 61 * 62 * Description: 63 * Initialize MTO parameters. 64 * 65 * This function should be invoked during system initialization. 66 * 67 * Arguments: 68 * adapter - The pointer to the Miniport adapter Context 69 * =========================================================================== 70 */ 71void MTO_Init(struct wbsoft_priv *adapter) 72{ 73 int i; 74 75 MTO_PREAMBLE_TYPE() = MTO_PREAMBLE_SHORT; /* for test */ 76 77 MTO_CNT_ANT(0) = 0; 78 MTO_CNT_ANT(1) = 0; 79 MTO_SQ_ANT(0) = 0; 80 MTO_SQ_ANT(1) = 0; 81 82 MTO_AGING_TIMEOUT() = 0; 83 84 /* The following parameters should be initialized to the values set by user */ 85 MTO_RATE_LEVEL() = 0; 86 MTO_FRAG_TH_LEVEL() = 4; 87 MTO_RTS_THRESHOLD() = MTO_FRAG_TH() + 1; 88 MTO_RTS_THRESHOLD_SETUP() = MTO_FRAG_TH() + 1; 89 MTO_RATE_CHANGE_ENABLE() = 1; 90 MTO_FRAG_CHANGE_ENABLE() = 0; 91 MTO_POWER_CHANGE_ENABLE() = 1; 92 MTO_PREAMBLE_CHANGE_ENABLE() = 1; 93 MTO_RTS_CHANGE_ENABLE() = 0; 94 95 for (i = 0; i < MTO_MAX_DATA_RATE_LEVELS; i++) 96 retryrate_rec[i] = 5; 97 98 MTO_TXFLOWCOUNT() = 0; 99 /* --------- DTO threshold parameters ------------- */ 100 MTOPARA_PERIODIC_CHECK_CYCLE() = 10; 101 MTOPARA_RSSI_TH_FOR_ANTDIV() = 10; 102 MTOPARA_TXCOUNT_TH_FOR_CALC_RATE() = 50; 103 MTOPARA_TXRATE_INC_TH() = 10; 104 MTOPARA_TXRATE_DEC_TH() = 30; 105 MTOPARA_TXRATE_EQ_TH() = 40; 106 MTOPARA_TXRATE_BACKOFF() = 12; 107 MTOPARA_TXRETRYRATE_REDUCE() = 6; 108 if (MTO_TXPOWER_FROM_EEPROM == 0xff) { 109 switch (MTO_HAL()->phy_type) { 110 case RF_AIROHA_2230: 111 case RF_AIROHA_2230S: 112 MTOPARA_TXPOWER_INDEX() = 46; /* MAX-8 @@ Only for AL 2230 */ 113 break; 114 case RF_AIROHA_7230: 115 MTOPARA_TXPOWER_INDEX() = 49; 116 break; 117 case RF_WB_242: 118 MTOPARA_TXPOWER_INDEX() = 10; 119 break; 120 case RF_WB_242_1: 121 MTOPARA_TXPOWER_INDEX() = 24; 122 break; 123 } 124 } else { /* follow the setting from EEPROM */ 125 MTOPARA_TXPOWER_INDEX() = MTO_TXPOWER_FROM_EEPROM; 126 } 127 RFSynthesizer_SetPowerIndex(MTO_HAL(), (u8) MTOPARA_TXPOWER_INDEX()); 128 /* ------------------------------------------------ */ 129 130 /* For RSSI turning -- Cancel load from EEPROM */ 131 MTO_DATA().RSSI_high = -41; 132 MTO_DATA().RSSI_low = -60; 133} 134 135/* =========================================================================== 136 * Description: 137 * If we enable DTO, we will ignore the tx count with different tx rate 138 * from DTO rate. This is because when we adjust DTO tx rate, there could 139 * be some packets in the tx queue with previous tx rate 140 */ 141 142void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 tx_rate, u8 index) 143{ 144 MTO_TXFLOWCOUNT()++; 145 if ((MTO_ENABLE == 1) && (MTO_RATE_CHANGE_ENABLE() == 1)) { 146 if (tx_rate == MTO_DATA_RATE()) { 147 if (index == 0) { 148 if (boSparseTxTraffic) 149 MTO_HAL()->dto_tx_frag_count += MTOPARA_PERIODIC_CHECK_CYCLE(); 150 else 151 MTO_HAL()->dto_tx_frag_count += 1; 152 } else { 153 if (index < 8) { 154 MTO_HAL()->dto_tx_retry_count += index; 155 MTO_HAL()->dto_tx_frag_count += (index + 1); 156 } else { 157 MTO_HAL()->dto_tx_retry_count += 7; 158 MTO_HAL()->dto_tx_frag_count += 7; 159 } 160 } 161 } else if (MTO_DATA_RATE() > 48 && tx_rate == 48) { 162 /* for reducing data rate scheme, do not calculate different data rate. 3 is the reducing data rate at retry. */ 163 if (index < 3) { 164 MTO_HAL()->dto_tx_retry_count += index; 165 MTO_HAL()->dto_tx_frag_count += (index + 1); 166 } else { 167 MTO_HAL()->dto_tx_retry_count += 3; 168 MTO_HAL()->dto_tx_frag_count += 3; 169 } 170 171 } 172 } else { 173 MTO_HAL()->dto_tx_retry_count += index; 174 MTO_HAL()->dto_tx_frag_count += (index + 1); 175 } 176 TotalTxPkt++; 177 TotalTxPktRetry += (index + 1); 178 179 PeriodTotalTxPkt++; 180 PeriodTotalTxPktRetry += (index + 1); 181} 182