From 6869eb56ebe074bbd34de0fd5e63ad31cd578094 Mon Sep 17 00:00:00 2001
From: Greg Kroah-Hartman <greg@kroah.com>
Date: Fri, 23 Jan 2015 10:06:24 +0800
Subject: [PATCH] greybus: Revert "protocol: dedup protocol find code"

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 | 35 +++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/drivers/staging/greybus/protocol.c b/drivers/staging/greybus/protocol.c
index ae8ab21ee9204..51549e20f3986 100644
--- a/drivers/staging/greybus/protocol.c
+++ b/drivers/staging/greybus/protocol.c
@@ -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;
 	}
 
-- 
2.30.2