summaryrefslogtreecommitdiff
path: root/static/freebsd/man4/sa.4 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/freebsd/man4/sa.4 3.html')
-rw-r--r--static/freebsd/man4/sa.4 3.html425
1 files changed, 425 insertions, 0 deletions
diff --git a/static/freebsd/man4/sa.4 3.html b/static/freebsd/man4/sa.4 3.html
new file mode 100644
index 00000000..326ad744
--- /dev/null
+++ b/static/freebsd/man4/sa.4 3.html
@@ -0,0 +1,425 @@
+<table class="head">
+ <tr>
+ <td class="head-ltitle">SA(4)</td>
+ <td class="head-vol">Device Drivers Manual</td>
+ <td class="head-rtitle">SA(4)</td>
+ </tr>
+</table>
+<div class="manual-text">
+<section class="Sh">
+<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
+<p class="Pp"><code class="Nm">sa</code> &#x2014; <span class="Nd">SCSI
+ Sequential Access device driver</span></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
+<p class="Pp"><code class="Cd">device sa</code></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver provides support for all
+ SCSI devices of the sequential access class that are attached to the system
+ through a supported SCSI Host Adapter. The sequential access class includes
+ tape and other linear access devices.</p>
+<p class="Pp">A SCSI Host adapter must also be separately configured into the
+ system before a SCSI sequential access device can be configured.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="MOUNT_SESSIONS"><a class="permalink" href="#MOUNT_SESSIONS">MOUNT
+ SESSIONS</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver is based around the concept
+ of a
+ &#x201C;<a class="permalink" href="#mount"><i class="Em" id="mount">mount
+ session</i></a>&#x201D;, which is defined as the period between the time
+ that a tape is mounted, and the time when it is unmounted. Any parameters
+ set during a mount session remain in effect for the remainder of the session
+ or until replaced. The tape can be unmounted, bringing the session to a
+ close in several ways. These include:</p>
+<ol class="Bl-enum">
+ <li>Closing a `rewind device', referred to as sub-mode 00 below. An example is
+ <span class="Pa">/dev/sa0</span>.</li>
+ <li>Using the MTOFFL <a class="Xr">ioctl(2)</a> command, reachable through the
+ &#x2018;<code class="Cm">offline</code>&#x2019; command of
+ <a class="Xr">mt(1)</a>.</li>
+</ol>
+<p class="Pp">It should be noted that tape devices are exclusive open devices,
+ except in the case where a control mode device is opened. In the latter
+ case, exclusive access is only sought when needed (e.g., to set
+ parameters).</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SUB-MODES"><a class="permalink" href="#SUB-MODES">SUB-MODES</a></h1>
+<p class="Pp">The sub-modes differ in the action taken when the device is
+ closed:</p>
+<dl class="Bl-tag">
+ <dt><span class="Pa">/dev/sa*</span></dt>
+ <dd>A close will rewind the device; if the tape has been written, then a file
+ mark will be written before the rewind is requested. The device is
+ unmounted.</dd>
+ <dt><span class="Pa">/dev/nsa*</span></dt>
+ <dd>A close will leave the tape mounted. If the tape was written to, a file
+ mark will be written. No other head positioning takes place. Any further
+ reads or writes will occur directly after the last read, or the written
+ file mark.</dd>
+ <dt><span class="Pa">/dev/esa*</span></dt>
+ <dd>A close will rewind the device. If the tape has been written, then a file
+ mark will be written before the rewind is requested. On completion of the
+ rewind an unload command will be issued. The device is unmounted.</dd>
+</dl>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="BLOCKING_MODES"><a class="permalink" href="#BLOCKING_MODES">BLOCKING
+ MODES</a></h1>
+<p class="Pp">SCSI tapes may run in either
+ &#x2018;<a class="permalink" href="#variable"><i class="Em" id="variable">variable</i></a>&#x2019;
+ or
+ &#x2018;<a class="permalink" href="#fixed"><i class="Em" id="fixed">fixed</i></a>&#x2019;
+ block-size modes. Most QIC-type devices run in fixed block-size mode, where
+ most nine-track tapes and many new cartridge formats allow variable
+ block-size. The difference between the two is as follows:</p>
+<dl class="Bl-inset">
+ <dt id="part">Variable block-size:</dt>
+ <dd>Each write made to the device results in a single logical record written
+ to the tape. One can never read or write
+ <a class="permalink" href="#part"><i class="Em">part</i></a> of a record
+ from tape (though you may request a larger block and read a smaller
+ record); nor can one read multiple blocks. Data from a single write is
+ therefore read by a single read. The block size used may be any value
+ supported by the device, the SCSI adapter and the system (usually between
+ 1 byte and 64 Kbytes, sometimes more).
+ <p class="Pp">When reading a variable record/block from the tape, the head
+ is logically considered to be immediately after the last item read, and
+ before the next item after that. If the next item is a file mark, but it
+ was never read, then the next process to read will immediately hit the
+ file mark and receive an end-of-file notification.</p>
+ </dd>
+ <dt>Fixed block-size:</dt>
+ <dd>Data written by the user is passed to the tape as a succession of fixed
+ size blocks. It may be contiguous in memory, but it is considered to be a
+ series of independent blocks. One may never write an amount of data that
+ is not an exact multiple of the blocksize. One may read and write the same
+ data as a different set of records. In other words, blocks that were
+ written together may be read separately, and vice-versa.
+ <p class="Pp">If one requests more blocks than remain in the file, the drive
+ will encounter the file mark. As there is some data to return (unless
+ there were no records before the file mark), the read will succeed,
+ returning that data. The next read will return immediately with a value
+ of 0. (As above, if the file mark is never read, it remains for the next
+ process to read if in no-rewind mode.)</p>
+ </dd>
+</dl>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="BLOCK_SIZES"><a class="permalink" href="#BLOCK_SIZES">BLOCK
+ SIZES</a></h1>
+<p class="Pp">By default, the driver will NOT accept reads or writes to a tape
+ device that are larger than may be written to or read from the mounted tape
+ using a single write or read request. Because of this, the application
+ author may have confidence that his wishes are respected in terms of the
+ block size written to tape. For example, if the user tries to write a 256KB
+ block to the tape, but the controller can handle no more than 128KB, the
+ write will fail. The previous <span class="Ux">FreeBSD</span> behavior,
+ prior to <span class="Ux">FreeBSD</span> 10.0, was to break up large reads
+ or writes into smaller blocks when going to the tape. The problem with that
+ behavior, though, is that it hides the actual on-tape block size from the
+ application writer, at least in variable block mode.</p>
+<p class="Pp">If the user would like his large reads and writes broken up into
+ separate pieces, he may set the following loader tunables. Note that these
+ tunables WILL GO AWAY in <span class="Ux">FreeBSD 11.0</span>. They are
+ provided for transition purposes only.</p>
+<dl class="Bl-tag">
+ <dt>kern.cam.sa.allow_io_split</dt>
+ <dd>
+ <p class="Pp">This variable, when set to 1, will configure all
+ <code class="Nm">sa</code> devices to split large buffers into smaller
+ pieces when needed.</p>
+ </dd>
+ <dt>kern.cam.sa.%d.allow_io_split</dt>
+ <dd>
+ <p class="Pp">This variable, when set to 1, will configure the given
+ <code class="Nm">sa</code> unit to split large buffers into multiple
+ pieces. This will override the global setting, if it exists.</p>
+ </dd>
+</dl>
+<p class="Pp">There are several <a class="Xr">sysctl(8)</a> variables available
+ to view block handling parameters:</p>
+<dl class="Bl-tag">
+ <dt>kern.cam.sa.%d.allow_io_split</dt>
+ <dd>
+ <p class="Pp">This variable allows the user to see, but not modify, the
+ current I/O split setting. The user is not permitted to modify this
+ setting so that there is no chance of behavior changing for the
+ application while a tape is mounted.</p>
+ </dd>
+ <dt>kern.cam.sa.%d.maxio</dt>
+ <dd>
+ <p class="Pp">This variable shows the maximum I/O size in bytes that is
+ allowed by the combination of kernel tuning parameters (MAXPHYS,
+ DFLTPHYS) and the capabilities of the controller that is attached to the
+ tape drive. Applications may look at this value for a guide on how large
+ an I/O may be permitted, but should keep in mind that the actual maximum
+ may be restricted further by the tape drive via the SCSI READ BLOCK
+ LIMITS command.</p>
+ </dd>
+ <dt>kern.cam.sa.%d.cpi_maxio</dt>
+ <dd>
+ <p class="Pp">This variable shows the maximum I/O size supported by the
+ controller, in bytes, that is reported via the CAM Path Inquiry CCB
+ (XPT_PATH_INQ). If this is 0, that means that the controller has not
+ reported a maximum I/O size.</p>
+ </dd>
+</dl>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="FILE_MARK_HANDLING"><a class="permalink" href="#FILE_MARK_HANDLING">FILE
+ MARK HANDLING</a></h1>
+<p class="Pp">The handling of file marks on write is automatic. If the user has
+ written to the tape, and has not done a read since the last write, then a
+ file mark will be written to the tape when the device is closed. If a rewind
+ is requested after a write, then the driver assumes that the last file on
+ the tape has been written, and ensures that there are two file marks written
+ to the tape. The exception to this is that there seems to be a standard
+ (which we follow, but do not understand why) that certain types of tape do
+ not actually write two file marks to tape, but when read, report a `phantom'
+ file mark when the last file is read. These devices include the QIC family
+ of devices. (It might be that this set of devices is the same set as that of
+ fixed block devices. This has not been determined yet, and they are treated
+ as separate behaviors by the driver at this time.)</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="PARAMETERS"><a class="permalink" href="#PARAMETERS">PARAMETERS</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver supports a number of
+ parameters. The user can query parameters using &#x201C;mt param -l&#x201D;
+ (which uses the <code class="Dv">MTIOCPARAMGET</code> ioctl) and the user
+ can set parameters using &#x201C;mt param -s&#x201D; (which uses the
+ <code class="Dv">MTIOCPARAMSET</code> ioctl). See <a class="Xr">mt(1)</a>
+ and <a class="Xr">mtio(4)</a> for more details on the interface.</p>
+<p class="Pp">Supported parameters:</p>
+<dl class="Bl-tag">
+ <dt>sili</dt>
+ <dd>The default is 0. When set to 1, it sets the Suppress Incorrect Length
+ Indicator (SILI) bit on tape reads. Tape drives normally return sense data
+ (which contains the residual) when the application reads a block that is
+ not the same length as the amount of data requested. The SILI bit
+ suppresses that notification in most cases. See the SSC-5 spec (available
+ at t10.org), specifically the section on the READ(6) command, for more
+ information.</dd>
+ <dt>eot_warn</dt>
+ <dd>The default is 0. By default, the <code class="Nm">sa</code> driver
+ reports entering Programmable Early Warning, Early Warning and End of
+ Media conditions by returning a write with 0 bytes written, and
+ <code class="Dv">errno</code> set to 0. If <var class="Va">eot_warn</var>
+ is set to 1, the <code class="Nm">sa</code> driver will set
+ <code class="Dv">errno</code> to <code class="Dv">ENOSPC</code> when it
+ enters any of the out of space conditions.</dd>
+ <dt>protection.protection_supported</dt>
+ <dd>This is a read-only parameter, and is set to 1 if the tape drive supports
+ protection information.</dd>
+ <dt>protection.prot_method</dt>
+ <dd>If protection is supported, set this to the desired protection method
+ supported by the tape drive. As of SSC-5r03 (available at t10.org), the
+ protection method values are:
+ <dl class="Bl-tag">
+ <dt>0</dt>
+ <dd>No protection.</dd>
+ <dt>1</dt>
+ <dd>Reed-Solomon CRC, 4 bytes in length.</dd>
+ <dt>2</dt>
+ <dd>CRC32C, 4 bytes in length.</dd>
+ </dl>
+ </dd>
+ <dt>protection.pi_length</dt>
+ <dd>Length of the protection information, see above for lengths.</dd>
+ <dt>protection.lbp_w</dt>
+ <dd>If set to 1, enable logical block protection on writes. The CRC must be
+ appended to the end of the block written to the tape driver. The tape
+ drive will verify the CRC when it receives the block.</dd>
+ <dt>protection.lbp_r</dt>
+ <dd>If set to 1, enable logical block protection on reads. The CRC will be
+ appended to the end of the block read from the tape driver. The
+ application should verify the CRC when it receives the block.</dd>
+ <dt>protection.rdbp</dt>
+ <dd>If set to 1, enable logical block protection on the RECOVER BUFFERED DATA
+ command. The <code class="Nm">sa</code> driver does not currently use the
+ RECOVER BUFFERED DATA command.</dd>
+</dl>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="TIMEOUTS"><a class="permalink" href="#TIMEOUTS">TIMEOUTS</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver has a set of default
+ timeouts for SCSI commands (READ, WRITE, TEST UNIT READY, etc.) that will
+ likely work in most cases for many tape drives.</p>
+<p class="Pp">For newer tape drives that claim to support the SPC-4 standard
+ (SCSI Primary Commands 4) or later standards, the <code class="Nm">sa</code>
+ driver will attempt to use the REPORT SUPPORTED OPERATION CODES command to
+ fetch timeout descriptors from the drive. If the drive does report timeout
+ descriptors, the <code class="Nm">sa</code> driver will use the drive's
+ recommended timeouts for commands.</p>
+<p class="Pp">The timeouts in use are reported in units of
+ <b class="Sy">thousandths</b> of a second via the
+ <var class="Va">kern.cam.sa.%d.timeout.*</var> <a class="Xr">sysctl(8)</a>
+ variables.</p>
+<p class="Pp">To override either the default timeouts, or the timeouts
+ recommended by the drive, you can set one of two sets of loader tunable
+ values. If you have a drive that supports the REPORT SUPPORTED OPERATION
+ CODES timeout descriptors (see the <a class="Xr">camcontrol(8)</a>
+ <var class="Va">opcodes</var> subcommand) it is generally best to use those
+ values. The global <var class="Va">kern.cam.sa.timeout.*</var> values will
+ override the timeouts for all <code class="Nm">sa</code> driver instances.
+ If there are 5 tape drives in the system, they'll all get the same timeouts.
+ The <var class="Va">kern.cam.sa.%d.timeout.*</var> values (where %d is the
+ numeric <code class="Nm">sa</code> instance number) will override the global
+ timeouts as well as either the default timeouts or the timeouts recommended
+ by the drive.</p>
+<p class="Pp">To set timeouts after boot, the per-instance timeout values, for
+ example: <var class="Va">kern.cam.sa.0.timeout.read</var>, are available as
+ sysctl variables.</p>
+<p class="Pp">If a tape drive arrives after boot, the global tunables or
+ per-instance tunables that apply to the newly arrived drive will be
+ used.</p>
+<p class="Pp">Loader tunables:</p>
+<p class="Pp"></p>
+<dl class="Bl-tag Bl-compact">
+ <dt>kern.cam.sa.timeout.erase</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.locate</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.mode_select</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.mode_sense</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.prevent</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.read</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.read_position</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.read_block_limits</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.report_density</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.reserve</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.rewind</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.space</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.tur</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.write</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.timeout.write_filemarks</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+</dl>
+<p class="Pp">Loader tunable values and <a class="Xr">sysctl(8)</a> values:</p>
+<p class="Pp"></p>
+<dl class="Bl-tag Bl-compact">
+ <dt>kern.cam.sa.%d.timeout.erase</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.locate</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.mode_select</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.mode_sense</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.prevent</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.read</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.read_position</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.read_block_limits</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.report_density</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.reserve</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.rewind</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.space</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.tur</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.write</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+ <dt>kern.cam.sa.%d.timeout.write_filemarks</dt>
+ <dd style="width: auto;">&#x00A0;</dd>
+</dl>
+<p class="Pp">As mentioned above, the timeouts are set and reported in
+ <b class="Sy">thousandths</b> of a second, so be sure to account for that
+ when setting them.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="IOCTLS"><a class="permalink" href="#IOCTLS">IOCTLS</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver supports all of the ioctls
+ of <a class="Xr">mtio(4)</a>.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="FILES"><a class="permalink" href="#FILES">FILES</a></h1>
+<dl class="Bl-tag Bl-compact">
+ <dt><span class="Pa">/dev/[n][e]sa[0-9]</span></dt>
+ <dd>general form:</dd>
+ <dt><span class="Pa">/dev/sa0</span></dt>
+ <dd>Rewind on close</dd>
+ <dt><span class="Pa">/dev/nsa0</span></dt>
+ <dd>No rewind on close</dd>
+ <dt><span class="Pa">/dev/esa0</span></dt>
+ <dd>Eject on close (if capable)</dd>
+ <dt><span class="Pa">/dev/sa0.ctl</span></dt>
+ <dd>Control mode device (to examine state while another program is accessing
+ the device, e.g.).</dd>
+</dl>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="DIAGNOSTICS"><a class="permalink" href="#DIAGNOSTICS">DIAGNOSTICS</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver supports injecting End Of
+ Media (EOM) notification to aid application development and testing. EOM is
+ indicated to the application by returning the read or write with 0 bytes
+ written. In addition, when EOM is injected, the tape position status will be
+ updated to temporarily show Beyond of the Programmable Early Warning (BPEW)
+ status. To see BPEW status, use the <code class="Dv">MTIOCEXTGET</code>
+ ioctl, which is used by the &#x201C;mt status&#x201D; command. To inject an
+ EOM notification, set the</p>
+<p class="Pp"><var class="Va">kern.cam.sa.%d.inject_eom</var></p>
+<p class="Pp">sysctl variable to 1. One EOM notification will be sent, BPEW
+ status will be set for one position query, and then the driver state will be
+ reset to normal.</p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
+ ALSO</a></h1>
+<p class="Pp"><a class="Xr">mt(1)</a>, <a class="Xr">cam(4)</a>,
+ <a class="Xr">mtio(4)</a></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1>
+<p class="Pp">The <code class="Nm">sa</code> driver was written for the CAM SCSI
+ subsystem by <span class="An">Justin T. Gibbs</span> and
+ <span class="An">Kenneth Merry</span>. Many ideas were gleaned from the
+ <code class="Nm">st</code> device driver written and ported from Mach 2.5 by
+ <span class="An">Julian Elischer</span>.</p>
+<p class="Pp">The owner of record for many years was <span class="An">Matthew
+ Jacob</span>. The current maintainer is <span class="An">Kenneth
+ Merry</span></p>
+</section>
+<section class="Sh">
+<h1 class="Sh" id="BUGS"><a class="permalink" href="#BUGS">BUGS</a></h1>
+<p class="Pp">This driver lacks many of the hacks required to deal with older
+ devices. Many older SCSI-1 devices may not work properly with this driver
+ yet.</p>
+<p class="Pp">Additionally, certain tapes (QIC tapes mostly) that were written
+ under <span class="Ux">FreeBSD</span> 2.X are not automatically read
+ correctly with this driver: you may need to explicitly set variable block
+ mode or set to the blocksize that works best for your device in order to
+ read tapes written under <span class="Ux">FreeBSD</span> 2.X.</p>
+<p class="Pp">Partitions are only supported for status information and location.
+ It would be nice to add support for creating and editing tape
+ partitions.</p>
+</section>
+</div>
+<table class="foot">
+ <tr>
+ <td class="foot-date">January 18, 2022</td>
+ <td class="foot-os">FreeBSD 15.0</td>
+ </tr>
+</table>