/** * struct iwl_lq_sta_rs_fw - rate and related statistics for RS in FW * @last_rate_n_flags: last rate reported by FW * @pers: persistent fields * @pers.sta_id: the id of the station * @pers.chains: bitmask of chains reported in %chain_signal * @pers.chain_signal: per chain signal strength * @pers.last_rssi: last rssi reported * @pers.drv: pointer back to the driver data
*/ struct iwl_lq_sta_rs_fw { /* last tx rate_n_flags */
u32 last_rate_n_flags;
/* persistent fields - initialized only once - keep last! */ struct lq_sta_pers_rs_fw {
u32 sta_id; #ifdef CONFIG_MAC80211_DEBUGFS /** * @pers.dbg_fixed_rate: for debug, use fixed rate if not 0
*/
u32 dbg_fixed_rate; /** * @pers.dbg_agg_frame_count_lim: for debug, max number of * frames in A-MPDU
*/
u16 dbg_agg_frame_count_lim; #endif
u8 chains;
s8 chain_signal[IEEE80211_MAX_CHAINS];
s8 last_rssi; struct iwl_mvm *drv;
} pers;
};
/* * struct iwl_rate_scale_data -- tx success history for one rate
*/ struct iwl_rate_scale_data {
u64 data; /* bitmap of successful frames */
s32 success_counter; /* number of frames successful */
s32 success_ratio; /* per-cent * 128 */
s32 counter; /* number of frames attempted */
s32 average_tpt; /* success ratio * expected throughput */
};
/* Possible Tx columns * Tx Column = a combo of legacy/siso/mimo x antenna x SGI
*/ enum rs_column {
RS_COLUMN_LEGACY_ANT_A = 0,
RS_COLUMN_LEGACY_ANT_B,
RS_COLUMN_SISO_ANT_A,
RS_COLUMN_SISO_ANT_B,
RS_COLUMN_SISO_ANT_A_SGI,
RS_COLUMN_SISO_ANT_B_SGI,
RS_COLUMN_MIMO2,
RS_COLUMN_MIMO2_SGI,
/* * struct iwl_scale_tbl_info -- tx params and success history for all rates * * There are two of these in struct iwl_lq_sta, * one for "active", and one for "search".
*/ struct iwl_scale_tbl_info { struct rs_rate rate; enum rs_column column; const u16 *expected_tpt; /* throughput metrics; expected_tpt_G, etc. */ struct iwl_rate_scale_data win[IWL_RATE_COUNT]; /* rate histories */ /* per txpower-reduction history */ struct iwl_rate_scale_data tpc_win[TPC_MAX_REDUCTION + 1];
};
/* * struct iwl_lq_sta -- driver's rate scaling private structure * * Pointer to this gets passed back and forth between driver and mac80211.
*/ struct iwl_lq_sta {
u8 active_tbl; /* index of active table, range 0-1 */
u8 rs_state; /* RS_STATE_* */
u8 search_better_tbl; /* 1: currently trying alternate mode */
s32 last_tpt;
/* The following determine when to search for a new mode */
u32 table_count_limit;
u32 max_failure_limit; /* # failed frames before new search */
u32 max_success_limit; /* # successful frames before new search */
u32 table_count;
u32 total_failed; /* total failed frames, any/all rates */
u32 total_success; /* total successful frames, any/all rates */
u64 flush_timer; /* time staying in mode before new search */
u32 visited_columns; /* Bitmask marking which Tx columns were * explored during a search cycle
*/
u64 last_tx; bool is_vht; bool ldpc; /* LDPC Rx is supported by the STA */ bool stbc_capable; /* Tx STBC is supported by chip and Rx by STA */ bool bfer_capable; /* Remote supports beamformee and we BFer */
enum nl80211_band band;
/* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ unsignedlong active_legacy_rate; unsignedlong active_siso_rate; unsignedlong active_mimo2_rate;
/* Optimal rate based on RSSI and STA caps. * Used only to reflect link speed to userspace.
*/ struct rs_rate optimal_rate; unsignedlong optimal_rate_mask; conststruct rs_init_rate_info *optimal_rates; int optimal_nentries;
/* packets destined for this STA are aggregated */
u8 is_agg;
/* tx power reduce for this sta */ int tpc_reduce;
/* persistent fields - initialized only once - keep last! */ struct lq_sta_pers { #ifdef CONFIG_MAC80211_DEBUGFS
u32 dbg_fixed_rate;
u8 dbg_fixed_txp_reduction;
/* force STBC/BFER/SISO for testing */ enum rs_ss_force_opt ss_force; #endif
u8 chains;
s8 chain_signal[IEEE80211_MAX_CHAINS];
s8 last_rssi;
u16 max_agg_bufsize; struct rs_rate_stats tx_stats[RS_COLUMN_COUNT][IWL_RATE_COUNT]; struct iwl_mvm *drv;
spinlock_t lock; /* for races in reinit/update table */
} pers;
};
/* ieee80211_tx_info's status_driver_data[0] is packed with lq color and txp * Note, it's iwlmvm <-> mac80211 interface. * bits 0-7: reduced tx power * bits 8-10: LQ command's color
*/ #define RS_DRV_DATA_TXP_MSK 0xff #define RS_DRV_DATA_LQ_COLOR_POS 8 #define RS_DRV_DATA_LQ_COLOR_MSK (7 << RS_DRV_DATA_LQ_COLOR_POS) #define RS_DRV_DATA_LQ_COLOR_GET(_f) (((_f) & RS_DRV_DATA_LQ_COLOR_MSK) >>\
RS_DRV_DATA_LQ_COLOR_POS) #define RS_DRV_DATA_PACK(_c, _p) ((void *)(uintptr_t)\
(((uintptr_t)_p) |\
((_c) << RS_DRV_DATA_LQ_COLOR_POS)))
/* Initialize station's rate scaling information after adding station */ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif, struct ieee80211_sta *sta, struct ieee80211_bss_conf *link_conf, struct ieee80211_link_sta *link_sta, enum nl80211_band band);
/* Notify RS about Tx status */ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, int tid, struct ieee80211_tx_info *info, bool ndp);
/** * iwl_mvm_rate_control_register - Register the rate control algorithm callbacks * * Since the rate control algorithm is hardware specific, there is no need * or reason to place it as a stand alone module. The driver can call * iwl_rate_control_register in order to register the rate control callbacks * with the mac80211 subsystem. This should be performed prior to calling * ieee80211_register_hw * * Return: negative error code, or 0 on success
*/ int iwl_mvm_rate_control_register(void);
/** * iwl_mvm_rate_control_unregister - Unregister the rate control callbacks * * This should be called after calling ieee80211_unregister_hw, but before * the driver is unloaded.
*/ void iwl_mvm_rate_control_unregister(void);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.