|  | /****************************************************************************** | 
|  | * | 
|  | * Copyright(c) 2005 - 2008 Intel Corporation. All rights reserved. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify it | 
|  | * under the terms of version 2 of the GNU General Public License as | 
|  | * published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, but WITHOUT | 
|  | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | * more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License along with | 
|  | * this program; if not, write to the Free Software Foundation, Inc., | 
|  | * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA | 
|  | * | 
|  | * The full GNU General Public License is included in this distribution in the | 
|  | * file called LICENSE. | 
|  | * | 
|  | * Contact Information: | 
|  | * James P. Ketrenos <ipw2100-admin@linux.intel.com> | 
|  | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | 
|  | * | 
|  | *****************************************************************************/ | 
|  |  | 
|  | #ifndef __iwl_3945_rs_h__ | 
|  | #define __iwl_3945_rs_h__ | 
|  |  | 
|  | struct iwl3945_rate_info { | 
|  | u8 plcp;		/* uCode API:  IWL_RATE_6M_PLCP, etc. */ | 
|  | u8 ieee;		/* MAC header:  IWL_RATE_6M_IEEE, etc. */ | 
|  | u8 prev_ieee;		/* previous rate in IEEE speeds */ | 
|  | u8 next_ieee;		/* next rate in IEEE speeds */ | 
|  | u8 prev_rs;		/* previous rate used in rs algo */ | 
|  | u8 next_rs;		/* next rate used in rs algo */ | 
|  | u8 prev_rs_tgg;		/* previous rate used in TGG rs algo */ | 
|  | u8 next_rs_tgg;		/* next rate used in TGG rs algo */ | 
|  | u8 table_rs_index;	/* index in rate scale table cmd */ | 
|  | u8 prev_table_rs;	/* prev in rate table cmd */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * These serve as indexes into | 
|  | * struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT]; | 
|  | */ | 
|  | enum { | 
|  | IWL_RATE_1M_INDEX = 0, | 
|  | IWL_RATE_2M_INDEX, | 
|  | IWL_RATE_5M_INDEX, | 
|  | IWL_RATE_11M_INDEX, | 
|  | IWL_RATE_6M_INDEX, | 
|  | IWL_RATE_9M_INDEX, | 
|  | IWL_RATE_12M_INDEX, | 
|  | IWL_RATE_18M_INDEX, | 
|  | IWL_RATE_24M_INDEX, | 
|  | IWL_RATE_36M_INDEX, | 
|  | IWL_RATE_48M_INDEX, | 
|  | IWL_RATE_54M_INDEX, | 
|  | IWL_RATE_COUNT, | 
|  | IWL_RATE_INVM_INDEX, | 
|  | IWL_RATE_INVALID = IWL_RATE_INVM_INDEX | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | IWL_RATE_6M_INDEX_TABLE = 0, | 
|  | IWL_RATE_9M_INDEX_TABLE, | 
|  | IWL_RATE_12M_INDEX_TABLE, | 
|  | IWL_RATE_18M_INDEX_TABLE, | 
|  | IWL_RATE_24M_INDEX_TABLE, | 
|  | IWL_RATE_36M_INDEX_TABLE, | 
|  | IWL_RATE_48M_INDEX_TABLE, | 
|  | IWL_RATE_54M_INDEX_TABLE, | 
|  | IWL_RATE_1M_INDEX_TABLE, | 
|  | IWL_RATE_2M_INDEX_TABLE, | 
|  | IWL_RATE_5M_INDEX_TABLE, | 
|  | IWL_RATE_11M_INDEX_TABLE, | 
|  | IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX, | 
|  | }; | 
|  |  | 
|  | enum { | 
|  | IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX, | 
|  | IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX, | 
|  | IWL_FIRST_CCK_RATE = IWL_RATE_1M_INDEX, | 
|  | IWL_LAST_CCK_RATE = IWL_RATE_11M_INDEX, | 
|  | }; | 
|  |  | 
|  | /* #define vs. enum to keep from defaulting to 'large integer' */ | 
|  | #define	IWL_RATE_6M_MASK   (1 << IWL_RATE_6M_INDEX) | 
|  | #define	IWL_RATE_9M_MASK   (1 << IWL_RATE_9M_INDEX) | 
|  | #define	IWL_RATE_12M_MASK  (1 << IWL_RATE_12M_INDEX) | 
|  | #define	IWL_RATE_18M_MASK  (1 << IWL_RATE_18M_INDEX) | 
|  | #define	IWL_RATE_24M_MASK  (1 << IWL_RATE_24M_INDEX) | 
|  | #define	IWL_RATE_36M_MASK  (1 << IWL_RATE_36M_INDEX) | 
|  | #define	IWL_RATE_48M_MASK  (1 << IWL_RATE_48M_INDEX) | 
|  | #define	IWL_RATE_54M_MASK  (1 << IWL_RATE_54M_INDEX) | 
|  | #define	IWL_RATE_1M_MASK   (1 << IWL_RATE_1M_INDEX) | 
|  | #define	IWL_RATE_2M_MASK   (1 << IWL_RATE_2M_INDEX) | 
|  | #define	IWL_RATE_5M_MASK   (1 << IWL_RATE_5M_INDEX) | 
|  | #define	IWL_RATE_11M_MASK  (1 << IWL_RATE_11M_INDEX) | 
|  |  | 
|  | /* 3945 uCode API values for (legacy) bit rates, both OFDM and CCK */ | 
|  | enum { | 
|  | IWL_RATE_6M_PLCP = 13, | 
|  | IWL_RATE_9M_PLCP = 15, | 
|  | IWL_RATE_12M_PLCP = 5, | 
|  | IWL_RATE_18M_PLCP = 7, | 
|  | IWL_RATE_24M_PLCP = 9, | 
|  | IWL_RATE_36M_PLCP = 11, | 
|  | IWL_RATE_48M_PLCP = 1, | 
|  | IWL_RATE_54M_PLCP = 3, | 
|  | IWL_RATE_1M_PLCP = 10, | 
|  | IWL_RATE_2M_PLCP = 20, | 
|  | IWL_RATE_5M_PLCP = 55, | 
|  | IWL_RATE_11M_PLCP = 110, | 
|  | }; | 
|  |  | 
|  | /* MAC header values for bit rates */ | 
|  | enum { | 
|  | IWL_RATE_6M_IEEE = 12, | 
|  | IWL_RATE_9M_IEEE = 18, | 
|  | IWL_RATE_12M_IEEE = 24, | 
|  | IWL_RATE_18M_IEEE = 36, | 
|  | IWL_RATE_24M_IEEE = 48, | 
|  | IWL_RATE_36M_IEEE = 72, | 
|  | IWL_RATE_48M_IEEE = 96, | 
|  | IWL_RATE_54M_IEEE = 108, | 
|  | IWL_RATE_1M_IEEE = 2, | 
|  | IWL_RATE_2M_IEEE = 4, | 
|  | IWL_RATE_5M_IEEE = 11, | 
|  | IWL_RATE_11M_IEEE = 22, | 
|  | }; | 
|  |  | 
|  | #define IWL_CCK_BASIC_RATES_MASK    \ | 
|  | (IWL_RATE_1M_MASK          | \ | 
|  | IWL_RATE_2M_MASK) | 
|  |  | 
|  | #define IWL_CCK_RATES_MASK          \ | 
|  | (IWL_BASIC_RATES_MASK      | \ | 
|  | IWL_RATE_5M_MASK          | \ | 
|  | IWL_RATE_11M_MASK) | 
|  |  | 
|  | #define IWL_OFDM_BASIC_RATES_MASK   \ | 
|  | (IWL_RATE_6M_MASK         | \ | 
|  | IWL_RATE_12M_MASK         | \ | 
|  | IWL_RATE_24M_MASK) | 
|  |  | 
|  | #define IWL_OFDM_RATES_MASK         \ | 
|  | (IWL_OFDM_BASIC_RATES_MASK | \ | 
|  | IWL_RATE_9M_MASK          | \ | 
|  | IWL_RATE_18M_MASK         | \ | 
|  | IWL_RATE_36M_MASK         | \ | 
|  | IWL_RATE_48M_MASK         | \ | 
|  | IWL_RATE_54M_MASK) | 
|  |  | 
|  | #define IWL_BASIC_RATES_MASK         \ | 
|  | (IWL_OFDM_BASIC_RATES_MASK | \ | 
|  | IWL_CCK_BASIC_RATES_MASK) | 
|  |  | 
|  | #define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1) | 
|  |  | 
|  | #define IWL_INV_TPT    -1 | 
|  |  | 
|  | #define IWL_MIN_RSSI_VAL                 -100 | 
|  | #define IWL_MAX_RSSI_VAL                    0 | 
|  |  | 
|  | extern const struct iwl3945_rate_info iwl3945_rates[IWL_RATE_COUNT]; | 
|  |  | 
|  | static inline u8 iwl3945_get_prev_ieee_rate(u8 rate_index) | 
|  | { | 
|  | u8 rate = iwl3945_rates[rate_index].prev_ieee; | 
|  |  | 
|  | if (rate == IWL_RATE_INVALID) | 
|  | rate = rate_index; | 
|  | return rate; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * iwl3945_fill_rs_info - Fill an output text buffer with the rate representation | 
|  | * | 
|  | * NOTE:  This is provided as a quick mechanism for a user to visualize | 
|  | * the performance of the rate control algorithm and is not meant to be | 
|  | * parsed software. | 
|  | */ | 
|  | extern int iwl3945_fill_rs_info(struct ieee80211_hw *, char *buf, u8 sta_id); | 
|  |  | 
|  | /** | 
|  | * iwl3945_rate_scale_init - Initialize the rate scale table based on assoc info | 
|  | * | 
|  | * The specific throughput table used is based on the type of network | 
|  | * the associated with, including A, B, G, and G w/ TGG protection | 
|  | */ | 
|  | extern void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id); | 
|  |  | 
|  | /** | 
|  | * iwl3945_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 | 
|  | * iwl3945_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 | 
|  | * | 
|  | */ | 
|  | extern int iwl3945_rate_control_register(void); | 
|  |  | 
|  | /** | 
|  | * iwl3945_rate_control_unregister - Unregister the rate control callbacks | 
|  | * | 
|  | * This should be called after calling ieee80211_unregister_hw, but before | 
|  | * the driver is unloaded. | 
|  | */ | 
|  | extern void iwl3945_rate_control_unregister(void); | 
|  |  | 
|  | #endif |