ChangeSet 1.808.2.12, 2002/10/24 15:01:51-07:00, [EMAIL PROTECTED]

driver core: add support for calling /sbin/hotplug when classes are found and removed 
from the system.


diff -Nru a/drivers/base/base.h b/drivers/base/base.h
--- a/drivers/base/base.h       Mon Oct 28 13:54:13 2002
+++ b/drivers/base/base.h       Mon Oct 28 13:54:13 2002
@@ -54,8 +54,13 @@
 
 #ifdef CONFIG_HOTPLUG
 extern int dev_hotplug(struct device *dev, const char *action);
+extern int class_hotplug(struct device *dev, const char *action);
 #else
 static inline int dev_hotplug(struct device *dev, const char *action)
+{
+       return 0;
+}
+static int class_hotplug(struct device *dev, const char *action)
 {
        return 0;
 }
diff -Nru a/drivers/base/class.c b/drivers/base/class.c
--- a/drivers/base/class.c      Mon Oct 28 13:54:13 2002
+++ b/drivers/base/class.c      Mon Oct 28 13:54:13 2002
@@ -84,7 +84,8 @@
                                interface_add(cls,dev);
                        }
 
-                       /* notify userspace (call /sbin/hotplug) here */
+                       /* notify userspace (call /sbin/hotplug) */
+                       class_hotplug (dev, "add");
 
                        up_write(&cls->rwsem);
                        if (error)
@@ -106,6 +107,10 @@
                                 cls->name,dev->name);
                        interface_remove(cls,dev);
                        unenum_device(cls,dev);
+
+                       /* notify userspace (call /sbin/hotplug) */
+                       class_hotplug (dev, "remove");
+
                        if (cls->remove_device)
                                cls->remove_device(dev);
                        up_write(&cls->rwsem);
diff -Nru a/drivers/base/hotplug.c b/drivers/base/hotplug.c
--- a/drivers/base/hotplug.c    Mon Oct 28 13:54:13 2002
+++ b/drivers/base/hotplug.c    Mon Oct 28 13:54:13 2002
@@ -22,15 +22,21 @@
 
 /*
  * hotplugging invokes what /proc/sys/kernel/hotplug says (normally
- * /sbin/hotplug) when devices get added or removed.
+ * /sbin/hotplug) when devices or classes get added or removed.
  *
  * This invokes a user mode policy agent, typically helping to load driver
  * or other modules, configure the device, and more.  Drivers can provide
  * a MODULE_DEVICE_TABLE to help with module loading subtasks.
+ *
+ * See the documentation at http://linux-hotplug.sf.net for more info.
+ * 
  */
+
 #define BUFFER_SIZE    1024    /* should be enough memory for the env */
 #define NUM_ENVP       32      /* number of env pointers */
-int dev_hotplug (struct device *dev, const char *action)
+
+static int do_hotplug (struct device *dev, char *argv1, const char *action,
+                       int (* hotplug) (struct device *, char **, int, char *, int))
 {
        char *argv [3], **envp, *buffer, *scratch;
        char *dev_path;
@@ -39,11 +45,6 @@
        int dev_length;
 
        pr_debug ("%s\n", __FUNCTION__);
-       if (!dev)
-               return -ENODEV;
-
-       if (!dev->bus)
-               return -ENODEV;
 
        if (!hotplug_path [0])
                return -ENODEV;
@@ -82,9 +83,8 @@
        strcpy (dev_path, "root");
        fill_devpath (dev, dev_path, dev_length);
 
-       /* only one standardized param to hotplug command: the bus name */
        argv [0] = hotplug_path;
-       argv [1] = dev->bus->name;
+       argv [1] = argv1;
        argv [2] = 0;
 
        /* minimal command environment */
@@ -99,11 +99,10 @@
        envp [i++] = scratch;
        scratch += sprintf (scratch, "DEVPATH=%s", dev_path) + 1;
        
-       if (dev->bus->hotplug) {
+       if (hotplug) {
                /* have the bus specific function add its stuff */
-               retval = dev->bus->hotplug (dev, &envp[i], NUM_ENVP - i,
-                                           scratch,
-                                           BUFFER_SIZE - (scratch - buffer));
+               retval = hotplug (dev, &envp[i], NUM_ENVP - i, scratch,
+                                 BUFFER_SIZE - (scratch - buffer));
                if (retval) {
                        pr_debug ("%s - hotplug() returned %d\n",
                                  __FUNCTION__, retval);
@@ -123,4 +122,43 @@
        kfree (buffer);
        kfree (envp);
        return retval;
+}
+
+
+/*
+ * dev_hotplug - called when any device is added or removed from a bus
+ */
+int dev_hotplug (struct device *dev, const char *action)
+{
+       pr_debug ("%s\n", __FUNCTION__);
+       if (!dev)
+               return -ENODEV;
+
+       if (!dev->bus)
+               return -ENODEV;
+
+       return do_hotplug (dev, dev->bus->name, action, dev->bus->hotplug);
+}
+
+
+/*
+ * class_hotplug - called when a class is added or removed from a device
+ */
+int class_hotplug (struct device *dev, const char *action)
+{
+       struct device_class * cls;
+
+       pr_debug ("%s\n", __FUNCTION__);
+
+       if (!dev)
+               return -ENODEV;
+
+       if (!dev->bus)
+               return -ENODEV;
+
+       cls = get_devclass(dev->driver->devclass);
+       if (!cls)
+               return -ENODEV;
+
+       return do_hotplug (dev, cls->name, action, cls->hotplug);
 }
diff -Nru a/include/linux/device.h b/include/linux/device.h
--- a/include/linux/device.h    Mon Oct 28 13:54:13 2002
+++ b/include/linux/device.h    Mon Oct 28 13:54:13 2002
@@ -187,6 +187,8 @@
 
        int     (*add_device)(struct device *);
        void    (*remove_device)(struct device *);
+       int     (*hotplug)(struct device *dev, char **envp, 
+                          int num_envp, char *buffer, int buffer_size);
 };
 
 extern int devclass_register(struct device_class *);


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to