USB: gadget: g_fs: code cleanup
authorMichal Nazarewicz <m.nazarewicz@samsung.com>
Fri, 25 Jun 2010 14:29:27 +0000 (16:29 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 Aug 2010 21:35:37 +0000 (14:35 -0700)
This commit cleans the g_fs gadget hopefully making it more
readable.  This is achieved by usage of the usb_string_ids_tab()
function for batch string IDs registration as well as
generalising configuration so that a single routine is
used to add each configuration and bind interfaces.  As an
effect, the code is shorter and has fewer #ifdefs.

Moreover, in some circumstances previous code #defined
CONFIG_USB_FUNCTIONFS_GENERIC macro to prevent a situation
where gadget with no configurations is built.  This code removes
the #define form source code and achieves the same effect using
select in Kconfig.

This patch also changes wording and names of the Kconfig options.

Signed-off-by: Michal Nazarewicz <m.nazarewicz@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/Kconfig
drivers/usb/gadget/g_ffs.c

index 027f61b..dd3b251 100644 (file)
@@ -714,6 +714,7 @@ config USB_GADGETFS
 config USB_FUNCTIONFS
        tristate "Function Filesystem (EXPERIMENTAL)"
        depends on EXPERIMENTAL
 config USB_FUNCTIONFS
        tristate "Function Filesystem (EXPERIMENTAL)"
        depends on EXPERIMENTAL
+       select USB_FUNCTIONFS_GENERIC if !(USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS)
        help
          The Function Filesystem (FunctioFS) lets one create USB
          composite functions in user space in the same way as GadgetFS
        help
          The Function Filesystem (FunctioFS) lets one create USB
          composite functions in user space in the same way as GadgetFS
@@ -722,31 +723,31 @@ config USB_FUNCTIONFS
          implemented in kernel space (for instance Ethernet, serial or
          mass storage) and other are implemented in user space.
 
          implemented in kernel space (for instance Ethernet, serial or
          mass storage) and other are implemented in user space.
 
+         If you say "y" or "m" here you will be able what kind of
+         configurations the gadget will provide.
+
          Say "y" to link the driver statically, or "m" to build
          a dynamically linked module called "g_ffs".
 
 config USB_FUNCTIONFS_ETH
          Say "y" to link the driver statically, or "m" to build
          a dynamically linked module called "g_ffs".
 
 config USB_FUNCTIONFS_ETH
-       bool "Include CDC ECM (Ethernet) function"
+       bool "Include configuration with CDC ECM (Ethernet)"
        depends on USB_FUNCTIONFS && NET
        help
        depends on USB_FUNCTIONFS && NET
        help
-         Include an CDC ECM (Ethernet) funcion in the CDC ECM (Funcion)
-         Filesystem.  If you also say "y" to the RNDIS query below the
-         gadget will have two configurations.
+         Include a configuration with CDC ECM funcion (Ethernet) and the
+         Funcion Filesystem.
 
 config USB_FUNCTIONFS_RNDIS
 
 config USB_FUNCTIONFS_RNDIS
-       bool "Include RNDIS (Ethernet) function"
+       bool "Include configuration with RNDIS (Ethernet)"
        depends on USB_FUNCTIONFS && NET
        help
        depends on USB_FUNCTIONFS && NET
        help
-         Include an RNDIS (Ethernet) funcion in the Funcion Filesystem.
-         If you also say "y" to the CDC ECM query above the gadget will
-         have two configurations.
+         Include a configuration with RNDIS funcion (Ethernet) and the Filesystem.
 
 config USB_FUNCTIONFS_GENERIC
        bool "Include 'pure' configuration"
 
 config USB_FUNCTIONFS_GENERIC
        bool "Include 'pure' configuration"
-       depends on USB_FUNCTIONFS && (USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS)
+       depends on USB_FUNCTIONFS
        help
        help
-         Include a configuration with FunctionFS and no Ethernet
-         configuration.
+         Include a configuration with the Function Filesystem alone with
+         no Ethernet interface.
 
 config USB_FILE_STORAGE
        tristate "File-backed Storage Gadget"
 
 config USB_FILE_STORAGE
        tristate "File-backed Storage Gadget"
index da3a9e4..a9474f8 100644 (file)
 #  include "u_ether.c"
 
 static u8 gfs_hostaddr[ETH_ALEN];
 #  include "u_ether.c"
 
 static u8 gfs_hostaddr[ETH_ALEN];
-#else
-#  if !defined CONFIG_USB_FUNCTIONFS_GENERIC
-#    define CONFIG_USB_FUNCTIONFS_GENERIC
+#  ifdef CONFIG_USB_FUNCTIONFS_ETH
+static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
 #  endif
 #  endif
+#else
 #  define gether_cleanup() do { } while (0)
 #  define gether_setup(gadget, hostaddr)   ((int)0)
 #  define gether_cleanup() do { } while (0)
 #  define gether_setup(gadget, hostaddr)   ((int)0)
+#  define gfs_hostaddr NULL
 #endif
 
 #include "f_fs.c"
 #endif
 
 #include "f_fs.c"
@@ -107,15 +108,7 @@ static const struct usb_descriptor_header *gfs_otg_desc[] = {
 enum {
        GFS_STRING_MANUFACTURER_IDX,
        GFS_STRING_PRODUCT_IDX,
 enum {
        GFS_STRING_MANUFACTURER_IDX,
        GFS_STRING_PRODUCT_IDX,
-#ifdef CONFIG_USB_FUNCTIONFS_RNDIS
-       GFS_STRING_RNDIS_CONFIG_IDX,
-#endif
-#ifdef CONFIG_USB_FUNCTIONFS_ETH
-       GFS_STRING_ECM_CONFIG_IDX,
-#endif
-#ifdef CONFIG_USB_FUNCTIONFS_GENERIC
-       GFS_STRING_GENERIC_CONFIG_IDX,
-#endif
+       GFS_STRING_FIRST_CONFIG_IDX,
 };
 
 static       char gfs_manufacturer[50];
 };
 
 static       char gfs_manufacturer[50];
@@ -126,13 +119,13 @@ static struct usb_string gfs_strings[] = {
        [GFS_STRING_MANUFACTURER_IDX].s = gfs_manufacturer,
        [GFS_STRING_PRODUCT_IDX].s = gfs_driver_desc,
 #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
        [GFS_STRING_MANUFACTURER_IDX].s = gfs_manufacturer,
        [GFS_STRING_PRODUCT_IDX].s = gfs_driver_desc,
 #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
-       [GFS_STRING_RNDIS_CONFIG_IDX].s = "FunctionFS + RNDIS",
+       { .s = "FunctionFS + RNDIS" },
 #endif
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
 #endif
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
-       [GFS_STRING_ECM_CONFIG_IDX].s = "FunctionFS + ECM",
+       { .s = "FunctionFS + ECM" },
 #endif
 #ifdef CONFIG_USB_FUNCTIONFS_GENERIC
 #endif
 #ifdef CONFIG_USB_FUNCTIONFS_GENERIC
-       [GFS_STRING_GENERIC_CONFIG_IDX].s = "FunctionFS",
+       { .s = "FunctionFS" },
 #endif
        {  } /* end of list */
 };
 #endif
        {  } /* end of list */
 };
@@ -146,59 +139,33 @@ static struct usb_gadget_strings *gfs_dev_strings[] = {
 };
 
 
 };
 
 
