From 6869eb56ebe074bbd34de0fd5e63ad31cd578094 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman 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 Signed-off-by: Greg Kroah-Hartman --- 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 ae8ab21ee920..51549e20f398 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