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