SG_SES_MICROCODE(8)
okay bestie, welcome to sg_ses_microcode(8) from SG3_UTILS β the manual page for sending microcode to a SCSI enclosure. Yes, we're doing firmware-download group-chat style, and every single flag is still here. β¨
πΈ NAME πΈ
sg_ses_microcode β send microcode to a SCSI enclosure.
β¨ SYNOPSIS β¨
sg_ses_microcode [--bpw=CS] [--dry-run] [--ealsd] [--help] [--id=ID]
[--in=FILE] [--length=LEN] [--mode=MO] [--non] [--offset=OFF]
[--skip=SKIP] [--subenc=MS] [--tlength=TLEN] [--verbose] [--version]
DEVICE
π DESCRIPTION π
Okay so this utility attempts to download microcode to an enclosure (or one of its sub-enclosures) associated with the DEVICE. The process for doing this is defined in the SCSI Enclosure Services (SES) standards and drafts maintained by the T10 committee. No cap.
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. The way that works is lowkey iconic. π¦
The default action (i.e. when the --mode=MO 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 --in=FILE option is not required.
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.
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. iykyk π
π OPTIONS π
Arguments to long options are mandatory for short options as well.
-b,--bpw=CSβ whereCSis the chunk size in bytes and should be a multiple of4. This will be the maximum number of bytes sent perSEND DIAGNOSTICcommand. So ifCSis less than the effective length of the microcode then multipleSEND DIAGNOSTICcommands 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 of0which is interpreted as a very large number hence only oneSEND DIAGNOSTICcommand will be sent. The number inCScan optionally be followed by,actor,activate. In this case after the microcode has been successfully sent to theDEVICE, an additional Download microcode control dpage with its mode set to"Activate deferred microcode"[0xf]is sent.-d,--dry-runβ the actual calls to performSEND DIAGNOSTICandRECEIVE DIAGNOSTIC RESULTScommands are skipped when this option is given. No SCSI commands are sent to theDEVICEbut it is still opened and is required to be given. A dummy device such as/dev/null(in Unix) can be used. This utility expects a"sensible"response to theRECEIVE DIAGNOSTIC RESULTScommand 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. not me using/dev/nullas a fake enclosure π-e,--ealsdβ exit after lastSEND DIAGNOSTICcommand. 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 oneRECEIVE DIAGNOSTIC RESULTScommand is sent to give the device a chance to report any error. However some devices do start the firmware update immediately which causes the trailingRECEIVE DIAGNOSTIC RESULTScommand to be held up and often be aborted with a"target reset"error. This option causes the trailingRECEIVE DIAGNOSTIC RESULTScommand to be skipped. This option would be typically used with the--bpw=CSoption. Prior to version1.10of this utility[20180112]this (i.e. skipping the lastRECEIVE DIAGNOSTIC RESULTScommand) was the default action.-h,--helpβ output the usage message then exit. If used multiple times also prints the mode names and their acronyms.-i,--id=IDβ this option sets the BUFFER ID field in the Download microcode control dpage.IDis a value between0(default) and255inclusive.-I,--in=FILEβ read data from fileFILEthat will be sent with theSEND DIAGNOSTICcommand. IfFILEis'-'then stdin is read until an EOF is detected (this is the same action as--raw). Data is read from the beginning ofFILEexcept in the case when it is a regular file and the--skip=SKIPoption is given.-l,--length=LENβ whereLENis the length, in bytes, of data to be written to the device. If not given (and the length cannot be deduced from--in=FILEor--raw) then defaults to zero. If the option is given and the length deduced from--in=FILEor--rawis less (or no data is provided), then bytes of0xffare used as fill bytes.-m,--mode=MOβ this option sets theMODE.MOis a value between0(which isdmc_statusand the default) and255inclusive. 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.-N,--nonβ allow for non-standard implementations that reset their Download microcode engine after aRECEIVE DIAGNOSTIC RESULTScommand 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.-o,--offset=OFFβ this option sets the BUFFER OFFSET field in the Download microcode control dpage.OFFis a value between0(default) and2**32-1. It is a byte offset. This option is ignored (and a warning sent tostderr) if the--bpw=CSoption is also given.-s,--skip=SKIPβ this option is only active when--in=FILEis given andFILEis a regular file, rather than stdin. Data is read starting at byte offsetSKIPto the end of file (or the amount given by--length=LEN). If not given the byte offset defaults to0(i.e. the start of the file).-S,--subenc=SEIDβSEIDis the sub-enclosure identify. It defaults to0which is the primary enclosure identifier.-t,--tlength=TLENβTLENis the total length in bytes of the microcode to be (or being) downloaded. It defaults to0which is okay in most cases. This option only comes into play whenTLENis greater thanLEN. In this caseTLENis sent to the SESDEVICEso that it knows when it only receivesLENbytes 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).-v,--verboseβ increase the level of verbosity, (i.e. debug output).-V,--versionβ print the version string and then exit.
π MODES π
Following is a list accepted by the MO 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 MO.
dmc_status[0, 0x0]β UseRECEIVE DIAGNOSTIC RESULTSto fetch the Download microcode status dpage and print it out.dmc_offs[6, 0x6]β Download microcode with offsets and activate.dmc_offs_save[7, 0x7]β Download microcode with offsets, save, and activate.dmc_offs_defer[14, 0xe]β Download microcode with offsets, save, and defer activate.activate_mc[15, 0xf]β Activate deferred microcode. There is no follow-upRECEIVE DIAGNOSTIC RESULTSto fetch the Download microcode status dpage since theDEVICEmight be resetting.
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.
π 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.
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? π«Ά
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 --non option was added to cope with their interpretation. So if the above suggestions don't help, try adding the --non option. fr fr π
π NOTES π
okay bestie, some real talk before you yeet microcode at a device. This utility can handle a maximum size of 256 MB of microcode, which should be sufficient for most purposes. But in a system that is memory constrained, such large allocations of memory may fail β lowkey tragic, so keep that in mind. π
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 --bpw=CS option are required as firmware files get larger and larger. And CS can be quite small, for example 4096 bytes, resulting in many SEND DIAGNOSTIC commands being sent. β¨
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 --non option. π
β οΈ 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. This is not a drill, bestie. π
A long (operating system) timeout of 7200 seconds is set on each SEND DIAGNOSTIC command. Literally a long boi timeout. π°οΈ
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). So yes, you can be extra about your number bases. π
π 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:
$ sg_ses_microcode /dev/sg3
Download microcode status diagnostic page:
number of secondary sub-enclosures: 0
generation code: 0x0
sub-enclosure identifier: 0 [primary]
download microcode status: No download microcode operation in
progress [0x0]
download microcode additional status: 0x0
download microcode maximum size: 1048576 bytes
download microcode expected buffer id: 0x0
download microcode expected buffer id offset: 0
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:
sg_ses_microcode -b 4k -m dmc_offs_save -I firmware.bin /dev/sg4
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. π¦
πͺ EXIT STATUS πͺ
The exit status of sg_ses_microcode is 0 when it is successful. Otherwise see the sg3_utils(8) man page. Slay when it works, read the other page when it doesn't. π«Ά
βοΈ AUTHORS βοΈ
Written by Douglas Gilbert. (An icon, honestly. π)
π REPORTING BUGS π
Report bugs to <dgilbert at interlog dot com>. Yeah, tell them. π
Β©οΈ COPYRIGHT Β©οΈ
Copyright Β© 2014-2026 Douglas Gilbert
This software is distributed under a BSD-2-Clause license. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Like, none. Zero. Nada. π
π SEE ALSO π
sg_ses, sg_write_buffer, sg_inq(sg3_utils) β go read those too, iykyk. π
okay that's the whole vibe check, bestie. This page is from sg3_utils-1.43, dated March 2026 β SG_SES_MICROCODE(8) out. πβ¨
π¦ where this page comes from
- arch rolling: sg3_utils 1.49-1 Β· GPL-2.0-or-later AND BSD-2-Clause
- nixpkgs unstable: sg3_utils 1.49
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms