2008-03-04 18:09:30 -08:00
/******************************************************************************
*
* This file is provided under a dual BSD / GPLv2 license . When using or
* redistributing this file , you may do so under either license .
*
* GPL LICENSE SUMMARY
*
2009-01-08 10:20:02 -08:00
* Copyright ( c ) 2008 - 2009 Intel Corporation . All rights reserved .
2008-03-04 18:09:30 -08:00
*
* 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 . GPL .
*
* Contact Information :
2008-12-09 11:28:58 -08:00
* Intel Linux Wireless < ilw @ linux . intel . com >
2008-03-04 18:09:30 -08:00
* Intel Corporation , 5200 N . E . Elam Young Parkway , Hillsboro , OR 97124 - 6497
*
* BSD LICENSE
*
2009-01-08 10:20:02 -08:00
* Copyright ( c ) 2005 - 2009 Intel Corporation . All rights reserved .
2008-03-04 18:09:30 -08:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
*
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in
* the documentation and / or other materials provided with the
* distribution .
* * Neither the name Intel Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* " AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
* SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
* LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# ifndef __iwl_core_h__
# define __iwl_core_h__
2008-03-21 13:53:44 -07:00
/************************
* forward declarations *
* * * * * * * * * * * * * * * * * * * * * * * */
struct iwl_host_cmd ;
struct iwl_cmd ;
2008-07-11 11:53:38 +08:00
# define IWLWIFI_VERSION "1.3.27k"
2009-01-08 10:20:02 -08:00
# define DRV_COPYRIGHT "Copyright(c) 2003-2009 Intel Corporation"
2008-12-11 10:33:41 -08:00
# define DRV_AUTHOR "<ilw@linux.intel.com>"
2008-03-06 10:40:19 -08:00
2008-03-04 18:09:30 -08:00
# define IWL_PCI_DEVICE(dev, subdev, cfg) \
. vendor = PCI_VENDOR_ID_INTEL , . device = ( dev ) , \
. subvendor = PCI_ANY_ID , . subdevice = ( subdev ) , \
. driver_data = ( kernel_ulong_t ) & ( cfg )
# define IWL_SKU_G 0x1
# define IWL_SKU_A 0x2
# define IWL_SKU_N 0x8
2009-04-08 11:26:39 -07:00
struct iwl_station_mgmt_ops {
u8 ( * add_station ) ( struct iwl_priv * priv , const u8 * addr ,
2009-04-08 11:26:42 -07:00
int is_ap , u8 flags , struct ieee80211_sta_ht_cap * ht_info ) ;
2009-04-08 11:26:39 -07:00
int ( * remove_station ) ( struct iwl_priv * priv , const u8 * addr ,
int is_ap ) ;
u8 ( * find_station ) ( struct iwl_priv * priv , const u8 * addr ) ;
void ( * clear_station_table ) ( struct iwl_priv * priv ) ;
} ;
2008-04-15 16:01:42 -07:00
struct iwl_hcmd_ops {
2008-04-15 16:01:43 -07:00
int ( * rxon_assoc ) ( struct iwl_priv * priv ) ;
2009-04-08 11:26:37 -07:00
int ( * commit_rxon ) ( struct iwl_priv * priv ) ;
2009-04-08 11:26:44 -07:00
void ( * set_rxon_chain ) ( struct iwl_priv * priv ) ;
2008-04-15 16:01:42 -07:00
} ;
2009-04-08 11:26:39 -07:00
2008-03-21 13:53:44 -07:00
struct iwl_hcmd_utils_ops {
2008-05-15 13:53:59 +08:00
u16 ( * get_hcmd_size ) ( u8 cmd_id , u16 len ) ;
2008-05-05 10:22:34 +08:00
u16 ( * build_addsta_hcmd ) ( const struct iwl_addsta_cmd * cmd , u8 * data ) ;
2008-04-16 16:34:47 -07:00
void ( * gain_computation ) ( struct iwl_priv * priv ,
u32 * average_noise ,
u16 min_average_noise_antennat_i ,
u32 min_average_noise ) ;
void ( * chain_noise_reset ) ( struct iwl_priv * priv ) ;
2008-07-11 11:53:31 +08:00
void ( * rts_tx_cmd_flag ) ( struct ieee80211_tx_info * info ,
__le32 * tx_flags ) ;
2008-08-04 16:00:42 +08:00
int ( * calc_rssi ) ( struct iwl_priv * priv ,
struct iwl_rx_phy_res * rx_resp ) ;
2008-03-21 13:53:44 -07:00
} ;
2008-03-11 16:17:18 -07:00
struct iwl_lib_ops {
2008-10-23 23:48:56 -07:00
/* set hw dependent parameters */
2008-04-15 16:01:38 -07:00
int ( * set_hw_params ) ( struct iwl_priv * priv ) ;
2008-05-29 16:35:16 +08:00
/* Handling TX */
2008-04-14 21:16:10 -07:00
void ( * txq_update_byte_cnt_tbl ) ( struct iwl_priv * priv ,
2008-05-05 10:22:50 +08:00
struct iwl_tx_queue * txq ,
2008-04-14 21:16:10 -07:00
u16 byte_cnt ) ;
2008-05-29 16:35:13 +08:00
void ( * txq_inval_byte_cnt_tbl ) ( struct iwl_priv * priv ,
struct iwl_tx_queue * txq ) ;
void ( * txq_set_sched ) ( struct iwl_priv * priv , u32 mask ) ;
2009-01-19 15:30:26 -08:00
int ( * txq_attach_buf_to_tfd ) ( struct iwl_priv * priv ,
struct iwl_tx_queue * txq ,
dma_addr_t addr ,
u16 len , u8 reset , u8 pad ) ;
void ( * txq_free_tfd ) ( struct iwl_priv * priv ,
struct iwl_tx_queue * txq ) ;
2009-01-23 13:45:14 -08:00
int ( * txq_init ) ( struct iwl_priv * priv ,
struct iwl_tx_queue * txq ) ;
2008-05-29 16:35:16 +08:00
/* aggregations */
int ( * txq_agg_enable ) ( struct iwl_priv * priv , int txq_id , int tx_fifo ,
int sta_id , int tid , u16 ssn_idx ) ;
int ( * txq_agg_disable ) ( struct iwl_priv * priv , u16 txq_id , u16 ssn_idx ,
u8 tx_fifo ) ;
2008-04-24 11:55:20 -07:00
/* setup Rx handler */
void ( * rx_handler_setup ) ( struct iwl_priv * priv ) ;
2008-06-12 09:46:53 +08:00
/* setup deferred work */
void ( * setup_deferred_work ) ( struct iwl_priv * priv ) ;
/* cancel deferred work */
void ( * cancel_deferred_work ) ( struct iwl_priv * priv ) ;
2008-05-05 10:22:45 +08:00
/* alive notification after init uCode load */
void ( * init_alive_start ) ( struct iwl_priv * priv ) ;
2008-04-14 21:16:03 -07:00
/* alive notification */
int ( * alive_notify ) ( struct iwl_priv * priv ) ;
/* check validity of rtc data address */
int ( * is_valid_rtc_data_addr ) ( u32 addr ) ;
/* 1st ucode load */
int ( * load_ucode ) ( struct iwl_priv * priv ) ;
2008-04-23 17:14:53 -07:00
/* power management */
2008-04-16 16:34:49 -07:00
struct {
2008-04-23 17:14:53 -07:00
int ( * init ) ( struct iwl_priv * priv ) ;
2008-05-29 16:34:57 +08:00
int ( * reset ) ( struct iwl_priv * priv ) ;
2008-05-29 16:34:58 +08:00
void ( * stop ) ( struct iwl_priv * priv ) ;
2008-04-24 11:55:22 -07:00
void ( * config ) ( struct iwl_priv * priv ) ;
2008-04-16 16:34:49 -07:00
int ( * set_pwr_src ) ( struct iwl_priv * priv , enum iwl_pwr_src src ) ;
} apm_ops ;
2008-04-21 15:41:51 -07:00
/* power */
2008-06-12 09:47:08 +08:00
int ( * send_tx_power ) ( struct iwl_priv * priv ) ;
2008-04-21 15:41:51 -07:00
void ( * update_chain_flags ) ( struct iwl_priv * priv ) ;
2008-06-30 17:23:31 +08:00
void ( * temperature ) ( struct iwl_priv * priv ) ;
2009-04-08 11:26:35 -07:00
void ( * post_associate ) ( struct iwl_priv * priv ) ;
2008-03-11 16:17:18 -07:00
/* eeprom operations (as defined in iwl-eeprom.h) */
struct iwl_eeprom_ops eeprom_ops ;
} ;
struct iwl_ops {
const struct iwl_lib_ops * lib ;
2008-04-15 16:01:42 -07:00
const struct iwl_hcmd_ops * hcmd ;
2008-03-21 13:53:44 -07:00
const struct iwl_hcmd_utils_ops * utils ;
2009-04-08 11:26:39 -07:00
const struct iwl_station_mgmt_ops * smgmt ;
2008-03-11 16:17:18 -07:00
} ;
2008-03-14 10:38:47 -07:00
struct iwl_mod_params {
int disable ; /* def: 0 = enable radio */
2008-04-15 16:01:47 -07:00
int sw_crypto ; /* def: 0 = using hardware encryption */
2008-12-17 16:52:30 +08:00
u32 debug ; /* def: 0 = minimal debug log messages */
2008-03-14 10:38:47 -07:00
int disable_hw_scan ; /* def: 0 = use h/w scan */
int num_of_queues ; /* def: HW dependent */
2008-07-11 11:53:35 +08:00
int num_of_ampdu_queues ; /* def: HW dependent */
2008-06-30 17:23:21 +08:00
int disable_11n ; /* def: 0 = disable 11n capabilities */
2008-03-14 10:38:47 -07:00
int amsdu_size_8K ; /* def: 1 = enable 8K amsdu size */
int antenna ; /* def: 0 = both antennas (use diversity) */
2008-05-06 11:05:14 +08:00
int restart_fw ; /* def: 1 = restart firmware */
2008-03-14 10:38:47 -07:00
} ;
2008-12-02 12:14:06 -08:00
/**
* struct iwl_cfg
* @ fw_name_pre : Firmware filename prefix . The api version and extension
* ( . ucode ) will be added to filename before loading from disk . The
* filename is constructed as fw_name_pre < api > . ucode .
* @ ucode_api_max : Highest version of uCode API supported by driver .
* @ ucode_api_min : Lowest version of uCode API supported by driver .
*
* We enable the driver to be backward compatible wrt API version . The
* driver specifies which APIs it supports ( with @ ucode_api_max being the
* highest and @ ucode_api_min the lowest ) . Firmware will only be loaded if
* it has a supported API version . The firmware ' s API version will be
* stored in @ iwl_priv , enabling the driver to make runtime changes based
* on firmware version used .
*
* For example ,
* if ( IWL_UCODE_API ( priv - > ucode_ver ) > = 2 ) {
* Driver interacts with Firmware API version > = 2.
* } else {
* Driver interacts with Firmware API version 1.
* }
*
* The ideal usage of this infrastructure is to treat a new ucode API
* release as a new hardware revision . That is , through utilizing the
* iwl_hcmd_utils_ops etc . we accommodate different command structures
* and flows between hardware versions ( 4965 / 5000 ) as well as their API
* versions .
*/
2008-03-04 18:09:30 -08:00
struct iwl_cfg {
const char * name ;
2008-12-02 12:14:06 -08:00
const char * fw_name_pre ;
const unsigned int ucode_api_max ;
const unsigned int ucode_api_min ;
2008-03-04 18:09:30 -08:00
unsigned int sku ;
2008-04-21 15:41:52 -07:00
int eeprom_size ;
2008-10-23 23:48:51 -07:00
u16 eeprom_ver ;
u16 eeprom_calib_ver ;
2008-03-11 16:17:18 -07:00
const struct iwl_ops * ops ;
2008-03-14 10:38:47 -07:00
const struct iwl_mod_params * mod_params ;
2009-02-02 16:21:14 -08:00
u8 valid_tx_ant ;
u8 valid_rx_ant ;
2009-01-29 11:09:13 -08:00
bool need_pll_cfg ;
2008-03-04 18:09:30 -08:00
} ;
2008-03-14 10:38:48 -07:00
/***************************
* L i b *
* * * * * * * * * * * * * * * * * * * * * * * * * * */
struct ieee80211_hw * iwl_alloc_all ( struct iwl_cfg * cfg ,
struct ieee80211_ops * hw_ops ) ;
2008-04-23 17:14:54 -07:00
void iwl_hw_detect ( struct iwl_priv * priv ) ;
2008-04-23 17:15:05 -07:00
void iwl_reset_qos ( struct iwl_priv * priv ) ;
2009-02-27 16:21:24 -08:00
void iwl_activate_qos ( struct iwl_priv * priv , u8 force ) ;
2009-03-26 10:14:10 -07:00
int iwl_mac_conf_tx ( struct ieee80211_hw * hw , u16 queue ,
const struct ieee80211_tx_queue_params * params ) ;
2009-01-27 14:27:52 -08:00
void iwl_set_rxon_hwcrypto ( struct iwl_priv * priv , int hw_decrypt ) ;
int iwl_check_rxon_cmd ( struct iwl_priv * priv ) ;
int iwl_full_rxon_required ( struct iwl_priv * priv ) ;
2008-04-23 17:15:05 -07:00
void iwl_set_rxon_chain ( struct iwl_priv * priv ) ;
2008-09-03 11:26:26 +08:00
int iwl_set_rxon_channel ( struct iwl_priv * priv , struct ieee80211_channel * ch ) ;
2008-05-05 10:22:41 +08:00
void iwl_set_rxon_ht ( struct iwl_priv * priv , struct iwl_ht_info * ht_info ) ;
u8 iwl_is_fat_tx_allowed ( struct iwl_priv * priv ,
2008-10-09 12:13:49 +02:00
struct ieee80211_sta_ht_cap * sta_ht_inf ) ;
2009-01-27 14:27:52 -08:00
void iwl_set_flags_for_band ( struct iwl_priv * priv , enum ieee80211_band band ) ;
void iwl_connection_init_rx_config ( struct iwl_priv * priv , int mode ) ;
int iwl_set_decrypted_flag ( struct iwl_priv * priv ,
struct ieee80211_hdr * hdr ,
u32 decrypt_res ,
struct ieee80211_rx_status * stats ) ;
void iwl_irq_handle_error ( struct iwl_priv * priv ) ;
void iwl_configure_filter ( struct ieee80211_hw * hw ,
unsigned int changed_flags ,
unsigned int * total_flags ,
int mc_count , struct dev_addr_list * mc_list ) ;
2008-05-05 10:22:43 +08:00
int iwl_hw_nic_init ( struct iwl_priv * priv ) ;
2008-05-15 13:54:17 +08:00
int iwl_setup_mac ( struct iwl_priv * priv ) ;
2008-06-30 17:23:20 +08:00
int iwl_set_hw_params ( struct iwl_priv * priv ) ;
2008-05-15 13:54:17 +08:00
int iwl_init_drv ( struct iwl_priv * priv ) ;
void iwl_uninit_drv ( struct iwl_priv * priv ) ;
2009-04-08 11:26:35 -07:00
void iwl_post_associate ( struct iwl_priv * priv ) ;
void iwl_bss_info_changed ( struct ieee80211_hw * hw ,
struct ieee80211_vif * vif ,
struct ieee80211_bss_conf * bss_conf ,
u32 changes ) ;
2009-04-08 11:26:36 -07:00
int iwl_mac_beacon_update ( struct ieee80211_hw * hw , struct sk_buff * skb ) ;
2009-04-08 11:26:37 -07:00
int iwl_commit_rxon ( struct iwl_priv * priv ) ;
2009-04-08 11:26:45 -07:00
int iwl_set_mode ( struct iwl_priv * priv , int mode ) ;
2008-03-14 10:38:49 -07:00
2009-02-18 15:54:28 -08:00
/*****************************************************
* RX handlers .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void iwl_rx_pm_sleep_notif ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
void iwl_rx_pm_debug_statistics_notif ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
2009-02-18 15:54:29 -08:00
void iwl_rx_reply_error ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
2009-02-18 15:54:28 -08:00
2008-05-05 10:22:28 +08:00
/*****************************************************
* RX
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void iwl_rx_queue_free ( struct iwl_priv * priv , struct iwl_rx_queue * rxq ) ;
2009-03-17 21:51:49 -07:00
void iwl_cmd_queue_free ( struct iwl_priv * priv ) ;
2008-05-05 10:22:28 +08:00
int iwl_rx_queue_alloc ( struct iwl_priv * priv ) ;
void iwl_rx_handle ( struct iwl_priv * priv ) ;
int iwl_rx_queue_update_write_ptr ( struct iwl_priv * priv ,
struct iwl_rx_queue * q ) ;
void iwl_rx_queue_reset ( struct iwl_priv * priv , struct iwl_rx_queue * rxq ) ;
void iwl_rx_replenish ( struct iwl_priv * priv ) ;
2008-05-05 10:22:43 +08:00
int iwl_rx_init ( struct iwl_priv * priv , struct iwl_rx_queue * rxq ) ;
2008-05-05 10:22:28 +08:00
int iwl_rx_queue_restock ( struct iwl_priv * priv ) ;
int iwl_rx_queue_space ( const struct iwl_rx_queue * q ) ;
void iwl_rx_allocate ( struct iwl_priv * priv ) ;
2008-05-29 16:35:12 +08:00
void iwl_tx_cmd_complete ( struct iwl_priv * priv , struct iwl_rx_mem_buffer * rxb ) ;
int iwl_tx_queue_reclaim ( struct iwl_priv * priv , int txq_id , int index ) ;
2008-05-29 16:35:04 +08:00
/* Handlers */
void iwl_rx_missed_beacon_notif ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
2008-06-30 17:23:07 +08:00
void iwl_rx_statistics ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
2009-01-27 14:27:52 -08:00
void iwl_rx_csa ( struct iwl_priv * priv , struct iwl_rx_mem_buffer * rxb ) ;
2008-05-05 10:22:28 +08:00
2008-05-29 16:35:08 +08:00
/* TX helpers */
2008-05-05 10:22:43 +08:00
/*****************************************************
* TX
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int iwl_txq_ctx_reset ( struct iwl_priv * priv ) ;
2009-01-19 15:30:26 -08:00
void iwl_hw_txq_free_tfd ( struct iwl_priv * priv , struct iwl_tx_queue * txq ) ;
int iwl_hw_txq_attach_buf_to_tfd ( struct iwl_priv * priv ,
struct iwl_tx_queue * txq ,
dma_addr_t addr , u16 len , u8 reset , u8 pad ) ;
2008-05-15 12:55:29 +02:00
int iwl_tx_skb ( struct iwl_priv * priv , struct sk_buff * skb ) ;
2008-05-05 10:22:43 +08:00
void iwl_hw_txq_ctx_free ( struct iwl_priv * priv ) ;
2009-01-23 13:45:14 -08:00
int iwl_hw_tx_queue_init ( struct iwl_priv * priv ,
struct iwl_tx_queue * txq ) ;
2008-05-15 13:54:07 +08:00
int iwl_txq_update_write_ptr ( struct iwl_priv * priv , struct iwl_tx_queue * txq ) ;
2009-01-23 13:45:14 -08:00
int iwl_tx_queue_init ( struct iwl_priv * priv , struct iwl_tx_queue * txq ,
int slots_num , u32 txq_id ) ;
void iwl_tx_queue_free ( struct iwl_priv * priv , int txq_id ) ;
2008-05-29 16:35:16 +08:00
int iwl_tx_agg_start ( struct iwl_priv * priv , const u8 * ra , u16 tid , u16 * ssn ) ;
int iwl_tx_agg_stop ( struct iwl_priv * priv , const u8 * ra , u16 tid ) ;
int iwl_txq_check_empty ( struct iwl_priv * priv , int sta_id , u8 tid , int txq_id ) ;
2008-06-12 09:47:08 +08:00
/*****************************************************
* TX power
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int iwl_set_tx_power ( struct iwl_priv * priv , s8 tx_power , bool force ) ;
2008-06-13 15:44:55 +08:00
/*****************************************************
* RF - Kill - here and not in iwl - rfkill . h to be available when
* RF - kill subsystem is not compiled .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-01-21 18:27:54 +01:00
void iwl_bg_rf_kill ( struct work_struct * work ) ;
2008-06-13 15:44:55 +08:00
void iwl_radio_kill_sw_disable_radio ( struct iwl_priv * priv ) ;
int iwl_radio_kill_sw_enable_radio ( struct iwl_priv * priv ) ;
2008-06-12 09:47:11 +08:00
/*******************************************************************************
* Rate
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void iwl_hwrate_to_tx_control ( struct iwl_priv * priv , u32 rate_n_flags ,
struct ieee80211_tx_info * info ) ;
int iwl_hwrate_to_plcp_idx ( u32 rate_n_flags ) ;
2009-01-27 14:27:52 -08:00
u8 iwl_rate_get_lowest_plcp ( struct iwl_priv * priv ) ;
void iwl_set_rate ( struct iwl_priv * priv ) ;
2008-10-14 12:32:45 -07:00
u8 iwl_toggle_tx_ant ( struct iwl_priv * priv , u8 ant_idx ) ;
static inline u32 iwl_ant_idx_to_flags ( u8 ant_idx )
{
return BIT ( ant_idx ) < < RATE_MCS_ANT_POS ;
}
2008-06-12 09:47:11 +08:00
static inline u8 iwl_hw_get_rate ( __le32 rate_n_flags )
{
return le32_to_cpu ( rate_n_flags ) & 0xFF ;
}
static inline u32 iwl_hw_get_rate_n_flags ( __le32 rate_n_flags )
{
return le32_to_cpu ( rate_n_flags ) & 0x1FFFF ;
}
static inline __le32 iwl_hw_set_rate_n_flags ( u8 rate , u32 flags )
{
return cpu_to_le32 ( flags | ( u32 ) rate ) ;
}
2008-06-12 09:47:10 +08:00
/*******************************************************************************
* Scanning
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-06-12 09:47:12 +08:00
void iwl_init_scan_params ( struct iwl_priv * priv ) ;
2008-06-12 09:47:10 +08:00
int iwl_scan_cancel ( struct iwl_priv * priv ) ;
int iwl_scan_cancel_timeout ( struct iwl_priv * priv , unsigned long ms ) ;
int iwl_scan_initiate ( struct iwl_priv * priv ) ;
2009-02-18 15:54:27 -08:00
int iwl_mac_hw_scan ( struct ieee80211_hw * hw , struct cfg80211_scan_request * req ) ;
2009-01-23 13:45:12 -08:00
u16 iwl_fill_probe_req ( struct iwl_priv * priv , enum ieee80211_band band ,
struct ieee80211_mgmt * frame , int left ) ;
2008-06-12 09:47:10 +08:00
void iwl_setup_rx_scan_handlers ( struct iwl_priv * priv ) ;
2009-01-23 13:45:12 -08:00
u16 iwl_get_active_dwell_time ( struct iwl_priv * priv ,
enum ieee80211_band band ,
u8 n_probes ) ;
u16 iwl_get_passive_dwell_time ( struct iwl_priv * priv ,
enum ieee80211_band band ) ;
void iwl_bg_scan_check ( struct work_struct * data ) ;
void iwl_bg_abort_scan ( struct work_struct * work ) ;
void iwl_bg_scan_completed ( struct work_struct * work ) ;
2008-06-12 09:47:10 +08:00
void iwl_setup_scan_deferred_work ( struct iwl_priv * priv ) ;
2009-01-23 13:45:20 -08:00
int iwl_send_scan_abort ( struct iwl_priv * priv ) ;
2008-06-12 09:47:10 +08:00
2009-01-23 13:45:12 -08:00
/* For faster active scanning, scan will move to the next channel if fewer than
* PLCP_QUIET_THRESH packets are heard on this channel within
* ACTIVE_QUIET_TIME after sending probe request . This shortens the dwell
* time if it ' s a quiet channel ( nothing responded to our probe , and there ' s
* no other traffic ) .
* Disable " quiet " feature by setting PLCP_QUIET_THRESH to 0. */
2009-01-29 13:26:44 -08:00
# define IWL_ACTIVE_QUIET_TIME cpu_to_le16(10) /* msec */
# define IWL_PLCP_QUIET_THRESH cpu_to_le16(1) /* packets */
2009-01-23 13:45:12 -08:00
2008-09-03 11:26:37 +08:00
/*******************************************************************************
* Calibrations - implemented in iwl - calib . c
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int iwl_send_calib_results ( struct iwl_priv * priv ) ;
int iwl_calib_set ( struct iwl_calib_result * res , const u8 * buf , int len ) ;
void iwl_calib_free_results ( struct iwl_priv * priv ) ;
2008-11-07 09:58:41 -08:00
/*******************************************************************************
* Spectrum Measureemtns in iwl - spectrum . c
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-13 11:51:19 -08:00
# ifdef CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT
2008-11-07 09:58:41 -08:00
void iwl_setup_spectrum_handlers ( struct iwl_priv * priv ) ;
# else
static inline void iwl_setup_spectrum_handlers ( struct iwl_priv * priv ) { }
# endif
2008-03-21 13:53:44 -07:00
/*****************************************************
* S e n d i n g H o s t C o m m a n d s *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
const char * get_cmd_string ( u8 cmd ) ;
2008-03-28 16:21:12 -07:00
int __must_check iwl_send_cmd_sync ( struct iwl_priv * priv ,
struct iwl_host_cmd * cmd ) ;
2008-03-21 13:53:44 -07:00
int iwl_send_cmd ( struct iwl_priv * priv , struct iwl_host_cmd * cmd ) ;
2008-03-28 16:21:12 -07:00
int __must_check iwl_send_cmd_pdu ( struct iwl_priv * priv , u8 id ,
u16 len , const void * data ) ;
2008-03-21 13:53:44 -07:00
int iwl_send_cmd_pdu_async ( struct iwl_priv * priv , u8 id , u16 len ,
const void * data ,
int ( * callback ) ( struct iwl_priv * priv ,
struct iwl_cmd * cmd ,
struct sk_buff * skb ) ) ;
2008-05-15 13:54:07 +08:00
int iwl_enqueue_hcmd ( struct iwl_priv * priv , struct iwl_host_cmd * cmd ) ;
2008-05-15 13:54:18 +08:00
2008-12-22 11:31:18 +08:00
int iwl_send_card_state ( struct iwl_priv * priv , u32 flags ,
u8 meta_flag ) ;
2008-12-02 12:14:00 -08:00
/*****************************************************
* PCI *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void iwl_disable_interrupts ( struct iwl_priv * priv ) ;
void iwl_enable_interrupts ( struct iwl_priv * priv ) ;
2009-02-18 15:54:31 -08:00
irqreturn_t iwl_isr ( int irq , void * data ) ;
2009-02-10 15:19:02 -08:00
static inline u16 iwl_pcie_link_ctl ( struct iwl_priv * priv )
{
int pos ;
u16 pci_lnk_ctl ;
pos = pci_find_capability ( priv - > pci_dev , PCI_CAP_ID_EXP ) ;
pci_read_config_word ( priv - > pci_dev , pos + PCI_EXP_LNKCTL , & pci_lnk_ctl ) ;
return pci_lnk_ctl ;
}
2009-03-26 10:14:08 -07:00
# ifdef CONFIG_PM
int iwl_pci_suspend ( struct pci_dev * pdev , pm_message_t state ) ;
int iwl_pci_resume ( struct pci_dev * pdev ) ;
# endif /* CONFIG_PM */
2008-12-02 12:14:00 -08:00
2008-05-15 13:54:18 +08:00
/*****************************************************
* Error Handling Debugging
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-05-29 16:34:46 +08:00
void iwl_dump_nic_error_log ( struct iwl_priv * priv ) ;
2008-05-15 13:54:18 +08:00
void iwl_dump_nic_event_log ( struct iwl_priv * priv ) ;
2009-01-23 13:45:16 -08:00
/*****************************************************
* GEOS
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int iwlcore_init_geos ( struct iwl_priv * priv ) ;
void iwlcore_free_geos ( struct iwl_priv * priv ) ;
2008-10-14 12:32:45 -07:00
2008-04-03 16:05:21 -07:00
/*************** DRIVER STATUS FUNCTIONS *****/
# define STATUS_HCMD_ACTIVE 0 /* host command in progress */
# define STATUS_HCMD_SYNC_ACTIVE 1 /* sync host command in progress */
# define STATUS_INT_ENABLED 2
# define STATUS_RF_KILL_HW 3
# define STATUS_RF_KILL_SW 4
# define STATUS_INIT 5
# define STATUS_ALIVE 6
# define STATUS_READY 7
# define STATUS_TEMPERATURE 8
# define STATUS_GEO_CONFIGURED 9
# define STATUS_EXIT_PENDING 10
# define STATUS_STATISTICS 12
# define STATUS_SCANNING 13
# define STATUS_SCAN_ABORTING 14
# define STATUS_SCAN_HW 15
# define STATUS_POWER_PMI 16
# define STATUS_FW_ERROR 17
2008-10-06 16:05:32 +08:00
# define STATUS_MODE_PENDING 18
2008-04-03 16:05:21 -07:00
static inline int iwl_is_ready ( struct iwl_priv * priv )
{
/* The adapter is 'ready' if READY and GEO_CONFIGURED bits are
* set but EXIT_PENDING is not */
return test_bit ( STATUS_READY , & priv - > status ) & &
test_bit ( STATUS_GEO_CONFIGURED , & priv - > status ) & &
! test_bit ( STATUS_EXIT_PENDING , & priv - > status ) ;
}
static inline int iwl_is_alive ( struct iwl_priv * priv )
{
return test_bit ( STATUS_ALIVE , & priv - > status ) ;
}
static inline int iwl_is_init ( struct iwl_priv * priv )
{
return test_bit ( STATUS_INIT , & priv - > status ) ;
}
2008-07-01 17:49:50 +02:00
static inline int iwl_is_rfkill_sw ( struct iwl_priv * priv )
{
return test_bit ( STATUS_RF_KILL_SW , & priv - > status ) ;
}
static inline int iwl_is_rfkill_hw ( struct iwl_priv * priv )
{
return test_bit ( STATUS_RF_KILL_HW , & priv - > status ) ;
}
2008-04-03 16:05:21 -07:00
static inline int iwl_is_rfkill ( struct iwl_priv * priv )
{
2008-07-01 17:49:50 +02:00
return iwl_is_rfkill_hw ( priv ) | | iwl_is_rfkill_sw ( priv ) ;
2008-04-03 16:05:21 -07:00
}
static inline int iwl_is_ready_rf ( struct iwl_priv * priv )
{
if ( iwl_is_rfkill ( priv ) )
return 0 ;
return iwl_is_ready ( priv ) ;
}
2008-06-13 15:44:55 +08:00
extern void iwl_rf_kill_ct_config ( struct iwl_priv * priv ) ;
2009-01-23 13:45:20 -08:00
extern int iwl_send_bt_config ( struct iwl_priv * priv ) ;
2008-04-15 16:01:37 -07:00
extern int iwl_send_statistics_request ( struct iwl_priv * priv , u8 flags ) ;
2008-04-24 11:55:18 -07:00
extern int iwl_verify_ucode ( struct iwl_priv * priv ) ;
2008-06-13 15:44:55 +08:00
extern int iwl_send_lq_cmd ( struct iwl_priv * priv ,
2008-06-30 17:23:09 +08:00
struct iwl_link_quality_cmd * lq , u8 flags ) ;
extern void iwl_rx_reply_rx ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
extern void iwl_rx_reply_rx_phy ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
2008-06-30 17:23:11 +08:00
void iwl_rx_reply_compressed_ba ( struct iwl_priv * priv ,
struct iwl_rx_mem_buffer * rxb ) ;
2008-04-15 16:01:43 -07:00
static inline int iwl_send_rxon_assoc ( struct iwl_priv * priv )
{
return priv - > cfg - > ops - > hcmd - > rxon_assoc ( priv ) ;
}
2009-04-08 11:26:37 -07:00
static inline int iwlcore_commit_rxon ( struct iwl_priv * priv )
{
return priv - > cfg - > ops - > hcmd - > commit_rxon ( priv ) ;
}
2008-04-15 16:01:43 -07:00
2008-05-29 16:35:19 +08:00
static inline const struct ieee80211_supported_band * iwl_get_hw_mode (
struct iwl_priv * priv , enum ieee80211_band band )
{
return priv - > hw - > wiphy - > bands [ band ] ;
}
2008-03-04 18:09:30 -08:00
# endif /* __iwl_core_h__ */