#include <linux/netlink.h>
#include <linux/moduleparam.h>
#include <linux/connector.h>
-#include <linux/mutex.h>
#include <net/sock.h>
MODULE_PARM_DESC(cn_idx, "Connector's main device idx.");
MODULE_PARM_DESC(cn_val, "Connector's main device val.");
-static DEFINE_MUTEX(notify_lock);
+static DECLARE_MUTEX(notify_lock);
static LIST_HEAD(notify_list);
static struct cn_dev cdev;
group = __group;
}
- if (!netlink_has_listeners(dev->nls, group))
- return -ESRCH;
-
size = NLMSG_SPACE(sizeof(*msg) + msg->len);
skb = alloc_skb(size, gfp_mask);
NETLINK_CB(skb).dst_group = group;
- return netlink_broadcast(dev->nls, skb, 0, group, gfp_mask);
+ netlink_broadcast(dev->nls, skb, 0, group, gfp_mask);
+
+ return 0;
nlmsg_failure:
kfree_skb(skb);
return -EINVAL;
}
-EXPORT_SYMBOL_GPL(cn_netlink_send);
/*
* Callback helper - queues work and setup destructor for given data.
{
struct cn_ctl_entry *ent;
- mutex_lock(¬ify_lock);
+ down(¬ify_lock);
list_for_each_entry(ent, ¬ify_list, notify_entry) {
int i;
struct cn_notify_req *req;
cn_netlink_send(&m, ctl->group, GFP_KERNEL);
}
}
- mutex_unlock(¬ify_lock);
+ up(¬ify_lock);
}
/*
int err;
struct cn_dev *dev = &cdev;
- if (!cn_already_initialized)
- return -EAGAIN;
-
err = cn_queue_add_callback(dev->cbdev, name, id, callback);
if (err)
return err;
return 0;
}
-EXPORT_SYMBOL_GPL(cn_add_callback);
/*
* Callback remove routing - removes callback
cn_queue_del_callback(dev->cbdev, id);
cn_notify(id, 1);
}
-EXPORT_SYMBOL_GPL(cn_del_callback);
/*
* Checks two connector's control messages to be the same.
if (ctl->group == 0) {
struct cn_ctl_entry *n;
- mutex_lock(¬ify_lock);
+ down(¬ify_lock);
list_for_each_entry_safe(ent, n, ¬ify_list, notify_entry) {
if (cn_ctl_msg_equals(ent->msg, ctl)) {
list_del(&ent->notify_entry);
kfree(ent);
}
}
- mutex_unlock(¬ify_lock);
+ up(¬ify_lock);
return;
}
memcpy(ent->msg, ctl, size - sizeof(*ent));
- mutex_lock(¬ify_lock);
+ down(¬ify_lock);
list_add(&ent->notify_entry, ¬ify_list);
- mutex_unlock(¬ify_lock);
+ up(¬ify_lock);
}
-static int __devinit cn_init(void)
+static int __init cn_init(void)
{
struct cn_dev *dev = &cdev;
int err;
sock_release(dev->nls->sk_socket);
return -EINVAL;
}
-
- cn_already_initialized = 1;
err = cn_add_callback(&dev->id, "connector", &cn_callback);
if (err) {
- cn_already_initialized = 0;
cn_queue_free_dev(dev->cbdev);
if (dev->nls->sk_socket)
sock_release(dev->nls->sk_socket);
return -EINVAL;
}
+ cn_already_initialized = 1;
+
return 0;
}
-static void __devexit cn_fini(void)
+static void __exit cn_fini(void)
{
struct cn_dev *dev = &cdev;
sock_release(dev->nls->sk_socket);
}
-subsys_initcall(cn_init);
+module_init(cn_init);
module_exit(cn_fini);
+
+EXPORT_SYMBOL_GPL(cn_add_callback);
+EXPORT_SYMBOL_GPL(cn_del_callback);
+EXPORT_SYMBOL_GPL(cn_netlink_send);