123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- * 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.
|