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
30u16 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 */
39static 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 */
44static int retryrate_rec[MTO_MAX_DATA_RATE_LEVELS];
45
46static u8 boSparseTxTraffic;
47
48void MTO_Init(struct wbsoft_priv *adapter);
49void TxRateReductionCtrl(struct wbsoft_priv *adapter);
50void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 t0, u8 index);
51void MTO_TxFailed(struct wbsoft_priv *adapter);
52void 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 */
67void 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
138void 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