📄 transport.c.htm
字号:
<a class="l" name="163"> 163 </a> * long write operation in progress, ms_delay is<a class="l" name="164"> 164 </a> * used for some fast drives with a short drive<a class="l" name="165"> 165 </a> * buffer. Such as Pioneer DVD-RW drives. They will<a class="l" name="166"> 166 </a> * begin to generate TOC when the buffer is initially<a class="l" name="167"> 167 </a> * full, then resume operation a few minutes later<a class="l" name="168"> 168 </a> * with the buffer emptying quickly.<a class="l" name="169"> 169 </a> */</span><a class="hl" name="170"> 170 </a> <b>if</b> ((<a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">2</span>) && (<a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">4</span>) &&<a class="l" name="171"> 171 </a> (<a href="/source/s?defs=ASCQ">ASCQ</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">8</span>)) {<a class="l" name="172"> 172 </a> <a href="/source/s?defs=total_retries">total_retries</a>++;<a class="l" name="173"> 173 </a> <span class="c">/*<a class="l" name="174"> 174 </a> * In Simulation write mode, we use the<a class="l" name="175"> 175 </a> * READ_INFO_CMD to check if all the previous<a class="l" name="176"> 176 </a> * writes completed. Sleeping 500 ms will not<a class="l" name="177"> 177 </a> * be sufficient in all cases for DVDs.<a class="l" name="178"> 178 </a> */</span><a class="l" name="179"> 179 </a> <b>if</b> ((<a href="/source/s?defs=device_type">device_type</a> != <a href="/source/s?defs=CD_RW">CD_RW</a>) &&<a class="hl" name="180"> 180 </a> ((<a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_cdb">uscsi_cdb</a>[<span class="n">0</span>] == <a href="/source/s?defs=CLOSE_TRACK_CMD">CLOSE_TRACK_CMD</a>) ||<a class="l" name="181"> 181 </a> ((<a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_cdb">uscsi_cdb</a>[<span class="n">0</span>] == <a href="/source/s?defs=READ_INFO_CMD">READ_INFO_CMD</a>) &&<a class="l" name="182"> 182 </a> <a href="/source/s?defs=simulation">simulation</a>)))<a class="l" name="183"> 183 </a> (<b>void</b>) <a href="/source/s?defs=sleep">sleep</a>(<span class="n">3</span>);<a class="l" name="184"> 184 </a> <b>else</b><a class="l" name="185"> 185 </a> <a href="/source/s?defs=ms_delay">ms_delay</a>(<span class="n">500</span>);<a class="l" name="186"> 186 </a> <b>continue</b>;<a class="l" name="187"> 187 </a> }<a class="l" name="188"> 188 </a> <span class="c">/*<a class="l" name="189"> 189 </a> * Device is not ready to transmit or a device reset<a class="hl" name="190"> 190 </a> * has occurred. wait for a short period of time then<a class="l" name="191"> 191 </a> * retry the command.<a class="l" name="192"> 192 </a> */</span><a class="l" name="193"> 193 </a> <b>if</b> ((<a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">6</span>) && ((<a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0x28</span>) ||<a class="l" name="194"> 194 </a> (<a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0x29</span>))) {<a class="l" name="195"> 195 </a> (<b>void</b>) <a href="/source/s?defs=sleep">sleep</a>(<span class="n">3</span>);<a class="l" name="196"> 196 </a> <a href="/source/s?defs=total_retries">total_retries</a>++;<a class="l" name="197"> 197 </a> <b>continue</b>;<a class="l" name="198"> 198 </a> }<a class="l" name="199"> 199 </a><a class="hl" name="200"> 200 </a> <b>if</b> ((<a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">5</span>) &&<a class="l" name="201"> 201 </a> (<a href="/source/s?defs=device_type">device_type</a> == <a href="/source/s?defs=DVD_PLUS">DVD_PLUS</a> ||<a class="l" name="202"> 202 </a> <a href="/source/s?defs=device_type">device_type</a> == <a href="/source/s?defs=DVD_PLUS_W">DVD_PLUS_W</a>)) {<a class="l" name="203"> 203 </a> <b>if</b> (<a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_cdb">uscsi_cdb</a>[<span class="n">0</span>] == <a href="/source/s?defs=MODE_SELECT_10_CMD">MODE_SELECT_10_CMD</a> &&<a class="l" name="204"> 204 </a> <a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0x26</span>) {<a class="l" name="205"> 205 </a> <a href="/source/s?defs=ret">ret</a> = <span class="n">1</span>;<a class="l" name="206"> 206 </a> <b>break</b>;<a class="l" name="207"> 207 </a> }<a class="l" name="208"> 208 </a><a class="l" name="209"> 209 </a> <b>if</b> (<a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_cdb">uscsi_cdb</a>[<span class="n">0</span>] == <a href="/source/s?defs=REZERO_UNIT_CMD">REZERO_UNIT_CMD</a> &&<a class="hl" name="210"> 210 </a> <a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0x20</span>) {<a class="l" name="211"> 211 </a> <a href="/source/s?defs=ret">ret</a> = <span class="n">1</span>;<a class="l" name="212"> 212 </a> <b>break</b>;<a class="l" name="213"> 213 </a> }<a class="l" name="214"> 214 </a><a class="l" name="215"> 215 </a> }<a class="l" name="216"> 216 </a> <span class="c">/*<a class="l" name="217"> 217 </a> * Blank Sense, we don't know what the error is or if<a class="l" name="218"> 218 </a> * the command succeeded, Hope for the best. Some<a class="l" name="219"> 219 </a> * drives return blank sense periodically and will<a class="hl" name="220"> 220 </a> * fail if this is removed.<a class="l" name="221"> 221 </a> */</span><a class="l" name="222"> 222 </a> <b>if</b> ((<a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0</span>) && (<a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0</span>) &&<a class="l" name="223"> 223 </a> (<a href="/source/s?defs=ASCQ">ASCQ</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>) == <span class="n">0</span>)) {<a class="l" name="224"> 224 </a> <a href="/source/s?defs=ret">ret</a> = <span class="n">0</span>;<a class="l" name="225"> 225 </a> <b>break</b>;<a class="l" name="226"> 226 </a> }<a class="l" name="227"> 227 </a><a class="l" name="228"> 228 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>) {<a class="l" name="229"> 229 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"cmd: 0x%02x ret:%i status:%02x "</span><a class="hl" name="230"> 230 </a> <span class="s">" sense: %02x ASC: %02x ASCQ:%02x\n"</span>,<a class="l" name="231"> 231 </a> (<a href="/source/s?defs=uchar_t">uchar_t</a>)<a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_cdb">uscsi_cdb</a>[<span class="n">0</span>], <a href="/source/s?defs=ret">ret</a>,<a class="l" name="232"> 232 </a> <a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_status">uscsi_status</a>,<a class="l" name="233"> 233 </a> (<a href="/source/s?defs=uchar_t">uchar_t</a>)<a href="/source/s?defs=SENSE_KEY">SENSE_KEY</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>),<a class="l" name="234"> 234 </a> (<a href="/source/s?defs=uchar_t">uchar_t</a>)<a href="/source/s?defs=ASC">ASC</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>), (<a href="/source/s?defs=uchar_t">uchar_t</a>)<a href="/source/s?defs=ASCQ">ASCQ</a>(<a href="/source/s?defs=rqbuf">rqbuf</a>));<a class="l" name="235"> 235 </a> }<a class="l" name="236"> 236 </a> }<a class="l" name="237"> 237 </a><a class="l" name="238"> 238 </a> <span class="c">/* no errors we'll return */</span><a class="l" name="239"> 239 </a> <b>break</b>;<a class="hl" name="240"> 240 </a> }<a class="l" name="241"> 241 </a><a class="l" name="242"> 242 </a> <span class="c">/* store the error status for later debug printing */</span><a class="l" name="243"> 243 </a> <b>if</b> ((<a href="/source/s?defs=ret">ret</a> < <span class="n">0</span>) && (<a href="/source/s?defs=global_rqsense">global_rqsense</a>)) {<a class="l" name="244"> 244 </a> <a href="/source/s?defs=uscsi_status">uscsi_status</a> = <a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_status">uscsi_status</a>;<a class="l" name="245"> 245 </a> <a href="/source/s?defs=rqstatus">rqstatus</a> = <a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_rqstatus">uscsi_rqstatus</a>;<a class="l" name="246"> 246 </a> <a href="/source/s?defs=rqresid">rqresid</a> = <a href="/source/s?defs=scmd">scmd</a>-><a href="/source/s?defs=uscsi_rqresid">uscsi_rqresid</a>;<a class="l" name="247"> 247 </a><a class="l" name="248"> 248 </a> }<a class="l" name="249"> 249 </a><a class="hl" name="250"> 250 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a> && <a href="/source/s?defs=retries">retries</a>) {<a class="l" name="251"> 251 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"total retries: %d\n"</span>, <a href="/source/s?defs=total_retries">total_retries</a>);<a class="l" name="252"> 252 </a> }<a class="l" name="253"> 253 </a><a class="l" name="254"> 254 </a> <b>return</b> (<a href="/source/s?defs=ret">ret</a>);<a class="l" name="255"> 255 </a>}<a class="l" name="256"> 256 </a></pre></div><div id="Footer"><p class="Center"><a href="http://www.opensolaris.org/os/project/opengrok/"><img src="/source/default/img/servedby.png" alt="Served by OpenGrok" title="Served by OpenGrok"/></a></p><p class="Center"><a href="http://www.opensolaris.org/os/tou/">Terms of Use</a> |<a href="http://www.sun.com/privacy/">Privacy</a> |<a href="http://www.opensolaris.org/os/trademark/">Trademarks</a> |<a href="http://www.opensolaris.org/os/copyrights/">Copyright Policy</a> |<a href="http://www.opensolaris.org/os/site_guidelines/">Site Guidelines</a> |<a href="http://www.opensolaris.org/os/about/help/">Help</a><br />Your use of this web site or any of its content or software indicates your agreement to be bound by these Terms of Use.<br />Copyright © 1995-2008 Sun Microsystems, Inc.<br /></p><script type="text/javascript" src="http://www.opensolaris.org/js/s_code_remote.js"></script></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -