| * Overview | 
 |  | 
 |   Mass Storage Gadget (or MSG) acts as a USB Mass Storage device, | 
 |   appearing to the host as a disk or a CD-ROM drive.  It supports | 
 |   multiple logical units (LUNs).  Backing storage for each LUN is | 
 |   provided by a regular file or a block device, access can be limited | 
 |   to read-only, and gadget can indicate that it is removable and/or | 
 |   CD-ROM (the latter implies read-only access). | 
 |  | 
 |   Its requirements are modest; only a bulk-in and a bulk-out endpoint | 
 |   are needed.  The memory requirement amounts to two 16K buffers. | 
 |   Support is included for full-speed, high-speed and SuperSpeed | 
 |   operation. | 
 |  | 
 |   Note that the driver is slightly non-portable in that it assumes | 
 |   a single memory/DMA buffer will be usable for bulk-in and bulk-out | 
 |   endpoints.  With most device controllers this is not an issue, but | 
 |   there may be some with hardware restrictions that prevent a buffer | 
 |   from being used by more than one endpoint. | 
 |  | 
 |   This document describes how to use the gadget from user space, its | 
 |   relation to mass storage function (or MSF) and different gadgets | 
 |   using it, and how it differs from File Storage Gadget (or FSG) | 
 |   (which is no longer included in Linux).  It will talk only briefly | 
 |   about how to use MSF within composite gadgets. | 
 |  | 
 | * Module parameters | 
 |  | 
 |   The mass storage gadget accepts the following mass storage specific | 
 |   module parameters: | 
 |  | 
 |   - file=filename[,filename...] | 
 |  | 
 |     This parameter lists paths to files or block devices used for | 
 |     backing storage for each logical unit.  There may be at most | 
 |     FSG_MAX_LUNS (8) LUNs set.  If more files are specified, they will | 
 |     be silently ignored.  See also “luns” parameter. | 
 |  | 
 |     *BEWARE* that if a file is used as a backing storage, it may not | 
 |     be modified by any other process.  This is because the host | 
 |     assumes the data does not change without its knowledge.  It may be | 
 |     read, but (if the logical unit is writable) due to buffering on | 
 |     the host side, the contents are not well defined. | 
 |  | 
 |     The size of the logical unit will be rounded down to a full | 
 |     logical block.  The logical block size is 2048 bytes for LUNs | 
 |     simulating CD-ROM, block size of the device if the backing file is | 
 |     a block device, or 512 bytes otherwise. | 
 |  | 
 |   - removable=b[,b...] | 
 |  | 
 |     This parameter specifies whether each logical unit should be | 
 |     removable.  “b” here is either “y”, “Y” or “1” for true or “n”, | 
 |     “N” or “0” for false. | 
 |  | 
 |     If this option is set for a logical unit, gadget will accept an | 
 |     “eject” SCSI request (Start/Stop Unit).  When it is sent, the | 
 |     backing file will be closed to simulate ejection and the logical | 
 |     unit will not be mountable by the host until a new backing file is | 
 |     specified by userspace on the device (see “sysfs entries” | 
 |     section). | 
 |  | 
 |     If a logical unit is not removable (the default), a backing file | 
 |     must be specified for it with the “file” parameter as the module | 
 |     is loaded.  The same applies if the module is built in, no | 
 |     exceptions. | 
 |  | 
 |     The default value of the flag is false, *HOWEVER* it used to be | 
 |     true.  This has been changed to better match File Storage Gadget | 
 |     and because it seems like a saner default after all.  Thus to | 
 |     maintain compatibility with older kernels, it's best to specify | 
 |     the default values.  Also, if one relied on old default, explicit | 
 |     “n” needs to be specified now. | 
 |  | 
 |     Note that “removable” means the logical unit's media can be | 
 |     ejected or removed (as is true for a CD-ROM drive or a card | 
 |     reader).  It does *not* mean that the entire gadget can be | 
 |     unplugged from the host; the proper term for that is | 
 |     “hot-unpluggable”. | 
 |  | 
 |   - cdrom=b[,b...] | 
 |  | 
 |     This parameter specifies whether each logical unit should simulate | 
 |     CD-ROM.  The default is false. | 
 |  | 
 |   - ro=b[,b...] | 
 |  | 
 |     This parameter specifies whether each logical unit should be | 
 |     reported as read only.  This will prevent host from modifying the | 
 |     backing files. | 
 |  | 
 |     Note that if this flag for given logical unit is false but the | 
 |     backing file could not be opened in read/write mode, the gadget | 
 |     will fall back to read only mode anyway. | 
 |  | 
 |     The default value for non-CD-ROM logical units is false; for | 
 |     logical units simulating CD-ROM it is forced to true. | 
 |  | 
 |   - nofua=b[,b...] | 
 |  | 
 |     This parameter specifies whether FUA flag should be ignored in SCSI | 
 |     Write10 and Write12 commands sent to given logical units. | 
 |  | 
 |     MS Windows mounts removable storage in “Removal optimised mode” by | 
 |     default.  All the writes to the media are synchronous, which is | 
 |     achieved by setting the FUA (Force Unit Access) bit in SCSI | 
 |     Write(10,12) commands.  This forces each write to wait until the | 
 |     data has actually been written out and prevents I/O requests | 
 |     aggregation in block layer dramatically decreasing performance. | 
 |  | 
 |     Note that this may mean that if the device is powered from USB and | 
 |     the user unplugs the device without unmounting it first (which at | 
 |     least some Windows users do), the data may be lost. | 
 |  | 
 |     The default value is false. | 
 |  | 
 |   - luns=N | 
 |  | 
 |     This parameter specifies number of logical units the gadget will | 
 |     have.  It is limited by FSG_MAX_LUNS (8) and higher value will be | 
 |     capped. | 
 |  | 
 |     If this parameter is provided, and the number of files specified | 
 |     in “file” argument is greater then the value of “luns”, all excess | 
 |     files will be ignored. | 
 |  | 
 |     If this parameter is not present, the number of logical units will | 
 |     be deduced from the number of files specified in the “file” | 
 |     parameter.  If the file parameter is missing as well, one is | 
 |     assumed. | 
 |  | 
 |   - stall=b | 
 |  | 
 |     Specifies whether the gadget is allowed to halt bulk endpoints. | 
 |     The default is determined according to the type of USB device | 
 |     controller, but usually true. | 
 |  | 
 |   In addition to the above, the gadget also accepts the following | 
 |   parameters defined by the composite framework (they are common to | 
 |   all composite gadgets so just a quick listing): | 
 |  | 
 |   - idVendor      -- USB Vendor ID (16 bit integer) | 
 |   - idProduct     -- USB Product ID (16 bit integer) | 
 |   - bcdDevice     -- USB Device version (BCD) (16 bit integer) | 
 |   - iManufacturer -- USB Manufacturer string (string) | 
 |   - iProduct      -- USB Product string (string) | 
 |   - iSerialNumber -- SerialNumber string (sting) | 
 |  | 
 | * sysfs entries | 
 |  | 
 |   For each logical unit, the gadget creates a directory in the sysfs | 
 |   hierarchy.  Inside of it the following three files are created: | 
 |  | 
 |   - file | 
 |  | 
 |     When read it returns the path to the backing file for the given | 
 |     logical unit.  If there is no backing file (possible only if the | 
 |     logical unit is removable), the content is empty. | 
 |  | 
 |     When written into, it changes the backing file for given logical | 
 |     unit.  This change can be performed even if given logical unit is | 
 |     not specified as removable (but that may look strange to the | 
 |     host).  It may fail, however, if host disallowed medium removal | 
 |     with the Prevent-Allow Medium Removal SCSI command. | 
 |  | 
 |   - ro | 
 |  | 
 |     Reflects the state of ro flag for the given logical unit.  It can | 
 |     be read any time, and written to when there is no backing file | 
 |     open for given logical unit. | 
 |  | 
 |   - nofua | 
 |  | 
 |     Reflects the state of nofua flag for given logical unit.  It can | 
 |     be read and written. | 
 |  | 
 |   Other then those, as usual, the values of module parameters can be | 
 |   read from /sys/module/g_mass_storage/parameters/* files. | 
 |  | 
 | * Other gadgets using mass storage function | 
 |  | 
 |   The Mass Storage Gadget uses the Mass Storage Function to handle | 
 |   mass storage protocol.  As a composite function, MSF may be used by | 
 |   other gadgets as well (eg. g_multi and acm_ms). | 
 |  | 
 |   All of the information in previous sections are valid for other | 
 |   gadgets using MSF, except that support for mass storage related | 
 |   module parameters may be missing, or the parameters may have | 
 |   a prefix.  To figure out whether any of this is true one needs to | 
 |   consult the gadget's documentation or its source code. | 
 |  | 
 |   For examples of how to include mass storage function in gadgets, one | 
 |   may take a look at mass_storage.c, acm_ms.c and multi.c (sorted by | 
 |   complexity). | 
 |  | 
 | * Relation to file storage gadget | 
 |  | 
 |   The Mass Storage Function and thus the Mass Storage Gadget has been | 
 |   based on the File Storage Gadget.  The difference between the two is | 
 |   that MSG is a composite gadget (ie. uses the composite framework) | 
 |   while file storage gadget was a traditional gadget.  From userspace | 
 |   point of view this distinction does not really matter, but from | 
 |   kernel hacker's point of view, this means that (i) MSG does not | 
 |   duplicate code needed for handling basic USB protocol commands and | 
 |   (ii) MSF can be used in any other composite gadget. | 
 |  | 
 |   Because of that, File Storage Gadget has been removed in Linux 3.8. | 
 |   All users need to transition to the Mass Storage Gadget.  The two | 
 |   gadgets behave mostly the same from the outside except: | 
 |  | 
 |   1. In FSG the “removable” and “cdrom” module parameters set the flag | 
 |      for all logical units whereas in MSG they accept a list of y/n | 
 |      values for each logical unit.  If one uses only a single logical | 
 |      unit this does not matter, but if there are more, the y/n value | 
 |      needs to be repeated for each logical unit. | 
 |  | 
 |   2. FSG's “serial”, “vendor”, “product” and “release” module | 
 |      parameters are handled in MSG by the composite layer's parameters | 
 |      named respectively: “iSerialnumber”, “idVendor”, “idProduct” and | 
 |      “bcdDevice”. | 
 |  | 
 |   3. MSG does not support FSG's test mode, thus “transport”, | 
 |      “protocol” and “buflen” FSG's module parameters are not | 
 |      supported.  MSG always uses SCSI protocol with bulk only | 
 |      transport mode and 16 KiB buffers. |