1b88eae75283972bd8321b3d2e39a4dc4eb9720e
[firefly-linux-kernel-4.4.55.git] / drivers / usb / gadget / f_mass_storage.h
1 #ifndef USB_F_MASS_STORAGE_H
2 #define USB_F_MASS_STORAGE_H
3
4 #include "storage_common.h"
5
6 struct fsg_module_parameters {
7         char            *file[FSG_MAX_LUNS];
8         bool            ro[FSG_MAX_LUNS];
9         bool            removable[FSG_MAX_LUNS];
10         bool            cdrom[FSG_MAX_LUNS];
11         bool            nofua[FSG_MAX_LUNS];
12
13         unsigned int    file_count, ro_count, removable_count, cdrom_count;
14         unsigned int    nofua_count;
15         unsigned int    luns;   /* nluns */
16         bool            stall;  /* can_stall */
17 };
18
19 #define _FSG_MODULE_PARAM_ARRAY(prefix, params, name, type, desc)       \
20         module_param_array_named(prefix ## name, params.name, type,     \
21                                  &prefix ## params.name ## _count,      \
22                                  S_IRUGO);                              \
23         MODULE_PARM_DESC(prefix ## name, desc)
24
25 #define _FSG_MODULE_PARAM(prefix, params, name, type, desc)             \
26         module_param_named(prefix ## name, params.name, type,           \
27                            S_IRUGO);                                    \
28         MODULE_PARM_DESC(prefix ## name, desc)
29
30 #define __FSG_MODULE_PARAMETERS(prefix, params)                         \
31         _FSG_MODULE_PARAM_ARRAY(prefix, params, file, charp,            \
32                                 "names of backing files or devices");   \
33         _FSG_MODULE_PARAM_ARRAY(prefix, params, ro, bool,               \
34                                 "true to force read-only");             \
35         _FSG_MODULE_PARAM_ARRAY(prefix, params, removable, bool,        \
36                                 "true to simulate removable media");    \
37         _FSG_MODULE_PARAM_ARRAY(prefix, params, cdrom, bool,            \
38                                 "true to simulate CD-ROM instead of disk"); \
39         _FSG_MODULE_PARAM_ARRAY(prefix, params, nofua, bool,            \
40                                 "true to ignore SCSI WRITE(10,12) FUA bit"); \
41         _FSG_MODULE_PARAM(prefix, params, luns, uint,                   \
42                           "number of LUNs");                            \
43         _FSG_MODULE_PARAM(prefix, params, stall, bool,                  \
44                           "false to prevent bulk stalls")
45
46 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
47
48 #define FSG_MODULE_PARAMETERS(prefix, params)                           \
49         __FSG_MODULE_PARAMETERS(prefix, params);                        \
50         module_param_named(num_buffers, fsg_num_buffers, uint, S_IRUGO);\
51         MODULE_PARM_DESC(num_buffers, "Number of pipeline buffers")
52 #else
53
54 #define FSG_MODULE_PARAMETERS(prefix, params)                           \
55         __FSG_MODULE_PARAMETERS(prefix, params)
56
57 #endif
58
59 struct fsg_common;
60
61 /* FSF callback functions */
62 struct fsg_operations {
63         /*
64          * Callback function to call when thread exits.  If no
65          * callback is set or it returns value lower then zero MSF
66          * will force eject all LUNs it operates on (including those
67          * marked as non-removable or with prevent_medium_removal flag
68          * set).
69          */
70         int (*thread_exits)(struct fsg_common *common);
71 };
72
73 struct fsg_lun_config {
74         const char *filename;
75         char ro;
76         char removable;
77         char cdrom;
78         char nofua;
79 };
80
81 struct fsg_config {
82         unsigned nluns;
83         struct fsg_lun_config luns[FSG_MAX_LUNS];
84
85         /* Callback functions. */
86         const struct fsg_operations     *ops;
87         /* Gadget's private data. */
88         void                    *private_data;
89
90         const char *vendor_name;                /*  8 characters or less */
91         const char *product_name;               /* 16 characters or less */
92
93         char                    can_stall;
94         unsigned int            fsg_num_buffers;
95 };
96
97 void fsg_common_get(struct fsg_common *common);
98
99 void fsg_common_put(struct fsg_common *common);
100
101 struct fsg_common *fsg_common_init(struct fsg_common *common,
102                                    struct usb_composite_dev *cdev,
103                                    struct fsg_config *cfg);
104
105 void fsg_common_set_sysfs(struct fsg_common *common, bool sysfs);
106
107 void fsg_config_from_params(struct fsg_config *cfg,
108                             const struct fsg_module_parameters *params,
109                             unsigned int fsg_num_buffers);
110
111 static inline struct fsg_common *
112 fsg_common_from_params(struct fsg_common *common,
113                        struct usb_composite_dev *cdev,
114                        const struct fsg_module_parameters *params,
115                        unsigned int fsg_num_buffers)
116         __attribute__((unused));
117 static inline struct fsg_common *
118 fsg_common_from_params(struct fsg_common *common,
119                        struct usb_composite_dev *cdev,
120                        const struct fsg_module_parameters *params,
121                        unsigned int fsg_num_buffers)
122 {
123         struct fsg_config cfg;
124         fsg_config_from_params(&cfg, params, fsg_num_buffers);
125         return fsg_common_init(common, cdev, &cfg);
126 }
127
128 #endif /* USB_F_MASS_STORAGE_H */