linux/drivers/staging/winbond/mto.c
<<
>>
Prefs
   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 threshold 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 operation 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