• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/net/mac80211/
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 <linux/kref.h>
18#include <net/mac80211.h>
19#include "ieee80211_i.h"
20#include "sta_info.h"
21
22struct rate_control_ref {
23	struct ieee80211_local *local;
24	struct rate_control_ops *ops;
25	void *priv;
26	struct kref kref;
27};
28
29void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
30			   struct sta_info *sta,
31			   struct ieee80211_tx_rate_control *txrc);
32struct rate_control_ref *rate_control_get(struct rate_control_ref *ref);
33void rate_control_put(struct rate_control_ref *ref);
34
35static inline void rate_control_tx_status(struct ieee80211_local *local,
36					  struct ieee80211_supported_band *sband,
37					  struct sta_info *sta,
38					  struct sk_buff *skb)
39{
40	struct rate_control_ref *ref = local->rate_ctrl;
41	struct ieee80211_sta *ista = &sta->sta;
42	void *priv_sta = sta->rate_ctrl_priv;
43
44	if (!ref)
45		return;
46
47	ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb);
48}
49
50
51static inline void rate_control_rate_init(struct sta_info *sta)
52{
53	struct ieee80211_local *local = sta->sdata->local;
54	struct rate_control_ref *ref = sta->rate_ctrl;
55	struct ieee80211_sta *ista = &sta->sta;
56	void *priv_sta = sta->rate_ctrl_priv;
57	struct ieee80211_supported_band *sband;
58
59	if (!ref)
60		return;
61
62	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
63
64	ref->ops->rate_init(ref->priv, sband, ista, priv_sta);
65}
66
67static inline void rate_control_rate_update(struct ieee80211_local *local,
68				    struct ieee80211_supported_band *sband,
69				    struct sta_info *sta, u32 changed,
70				    enum nl80211_channel_type oper_chan_type)
71{
72	struct rate_control_ref *ref = local->rate_ctrl;
73	struct ieee80211_sta *ista = &sta->sta;
74	void *priv_sta = sta->rate_ctrl_priv;
75
76	if (ref && ref->ops->rate_update)
77		ref->ops->rate_update(ref->priv, sband, ista,
78				      priv_sta, changed, oper_chan_type);
79}
80
81static inline void *rate_control_alloc_sta(struct rate_control_ref *ref,
82					   struct ieee80211_sta *sta,
83					   gfp_t gfp)
84{
85	return ref->ops->alloc_sta(ref->priv, sta, gfp);
86}
87
88static inline void rate_control_free_sta(struct sta_info *sta)
89{
90	struct rate_control_ref *ref = sta->rate_ctrl;
91	struct ieee80211_sta *ista = &sta->sta;
92	void *priv_sta = sta->rate_ctrl_priv;
93
94	ref->ops->free_sta(ref->priv, ista, priv_sta);
95}
96
97static inline void rate_control_add_sta_debugfs(struct sta_info *sta)
98{
99#ifdef CONFIG_MAC80211_DEBUGFS
100	struct rate_control_ref *ref = sta->rate_ctrl;
101	if (ref && sta->debugfs.dir && ref->ops->add_sta_debugfs)
102		ref->ops->add_sta_debugfs(ref->priv, sta->rate_ctrl_priv,
103					  sta->debugfs.dir);
104#endif
105}
106
107static inline void rate_control_remove_sta_debugfs(struct sta_info *sta)
108{
109#ifdef CONFIG_MAC80211_DEBUGFS
110	struct rate_control_ref *ref = sta->rate_ctrl;
111	if (ref && ref->ops->remove_sta_debugfs)
112		ref->ops->remove_sta_debugfs(ref->priv, sta->rate_ctrl_priv);
113#endif
114}
115
116/* Get a reference to the rate control algorithm. If `name' is NULL, get the
117 * first available algorithm. */
118int ieee80211_init_rate_ctrl_alg(struct ieee80211_local *local,
119				 const char *name);
120void rate_control_deinitialize(struct ieee80211_local *local);
121
122
123/* Rate control algorithms */
124#ifdef CONFIG_MAC80211_RC_PID
125extern int rc80211_pid_init(void);
126extern void rc80211_pid_exit(void);
127#else
128static inline int rc80211_pid_init(void)
129{
130	return 0;
131}
132static inline void rc80211_pid_exit(void)
133{
134}
135#endif
136
137#ifdef CONFIG_MAC80211_RC_MINSTREL
138extern int rc80211_minstrel_init(void);
139extern void rc80211_minstrel_exit(void);
140#else
141static inline int rc80211_minstrel_init(void)
142{
143	return 0;
144}
145static inline void rc80211_minstrel_exit(void)
146{
147}
148#endif
149
150#ifdef CONFIG_MAC80211_RC_MINSTREL_HT
151extern int rc80211_minstrel_ht_init(void);
152extern void rc80211_minstrel_ht_exit(void);
153#else
154static inline int rc80211_minstrel_ht_init(void)
155{
156	return 0;
157}
158static inline void rc80211_minstrel_ht_exit(void)
159{
160}
161#endif
162
163
164#endif /* IEEE80211_RATE_H */
165