From 141af4f05435ac217b9e1fc8260b42e460997fb6 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Tue, 15 Dec 2015 15:28:57 +0100 Subject: [PATCH] greybus: interface: fix hot-unplug control-connection timeouts Set an interface disconnected flag when the interface has been hot-unplugged (e.g. forcibly removed or after a reboot), and use it to disable the control connection early when deregistering the interface and its bundles. This avoids a one-second (default) timeout for every enabled connection (e.g. one per bundle) at hot-unplug, something which for the default gpbridge manifest currently amounts to five seconds. Signed-off-by: Johan Hovold Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/interface.c | 3 +++ drivers/staging/greybus/interface.h | 1 + drivers/staging/greybus/svc.c | 5 +++-- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/staging/greybus/interface.c b/drivers/staging/greybus/interface.c index aa30dc2a9551..ecc64bedbef5 100644 --- a/drivers/staging/greybus/interface.c +++ b/drivers/staging/greybus/interface.c @@ -130,6 +130,9 @@ void gb_interface_remove(struct gb_interface *intf) struct gb_bundle *bundle; struct gb_bundle *next; + if (intf->disconnected) + gb_control_disable(intf->control); + list_for_each_entry_safe(bundle, next, &intf->bundles, links) gb_bundle_destroy(bundle); diff --git a/drivers/staging/greybus/interface.h b/drivers/staging/greybus/interface.h index 61e9c05e75c6..ca123ce11e76 100644 --- a/drivers/staging/greybus/interface.h +++ b/drivers/staging/greybus/interface.h @@ -35,6 +35,7 @@ struct gb_interface { /* The interface needs to boot over unipro */ bool boot_over_unipro; + bool disconnected; }; #define to_gb_interface(d) container_of(d, struct gb_interface, dev) diff --git a/drivers/staging/greybus/svc.c b/drivers/staging/greybus/svc.c index c013083d79f6..5c4ca7938387 100644 --- a/drivers/staging/greybus/svc.c +++ b/drivers/staging/greybus/svc.c @@ -335,9 +335,10 @@ static int gb_svc_hello(struct gb_operation *op) static void gb_svc_intf_remove(struct gb_svc *svc, struct gb_interface *intf) { u8 intf_id = intf->interface_id; - u8 device_id; + u8 device_id = intf->device_id; + + intf->disconnected = true; - device_id = intf->device_id; gb_interface_remove(intf); /* -- 2.20.1