| .TH SG_WRITE_BUFFER "8" "November 2018" "sg3_utils\-1.45" SG3_UTILS |
| .SH NAME |
| sg_write_buffer \- send SCSI WRITE BUFFER commands |
| .SH SYNOPSIS |
| .B sg_write_buffer |
| [\fI\-\-bpw=CS\fR] [\fI\-\-dry\-run\fR] [\fI\-\-help\fR] [\fI\-\-id=ID\fR] |
| [\fI\-\-in=FILE\fR] [\fI\-\-length=LEN\fR] [\fI\-\-mode=MO\fR] |
| [\fI\-\-offset=OFF\fR] [\fI\-\-read\-stdin\fR] [\fI\-\-skip=SKIP\fR] |
| [\fI\-\-specific=MS\fR] [\fI\-\-timeout=TO\fR] [\fI\-\-verbose\fR] |
| [\fI\-\-version\fR] \fIDEVICE\fR |
| .SH DESCRIPTION |
| .\" Add any additional description here |
| .PP |
| Sends one or more SCSI WRITE BUFFER commands to \fIDEVICE\fR, along with data |
| provided by the user. In some cases no data is required, or data can be read |
| from the file given in the \fI\-\-in=FILE\fR option, or data is read from |
| stdin when either \fI\-\-read\-stdin\fR or \fI\-\-in=\-\fR is given. |
| .PP |
| Some WRITE BUFFER command variants do not have associated data to send to the |
| device. For example "activate_mc" activates deferred microcode that was sent |
| via prior WRITE BUFFER commands. There is a different method used to download |
| microcode to SES devices, see the sg_ses_microcode utility. |
| .SH OPTIONS |
| Arguments to long options are mandatory for short options as well. |
| The options are arranged in alphabetical order based on the long |
| option name. |
| .TP |
| \fB\-b\fR, \fB\-\-bpw\fR=\fICS\fR |
| where \fICS\fR is the chunk size in bytes. This will be the maximum number |
| of bytes sent per WRITE BUFFER command. So if \fICS\fR is less than the |
| effective length then multiple WRITE BUFFER commands are sent, each taking |
| the next chunk from the read data and increasing the buffer offset field |
| in the WRITE BUFFER command by the appropriate amount. The default is |
| a chunk size of 0 which is interpreted as a very large number hence only |
| one WRITE BUFFER command will be sent. This option should only be used with |
| modes that "download microcode, with offsets ..."; namely either mode 0x6, |
| 0x7, 0xd or 0xe. |
| .br |
| The number in \fICS\fR can optionally be followed by ",act" or ",activate". |
| In this case after WRITE BUFFER commands have been sent until the |
| effective length is exhausted another WRITE BUFFER command with its mode |
| set to "Activate deferred microcode mode" [mode 0xf] is sent. |
| .TP |
| \fB\-d\fR, \fB\-\-dry\-run\fR |
| Do all the command line processing and sanity checks including reading |
| the input file. However at the point where a WRITE BUFFER SCSI command(s) |
| would be sent, step over that call and assume it completed without errors |
| and continue. \fIDEVICE\fR is still opened but can be /dev/null (in Unix). |
| It is recommended to use \fI\-\-verbose\fR with this option to get an |
| overview of what would have happened. |
| .TP |
| \fB\-h\fR, \fB\-\-help\fR |
| output the usage message then exit. If used multiple times also prints |
| the mode names and their acronyms. |
| .TP |
| \fB\-i\fR, \fB\-\-id\fR=\fIID\fR |
| this option sets the buffer id field in the cdb. \fIID\fR is a value between |
| 0 (default) and 255 inclusive. |
| .TP |
| \fB\-I\fR, \fB\-\-in\fR=\fIFILE\fR |
| read data from file \fIFILE\fR that will be sent with the WRITE BUFFER |
| command. If \fIFILE\fR is '\-' then stdin is read until an EOF is |
| detected (this is the same action as \fI\-\-read\-stdin\fR). Data is read |
| from the beginning of \fIFILE\fR except in the case when it is a regular file |
| and the \fI\-\-skip=SKIP\fR option is given. |
| .TP |
| \fB\-l\fR, \fB\-\-length\fR=\fILEN\fR |
| where \fILEN\fR is the length, in bytes, of data to be written to the device. |
| If not given (and the length cannot be deduced from \fI\-\-in=FILE\fR or |
| \fI\-\-read\-stdin\fR) then defaults to zero. If the option is given and the |
| length deduced from \fI\-\-in=FILE\fR or \fI\-\-read\-stdin\fR is less (or no |
| data is provided), then bytes of 0xff are used as fill bytes. |
| .TP |
| \fB\-m\fR, \fB\-\-mode\fR=\fIMO\fR |
| this option sets the MODE field in the cdb. \fIMO\fR is a value between |
| 0 (default) and 31 inclusive. Alternatively an abbreviation can be given. |
| See the MODES section below. To list the available mode abbreviations at |
| run time give an invalid one (e.g. '\-\-mode=xxx') or use the '\-hh' option. |
| .TP |
| \fB\-o\fR, \fB\-\-offset\fR=\fIOFF\fR |
| this option sets the BUFFER OFFSET field in the cdb. \fIOFF\fR is a value |
| between 0 (default) and 2**24\-1 . It is a byte offset. |
| .TP |
| \fB\-r\fR, \fB\-\-read\-stdin\fR |
| read data from stdin until an EOF is detected. This data is sent with |
| the WRITE BUFFER command to \fIDEVICE\fR. The action of this option is the |
| same as using '\-\-in=\-'. Previously this option's long name was |
| \fI\-\-raw\fR and it may still be used for backward compatibility. |
| .TP |
| \fB\-s\fR, \fB\-\-skip\fR=\fISKIP\fR |
| this option is only active when \fI\-\-in=FILE\fR is given and \fIFILE\fR is |
| a regular file, rather than stdin. Data is read starting at byte offset |
| \fISKIP\fR to the end of file (or the amount given by \fI\-\-length=LEN\fR). |
| If not given the byte offset defaults to 0 (i.e. the start of the file). |
| .TP |
| \fB\-S\fR, \fB\-\-specific\fR=\fIMS\fR |
| \fIMS\fR is the MODE SPECIFIC field in the cdb. This is a 3\-bit field |
| so the values 0 to 7 are accepted. This field was introduced in SPC\-4 |
| revision 32 and can be used to specify additional events that activate |
| deferred microcode (when \fIMO\fR is 0xD). |
| .TP |
| \fB\-t\fR, \fB\-\-timeout\fR=\fITO\fR |
| \fITO\fR is the command timeout (in seconds) for each WRITE BUFFER command |
| issued by this utility. Its default value is 300 seconds (5 minutes) and |
| should only be altered if this is not sufficient. |
| .TP |
| \fB\-v\fR, \fB\-\-verbose\fR |
| increase the level of verbosity, (i.e. debug output). |
| .TP |
| \fB\-V\fR, \fB\-\-version\fR |
| print the version string and then exit. |
| .SH MODES |
| Following is a list of WRITE BUFFER command settings for the MODE field. |
| First is an acronym accepted by the \fIMO\fR argument of this utility. |
| Following the acronym in square brackets are the corresponding decimal and |
| hex values that may also be given for \fIMO\fR. The following are listed |
| in numerical order. |
| .TP |
| hd [0, 0x0] |
| Combined header and data (obsolete in SPC\-4). |
| .TP |
| vendor [1, 0x1] |
| Vendor specific. |
| .TP |
| data [2, 0x2] |
| Data (was called "Write Data" in SPC\-3). |
| .TP |
| dmc [4, 0x4] |
| Download microcode and activate (was called "Download microcode" in SPC\-3). |
| .TP |
| dmc_save [5, 0x5] |
| Download microcode, save, and activate (was called "Download microcode and |
| save" in SPC\-3). |
| .TP |
| dmc_offs [6, 0x6] |
| Download microcode with offsets and activate (was called "Download microcode |
| with offsets" in SPC\-3). |
| .TP |
| dmc_offs_save [7, 0x7] |
| Download microcode with offsets, save, and activate (was called "Download |
| microcode with offsets and save" in SPC\-3). |
| .TP |
| echo [10, 0xa] |
| Write data to echo buffer (was called "Echo buffer" in SPC\-3). |
| .TP |
| dmc_offs_ev_defer [13, 0xd] |
| Download microcode with offsets, select activation events, save, and defer |
| activate (introduced in SPC\-4). |
| .TP |
| dmc_offs_defer [14, 0xe] |
| Download microcode with offsets, save, and defer activate (introduced in |
| SPC\-4). |
| .TP |
| activate_mc [15, 0xf] |
| Activate deferred microcode (introduced in SPC\-4). |
| .TP |
| en_ex [26, 0x1A] |
| Enable expander communications protocol and Echo buffer (obsolete in SPC\-4). |
| .TP |
| dis_ex [27, 0x1B] |
| Disable expander communications protocol (obsolete in SPC\-4). |
| .TP |
| deh [28, 0x1C] |
| Download application client error history (was called "Download application |
| log" in SPC\-3). |
| .SH NOTES |
| If no \fI\-\-length=LEN\fR is given this utility reads up to 8 MiB of data |
| from the given file \fIFILE\fR (or stdin). If a larger amount of data is |
| required then the \fI\-\-length=LEN\fR option should be given. |
| .PP |
| The user should be aware that most operating systems have limits on the |
| amount of data that can be sent with one SCSI command. In Linux this |
| depends on the pass through mechanism used (e.g. block SG_IO or the sg |
| driver) and various setting in sysfs in the Linux lk 2.6/3 |
| series (e.g. /sys/block/sda/queue/max_sectors_kb). Devices (i.e. logical |
| units) also typically have limits on the maximum amount of data they can |
| handle in one command. These two limitations suggest that modes |
| containing the word "offset" together with the \fI\-\-bpw=CS\fR option |
| are required as firmware files get larger and larger. And \fICS\fR |
| can be quite small, for example 4096 bytes, resulting in many WRITE |
| BUFFER commands being sent. |
| .PP |
| Attempting to download a microcode/firmware file that is too large may |
| cause an error to occur in the pass\-through layer (i.e. before the |
| SCSI command is issued). In Linux such error reports can be obscure as |
| in "pass through os error invalid argument". FreeBSD reports such |
| errors well to the machine's console but returns a cryptic error message |
| to this utility. |
| .PP |
| Downloading incorrect microcode into a device has the ability to render |
| that device inoperable. One would hope that the device vendor verifies |
| the data before activating it. If the SCSI WRITE BUFFER command is given |
| values in its cdb (e.g. \fILEN\fR) that are inappropriate (e.g. too large) |
| then the device should respond with a sense key of ILLEGAL REQUEST and |
| an additional sense code of INVALID FIELD in CDB. If a WRITE BUFFER |
| command (or a sequence of them) fails due to device vendor verification |
| checks then it should respond with a sense key of ILLEGAL REQUEST and |
| an additional sense code of COMMAND SEQUENCE ERROR. |
| .PP |
| All numbers given with options are assumed to be decimal. |
| Alternatively numerical values can be given in hexadecimal preceded by |
| either "0x" or "0X" (or has a trailing "h" or "H"). |
| .SH EXAMPLES |
| The following sends new firmware to an enclosure. Sending a 1.5 MB |
| file in one WRITE BUFFER command caused the enclosure to lock up |
| temporarily and did not update the firmware. Breaking the firmware file |
| into 4 KB chunks (an educated guess) was more successful: |
| .PP |
| sg_write_buffer \-b 4k \-m dmc_offs_save \-I firmware.bin /dev/sg4 |
| .PP |
| The firmware update occurred in the following enclosure power cycle. With |
| a modern enclosure the Extended Inquiry VPD page gives indications in which |
| situations a firmware upgrade will take place. |
| .SH EXIT STATUS |
| The exit status of sg_write_buffer is 0 when it is successful. Otherwise |
| see the sg3_utils(8) man page. |
| .SH AUTHORS |
| Written by Luben Tuikov and Douglas Gilbert. |
| .SH "REPORTING BUGS" |
| Report bugs to <dgilbert at interlog dot com>. |
| .SH COPYRIGHT |
| Copyright \(co 2006\-2018 Luben Tuikov and Douglas Gilbert |
| .br |
| This software is distributed under a BSD\-2\-Clause license. There is NO |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| .SH "SEE ALSO" |
| .B sg_read_buffer, sg_ses_microcode(sg3_utils) |