+
+struct gfs_configuration {
+       struct usb_configuration c;
+       int (*eth)(struct usb_configuration *c, u8 *ethaddr);
+} gfs_configurations[] = {
 #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
 #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
-static int gfs_do_rndis_config(struct usb_configuration *c);
-
-static struct usb_configuration gfs_rndis_config_driver = {
-       .label                  = "FunctionFS + RNDIS",
-       .bind                   = gfs_do_rndis_config,
-       .bConfigurationValue    = 1,
-       /* .iConfiguration      = DYNAMIC */
-       .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-};
-#  define gfs_add_rndis_config(cdev) \
-       usb_add_config(cdev, &gfs_rndis_config_driver)
-#else
-#  define gfs_add_rndis_config(cdev) 0
+       {
+               .eth            = rndis_bind_config,
+       },
 #endif
 
 #endif
 
-
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
-static int gfs_do_ecm_config(struct usb_configuration *c);
-
-static struct usb_configuration gfs_ecm_config_driver = {
-       .label                  = "FunctionFS + ECM",
-       .bind                   = gfs_do_ecm_config,
-       .bConfigurationValue    = 1,
-       /* .iConfiguration      = DYNAMIC */
-       .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-};
-#  define gfs_add_ecm_config(cdev) \
-       usb_add_config(cdev, &gfs_ecm_config_driver)
-#else
-#  define gfs_add_ecm_config(cdev) 0
+       {
+               .eth            = eth_bind_config,
+       },
 #endif
 
 #endif
 
-
 #ifdef CONFIG_USB_FUNCTIONFS_GENERIC
 #ifdef CONFIG_USB_FUNCTIONFS_GENERIC
-static int gfs_do_generic_config(struct usb_configuration *c);
-
-static struct usb_configuration gfs_generic_config_driver = {
-       .label                  = "FunctionFS",
-       .bind                   = gfs_do_generic_config,
-       .bConfigurationValue    = 2,
-       /* .iConfiguration      = DYNAMIC */
-       .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-};
-#  define gfs_add_generic_config(cdev) \
-       usb_add_config(cdev, &gfs_generic_config_driver)
-#else
-#  define gfs_add_generic_config(cdev) 0
+       {
+       },
 #endif
 #endif
+};
 
 
 static int gfs_bind(struct usb_composite_dev *cdev);
 static int gfs_unbind(struct usb_composite_dev *cdev);
 
 
 static int gfs_bind(struct usb_composite_dev *cdev);
 static int gfs_unbind(struct usb_composite_dev *cdev);
