1/****************************************************************************** 2 * 3 * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17 * 18 * The full GNU General Public License is included in this distribution in the 19 * file called LICENSE. 20 * 21 * Contact Information: 22 * James P. Ketrenos <ipw2100-admin@linux.intel.com> 23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 24 * 25 *****************************************************************************/ 26#ifndef __iwl_channel_h__ 27#define __iwl_channel_h__ 28 29#define IWL_NUM_SCAN_RATES (2) 30 31struct iwl_channel_tgd_info { 32 u8 type; 33 s8 max_power; 34}; 35 36struct iwl_channel_tgh_info { 37 s64 last_radar_time; 38}; 39 40/* current Tx power values to use, one for each rate for each channel. 41 * requested power is limited by: 42 * -- regulatory EEPROM limits for this channel 43 * -- hardware capabilities (clip-powers) 44 * -- spectrum management 45 * -- user preference (e.g. iwconfig) 46 * when requested power is set, base power index must also be set. */ 47struct iwl_channel_power_info { 48 struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ 49 s8 power_table_index; /* actual (compenst'd) index into gain table */ 50 s8 base_power_index; /* gain index for power at factory temp. */ 51 s8 requested_power; /* power (dBm) requested for this chnl/rate */ 52}; 53 54/* current scan Tx power values to use, one for each scan rate for each 55 * channel. */ 56struct iwl_scan_power_info { 57 struct iwl_tx_power tpc; /* actual radio and DSP gain settings */ 58 s8 power_table_index; /* actual (compenst'd) index into gain table */ 59 s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ 60}; 61 62/* Channel unlock period is 15 seconds. If no beacon or probe response 63 * has been received within 15 seconds on a locked channel then the channel 64 * remains locked. */ 65#define TX_UNLOCK_PERIOD 15 66 67/* CSA lock period is 15 seconds. If a CSA has been received on a channel in 68 * the last 15 seconds, the channel is locked */ 69#define CSA_LOCK_PERIOD 15 70/* 71 * One for each channel, holds all channel setup data 72 * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant 73 * with one another! 74 */ 75#define IWL4965_MAX_RATE (33) 76 77struct iwl_channel_info { 78 struct iwl_channel_tgd_info tgd; 79 struct iwl_channel_tgh_info tgh; 80 struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */ 81 struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for 82 * FAT channel */ 83 84 u8 channel; /* channel number */ 85 u8 flags; /* flags copied from EEPROM */ 86 s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ 87 s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ 88 s8 min_power; /* always 0 */ 89 s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ 90 91 u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */ 92 u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */ 93 u8 phymode; /* MODE_IEEE80211{A,B,G} */ 94 95 /* Radio/DSP gain settings for each "normal" data Tx rate. 96 * These include, in addition to RF and DSP gain, a few fields for 97 * remembering/modifying gain settings (indexes). */ 98 struct iwl_channel_power_info power_info[IWL4965_MAX_RATE]; 99 100#if IWL == 4965 101 /* FAT channel info */ 102 s8 fat_max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ 103 s8 fat_curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ 104 s8 fat_min_power; /* always 0 */ 105 s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */ 106 u8 fat_flags; /* flags copied from EEPROM */ 107 u8 fat_extension_channel; 108#endif 109 110 /* Radio/DSP gain settings for each scan rate, for directed scans. */ 111 struct iwl_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES]; 112}; 113 114struct iwl_clip_group { 115 /* maximum power level to prevent clipping for each rate, derived by 116 * us from this band's saturation power in EEPROM */ 117 const s8 clip_powers[IWL_MAX_RATES]; 118}; 119 120static inline int is_channel_valid(const struct iwl_channel_info *ch_info) 121{ 122 if (ch_info == NULL) 123 return 0; 124 return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; 125} 126 127static inline int is_channel_narrow(const struct iwl_channel_info *ch_info) 128{ 129 return (ch_info->flags & EEPROM_CHANNEL_NARROW) ? 1 : 0; 130} 131 132static inline int is_channel_radar(const struct iwl_channel_info *ch_info) 133{ 134 return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; 135} 136 137static inline u8 is_channel_a_band(const struct iwl_channel_info *ch_info) 138{ 139 return ch_info->phymode == MODE_IEEE80211A; 140} 141 142static inline u8 is_channel_bg_band(const struct iwl_channel_info *ch_info) 143{ 144 return ((ch_info->phymode == MODE_IEEE80211B) || 145 (ch_info->phymode == MODE_IEEE80211G)); 146} 147 148static inline int is_channel_passive(const struct iwl_channel_info *ch) 149{ 150 return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; 151} 152 153static inline int is_channel_ibss(const struct iwl_channel_info *ch) 154{ 155 return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0; 156} 157 158extern const struct iwl_channel_info *iwl_get_channel_info( 159 const struct iwl_priv *priv, int phymode, u16 channel); 160 161#endif 162