2 * The USB Monitor, inspired by Dave Harding's USBMon.
4 * mon_main.c: Main file, module initiation and exit, registrations, etc.
7 #include <linux/kernel.h>
8 #include <linux/module.h>
10 #include <linux/debugfs.h>
11 #include <linux/smp_lock.h>
14 #include "../core/hcd.h"
16 static void mon_submit(struct usb_bus
*ubus
, struct urb
*urb
);
17 static void mon_complete(struct usb_bus
*ubus
, struct urb
*urb
);
18 static void mon_stop(struct mon_bus
*mbus
);
19 static void mon_dissolve(struct mon_bus
*mbus
, struct usb_bus
*ubus
);
20 static void mon_bus_drop(struct kref
*r
);
21 static void mon_bus_init(struct dentry
*mondir
, struct usb_bus
*ubus
);
23 DECLARE_MUTEX(mon_lock
);
25 static struct dentry
*mon_dir
; /* /dbg/usbmon */
26 static LIST_HEAD(mon_buses
); /* All buses we know: struct mon_bus */
29 * Link a reader into the bus.
31 * This must be called with mon_lock taken because of mbus->ref.
33 void mon_reader_add(struct mon_bus
*mbus
, struct mon_reader
*r
)
38 spin_lock_irqsave(&mbus
->lock
, flags
);
39 if (mbus
->nreaders
== 0) {
41 if (ubus
->monitored
) {
43 * Something is really broken, refuse to go on and
44 * possibly corrupt ops pointers or worse.
46 printk(KERN_ERR TAG
": bus %d is already monitored\n",
48 spin_unlock_irqrestore(&mbus
->lock
, flags
);
54 list_add_tail(&r
->r_link
, &mbus
->r_list
);
55 spin_unlock_irqrestore(&mbus
->lock
, flags
);
61 * Unlink reader from the bus.
63 * This is called with mon_lock taken, so we can decrement mbus->ref.
65 void mon_reader_del(struct mon_bus
*mbus
, struct mon_reader
*r
)
69 spin_lock_irqsave(&mbus
->lock
, flags
);
72 if (mbus
->nreaders
== 0)
74 spin_unlock_irqrestore(&mbus
->lock
, flags
);
76 kref_put(&mbus
->ref
, mon_bus_drop
);
81 static void mon_submit(struct usb_bus
*ubus
, struct urb
*urb
)
85 struct list_head
*pos
;
92 spin_lock_irqsave(&mbus
->lock
, flags
);
93 if (mbus
->nreaders
== 0)
96 list_for_each (pos
, &mbus
->r_list
) {
97 r
= list_entry(pos
, struct mon_reader
, r_link
);
98 r
->rnf_submit(r
->r_data
, urb
);
101 spin_unlock_irqrestore(&mbus
->lock
, flags
);
105 spin_unlock_irqrestore(&mbus
->lock
, flags
);
112 static void mon_submit_error(struct usb_bus
*ubus
, struct urb
*urb
, int err
)
114 struct mon_bus
*mbus
;
116 mbus
= ubus
->mon_bus
;
121 * XXX Capture the error code and the 'E' event.
132 static void mon_complete(struct usb_bus
*ubus
, struct urb
*urb
)
134 struct mon_bus
*mbus
;
136 struct list_head
*pos
;
137 struct mon_reader
*r
;
139 mbus
= ubus
->mon_bus
;
142 * This should not happen.
143 * At this point we do not even know the bus number...
145 printk(KERN_ERR TAG
": Null mon bus in URB, pipe 0x%x\n",
150 spin_lock_irqsave(&mbus
->lock
, flags
);
151 list_for_each (pos
, &mbus
->r_list
) {
152 r
= list_entry(pos
, struct mon_reader
, r_link
);
153 r
->rnf_complete(r
->r_data
, urb
);
155 spin_unlock_irqrestore(&mbus
->lock
, flags
);
158 /* int (*unlink_urb) (struct urb *urb, int status); */
162 * Obviously this must be well locked, so no need to play with mb's.
164 static void mon_stop(struct mon_bus
*mbus
)
166 struct usb_bus
*ubus
= mbus
->u_bus
;
169 * A stop can be called for a dissolved mon_bus in case of
170 * a reader staying across an rmmod foo_hcd.
179 * Add a USB bus (usually by a modprobe foo-hcd)
181 * This does not return an error code because the core cannot care less
182 * if monitoring is not established.
184 static void mon_bus_add(struct usb_bus
*ubus
)
186 mon_bus_init(mon_dir
, ubus
);
190 * Remove a USB bus (either from rmmod foo-hcd or from a hot-remove event).
192 static void mon_bus_remove(struct usb_bus
*ubus
)
194 struct mon_bus
*mbus
= ubus
->mon_bus
;
197 list_del(&mbus
->bus_link
);
198 debugfs_remove(mbus
->dent_t
);
199 debugfs_remove(mbus
->dent_s
);
201 mon_dissolve(mbus
, ubus
);
202 kref_put(&mbus
->ref
, mon_bus_drop
);
209 static struct usb_mon_operations mon_ops_0
= {
210 .urb_submit
= mon_submit
,
211 .urb_submit_error
= mon_submit_error
,
212 .urb_complete
= mon_complete
,
213 .bus_add
= mon_bus_add
,
214 .bus_remove
= mon_bus_remove
,
218 * Tear usb_bus and mon_bus apart.
220 static void mon_dissolve(struct mon_bus
*mbus
, struct usb_bus
*ubus
)
224 * Never happens, but...
226 if (ubus
->monitored
) {
227 printk(KERN_ERR TAG
": bus %d is dissolved while monitored\n",
233 ubus
->mon_bus
= NULL
;
236 // usb_bus_put(ubus);
241 static void mon_bus_drop(struct kref
*r
)
243 struct mon_bus
*mbus
= container_of(r
, struct mon_bus
, ref
);
248 * Initialize a bus for us:
250 * - refcount USB bus struct
253 static void mon_bus_init(struct dentry
*mondir
, struct usb_bus
*ubus
)
256 struct mon_bus
*mbus
;
257 enum { NAMESZ
= 10 };
261 if ((mbus
= kmalloc(sizeof(struct mon_bus
), GFP_KERNEL
)) == NULL
)
263 memset(mbus
, 0, sizeof(struct mon_bus
));
264 kref_init(&mbus
->ref
);
265 spin_lock_init(&mbus
->lock
);
266 INIT_LIST_HEAD(&mbus
->r_list
);
269 * This usb_bus_get here is superfluous, because we receive
270 * a notification if usb_bus is about to be removed.
272 // usb_bus_get(ubus);
274 ubus
->mon_bus
= mbus
;
276 rc
= snprintf(name
, NAMESZ
, "%dt", ubus
->busnum
);
277 if (rc
<= 0 || rc
>= NAMESZ
)
279 d
= debugfs_create_file(name
, 0600, mondir
, mbus
, &mon_fops_text
);
284 rc
= snprintf(name
, NAMESZ
, "%ds", ubus
->busnum
);
285 if (rc
<= 0 || rc
>= NAMESZ
)
287 d
= debugfs_create_file(name
, 0600, mondir
, mbus
, &mon_fops_stat
);
293 list_add_tail(&mbus
->bus_link
, &mon_buses
);
299 debugfs_remove(mbus
->dent_t
);
307 static int __init
mon_init(void)
309 struct usb_bus
*ubus
;
310 struct dentry
*mondir
;
312 mondir
= debugfs_create_dir("usbmon", NULL
);
313 if (IS_ERR(mondir
)) {
314 printk(KERN_NOTICE TAG
": debugs is not available\n");
317 if (mondir
== NULL
) {
318 printk(KERN_NOTICE TAG
": unable to create usbmon directory\n");
323 if (usb_mon_register(&mon_ops_0
) != 0) {
324 printk(KERN_NOTICE TAG
": unable to register with the core\n");
325 debugfs_remove(mondir
);
328 // MOD_INC_USE_COUNT(which_module?);
330 down(&usb_bus_list_lock
);
331 list_for_each_entry (ubus
, &usb_bus_list
, bus_list
) {
332 mon_bus_init(mondir
, ubus
);
334 up(&usb_bus_list_lock
);
338 static void __exit
mon_exit(void)
340 struct mon_bus
*mbus
;
343 usb_mon_deregister();
346 while (!list_empty(&mon_buses
)) {
348 mbus
= list_entry(p
, struct mon_bus
, bus_link
);
351 debugfs_remove(mbus
->dent_t
);
352 debugfs_remove(mbus
->dent_s
);
355 * This never happens, because the open/close paths in
356 * file level maintain module use counters and so rmmod fails
357 * before reaching here. However, better be safe...
359 if (mbus
->nreaders
) {
361 ": Outstanding opens (%d) on usb%d, leaking...\n",
362 mbus
->nreaders
, mbus
->u_bus
->busnum
);
363 atomic_set(&mbus
->ref
.refcount
, 2); /* Force leak */
366 mon_dissolve(mbus
, mbus
->u_bus
);
367 kref_put(&mbus
->ref
, mon_bus_drop
);
371 debugfs_remove(mon_dir
);
374 module_init(mon_init
);
375 module_exit(mon_exit
);
377 MODULE_LICENSE("GPL");