{
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;
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;
}