2008-08-04 00:16:41 -07:00
/*
2011-05-17 13:36:18 +05:30
* Copyright ( c ) 2008 - 2011 Atheros Communications Inc .
2008-08-04 00:16:41 -07:00
*
* 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 ATH9K_H
# define ATH9K_H
2009-02-09 13:26:54 +05:30
# include <linux/etherdevice.h>
# include <linux/device.h>
2011-06-06 10:43:46 +00:00
# include <linux/interrupt.h>
2009-02-09 13:26:54 +05:30
# include <linux/leds.h>
2010-06-12 00:34:01 -04:00
# include <linux/completion.h>
2009-02-09 13:26:54 +05:30
# include "debug.h"
2009-11-05 08:44:39 -08:00
# include "common.h"
2011-10-24 18:19:49 +05:30
# include "mci.h"
2012-04-03 17:15:50 +02:00
# include "dfs.h"
2009-11-05 08:44:39 -08:00
/*
* Header for the ath9k . ko driver core * only * - - hw code nor any other driver
* should rely on this file or its contents .
*/
2009-02-09 13:26:54 +05:30
struct ath_node ;
/* Macro to expand scalars to 64-bit objects */
2009-12-29 22:57:28 +08:00
# define ito64(x) (sizeof(x) == 1) ? \
2009-02-09 13:26:54 +05:30
( ( ( unsigned long long int ) ( x ) ) & ( 0xff ) ) : \
2009-12-29 22:57:28 +08:00
( sizeof ( x ) = = 2 ) ? \
2009-02-09 13:26:54 +05:30
( ( ( unsigned long long int ) ( x ) ) & 0xffff ) : \
2009-12-29 22:57:28 +08:00
( ( sizeof ( x ) = = 4 ) ? \
2009-02-09 13:26:54 +05:30
( ( ( unsigned long long int ) ( x ) ) & 0xffffffff ) : \
( unsigned long long int ) ( x ) )
/* increment with wrap-around */
# define INCR(_l, _sz) do { \
( _l ) + + ; \
( _l ) & = ( ( _sz ) - 1 ) ; \
} while ( 0 )
/* decrement with wrap-around */
# define DECR(_l, _sz) do { \
( _l ) - - ; \
( _l ) & = ( ( _sz ) - 1 ) ; \
} while ( 0 )
# define TSF_TO_TU(_h,_l) \
( ( ( ( u32 ) ( _h ) ) < < 22 ) | ( ( ( u32 ) ( _l ) ) > > 10 ) )
# define ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i))
struct ath_config {
u16 txpowlimit ;
u8 cabqReadytime ;
} ;
/*************************/
/* Descriptor Management */
/*************************/
# define ATH_TXBUF_RESET(_bf) do { \
2009-03-30 15:28:38 +05:30
( _bf ) - > bf_stale = false ; \
2009-02-09 13:26:54 +05:30
( _bf ) - > bf_lastbf = NULL ; \
( _bf ) - > bf_next = NULL ; \
memset ( & ( ( _bf ) - > bf_state ) , 0 , \
sizeof ( struct ath_buf_state ) ) ; \
} while ( 0 )
2009-03-30 15:28:38 +05:30
# define ATH_RXBUF_RESET(_bf) do { \
( _bf ) - > bf_stale = false ; \
} while ( 0 )
2009-02-09 13:26:54 +05:30
/**
* enum buffer_type - Buffer type flags
*
* @ BUF_AMPDU : This buffer is an ampdu , as part of an aggregate ( during TX )
* @ BUF_AGGR : Indicates whether the buffer can be aggregated
* ( used in aggregation scheduling )
*/
enum buffer_type {
2011-01-21 14:03:24 +05:30
BUF_AMPDU = BIT ( 0 ) ,
BUF_AGGR = BIT ( 1 ) ,
2009-02-09 13:26:54 +05:30
} ;
# define bf_isampdu(bf) (bf->bf_state.bf_type & BUF_AMPDU)
# define bf_isaggr(bf) (bf->bf_state.bf_type & BUF_AGGR)
2008-08-04 00:16:41 -07:00
2011-12-23 21:27:02 +05:30
# define ATH_TXSTATUS_RING_SIZE 512
2010-04-15 17:39:34 -04:00
2011-06-28 17:30:54 +05:30
# define DS2PHYS(_dd, _ds) \
( ( _dd ) - > dd_desc_paddr + ( ( caddr_t ) ( _ds ) - ( caddr_t ) ( _dd ) - > dd_desc ) )
# define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0)
# define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096)
2009-02-09 13:26:54 +05:30
struct ath_descdma {
2010-04-15 17:39:34 -04:00
void * dd_desc ;
2009-02-09 13:27:03 +05:30
dma_addr_t dd_desc_paddr ;
u32 dd_desc_len ;
2009-02-09 13:26:54 +05:30
} ;
int ath_descdma_setup ( struct ath_softc * sc , struct ath_descdma * dd ,
struct list_head * head , const char * name ,
2010-04-15 17:39:33 -04:00
int nbuf , int ndesc , bool is_tx ) ;
2009-02-09 13:26:54 +05:30
/***********/
/* RX / TX */
/***********/
# define ATH_RXBUF 512
# define ATH_TXBUF 512
2010-06-01 21:33:13 +02:00
# define ATH_TXBUF_RESERVE 5
# define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE)
2009-02-09 13:26:54 +05:30
# define ATH_TXMAXTRY 13
# define TID_TO_WME_AC(_tid) \
2012-11-21 18:13:10 +05:30
( ( ( ( _tid ) = = 0 ) | | ( ( _tid ) = = 3 ) ) ? IEEE80211_AC_BE : \
( ( ( _tid ) = = 1 ) | | ( ( _tid ) = = 2 ) ) ? IEEE80211_AC_BK : \
( ( ( _tid ) = = 4 ) | | ( ( _tid ) = = 5 ) ) ? IEEE80211_AC_VI : \
IEEE80211_AC_VO )
2009-02-09 13:26:54 +05:30
# define ATH_AGGR_DELIM_SZ 4
# define ATH_AGGR_MINPLEN 256 /* in bytes, minimum packet length */
/* number of delimiters for encryption padding */
# define ATH_AGGR_ENCRYPTDELIM 10
/* minimum h/w qdepth to be sustained to maximize aggregation */
# define ATH_AGGR_MIN_QDEPTH 2
# define ATH_AMPDU_SUBFRAME_DEFAULT 32
# define IEEE80211_SEQ_SEQ_SHIFT 4
# define IEEE80211_SEQ_MAX 4096
# define IEEE80211_WEP_IVLEN 3
# define IEEE80211_WEP_KIDLEN 1
# define IEEE80211_WEP_CRCLEN 4
# define IEEE80211_MAX_MPDU_LEN (3840 + FCS_LEN + \
( IEEE80211_WEP_IVLEN + \
IEEE80211_WEP_KIDLEN + \
IEEE80211_WEP_CRCLEN ) )
/* return whether a bit at index _n in bitmap _bm is set
* _sz is the size of the bitmap */
# define ATH_BA_ISSET(_bm, _n) (((_n) < (WME_BA_BMP_SIZE)) && \
( ( _bm ) [ ( _n ) > > 5 ] & ( 1 < < ( ( _n ) & 31 ) ) ) )
/* return block-ack bitmap index given sequence and starting sequence */
# define ATH_BA_INDEX(_st, _seq) (((_seq) - (_st)) & (IEEE80211_SEQ_MAX - 1))
2011-12-14 22:08:04 +01:00
/* return the seqno for _start + _offset */
# define ATH_BA_INDEX2SEQ(_seq, _offset) (((_seq) + (_offset)) & (IEEE80211_SEQ_MAX - 1))
2009-02-09 13:26:54 +05:30
/* returns delimiter padding required given the packet length */
# define ATH_AGGR_GET_NDELIM(_len) \
2010-11-10 05:03:15 -08:00
( ( ( _len ) > = ATH_AGGR_MINPLEN ) ? 0 : \
DIV_ROUND_UP ( ATH_AGGR_MINPLEN - ( _len ) , ATH_AGGR_DELIM_SZ ) )
2009-02-09 13:26:54 +05:30
# define BAW_WITHIN(_start, _bawsz, _seqno) \
( ( ( ( _seqno ) - ( _start ) ) & 4095 ) < ( _bawsz ) )
# define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)])
2012-09-26 12:22:08 +05:30
# define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e))
2009-07-14 20:17:09 -04:00
# define ATH_TX_COMPLETE_POLL_INT 1000
2009-02-09 13:26:54 +05:30
enum ATH_AGGR_STATUS {
ATH_AGGR_DONE ,
ATH_AGGR_BAW_CLOSED ,
ATH_AGGR_LIMITED ,
} ;
2010-04-15 17:39:36 -04:00
# define ATH_TXFIFO_DEPTH 8
2009-02-09 13:26:54 +05:30
struct ath_txq {
2011-01-09 23:11:52 -08:00
int mac80211_qnum ; /* mac80211 queue number, -1 means not mac80211 Q */
u32 axq_qnum ; /* ath9k hardware queue number */
2011-05-19 12:20:25 +02:00
void * axq_link ;
2009-02-09 13:27:03 +05:30
struct list_head axq_q ;
2009-02-09 13:26:54 +05:30
spinlock_t axq_lock ;
2009-02-09 13:27:03 +05:30
u32 axq_depth ;
2010-12-17 00:57:00 +01:00
u32 axq_ampdu_depth ;
2009-02-09 13:27:03 +05:30
bool stopped ;
2009-07-14 20:17:09 -04:00
bool axq_tx_inprogress ;
2009-02-09 13:26:54 +05:30
struct list_head axq_acq ;
2010-04-15 17:39:36 -04:00
struct list_head txq_fifo [ ATH_TXFIFO_DEPTH ] ;
u8 txq_headidx ;
u8 txq_tailidx ;
2010-11-07 14:59:39 +01:00
int pending_frames ;
2011-12-19 16:45:54 +01:00
struct sk_buff_head complete_q ;
2009-02-09 13:26:54 +05:30
} ;
2010-05-20 15:34:40 +05:30
struct ath_atx_ac {
2010-11-07 14:59:39 +01:00
struct ath_txq * txq ;
2010-05-20 15:34:40 +05:30
int sched ;
struct list_head list ;
struct list_head tid_q ;
2011-04-17 23:28:09 +02:00
bool clear_ps_filter ;
2010-05-20 15:34:40 +05:30
} ;
2010-11-14 15:20:13 +01:00
struct ath_frame_info {
2011-08-28 00:32:22 +02:00
struct ath_buf * bf ;
2010-11-14 15:20:13 +01:00
int framelen ;
enum ath9k_key_type keytype ;
2011-08-28 00:32:21 +02:00
u8 keyix ;
2010-11-14 15:20:13 +01:00
u8 retries ;
2012-06-15 03:04:53 +02:00
u8 rtscts_rate ;
2010-11-14 15:20:13 +01:00
} ;
2010-05-20 15:34:40 +05:30
struct ath_buf_state {
u8 bf_type ;
2010-06-12 00:34:01 -04:00
u8 bfs_paprd ;
2011-09-14 21:24:17 +02:00
u8 ndelim ;
2011-08-28 00:32:23 +02:00
u16 seqno ;
2011-02-04 18:38:23 +05:30
unsigned long bfs_paprd_timestamp ;
2010-05-20 15:34:40 +05:30
} ;
struct ath_buf {
struct list_head list ;
struct ath_buf * bf_lastbf ; /* last buf of this unit (a frame or
an aggregate ) */
struct ath_buf * bf_next ; /* next subframe in the aggregate */
struct sk_buff * bf_mpdu ; /* enclosing frame structure */
void * bf_desc ; /* virtual addr of desc */
dma_addr_t bf_daddr ; /* physical addr of desc */
2010-10-14 12:45:29 -07:00
dma_addr_t bf_buf_addr ; /* physical addr of data buffer, for DMA */
2010-05-20 15:34:40 +05:30
bool bf_stale ;
2013-04-22 23:11:44 +02:00
struct ieee80211_tx_rate rates [ 4 ] ;
2010-05-20 15:34:40 +05:30
struct ath_buf_state bf_state ;
} ;
struct ath_atx_tid {
struct list_head list ;
2011-08-28 00:32:22 +02:00
struct sk_buff_head buf_q ;
2010-05-20 15:34:40 +05:30
struct ath_node * an ;
struct ath_atx_ac * ac ;
2010-09-20 13:45:36 +02:00
unsigned long tx_buf [ BITS_TO_LONGS ( ATH_TID_MAX_BUFS ) ] ;
2011-12-14 22:08:08 +01:00
int bar_index ;
2010-05-20 15:34:40 +05:30
u16 seq_start ;
u16 seq_next ;
u16 baw_size ;
int tidno ;
int baw_head ; /* first un-acked tx buffer */
int baw_tail ; /* next unused tx buffer slot */
2013-05-18 21:28:15 +02:00
bool sched ;
bool paused ;
bool active ;
2010-05-20 15:34:40 +05:30
} ;
struct ath_node {
2012-11-28 15:08:54 +05:30
struct ath_softc * sc ;
2011-01-09 23:11:49 -08:00
struct ieee80211_sta * sta ; /* station struct we're part of */
2011-11-03 11:33:13 -07:00
struct ieee80211_vif * vif ; /* interface with which we're associated */
2012-11-28 15:08:53 +05:30
struct ath_atx_tid tid [ IEEE80211_NUM_TIDS ] ;
2012-11-21 18:13:10 +05:30
struct ath_atx_ac ac [ IEEE80211_NUM_ACS ] ;
2011-04-17 23:28:10 +02:00
int ps_key ;
2010-05-20 15:34:40 +05:30
u16 maxampdu ;
u8 mpdudensity ;
2011-04-17 23:28:09 +02:00
bool sleeping ;
2012-11-28 15:08:54 +05:30
# if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_ATH9K_DEBUGFS)
struct dentry * node_stat ;
# endif
2010-05-20 15:34:40 +05:30
} ;
2009-02-09 13:26:54 +05:30
struct ath_tx_control {
struct ath_txq * txq ;
2010-11-14 15:20:13 +01:00
struct ath_node * an ;
2010-06-12 00:34:01 -04:00
u8 paprd ;
2012-07-23 21:33:42 +02:00
struct ieee80211_sta * sta ;
2009-02-09 13:26:54 +05:30
} ;
# define ATH_TX_ERROR 0x01
2011-01-09 23:11:52 -08:00
/**
* @ txq_map : Index is mac80211 queue number . This is
* not necessarily the same as the hardware queue number
* ( axq_qnum ) .
*/
2009-02-09 13:26:54 +05:30
struct ath_tx {
u16 seq_no ;
u32 txqsetup ;
spinlock_t txbuflock ;
struct list_head txbuf ;
struct ath_txq txq [ ATH9K_NUM_TX_QUEUES ] ;
struct ath_descdma txdma ;
2012-11-21 18:13:10 +05:30
struct ath_txq * txq_map [ IEEE80211_NUM_ACS ] ;
2013-06-07 18:12:00 +02:00
struct ath_txq * uapsdq ;
2012-11-21 18:13:10 +05:30
u32 txq_max_pending [ IEEE80211_NUM_ACS ] ;
u16 max_aggr_framelen [ IEEE80211_NUM_ACS ] [ 4 ] [ 32 ] ;
2009-02-09 13:26:54 +05:30
} ;
2010-04-15 17:38:48 -04:00
struct ath_rx_edma {
struct sk_buff_head rx_fifo ;
u32 rx_fifo_hwsize ;
} ;
2009-02-09 13:26:54 +05:30
struct ath_rx {
u8 defant ;
u8 rxotherant ;
2013-04-08 00:04:11 +02:00
bool discard_next ;
2009-02-09 13:26:54 +05:30
u32 * rxlink ;
2012-06-04 16:28:52 +05:30
u32 num_pkts ;
2009-02-09 13:26:54 +05:30
unsigned int rxfilter ;
struct list_head rxbuf ;
struct ath_descdma rxdma ;
2010-04-15 17:38:48 -04:00
struct ath_rx_edma rx_edma [ ATH9K_RX_QUEUE_MAX ] ;
2011-01-26 18:23:27 +01:00
struct sk_buff * frag ;
2013-01-30 23:37:41 +01:00
u32 ampdu_ref ;
2009-02-09 13:26:54 +05:30
} ;
int ath_startrecv ( struct ath_softc * sc ) ;
bool ath_stoprecv ( struct ath_softc * sc ) ;
u32 ath_calcrxfilter ( struct ath_softc * sc ) ;
int ath_rx_init ( struct ath_softc * sc , int nbufs ) ;
void ath_rx_cleanup ( struct ath_softc * sc ) ;
2010-04-15 17:38:48 -04:00
int ath_rx_tasklet ( struct ath_softc * sc , int flush , bool hp ) ;
2009-02-09 13:26:54 +05:30
struct ath_txq * ath_txq_setup ( struct ath_softc * sc , int qtype , int subtype ) ;
2012-06-04 20:23:37 +05:30
void ath_txq_lock ( struct ath_softc * sc , struct ath_txq * txq ) ;
void ath_txq_unlock ( struct ath_softc * sc , struct ath_txq * txq ) ;
void ath_txq_unlock_complete ( struct ath_softc * sc , struct ath_txq * txq ) ;
2009-02-09 13:26:54 +05:30
void ath_tx_cleanupq ( struct ath_softc * sc , struct ath_txq * txq ) ;
2013-01-20 18:51:53 +01:00
bool ath_drain_all_txq ( struct ath_softc * sc ) ;
void ath_draintxq ( struct ath_softc * sc , struct ath_txq * txq ) ;
2009-02-09 13:26:54 +05:30
void ath_tx_node_init ( struct ath_softc * sc , struct ath_node * an ) ;
void ath_tx_node_cleanup ( struct ath_softc * sc , struct ath_node * an ) ;
void ath_txq_schedule ( struct ath_softc * sc , struct ath_txq * txq ) ;
int ath_tx_init ( struct ath_softc * sc , int nbufs ) ;
int ath_txq_update ( struct ath_softc * sc , int qnum ,
struct ath9k_tx_queue_info * q ) ;
2012-07-15 19:53:36 +02:00
void ath_update_max_aggr_framelen ( struct ath_softc * sc , int queue , int txop ) ;
2009-03-03 19:23:29 +02:00
int ath_tx_start ( struct ieee80211_hw * hw , struct sk_buff * skb ,
2009-02-09 13:26:54 +05:30
struct ath_tx_control * txctl ) ;
2013-06-07 18:12:02 +02:00
void ath_tx_cabq ( struct ieee80211_hw * hw , struct ieee80211_vif * vif ,
struct sk_buff * skb ) ;
2009-02-09 13:26:54 +05:30
void ath_tx_tasklet ( struct ath_softc * sc ) ;
2010-04-15 17:39:36 -04:00
void ath_tx_edma_tasklet ( struct ath_softc * sc ) ;
2010-09-20 19:35:28 +02:00
int ath_tx_aggr_start ( struct ath_softc * sc , struct ieee80211_sta * sta ,
u16 tid , u16 * ssn ) ;
2009-07-23 15:32:37 +05:30
void ath_tx_aggr_stop ( struct ath_softc * sc , struct ieee80211_sta * sta , u16 tid ) ;
2009-02-09 13:26:54 +05:30
void ath_tx_aggr_resume ( struct ath_softc * sc , struct ieee80211_sta * sta , u16 tid ) ;
2011-04-17 23:28:09 +02:00
void ath_tx_aggr_wakeup ( struct ath_softc * sc , struct ath_node * an ) ;
2011-09-29 16:04:26 +02:00
void ath_tx_aggr_sleep ( struct ieee80211_sta * sta , struct ath_softc * sc ,
struct ath_node * an ) ;
2013-06-07 18:12:01 +02:00
void ath9k_release_buffered_frames ( struct ieee80211_hw * hw ,
struct ieee80211_sta * sta ,
u16 tids , int nframes ,
enum ieee80211_frame_release_type reason ,
bool more_data ) ;
2011-04-17 23:28:09 +02:00
2009-02-09 13:26:54 +05:30
/********/
2009-02-09 13:27:03 +05:30
/* VIFs */
2009-02-09 13:26:54 +05:30
/********/
2008-08-04 00:16:41 -07:00
2009-02-09 13:27:03 +05:30
struct ath_vif {
2009-02-09 13:26:54 +05:30
int av_bslot ;
2012-07-17 17:16:03 +05:30
bool primary_sta_vif ;
2009-03-12 21:53:23 +02:00
__le64 tsf_adjust ; /* TSF adjustment for staggered beacons */
2009-02-09 13:26:54 +05:30
struct ath_buf * av_bcbuf ;
2008-08-04 00:16:41 -07:00
} ;
2009-02-09 13:26:54 +05:30
/*******************/
/* Beacon Handling */
/*******************/
2008-08-04 00:16:41 -07:00
2009-02-09 13:26:54 +05:30
/*
* Regardless of the number of beacons we stagger , ( i . e . regardless of the
* number of BSSIDs ) if a given beacon does not go out even after waiting this
* number of beacon intervals , the game ' s up .
*/
2011-03-22 21:54:19 +01:00
# define BSTUCK_THRESH 9
2012-04-12 22:35:56 +02:00
# define ATH_BCBUF 8
2009-02-09 13:26:54 +05:30
# define ATH_DEFAULT_BINTVAL 100 /* TU */
# define ATH_DEFAULT_BMISS_LIMIT 10
# define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024)
struct ath_beacon_config {
2011-02-07 17:10:39 -07:00
int beacon_interval ;
2009-02-09 13:26:54 +05:30
u16 listen_interval ;
u16 dtim_period ;
u16 bmiss_timeout ;
u8 dtim_count ;
2012-07-17 17:15:56 +05:30
bool enable_beacon ;
2013-02-04 15:38:24 +05:30
bool ibss_creator ;
2009-02-09 13:26:54 +05:30
} ;
struct ath_beacon {
enum {
OK , /* no change needed */
UPDATE , /* update pending */
COMMIT /* beacon sent, commit change */
} updateslot ; /* slot time update fsm */
u32 beaconq ;
u32 bmisscnt ;
2011-03-22 21:54:17 +01:00
u32 bc_tstamp ;
2009-03-03 19:23:26 +02:00
struct ieee80211_vif * bslot [ ATH_BCBUF ] ;
2009-02-09 13:26:54 +05:30
int slottime ;
int slotupdate ;
struct ath9k_tx_queue_info beacon_qi ;
struct ath_descdma bdma ;
struct ath_txq * cabq ;
struct list_head bbuf ;
2011-05-17 21:09:54 +02:00
bool tx_processed ;
bool tx_last ;
2009-02-09 13:26:54 +05:30
} ;
2012-07-17 17:16:22 +05:30
void ath9k_beacon_tasklet ( unsigned long data ) ;
2012-07-17 17:15:56 +05:30
bool ath9k_allow_beacon_config ( struct ath_softc * sc , struct ieee80211_vif * vif ) ;
void ath9k_beacon_config ( struct ath_softc * sc , struct ieee80211_vif * vif ,
u32 changed ) ;
2012-07-17 17:15:30 +05:30
void ath9k_beacon_assign_slot ( struct ath_softc * sc , struct ieee80211_vif * vif ) ;
void ath9k_beacon_remove_slot ( struct ath_softc * sc , struct ieee80211_vif * vif ) ;
2012-07-17 17:16:16 +05:30
void ath9k_set_tsfadjust ( struct ath_softc * sc , struct ieee80211_vif * vif ) ;
2012-07-17 17:15:56 +05:30
void ath9k_set_beacon ( struct ath_softc * sc ) ;
2009-02-09 13:26:54 +05:30
2012-06-04 20:23:37 +05:30
/*******************/
/* Link Monitoring */
/*******************/
2008-08-04 00:16:41 -07:00
2009-02-20 15:13:28 +05:30
# define ATH_STA_SHORT_CALINTERVAL 1000 /* 1 second */
# define ATH_AP_SHORT_CALINTERVAL 100 /* 100 ms */
2010-06-12 00:33:45 -04:00
# define ATH_ANI_POLLINTERVAL_OLD 100 /* 100 ms */
# define ATH_ANI_POLLINTERVAL_NEW 1000 /* 1000 ms */
2010-08-02 15:53:15 +02:00
# define ATH_LONG_CALINTERVAL_INT 1000 /* 1000 ms */
2009-02-20 15:13:28 +05:30
# define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */
# define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */
2012-10-10 23:03:02 +05:30
# define ATH_ANI_MAX_SKIP_COUNT 10
2008-08-04 00:16:41 -07:00
2010-06-24 02:42:44 -07:00
# define ATH_PAPRD_TIMEOUT 100 /* msecs */
2012-06-04 20:23:43 +05:30
# define ATH_PLL_WORK_INTERVAL 100
2010-06-24 02:42:44 -07:00
2012-06-04 20:23:37 +05:30
void ath_tx_complete_poll_work ( struct work_struct * work ) ;
2011-09-03 01:40:25 +02:00
void ath_reset_work ( struct work_struct * work ) ;
2010-07-02 00:09:52 +02:00
void ath_hw_check ( struct work_struct * work ) ;
2011-04-22 11:32:11 +05:30
void ath_hw_pll_work ( struct work_struct * work ) ;
2012-03-15 05:34:27 +05:30
void ath_rx_poll ( unsigned long data ) ;
void ath_start_rx_poll ( struct ath_softc * sc , u8 nbeacon ) ;
2010-06-12 00:34:01 -04:00
void ath_paprd_calibrate ( struct work_struct * work ) ;
2010-01-08 10:36:02 +05:30
void ath_ani_calibrate ( unsigned long data ) ;
2012-07-17 17:16:29 +05:30
void ath_start_ani ( struct ath_softc * sc ) ;
void ath_stop_ani ( struct ath_softc * sc ) ;
void ath_check_ani ( struct ath_softc * sc ) ;
2012-06-04 20:23:37 +05:30
int ath_update_survey_stats ( struct ath_softc * sc ) ;
void ath_update_survey_nf ( struct ath_softc * sc , int channel ) ;
2012-07-17 17:16:42 +05:30
void ath9k_queue_reset ( struct ath_softc * sc , enum ath_reset_type type ) ;
2010-01-08 10:36:02 +05:30
2010-01-08 10:36:00 +05:30
/**********/
/* BTCOEX */
/**********/
2012-11-19 14:24:46 +05:30
# define ATH_DUMP_BTCOEX(_s, _val) \
do { \
len + = snprintf ( buf + len , size - len , \
" %20s : %10d \n " , _s , ( _val ) ) ; \
} while ( 0 )
2012-06-04 16:27:58 +05:30
enum bt_op_flags {
BT_OP_PRIORITY_DETECTED ,
BT_OP_SCAN ,
} ;
2009-09-09 01:18:09 -07:00
struct ath_btcoex {
bool hw_timer_enabled ;
spinlock_t btcoex_lock ;
struct timer_list period_timer ; /* Timer for BT period */
u32 bt_priority_cnt ;
unsigned long bt_priority_time ;
2012-06-04 16:27:58 +05:30
unsigned long op_flags ;
2009-09-09 14:26:15 -07:00
int bt_stomp_type ; /* Types of BT stomping */
2009-09-09 01:18:09 -07:00
u32 btcoex_no_stomp ; /* in usec */
2012-09-04 19:33:33 +05:30
u32 btcoex_period ; /* in msec */
2010-01-21 11:17:27 +05:30
u32 btscan_no_stomp ; /* in usec */
2011-10-24 18:19:49 +05:30
u32 duty_cycle ;
2012-06-04 16:28:52 +05:30
u32 bt_wait_time ;
2012-10-12 14:07:25 +05:30
int rssi_count ;
2009-09-09 04:00:10 -07:00
struct ath_gen_timer * no_stomp_timer ; /* Timer for no BT stomping */
2011-10-24 18:19:49 +05:30
struct ath_mci_profile mci ;
2012-11-20 18:30:01 +05:30
u8 stomp_audio ;
2009-09-09 01:18:09 -07:00
} ;
2012-02-22 12:40:44 +05:30
# ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
2012-02-22 12:40:21 +05:30
int ath9k_init_btcoex ( struct ath_softc * sc ) ;
void ath9k_deinit_btcoex ( struct ath_softc * sc ) ;
2012-02-22 12:40:27 +05:30
void ath9k_start_btcoex ( struct ath_softc * sc ) ;
void ath9k_stop_btcoex ( struct ath_softc * sc ) ;
2010-01-08 10:36:00 +05:30
void ath9k_btcoex_timer_resume ( struct ath_softc * sc ) ;
void ath9k_btcoex_timer_pause ( struct ath_softc * sc ) ;
2012-02-22 12:40:32 +05:30
void ath9k_btcoex_handle_interrupt ( struct ath_softc * sc , u32 status ) ;
2012-02-22 12:40:38 +05:30
u16 ath9k_btcoex_aggr_limit ( struct ath_softc * sc , u32 max_4ms_framelen ) ;
2012-07-01 19:53:54 +05:30
void ath9k_btcoex_stop_gen_timer ( struct ath_softc * sc ) ;
2012-11-19 14:24:46 +05:30
int ath9k_dump_btcoex ( struct ath_softc * sc , u8 * buf , u32 size ) ;
2012-02-22 12:40:44 +05:30
# else
static inline int ath9k_init_btcoex ( struct ath_softc * sc )
{
return 0 ;
}
static inline void ath9k_deinit_btcoex ( struct ath_softc * sc )
{
}
static inline void ath9k_start_btcoex ( struct ath_softc * sc )
{
}
static inline void ath9k_stop_btcoex ( struct ath_softc * sc )
{
}
static inline void ath9k_btcoex_handle_interrupt ( struct ath_softc * sc ,
u32 status )
{
}
static inline u16 ath9k_btcoex_aggr_limit ( struct ath_softc * sc ,
u32 max_4ms_framelen )
{
return 0 ;
}
2012-07-01 19:53:54 +05:30
static inline void ath9k_btcoex_stop_gen_timer ( struct ath_softc * sc )
{
}
2012-11-19 14:24:46 +05:30
static inline int ath9k_dump_btcoex ( struct ath_softc * sc , u8 * buf , u32 size )
2012-10-25 17:16:54 +05:30
{
return 0 ;
}
2012-02-22 12:40:44 +05:30
# endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
2010-01-08 10:36:00 +05:30
2012-07-10 14:54:34 +05:30
struct ath9k_wow_pattern {
u8 pattern_bytes [ MAX_PATTERN_SIZE ] ;
u8 mask_bytes [ MAX_PATTERN_SIZE ] ;
u32 pattern_len ;
} ;
2009-02-09 13:26:54 +05:30
/********************/
/* LED Control */
/********************/
2008-08-04 00:16:41 -07:00
2009-08-14 11:30:52 +05:30
# define ATH_LED_PIN_DEF 1
# define ATH_LED_PIN_9287 8
2011-04-22 11:32:08 +05:30
# define ATH_LED_PIN_9300 10
2011-02-28 15:16:47 +05:30
# define ATH_LED_PIN_9485 6
2011-11-29 20:06:15 +05:30
# define ATH_LED_PIN_9462 4
2008-08-04 00:16:41 -07:00
2011-02-27 22:26:40 +01:00
# ifdef CONFIG_MAC80211_LEDS
2010-01-08 10:36:00 +05:30
void ath_init_leds ( struct ath_softc * sc ) ;
void ath_deinit_leds ( struct ath_softc * sc ) ;
2012-09-12 18:59:23 +05:30
void ath_fill_led_pin ( struct ath_softc * sc ) ;
2011-02-27 22:26:40 +01:00
# else
static inline void ath_init_leds ( struct ath_softc * sc )
{
}
static inline void ath_deinit_leds ( struct ath_softc * sc )
2012-09-12 18:59:23 +05:30
{
}
static inline void ath_fill_led_pin ( struct ath_softc * sc )
2011-02-27 22:26:40 +01:00
{
}
# endif
2012-06-04 20:23:49 +05:30
/*******************************/
2010-09-02 01:34:43 -07:00
/* Antenna diversity/combining */
2012-06-04 20:23:49 +05:30
/*******************************/
2010-09-02 01:34:43 -07:00
# define ATH_ANT_RX_CURRENT_SHIFT 4
# define ATH_ANT_RX_MAIN_SHIFT 2
# define ATH_ANT_RX_MASK 0x3
# define ATH_ANT_DIV_COMB_SHORT_SCAN_INTR 50
# define ATH_ANT_DIV_COMB_SHORT_SCAN_PKTCOUNT 0x100
# define ATH_ANT_DIV_COMB_MAX_PKTCOUNT 0x200
# define ATH_ANT_DIV_COMB_INIT_COUNT 95
# define ATH_ANT_DIV_COMB_MAX_COUNT 100
# define ATH_ANT_DIV_COMB_ALT_ANT_RATIO 30
# define ATH_ANT_DIV_COMB_ALT_ANT_RATIO2 20
# define ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA -1
# define ATH_ANT_DIV_COMB_LNA1_DELTA_HI -4
# define ATH_ANT_DIV_COMB_LNA1_DELTA_MID -2
# define ATH_ANT_DIV_COMB_LNA1_DELTA_LOW 2
enum ath9k_ant_div_comb_lna_conf {
ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2 ,
ATH_ANT_DIV_COMB_LNA2 ,
ATH_ANT_DIV_COMB_LNA1 ,
ATH_ANT_DIV_COMB_LNA1_PLUS_LNA2 ,
} ;
struct ath_ant_comb {
u16 count ;
u16 total_pkt_count ;
bool scan ;
bool scan_not_start ;
int main_total_rssi ;
int alt_total_rssi ;
int alt_recv_cnt ;
int main_recv_cnt ;
int rssi_lna1 ;
int rssi_lna2 ;
int rssi_add ;
int rssi_sub ;
int rssi_first ;
int rssi_second ;
int rssi_third ;
bool alt_good ;
int quick_scan_cnt ;
int main_conf ;
enum ath9k_ant_div_comb_lna_conf first_quick_scan_conf ;
enum ath9k_ant_div_comb_lna_conf second_quick_scan_conf ;
bool first_ratio ;
bool second_ratio ;
unsigned long scan_start_time ;
} ;
2012-06-04 20:23:49 +05:30
void ath_ant_comb_scan ( struct ath_softc * sc , struct ath_rx_status * rs ) ;
void ath_ant_comb_update ( struct ath_softc * sc ) ;
2009-02-09 13:26:54 +05:30
/********************/
/* Main driver core */
/********************/
2008-08-04 00:16:41 -07:00
2013-06-13 22:51:26 +05:30
# define ATH9K_PCI_CUS198 0x0001
2013-06-18 10:13:43 +05:30
# define ATH9K_PCI_CUS230 0x0002
2013-06-18 15:42:36 +05:30
# define ATH9K_PCI_CUS217 0x0004
2013-06-21 11:11:52 +05:30
# define ATH9K_PCI_WOW 0x0008
2013-06-13 22:51:26 +05:30
2009-02-09 13:26:54 +05:30
/*
* Default cache line size , in bytes .
* Used when PCI device not fully initialized by bootrom / BIOS
*/
# define DEFAULT_CACHELINE 32
# define ATH_REGCLASSIDS_MAX 10
# define ATH_CABQ_READY_TIME 80 /* % of beacon interval */
2011-12-14 22:08:03 +01:00
# define ATH_MAX_SW_RETRIES 30
2009-02-09 13:26:54 +05:30
# define ATH_CHAN_MAX 255
2008-10-29 10:16:30 +05:30
2009-02-09 13:26:54 +05:30
# define ATH_TXPOWER_MAX 100 /* .5 dBm units */
# define ATH_RATE_DUMMY_MARKER 0
2012-06-04 20:23:55 +05:30
enum sc_op_flags {
SC_OP_INVALID ,
SC_OP_BEACONS ,
SC_OP_ANI_RUN ,
SC_OP_PRIM_STA_VIF ,
2012-06-04 20:24:01 +05:30
SC_OP_HW_RESET ,
2013-05-08 05:03:31 +05:30
SC_OP_SCANNING ,
2012-06-04 20:23:55 +05:30
} ;
2010-01-08 10:36:05 +05:30
/* Powersave flags */
# define PS_WAIT_FOR_BEACON BIT(0)
# define PS_WAIT_FOR_CAB BIT(1)
# define PS_WAIT_FOR_PSPOLL_DATA BIT(2)
# define PS_WAIT_FOR_TX_ACK BIT(3)
# define PS_BEACON_SYNC BIT(4)
2012-10-10 23:03:02 +05:30
# define PS_WAIT_FOR_ANI BIT(5)
2009-02-09 13:26:54 +05:30
2009-11-23 22:21:01 +01:00
struct ath_rate_table ;
2009-03-03 19:23:28 +02:00
2011-01-15 19:13:48 +00:00
struct ath9k_vif_iter_data {
2013-04-16 12:51:57 +02:00
u8 hw_macaddr [ ETH_ALEN ] ; /* address of the first vif */
2011-01-15 19:13:48 +00:00
u8 mask [ ETH_ALEN ] ; /* bssid mask */
2013-04-16 12:51:57 +02:00
bool has_hw_macaddr ;
2011-01-15 19:13:48 +00:00
int naps ; /* number of AP vifs */
int nmeshes ; /* number of mesh vifs */
int nstations ; /* number of station vifs */
2011-06-15 18:01:11 -04:00
int nwds ; /* number of WDS vifs */
2011-01-15 19:13:48 +00:00
int nadhocs ; /* number of adhoc vifs */
} ;
2013-01-08 14:48:58 +01:00
/* enum spectral_mode:
*
* @ SPECTRAL_DISABLED : spectral mode is disabled
* @ SPECTRAL_BACKGROUND : hardware sends samples when it is not busy with
* something else .
* @ SPECTRAL_MANUAL : spectral scan is enabled , triggering for samples
* is performed manually .
* @ SPECTRAL_CHANSCAN : Like manual , but also triggered when changing channels
* during a channel scan .
*/
enum spectral_mode {
SPECTRAL_DISABLED = 0 ,
SPECTRAL_BACKGROUND ,
SPECTRAL_MANUAL ,
SPECTRAL_CHANSCAN ,
} ;
2009-02-09 13:26:54 +05:30
struct ath_softc {
struct ieee80211_hw * hw ;
struct device * dev ;
2009-03-03 19:23:29 +02:00
2010-10-10 18:21:52 +02:00
struct survey_info * cur_survey ;
struct survey_info survey [ ATH9K_NUM_CHANNELS ] ;
2009-03-03 19:23:32 +02:00
2009-02-09 13:26:54 +05:30
struct tasklet_struct intr_tq ;
struct tasklet_struct bcon_tasklet ;
2009-02-09 13:27:12 +05:30
struct ath_hw * sc_ah ;
2009-02-09 13:26:54 +05:30
void __iomem * mem ;
int irq ;
2009-03-17 15:01:30 -07:00
spinlock_t sc_serial_rw ;
2009-07-14 20:17:13 -04:00
spinlock_t sc_pm_lock ;
2010-10-26 15:27:24 -07:00
spinlock_t sc_pcu_lock ;
2009-02-09 13:26:54 +05:30
struct mutex mutex ;
2010-06-12 00:34:01 -04:00
struct work_struct paprd_work ;
2010-07-02 00:09:52 +02:00
struct work_struct hw_check_work ;
2011-09-03 01:40:25 +02:00
struct work_struct hw_reset_work ;
2010-06-12 00:34:01 -04:00
struct completion paprd_complete ;
2009-02-09 13:26:54 +05:30
2011-02-04 20:09:25 +01:00
unsigned int hw_busy_count ;
2012-06-04 20:23:55 +05:30
unsigned long sc_flags ;
2013-06-13 22:51:26 +05:30
unsigned long driver_data ;
2011-02-04 20:09:25 +01:00
2009-02-09 13:27:03 +05:30
u32 intrstatus ;
2010-01-08 10:36:05 +05:30
u16 ps_flags ; /* PS_* */
2009-02-09 13:27:03 +05:30
u16 curtxpow ;
2009-07-24 17:27:21 +02:00
bool ps_enabled ;
2010-01-29 16:56:51 +05:30
bool ps_idle ;
2011-01-15 19:13:48 +00:00
short nbcnvifs ;
short nvifs ;
2009-07-14 20:17:15 -04:00
unsigned long ps_usecount ;
2009-02-09 13:26:54 +05:30
2009-02-09 13:27:03 +05:30
struct ath_config config ;
2009-02-09 13:26:54 +05:30
struct ath_rx rx ;
struct ath_tx tx ;
struct ath_beacon beacon ;
struct ieee80211_supported_band sbands [ IEEE80211_NUM_BANDS ] ;
2011-02-27 22:26:40 +01:00
# ifdef CONFIG_MAC80211_LEDS
bool led_registered ;
char led_name [ 32 ] ;
struct led_classdev led_cdev ;
# endif
2009-02-09 13:26:54 +05:30
2011-01-24 19:23:18 +01:00
struct ath9k_hw_cal_data caldata ;
int last_rssi ;
2009-11-23 22:33:27 +01:00
# ifdef CONFIG_ATH9K_DEBUGFS
2009-02-09 13:27:03 +05:30
struct ath9k_debug debug ;
2009-02-09 13:26:54 +05:30
# endif
2009-05-15 18:59:22 +05:30
struct ath_beacon_config cur_beacon_conf ;
2009-07-14 20:17:09 -04:00
struct delayed_work tx_complete_work ;
2011-01-27 14:45:08 +05:30
struct delayed_work hw_pll_work ;
2012-03-15 05:34:27 +05:30
struct timer_list rx_poll_timer ;
2012-02-22 12:40:44 +05:30
# ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
2009-09-09 01:18:09 -07:00
struct ath_btcoex btcoex ;
2011-11-30 10:41:23 +05:30
struct ath_mci_coex mci_coex ;
2012-06-12 10:13:53 +05:30
struct work_struct mci_work ;
2012-02-22 12:40:44 +05:30
# endif
2010-04-15 17:39:34 -04:00
struct ath_descdma txsdma ;
2010-09-02 01:34:43 -07:00
struct ath_ant_comb ant_comb ;
2011-09-03 01:40:27 +02:00
u8 ant_tx , ant_rx ;
2012-04-03 17:15:50 +02:00
struct dfs_pattern_detector * dfs_detector ;
2012-07-10 14:56:52 +05:30
u32 wow_enabled ;
2013-01-08 14:48:58 +01:00
/* relay(fs) channel for spectral scan */
struct rchan * rfs_chan_spec_scan ;
enum spectral_mode spectral_mode ;
2013-01-23 17:38:04 +01:00
struct ath_spec_scan spec_config ;
2012-07-10 14:54:34 +05:30
# ifdef CONFIG_PM_SLEEP
atomic_t wow_got_bmiss_intr ;
atomic_t wow_sleep_proc_intr ; /* in the middle of WoW sleep ? */
u32 wow_intr_before_sleep ;
# endif
2009-02-09 13:26:54 +05:30
} ;
2013-01-08 14:48:58 +01:00
# define SPECTRAL_SCAN_BITMASK 0x10
/* Radar info packet format, used for DFS and spectral formats. */
struct ath_radar_info {
u8 pulse_length_pri ;
u8 pulse_length_ext ;
u8 pulse_bw_info ;
} __packed ;
/* The HT20 spectral data has 4 bytes of additional information at it's end.
*
* [ 7 : 0 ] : all bins { max_magnitude [ 1 : 0 ] , bitmap_weight [ 5 : 0 ] }
* [ 7 : 0 ] : all bins max_magnitude [ 9 : 2 ]
* [ 7 : 0 ] : all bins { max_index [ 5 : 0 ] , max_magnitude [ 11 : 10 ] }
* [ 3 : 0 ] : max_exp ( shift amount to size max bin to 8 - bit unsigned )
*/
struct ath_ht20_mag_info {
u8 all_bins [ 3 ] ;
u8 max_exp ;
} __packed ;
# define SPECTRAL_HT20_NUM_BINS 56
/* WARNING: don't actually use this struct! MAC may vary the amount of
* data by - 1 / + 2. This struct is for reference only .
*/
struct ath_ht20_fft_packet {
u8 data [ SPECTRAL_HT20_NUM_BINS ] ;
struct ath_ht20_mag_info mag_info ;
struct ath_radar_info radar_info ;
} __packed ;
# define SPECTRAL_HT20_TOTAL_DATA_LEN (sizeof(struct ath_ht20_fft_packet))
/* Dynamic 20/40 mode:
*
* [ 7 : 0 ] : lower bins { max_magnitude [ 1 : 0 ] , bitmap_weight [ 5 : 0 ] }
* [ 7 : 0 ] : lower bins max_magnitude [ 9 : 2 ]
* [ 7 : 0 ] : lower bins { max_index [ 5 : 0 ] , max_magnitude [ 11 : 10 ] }
* [ 7 : 0 ] : upper bins { max_magnitude [ 1 : 0 ] , bitmap_weight [ 5 : 0 ] }
* [ 7 : 0 ] : upper bins max_magnitude [ 9 : 2 ]
* [ 7 : 0 ] : upper bins { max_index [ 5 : 0 ] , max_magnitude [ 11 : 10 ] }
* [ 3 : 0 ] : max_exp ( shift amount to size max bin to 8 - bit unsigned )
*/
struct ath_ht20_40_mag_info {
u8 lower_bins [ 3 ] ;
u8 upper_bins [ 3 ] ;
u8 max_exp ;
} __packed ;
# define SPECTRAL_HT20_40_NUM_BINS 128
/* WARNING: don't actually use this struct! MAC may vary the amount of
* data . This struct is for reference only .
*/
struct ath_ht20_40_fft_packet {
u8 data [ SPECTRAL_HT20_40_NUM_BINS ] ;
struct ath_ht20_40_mag_info mag_info ;
struct ath_radar_info radar_info ;
} __packed ;
# define SPECTRAL_HT20_40_TOTAL_DATA_LEN (sizeof(struct ath_ht20_40_fft_packet))
/* grabs the max magnitude from the all/upper/lower bins */
static inline u16 spectral_max_magnitude ( u8 * bins )
{
return ( bins [ 0 ] & 0xc0 ) > > 6 |
( bins [ 1 ] & 0xff ) < < 2 |
( bins [ 2 ] & 0x03 ) < < 10 ;
}
/* return the max magnitude from the all/upper/lower bins */
static inline u8 spectral_max_index ( u8 * bins )
{
s8 m = ( bins [ 2 ] & 0xfc ) > > 2 ;
/* TODO: this still doesn't always report the right values ... */
if ( m > 32 )
m | = 0xe0 ;
else
m & = ~ 0xe0 ;
return m + 29 ;
}
/* return the bitmap weight from the all/upper/lower bins */
static inline u8 spectral_bitmap_weight ( u8 * bins )
{
return bins [ 0 ] & 0x3f ;
}
/* FFT sample format given to userspace via debugfs.
*
* Please keep the type / length at the front position and change
* other fields after adding another sample type
*
* TODO : this might need rework when switching to nl80211 - based
* interface .
*/
enum ath_fft_sample_type {
2013-01-23 20:12:39 +01:00
ATH_FFT_SAMPLE_HT20 = 1 ,
2013-01-08 14:48:58 +01:00
} ;
struct fft_sample_tlv {
u8 type ; /* see ath_fft_sample */
2013-01-31 10:26:48 +01:00
__be16 length ;
2013-01-08 14:48:58 +01:00
/* type dependent data follows */
} __packed ;
struct fft_sample_ht20 {
struct fft_sample_tlv tlv ;
2013-01-23 20:12:39 +01:00
u8 max_exp ;
2013-01-08 14:48:58 +01:00
2013-01-31 10:26:48 +01:00
__be16 freq ;
2013-01-08 14:48:58 +01:00
s8 rssi ;
s8 noise ;
2013-01-31 10:26:48 +01:00
__be16 max_magnitude ;
2013-01-08 14:48:58 +01:00
u8 max_index ;
u8 bitmap_weight ;
2013-01-31 10:26:48 +01:00
__be64 tsf ;
2013-01-08 14:48:58 +01:00
2013-01-23 20:12:39 +01:00
u8 data [ SPECTRAL_HT20_NUM_BINS ] ;
2013-01-08 14:48:58 +01:00
} __packed ;
2010-01-08 10:36:02 +05:30
void ath9k_tasklet ( unsigned long data ) ;
2009-02-09 13:26:54 +05:30
int ath_cabq_update ( struct ath_softc * ) ;
2009-09-14 00:55:09 -07:00
static inline void ath_read_cachesize ( struct ath_common * common , int * csz )
2009-02-09 13:26:54 +05:30
{
2009-09-14 00:55:09 -07:00
common - > bus_ops - > read_cachesize ( common , csz ) ;
2009-02-09 13:26:54 +05:30
}
extern struct ieee80211_ops ath9k_ops ;
2011-01-05 09:39:17 -05:00
extern int ath9k_modparam_nohwcrypt ;
2010-06-22 11:52:37 +05:30
extern int led_blink ;
2010-12-20 14:39:51 +05:30
extern bool is_ath9k_unloaded ;
2009-02-09 13:26:54 +05:30
2012-06-25 07:15:22 +02:00
u8 ath9k_parse_mpdudensity ( u8 mpdudensity ) ;
2009-02-09 13:26:54 +05:30
irqreturn_t ath_isr ( int irq , void * dev ) ;
2011-07-23 03:55:39 -04:00
int ath9k_init_device ( u16 devid , struct ath_softc * sc ,
2009-09-14 00:55:09 -07:00
const struct ath_bus_ops * bus_ops ) ;
2010-01-08 10:36:07 +05:30
void ath9k_deinit_device ( struct ath_softc * sc ) ;
void ath9k_set_hw_capab ( struct ath_softc * sc , struct ieee80211_hw * hw ) ;
2011-09-03 01:40:27 +02:00
void ath9k_reload_chainmask_settings ( struct ath_softc * sc ) ;
2009-11-02 14:35:42 -08:00
2011-01-15 19:13:48 +00:00
bool ath9k_uses_beacons ( int type ) ;
2013-01-08 14:48:58 +01:00
void ath9k_spectral_scan_trigger ( struct ieee80211_hw * hw ) ;
int ath9k_spectral_scan_config ( struct ieee80211_hw * hw ,
enum spectral_mode spectral_mode ) ;
2009-02-09 13:26:54 +05:30
2011-04-12 18:23:16 +02:00
# ifdef CONFIG_ATH9K_PCI
2009-02-09 13:26:54 +05:30
int ath_pci_init ( void ) ;
void ath_pci_exit ( void ) ;
# else
static inline int ath_pci_init ( void ) { return 0 ; } ;
static inline void ath_pci_exit ( void ) { } ;
2008-10-29 10:16:30 +05:30
# endif
2011-04-12 18:23:16 +02:00
# ifdef CONFIG_ATH9K_AHB
2009-02-09 13:26:54 +05:30
int ath_ahb_init ( void ) ;
void ath_ahb_exit ( void ) ;
# else
static inline int ath_ahb_init ( void ) { return 0 ; } ;
static inline void ath_ahb_exit ( void ) { } ;
2008-08-04 00:16:41 -07:00
# endif
2009-02-09 13:26:54 +05:30
2009-07-14 20:17:14 -04:00
void ath9k_ps_wakeup ( struct ath_softc * sc ) ;
void ath9k_ps_restore ( struct ath_softc * sc ) ;
2009-03-03 19:23:27 +02:00
2010-11-23 20:42:27 +05:30
u8 ath_txchainmask_reduction ( struct ath_softc * sc , u8 chainmask , u32 rate ) ;
2010-01-08 10:36:00 +05:30
void ath_start_rfkill_poll ( struct ath_softc * sc ) ;
extern void ath9k_rfkill_poll_state ( struct ieee80211_hw * hw ) ;
2011-01-15 19:13:48 +00:00
void ath9k_calculate_iter_data ( struct ieee80211_hw * hw ,
struct ieee80211_vif * vif ,
struct ath9k_vif_iter_data * iter_data ) ;
2009-02-09 13:26:54 +05:30
# endif /* ATH9K_H */