Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac71c691 authored by Johannes Berg's avatar Johannes Berg Committed by David S. Miller
Browse files

mac80211: make simple rate control algorithm built-in



Too frequently people do not have module autoloading enabled
or fail to install the rate control module correctly, hence
their hardware probing fails due to no rate control algorithm
being available. This makes the 'simple' algorithm built into
the mac80211 module unless EMBEDDED is enabled in which case
it can be disabled (eg. if the wanted driver requires another
rate control algorithm.)

Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Acked-by: default avatarMichael Buesch <mb@bu3sch.de>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8a8f1c04
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -13,6 +13,18 @@ config MAC80211
	This option enables the hardware independent IEEE 802.11
	networking stack.

config MAC80211_RCSIMPLE
	bool "'simple' rate control algorithm"
	default y
	depends on MAC80211 && EMBEDDED
	help
	  This option allows you to turn off the 'simple' rate
	  control algorithm in mac80211. If you do turn it off,
	  you absolutely need another rate control algorithm.

	  Say Y unless you know you will have another algorithm
	  available.

config MAC80211_LEDS
	bool "Enable LED triggers"
	depends on MAC80211 && LEDS_TRIGGERS
+2 −1
Original line number Diff line number Diff line
obj-$(CONFIG_MAC80211) += mac80211.o rc80211_simple.o
obj-$(CONFIG_MAC80211) += mac80211.o

mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o
mac80211-objs-$(CONFIG_MAC80211_DEBUGFS) += debugfs.o debugfs_sta.o debugfs_netdev.o debugfs_key.o
mac80211-objs-$(CONFIG_NET_SCHED) += wme.o
mac80211-objs-$(CONFIG_MAC80211_RCSIMPLE) += rc80211_simple.o

mac80211-objs := \
	ieee80211.o \
+13 −0
Original line number Diff line number Diff line
@@ -1233,8 +1233,17 @@ static int __init ieee80211_init(void)

	BUILD_BUG_ON(sizeof(struct ieee80211_tx_packet_data) > sizeof(skb->cb));

#ifdef CONFIG_MAC80211_RCSIMPLE
	ret = ieee80211_rate_control_register(&mac80211_rcsimple);
	if (ret)
		return ret;
#endif

	ret = ieee80211_wme_register();
	if (ret) {
#ifdef CONFIG_MAC80211_RCSIMPLE
		ieee80211_rate_control_unregister(&mac80211_rcsimple);
#endif
		printk(KERN_DEBUG "ieee80211_init: failed to "
		       "initialize WME (err=%d)\n", ret);
		return ret;
@@ -1248,6 +1257,10 @@ static int __init ieee80211_init(void)

static void __exit ieee80211_exit(void)
{
#ifdef CONFIG_MAC80211_RCSIMPLE
	ieee80211_rate_control_unregister(&mac80211_rcsimple);
#endif

	ieee80211_wme_unregister();
	ieee80211_debugfs_netdev_exit();
}
+11 −2
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ int ieee80211_rate_control_register(struct rate_control_ops *ops)
{
	struct rate_control_alg *alg;

	if (!ops->name)
		return -EINVAL;

	alg = kzalloc(sizeof(*alg), GFP_KERNEL);
	if (alg == NULL) {
		return -ENOMEM;
@@ -61,9 +64,12 @@ ieee80211_try_rate_control_ops_get(const char *name)
	struct rate_control_alg *alg;
	struct rate_control_ops *ops = NULL;

	if (!name)
		return NULL;

	mutex_lock(&rate_ctrl_mutex);
	list_for_each_entry(alg, &rate_ctrl_algs, list) {
		if (!name || !strcmp(alg->ops->name, name))
		if (!strcmp(alg->ops->name, name))
			if (try_module_get(alg->ops->module)) {
				ops = alg->ops;
				break;
@@ -80,9 +86,12 @@ ieee80211_rate_control_ops_get(const char *name)
{
	struct rate_control_ops *ops;

	if (!name)
		name = "simple";

	ops = ieee80211_try_rate_control_ops_get(name);
	if (!ops) {
		request_module("rc80211_%s", name ? name : "default");
		request_module("rc80211_%s", name);
		ops = ieee80211_try_rate_control_ops_get(name);
	}
	return ops;
+3 −0
Original line number Diff line number Diff line
@@ -65,6 +65,9 @@ struct rate_control_ref {
	struct kref kref;
};

/* default 'simple' algorithm */
extern struct rate_control_ops mac80211_rcsimple;

int ieee80211_rate_control_register(struct rate_control_ops *ops);
void ieee80211_rate_control_unregister(struct rate_control_ops *ops);

Loading