usb_client: Cleanup ffs services at gadget disable 06/191206/1 submit/tizen/20181015.022811
authorPaweł Szewczyk <p.szewczyk@samsung.com>
Fri, 12 Oct 2018 11:47:05 +0000 (13:47 +0200)
committerPaweł Szewczyk <p.szewczyk@samsung.com>
Fri, 12 Oct 2018 12:22:05 +0000 (14:22 +0200)
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 <p.szewczyk@samsung.com>
hw/usb_cfs_client_common.c

index c133aff..0fd1912 100644 (file)
@@ -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);
 }