1 /* 2 * Copyright 2002-2005, Instant802 Networks, Inc. 3 * Copyright 2005, Devicescape Software, Inc. 4 * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11 #ifndef IEEE80211_RATE_H 12 #define IEEE80211_RATE_H 13 14 #include <linux/netdevice.h> 15 #include <linux/skbuff.h> 16 #include <linux/types.h> 17 #include <net/mac80211.h> 18 #include "ieee80211_i.h" 19 #include "sta_info.h" 20 21 struct rate_control_ref { 22 struct ieee80211_local *local; 23 struct rate_control_ops *ops; 24 void *priv; 25 }; 26 27 void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, 28 struct sta_info *sta, 29 struct ieee80211_tx_rate_control *txrc); 30 31 static inline void rate_control_tx_status(struct ieee80211_local *local, 32 struct ieee80211_supported_band *sband, 33 struct sta_info *sta, 34 struct sk_buff *skb) 35 { 36 struct rate_control_ref *ref = local->rate_ctrl; 37 struct ieee80211_sta *ista = &sta->sta; 38 void *priv_sta = sta->rate_ctrl_priv; 39 40 if (!ref) 41 return; 42 43 ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb); 44 } 45 46 47 static inline void rate_control_rate_init(struct sta_info *sta) 48 { 49 struct ieee80211_local *local = sta->sdata->local; 50 struct rate_control_ref *ref = sta->rate_ctrl; 51 struct ieee80211_sta *ista = &sta->sta; 52 void *priv_sta = sta->rate_ctrl_priv; 53 struct ieee80211_supported_band *sband; 54 55 if (!ref) 56 return; 57 58 sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; 59 60 ref->ops->rate_init(ref->priv, sband, ista, priv_sta); 61 } 62 63 static inline void rate_control_rate_update(struct ieee80211_local *local, 64 struct ieee80211_supported_band *sband, 65 struct sta_info *sta, u32 changed, 66 enum nl80211_channel_type oper_chan_type) 67 { 68 struct rate_control_ref *ref = local->rate_ctrl; 69 struct ieee80211_sta *ista = &sta->sta; 70 void *priv_sta = sta->rate_ctrl_priv; 71 72 if (ref && ref->ops->rate_update) 73 ref->ops->rate_update(ref->priv, sband, ista, 74 priv_sta, changed, oper_chan_type); 75 } 76 77 static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, 78 struct ieee80211_sta *sta, 79 gfp_t gfp) 80 { 81 return ref->ops->alloc_sta(ref->priv, sta, gfp); 82 } 83 84 static inline void rate_control_free_sta(struct sta_info *sta) 85 { 86 struct rate_control_ref *ref = sta->rate_ctrl; 87 struct ieee80211_sta *ista = &sta->sta; 88 void *priv_sta = sta->rate_ctrl_priv; 89 90 ref->ops->free_sta(ref->priv, ista, priv_sta); 91 } 92 93 static inline void rate_control_add_sta_debugfs(struct sta_info *sta) 94 { 95 #ifdef CONFIG_MAC80211_DEBUGFS 96 struct rate_control_ref *ref = sta->rate_ctrl; 97 if (ref && sta->debugfs.dir && ref->ops->add_sta_debugfs) 98 ref->ops->add_sta_debugfs(ref->priv, sta->rate_ctrl_priv, 99 sta->debugfs.dir); 100 #endif 101 } 102 103 static inline void rate_control_remove_sta_debugfs(struct sta_info *sta) 104 { 105 #ifdef CONFIG_MAC80211_DEBUGFS 106 struct rate_control_ref *ref = sta->rate_ctrl; 107 if (ref && ref->ops->remove_sta_debugfs) 108 ref->ops->remove_sta_debugfs(ref->priv, sta->rate_ctrl_priv); 109 #endif 110 } 111 112 /* Get a reference to the rate control algorithm. If `name' is NULL, get the 113 * first available algorithm. */ 114 int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, 115 const char *name); 116 void rate_control_deinitialize(struct ieee80211_local *local); 117 118 119 /* Rate control algorithms */ 120 #ifdef CONFIG_MAC80211_RC_PID 121 extern int rc80211_pid_init(void); 122 extern void rc80211_pid_exit(void); 123 #else 124 static inline int rc80211_pid_init(void) 125 { 126 return 0; 127 } 128 static inline void rc80211_pid_exit(void) 129 { 130 } 131 #endif 132 133 #ifdef CONFIG_MAC80211_RC_MINSTREL 134 extern int rc80211_minstrel_init(void); 135 extern void rc80211_minstrel_exit(void); 136 #else 137 static inline int rc80211_minstrel_init(void) 138 { 139 return 0; 140 } 141 static inline void rc80211_minstrel_exit(void) 142 { 143 } 144 #endif 145 146 #ifdef CONFIG_MAC80211_RC_MINSTREL_HT 147 extern int rc80211_minstrel_ht_init(void); 148 extern void rc80211_minstrel_ht_exit(void); 149 #else 150 static inline int rc80211_minstrel_ht_init(void) 151 { 152 return 0; 153 } 154 static inline void rc80211_minstrel_ht_exit(void) 155 { 156 } 157 #endif 158 159 160 #endif /* IEEE80211_RATE_H */ 161