Recent kernel versions supports creation of functionFS based
functions using configFS, so this library also should support this.

Signed-off-by: Krzysztof Opasiak <k.opas...@samsung.com>
---
 include/usbg/usbg.h |   14 ++++++++++++++
 src/usbg.c          |   22 +++++++++++++++++++++-
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/include/usbg/usbg.h b/include/usbg/usbg.h
index cb1cdcb..5509cdb 100644
--- a/include/usbg/usbg.h
+++ b/include/usbg/usbg.h
@@ -41,6 +41,8 @@
 #define USBG_MAX_STR_LENGTH 256
 #define USBG_MAX_PATH_LENGTH PATH_MAX
 #define USBG_MAX_NAME_LENGTH 40
+/* Dev name for ffs is a part of function name, we subtracs 4 char for "ffs." 
*/
+#define USBG_MAX_DEV_LENGTH (USBG_MAX_NAME_LENGTH - 4)
 
 /**
  * @brief Additional option for usbg_rm_* functions.
@@ -144,6 +146,7 @@ typedef enum
        F_EEM,
        F_RNDIS,
        F_PHONET,
+       F_FFS
 } usbg_function_type;
 
 /**
@@ -174,6 +177,16 @@ typedef struct {
 } usbg_f_phonet_attrs;
 
 /**
+ * @typedef usbg_f_ffs_attrs
+ * @brief Attributes for function fs based functions
+ * @details This is read only and virtual attribute it is non present
+ * on config fs.
+ */
+typedef struct {
+       char dev_name[USBG_MAX_DEV_LENGTH];
+} usbg_f_ffs_attrs;
+
+/**
  * @typedef attrs
  * @brief Attributes for a given function type
  */
@@ -181,6 +194,7 @@ typedef union {
        usbg_f_serial_attrs serial;
        usbg_f_net_attrs net;
        usbg_f_phonet_attrs phonet;
+       usbg_f_ffs_attrs ffs;
 } usbg_function_attrs;
 
 /* Error codes */
diff --git a/src/usbg.c b/src/usbg.c
index d1fb0b2..04fbe11 100644
--- a/src/usbg.c
+++ b/src/usbg.c
@@ -104,6 +104,7 @@ const char *function_names[] =
        "eem",
        "rndis",
        "phonet",
+       "ffs",
 };
 
 #define ERROR(msg, ...) do {\
@@ -800,6 +801,12 @@ static int usbg_parse_function_attrs(usbg_function *f,
                ret = usbg_read_string(f->path, f->name, "ifname",
                                f_attrs->phonet.ifname);
                break;
+       case F_FFS:
+               strncpy(f_attrs->ffs.dev_name, f->instance,
+                       sizeof(f_attrs->ffs.dev_name) - 1);
+               f_attrs->ffs.dev_name[sizeof(f_attrs->ffs.dev_name) - 1] = '\0';
+               ret = 0;
+               break;
        default:
                ERROR("Unsupported function type\n");
                ret = USBG_ERROR_NOT_SUPPORTED;
@@ -1903,9 +1910,20 @@ int usbg_create_function(usbg_gadget *g, 
usbg_function_type type,
        int ret = USBG_ERROR_INVALID_PARAM;
        int n, free_space;
 
-       if (!g || !f || !instance)
+       if (!g || !f)
                return ret;
 
+       if (!instance) {
+               /* If someone creates ffs function and doesn't pass instance 
name
+                  this means that device name from attrs should be used */
+               if (type == F_FFS && f_attrs) {
+                       instance = f_attrs->ffs.dev_name;
+                       f_attrs = NULL;
+               } else {
+                       return ret;
+               }
+       }
+
        func = usbg_get_function(g, type, instance);
        if (func) {
                ERROR("duplicate function name\n");
@@ -2335,6 +2353,8 @@ int  usbg_set_function_attrs(usbg_function *f, 
usbg_function_attrs *f_attrs)
        case F_PHONET:
                ret = usbg_write_string(f->path, f->name, "ifname", 
f_attrs->phonet.ifname);
                break;
+       case F_FFS:
+               ret = USBG_ERROR_NOT_SUPPORTED;
        default:
                ERROR("Unsupported function type\n");
                ret = USBG_ERROR_NOT_SUPPORTED;
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to