Sophie

Sophie

distrib > CentOS > 6 > i386 > by-pkgid > cf93d8a8acdcc6fe2225039da0502495 > files > 2274

kernel-doc-2.6.32-131.17.1.el6.centos.plus.noarch.rpm

<?xml version="1.0" encoding="ANSI_X3.4-1968" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ANSI_X3.4-1968" /><title>How commands are issued</title><meta name="generator" content="DocBook XSL Stylesheets V1.75.2" /><link rel="home" href="index.html" title="libATA Developer's Guide" /><link rel="up" href="ch03.html" title="Chapter&#160;3.&#160;Error handling" /><link rel="prev" href="ch03.html" title="Chapter&#160;3.&#160;Error handling" /><link rel="next" href="ch03s03.html" title="How commands are processed" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">How commands are issued</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch03.html">Prev</a>&#160;</td><th width="60%" align="center">Chapter&#160;3.&#160;Error handling</th><td width="20%" align="right">&#160;<a accesskey="n" href="ch03s03.html">Next</a></td></tr></table><hr /></div><div class="sect1" title="How commands are issued"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2815328"></a>How commands are issued</h2></div></div></div><div class="variablelist"><dl><dt><span class="term">Internal commands</span></dt><dd><p>
	First, qc is allocated and initialized using
	ata_qc_new_init().  Although ata_qc_new_init() doesn't
	implement any wait or retry mechanism when qc is not
	available, internal commands are currently issued only during
	initialization and error recovery, so no other command is
	active and allocation is guaranteed to succeed.
	</p><p>
	Once allocated qc's taskfile is initialized for the command to
	be executed.  qc currently has two mechanisms to notify
	completion.  One is via qc-&gt;complete_fn() callback and the
	other is completion qc-&gt;waiting.  qc-&gt;complete_fn() callback
	is the asynchronous path used by normal SCSI translated
	commands and qc-&gt;waiting is the synchronous (issuer sleeps in
	process context) path used by internal commands.
	</p><p>
	Once initialization is complete, host_set lock is acquired
	and the qc is issued.
	</p></dd><dt><span class="term">SCSI commands</span></dt><dd><p>
	All libata drivers use ata_scsi_queuecmd() as
	hostt-&gt;queuecommand callback.  scmds can either be simulated
	or translated.  No qc is involved in processing a simulated
	scmd.  The result is computed right away and the scmd is
	completed.
	</p><p>
	For a translated scmd, ata_qc_new_init() is invoked to
	allocate a qc and the scmd is translated into the qc.  SCSI
	midlayer's completion notification function pointer is stored
	into qc-&gt;scsidone.
	</p><p>
	qc-&gt;complete_fn() callback is used for completion
	notification.  ATA commands use ata_scsi_qc_complete() while
	ATAPI commands use atapi_qc_complete().  Both functions end up
	calling qc-&gt;scsidone to notify upper layer when the qc is
	finished.  After translation is completed, the qc is issued
	with ata_qc_issue().
	</p><p>
	Note that SCSI midlayer invokes hostt-&gt;queuecommand while
	holding host_set lock, so all above occur while holding
	host_set lock.
	</p></dd></dl></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03.html">Prev</a>&#160;</td><td width="20%" align="center"><a accesskey="u" href="ch03.html">Up</a></td><td width="40%" align="right">&#160;<a accesskey="n" href="ch03s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter&#160;3.&#160;Error handling&#160;</td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top">&#160;How commands are processed</td></tr></table></div></body></html>