This patch prevents switch-robo.c from attempting robo_probe on a port 
that is already registered.  robo_probe will adjust kernel reference counts
if it detects a switch on the port.  If this patch wasn't applied, the
wrt350n would hang on reboot, waiting for the network driver reference count
to reach zero indefinitely.

Signed-off-by: Ben Pfountz <netprince (at) vt (dot) edu>


diff -urN --exclude=.svn package.nohack/switch/src/switch-core.c 
package/switch/src/switch-core.c
--- package.nohack/switch/src/switch-core.c     2008-06-10 12:23:45.000000000 
-0400
+++ package/switch/src/switch-core.c    2008-06-10 13:11:35.000000000 -0400
@@ -404,6 +404,21 @@
 }
 
 
+int switch_device_registered (char* device) {
+       struct list_head *pos;
+       switch_driver *new;
+
+       list_for_each(pos, &drivers.list) {
+               if (strcmp(list_entry(pos, switch_driver, list)->interface, 
device) == 0) {
+                       printk("There is already a switch registered on the 
device '%s'\n", device);
+                       return -EINVAL;
+               }
+       }
+
+       return 0;
+}
+
+
 int switch_register_driver(switch_driver *driver)
 {
        struct list_head *pos;
@@ -476,6 +491,7 @@
 MODULE_AUTHOR("Felix Fietkau <[EMAIL PROTECTED]>");
 MODULE_LICENSE("GPL");
 
+EXPORT_SYMBOL(switch_device_registered);
 EXPORT_SYMBOL(switch_register_driver);
 EXPORT_SYMBOL(switch_unregister_driver);
 EXPORT_SYMBOL(switch_parse_vlan);
Binary files package.nohack/switch/src/.switch-core.c.swp and 
package/switch/src/.switch-core.c.swp differ
diff -urN --exclude=.svn package.nohack/switch/src/switch-core.h 
package/switch/src/switch-core.h
--- package.nohack/switch/src/switch-core.h     2008-06-10 12:23:45.000000000 
-0400
+++ package/switch/src/switch-core.h    2008-06-10 12:33:53.000000000 -0400
@@ -42,6 +42,7 @@
 } switch_vlan_config;
 
 
+extern int switch_device_registered (char* device);
 extern int switch_register_driver(switch_driver *driver);
 extern void switch_unregister_driver(char *name);
 extern switch_vlan_config *switch_parse_vlan(switch_driver *driver, char *buf);
diff -urN --exclude=.svn package.nohack/switch/src/switch-robo.c 
package/switch/src/switch-robo.c
--- package.nohack/switch/src/switch-robo.c     2008-06-10 12:23:45.000000000 
-0400
+++ package/switch/src/switch-robo.c    2008-06-10 12:30:55.000000000 -0400
@@ -528,7 +528,8 @@
 
        device = strdup("ethX");
        for (device[3] = '0'; (device[3] <= '3') && notfound; device[3]++) {
-               notfound = robo_probe(device);
+               if (! switch_device_registered (device))
+                       notfound = robo_probe(device);
        }
        device[3]--;
        


_______________________________________________
openwrt-devel mailing list
[email protected]
http://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to