2009-08-12 20:56:59 +04:00
/*
* Copyright ( c ) 2008 - 2009 Atheros Communications Inc .
*
* Permission to use , copy , modify , and / or distribute this software for any
* purpose with or without fee is hereby granted , provided that the above
* copyright notice and this permission notice appear in all copies .
*
* THE SOFTWARE IS PROVIDED " AS IS " AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS . IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL , DIRECT , INDIRECT , OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE , DATA OR PROFITS , WHETHER IN AN
* ACTION OF CONTRACT , NEGLIGENCE OR OTHER TORTIOUS ACTION , ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE .
*/
# ifndef ATH_H
# define ATH_H
2014-01-15 20:37:42 +04:00
# include <linux/etherdevice.h>
2009-08-12 20:56:59 +04:00
# include <linux/skbuff.h>
2009-09-10 09:43:17 +04:00
# include <linux/if_ether.h>
2010-10-09 00:13:53 +04:00
# include <linux/spinlock.h>
2009-09-13 11:03:27 +04:00
# include <net/mac80211.h>
2009-08-12 20:56:59 +04:00
2009-11-05 04:21:01 +03:00
/*
* The key cache is used for h / w cipher state and also for
* tracking station state such as the current tx antenna .
* We also setup a mapping table between key cache slot indices
* and station state to short - circuit node lookups on rx .
* Different parts have different size key caches . We handle
* up to ATH_KEYMAX entries ( could dynamically allocate state ) .
*/
# define ATH_KEYMAX 128 /* max key cache size we handle */
2009-09-10 09:19:26 +04:00
static const u8 ath_bcast_mac [ ETH_ALEN ] = { 0xff , 0xff , 0xff , 0xff , 0xff , 0xff } ;
2009-11-04 04:07:04 +03:00
struct ath_ani {
bool caldone ;
unsigned int longcal_timer ;
unsigned int shortcal_timer ;
unsigned int resetcal_timer ;
unsigned int checkani_timer ;
struct timer_list timer ;
} ;
2010-10-09 00:13:53 +04:00
struct ath_cycle_counters {
u32 cycles ;
u32 rx_busy ;
u32 rx_frame ;
u32 tx_frame ;
} ;
2009-10-07 05:19:07 +04:00
enum ath_device_state {
ATH_HW_UNAVAILABLE ,
ATH_HW_INITIALIZED ,
} ;
2014-02-27 14:40:46 +04:00
enum ath_op_flags {
ATH_OP_INVALID ,
ATH_OP_BEACONS ,
ATH_OP_ANI_RUN ,
ATH_OP_PRIM_STA_VIF ,
ATH_OP_HW_RESET ,
ATH_OP_SCANNING ,
2014-06-11 14:48:00 +04:00
ATH_OP_MULTI_CHANNEL ,
2014-02-27 14:40:46 +04:00
} ;
2010-04-01 08:58:20 +04:00
enum ath_bus_type {
ATH_PCI ,
ATH_AHB ,
ATH_USB ,
} ;
2009-08-18 05:07:23 +04:00
struct reg_dmn_pair_mapping {
2014-02-13 20:13:12 +04:00
u16 reg_domain ;
2009-08-18 05:07:23 +04:00
u16 reg_5ghz_ctl ;
u16 reg_2ghz_ctl ;
} ;
struct ath_regulatory {
char alpha2 [ 2 ] ;
2014-10-22 17:27:53 +04:00
enum nl80211_dfs_regions region ;
2009-08-18 05:07:23 +04:00
u16 country_code ;
u16 max_power_level ;
u16 current_rd ;
int16_t power_limit ;
struct reg_dmn_pair_mapping * regpair ;
} ;
2010-09-08 11:04:33 +04:00
enum ath_crypt_caps {
2010-09-17 06:36:25 +04:00
ATH_CRYPT_CAP_CIPHER_AESCCM = BIT ( 0 ) ,
ATH_CRYPT_CAP_MIC_COMBINED = BIT ( 1 ) ,
2010-09-08 11:04:33 +04:00
} ;
2010-09-08 11:04:38 +04:00
struct ath_keyval {
u8 kv_type ;
u8 kv_pad ;
u16 kv_len ;
u8 kv_val [ 16 ] ; /* TK */
u8 kv_mic [ 8 ] ; /* Michael MIC key */
u8 kv_txmic [ 8 ] ; /* Michael MIC TX key (used only if the hardware
* supports both MIC keys in the same key cache entry ;
* in that case , kv_mic is the RX key ) */
} ;
enum ath_cipher {
ATH_CIPHER_WEP = 0 ,
ATH_CIPHER_AES_OCB = 1 ,
ATH_CIPHER_AES_CCM = 2 ,
ATH_CIPHER_CKIP = 3 ,
ATH_CIPHER_TKIP = 4 ,
ATH_CIPHER_CLR = 5 ,
ATH_CIPHER_MIC = 127
} ;
2010-04-16 10:23:50 +04:00
/**
* struct ath_ops - Register read / write operations
*
* @ read : Register read
2011-01-04 10:47:18 +03:00
* @ multi_read : Multiple register read
2010-04-16 10:23:50 +04:00
* @ write : Register write
* @ enable_write_buffer : Enable multiple register writes
2010-10-05 14:03:42 +04:00
* @ write_flush : flush buffered register writes and disable buffering
2010-04-16 10:23:50 +04:00
*/
2009-09-11 03:11:21 +04:00
struct ath_ops {
unsigned int ( * read ) ( void * , u32 reg_offset ) ;
2011-01-04 10:47:18 +03:00
void ( * multi_read ) ( void * , u32 * addr , u32 * val , u16 count ) ;
2010-04-16 10:23:50 +04:00
void ( * write ) ( void * , u32 val , u32 reg_offset ) ;
void ( * enable_write_buffer ) ( void * ) ;
void ( * write_flush ) ( void * ) ;
2011-03-23 22:57:25 +03:00
u32 ( * rmw ) ( void * , u32 reg_offset , u32 set , u32 clr ) ;
2009-09-11 03:11:21 +04:00
} ;
2009-09-14 11:55:09 +04:00
struct ath_common ;
2011-04-13 23:56:43 +04:00
struct ath_bus_ops ;
2009-09-14 11:55:09 +04:00
2014-11-06 10:53:24 +03:00
struct ath_ps_ops {
void ( * wakeup ) ( struct ath_common * common ) ;
void ( * restore ) ( struct ath_common * common ) ;
} ;
2009-08-12 20:56:59 +04:00
struct ath_common {
2009-09-11 04:52:45 +04:00
void * ah ;
2009-09-28 10:54:40 +04:00
void * priv ;
2009-09-13 11:03:27 +04:00
struct ieee80211_hw * hw ;
2009-09-13 13:42:02 +04:00
int debug_mask ;
2009-10-07 05:19:07 +04:00
enum ath_device_state state ;
2014-02-27 14:40:46 +04:00
unsigned long op_flags ;
2009-09-13 13:42:02 +04:00
2009-11-04 04:07:04 +03:00
struct ath_ani ani ;
2009-08-12 20:56:59 +04:00
u16 cachelsz ;
2009-09-10 20:22:37 +04:00
u16 curaid ;
u8 macaddr [ ETH_ALEN ] ;
2014-10-17 06:10:20 +04:00
u8 curbssid [ ETH_ALEN ] __aligned ( 2 ) ;
2009-09-10 20:22:37 +04:00
u8 bssidmask [ ETH_ALEN ] ;
2009-09-13 13:42:02 +04:00
2009-11-04 20:11:34 +03:00
u32 rx_bufsize ;
2009-11-05 04:21:01 +03:00
u32 keymax ;
DECLARE_BITMAP ( keymap , ATH_KEYMAX ) ;
2010-08-28 20:21:21 +04:00
DECLARE_BITMAP ( tkip_keymap , ATH_KEYMAX ) ;
2012-06-23 21:23:31 +04:00
DECLARE_BITMAP ( ccmp_keymap , ATH_KEYMAX ) ;
2010-09-08 11:04:33 +04:00
enum ath_crypt_caps crypt_caps ;
2009-11-05 04:21:01 +03:00
2010-10-09 00:13:51 +04:00
unsigned int clockrate ;
2010-10-09 00:13:53 +04:00
spinlock_t cc_lock ;
struct ath_cycle_counters cc_ani ;
struct ath_cycle_counters cc_survey ;
2009-08-18 05:07:23 +04:00
struct ath_regulatory regulatory ;
2011-12-08 22:29:24 +04:00
struct ath_regulatory reg_world_copy ;
2009-09-11 05:04:47 +04:00
const struct ath_ops * ops ;
2009-09-14 11:55:09 +04:00
const struct ath_bus_ops * bus_ops ;
2014-11-06 10:53:24 +03:00
const struct ath_ps_ops * ps_ops ;
2010-11-26 17:10:06 +03:00
bool btcoex_enabled ;
2011-05-26 09:26:15 +04:00
bool disable_ani ;
2013-08-04 12:51:55 +04:00
bool bt_ant_diversity ;
2014-02-04 13:27:38 +04:00
int last_rssi ;
2014-02-25 17:48:50 +04:00
struct ieee80211_supported_band sbands [ IEEE80211_NUM_BANDS ] ;
2009-08-12 20:56:59 +04:00
} ;
2014-11-06 10:53:24 +03:00
static inline const struct ath_ps_ops * ath_ps_ops ( struct ath_common * common )
{
return common - > ps_ops ;
}
2009-08-12 20:56:59 +04:00
struct sk_buff * ath_rxbuf_alloc ( struct ath_common * common ,
u32 len ,
gfp_t gfp_mask ) ;
2014-01-15 20:37:42 +04:00
bool ath_is_mybeacon ( struct ath_common * common , struct ieee80211_hdr * hdr ) ;
2009-08-12 20:56:59 +04:00
2009-09-11 04:52:45 +04:00
void ath_hw_setbssidmask ( struct ath_common * common ) ;
2010-09-08 11:04:38 +04:00
void ath_key_delete ( struct ath_common * common , struct ieee80211_key_conf * key ) ;
int ath_key_config ( struct ath_common * common ,
struct ieee80211_vif * vif ,
struct ieee80211_sta * sta ,
struct ieee80211_key_conf * key ) ;
bool ath_hw_keyreset ( struct ath_common * common , u16 entry ) ;
2010-10-09 00:13:53 +04:00
void ath_hw_cycle_counters_update ( struct ath_common * common ) ;
int32_t ath_hw_get_listen_time ( struct ath_common * common ) ;
2009-09-11 04:52:45 +04:00
2012-03-08 22:20:55 +04:00
__printf ( 3 , 4 )
void ath_printk ( const char * level , const struct ath_common * common ,
const char * fmt , . . . ) ;
2010-12-03 06:12:35 +03:00
# define ath_emerg(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_EMERG , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ath_alert(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_ALERT , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ath_crit(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_CRIT , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ath_err(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_ERR , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ath_warn(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_WARNING , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ath_notice(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_NOTICE , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ath_info(common, fmt, ...) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_INFO , common , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
/**
* enum ath_debug_level - atheros wireless debug level
*
* @ ATH_DBG_RESET : reset processing
* @ ATH_DBG_QUEUE : hardware queue management
* @ ATH_DBG_EEPROM : eeprom processing
* @ ATH_DBG_CALIBRATE : periodic calibration
* @ ATH_DBG_INTERRUPT : interrupt processing
* @ ATH_DBG_REGULATORY : regulatory processing
* @ ATH_DBG_ANI : adaptive noise immunitive processing
* @ ATH_DBG_XMIT : basic xmit operation
* @ ATH_DBG_BEACON : beacon handling
* @ ATH_DBG_CONFIG : configuration of the hardware
* @ ATH_DBG_FATAL : fatal errors , this is the default , DBG_DEFAULT
* @ ATH_DBG_PS : power save processing
* @ ATH_DBG_HWTIMER : hardware timer handling
* @ ATH_DBG_BTCOEX : bluetooth coexistance
* @ ATH_DBG_BSTUCK : stuck beacons
2011-12-15 01:56:36 +04:00
* @ ATH_DBG_MCI : Message Coexistence Interface , a private protocol
* used exclusively for WLAN - BT coexistence starting from
* AR9462 .
2011-12-15 08:16:32 +04:00
* @ ATH_DBG_DFS : radar datection
2012-07-10 13:26:34 +04:00
* @ ATH_DBG_WOW : Wake on Wireless
2014-09-16 04:13:09 +04:00
* @ ATH_DBG_DYNACK : dynack handling
2010-12-03 06:12:35 +03:00
* @ ATH_DBG_ANY : enable all debugging
*
* The debug level is used to control the amount and type of debugging output
* we want to see . Each driver has its own method for enabling debugging and
* modifying debug level states - - but this is typically done through a
* module parameter ' debug ' along with a respective ' debug ' debugfs file
* entry .
*/
enum ATH_DEBUG {
ATH_DBG_RESET = 0x00000001 ,
ATH_DBG_QUEUE = 0x00000002 ,
ATH_DBG_EEPROM = 0x00000004 ,
ATH_DBG_CALIBRATE = 0x00000008 ,
ATH_DBG_INTERRUPT = 0x00000010 ,
ATH_DBG_REGULATORY = 0x00000020 ,
ATH_DBG_ANI = 0x00000040 ,
ATH_DBG_XMIT = 0x00000080 ,
ATH_DBG_BEACON = 0x00000100 ,
ATH_DBG_CONFIG = 0x00000200 ,
ATH_DBG_FATAL = 0x00000400 ,
ATH_DBG_PS = 0x00000800 ,
2013-06-18 08:43:39 +04:00
ATH_DBG_BTCOEX = 0x00001000 ,
ATH_DBG_WMI = 0x00002000 ,
ATH_DBG_BSTUCK = 0x00004000 ,
ATH_DBG_MCI = 0x00008000 ,
ATH_DBG_DFS = 0x00010000 ,
ATH_DBG_WOW = 0x00020000 ,
2014-08-22 19:09:24 +04:00
ATH_DBG_CHAN_CTX = 0x00040000 ,
2014-09-16 04:13:09 +04:00
ATH_DBG_DYNACK = 0x00080000 ,
2010-12-03 06:12:35 +03:00
ATH_DBG_ANY = 0xffffffff
} ;
# define ATH_DBG_DEFAULT (ATH_DBG_FATAL)
2014-09-27 11:57:45 +04:00
# define ATH_DBG_MAX_LEN 512
2010-12-03 06:12:35 +03:00
# ifdef CONFIG_ATH_DEBUG
2011-08-26 12:56:38 +04:00
# define ath_dbg(common, dbg_mask, fmt, ...) \
do { \
2011-12-16 02:55:53 +04:00
if ( ( common ) - > debug_mask & ATH_DBG_ # # dbg_mask ) \
2012-03-08 22:20:55 +04:00
ath_printk ( KERN_DEBUG , common , fmt , # # __VA_ARGS__ ) ; \
2011-08-26 12:56:38 +04:00
} while ( 0 )
2010-12-03 06:12:35 +03:00
# define ATH_DBG_WARN(foo, arg...) WARN(foo, arg)
2010-12-07 00:13:07 +03:00
# define ATH_DBG_WARN_ON_ONCE(foo) WARN_ON_ONCE(foo)
2010-12-03 06:12:35 +03:00
# else
2011-11-01 04:11:33 +04:00
static inline __attribute__ ( ( format ( printf , 3 , 4 ) ) )
2011-12-16 02:55:53 +04:00
void _ath_dbg ( struct ath_common * common , enum ATH_DEBUG dbg_mask ,
2011-08-26 12:56:38 +04:00
const char * fmt , . . . )
2010-12-03 06:12:35 +03:00
{
}
2011-12-16 02:55:53 +04:00
# define ath_dbg(common, dbg_mask, fmt, ...) \
_ath_dbg ( common , ATH_DBG_ # # dbg_mask , fmt , # # __VA_ARGS__ )
2010-12-03 06:12:35 +03:00
# define ATH_DBG_WARN(foo, arg...) do {} while (0)
2010-12-09 17:08:47 +03:00
# define ATH_DBG_WARN_ON_ONCE(foo) ({ \
int __ret_warn_once = ! ! ( foo ) ; \
unlikely ( __ret_warn_once ) ; \
} )
2010-12-03 06:12:35 +03:00
# endif /* CONFIG_ATH_DEBUG */
/** Returns string describing opmode, or NULL if unknown mode. */
# ifdef CONFIG_ATH_DEBUG
const char * ath_opmode_to_string ( enum nl80211_iftype opmode ) ;
# else
static inline const char * ath_opmode_to_string ( enum nl80211_iftype opmode )
{
return " UNKNOWN " ;
}
# endif
2009-08-12 20:56:59 +04:00
# endif /* ATH_H */