1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 22c8dccc7SJohannes Berg /* 32c8dccc7SJohannes Berg * Copyright 2002-2005, Instant802 Networks, Inc. 42c8dccc7SJohannes Berg * Copyright 2005, Devicescape Software, Inc. 52c8dccc7SJohannes Berg * Copyright (c) 2006 Jiri Benc <jbenc@suse.cz> 62c8dccc7SJohannes Berg */ 72c8dccc7SJohannes Berg 82c8dccc7SJohannes Berg #ifndef IEEE80211_RATE_H 92c8dccc7SJohannes Berg #define IEEE80211_RATE_H 102c8dccc7SJohannes Berg 112c8dccc7SJohannes Berg #include <linux/netdevice.h> 122c8dccc7SJohannes Berg #include <linux/skbuff.h> 132c8dccc7SJohannes Berg #include <linux/types.h> 142c8dccc7SJohannes Berg #include <net/mac80211.h> 152c8dccc7SJohannes Berg #include "ieee80211_i.h" 162c8dccc7SJohannes Berg #include "sta_info.h" 178f727ef3SJohannes Berg #include "driver-ops.h" 182c8dccc7SJohannes Berg 192c8dccc7SJohannes Berg struct rate_control_ref { 20631ad703SJohannes Berg const struct rate_control_ops *ops; 212c8dccc7SJohannes Berg void *priv; 222c8dccc7SJohannes Berg }; 232c8dccc7SJohannes Berg 244b7679a5SJohannes Berg void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, 25e6a9854bSJohannes Berg struct sta_info *sta, 26e6a9854bSJohannes Berg struct ieee80211_tx_rate_control *txrc); 272c8dccc7SJohannes Berg 2818fb84d9SFelix Fietkau void rate_control_tx_status(struct ieee80211_local *local, 294b7679a5SJohannes Berg struct ieee80211_supported_band *sband, 3018fb84d9SFelix Fietkau struct ieee80211_tx_status *st); 312c8dccc7SJohannes Berg 32eb6d9293SDenys Vlasenko void rate_control_rate_init(struct sta_info *sta); 33eb6d9293SDenys Vlasenko void rate_control_rate_update(struct ieee80211_local *local, 3481cb7623SSujith struct ieee80211_supported_band *sband, 35eb6d9293SDenys Vlasenko struct sta_info *sta, u32 changed); 362c8dccc7SJohannes Berg 372c8dccc7SJohannes Berg static inline void *rate_control_alloc_sta(struct rate_control_ref *ref, 3835c347acSJohannes Berg struct sta_info *sta, gfp_t gfp) 392c8dccc7SJohannes Berg { 4035c347acSJohannes Berg spin_lock_init(&sta->rate_ctrl_lock); 4135c347acSJohannes Berg return ref->ops->alloc_sta(ref->priv, &sta->sta, gfp); 422c8dccc7SJohannes Berg } 432c8dccc7SJohannes Berg 444b7679a5SJohannes Berg static inline void rate_control_free_sta(struct sta_info *sta) 452c8dccc7SJohannes Berg { 464b7679a5SJohannes Berg struct rate_control_ref *ref = sta->rate_ctrl; 474b7679a5SJohannes Berg struct ieee80211_sta *ista = &sta->sta; 484b7679a5SJohannes Berg void *priv_sta = sta->rate_ctrl_priv; 494b7679a5SJohannes Berg 504b7679a5SJohannes Berg ref->ops->free_sta(ref->priv, ista, priv_sta); 512c8dccc7SJohannes Berg } 522c8dccc7SJohannes Berg 532c8dccc7SJohannes Berg static inline void rate_control_add_sta_debugfs(struct sta_info *sta) 542c8dccc7SJohannes Berg { 552c8dccc7SJohannes Berg #ifdef CONFIG_MAC80211_DEBUGFS 562c8dccc7SJohannes Berg struct rate_control_ref *ref = sta->rate_ctrl; 57fc4a25c5SJohannes Berg if (ref && sta->debugfs_dir && ref->ops->add_sta_debugfs) 582c8dccc7SJohannes Berg ref->ops->add_sta_debugfs(ref->priv, sta->rate_ctrl_priv, 59fc4a25c5SJohannes Berg sta->debugfs_dir); 602c8dccc7SJohannes Berg #endif 612c8dccc7SJohannes Berg } 622c8dccc7SJohannes Berg 63*6cb5f3eaSJohannes Berg extern const struct file_operations rcname_ops; 64*6cb5f3eaSJohannes Berg 65*6cb5f3eaSJohannes Berg static inline void rate_control_add_debugfs(struct ieee80211_local *local) 66*6cb5f3eaSJohannes Berg { 67*6cb5f3eaSJohannes Berg #ifdef CONFIG_MAC80211_DEBUGFS 68*6cb5f3eaSJohannes Berg struct dentry *debugfsdir; 69*6cb5f3eaSJohannes Berg 70*6cb5f3eaSJohannes Berg if (!local->rate_ctrl) 71*6cb5f3eaSJohannes Berg return; 72*6cb5f3eaSJohannes Berg 73*6cb5f3eaSJohannes Berg if (!local->rate_ctrl->ops->add_debugfs) 74*6cb5f3eaSJohannes Berg return; 75*6cb5f3eaSJohannes Berg 76*6cb5f3eaSJohannes Berg debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir); 77*6cb5f3eaSJohannes Berg local->debugfs.rcdir = debugfsdir; 78*6cb5f3eaSJohannes Berg debugfs_create_file("name", 0400, debugfsdir, 79*6cb5f3eaSJohannes Berg local->rate_ctrl, &rcname_ops); 80*6cb5f3eaSJohannes Berg 81*6cb5f3eaSJohannes Berg local->rate_ctrl->ops->add_debugfs(&local->hw, local->rate_ctrl->priv, 82*6cb5f3eaSJohannes Berg debugfsdir); 83*6cb5f3eaSJohannes Berg #endif 84*6cb5f3eaSJohannes Berg } 85*6cb5f3eaSJohannes Berg 86e8e4f528SJohannes Berg void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata); 87e8e4f528SJohannes Berg 88209c671dSAndres Salomon /* Get a reference to the rate control algorithm. If `name' is NULL, get the 89209c671dSAndres Salomon * first available algorithm. */ 902c8dccc7SJohannes Berg int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local, 912c8dccc7SJohannes Berg const char *name); 922c8dccc7SJohannes Berg void rate_control_deinitialize(struct ieee80211_local *local); 932c8dccc7SJohannes Berg 942c8dccc7SJohannes Berg 952c8dccc7SJohannes Berg /* Rate control algorithms */ 96cccf129fSFelix Fietkau #ifdef CONFIG_MAC80211_RC_MINSTREL 97c1b1203dSJoe Perches int rc80211_minstrel_init(void); 98c1b1203dSJoe Perches void rc80211_minstrel_exit(void); 99cccf129fSFelix Fietkau #else 100cccf129fSFelix Fietkau static inline int rc80211_minstrel_init(void) 101cccf129fSFelix Fietkau { 102cccf129fSFelix Fietkau return 0; 103cccf129fSFelix Fietkau } 104cccf129fSFelix Fietkau static inline void rc80211_minstrel_exit(void) 105cccf129fSFelix Fietkau { 106cccf129fSFelix Fietkau } 107cccf129fSFelix Fietkau #endif 108cccf129fSFelix Fietkau 109cccf129fSFelix Fietkau 1102c8dccc7SJohannes Berg #endif /* IEEE80211_RATE_H */ 111