1f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#ifndef USB_F_MASS_STORAGE_H
2f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#define USB_F_MASS_STORAGE_H
3f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
4e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz#include <linux/usb/composite.h>
5f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#include "storage_common.h"
6f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
7f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczstruct fsg_module_parameters {
8f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	char		*file[FSG_MAX_LUNS];
9f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	bool		ro[FSG_MAX_LUNS];
10f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	bool		removable[FSG_MAX_LUNS];
11f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	bool		cdrom[FSG_MAX_LUNS];
12f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	bool		nofua[FSG_MAX_LUNS];
13f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
14f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	unsigned int	file_count, ro_count, removable_count, cdrom_count;
15f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	unsigned int	nofua_count;
16f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	unsigned int	luns;	/* nluns */
17f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	bool		stall;	/* can_stall */
18f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz};
19f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
20f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#define _FSG_MODULE_PARAM_ARRAY(prefix, params, name, type, desc)	\
21f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	module_param_array_named(prefix ## name, params.name, type,	\
22f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				 &prefix ## params.name ## _count,	\
23f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				 S_IRUGO);				\
24f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	MODULE_PARM_DESC(prefix ## name, desc)
25f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
26f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#define _FSG_MODULE_PARAM(prefix, params, name, type, desc)		\
27f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	module_param_named(prefix ## name, params.name, type,		\
28f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz			   S_IRUGO);					\
29f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	MODULE_PARM_DESC(prefix ## name, desc)
30f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
31f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#define __FSG_MODULE_PARAMETERS(prefix, params)				\
32f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM_ARRAY(prefix, params, file, charp,		\
33f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				"names of backing files or devices");	\
34f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM_ARRAY(prefix, params, ro, bool,		\
35f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				"true to force read-only");		\
36f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM_ARRAY(prefix, params, removable, bool,	\
37f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				"true to simulate removable media");	\
38f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM_ARRAY(prefix, params, cdrom, bool,		\
39f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				"true to simulate CD-ROM instead of disk"); \
40f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM_ARRAY(prefix, params, nofua, bool,		\
41f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz				"true to ignore SCSI WRITE(10,12) FUA bit"); \
42f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM(prefix, params, luns, uint,			\
43f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz			  "number of LUNs");				\
44f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	_FSG_MODULE_PARAM(prefix, params, stall, bool,			\
45f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz			  "false to prevent bulk stalls")
46f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
47f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#ifdef CONFIG_USB_GADGET_DEBUG_FILES
48f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
49f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#define FSG_MODULE_PARAMETERS(prefix, params)				\
50f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	__FSG_MODULE_PARAMETERS(prefix, params);			\
51f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	module_param_named(num_buffers, fsg_num_buffers, uint, S_IRUGO);\
52f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	MODULE_PARM_DESC(num_buffers, "Number of pipeline buffers")
53f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#else
54f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
55f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#define FSG_MODULE_PARAMETERS(prefix, params)				\
56f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	__FSG_MODULE_PARAMETERS(prefix, params)
57f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
58f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#endif
59f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
60f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczstruct fsg_common;
61f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
62f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz/* FSF callback functions */
63f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczstruct fsg_operations {
64f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	/*
65f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	 * Callback function to call when thread exits.  If no
66f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	 * callback is set or it returns value lower then zero MSF
67f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	 * will force eject all LUNs it operates on (including those
68f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	 * marked as non-removable or with prevent_medium_removal flag
69f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	 * set).
70f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	 */
71f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	int (*thread_exits)(struct fsg_common *common);
72f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz};
73f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
74ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewiczstruct fsg_lun_opts {
75ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	struct config_group group;
76ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	struct fsg_lun *lun;
77ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	int lun_id;
78ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz};
79ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz
80e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewiczstruct fsg_opts {
81e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz	struct fsg_common *common;
82e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz	struct usb_function_instance func_inst;
83ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	struct fsg_lun_opts lun0;
84ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	struct config_group *default_groups[2];
85e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz	bool no_configfs; /* for legacy gadgets */
86ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz
87ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	/*
88ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	 * Read/write access to configfs attributes is handled by configfs.
89ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	 *
90ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	 * This is to protect the data from concurrent access by read/write
91ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	 * and create symlink/remove symlink.
92ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	 */
93ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	struct mutex			lock;
94ef0aa4b92cf10a7684135c61dc406398308b328fAndrzej Pietrasiewicz	int				refcnt;
95e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz};
96e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz
97f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczstruct fsg_lun_config {
98f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	const char *filename;
99f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	char ro;
100f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	char removable;
101f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	char cdrom;
102f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	char nofua;
103f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz};
104f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
105f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczstruct fsg_config {
106f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	unsigned nluns;
107f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	struct fsg_lun_config luns[FSG_MAX_LUNS];
108f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
109f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	/* Callback functions. */
110f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	const struct fsg_operations	*ops;
111f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	/* Gadget's private data. */
112f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	void			*private_data;
113f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
114f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	const char *vendor_name;		/*  8 characters or less */
115f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	const char *product_name;		/* 16 characters or less */
116f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
117f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	char			can_stall;
118f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz	unsigned int		fsg_num_buffers;
119f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz};
120f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
121e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewiczstatic inline struct fsg_opts *
122e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewiczfsg_opts_from_func_inst(const struct usb_function_instance *fi)
123e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz{
124e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz	return container_of(fi, struct fsg_opts, func_inst);
125e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz}
126e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz
127f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczvoid fsg_common_get(struct fsg_common *common);
128f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
129f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczvoid fsg_common_put(struct fsg_common *common);
130f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
131bd528d4e699b212a763eecda9cacffb4b85a5fe6Andrzej Pietrasiewiczvoid fsg_common_set_sysfs(struct fsg_common *common, bool sysfs);
132bd528d4e699b212a763eecda9cacffb4b85a5fe6Andrzej Pietrasiewicz
1336313caace5f5b4fd2c23b9bc40ea26f252a28bf9Andrzej Pietrasiewiczint fsg_common_set_num_buffers(struct fsg_common *common, unsigned int n);
1346313caace5f5b4fd2c23b9bc40ea26f252a28bf9Andrzej Pietrasiewicz
135e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewiczvoid fsg_common_free_buffers(struct fsg_common *common);
136e5eaa0dc4866181aff655ef3f94cd990172b751fAndrzej Pietrasiewicz
137a891d7a32f47118ce2ccfc8cac994aded8393fcdAndrzej Pietrasiewiczint fsg_common_set_cdev(struct fsg_common *common,
138a891d7a32f47118ce2ccfc8cac994aded8393fcdAndrzej Pietrasiewicz			struct usb_composite_dev *cdev, bool can_stall);
139a891d7a32f47118ce2ccfc8cac994aded8393fcdAndrzej Pietrasiewicz
14070634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewiczvoid fsg_common_remove_lun(struct fsg_lun *lun, bool sysfs);
14170634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewicz
14270634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewiczvoid fsg_common_remove_luns(struct fsg_common *common);
14370634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewicz
14470634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewiczvoid fsg_common_free_luns(struct fsg_common *common);
14570634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewicz
14670634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewiczint fsg_common_set_nluns(struct fsg_common *common, int nluns);
14770634170999a15e338b4091e06bd36ffdd283899Andrzej Pietrasiewicz
1482412fbf1ffac21da14308924ccb17fe1a5506b1aAndrzej Pietrasiewiczvoid fsg_common_set_ops(struct fsg_common *common,
1492412fbf1ffac21da14308924ccb17fe1a5506b1aAndrzej Pietrasiewicz			const struct fsg_operations *ops);
1502412fbf1ffac21da14308924ccb17fe1a5506b1aAndrzej Pietrasiewicz
151b27c08c953e994f792a03d9b7cbc5cf3f9844135Andrzej Pietrasiewiczint fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg,
152b27c08c953e994f792a03d9b7cbc5cf3f9844135Andrzej Pietrasiewicz			  unsigned int id, const char *name,
153b27c08c953e994f792a03d9b7cbc5cf3f9844135Andrzej Pietrasiewicz			  const char **name_pfx);
154b27c08c953e994f792a03d9b7cbc5cf3f9844135Andrzej Pietrasiewicz
155b27c08c953e994f792a03d9b7cbc5cf3f9844135Andrzej Pietrasiewiczint fsg_common_create_luns(struct fsg_common *common, struct fsg_config *cfg);
156b27c08c953e994f792a03d9b7cbc5cf3f9844135Andrzej Pietrasiewicz
15723682e3c78c54620ccc6e3462220851e1ae8b02fAndrzej Pietrasiewiczvoid fsg_common_set_inquiry_string(struct fsg_common *common, const char *vn,
15823682e3c78c54620ccc6e3462220851e1ae8b02fAndrzej Pietrasiewicz				   const char *pn);
15923682e3c78c54620ccc6e3462220851e1ae8b02fAndrzej Pietrasiewicz
1605de862d73b2c1b3fbb0ac8b45eb496d77347d1b8Andrzej Pietrasiewiczint fsg_common_run_thread(struct fsg_common *common);
1615de862d73b2c1b3fbb0ac8b45eb496d77347d1b8Andrzej Pietrasiewicz
162f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewiczvoid fsg_config_from_params(struct fsg_config *cfg,
163f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz			    const struct fsg_module_parameters *params,
164f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz			    unsigned int fsg_num_buffers);
165f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz
166f3fed36749a1f9a948afdc3b21008e7f65e43220Andrzej Pietrasiewicz#endif /* USB_F_MASS_STORAGE_H */
167