|
@@ -10,8 +10,8 @@
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/rtnetlink.h>
|
|
#include <linux/rtnetlink.h>
|
|
-#include <linux/slab.h>
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/module.h>
|
|
|
|
+#include <linux/slab.h>
|
|
#include "rate.h"
|
|
#include "rate.h"
|
|
#include "ieee80211_i.h"
|
|
#include "ieee80211_i.h"
|
|
#include "debugfs.h"
|
|
#include "debugfs.h"
|
|
@@ -87,11 +87,10 @@ ieee80211_try_rate_control_ops_get(const char *name)
|
|
|
|
|
|
mutex_lock(&rate_ctrl_mutex);
|
|
mutex_lock(&rate_ctrl_mutex);
|
|
list_for_each_entry(alg, &rate_ctrl_algs, list) {
|
|
list_for_each_entry(alg, &rate_ctrl_algs, list) {
|
|
- if (!strcmp(alg->ops->name, name))
|
|
|
|
- if (try_module_get(alg->ops->module)) {
|
|
|
|
- ops = alg->ops;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!strcmp(alg->ops->name, name)) {
|
|
|
|
+ ops = alg->ops;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
mutex_unlock(&rate_ctrl_mutex);
|
|
mutex_unlock(&rate_ctrl_mutex);
|
|
return ops;
|
|
return ops;
|
|
@@ -111,10 +110,6 @@ ieee80211_rate_control_ops_get(const char *name)
|
|
alg_name = name;
|
|
alg_name = name;
|
|
|
|
|
|
ops = ieee80211_try_rate_control_ops_get(alg_name);
|
|
ops = ieee80211_try_rate_control_ops_get(alg_name);
|
|
- if (!ops) {
|
|
|
|
- request_module("rc80211_%s", alg_name);
|
|
|
|
- ops = ieee80211_try_rate_control_ops_get(alg_name);
|
|
|
|
- }
|
|
|
|
if (!ops && name)
|
|
if (!ops && name)
|
|
/* try default if specific alg requested but not found */
|
|
/* try default if specific alg requested but not found */
|
|
ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo);
|
|
ops = ieee80211_try_rate_control_ops_get(ieee80211_default_rc_algo);
|
|
@@ -127,11 +122,6 @@ ieee80211_rate_control_ops_get(const char *name)
|
|
return ops;
|
|
return ops;
|
|
}
|
|
}
|
|
|
|
|
|
-static void ieee80211_rate_control_ops_put(const struct rate_control_ops *ops)
|
|
|
|
-{
|
|
|
|
- module_put(ops->module);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_MAC80211_DEBUGFS
|
|
#ifdef CONFIG_MAC80211_DEBUGFS
|
|
static ssize_t rcname_read(struct file *file, char __user *userbuf,
|
|
static ssize_t rcname_read(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
size_t count, loff_t *ppos)
|
|
@@ -158,11 +148,11 @@ static struct rate_control_ref *rate_control_alloc(const char *name,
|
|
|
|
|
|
ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
|
|
ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL);
|
|
if (!ref)
|
|
if (!ref)
|
|
- goto fail_ref;
|
|
|
|
|
|
+ return NULL;
|
|
ref->local = local;
|
|
ref->local = local;
|
|
ref->ops = ieee80211_rate_control_ops_get(name);
|
|
ref->ops = ieee80211_rate_control_ops_get(name);
|
|
if (!ref->ops)
|
|
if (!ref->ops)
|
|
- goto fail_ops;
|
|
|
|
|
|
+ goto free;
|
|
|
|
|
|
#ifdef CONFIG_MAC80211_DEBUGFS
|
|
#ifdef CONFIG_MAC80211_DEBUGFS
|
|
debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir);
|
|
debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir);
|
|
@@ -172,14 +162,11 @@ static struct rate_control_ref *rate_control_alloc(const char *name,
|
|
|
|
|
|
ref->priv = ref->ops->alloc(&local->hw, debugfsdir);
|
|
ref->priv = ref->ops->alloc(&local->hw, debugfsdir);
|
|
if (!ref->priv)
|
|
if (!ref->priv)
|
|
- goto fail_priv;
|
|
|
|
|
|
+ goto free;
|
|
return ref;
|
|
return ref;
|
|
|
|
|
|
-fail_priv:
|
|
|
|
- ieee80211_rate_control_ops_put(ref->ops);
|
|
|
|
-fail_ops:
|
|
|
|
|
|
+free:
|
|
kfree(ref);
|
|
kfree(ref);
|
|
-fail_ref:
|
|
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -192,7 +179,6 @@ static void rate_control_free(struct rate_control_ref *ctrl_ref)
|
|
ctrl_ref->local->debugfs.rcdir = NULL;
|
|
ctrl_ref->local->debugfs.rcdir = NULL;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- ieee80211_rate_control_ops_put(ctrl_ref->ops);
|
|
|
|
kfree(ctrl_ref);
|
|
kfree(ctrl_ref);
|
|
}
|
|
}
|
|
|
|
|