linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / usb / mon / mon_main.c
index aa9d008..c34944c 100644 (file)
@@ -2,6 +2,8 @@
  * The USB Monitor, inspired by Dave Harding's USBMon.
  *
  * mon_main.c: Main file, module initiation and exit, registrations, etc.
+ *
+ * Copyright (C) 2005 Pete Zaitcev (zaitcev@redhat.com)
  */
 
 #include <linux/kernel.h>
@@ -9,6 +11,7 @@
 #include <linux/usb.h>
 #include <linux/debugfs.h>
 #include <linux/smp_lock.h>
+#include <linux/notifier.h>
 
 #include "usb_mon.h"
 #include "../core/hcd.h"
@@ -203,6 +206,23 @@ static void mon_bus_remove(struct usb_bus *ubus)
        up(&mon_lock);
 }
 
+static int mon_notify(struct notifier_block *self, unsigned long action,
+                     void *dev)
+{
+       switch (action) {
+       case USB_BUS_ADD:
+               mon_bus_add(dev);
+               break;
+       case USB_BUS_REMOVE:
+               mon_bus_remove(dev);
+       }
+       return NOTIFY_OK;
+}
+
+static struct notifier_block mon_nb = {
+       .notifier_call =        mon_notify,
+};
+
 /*
  * Ops
  */
@@ -210,8 +230,6 @@ static struct usb_mon_operations mon_ops_0 = {
        .urb_submit =   mon_submit,
        .urb_submit_error = mon_submit_error,
        .urb_complete = mon_complete,
-       .bus_add =      mon_bus_add,
-       .bus_remove =   mon_bus_remove,
 };
 
 /*
@@ -311,7 +329,7 @@ static int __init mon_init(void)
 
        mondir = debugfs_create_dir("usbmon", NULL);
        if (IS_ERR(mondir)) {
-               printk(KERN_NOTICE TAG ": debugs is not available\n");
+               printk(KERN_NOTICE TAG ": debugfs is not available\n");
                return -ENODEV;
        }
        if (mondir == NULL) {
@@ -327,6 +345,8 @@ static int __init mon_init(void)
        }
        // MOD_INC_USE_COUNT(which_module?);
 
+       usb_register_notify(&mon_nb);
+
        down(&usb_bus_list_lock);
        list_for_each_entry (ubus, &usb_bus_list, bus_list) {
                mon_bus_init(mondir, ubus);
@@ -340,6 +360,7 @@ static void __exit mon_exit(void)
        struct mon_bus *mbus;
        struct list_head *p;
 
+       usb_unregister_notify(&mon_nb);
        usb_mon_deregister();
 
        down(&mon_lock);