| .TH SG_SES_MICROCODE "8" "January 2018" "sg3_utils\-1.43" SG3_UTILS |
| .SH NAME |
| sg_ses_microcode \- send microcode to a SCSI enclosure |
| .SH SYNOPSIS |
| .B sg_ses_microcode |
| [\fI\-\-bpw=CS\fR] [\fI\-\-dry\-run\fR] [\fI\-\-ealsd\fR] [\fI\-\-help\fR] |
| [\fI\-\-id=ID\fR] [\fI\-\-in=FILE\fR] [\fI\-\-length=LEN\fR] |
| [\fI\-\-mode=MO\fR] [\fI\-\-non\fR] [\fI\-\-offset=OFF\fR] |
| [\fI\-\-skip=SKIP\fR] [\fI\-\-subenc=MS\fR] [\fI\-\-tlength=TLEN\fR] |
| [\fI\-\-verbose\fR] [\fI\-\-version\fR] \fIDEVICE\fR |
| .SH DESCRIPTION |
| .\" Add any additional description here |
| .PP |
| This utility attempts to download microcode to an enclosure (or one of its |
| sub\-enclosures) associated with the \fIDEVICE\fR. The process for doing |
| this is defined in the SCSI Enclosure Services (SES) standards and drafts |
| maintained by the T10 committee. |
| .PP |
| The process is to send one or more sequences containing a SCSI SEND |
| DIAGNOSTIC command followed optionally by a RECEIVE DIAGNOSTIC RESULTS |
| command. The former sends a Download microcode Control diagnostic |
| page (dpage) and the latter fetches a Download microcode status dpage which |
| can be viewed as a report on the former command. |
| .PP |
| The default action (i.e. when the \fI\-\-mode=MO\fR option is not given) |
| is to fetch the Download microcode status dpage and decode it. This does |
| not require the microcode (firmware) itself so the \fI\-\-in=FILE\fR option |
| is not required. |
| .PP |
| The most recent reference for this utility is the draft SCSI Enclosure |
| Services 3 (SES\-3) document T10/2149\-D Revision 7 at http://www.t10.org . |
| Existing standards for SES and SES\-2 are ANSI INCITS 305\-1998 and ANSI |
| INCITS 448\-2008 respectively. |
| .PP |
| Most other support for SES in this package (apart from downloading |
| microcode) can be found in the sg_ses utility. Another way of downloading |
| firmware to a SCSI device is with the WRITE BUFFER command defined in |
| SPC\-4, see the sg_write_buffer utility. |
| .SH OPTIONS |
| Arguments to long options are mandatory for short options as well. |
| .TP |
| \fB\-b\fR, \fB\-\-bpw\fR=\fICS\fR |
| where \fICS\fR is the chunk size in bytes and should be a multiple of 4. |
| This will be the maximum number of bytes sent per SEND DIAGNOSTIC command. |
| So if \fICS\fR is less than the effective length of the microcode then |
| multiple SEND DIAGNOSTIC commands are sent, each taking the next chunk |
| from the read data and increasing the buffer offset field in the Download |
| microcode control dpage by the appropriate amount. The default is |
| a chunk size of 0 which is interpreted as a very large number hence only |
| one SEND DIAGNOSTIC command will be sent. |
| .br |
| The number in \fICS\fR can optionally be followed by ",act" or ",activate". |
| In this case after the microcode has been successfully sent to the |
| \fIDEVICE\fR, an additional Download microcode control dpage with its mode |
| set to "Activate deferred microcode" [0xf] is sent. |
| .TP |
| \fB\-d\fR, \fB\-\-dry\-run\fR |
| the actual calls to perform SEND DIAGNOSTIC and RECEIVE DIAGNOSTIC RESULTS |
| commands are skipped when this option is given. No SCSI commands are sent |
| to the \fIDEVICE\fR but it is still opened and is required to be given. |
| A dummy device such as /dev/null (in Unix) can be used. |
| .br |
| This utility expects a "sensible" response to the RECEIVE DIAGNOSTIC RESULTS |
| command it sends (and will abort if it doesn't receive one). So this option |
| supplies dummy responses with one primary enclosure and three |
| sub\-enclosures. The dummy responses include good status values. |
| .TP |
| \fB\-e\fR, \fB\-\-ealsd\fR |
| exit after last SEND DIAGNOSTIC command. A SES device should not start its |
| firmware update immediately after the last received "chunk" of its firmware. |
| Rather it should wait till at least one RECEIVE DIAGNOSTIC RESULTS command |
| is sent to give the device a chance to report any error. However some |
| devices do start the firmware update immediately which causes the trailing |
| RECEIVE DIAGNOSTIC RESULTS command to be held up and often be aborted with |
| a "target reset" error. |
| .br |
| This option causes the trailing RECEIVE DIAGNOSTIC RESULTS command to be |
| skipped. This option would be typically used with the \fI\-\-bpw=CS\fR |
| option. |
| .br |
| Prior to version 1.10 of this utility [20180112] this (i.e. skipping |
| the last RECEIVE DIAGNOSTIC RESULTS command) was the default action. |
| .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 Download microcode control |
| dpage. \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 SEND DIAGNOSTIC |
| command. If \fIFILE\fR is '\-' then stdin is read until an EOF is |
| detected (this is the same action as \fI\-\-raw\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\-\-raw\fR) then defaults to zero. If the option is given and the length |
| deduced from \fI\-\-in=FILE\fR or \fI\-\-raw\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. \fIMO\fR is a value between |
| 0 (which is dmc_status and the default) and 255 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 '\-h' option. |
| .TP |
| \fB\-N\fR, \fB\-\-non\fR |
| allow for non\-standard implementations that reset their Download microcode |
| engine after a RECEIVE DIAGNOSTIC RESULTS command with the Download microcode |
| status dpage is sent. When this option is given sending that command and |
| dpage combination is avoided unless an error has already occurred. |
| .TP |
| \fB\-o\fR, \fB\-\-offset\fR=\fIOFF\fR |
| this option sets the BUFFER OFFSET field in the Download microcode control |
| dpage. \fIOFF\fR is a value between 0 (default) and 2**32\-1 . It is a |
| byte offset. This option is ignored (and a warning sent to stderr) if the |
| \fI\-\-bpw=CS\fR option is also given. |
| .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\-\-subenc\fR=\fISEID\fR |
| \fISEID\fR is the sub\-enclosure identify. It defaults to 0 which is the |
| primary enclosure identifier. |
| .TP |
| \fB\-t\fR, \fB\-\-tlength\fR=\fITLEN\fR |
| \fITLEN\fR is the total length in bytes of the microcode to be (or being) |
| downloaded. It defaults to 0 which is okay in most cases. This option only |
| comes into play when \fITLEN\fR is greater than \fILEN\fR. In this case |
| \fITLEN\fR is sent to the SES \fIDEVICE\fR so that it knows when it only |
| receives \fILEN\fR bytes from this invocation, that it should expect more |
| to be sent in the near future (e.g. by another invocation). This option |
| is only needed when sections of microcode are being sent in separate |
| invocations of this utility (e.g. the microcode is spread across two files). |
| .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 accepted by the \fIMO\fR argument of this utility. |
| First shown is an acronym followed in square brackets by the corresponding |
| decimal and hex values that may also be given for \fIMO\fR. |
| .TP |
| dmc_status [0, 0x0] |
| Use RECEIVE DIAGNOSTIC RESULTS to fetch the Download microcode status dpage |
| and print it out. |
| .TP |
| dmc_offs [6, 0x6] |
| Download microcode with offsets and activate. |
| .TP |
| dmc_offs_save [7, 0x7] |
| Download microcode with offsets, save, and activate. |
| .TP |
| dmc_offs_defer [14, 0xe] |
| Download microcode with offsets, save, and defer activate. |
| .TP |
| activate_mc [15, 0xf] |
| Activate deferred microcode. There is no follow\-up RECEIVE DIAGNOSTIC |
| RESULTS to fetch the Download microcode status dpage since the \fIDEVICE\fR |
| might be resetting. |
| .PP |
| Apart from dmc_status, these are placed in the Download microcode mode |
| field in the Download microcode control dpage. In the case of dmc_status |
| the Download microcode status dpage is fetched with the RECEIVE DIAGNOSTIC |
| RESULTS command and decoded. |
| .SH WHEN THE DOWNLOAD FAILS |
| Firstly, if it succeeds, this utility should stay silent and return. |
| Typically vendors will change the "revision" string (which is 4 characters |
| long) whenever they release new firmware. That can be seen in the response |
| to a SCSI INQUIRY command, for example by using the sg_inq utility. |
| It is possible that the device needs to be power cycled before the new |
| microcode becomes active. Also if mode dmc_offs_defer [0xe] is used to |
| download the microcode, then another invocation with activate_mc may |
| be needed. |
| .PP |
| If something goes wrong, there will typically be messages printed out |
| by this utility. The first thing to check is the microcode (firmware) |
| file itself. Is it designed for the device model; has it been corrupted, |
| and if downgrading (i.e. trying to reinstate older firmware), does |
| the vendor allow that? |
| .PP |
| Getting new firmware on a device is a delicate operation that is not |
| always well defined by T10's standards and drafts. One might speculate |
| that they are deliberately vague. In testing this utility one vendor's |
| interpretation of the standard was somewhat surprising. The \fI\-\-non\fR |
| option was added to cope with their interpretation. So if the above |
| suggestions don't help, try adding the \fI\-\-non\fR option. |
| .SH NOTES |
| This utility can handle a maximum size of 128 MB of microcode which |
| should be sufficient for most purposes. In a system that is memory |
| constrained, such large allocations of memory may fail. |
| .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 SEND |
| DIAGNOSTIC commands being sent. |
| .PP |
| The exact error from the non\-standard implementation was a sense key of |
| ILLEGAL REQUEST and an asc/ascq code of 0x26,0x0 which is "Invalid field in |
| parameter list". If that is seen try again with the \fI\-\-non\fR option. |
| .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. |
| .PP |
| A long (operating system) timeout of 7200 seconds is set on each SEND |
| DIAGNOSTIC command. |
| .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 |
| If no microcode/firmware file is given then this utility fetches and decodes |
| the Download microcode status dpage which could possibly show another |
| initiator in the process of updating the microcode. Even if that is |
| happening, fetching the status page should not cause any problems: |
| .PP |
| sg_ses_microcode /dev/sg3 |
| .br |
| Download microcode status diagnostic page: |
| .br |
| number of secondary sub\-enclosures: 0 |
| .br |
| generation code: 0x0 |
| .br |
| sub\-enclosure identifier: 0 [primary] |
| .br |
| download microcode status: No download microcode operation in progress [0x0] |
| .br |
| download microcode additional status: 0x0 |
| .br |
| download microcode maximum size: 1048576 bytes |
| .br |
| download microcode expected buffer id: 0x0 |
| .br |
| download microcode expected buffer id offset: 0 |
| .PP |
| The following sends new microcode/firmware to an enclosure. Sending a 1.5 MB |
| file in one 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_ses_microcode \-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_ses_microcode is 0 when it is successful. Otherwise |
| see the sg3_utils(8) man page. |
| .SH AUTHORS |
| Written by Douglas Gilbert. |
| .SH "REPORTING BUGS" |
| Report bugs to <dgilbert at interlog dot com>. |
| .SH COPYRIGHT |
| Copyright \(co 2014\-2018 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_ses, sg_write_buffer, sg_inq(sg3_utils) |