|where H,H... is a string of comma separated hex numbers each of which should resolve to a byte value (i.e. 0 to ff inclusive). A (single) space separated string of hex numbers is also allowed but the list needs to be in quotes. This is the new contents of the mode page to be written to DEVICE, potentially filtered by the mask string.|
|reads contents string from stdin. The hex numbers in the string may be comma, space, tab or linefeed (newline) separated. If a line contains "#" then the remaining characters on that line are ignored. Otherwise each non separator character should resolve to a byte value (i.e. 0 to ff inclusive). This forms the new contents of the mode page to be written to DEVICE, potentially filtered by the mask string.|
|-d, --dbd||disable block descriptors (DBD flag in cdb). Some device types include block descriptors in the mode data returned by a MODE SENSE command. If so the same block descriptors are written by the MODE SELECT command. This option instructs the MODE SENSE command not to return any block descriptors. This would be a sensible default for this utility apart from the fact that not all SCSI devices support the DBD bit in the cdb.|
|force the contents string to be taken as the new mode page, or at least doesnt do checks on the existing mode page. Note that DEVICE may still reject the new contents for the mode page. Cannot be given with the --mask=M,M... option.|
|-h, --help||output the usage message then exit.|
|-l, --len=10 | 6|
|length of the SCSI commands (cdb) sent to DEVICE. The default is 10 so 10 byte MODE SENSE and MODE SELECT commands are issued. Some old devices dont support the 10 byte variants hence this option.|
|where M,M... is a string of comma separated hex numbers each of which should resolve to a byte value (i.e. 0 to ff inclusive). A (single) space separated string of hex numbers is also allowed but the list needs to be in quotes. The mask chooses (bit by bit) whether the new mode page comes from the contents (mask bit set) or from the existing mode page (mask bit clear). If the mask string is shorter than the contents string then the remaining bytes are taken from the contents string. If the contents string is shorter than the existing mode page then the remaining bytes are taken from the existing mode page (i.e. they are left unaltered).|
|where PG is the page code value to fetch and modify. The page code is in hex and should be between 0 and 3e inclusive. Notice that page code 3f to fetch all mode pages is disallowed.|
|where PG is the page code value and SPG is the subpage code value to fetch and modify. Both values are in hex. The subpage code should be between 0 and fe inclusive. Notice that subpage code ff to fetch all mode subpages (for a given mode page or all mode pages in the case of 3f,ff) is disallowed.|
|-s, --save||changes the "saved" mode page when MODE SELECT is successful. By default (i.e. when --save is not used) only the "current" mode page values are changed when MODE SELECT is successful. In this case the new mode page will stay in effect until the device is reset (e.g. power cycled). When it restarts the "saved" values for the mode page will be re-instated. So to make changes permanent use the --save option.|
|increase the level of verbosity, (i.e. debug output).|
|print the version string and then exit.|
This utility does not check whether the contents string is trying to modify parts of the mode page which are changeable. The device should do that and if some part is not changeable then it should report: "Invalid field in parameter list".
Some mode pages are not saveable. If so an attempt to use the --save option should cause an error to be reported from the device: "Illegal field in cdb".
The device is required to do various checks before it accepts a new mode page. If these checks fail then the mode page is not altered and either a "parameter list length error" or an "invalid field in parameter list" error is returned by the device in the sense data.
The recommended way to modify a mode page is to read it with a MODE SENSE, modify some part of it then write it back to the device with a MODE SELECT command. For example, reading an existing mode page can be accomplished with sg_modes -p=1a -r /dev/sdb > mp_1a.txt (the power condition mode page). The mp_1a.txt file can be edited and then used as the contents string to this utility (e.g. sg_wr_mode -p 1a -s -c - /dev/sdb < mp_1a.txt).
Two fields differ between what is read from the device with MODE SENSE and what is written to the device with MODE SELECT: the mode data length is reserved (i.e. zero(es)) in a MODE SELECT command while the PS bit ((sub)page byte 0 bit 7) in each mode (sub)page is reserved (zero) in a MODE SELECT command. The PS bit given in the contents string is zeroed unless the --force option is selected.
This utility can be used together with the sg_modes utility. To re-instate the default mode page values (i.e. the mode page values chosen by the manufacturer of the device) as both the current and saved mode page values the following sequence could be used:
$ sg_modes --control=2 --page=1a -r /dev/sda > t
$ sg_wr_mode --page=1a --contents=- --save /dev/sda < t
Next is an example of using a mask to modify the "idle condition counter" of the "power condition" mode page (0x1a) from 0x28 to 0x37. Note that the change is not saved so the "idle condition counter" will revert to 0x28 after the next power cycle. The output from sg_modes is abridged.
$ sg_modes --page=1a /dev/hdc
>> Power condition (mmc), page_control: current
00 1a 0a 00 03 00 00 00 28 00 00 01 2c
$ sg_wr_mode -p 1a -c 0,0,0,0,0,0,0,37 -m 0,0,0,0,0,0,0,ff /dev/hdc
$ sg_modes -p 1a /dev/hdc
>> Power condition (mmc), page_control: current
00 1a 0a 00 03 00 00 00 37 00 00 01 2c
The exit status of sg_wr_mode is 0 when it is successful. Otherwise see the sg3_utils(8) man page.
Written by Douglas Gilbert.
Report bugs to <dgilbert at interlog dot com>.
Copyright © 2004-2012 Douglas Gilbert
This software is distributed under a FreeBSD license. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sdparm(sdparm), sg_modes(sg3_utils), sginfo(sg3_utils)
|sg3_utils-1.35||SG_WR_MODE (8)||November 2012|