2007-05-05 22:45:53 +04:00
/*
* Copyright 2002 - 2005 , Instant802 Networks , Inc .
* Copyright 2005 , Devicescape Software , Inc .
* Copyright ( c ) 2006 Jiri Benc < jbenc @ suse . cz >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef IEEE80211_RATE_H
# define IEEE80211_RATE_H
# include <linux/netdevice.h>
# include <linux/skbuff.h>
# include <linux/types.h>
# include <net/mac80211.h>
# include "ieee80211_i.h"
# include "sta_info.h"
struct rate_control_ref {
2008-09-18 20:14:18 +04:00
struct ieee80211_local * local ;
2007-05-05 22:45:53 +04:00
struct rate_control_ops * ops ;
void * priv ;
} ;
2008-09-18 20:14:18 +04:00
void rate_control_get_rate ( struct ieee80211_sub_if_data * sdata ,
2008-10-21 14:40:02 +04:00
struct sta_info * sta ,
struct ieee80211_tx_rate_control * txrc ) ;
2007-05-05 22:45:53 +04:00
2008-09-18 20:14:18 +04:00
static inline void rate_control_tx_status ( struct ieee80211_local * local ,
struct ieee80211_supported_band * sband ,
struct sta_info * sta ,
2008-05-15 14:55:29 +04:00
struct sk_buff * skb )
2007-05-05 22:45:53 +04:00
{
struct rate_control_ref * ref = local - > rate_ctrl ;
2008-09-18 20:14:18 +04:00
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
2010-02-01 16:19:07 +03:00
if ( ! ref )
return ;
2010-01-06 14:09:08 +03:00
ref - > ops - > tx_status ( ref - > priv , sband , ista , priv_sta , skb ) ;
2007-05-05 22:45:53 +04:00
}
2008-09-18 20:14:18 +04:00
static inline void rate_control_rate_init ( struct sta_info * sta )
2007-05-05 22:45:53 +04:00
{
2008-09-18 20:14:18 +04:00
struct ieee80211_local * local = sta - > sdata - > local ;
2007-05-05 22:45:53 +04:00
struct rate_control_ref * ref = sta - > rate_ctrl ;
2008-09-18 20:14:18 +04:00
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
struct ieee80211_supported_band * sband ;
2009-11-17 20:18:36 +03:00
if ( ! ref )
return ;
2008-09-18 20:14:18 +04:00
sband = local - > hw . wiphy - > bands [ local - > hw . conf . channel - > band ] ;
ref - > ops - > rate_init ( ref - > priv , sband , ista , priv_sta ) ;
2007-05-05 22:45:53 +04:00
}
2009-02-12 09:08:37 +03:00
static inline void rate_control_rate_update ( struct ieee80211_local * local ,
struct ieee80211_supported_band * sband ,
2010-03-01 12:12:57 +03:00
struct sta_info * sta , u32 changed ,
enum nl80211_channel_type oper_chan_type )
2009-02-12 09:08:37 +03:00
{
struct rate_control_ref * ref = local - > rate_ctrl ;
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
2009-11-17 20:18:36 +03:00
if ( ref & & ref - > ops - > rate_update )
2009-02-12 09:08:37 +03:00
ref - > ops - > rate_update ( ref - > priv , sband , ista ,
2010-03-01 12:12:57 +03:00
priv_sta , changed , oper_chan_type ) ;
2009-02-12 09:08:37 +03:00
}
2007-05-05 22:45:53 +04:00
static inline void * rate_control_alloc_sta ( struct rate_control_ref * ref ,
2008-09-18 20:14:18 +04:00
struct ieee80211_sta * sta ,
2007-05-05 22:45:53 +04:00
gfp_t gfp )
{
2008-09-18 20:14:18 +04:00
return ref - > ops - > alloc_sta ( ref - > priv , sta , gfp ) ;
2007-05-05 22:45:53 +04:00
}
2008-09-18 20:14:18 +04:00
static inline void rate_control_free_sta ( struct sta_info * sta )
2007-05-05 22:45:53 +04:00
{
2008-09-18 20:14:18 +04:00
struct rate_control_ref * ref = sta - > rate_ctrl ;
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
ref - > ops - > free_sta ( ref - > priv , ista , priv_sta ) ;
2007-05-05 22:45:53 +04:00
}
2007-05-05 22:46:38 +04:00
static inline void rate_control_add_sta_debugfs ( struct sta_info * sta )
{
# ifdef CONFIG_MAC80211_DEBUGFS
struct rate_control_ref * ref = sta - > rate_ctrl ;
2009-11-17 20:18:36 +03:00
if ( ref & & sta - > debugfs . dir & & ref - > ops - > add_sta_debugfs )
2007-05-05 22:46:38 +04:00
ref - > ops - > add_sta_debugfs ( ref - > priv , sta - > rate_ctrl_priv ,
sta - > debugfs . dir ) ;
# endif
}
static inline void rate_control_remove_sta_debugfs ( struct sta_info * sta )
{
# ifdef CONFIG_MAC80211_DEBUGFS
struct rate_control_ref * ref = sta - > rate_ctrl ;
2009-11-17 20:18:36 +03:00
if ( ref & & ref - > ops - > remove_sta_debugfs )
2007-05-05 22:46:38 +04:00
ref - > ops - > remove_sta_debugfs ( ref - > priv , sta - > rate_ctrl_priv ) ;
# endif
}
2010-02-08 05:47:50 +03:00
/* Get a reference to the rate control algorithm. If `name' is NULL, get the
* first available algorithm . */
2007-07-27 17:43:23 +04:00
int ieee80211_init_rate_ctrl_alg ( struct ieee80211_local * local ,
const char * name ) ;
void rate_control_deinitialize ( struct ieee80211_local * local ) ;
2008-01-02 17:17:03 +03:00
/* Rate control algorithms */
2008-06-26 14:38:13 +04:00
# ifdef CONFIG_MAC80211_RC_PID
2008-01-02 17:17:03 +03:00
extern int rc80211_pid_init ( void ) ;
extern void rc80211_pid_exit ( void ) ;
# else
static inline int rc80211_pid_init ( void )
{
return 0 ;
}
static inline void rc80211_pid_exit ( void )
{
}
# endif
2008-10-05 20:07:45 +04:00
# ifdef CONFIG_MAC80211_RC_MINSTREL
extern int rc80211_minstrel_init ( void ) ;
extern void rc80211_minstrel_exit ( void ) ;
# else
static inline int rc80211_minstrel_init ( void )
{
return 0 ;
}
static inline void rc80211_minstrel_exit ( void )
{
}
# endif
2010-05-13 18:48:03 +04:00
# ifdef CONFIG_MAC80211_RC_MINSTREL_HT
extern int rc80211_minstrel_ht_init ( void ) ;
extern void rc80211_minstrel_ht_exit ( void ) ;
# else
static inline int rc80211_minstrel_ht_init ( void )
{
return 0 ;
}
static inline void rc80211_minstrel_ht_exit ( void )
{
}
# endif
2008-10-05 20:07:45 +04:00
2007-05-05 22:45:53 +04:00
# endif /* IEEE80211_RATE_H */