Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | #ifndef USB_F_MASS_STORAGE_H #define USB_F_MASS_STORAGE_H #include <linux/usb/composite.h> #include "storage_common.h" struct fsg_module_parameters { char *file[FSG_MAX_LUNS]; bool ro[FSG_MAX_LUNS]; bool removable[FSG_MAX_LUNS]; bool cdrom[FSG_MAX_LUNS]; bool nofua[FSG_MAX_LUNS]; unsigned int file_count, ro_count, removable_count, cdrom_count; unsigned int nofua_count; unsigned int luns; /* nluns */ bool stall; /* can_stall */ }; #define _FSG_MODULE_PARAM_ARRAY(prefix, params, name, type, desc) \ module_param_array_named(prefix ## name, params.name, type, \ &prefix ## params.name ## _count, \ S_IRUGO); \ MODULE_PARM_DESC(prefix ## name, desc) #define _FSG_MODULE_PARAM(prefix, params, name, type, desc) \ module_param_named(prefix ## name, params.name, type, \ S_IRUGO); \ MODULE_PARM_DESC(prefix ## name, desc) #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, \ "true to force read-only"); \ _FSG_MODULE_PARAM_ARRAY(prefix, params, removable, bool, \ "true to simulate removable media"); \ _FSG_MODULE_PARAM_ARRAY(prefix, params, cdrom, bool, \ "true to simulate CD-ROM instead of disk"); \ _FSG_MODULE_PARAM_ARRAY(prefix, params, nofua, bool, \ "true to ignore SCSI WRITE(10,12) FUA bit"); \ _FSG_MODULE_PARAM(prefix, params, luns, uint, \ "number of LUNs"); \ _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 struct fsg_common; /* FSF callback functions */ struct fsg_operations { /* * Callback function to call when thread exits. If no * callback is set or it returns value lower then zero MSF * will force eject all LUNs it operates on (including those * marked as non-removable or with prevent_medium_removal flag * set). */ int (*thread_exits)(struct fsg_common *common); }; struct fsg_lun_opts { struct config_group group; struct fsg_lun *lun; int lun_id; }; struct fsg_opts { struct fsg_common *common; struct usb_function_instance func_inst; struct fsg_lun_opts lun0; struct config_group *default_groups[2]; bool no_configfs; /* for legacy gadgets */ /* * Read/write access to configfs attributes is handled by configfs. * * This is to protect the data from concurrent access by read/write * and create symlink/remove symlink. */ struct mutex lock; int refcnt; }; struct fsg_lun_config { const char *filename; char ro; char removable; char cdrom; char nofua; char inquiry_string[INQUIRY_STRING_LEN]; }; struct fsg_config { unsigned nluns; struct fsg_lun_config luns[FSG_MAX_LUNS]; /* Callback functions. */ const struct fsg_operations *ops; /* Gadget's private data. */ void *private_data; const char *vendor_name; /* 8 characters or less */ const char *product_name; /* 16 characters or less */ char can_stall; unsigned int fsg_num_buffers; }; static inline struct fsg_opts * fsg_opts_from_func_inst(const struct usb_function_instance *fi) { return container_of(fi, struct fsg_opts, func_inst); } void fsg_common_get(struct fsg_common *common); void fsg_common_put(struct fsg_common *common); void fsg_common_set_sysfs(struct fsg_common *common, bool sysfs); int fsg_common_set_num_buffers(struct fsg_common *common, unsigned int n); void fsg_common_free_buffers(struct fsg_common *common); int fsg_common_set_cdev(struct fsg_common *common, struct usb_composite_dev *cdev, bool can_stall); void fsg_common_remove_lun(struct fsg_lun *lun); void fsg_common_remove_luns(struct fsg_common *common); void fsg_common_set_ops(struct fsg_common *common, const struct fsg_operations *ops); int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg, unsigned int id, const char *name, const char **name_pfx); int fsg_common_create_luns(struct fsg_common *common, struct fsg_config *cfg); void fsg_common_set_inquiry_string(struct fsg_common *common, const char *vn, const char *pn); void fsg_config_from_params(struct fsg_config *cfg, const struct fsg_module_parameters *params, unsigned int fsg_num_buffers); #endif /* USB_F_MASS_STORAGE_H */ |