greybus: interface: disable control connection on initialisation errors
authorJohan Hovold <johan@hovoldconsulting.com>
Wed, 9 Mar 2016 11:20:39 +0000 (12:20 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 10 Mar 2016 21:57:42 +0000 (13:57 -0800)
Disable the control connection immediately on any errors during
interface initialisation as there's no need to keep it around for an
interface in an error state.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Jeffrey Carlyle <jcarlyle@google.com>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/interface.c

index fe4efe1bbdd5cd1b7313abfde49019a6c06a91eb..2654fa8a1f0b4194a456b536fcd2fe22078df03e 100644 (file)
@@ -198,15 +198,20 @@ int gb_interface_init(struct gb_interface *intf)
        size = gb_control_get_manifest_size_operation(intf);
        if (size <= 0) {
                dev_err(&intf->dev, "failed to get manifest size: %d\n", size);
+
                if (size)
-                       return size;
+                       ret = size;
                else
-                       return -EINVAL;
+                       ret =  -EINVAL;
+
+               goto err_disable_control;
        }
 
        manifest = kmalloc(size, GFP_KERNEL);
-       if (!manifest)
-               return -ENOMEM;
+       if (!manifest) {
+               ret = -ENOMEM;
+               goto err_disable_control;
+       }
 
        /* Get manifest using control protocol on CPort */
        ret = gb_control_get_manifest_operation(intf, manifest, size);
@@ -242,6 +247,8 @@ err_destroy_bundles:
                gb_bundle_destroy(bundle);
 err_free_manifest:
        kfree(manifest);
+err_disable_control:
+       gb_control_disable(intf->control);
 
        return ret;
 }