Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fdc5dd2 authored by Andrzej Pietrasiewicz's avatar Andrzej Pietrasiewicz Committed by Felipe Balbi
Browse files

usb: gadget: create a utility module for mass_storage



Converting to configfs requires making the f_mass_storage.c a module.

But first we need to get rid of "#include "storage_common.c".

This patch makes storage_common.c a separately compiled file, which is
built as a utility module named u_ms.ko. After all mass storage users are
converted to the new function interface this module can be eliminated
by merging it with the mass storage function's module.

USB descriptors are exported so that they can be accessed from
f_mass_storage.

FSG_VENDOR_ID and FSG_PRODUCT_ID are moved to their only user.

Handling of CONFIG_USB_GADGET_DEBUG_FILES is moved to f_mass_storage.c.
The fsg_num_buffers static is moved to FSG_MODULE_PARAMETER users, so
instead of using a global variable the f_mass_storage introduces
fsg_num_buffers member in fsg_common (and fsg_config).

fsg_strings and fsg_stringtab are moved to f_mass_storage.c.

Signed-off-by: default avatarAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 092a4bd0
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -525,6 +525,9 @@ config USB_F_SUBSET
config USB_F_RNDIS
	tristate

config USB_U_MS
	tristate

choice
	tristate "USB Gadget Drivers"
	default USB_ETH
@@ -878,6 +881,7 @@ config USB_MASS_STORAGE
	tristate "Mass Storage Gadget"
	depends on BLOCK
	select USB_LIBCOMPOSITE
	select USB_U_MS
	help
	  The Mass Storage Gadget acts as a USB Mass Storage disk drive.
	  As its storage repository it can use a regular file or a block
@@ -1001,6 +1005,7 @@ config USB_G_ACM_MS
	select USB_LIBCOMPOSITE
	select USB_U_SERIAL
	select USB_F_ACM
	select USB_U_MS
	help
	  This driver provides two functions in one configuration:
	  a mass storage, and a CDC ACM (serial port) link.
@@ -1017,6 +1022,7 @@ config USB_G_MULTI
	select USB_U_ETHER
	select USB_U_RNDIS
	select USB_F_ACM
	select USB_U_MS
	help
	  The Multifunction Composite Gadget provides Ethernet (RNDIS
	  and/or CDC Ethernet), mass storage and ACM serial link
+2 −0
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@ usb_f_ecm_subset-y := f_subset.o
obj-$(CONFIG_USB_F_SUBSET)	+= usb_f_ecm_subset.o
usb_f_rndis-y			:= f_rndis.o
obj-$(CONFIG_USB_F_RNDIS)	+= usb_f_rndis.o
u_ms-y				:= storage_common.o
obj-$(CONFIG_USB_U_MS)		+= u_ms.o

