2007-05-05 11:45:53 -07: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>
2008-02-25 16:27:46 +01:00
# include <linux/kref.h>
2007-05-05 11:45:53 -07:00
# include <net/mac80211.h>
# include "ieee80211_i.h"
# include "sta_info.h"
struct rate_control_ref {
2008-09-18 18:14:18 +02:00
struct ieee80211_local * local ;
2007-05-05 11:45:53 -07:00
struct rate_control_ops * ops ;
void * priv ;
struct kref kref ;
} ;
/* Get a reference to the rate control algorithm. If `name' is NULL, get the
* first available algorithm . */
struct rate_control_ref * rate_control_alloc ( const char * name ,
struct ieee80211_local * local ) ;
2008-09-18 18:14:18 +02:00
void rate_control_get_rate ( struct ieee80211_sub_if_data * sdata ,
2008-10-21 12:40:02 +02:00
struct sta_info * sta ,
struct ieee80211_tx_rate_control * txrc ) ;
2007-05-05 11:45:53 -07:00
struct rate_control_ref * rate_control_get ( struct rate_control_ref * ref ) ;
void rate_control_put ( struct rate_control_ref * ref ) ;
2008-09-18 18:14:18 +02:00
static inline void rate_control_tx_status ( struct ieee80211_local * local ,
struct ieee80211_supported_band * sband ,
struct sta_info * sta ,
2008-05-15 12:55:29 +02:00
struct sk_buff * skb )
2007-05-05 11:45:53 -07:00
{
struct rate_control_ref * ref = local - > rate_ctrl ;
2008-09-18 18:14:18 +02:00
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
2009-03-23 14:10:22 +01:00
struct ieee80211_tx_info * info = IEEE80211_SKB_CB ( skb ) ;
2007-05-05 11:45:53 -07:00
2009-03-23 14:10:22 +01:00
if ( likely ( info - > flags & IEEE80211_TX_INTFL_RCALGO ) )
ref - > ops - > tx_status ( ref - > priv , sband , ista , priv_sta , skb ) ;
2007-05-05 11:45:53 -07:00
}
2008-09-18 18:14:18 +02:00
static inline void rate_control_rate_init ( struct sta_info * sta )
2007-05-05 11:45:53 -07:00
{
2008-09-18 18:14:18 +02:00
struct ieee80211_local * local = sta - > sdata - > local ;
2007-05-05 11:45:53 -07:00
struct rate_control_ref * ref = sta - > rate_ctrl ;
2008-09-18 18:14:18 +02:00
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
struct ieee80211_supported_band * sband ;
2009-11-17 18:18:36 +01:00
if ( ! ref )
return ;
2008-09-18 18:14:18 +02:00
sband = local - > hw . wiphy - > bands [ local - > hw . conf . channel - > band ] ;
ref - > ops - > rate_init ( ref - > priv , sband , ista , priv_sta ) ;
2007-05-05 11:45:53 -07:00
}
2009-02-12 11:38:37 +05:30
static inline void rate_control_rate_update ( struct ieee80211_local * local ,
struct ieee80211_supported_band * sband ,
struct sta_info * sta , u32 changed )
{
struct rate_control_ref * ref = local - > rate_ctrl ;
struct ieee80211_sta * ista = & sta - > sta ;
void * priv_sta = sta - > rate_ctrl_priv ;
2009-11-17 18:18:36 +01:00
if ( ref & & ref - > ops - > rate_update )
2009-02-12 11:38:37 +05:30
ref - > ops - > rate_update ( ref - > priv , sband , ista ,
priv_sta , changed ) ;
}
2007-05-05 11:45:53 -07:00
static inline void * rate_control_alloc_sta ( struct rate_control_ref * ref ,
2008-09-18 18:14:18 +02:00
struct ieee80211_sta * sta ,
2007-05-05 11:45:53 -07:00
gfp_t gfp )
{
2008-09-18 18:14:18 +02:00
return ref - > ops - > alloc_sta ( ref - > priv , sta , gfp ) ;
2007-05-05 11:45:53 -07:00
}
2008-09-18 18:14:18 +02:00
static inline void rate_control_free_sta ( struct sta_info * sta )
2007-05-05 11:45:53 -07:00
{
2008-09-18 18:14:18 +02: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 11:45:53 -07:00
}
2007-05-05 11:46:38 -07: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 18:18:36 +01:00
if ( ref & & sta - > debugfs . dir & & ref - > ops - > add_sta_debugfs )
2007-05-05 11:46:38 -07: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 18:18:36 +01:00
if ( ref & & ref - > ops - > remove_sta_debugfs )
2007-05-05 11:46:38 -07:00
ref - > ops - > remove_sta_debugfs ( ref - > priv , sta - > rate_ctrl_priv ) ;
# endif
}
2007-07-27 15:43:23 +02:00
/* functions for rate control related to a device */
int ieee80211_init_rate_ctrl_alg ( struct ieee80211_local * local ,
const char * name ) ;
void rate_control_deinitialize ( struct ieee80211_local * local ) ;
2008-01-02 15:17:03 +01:00
/* Rate control algorithms */
2008-06-26 13:38:13 +03:00
# ifdef CONFIG_MAC80211_RC_PID
2008-01-02 15:17:03 +01: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 18:07:45 +02: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
2007-05-05 11:45:53 -07:00
# endif /* IEEE80211_RATE_H */