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 #include "driver-ops.h" 21 22 struct rate_control_ref { 23 const 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 void rate_control_tx_status(struct ieee80211_local *local, 32 struct ieee80211_supported_band *sband, 33 struct ieee80211_tx_status *st); 34 35 void rate_control_rate_init(struct sta_info *sta); 36 void rate_control_rate_update(struct ieee80211_local *local, 37 struct ieee80211_supported_band *sband, 38 struct sta_info *sta, u32 changed); 39 40 static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, 41 struct sta_info *sta, gfp_t gfp) 42 { 43 spin_lock_init(&sta->rate_ctrl_lock); 44 return ref->ops->alloc_sta(ref->priv, &sta->sta, gfp); 45 } 46 47 static inline void rate_control_free_sta(struct sta_info *sta) 48 { 49 struct rate_control_ref *ref = sta->rate_ctrl; 50 struct ieee80211_sta *ista = &sta->sta; 51 void *priv_sta = sta->rate_ctrl_priv; 52 53 ref->ops->free_sta(ref->priv, ista, priv_sta); 54 } 55 56 static inline void rate_control_add_sta_debugfs(struct sta_info *sta) 57 { 58 #ifdef CONFIG_MAC80211_DEBUGFS 59 struct rate_control_ref *ref = sta->rate_ctrl; 60 if (ref && sta->debugfs_dir && ref->ops->add_sta_debugfs) 61 ref->ops->add_sta_debugfs(ref->priv, sta->rate_ctrl_priv, 62 sta->debugfs_dir); 63 #endif 64 } 65 66 static inline void rate_control_remove_sta_debugfs(struct sta_info *sta) 67 { 68 #ifdef CONFIG_MAC80211_DEBUGFS 69 struct rate_control_ref *ref = sta->rate_ctrl; 70 if (ref && ref->ops->remove_sta_debugfs) 71 ref->ops->remove_sta_debugfs(ref->priv, sta->rate_ctrl_priv); 72 #endif 73 } 74 75 void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata); 76 77 /* Get a reference to the rate control algorithm. If `name' is NULL, get the 78 * first available algorithm. */ 79 int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, 80 const char *name); 81 void rate_control_deinitialize(struct ieee80211_local *local); 82 83 84 /* Rate control algorithms */ 85 #ifdef CONFIG_MAC80211_RC_MINSTREL 86 int rc80211_minstrel_init(void); 87 void rc80211_minstrel_exit(void); 88 #else 89 static inline int rc80211_minstrel_init(void) 90 { 91 return 0; 92 } 93 static inline void rc80211_minstrel_exit(void) 94 { 95 } 96 #endif 97 98 #ifdef CONFIG_MAC80211_RC_MINSTREL_HT 99 int rc80211_minstrel_ht_init(void); 100 void rc80211_minstrel_ht_exit(void); 101 #else 102 static inline int rc80211_minstrel_ht_init(void) 103 { 104 return 0; 105 } 106 static inline void rc80211_minstrel_ht_exit(void) 107 { 108 } 109 #endif 110 111 112 #endif /* IEEE80211_RATE_H */ 113