#
# USB gadget drivers
+16 −1
Original line number Diff line number Diff line
@@ -104,6 +104,20 @@ static struct usb_gadget_strings *dev_strings[] = {
/****************************** Configurations ******************************/

static struct fsg_module_parameters fsg_mod_data = { .stall = 1 };
#ifdef CONFIG_USB_GADGET_DEBUG_FILES

static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS;

#else

/*
 * Number of buffers we will use.
 * 2 is usually enough for good buffering pipeline
 */
#define fsg_num_buffers	CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS

#endif /* CONFIG_USB_DEBUG */

FSG_MODULE_PARAMETERS(/* no prefix */, fsg_mod_data);

static struct fsg_common fsg_common;
@@ -167,7 +181,8 @@ static int __init acm_ms_bind(struct usb_composite_dev *cdev)
	void			*retp;

	/* set up mass storage function */
	retp = fsg_common_from_params(&fsg_common, cdev, &fsg_mod_data);
	retp = fsg_common_from_params(&fsg_common, cdev, &fsg_mod_data,
				      fsg_num_buffers);
	if (IS_ERR(retp)) {
		status = PTR_ERR(retp);
		return PTR_ERR(retp);
+91 −15
Original line number Diff line number Diff line
@@ -228,8 +228,18 @@

static const char fsg_string_interface[] = "Mass Storage";

#include "storage_common.c"
#include "storage_common.h"

/* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */
static struct usb_string		fsg_strings[] = {
	{FSG_STRING_INTERFACE,		fsg_string_interface},
	{}
};

static struct usb_gadget_strings	fsg_stringtab = {
	.language	= 0x0409,		/* en-us */
	.strings	= fsg_strings,
};

/*-------------------------------------------------------------------------*/

@@ -268,6 +278,7 @@ struct fsg_common {
	struct fsg_buffhd	*next_buffhd_to_fill;
	struct fsg_buffhd	*next_buffhd_to_drain;
	struct fsg_buffhd	*buffhds;
	unsigned int		fsg_num_buffers;

	int			cmnd_size;
	u8			cmnd[MAX_COMMAND_SIZE];
@@ -332,6 +343,7 @@ struct fsg_config {
	const char *product_name;		/* 16 characters or less */

	char			can_stall;
	unsigned int		fsg_num_buffers;
};

struct fsg_dev {
@@ -2244,7 +2256,7 @@ static int do_set_interface(struct fsg_common *common, struct fsg_dev *new_fsg)
	if (common->fsg) {
		fsg = common->fsg;

		for (i = 0; i < fsg_num_buffers; ++i) {
		for (i = 0; i < common->fsg_num_buffers; ++i) {
			struct fsg_buffhd *bh = &common->buffhds[i];

			if (bh->inreq) {
@@ -2303,7 +2315,7 @@ static int do_set_interface(struct fsg_common *common, struct fsg_dev *new_fsg)
	clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags);

	/* Allocate the requests */
	for (i = 0; i < fsg_num_buffers; ++i) {
	for (i = 0; i < common->fsg_num_buffers; ++i) {
		struct fsg_buffhd	*bh = &common->buffhds[i];

		rc = alloc_request(common, fsg->bulk_in, &bh->inreq);
@@ -2372,7 +2384,7 @@ static void handle_exception(struct fsg_common *common)

	/* Cancel all the pending transfers */
	if (likely(common->fsg)) {
		for (i = 0; i < fsg_num_buffers; ++i) {
		for (i = 0; i < common->fsg_num_buffers; ++i) {
			bh = &common->buffhds[i];
			if (bh->inreq_busy)
				usb_ep_dequeue(common->fsg->bulk_in, bh->inreq);
@@ -2384,7 +2396,7 @@ static void handle_exception(struct fsg_common *common)
		/* Wait until everything is idle */
		for (;;) {
			int num_active = 0;
			for (i = 0; i < fsg_num_buffers; ++i) {
			for (i = 0; i < common->fsg_num_buffers; ++i) {
				bh = &common->buffhds[i];
				num_active += bh->inreq_busy + bh->outreq_busy;
			}
@@ -2407,7 +2419,7 @@ static void handle_exception(struct fsg_common *common)
	 */
	spin_lock_irq(&common->lock);

	for (i = 0; i < fsg_num_buffers; ++i) {
	for (i = 0; i < common->fsg_num_buffers; ++i) {
		bh = &common->buffhds[i];
		bh->state = BUF_STATE_EMPTY;
	}
@@ -2580,6 +2592,41 @@ static int fsg_main_thread(void *common_)

/*************************** DEVICE ATTRIBUTES ***************************/

static ssize_t ro_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	return fsg_show_ro(dev, attr, buf);
}

static ssize_t nofua_show(struct device *dev, struct device_attribute *attr,
			  char *buf)
{
	return fsg_show_nofua(dev, attr, buf);
}

static ssize_t file_show(struct device *dev, struct device_attribute *attr,
			 char *buf)
{
	return fsg_show_file(dev, attr, buf);
}

static ssize_t ro_store(struct device *dev, struct device_attribute *attr,
			const char *buf, size_t count)
{
	return fsg_store_ro(dev, attr, buf, count);
}

static ssize_t nofua_store(struct device *dev, struct device_attribute *attr,
			   const char *buf, size_t count)
{
	return fsg_store_nofua(dev, attr, buf, count);
}

static ssize_t file_store(struct device *dev, struct device_attribute *attr,
			  const char *buf, size_t count)
{
	return fsg_store_file(dev, attr, buf, count);
}

static DEVICE_ATTR_RW(ro);
static DEVICE_ATTR_RW(nofua);
static DEVICE_ATTR_RW(file);
@@ -2607,6 +2654,16 @@ static inline void fsg_common_put(struct fsg_common *common)
	kref_put(&common->ref, fsg_common_release);
}

/* check if fsg_num_buffers is within a valid range */
static inline int fsg_num_buffers_validate(unsigned int fsg_num_buffers)
{
	if (fsg_num_buffers >= 2 && fsg_num_buffers <= 4)
		return 0;
	pr_err("fsg_num_buffers %u is out of range (%d to %d)\n",
	       fsg_num_buffers, 2, 4);
	return -EINVAL;
}

static struct fsg_common *fsg_common_init(struct fsg_common *common,
					  struct usb_composite_dev *cdev,
					  struct fsg_config *cfg)
@@ -2618,7 +2675,7 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common,
	int nluns, i, rc;
	char *pathbuf;

	rc = fsg_num_buffers_validate();
	rc = fsg_num_buffers_validate(cfg->fsg_num_buffers);
	if (rc != 0)
		return ERR_PTR(rc);

@@ -2640,7 +2697,8 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common,
		common->free_storage_on_release = 0;
	}

	common->buffhds = kcalloc(fsg_num_buffers,
	common->fsg_num_buffers = cfg->fsg_num_buffers;
	common->buffhds = kcalloc(common->fsg_num_buffers,
				  sizeof *(common->buffhds), GFP_KERNEL);
	if (!common->buffhds) {
		if (common->free_storage_on_release)
@@ -2727,7 +2785,7 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common,

	/* Data buffers cyclic list */
	bh = common->buffhds;
	i = fsg_num_buffers;
	i = common->fsg_num_buffers;
	goto buffhds_first_it;
	do {
		bh->next = bh + 1;
@@ -2847,7 +2905,7 @@ static void fsg_common_release(struct kref *ref)

	{
		struct fsg_buffhd *bh = common->buffhds;
		unsigned i = fsg_num_buffers;
		unsigned i = common->fsg_num_buffers;
		do {
			kfree(bh->buf);
		} while (++bh, --i);
@@ -3009,7 +3067,7 @@ struct fsg_module_parameters {
			   S_IRUGO);					\
	MODULE_PARM_DESC(prefix ## name, desc)

#define FSG_MODULE_PARAMETERS(prefix, params)				\
#define __FSG_MODULE_PARAMETERS(prefix, params)				\
	_FSG_MODULE_PARAM_ARRAY(prefix, params, file, charp,		\
				"names of backing files or devices");	\
	_FSG_MODULE_PARAM_ARRAY(prefix, params, ro, bool,		\
@@ -3025,9 +3083,24 @@ struct fsg_module_parameters {
	_FSG_MODULE_PARAM(prefix, params, stall, bool,			\
			  "false to prevent bulk stalls")

#ifdef CONFIG_USB_GADGET_DEBUG_FILES

#define FSG_MODULE_PARAMETERS(prefix, params)				\
	__FSG_MODULE_PARAMETERS(prefix, params);			\
	module_param_named(num_buffers, fsg_num_buffers, uint, S_IRUGO);\
	MODULE_PARM_DESC(num_buffers, "Number of pipeline buffers")
#else

#define FSG_MODULE_PARAMETERS(prefix, params)				\
	__FSG_MODULE_PARAMETERS(prefix, params)

#endif


static void
fsg_config_from_params(struct fsg_config *cfg,
		       const struct fsg_module_parameters *params)
		       const struct fsg_module_parameters *params,
		       unsigned int fsg_num_buffers)
{
	struct fsg_lun_config *lun;
	unsigned i;
@@ -3055,19 +3128,22 @@ fsg_config_from_params(struct fsg_config *cfg,

	/* Finalise */
	cfg->can_stall = params->stall;
	cfg->fsg_num_buffers = fsg_num_buffers;
}

static inline struct fsg_common *
fsg_common_from_params(struct fsg_common *common,
		       struct usb_composite_dev *cdev,
		       const struct fsg_module_parameters *params)
		       const struct fsg_module_parameters *params,
		       unsigned int fsg_num_buffers)
	__attribute__((unused));
static inline struct fsg_common *
fsg_common_from_params(struct fsg_common *common,
		       struct usb_composite_dev *cdev,
		       const struct fsg_module_parameters *params)
		       const struct fsg_module_parameters *params,
		       unsigned int fsg_num_buffers)
{
	struct fsg_config cfg;
	fsg_config_from_params(&cfg, params);
	fsg_config_from_params(&cfg, params, fsg_num_buffers);
	return fsg_common_init(common, cdev, &cfg);
}
+24 −1
Original line number Diff line number Diff line
@@ -37,6 +37,15 @@
#define DRIVER_DESC		"Mass Storage Gadget"
#define DRIVER_VERSION		"2009/09/11"

/*
 * Thanks to NetChip Technologies for donating this product ID.
 *
 * DO NOT REUSE THESE IDs with any other driver!!  Ever!!
 * Instead:  allocate your own, using normal USB-IF procedures.
 */
#define FSG_VENDOR_ID	0x0525	/* NetChip */
#define FSG_PRODUCT_ID	0xa4a5	/* Linux-USB File-backed Storage Gadget */

/*-------------------------------------------------------------------------*/

/*
@@ -102,6 +111,20 @@ static struct usb_gadget_strings *dev_strings[] = {
static struct fsg_module_parameters mod_data = {
	.stall = 1
};
#ifdef CONFIG_USB_GADGET_DEBUG_FILES

static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS;

#else

/*
 * Number of buffers we will use.
 * 2 is usually enough for good buffering pipeline
 */
#define fsg_num_buffers	CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS

#endif /* CONFIG_USB_GADGET_DEBUG_FILES */

FSG_MODULE_PARAMETERS(/* no prefix */, mod_data);

static unsigned long msg_registered;
@@ -129,7 +152,7 @@ static int __init msg_do_config(struct usb_configuration *c)
		c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
	}

	fsg_config_from_params(&config, &mod_data);
	fsg_config_from_params(&config, &mod_data, fsg_num_buffers);
	config.ops = &ops;

	retp = fsg_common_init(&common, c->cdev, &config);
Loading