Commit f8dae531 authored by Michal Nazarewicz's avatar Michal Nazarewicz Committed by Greg Kroah-Hartman

USB: gadget: g_fs: code cleanup

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: default avatarMichal Nazarewicz <m.nazarewicz@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 541c7d43
...@@ -714,6 +714,7 @@ config USB_GADGETFS ...@@ -714,6 +714,7 @@ config USB_GADGETFS
config USB_FUNCTIONFS config USB_FUNCTIONFS
tristate "Function Filesystem (EXPERIMENTAL)" tristate "Function Filesystem (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on EXPERIMENTAL
select USB_FUNCTIONFS_GENERIC if !(USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS)
help help
The Function Filesystem (FunctioFS) lets one create USB The Function Filesystem (FunctioFS) lets one create USB
composite functions in user space in the same way as GadgetFS composite functions in user space in the same way as GadgetFS
...@@ -722,31 +723,31 @@ config USB_FUNCTIONFS ...@@ -722,31 +723,31 @@ config USB_FUNCTIONFS
implemented in kernel space (for instance Ethernet, serial or implemented in kernel space (for instance Ethernet, serial or
mass storage) and other are implemented in user space. 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 Say "y" to link the driver statically, or "m" to build
a dynamically linked module called "g_ffs". a dynamically linked module called "g_ffs".
config USB_FUNCTIONFS_ETH config USB_FUNCTIONFS_ETH
bool "Include CDC ECM (Ethernet) function" bool "Include configuration with CDC ECM (Ethernet)"
depends on USB_FUNCTIONFS && NET depends on USB_FUNCTIONFS && NET
help help
Include an CDC ECM (Ethernet) funcion in the CDC ECM (Funcion) Include a configuration with CDC ECM funcion (Ethernet) and the
Filesystem. If you also say "y" to the RNDIS query below the Funcion Filesystem.
gadget will have two configurations.
config USB_FUNCTIONFS_RNDIS config USB_FUNCTIONFS_RNDIS
bool "Include RNDIS (Ethernet) function" bool "Include configuration with RNDIS (Ethernet)"
depends on USB_FUNCTIONFS && NET depends on USB_FUNCTIONFS && NET
help help
Include an RNDIS (Ethernet) funcion in the Funcion Filesystem. Include a configuration with RNDIS funcion (Ethernet) and the Filesystem.
If you also say "y" to the CDC ECM query above the gadget will
have two configurations.
config USB_FUNCTIONFS_GENERIC config USB_FUNCTIONFS_GENERIC
bool "Include 'pure' configuration" 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 Include a configuration with the Function Filesystem alone with
configuration. no Ethernet interface.
config USB_FILE_STORAGE config USB_FILE_STORAGE
tristate "File-backed Storage Gadget" tristate "File-backed Storage Gadget"
......
...@@ -32,12 +32,13 @@ ...@@ -32,12 +32,13 @@
# include "u_ether.c" # include "u_ether.c"
static u8 gfs_hostaddr[ETH_ALEN]; static u8 gfs_hostaddr[ETH_ALEN];
#else # ifdef CONFIG_USB_FUNCTIONFS_ETH
# if !defined CONFIG_USB_FUNCTIONFS_GENERIC static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
# define CONFIG_USB_FUNCTIONFS_GENERIC
# endif # endif
#else
# define gether_cleanup() do { } while (0) # define gether_cleanup() do { } while (0)
# define gether_setup(gadget, hostaddr) ((int)0) # define gether_setup(gadget, hostaddr) ((int)0)
# define gfs_hostaddr NULL
#endif #endif
#include "f_fs.c" #include "f_fs.c"
...@@ -107,15 +108,7 @@ static const struct usb_descriptor_header *gfs_otg_desc[] = { ...@@ -107,15 +108,7 @@ static const struct usb_descriptor_header *gfs_otg_desc[] = {
enum { enum {
GFS_STRING_MANUFACTURER_IDX, GFS_STRING_MANUFACTURER_IDX,
GFS_STRING_PRODUCT_IDX, GFS_STRING_PRODUCT_IDX,
#ifdef CONFIG_USB_FUNCTIONFS_RNDIS GFS_STRING_FIRST_CONFIG_IDX,
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
}; };
static char gfs_manufacturer[50]; static char gfs_manufacturer[50];
...@@ -126,13 +119,13 @@ static struct usb_string gfs_strings[] = { ...@@ -126,13 +119,13 @@ static struct usb_string gfs_strings[] = {
[GFS_STRING_MANUFACTURER_IDX].s = gfs_manufacturer, [GFS_STRING_MANUFACTURER_IDX].s = gfs_manufacturer,
[GFS_STRING_PRODUCT_IDX].s = gfs_driver_desc, [GFS_STRING_PRODUCT_IDX].s = gfs_driver_desc,
#ifdef CONFIG_USB_FUNCTIONFS_RNDIS #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
[GFS_STRING_RNDIS_CONFIG_IDX].s = "FunctionFS + RNDIS", { .s = "FunctionFS + RNDIS" },
#endif #endif
#ifdef CONFIG_USB_FUNCTIONFS_ETH #ifdef CONFIG_USB_FUNCTIONFS_ETH
[GFS_STRING_ECM_CONFIG_IDX].s = "FunctionFS + ECM", { .s = "FunctionFS + ECM" },
#endif #endif
#ifdef CONFIG_USB_FUNCTIONFS_GENERIC #ifdef CONFIG_USB_FUNCTIONFS_GENERIC
[GFS_STRING_GENERIC_CONFIG_IDX].s = "FunctionFS", { .s = "FunctionFS" },
#endif #endif
{ } /* end of list */ { } /* end of list */
}; };
...@@ -146,59 +139,33 @@ static struct usb_gadget_strings *gfs_dev_strings[] = { ...@@ -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); {
.eth = rndis_bind_config,
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
#endif #endif
#ifdef CONFIG_USB_FUNCTIONFS_ETH #ifdef CONFIG_USB_FUNCTIONFS_ETH
static int gfs_do_ecm_config(struct usb_configuration *c); {
.eth = eth_bind_config,
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
#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_bind(struct usb_composite_dev *cdev);
static int gfs_unbind(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 = { static struct usb_composite_driver gfs_driver = {
.name = gfs_short_name, .name = gfs_short_name,
...@@ -267,7 +234,7 @@ static int functionfs_check_dev_callback(const char *dev_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) ...@@ -284,57 +251,32 @@ static int gfs_bind(struct usb_composite_dev *cdev)
snprintf(gfs_manufacturer, sizeof gfs_manufacturer, "%s %s with %s", snprintf(gfs_manufacturer, sizeof gfs_manufacturer, "%s %s with %s",
init_utsname()->sysname, init_utsname()->release, init_utsname()->sysname, init_utsname()->release,
cdev->gadget->name); 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_ids_tab(cdev, gfs_strings);
ret = usb_string_id(cdev);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
goto error; goto error;
gfs_strings[GFS_STRING_ECM_CONFIG_IDX].id = ret;
gfs_ecm_config_driver.iConfiguration = ret;
#endif
#ifdef CONFIG_USB_FUNCTIONFS_GENERIC gfs_dev_desc.iManufacturer = gfs_strings[GFS_STRING_MANUFACTURER_IDX].id;
ret = usb_string_id(cdev); gfs_dev_desc.iProduct = gfs_strings[GFS_STRING_PRODUCT_IDX].id;
if (unlikely(ret < 0))
goto error;
gfs_strings[GFS_STRING_GENERIC_CONFIG_IDX].id = ret;
gfs_generic_config_driver.iConfiguration = ret;
#endif
ret = functionfs_bind(gfs_ffs_data, cdev); ret = functionfs_bind(gfs_ffs_data, cdev);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
goto error; goto error;
ret = gfs_add_rndis_config(cdev); for (i = 0; i < ARRAY_SIZE(gfs_configurations); ++i) {
if (unlikely(ret < 0)) struct gfs_configuration *c = gfs_configurations + i;
goto error_unbind;
ret = gfs_add_ecm_config(cdev); ret = GFS_STRING_FIRST_CONFIG_IDX + i;
if (unlikely(ret < 0)) c->c.label = gfs_strings[ret].s;
goto error_unbind; 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); ret = usb_add_config(cdev, &c->c);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
goto error_unbind; goto error_unbind;
}
return 0; return 0;
...@@ -368,10 +310,10 @@ static int gfs_unbind(struct usb_composite_dev *cdev) ...@@ -368,10 +310,10 @@ static int gfs_unbind(struct usb_composite_dev *cdev)
} }
static int __gfs_do_config(struct usb_configuration *c, static int gfs_do_config(struct usb_configuration *c)
int (*eth)(struct usb_configuration *c, u8 *ethaddr),
u8 *ethaddr)
{ {
struct gfs_configuration *gc =
container_of(c, struct gfs_configuration, c);
int ret; int ret;
if (WARN_ON(!gfs_ffs_data)) if (WARN_ON(!gfs_ffs_data))
...@@ -382,8 +324,8 @@ static int __gfs_do_config(struct usb_configuration *c, ...@@ -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) { if (gc->eth) {
ret = eth(c, ethaddr); ret = gc->eth(c, gfs_hostaddr);
if (unlikely(ret < 0)) if (unlikely(ret < 0))
return ret; return ret;
} }
...@@ -406,32 +348,12 @@ static int __gfs_do_config(struct usb_configuration *c, ...@@ -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) static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
{
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)
{ {
ENTER(); return can_support_ecm(c->cdev->gadget)
? ecm_bind_config(c, ethaddr)
return __gfs_do_config(c, NULL, NULL); : geth_bind_config(c, ethaddr);
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment