summaryrefslogtreecommitdiff
path: root/hw/usb_cfs_client_common.c
diff options
context:
space:
mode:
authorINSUN PYO <insun.pyo@samsung.com>2020-03-30 13:07:07 +0900
committerHyotaek Shim <hyotaek.shim@samsung.com>2020-04-07 01:17:40 +0000
commit65079e9b1722bbd03370e53f3e86469bd3eaf9dc (patch)
tree4c105ba7f33711dfb5496c2a9a06390775f4ab8b /hw/usb_cfs_client_common.c
parent8de14db8a87d17b6b43972ef13f5faebf6f1ba65 (diff)
downloadlibdevice-node-65079e9b1722bbd03370e53f3e86469bd3eaf9dc.tar.gz
libdevice-node-65079e9b1722bbd03370e53f3e86469bd3eaf9dc.tar.bz2
libdevice-node-65079e9b1722bbd03370e53f3e86469bd3eaf9dc.zip
Rework usb gadget validataion
On SLP : check if /sys/class/usb_mode/usb0/f_[sdb|mtp|acm|rndis|diag|dm] exists On CFS : check if /usr/lib/systemd/system/[sdb|mpt].service exists or the result of usbg_lookup_function_type() Change-Id: I2cc8acc3553a8734484d50cfc0ede7a963a363b0 (cherry picked from commit 3bb736815986e6433b2a94555c4ceb64b2abea7a)
Diffstat (limited to 'hw/usb_cfs_client_common.c')
-rw-r--r--hw/usb_cfs_client_common.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/hw/usb_cfs_client_common.c b/hw/usb_cfs_client_common.c
index fb599df..1e30ab5 100644
--- a/hw/usb_cfs_client_common.c
+++ b/hw/usb_cfs_client_common.c
@@ -96,25 +96,33 @@ static struct usb_function *cfs_find_usb_function(usbg_function *function)
static bool cfs_is_function_supported(struct usb_function *func)
{
- bool res;
- int ret;
+ char buf[PATH_MAX];
+
+ if (func->is_functionfs) {
+ /* functionfs must have a service */
+ if (!func->service)
+ return false;
- if (!func->is_functionfs) {
- ret = usbg_lookup_function_type(func->name);
- res = ret >= 0;
+ snprintf(buf, sizeof(buf), "/usr/lib/systemd/system/%s.socket", func->service);
+ if (access(buf, F_OK))
+ return false;
} else {
- /* TODO: Check if socket is available */
- res = true;
+ if (usbg_lookup_function_type(func->name) < 0)
+ return false;
}
- return res;
+ return true;
}
static bool cfs_is_gadget_supported(struct usb_gadget *gadget)
{
int i, j;
+ struct usb_configuration *config;
+
+ if (!gadget || !gadget->configs || !gadget->configs[0] || !gadget->funcs)
+ return false;
- if (!gadget || !gadget->configs || !gadget->funcs)
+ if (!gadget->attrs.idVendor || !gadget->attrs.idProduct || !gadget->attrs.bcdDevice)
return false;
/* only strings in US_en are allowed */
@@ -124,8 +132,8 @@ static bool cfs_is_gadget_supported(struct usb_gadget *gadget)
if (!gadget->strs.manufacturer || !gadget->strs.product || !gadget->strs.serial)
return false;
- for (j = 0; gadget->configs && gadget->configs[j]; ++j) {
- struct usb_configuration *config = gadget->configs[j];
+ for (j = 0; gadget->configs[j]; ++j) {
+ config = gadget->configs[j];
if (!config->funcs)
return false;
@@ -135,9 +143,6 @@ static bool cfs_is_gadget_supported(struct usb_gadget *gadget)
return false;
}
- if (j == 0)
- return false;
-
return true;
}
@@ -458,6 +463,7 @@ static int cfs_reconfigure_gadget(struct usb_client *usb, struct usb_gadget *gad
if (!usb || !gadget)
return -EINVAL;
+ /* Verify the gadget and check if function is supported */
if (!cfs_is_gadget_supported(gadget))
return -ENOTSUP;
@@ -475,7 +481,7 @@ static int cfs_reconfigure_gadget(struct usb_client *usb, struct usb_gadget *gad
if (ret)
return ret;
- for (i = 0; gadget->configs && gadget->configs[i]; ++i) {
+ for (i = 0; gadget->configs[i]; ++i) {
ret = cfs_set_gadget_config(cfs_client, i + 1, gadget->configs[i]);
if (ret)
return ret;