add patch for generating hotplug events on atm device create
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sat, 19 Nov 2005 14:07:05 +0000 (14:07 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sat, 19 Nov 2005 14:07:05 +0000 (14:07 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@2532 3c298f89-4303-0410-b956-a3cf2f4a3e73

target/linux/linux-2.4/patches/generic/224-atm_hotplug.patch [new file with mode: 0644]

diff --git a/target/linux/linux-2.4/patches/generic/224-atm_hotplug.patch b/target/linux/linux-2.4/patches/generic/224-atm_hotplug.patch
new file mode 100644 (file)
index 0000000..c431d8c
--- /dev/null
@@ -0,0 +1,98 @@
+diff -urN linux.old/include/linux/atmdev.h linux.dev/include/linux/atmdev.h
+--- linux.old/include/linux/atmdev.h   2005-11-17 12:51:55.883585000 +0100
++++ linux.dev/include/linux/atmdev.h   2005-11-17 13:49:22.012671000 +0100
+@@ -408,6 +408,7 @@
+ struct atm_dev *atm_dev_register(const char *type,const struct atmdev_ops *ops,
+     int number,atm_dev_flags_t *flags); /* number == -1: pick first available */
+ struct atm_dev *atm_dev_lookup(int number);
++void atm_dev_set_link_status(struct atm_dev *dev, int status);
+ void atm_dev_deregister(struct atm_dev *dev);
+ void shutdown_atm_dev(struct atm_dev *dev);
+ void vcc_insert_socket(struct sock *sk);
+diff -urN linux.old/net/atm/resources.c linux.dev/net/atm/resources.c
+--- linux.old/net/atm/resources.c      2003-11-28 19:26:21.000000000 +0100
++++ linux.dev/net/atm/resources.c      2005-11-17 14:27:26.514267750 +0100
+@@ -10,6 +10,7 @@
+ #include <linux/sonet.h>
+ #include <linux/kernel.h> /* for barrier */
+ #include <linux/module.h>
++#include <linux/kmod.h>
+ #include <linux/bitops.h>
+ #include <net/sock.h>  /* for struct sock */
+ #include <asm/segment.h> /* for get_fs_long and put_fs_long */
+@@ -70,6 +71,44 @@
+       return dev;
+ }
++#ifdef CONFIG_HOTPLUG
++static void atm_run_sbin_hotplug(struct atm_dev *dev, char *action)
++{
++      char *argv[3], *envp[5], ifname[12 + IFNAMSIZ], atmname[255], action_str[32];
++      int i;
++
++      sprintf(ifname, "INTERFACE=atm%d", dev->number);
++      sprintf(atmname, "ATMDRIVER=%s", dev->type);
++      sprintf(action_str, "ACTION=%s", action);
++
++      i = 0;
++      argv[i++] = hotplug_path;
++      argv[i++] = "net";
++      argv[i] = 0;
++
++      i = 0;
++      /* minimal command environment */
++      envp [i++] = "HOME=/";
++      envp [i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
++      envp [i++] = ifname;
++      envp [i++] = atmname;
++      envp [i++] = action_str;
++      envp [i] = 0;
++
++      return call_usermodehelper(argv [0], argv, envp);
++}
++#endif
++
++void atm_dev_set_link_status(struct atm_dev *dev, int status)
++{
++#ifdef CONFIG_HOTPLUG
++      if (status)
++              atm_run_sbin_hotplug(dev, "up");
++      else
++              atm_run_sbin_hotplug(dev, "down");
++#endif
++}
++
+ struct atm_dev *atm_dev_register(const char *type, const struct atmdev_ops *ops,
+                                int number, atm_dev_flags_t *flags)
+ {
+@@ -123,7 +162,10 @@
+               }
+       }
+ #endif
+-
++#ifdef CONFIG_HOTPLUG
++      atm_run_sbin_hotplug(dev, "register");
++#endif
++      
+       return dev;
+ }
+@@ -131,6 +173,10 @@
+ void atm_dev_deregister(struct atm_dev *dev)
+ {
+       unsigned long warning_time;
++      
++#ifdef CONFIG_HOTPLUG
++      atm_run_sbin_hotplug(dev, "unregister");
++#endif
+ #ifdef CONFIG_PROC_FS
+       if (dev->ops->proc_read)
+@@ -399,6 +445,7 @@
+ }
++EXPORT_SYMBOL(atm_dev_set_link_status);
+ EXPORT_SYMBOL(atm_dev_register);
+ EXPORT_SYMBOL(atm_dev_deregister);
+ EXPORT_SYMBOL(atm_dev_lookup);