226 lines
11 KiB
Groff
226 lines
11 KiB
Groff
|
|
.TH SG_WR_MODE "8" "April 2018" "sg3_utils\-1.43" SG3_UTILS
|
||
|
|
.SH NAME
|
||
|
|
sg_wr_mode \- write (modify) SCSI mode page
|
||
|
|
.SH SYNOPSIS
|
||
|
|
.B sg_wr_mode
|
||
|
|
[\fI\-\-contents=H,H...\fR] [\fI\-\-dbd\fR] [\fI\-\-force\fR] [\fI\-\-help\fR]
|
||
|
|
[\fI\-\-len=10|6\fR] [\fI\-\-mask=M,M...\fR] [\fI\-\-page=PG_H[,SPG_H]\fR]
|
||
|
|
[\fI\-\-rtd\fR] [\fI\-\-save\fR] [\fI\-\-six\fR] [\fI\-\-verbose\fR]
|
||
|
|
[\fI\-\-version\fR] \fIDEVICE\fR
|
||
|
|
.SH DESCRIPTION
|
||
|
|
.\" Add any additional description here
|
||
|
|
.PP
|
||
|
|
Writes a modified mode page to \fIDEVICE\fR. Uses the SCSI MODE SENSE (6
|
||
|
|
or 10 byte variant) command to fetch the existing mode data which includes
|
||
|
|
a mode page (or subpage). It then combines that with the contents,
|
||
|
|
potentially masked, and writes the modified mode page with the SCSI MODE
|
||
|
|
SELECT (6 or 10 byte variant) command. This utility does not modify
|
||
|
|
the block descriptor(s); if any block descriptors are fetched by the MODE
|
||
|
|
SENSE command then the same block descriptors are written back with the
|
||
|
|
following MODE SELECT command.
|
||
|
|
.PP
|
||
|
|
If the \fI\-\-rtd\fR option is given then most other options apart from
|
||
|
|
\fI\-\-save\fR, \fI\-\-len=\fR10|6\fR and \fI\-\-six\fR are ignored. In this
|
||
|
|
case only a MODE SELECT command is sent to the \fIDEVICE\fR with the RTD
|
||
|
|
bit (Revert To Defaults) set. This bit was added to this command in SPC\-5
|
||
|
|
revision 11, so older devices may not support it. The Extended Inquiry VPD
|
||
|
|
page has the RTD_SUP bit to indicate whether the \fIDEVICE\fR supports the
|
||
|
|
RTD bit in the MODE SELECT(6 and 10) commands. When the \fI\-\-rtd\fR option
|
||
|
|
is given the rest of this section can be ignored.
|
||
|
|
.PP
|
||
|
|
If a contents argument is not given then the various components (i.e.
|
||
|
|
header, block descriptor(s) and mode page) of the "current" values of
|
||
|
|
the existing mode page are printed out. In this case the mode page is
|
||
|
|
not altered on the device.
|
||
|
|
.PP
|
||
|
|
If the contents are specified, and a mask is not specified, then the contents
|
||
|
|
must match the existing mode page in various aspects unless the
|
||
|
|
\fI\-\-force\fR option is given. These include length, mode page code and
|
||
|
|
subpage code if applicable. If all is well then the contents string is
|
||
|
|
written to \fIDEVICE\fR as the new mode page.
|
||
|
|
.PP
|
||
|
|
If both contents and mask strings are specified then only bit positions
|
||
|
|
in the contents corresponding to set bits in the mask are taken while the
|
||
|
|
existing mode page supplies bit positions corresponding to clear bits.
|
||
|
|
When a mask is given then the mask and/or the contents may be shorter
|
||
|
|
than the existing mode page. If the mask is shorter than the contents then
|
||
|
|
the remaining bytes are taken from the contents. If the contents are shorter
|
||
|
|
than the existing mode page then the remaining bytes are taken from the
|
||
|
|
existing mod page.
|
||
|
|
.PP
|
||
|
|
The force option allows the contents string to be written as the new
|
||
|
|
mode page without any prior checks on the existing mode page. This should
|
||
|
|
only be required for vendor specific mode pages. The existing mode data
|
||
|
|
is ignored apart from the block descriptors which can be suppressed with
|
||
|
|
the \fI\-\-dbd\fR option if need be.
|
||
|
|
.PP
|
||
|
|
Changing individual fields in a mode page is probably more easily done
|
||
|
|
with the sdparm utility. Fields can be identified by acronym or by a
|
||
|
|
numerical descriptor.
|
||
|
|
.SH OPTIONS
|
||
|
|
Arguments to long options are mandatory for short options as well.
|
||
|
|
.TP
|
||
|
|
\fB\-c\fR, \fB\-\-contents\fR=\fIH,H...\fR
|
||
|
|
where \fIH,H...\fR 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
|
||
|
|
\fIDEVICE\fR, potentially filtered by the mask string.
|
||
|
|
.TP
|
||
|
|
\fB\-c\fR, \fB\-\-contents\fR=-
|
||
|
|
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 \fIDEVICE\fR,
|
||
|
|
potentially filtered by the mask string.
|
||
|
|
.TP
|
||
|
|
\fB\-d\fR, \fB\-\-dbd\fR
|
||
|
|
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.
|
||
|
|
.TP
|
||
|
|
\fB\-f\fR, \fB\-\-force\fR
|
||
|
|
force the contents string to be taken as the new mode page, or at least
|
||
|
|
doesn't do checks on the existing mode page. Note that \fIDEVICE\fR may
|
||
|
|
still reject the new contents for the mode page. Cannot be given with
|
||
|
|
the \fI\-\-mask=M,M...\fR option.
|
||
|
|
.TP
|
||
|
|
\fB\-h\fR, \fB\-\-help\fR
|
||
|
|
output the usage message then exit.
|
||
|
|
.TP
|
||
|
|
\fB\-l\fR, \fB\-\-len\fR=10 | 6
|
||
|
|
length of the SCSI commands (cdb) sent to \fIDEVICE\fR. The default is 10
|
||
|
|
so 10 byte MODE SENSE and MODE SELECT commands are issued. Some old devices
|
||
|
|
don't support the 10 byte variants hence this option.
|
||
|
|
.TP
|
||
|
|
\fB\-m\fR, \fB\-\-mask\fR=\fIM,M...\fR
|
||
|
|
where \fIM,M...\fR 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).
|
||
|
|
.TP
|
||
|
|
\fB\-p\fR, \fB\-\-page\fR=\fIPG_H\fR
|
||
|
|
where \fIPG_H\fR 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.
|
||
|
|
.TP
|
||
|
|
\fB\-p\fR, \fB\-\-page\fR=\fIPG_H,SPG_H\fR
|
||
|
|
where \fIPG_H\fR is the page code value and \fISPG_H\fR 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.
|
||
|
|
.TP
|
||
|
|
\fB\-R\fR, \fB\-\-rtd\fR
|
||
|
|
when this option is given most other actions are bypassed and a MODE
|
||
|
|
SELECT(6 or 10) command is sent to the \fIDEVICE\fR with the RTD bit set.
|
||
|
|
This will cause all current values (and saved values if the \fI\-\-save\fR
|
||
|
|
option is also given) of all mode pages to be reverted to their default
|
||
|
|
values.
|
||
|
|
.TP
|
||
|
|
\fB\-s\fR, \fB\-\-save\fR
|
||
|
|
changes the "saved" mode page when MODE SELECT is successful. By
|
||
|
|
default (i.e. when \fI\-\-save\fR 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 \fI\-\-save\fR option.
|
||
|
|
.br
|
||
|
|
When used with the \fI\-\-rtd\fR option then both the current and saved
|
||
|
|
values in each mode page are reverted to their default values. In the
|
||
|
|
absence of \fI\-\-save\fR option only the current values in each mode page
|
||
|
|
are reverted to their default values.
|
||
|
|
.TP
|
||
|
|
\fB\-6\fR, \fB\-\-six\fR
|
||
|
|
this option will cause the 6 byte variants of MODE SENSE and MODE SELECT
|
||
|
|
commands to be used. The default is to use the 10 byte options. This option
|
||
|
|
is equivalent to using the \fI\-\-len=6\fR option.
|
||
|
|
|
||
|
|
.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 NOTES
|
||
|
|
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".
|
||
|
|
.PP
|
||
|
|
Some mode pages are not saveable. If so an attempt to use the \fI\-\-save\fR
|
||
|
|
option should cause an error to be reported from the device: "Illegal field
|
||
|
|
in cdb".
|
||
|
|
.PP
|
||
|
|
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.
|
||
|
|
.PP
|
||
|
|
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').
|
||
|
|
.PP
|
||
|
|
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 \fI\-\-force\fR option is selected.
|
||
|
|
.SH EXAMPLES
|
||
|
|
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:
|
||
|
|
.PP
|
||
|
|
$ sg_modes \-\-control=2 \-\-page=1a \-r /dev/sda > t
|
||
|
|
.br
|
||
|
|
$ sg_wr_mode \-\-page=1a \-\-contents=\- \-\-save /dev/sda < t
|
||
|
|
.PP
|
||
|
|
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.
|
||
|
|
.PP
|
||
|
|
$ sg_modes \-\-page=1a /dev/hdc
|
||
|
|
.br
|
||
|
|
>> Power condition (mmc), page_control: current
|
||
|
|
.br
|
||
|
|
00 1a 0a 00 03 00 00 00 28 00 00 01 2c
|
||
|
|
.PP
|
||
|
|
$ 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
|
||
|
|
.PP
|
||
|
|
$ sg_modes \-p 1a /dev/hdc
|
||
|
|
.br
|
||
|
|
>> Power condition (mmc), page_control: current
|
||
|
|
.br
|
||
|
|
00 1a 0a 00 03 00 00 00 37 00 00 01 2c
|
||
|
|
.SH EXIT STATUS
|
||
|
|
The exit status of sg_wr_mode 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 2004\-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 sdparm(sdparm), sg_modes(sg3_utils), sginfo(sg3_utils)
|