diff options
-rw-r--r-- | net/mac80211/Kconfig | 12 | ||||
-rw-r--r-- | net/mac80211/Makefile | 3 | ||||
-rw-r--r-- | net/mac80211/ieee80211.c | 13 | ||||
-rw-r--r-- | net/mac80211/ieee80211_rate.c | 13 | ||||
-rw-r--r-- | net/mac80211/ieee80211_rate.h | 3 | ||||
-rw-r--r-- | net/mac80211/rc80211_simple.c | 25 |
6 files changed, 42 insertions, 27 deletions
diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig index 6fffb3845ab6..32c8c08c4683 100644 --- a/net/mac80211/Kconfig +++ b/net/mac80211/Kconfig | |||
@@ -13,6 +13,18 @@ config MAC80211 | |||
13 | This option enables the hardware independent IEEE 802.11 | 13 | This option enables the hardware independent IEEE 802.11 |
14 | networking stack. | 14 | networking stack. |
15 | 15 | ||
16 | config MAC80211_RCSIMPLE | ||
17 | bool "'simple' rate control algorithm" | ||
18 | default y | ||
19 | depends on MAC80211 && EMBEDDED | ||
20 | help | ||
21 | This option allows you to turn off the 'simple' rate | ||
22 | control algorithm in mac80211. If you do turn it off, | ||
23 | you absolutely need another rate control algorithm. | ||
24 | |||
25 | Say Y unless you know you will have another algorithm | ||
26 | available. | ||
27 | |||
16 | config MAC80211_LEDS | 28 | config MAC80211_LEDS |
17 | bool "Enable LED triggers" | 29 | bool "Enable LED triggers" |
18 | depends on MAC80211 && LEDS_TRIGGERS | 30 | depends on MAC80211 && LEDS_TRIGGERS |
diff --git a/net/mac80211/Makefile b/net/mac80211/Makefile index 219cd9f9341f..1e6237b34846 100644 --- a/net/mac80211/Makefile +++ b/net/mac80211/Makefile | |||
@@ -1,8 +1,9 @@ | |||
1 | obj-$(CONFIG_MAC80211) += mac80211.o rc80211_simple.o | 1 | obj-$(CONFIG_MAC80211) += mac80211.o |
2 | 2 | ||
3 | mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o | 3 | mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o |
4 | mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += debugfs.o debugfs_sta.o debugfs_netdev.o debugfs_key.o | 4 | mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += debugfs.o debugfs_sta.o debugfs_netdev.o debugfs_key.o |
5 | mac80211-objs-$(CONFIG_NET_SCHED) += wme.o | 5 | mac80211-objs-$(CONFIG_NET_SCHED) += wme.o |
6 | mac80211-objs-$(CONFIG_MAC80211_RCSIMPLE) += rc80211_simple.o | ||
6 | 7 | ||
7 | mac80211-objs := \ | 8 | mac80211-objs := \ |
8 | ieee80211.o \ | 9 | ieee80211.o \ |
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index f484ca7ade9c..52ba6ef90685 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -1233,8 +1233,17 @@ static int __init ieee80211_init(void) | |||
1233 | 1233 | ||
1234 | BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb)); | 1234 | BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb)); |
1235 | 1235 | ||
1236 | #ifdef CONFIG_MAC80211_RCSIMPLE | ||
1237 | ret = ieee80211_rate_control_register(&mac80211_rcsimple); | ||
1238 | if (ret) | ||
1239 | return ret; | ||
1240 | #endif | ||
1241 | |||
1236 | ret = ieee80211_wme_register(); | 1242 | ret = ieee80211_wme_register(); |
1237 | if (ret) { | 1243 | if (ret) { |
1244 | #ifdef CONFIG_MAC80211_RCSIMPLE | ||
1245 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | ||
1246 | #endif | ||
1238 | printk(KERN_DEBUG "ieee80211_init: failed to " | 1247 | printk(KERN_DEBUG "ieee80211_init: failed to " |
1239 | "initialize WME (err=%d)\n", ret); | 1248 | "initialize WME (err=%d)\n", ret); |
1240 | return ret; | 1249 | return ret; |
@@ -1248,6 +1257,10 @@ static int __init ieee80211_init(void) | |||
1248 | 1257 | ||
1249 | static void __exit ieee80211_exit(void) | 1258 | static void __exit ieee80211_exit(void) |
1250 | { | 1259 | { |
1260 | #ifdef CONFIG_MAC80211_RCSIMPLE | ||
1261 | ieee80211_rate_control_unregister(&mac80211_rcsimple); | ||
1262 | #endif | ||
1263 | |||
1251 | ieee80211_wme_unregister(); | 1264 | ieee80211_wme_unregister(); |
1252 | ieee80211_debugfs_netdev_exit(); | 1265 | ieee80211_debugfs_netdev_exit(); |
1253 | } | 1266 | } |
diff --git a/net/mac80211/ieee80211_rate.c b/net/mac80211/ieee80211_rate.c index 93abb8fff141..e4bd8481554d 100644 --- a/net/mac80211/ieee80211_rate.c +++ b/net/mac80211/ieee80211_rate.c | |||
@@ -25,6 +25,9 @@ int ieee80211_rate_control_register(struct rate_control_ops *ops) | |||
25 | { | 25 | { |
26 | struct rate_control_alg *alg; | 26 | struct rate_control_alg *alg; |
27 | 27 | ||
28 | if (!ops->name) | ||
29 | return -EINVAL; | ||
30 | |||
28 | alg = kzalloc(sizeof(*alg), GFP_KERNEL); | 31 | alg = kzalloc(sizeof(*alg), GFP_KERNEL); |
29 | if (alg == NULL) { | 32 | if (alg == NULL) { |
30 | return -ENOMEM; | 33 | return -ENOMEM; |
@@ -61,9 +64,12 @@ ieee80211_try_rate_control_ops_get(const char *name) | |||
61 | struct rate_control_alg *alg; | 64 | struct rate_control_alg *alg; |
62 | struct rate_control_ops *ops = NULL; | 65 | struct rate_control_ops *ops = NULL; |
63 | 66 | ||
67 | if (!name) | ||
68 | return NULL; | ||
69 | |||
64 | mutex_lock(&rate_ctrl_mutex); | 70 | mutex_lock(&rate_ctrl_mutex); |
65 | list_for_each_entry(alg, &rate_ctrl_algs, list) { | 71 | list_for_each_entry(alg, &rate_ctrl_algs, list) { |
66 | if (!name || !strcmp(alg->ops->name, name)) | 72 | if (!strcmp(alg->ops->name, name)) |
67 | if (try_module_get(alg->ops->module)) { | 73 | if (try_module_get(alg->ops->module)) { |
68 | ops = alg->ops; | 74 | ops = alg->ops; |
69 | break; | 75 | break; |
@@ -80,9 +86,12 @@ ieee80211_rate_control_ops_get(const char *name) | |||
80 | { | 86 | { |
81 | struct rate_control_ops *ops; | 87 | struct rate_control_ops *ops; |
82 | 88 | ||
89 | if (!name) | ||
90 | name = "simple"; | ||
91 | |||
83 | ops = ieee80211_try_rate_control_ops_get(name); | 92 | ops = ieee80211_try_rate_control_ops_get(name); |
84 | if (!ops) { | 93 | if (!ops) { |
85 | request_module("rc80211_%s", name ? name : "default"); | 94 | request_module("rc80211_%s", name); |
86 | ops = ieee80211_try_rate_control_ops_get(name); | 95 | ops = ieee80211_try_rate_control_ops_get(name); |
87 | } | 96 | } |
88 | return ops; | 97 | return ops; |
diff --git a/net/mac80211/ieee80211_rate.h b/net/mac80211/ieee80211_rate.h index 7cd1ebab4f83..23688139ffb3 100644 --- a/net/mac80211/ieee80211_rate.h +++ b/net/mac80211/ieee80211_rate.h | |||
@@ -65,6 +65,9 @@ struct rate_control_ref { | |||
65 | struct kref kref; | 65 | struct kref kref; |
66 | }; | 66 | }; |
67 | 67 | ||
68 | /* default 'simple' algorithm */ | ||
69 | extern struct rate_control_ops mac80211_rcsimple; | ||
70 | |||
68 | int ieee80211_rate_control_register(struct rate_control_ops *ops); | 71 | int ieee80211_rate_control_register(struct rate_control_ops *ops); |
69 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); | 72 | void ieee80211_rate_control_unregister(struct rate_control_ops *ops); |
70 | 73 | ||
diff --git a/net/mac80211/rc80211_simple.c b/net/mac80211/rc80211_simple.c index 314b8de88862..da72737364e4 100644 --- a/net/mac80211/rc80211_simple.c +++ b/net/mac80211/rc80211_simple.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * published by the Free Software Foundation. | 7 | * published by the Free Software Foundation. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/init.h> | 10 | #include <linux/init.h> |
12 | #include <linux/netdevice.h> | 11 | #include <linux/netdevice.h> |
13 | #include <linux/types.h> | 12 | #include <linux/types.h> |
@@ -29,8 +28,6 @@ | |||
29 | #define RATE_CONTROL_INTERVAL (HZ / 20) | 28 | #define RATE_CONTROL_INTERVAL (HZ / 20) |
30 | #define RATE_CONTROL_MIN_TX 10 | 29 | #define RATE_CONTROL_MIN_TX 10 |
31 | 30 | ||
32 | MODULE_ALIAS("rc80211_default"); | ||
33 | |||
34 | static void rate_control_rate_inc(struct ieee80211_local *local, | 31 | static void rate_control_rate_inc(struct ieee80211_local *local, |
35 | struct sta_info *sta) | 32 | struct sta_info *sta) |
36 | { | 33 | { |
@@ -394,8 +391,7 @@ static void rate_control_simple_remove_sta_debugfs(void *priv, void *priv_sta) | |||
394 | } | 391 | } |
395 | #endif | 392 | #endif |
396 | 393 | ||
397 | static struct rate_control_ops rate_control_simple = { | 394 | struct rate_control_ops mac80211_rcsimple = { |
398 | .module = THIS_MODULE, | ||
399 | .name = "simple", | 395 | .name = "simple", |
400 | .tx_status = rate_control_simple_tx_status, | 396 | .tx_status = rate_control_simple_tx_status, |
401 | .get_rate = rate_control_simple_get_rate, | 397 | .get_rate = rate_control_simple_get_rate, |
@@ -410,22 +406,3 @@ static struct rate_control_ops rate_control_simple = { | |||
410 | .remove_sta_debugfs = rate_control_simple_remove_sta_debugfs, | 406 | .remove_sta_debugfs = rate_control_simple_remove_sta_debugfs, |
411 | #endif | 407 | #endif |
412 | }; | 408 | }; |
413 | |||
414 | |||
415 | static int __init rate_control_simple_init(void) | ||
416 | { | ||
417 | return ieee80211_rate_control_register(&rate_control_simple); | ||
418 | } | ||
419 | |||
420 | |||
421 | static void __exit rate_control_simple_exit(void) | ||
422 | { | ||
423 | ieee80211_rate_control_unregister(&rate_control_simple); | ||
424 | } | ||
425 | |||
426 | |||
427 | subsys_initcall(rate_control_simple_init); | ||
428 | module_exit(rate_control_simple_exit); | ||
429 | |||
430 | MODULE_DESCRIPTION("Simple rate control algorithm for ieee80211"); | ||
431 | MODULE_LICENSE("GPL"); | ||