greybus: Revert "protocol: dedup protocol find code"
authorGreg Kroah-Hartman <greg@kroah.com>
Fri, 23 Jan 2015 02:06:24 +0000 (10:06 +0800)
committerGreg Kroah-Hartman <greg@kroah.com>
Fri, 23 Jan 2015 02:06:24 +0000 (10:06 +0800)
This reverts commit 241b5fefc54eae95239b0f7dc4e2b0db49457729 as it's
wrong, we want to insert into the correct place in the list.

Reported-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/protocol.c

index ae8ab21..51549e2 100644 (file)
@@ -20,13 +20,6 @@ static struct gb_protocol *_gb_protocol_find(u8 id, u8 major, u8 minor)
 {
        struct gb_protocol *protocol;
 
-       /*
-        * The protocols list is sorted first by protocol id (low to
-        * high), then by major version (high to low), and finally
-        * by minor version (high to low).  Searching only by
-        * protocol id will produce the newest implemented version
-        * of the protocol.
-        */
        list_for_each_entry(protocol, &gb_protocols, links) {
                if (protocol->id < id)
                        continue;
@@ -57,12 +50,34 @@ int __gb_protocol_register(struct gb_protocol *protocol, struct module *module)
 
        protocol->owner = module;
 
+       /*
+        * The protocols list is sorted first by protocol id (low to
+        * high), then by major version (high to low), and finally
+        * by minor version (high to low).  Searching only by
+        * protocol id will produce the newest implemented version
+        * of the protocol.
+        */
        spin_lock_irq(&gb_protocols_lock);
 
-       /* check if the protocol already wos registered */
-       existing = _gb_protocol_find(id, major, minor);
-       if (existing) {
+       list_for_each_entry(existing, &gb_protocols, links) {
+               if (existing->id < id)
+                       continue;
+               if (existing->id > id)
+                       break;
+
+               if (existing->major > major)
+                       continue;
+               if (existing->major < major)
+                       break;
+
+               if (existing->minor > minor)
+                       continue;
+               if (existing->minor < minor)
+                       break;
+
+               /* A matching protocol has already been registered */
                spin_unlock_irq(&gb_protocols_lock);
+
                return -EEXIST;
        }