iwlwifi: document 4965 rate scaling

Document 4965 rate scaling

Signed-off-by: Ben Cahill <ben.m.cahill@intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Ben Cahill 2007-11-29 11:10:12 +08:00 committed by David S. Miller
parent 529699815b
commit 2bdc7031f9
1 changed files with 247 additions and 4 deletions

View File

@ -1322,6 +1322,8 @@ struct iwl4965_compressed_ba_resp {
/*
* REPLY_TX_PWR_TABLE_CMD = 0x97 (command, has simple generic response)
*
* See details under "TXPOWER" in iwl-4965-hw.h.
*/
struct iwl4965_txpowertable_cmd {
u8 band; /* 0: 5 GHz, 1: 2.4 GHz */
@ -1333,39 +1335,280 @@ struct iwl4965_txpowertable_cmd {
/*RS_NEW_API: only TLC_RTS remains and moved to bit 0 */
#define LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK (1<<0)
/* # of EDCA prioritized tx fifos */
#define LINK_QUAL_AC_NUM AC_NUM
/* # entries in rate scale table to support Tx retries */
#define LINK_QUAL_MAX_RETRY_NUM 16
/* Tx antenna selection values */
#define LINK_QUAL_ANT_A_MSK (1<<0)
#define LINK_QUAL_ANT_B_MSK (1<<1)
#define LINK_QUAL_ANT_MSK (LINK_QUAL_ANT_A_MSK|LINK_QUAL_ANT_B_MSK)
/**
* struct iwl4965_link_qual_general_params
*
* Used in REPLY_TX_LINK_QUALITY_CMD
*/
struct iwl4965_link_qual_general_params {
u8 flags;
/* No entries at or above this (driver chosen) index contain MIMO */
u8 mimo_delimiter;
u8 single_stream_ant_msk;
u8 dual_stream_ant_msk;
/* Best single antenna to use for single stream (legacy, SISO). */
u8 single_stream_ant_msk; /* LINK_QUAL_ANT_* */
/* Best antennas to use for MIMO (unused for 4965, assumes both). */
u8 dual_stream_ant_msk; /* LINK_QUAL_ANT_* */
/*
* If driver needs to use different initial rates for different
* EDCA QOS access categories (as implemented by tx fifos 0-3),
* this table will set that up, by indicating the indexes in the
* rs_table[LINK_QUAL_MAX_RETRY_NUM] rate table at which to start.
* Otherwise, driver should set all entries to 0.
*
* Entry usage:
* 0 = Background, 1 = Best Effort (normal), 2 = Video, 3 = Voice
* TX FIFOs above 3 use same value (typically 0) as TX FIFO 3.
*/
u8 start_rate_index[LINK_QUAL_AC_NUM];
} __attribute__ ((packed));
/**
* struct iwl4965_link_qual_agg_params
*
* Used in REPLY_TX_LINK_QUALITY_CMD
*/
struct iwl4965_link_qual_agg_params {
/* Maximum number of uSec in aggregation.
* Driver should set this to 4000 (4 milliseconds). */
__le16 agg_time_limit;
/*
* Number of Tx retries allowed for a frame, before that frame will
* no longer be considered for the start of an aggregation sequence
* (scheduler will then try to tx it as single frame).
* Driver should set this to 3.
*/
u8 agg_dis_start_th;
/*
* Maximum number of frames in aggregation.
* 0 = no limit (default). 1 = no aggregation.
* Other values = max # frames in aggregation.
*/
u8 agg_frame_cnt_limit;
__le32 reserved;
} __attribute__ ((packed));
/*
* REPLY_TX_LINK_QUALITY_CMD = 0x4e (command, has simple generic response)
*
* For 4965 only; 3945 uses REPLY_RATE_SCALE.
*
* Each station in the 4965's internal station table has its own table of 16
* Tx rates and modulation modes (e.g. legacy/SISO/MIMO) for retrying Tx when
* an ACK is not received. This command replaces the entire table for
* one station.
*
* NOTE: Station must already be in 4965's station table. Use REPLY_ADD_STA.
*
* The rate scaling procedures described below work well. Of course, other
* procedures are possible, and may work better for particular environments.
*
*
* FILLING THE RATE TABLE
*
* Given a particular initial rate and mode, as determined by the rate
* scaling algorithm described below, the Linux driver uses the following
* formula to fill the rs_table[LINK_QUAL_MAX_RETRY_NUM] rate table in the
* Link Quality command:
*
*
* 1) If using High-throughput (HT) (SISO or MIMO) initial rate:
* a) Use this same initial rate for first 3 entries.
* b) Find next lower available rate using same mode (SISO or MIMO),
* use for next 3 entries. If no lower rate available, switch to
* legacy mode (no FAT channel, no MIMO, no short guard interval).
* c) If using MIMO, set command's mimo_delimiter to number of entries
* using MIMO (3 or 6).
* d) After trying 2 HT rates, switch to legacy mode (no FAT channel,
* no MIMO, no short guard interval), at the next lower bit rate
* (e.g. if second HT bit rate was 54, try 48 legacy), and follow
* legacy procedure for remaining table entries.
*
* 2) If using legacy initial rate:
* a) Use the initial rate for only one entry.
* b) For each following entry, reduce the rate to next lower available
* rate, until reaching the lowest available rate.
* c) When reducing rate, also switch antenna selection.
* d) Once lowest available rate is reached, repeat this rate until
* rate table is filled (16 entries), switching antenna each entry.
*
*
* ACCUMULATING HISTORY
*
* The rate scaling algorithm for 4965, as implemented in Linux driver, uses
* two sets of frame Tx success history: One for the current/active modulation
* mode, and one for a speculative/search mode that is being attempted. If the
* speculative mode turns out to be more effective (i.e. actual transfer
* rate is better), then the driver continues to use the speculative mode
* as the new current active mode.
*
* Each history set contains, separately for each possible rate, data for a
* sliding window of the 62 most recent tx attempts at that rate. The data
* includes a shifting bitmap of success(1)/failure(0), and sums of successful
* and attempted frames, from which the driver can additionally calculate a
* success ratio (success / attempted) and number of failures
* (attempted - success), and control the size of the window (attempted).
* The driver uses the bit map to remove successes from the success sum, as
* the oldest tx attempts fall out of the window.
*
* When the 4965 makes multiple tx attempts for a given frame, each attempt
* might be at a different rate, and have different modulation characteristics
* (e.g. antenna, fat channel, short guard interval), as set up in the rate
* scaling table in the Link Quality command. The driver must determine
* which rate table entry was used for each tx attempt, to determine which
* rate-specific history to update, and record only those attempts that
* match the modulation characteristics of the history set.
*
* When using block-ack (aggregation), all frames are transmitted at the same
* rate, since there is no per-attempt acknowledgement from the destination
* station. The Tx response struct iwl_tx_resp indicates the Tx rate in
* rate_n_flags field. After receiving a block-ack, the driver can update
* history for the entire block all at once.
*
*
* FINDING BEST STARTING RATE:
*
* When working with a selected initial modulation mode (see below), the
* driver attempts to find a best initial rate. The initial rate is the
* first entry in the Link Quality command's rate table.
*
* 1) Calculate actual throughput (success ratio * expected throughput, see
* table below) for current initial rate. Do this only if enough frames
* have been attempted to make the value meaningful: at least 6 failed
* tx attempts, or at least 8 successes. If not enough, don't try rate
* scaling yet.
*
* 2) Find available rates adjacent to current initial rate. Available means:
* a) supported by hardware &&
* b) supported by association &&
* c) within any constraints selected by user
*
* 3) Gather measured throughputs for adjacent rates. These might not have
* enough history to calculate a throughput. That's okay, we might try
* using one of them anyway!
*
* 4) Try decreasing rate if, for current rate:
* a) success ratio is < 15% ||
* b) lower adjacent rate has better measured throughput ||
* c) higher adjacent rate has worse throughput, and lower is unmeasured
*
* As a sanity check, if decrease was determined above, leave rate
* unchanged if:
* a) lower rate unavailable
* b) success ratio at current rate > 85% (very good)
* c) current measured throughput is better than expected throughput
* of lower rate (under perfect 100% tx conditions, see table below)
*
* 5) Try increasing rate if, for current rate:
* a) success ratio is < 15% ||
* b) both adjacent rates' throughputs are unmeasured (try it!) ||
* b) higher adjacent rate has better measured throughput ||
* c) lower adjacent rate has worse throughput, and higher is unmeasured
*
* As a sanity check, if increase was determined above, leave rate
* unchanged if:
* a) success ratio at current rate < 70%. This is not particularly
* good performance; higher rate is sure to have poorer success.
*
* 6) Re-evaluate the rate after each tx frame. If working with block-
* acknowledge, history and statistics may be calculated for the entire
* block (including prior history that fits within the history windows),
* before re-evaluation.
*
* FINDING BEST STARTING MODULATION MODE:
*
* After working with a modulation mode for a "while" (and doing rate scaling),
* the driver searches for a new initial mode in an attempt to improve
* throughput. The "while" is measured by numbers of attempted frames:
*
* For legacy mode, search for new mode after:
* 480 successful frames, or 160 failed frames
* For high-throughput modes (SISO or MIMO), search for new mode after:
* 4500 successful frames, or 400 failed frames
*
* Mode switch possibilities are (3 for each mode):
*
* For legacy:
* Change antenna, try SISO (if HT association), try MIMO (if HT association)
* For SISO:
* Change antenna, try MIMO, try shortened guard interval (SGI)
* For MIMO:
* Try SISO antenna A, SISO antenna B, try shortened guard interval (SGI)
*
* When trying a new mode, use the same bit rate as the old/current mode when
* trying antenna switches and shortened guard interval. When switching to
* SISO from MIMO or legacy, or to MIMO from SISO or legacy, use a rate
* for which the expected throughput (under perfect conditions) is about the
* same or slightly better than the actual measured throughput delivered by
* the old/current mode.
*
* Actual throughput can be estimated by multiplying the expected throughput
* by the success ratio (successful / attempted tx frames). Frame size is
* not considered in this calculation; it assumes that frame size will average
* out to be fairly consistent over several samples. The following are
* metric values for expected throughput assuming 100% success ratio.
* Only G band has support for CCK rates:
*
* RATE: 1 2 5 11 6 9 12 18 24 36 48 54 60
*
* G: 7 13 35 58 40 57 72 98 121 154 177 186 186
* A: 0 0 0 0 40 57 72 98 121 154 177 186 186
* SISO 20MHz: 0 0 0 0 42 42 76 102 124 159 183 193 202
* SGI SISO 20MHz: 0 0 0 0 46 46 82 110 132 168 192 202 211
* MIMO 20MHz: 0 0 0 0 74 74 123 155 179 214 236 244 251
* SGI MIMO 20MHz: 0 0 0 0 81 81 131 164 188 222 243 251 257
* SISO 40MHz: 0 0 0 0 77 77 127 160 184 220 242 250 257
* SGI SISO 40MHz: 0 0 0 0 83 83 135 169 193 229 250 257 264
* MIMO 40MHz: 0 0 0 0 123 123 182 214 235 264 279 285 289
* SGI MIMO 40MHz: 0 0 0 0 131 131 191 222 242 270 284 289 293
*
* After the new mode has been tried for a short while (minimum of 6 failed
* frames or 8 successful frames), compare success ratio and actual throughput
* estimate of the new mode with the old. If either is better with the new
* mode, continue to use the new mode.
*
* Continue comparing modes until all 3 possibilities have been tried.
* If moving from legacy to HT, try all 3 possibilities from the new HT
* mode. After trying all 3, a best mode is found. Continue to use this mode
* for the longer "while" described above (e.g. 480 successful frames for
* legacy), and then repeat the search process.
*
*/
struct iwl4965_link_quality_cmd {
/* Index of destination/recipient station in uCode's station table */
u8 sta_id;
u8 reserved1;
__le16 control;
__le16 control; /* not used */
struct iwl4965_link_qual_general_params general_params;
struct iwl4965_link_qual_agg_params agg_params;
/*
* Rate info; when using rate-scaling, Tx command's initial_rate_index
* specifies 1st Tx rate attempted, via index into this table.
* 4965 works its way through table when retrying Tx.
*/
struct {
__le32 rate_n_flags;
__le32 rate_n_flags; /* RATE_MCS_*, IWL_RATE_* */
} rs_table[LINK_QUAL_MAX_RETRY_NUM];
__le32 reserved2;
} __attribute__ ((packed));