From 2b95d87b5fd4c8cd133588e777fcf7126066b626 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pawe=C5=82=20Szewczyk?= Date: Fri, 12 Oct 2018 13:47:05 +0200 Subject: [PATCH] usb_client: Cleanup ffs services at gadget disable MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 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); } -- 2.34.1