]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: control: Warn if non-control cport/bundles have control protocol/classes
authorViresh Kumar <viresh.kumar@linaro.org>
Mon, 22 Jun 2015 11:12:30 +0000 (16:42 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 24 Jun 2015 06:17:25 +0000 (23:17 -0700)
It is possible that (by mistake) the manifest contains non-control
cports with their protocol set as control-protocol or non-control bundle
with their class set as control-class.

Catch such cases, WARN for them and finally ignore them.

Also WARN if the control cport doesn't have its protocol as
control-protocol and control bundle doesn't have its class as
control-class.

Reviewed-by: Alex Elder <elder@linaro.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/manifest.c

index bd5753f8c3849ce3e6609f4a559504e2ed9f3fa1..ce4e89c6d13ede232f6e1f7517b033eea4474738 100644 (file)
@@ -225,12 +225,20 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
                if (cport_id > CPORT_ID_MAX)
                        goto cleanup;
 
+               /* Found one.  Set up its function structure */
+               protocol_id = desc_cport->protocol_id;
+
                /* Don't recreate connection for control cport */
-               if (cport_id == GB_CONTROL_CPORT_ID)
+               if (cport_id == GB_CONTROL_CPORT_ID) {
+                       /* This should have protocol set to control protocol*/
+                       WARN_ON(protocol_id != GREYBUS_PROTOCOL_CONTROL);
+
                        goto release_descriptor;
+               }
 
-               /* Found one.  Set up its function structure */
-               protocol_id = desc_cport->protocol_id;
+               /* Nothing else should have its protocol as control protocol */
+               if (WARN_ON(protocol_id == GREYBUS_PROTOCOL_CONTROL))
+                       goto release_descriptor;
 
                if (!gb_connection_create(bundle, cport_id, protocol_id))
                        goto cleanup;
@@ -277,10 +285,17 @@ static u32 gb_manifest_parse_bundles(struct gb_interface *intf)
 
                /* Don't recreate bundle for control cport */
                if (desc_bundle->id == GB_CONTROL_BUNDLE_ID) {
+                       /* This should have class set to control class */
+                       WARN_ON(desc_bundle->class != GREYBUS_CLASS_CONTROL);
+
                        bundle = intf->control->connection->bundle;
                        goto parse_cports;
                }
 
+               /* Nothing else should have its class set to control class */
+               if (WARN_ON(desc_bundle->class == GREYBUS_CLASS_CONTROL))
+                       goto release_descriptor;
+
                bundle = gb_bundle_create(intf, desc_bundle->id,
                                          desc_bundle->class);
                if (!bundle)
@@ -291,6 +306,7 @@ parse_cports:
                if (!gb_manifest_parse_cports(bundle))
                        goto cleanup;
 
+release_descriptor:
                count++;
 
                /* Done with this bundle descriptor */