From: Viresh Kumar Date: Mon, 22 Jun 2015 11:12:30 +0000 (+0530) Subject: greybus: control: Warn if non-control cport/bundles have control protocol/classes X-Git-Tag: v4.9-rc1~119^2~378^2~21^2~1447 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=730a2f6d1066e7771d5b85b8e9ec5ed09b153d01;p=karo-tx-linux.git greybus: control: Warn if non-control cport/bundles have control protocol/classes 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 Signed-off-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/greybus/manifest.c b/drivers/staging/greybus/manifest.c index bd5753f8c384..ce4e89c6d13e 100644 --- a/drivers/staging/greybus/manifest.c +++ b/drivers/staging/greybus/manifest.c @@ -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 */