From 2b95d87b5fd4c8cd133588e777fcf7126066b626 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pawe=C5=82=20Szewczyk?=
Date: Fri, 12 Oct 2018 13:47:05 +0200
Subject: usb_client: Cleanup ffs services at gadget disable
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Each functionfs daemon spawned at gadget initialization should be closed
before functionfs can be succesfully cleaned up.
Change-Id: I97654fa882f5b7346e5aee3aedd3ea00e50fcb47
Signed-off-by: Paweł Szewczyk
---
hw/usb_cfs_client_common.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/hw/usb_cfs_client_common.c b/hw/usb_cfs_client_common.c
index c133aff..0fd1912 100644
--- a/hw/usb_cfs_client_common.c
+++ b/hw/usb_cfs_client_common.c
@@ -836,6 +836,8 @@ static int cfs_enable(struct usb_client *usb)
static int cfs_disable(struct usb_client *usb)
{
struct cfs_client *cfs_client;
+ usbg_function *func;
+ int ret;
if (!usb)
return -EINVAL;
@@ -843,6 +845,29 @@ static int cfs_disable(struct usb_client *usb)
cfs_client = container_of(usb, struct cfs_client,
client);
+ usbg_for_each_function(func, cfs_client->gadget) {
+ char *name = (char *)usbg_get_function_type_str(
+ usbg_get_function_type(func));
+ char *instance = (char *)usbg_get_function_instance(func);
+ struct usb_function *usb_func;
+
+ ret = cfs_find_func(name, instance);
+ if (ret < 0)
+ continue;
+
+ usb_func = _available_funcs[ret];
+ if (usb_func->function_group ==
+ USB_FUNCTION_GROUP_WITH_SERVICE) {
+ struct usb_function_with_service *fws;
+
+ fws = container_of(usb_func,
+ struct usb_function_with_service,
+ func);
+ systemd_stop_socket(fws->service);
+ systemd_stop_service(fws->service);
+ }
+ }
+
return usbg_disable_gadget(cfs_client->gadget);
}
--
cgit v1.2.3