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