+static int gfs_do_config(struct usb_configuration *c);
 
 static struct usb_composite_driver gfs_driver = {
        .name           = gfs_short_name,
 
 static struct usb_composite_driver gfs_driver = {
        .name           = gfs_short_name,
@@ -267,7 +234,7 @@ static int functionfs_check_dev_callback(const char *dev_name)
 
 static int gfs_bind(struct usb_composite_dev *cdev)
 {
 
 static int gfs_bind(struct usb_composite_dev *cdev)
 {
-       int ret;
+       int ret, i;
 
        ENTER();
 
 
        ENTER();
 
@@ -284,57 +251,32 @@ static int gfs_bind(struct usb_composite_dev *cdev)
        snprintf(gfs_manufacturer, sizeof gfs_manufacturer, "%s %s with %s",
                 init_utsname()->sysname, init_utsname()->release,
                 cdev->gadget->name);
        snprintf(gfs_manufacturer, sizeof gfs_manufacturer, "%s %s with %s",
                 init_utsname()->sysname, init_utsname()->release,
                 cdev->gadget->name);
-       ret = usb_string_id(cdev);
-       if (unlikely(ret < 0))
-               goto error;
-       gfs_strings[GFS_STRING_MANUFACTURER_IDX].id = ret;
-       gfs_dev_desc.iManufacturer = ret;
-
-       ret = usb_string_id(cdev);
-       if (unlikely(ret < 0))
-               goto error;
-       gfs_strings[GFS_STRING_PRODUCT_IDX].id = ret;
-       gfs_dev_desc.iProduct = ret;
-
-#ifdef CONFIG_USB_FUNCTIONFS_RNDIS
-       ret = usb_string_id(cdev);
-       if (unlikely(ret < 0))
-               goto error;
-       gfs_strings[GFS_STRING_RNDIS_CONFIG_IDX].id = ret;
-       gfs_rndis_config_driver.iConfiguration = ret;
-#endif
 
 
-#ifdef CONFIG_USB_FUNCTIONFS_ETH
-       ret = usb_string_id(cdev);
+       ret = usb_string_ids_tab(cdev, gfs_strings);
        if (unlikely(ret < 0))
                goto error;
        if (unlikely(ret < 0))
                goto error;
-       gfs_strings[GFS_STRING_ECM_CONFIG_IDX].id = ret;
-       gfs_ecm_config_driver.iConfiguration = ret;
-#endif
 
 
-#ifdef CONFIG_USB_FUNCTIONFS_GENERIC
-       ret = usb_string_id(cdev);
-       if (unlikely(ret < 0))
-               goto error;
-       gfs_strings[GFS_STRING_GENERIC_CONFIG_IDX].id = ret;
-       gfs_generic_config_driver.iConfiguration = ret;
-#endif
+       gfs_dev_desc.iManufacturer = gfs_strings[GFS_STRING_MANUFACTURER_IDX].id;
+       gfs_dev_desc.iProduct      = gfs_strings[GFS_STRING_PRODUCT_IDX].id;
 
        ret = functionfs_bind(gfs_ffs_data, cdev);
        if (unlikely(ret < 0))
                goto error;
 
 
        ret = functionfs_bind(gfs_ffs_data, cdev);
        if (unlikely(ret < 0))
                goto error;
 
-       ret = gfs_add_rndis_config(cdev);
-       if (unlikely(ret < 0))
-               goto error_unbind;
+       for (i = 0; i < ARRAY_SIZE(gfs_configurations); ++i) {
+               struct gfs_configuration *c = gfs_configurations + i;
 
 
-       ret = gfs_add_ecm_config(cdev);
-       if (unlikely(ret < 0))
-               goto error_unbind;
+               ret = GFS_STRING_FIRST_CONFIG_IDX + i;
+               c->c.label                      = gfs_strings[ret].s;
+               c->c.iConfiguration             = gfs_strings[ret].id;
+               c->c.bind                       = gfs_do_config;
+               c->c.bConfigurationValue        = 1 + i;
+               c->c.bmAttributes               = USB_CONFIG_ATT_SELFPOWER;
 
 
-       ret = gfs_add_generic_config(cdev);
-       if (unlikely(ret < 0))
-               goto error_unbind;
+               ret = usb_add_config(cdev, &c->c);
+               if (unlikely(ret < 0))
+                       goto error_unbind;
+       }
 
        return 0;
 
 
        return 0;
 
@@ -368,10 +310,10 @@ static int gfs_unbind(struct usb_composite_dev *cdev)
 }
 
 
 }
 
 
-static int __gfs_do_config(struct usb_configuration *c,
-                          int (*eth)(struct usb_configuration *c, u8 *ethaddr),
-                          u8 *ethaddr)
+static int gfs_do_config(struct usb_configuration *c)
 {
 {
+       struct gfs_configuration *gc =
+               container_of(c, struct gfs_configuration, c);
        int ret;
 
        if (WARN_ON(!gfs_ffs_data))
        int ret;
 
        if (WARN_ON(!gfs_ffs_data))
@@ -382,8 +324,8 @@ static int __gfs_do_config(struct usb_configuration *c,
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
-       if (eth) {
-               ret = eth(c, ethaddr);
+       if (gc->eth) {
+               ret = gc->eth(c, gfs_hostaddr);
                if (unlikely(ret < 0))
                        return ret;
        }
                if (unlikely(ret < 0))
                        return ret;
        }
@@ -406,32 +348,12 @@ static int __gfs_do_config(struct usb_configuration *c,
        return 0;
 }
 
        return 0;
 }
 
-#ifdef CONFIG_USB_FUNCTIONFS_RNDIS
-static int gfs_do_rndis_config(struct usb_configuration *c)
-{
-       ENTER();
-
-       return __gfs_do_config(c, rndis_bind_config, gfs_hostaddr);
-}
-#endif
 
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
 
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
-static int gfs_do_ecm_config(struct usb_configuration *c)
-{
-       ENTER();
-
-       return __gfs_do_config(c,
-                              can_support_ecm(c->cdev->gadget)
-                            ? ecm_bind_config : geth_bind_config,
-                              gfs_hostaddr);
-}
-#endif
-
-#ifdef CONFIG_USB_FUNCTIONFS_GENERIC
-static int gfs_do_generic_config(struct usb_configuration *c)
+static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
 {
 {
-       ENTER();
-
-       return __gfs_do_config(c, NULL, NULL);
+       return can_support_ecm(c->cdev->gadget)
+               ? ecm_bind_config(c, ethaddr)
+               : geth_bind_config(c, ethaddr);
 }
 #endif
 }
 #endif