diff options
author | Pete Zaitcev <zaitcev@redhat.com> | 2007-05-03 19:51:16 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 19:29:47 -0400 |
commit | ce7cd137fced114d49178b73d468b82096a107fb (patch) | |
tree | dfc1f49df82d6ec3b301d786e79ae9481dcc83dd /drivers/usb/mon | |
parent | 49cdee0ed0fce9e1bda81f5dcad8d5cce6aec983 (diff) |
usbmon: Add class for binary interface
Add a class which allows for an easier integration with udev.
This code was originally written by Paolo Abeni, and arrived to my tree
as a part of big patch to add binary API on December 18. As I understand,
Paolo always meant the class to be a part of the whole thing. This is his
udev rule to go along with the patch:
KERNEL=="usbmon[0-9]*", NAME="usbmon%n", MODE="0440",OWNER="root",GROUP="bin"
Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/mon')
-rw-r--r-- | drivers/usb/mon/mon_bin.c | 34 | ||||
-rw-r--r-- | drivers/usb/mon/mon_main.c | 14 | ||||
-rw-r--r-- | drivers/usb/mon/mon_text.c | 29 | ||||
-rw-r--r-- | drivers/usb/mon/usb_mon.h | 7 |
4 files changed, 66 insertions, 18 deletions
diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c index 0af11a66207c..c03dfd7a9d36 100644 --- a/drivers/usb/mon/mon_bin.c +++ b/drivers/usb/mon/mon_bin.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * This is a binary format reader. | 4 | * This is a binary format reader. |
5 | * | 5 | * |
6 | * Copyright (C) 2006 Paolo Abeni (paolo.abeni@email.it) | 6 | * Copyright (C) 2006 Paolo Abeni (paolo.abeni@email.it) |
7 | * Copyright (C) 2006 Pete Zaitcev (zaitcev@redhat.com) | 7 | * Copyright (C) 2006,2007 Pete Zaitcev (zaitcev@redhat.com) |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
@@ -172,6 +172,7 @@ static inline struct mon_bin_hdr *MON_OFF2HDR(const struct mon_reader_bin *rp, | |||
172 | 172 | ||
173 | #define MON_RING_EMPTY(rp) ((rp)->b_cnt == 0) | 173 | #define MON_RING_EMPTY(rp) ((rp)->b_cnt == 0) |
174 | 174 | ||
175 | static struct class *mon_bin_class; | ||
175 | static dev_t mon_bin_dev0; | 176 | static dev_t mon_bin_dev0; |
176 | static struct cdev mon_bin_cdev; | 177 | static struct cdev mon_bin_cdev; |
177 | 178 | ||
@@ -1144,10 +1145,38 @@ static void mon_free_buff(struct mon_pgmap *map, int npages) | |||
1144 | free_page((unsigned long) map[n].ptr); | 1145 | free_page((unsigned long) map[n].ptr); |
1145 | } | 1146 | } |
1146 | 1147 | ||
1148 | int mon_bin_add(struct mon_bus *mbus, const struct usb_bus *ubus) | ||
1149 | { | ||
1150 | struct device *dev; | ||
1151 | unsigned minor = ubus? ubus->busnum: 0; | ||
1152 | |||
1153 | if (minor >= MON_BIN_MAX_MINOR) | ||
1154 | return 0; | ||
1155 | |||
1156 | dev = device_create(mon_bin_class, ubus? ubus->controller: NULL, | ||
1157 | MKDEV(MAJOR(mon_bin_dev0), minor), "usbmon%d", minor); | ||
1158 | if (IS_ERR(dev)) | ||
1159 | return 0; | ||
1160 | |||
1161 | mbus->classdev = dev; | ||
1162 | return 1; | ||
1163 | } | ||
1164 | |||
1165 | void mon_bin_del(struct mon_bus *mbus) | ||
1166 | { | ||
1167 | device_destroy(mon_bin_class, mbus->classdev->devt); | ||
1168 | } | ||
1169 | |||
1147 | int __init mon_bin_init(void) | 1170 | int __init mon_bin_init(void) |
1148 | { | 1171 | { |
1149 | int rc; | 1172 | int rc; |
1150 | 1173 | ||
1174 | mon_bin_class = class_create(THIS_MODULE, "usbmon"); | ||
1175 | if (IS_ERR(mon_bin_class)) { | ||
1176 | rc = PTR_ERR(mon_bin_class); | ||
1177 | goto err_class; | ||
1178 | } | ||
1179 | |||
1151 | rc = alloc_chrdev_region(&mon_bin_dev0, 0, MON_BIN_MAX_MINOR, "usbmon"); | 1180 | rc = alloc_chrdev_region(&mon_bin_dev0, 0, MON_BIN_MAX_MINOR, "usbmon"); |
1152 | if (rc < 0) | 1181 | if (rc < 0) |
1153 | goto err_dev; | 1182 | goto err_dev; |
@@ -1164,6 +1193,8 @@ int __init mon_bin_init(void) | |||
1164 | err_add: | 1193 | err_add: |
1165 | unregister_chrdev_region(mon_bin_dev0, MON_BIN_MAX_MINOR); | 1194 | unregister_chrdev_region(mon_bin_dev0, MON_BIN_MAX_MINOR); |
1166 | err_dev: | 1195 | err_dev: |
1196 | class_destroy(mon_bin_class); | ||
1197 | err_class: | ||
1167 | return rc; | 1198 | return rc; |
1168 | } | 1199 | } |
1169 | 1200 | ||
@@ -1171,4 +1202,5 @@ void mon_bin_exit(void) | |||
1171 | { | 1202 | { |
1172 | cdev_del(&mon_bin_cdev); | 1203 | cdev_del(&mon_bin_cdev); |
1173 | unregister_chrdev_region(mon_bin_dev0, MON_BIN_MAX_MINOR); | 1204 | unregister_chrdev_region(mon_bin_dev0, MON_BIN_MAX_MINOR); |
1205 | class_destroy(mon_bin_class); | ||
1174 | } | 1206 | } |
diff --git a/drivers/usb/mon/mon_main.c b/drivers/usb/mon/mon_main.c index 8977ec0d0f99..ce61d8b0fd86 100644 --- a/drivers/usb/mon/mon_main.c +++ b/drivers/usb/mon/mon_main.c | |||
@@ -220,6 +220,8 @@ static void mon_bus_remove(struct usb_bus *ubus) | |||
220 | list_del(&mbus->bus_link); | 220 | list_del(&mbus->bus_link); |
221 | if (mbus->text_inited) | 221 | if (mbus->text_inited) |
222 | mon_text_del(mbus); | 222 | mon_text_del(mbus); |
223 | if (mbus->bin_inited) | ||
224 | mon_bin_del(mbus); | ||
223 | 225 | ||
224 | mon_dissolve(mbus, ubus); | 226 | mon_dissolve(mbus, ubus); |
225 | kref_put(&mbus->ref, mon_bus_drop); | 227 | kref_put(&mbus->ref, mon_bus_drop); |
@@ -301,8 +303,8 @@ static void mon_bus_init(struct usb_bus *ubus) | |||
301 | mbus->u_bus = ubus; | 303 | mbus->u_bus = ubus; |
302 | ubus->mon_bus = mbus; | 304 | ubus->mon_bus = mbus; |
303 | 305 | ||
304 | mbus->text_inited = mon_text_add(mbus, ubus->busnum); | 306 | mbus->text_inited = mon_text_add(mbus, ubus); |
305 | // mon_bin_add(...) | 307 | mbus->bin_inited = mon_bin_add(mbus, ubus); |
306 | 308 | ||
307 | mutex_lock(&mon_lock); | 309 | mutex_lock(&mon_lock); |
308 | list_add_tail(&mbus->bus_link, &mon_buses); | 310 | list_add_tail(&mbus->bus_link, &mon_buses); |
@@ -321,8 +323,8 @@ static void mon_bus0_init(void) | |||
321 | spin_lock_init(&mbus->lock); | 323 | spin_lock_init(&mbus->lock); |
322 | INIT_LIST_HEAD(&mbus->r_list); | 324 | INIT_LIST_HEAD(&mbus->r_list); |
323 | 325 | ||
324 | mbus->text_inited = mon_text_add(mbus, 0); | 326 | mbus->text_inited = mon_text_add(mbus, NULL); |
325 | // mbus->bin_inited = mon_bin_add(mbus, 0); | 327 | mbus->bin_inited = mon_bin_add(mbus, NULL); |
326 | } | 328 | } |
327 | 329 | ||
328 | /* | 330 | /* |
@@ -403,6 +405,8 @@ static void __exit mon_exit(void) | |||
403 | 405 | ||
404 | if (mbus->text_inited) | 406 | if (mbus->text_inited) |
405 | mon_text_del(mbus); | 407 | mon_text_del(mbus); |
408 | if (mbus->bin_inited) | ||
409 | mon_bin_del(mbus); | ||
406 | 410 | ||
407 | /* | 411 | /* |
408 | * This never happens, because the open/close paths in | 412 | * This never happens, because the open/close paths in |
@@ -423,6 +427,8 @@ static void __exit mon_exit(void) | |||
423 | mbus = &mon_bus0; | 427 | mbus = &mon_bus0; |
424 | if (mbus->text_inited) | 428 | if (mbus->text_inited) |
425 | mon_text_del(mbus); | 429 | mon_text_del(mbus); |
430 | if (mbus->bin_inited) | ||
431 | mon_bin_del(mbus); | ||
426 | 432 | ||
427 | mutex_unlock(&mon_lock); | 433 | mutex_unlock(&mon_lock); |
428 | 434 | ||
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index ec0cc51e39ac..982b773d71e6 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c | |||
@@ -655,20 +655,24 @@ static const struct file_operations mon_fops_text_u = { | |||
655 | .release = mon_text_release, | 655 | .release = mon_text_release, |
656 | }; | 656 | }; |
657 | 657 | ||
658 | int mon_text_add(struct mon_bus *mbus, int busnum) | 658 | int mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus) |
659 | { | 659 | { |
660 | struct dentry *d; | 660 | struct dentry *d; |
661 | enum { NAMESZ = 10 }; | 661 | enum { NAMESZ = 10 }; |
662 | char name[NAMESZ]; | 662 | char name[NAMESZ]; |
663 | int busnum = ubus? ubus->busnum: 0; | ||
663 | int rc; | 664 | int rc; |
664 | 665 | ||
665 | rc = snprintf(name, NAMESZ, "%dt", busnum); | 666 | if (ubus != NULL) { |
666 | if (rc <= 0 || rc >= NAMESZ) | 667 | rc = snprintf(name, NAMESZ, "%dt", busnum); |
667 | goto err_print_t; | 668 | if (rc <= 0 || rc >= NAMESZ) |
668 | d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_text_t); | 669 | goto err_print_t; |
669 | if (d == NULL) | 670 | d = debugfs_create_file(name, 0600, mon_dir, mbus, |
670 | goto err_create_t; | 671 | &mon_fops_text_t); |
671 | mbus->dent_t = d; | 672 | if (d == NULL) |
673 | goto err_create_t; | ||
674 | mbus->dent_t = d; | ||
675 | } | ||
672 | 676 | ||
673 | rc = snprintf(name, NAMESZ, "%du", busnum); | 677 | rc = snprintf(name, NAMESZ, "%du", busnum); |
674 | if (rc <= 0 || rc >= NAMESZ) | 678 | if (rc <= 0 || rc >= NAMESZ) |
@@ -694,8 +698,10 @@ err_print_s: | |||
694 | mbus->dent_u = NULL; | 698 | mbus->dent_u = NULL; |
695 | err_create_u: | 699 | err_create_u: |
696 | err_print_u: | 700 | err_print_u: |
697 | debugfs_remove(mbus->dent_t); | 701 | if (ubus != NULL) { |
698 | mbus->dent_t = NULL; | 702 | debugfs_remove(mbus->dent_t); |
703 | mbus->dent_t = NULL; | ||
704 | } | ||
699 | err_create_t: | 705 | err_create_t: |
700 | err_print_t: | 706 | err_print_t: |
701 | return 0; | 707 | return 0; |
@@ -704,7 +710,8 @@ err_print_t: | |||
704 | void mon_text_del(struct mon_bus *mbus) | 710 | void mon_text_del(struct mon_bus *mbus) |
705 | { | 711 | { |
706 | debugfs_remove(mbus->dent_u); | 712 | debugfs_remove(mbus->dent_u); |
707 | debugfs_remove(mbus->dent_t); | 713 | if (mbus->dent_t != NULL) |
714 | debugfs_remove(mbus->dent_t); | ||
708 | debugfs_remove(mbus->dent_s); | 715 | debugfs_remove(mbus->dent_s); |
709 | } | 716 | } |
710 | 717 | ||
diff --git a/drivers/usb/mon/usb_mon.h b/drivers/usb/mon/usb_mon.h index 13d63255283e..f68ad6d99ad7 100644 --- a/drivers/usb/mon/usb_mon.h +++ b/drivers/usb/mon/usb_mon.h | |||
@@ -20,9 +20,11 @@ struct mon_bus { | |||
20 | struct usb_bus *u_bus; | 20 | struct usb_bus *u_bus; |
21 | 21 | ||
22 | int text_inited; | 22 | int text_inited; |
23 | int bin_inited; | ||
23 | struct dentry *dent_s; /* Debugging file */ | 24 | struct dentry *dent_s; /* Debugging file */ |
24 | struct dentry *dent_t; /* Text interface file */ | 25 | struct dentry *dent_t; /* Text interface file */ |
25 | struct dentry *dent_u; /* Second text interface file */ | 26 | struct dentry *dent_u; /* Second text interface file */ |
27 | struct device *classdev; /* Device in usbmon class */ | ||
26 | 28 | ||
27 | /* Ref */ | 29 | /* Ref */ |
28 | int nreaders; /* Under mon_lock AND mbus->lock */ | 30 | int nreaders; /* Under mon_lock AND mbus->lock */ |
@@ -52,9 +54,10 @@ void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r); | |||
52 | 54 | ||
53 | struct mon_bus *mon_bus_lookup(unsigned int num); | 55 | struct mon_bus *mon_bus_lookup(unsigned int num); |
54 | 56 | ||
55 | int /*bool*/ mon_text_add(struct mon_bus *mbus, int busnum); | 57 | int /*bool*/ mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus); |
56 | void mon_text_del(struct mon_bus *mbus); | 58 | void mon_text_del(struct mon_bus *mbus); |
57 | // void mon_bin_add(struct mon_bus *); | 59 | int /*bool*/ mon_bin_add(struct mon_bus *mbus, const struct usb_bus *ubus); |
60 | void mon_bin_del(struct mon_bus *mbus); | ||
58 | 61 | ||
59 | int __init mon_text_init(void); | 62 | int __init mon_text_init(void); |
60 | void mon_text_exit(void); | 63 | void mon_text_exit(void); |