📄 hd.c
字号:
<a name=L232 href="source/kernel/blk_drv/hd.c#L232">232</a> <a href="ident?i=reset_controller">reset_controller</a>();<a name=L233 href="source/kernel/blk_drv/hd.c#L233">233</a> <a href="ident?i=hd_out">hd_out</a>(nr,<a href="ident?i=hd_info">hd_info</a>[nr].sect,<a href="ident?i=hd_info">hd_info</a>[nr].sect,<a href="ident?i=hd_info">hd_info</a>[nr].<a href="ident?i=head">head</a>-1,<a name=L234 href="source/kernel/blk_drv/hd.c#L234">234</a> <a href="ident?i=hd_info">hd_info</a>[nr].cyl,<a href="ident?i=WIN_SPECIFY">WIN_SPECIFY</a>,&<a href="ident?i=recal_intr">recal_intr</a>);<a name=L235 href="source/kernel/blk_drv/hd.c#L235">235</a> }<a name=L236 href="source/kernel/blk_drv/hd.c#L236">236</a> <a name=L237 href="source/kernel/blk_drv/hd.c#L237">237</a> void <a href="ident?i=unexpected_hd_interrupt">unexpected_hd_interrupt</a>(void)<a name=L238 href="source/kernel/blk_drv/hd.c#L238">238</a> {<a name=L239 href="source/kernel/blk_drv/hd.c#L239">239</a> <a href="ident?i=printk">printk</a>(<i>"Unexpected HD interrupt\n\r"</i>);<a name=L240 href="source/kernel/blk_drv/hd.c#L240">240</a> }<a name=L241 href="source/kernel/blk_drv/hd.c#L241">241</a> <a name=L242 href="source/kernel/blk_drv/hd.c#L242">242</a> static void <a href="ident?i=bad_rw_intr">bad_rw_intr</a>(void)<a name=L243 href="source/kernel/blk_drv/hd.c#L243">243</a> {<a name=L244 href="source/kernel/blk_drv/hd.c#L244">244</a> if (++<a href="ident?i=CURRENT">CURRENT</a>->errors >= <a href="ident?i=MAX_ERRORS">MAX_ERRORS</a>)<a name=L245 href="source/kernel/blk_drv/hd.c#L245">245</a> <a href="ident?i=end_request">end_request</a>(0);<a name=L246 href="source/kernel/blk_drv/hd.c#L246">246</a> if (<a href="ident?i=CURRENT">CURRENT</a>->errors > <a href="ident?i=MAX_ERRORS">MAX_ERRORS</a>/2)<a name=L247 href="source/kernel/blk_drv/hd.c#L247">247</a> <a href="ident?i=reset">reset</a> = 1;<a name=L248 href="source/kernel/blk_drv/hd.c#L248">248</a> }<a name=L249 href="source/kernel/blk_drv/hd.c#L249">249</a> <a name=L250 href="source/kernel/blk_drv/hd.c#L250">250</a> static void <a href="ident?i=read_intr">read_intr</a>(void)<a name=L251 href="source/kernel/blk_drv/hd.c#L251">251</a> {<a name=L252 href="source/kernel/blk_drv/hd.c#L252">252</a> if (<a href="ident?i=win_result">win_result</a>()) {<a name=L253 href="source/kernel/blk_drv/hd.c#L253">253</a> <a href="ident?i=bad_rw_intr">bad_rw_intr</a>();<a name=L254 href="source/kernel/blk_drv/hd.c#L254">254</a> <a href="ident?i=do_hd_request">do_hd_request</a>();<a name=L255 href="source/kernel/blk_drv/hd.c#L255">255</a> return;<a name=L256 href="source/kernel/blk_drv/hd.c#L256">256</a> }<a name=L257 href="source/kernel/blk_drv/hd.c#L257">257</a> <a href="ident?i=port_read">port_read</a>(<a href="ident?i=HD_DATA">HD_DATA</a>,<a href="ident?i=CURRENT">CURRENT</a>->buffer,256);<a name=L258 href="source/kernel/blk_drv/hd.c#L258">258</a> <a href="ident?i=CURRENT">CURRENT</a>->errors = 0;<a name=L259 href="source/kernel/blk_drv/hd.c#L259">259</a> <a href="ident?i=CURRENT">CURRENT</a>->buffer += 512;<a name=L260 href="source/kernel/blk_drv/hd.c#L260">260</a> <a href="ident?i=CURRENT">CURRENT</a>-><a href="ident?i=sector">sector</a>++;<a name=L261 href="source/kernel/blk_drv/hd.c#L261">261</a> if (--<a href="ident?i=CURRENT">CURRENT</a>->nr_sectors) {<a name=L262 href="source/kernel/blk_drv/hd.c#L262">262</a> do_hd = &<a href="ident?i=read_intr">read_intr</a>;<a name=L263 href="source/kernel/blk_drv/hd.c#L263">263</a> return;<a name=L264 href="source/kernel/blk_drv/hd.c#L264">264</a> }<a name=L265 href="source/kernel/blk_drv/hd.c#L265">265</a> <a href="ident?i=end_request">end_request</a>(1);<a name=L266 href="source/kernel/blk_drv/hd.c#L266">266</a> <a href="ident?i=do_hd_request">do_hd_request</a>();<a name=L267 href="source/kernel/blk_drv/hd.c#L267">267</a> }<a name=L268 href="source/kernel/blk_drv/hd.c#L268">268</a> <a name=L269 href="source/kernel/blk_drv/hd.c#L269">269</a> static void <a href="ident?i=write_intr">write_intr</a>(void)<a name=L270 href="source/kernel/blk_drv/hd.c#L270">270</a> {<a name=L271 href="source/kernel/blk_drv/hd.c#L271">271</a> if (<a href="ident?i=win_result">win_result</a>()) {<a name=L272 href="source/kernel/blk_drv/hd.c#L272">272</a> <a href="ident?i=bad_rw_intr">bad_rw_intr</a>();<a name=L273 href="source/kernel/blk_drv/hd.c#L273">273</a> <a href="ident?i=do_hd_request">do_hd_request</a>();<a name=L274 href="source/kernel/blk_drv/hd.c#L274">274</a> return;<a name=L275 href="source/kernel/blk_drv/hd.c#L275">275</a> }<a name=L276 href="source/kernel/blk_drv/hd.c#L276">276</a> if (--<a href="ident?i=CURRENT">CURRENT</a>->nr_sectors) {<a name=L277 href="source/kernel/blk_drv/hd.c#L277">277</a> <a href="ident?i=CURRENT">CURRENT</a>-><a href="ident?i=sector">sector</a>++;<a name=L278 href="source/kernel/blk_drv/hd.c#L278">278</a> <a href="ident?i=CURRENT">CURRENT</a>->buffer += 512;<a name=L279 href="source/kernel/blk_drv/hd.c#L279">279</a> do_hd = &<a href="ident?i=write_intr">write_intr</a>;<a name=L280 href="source/kernel/blk_drv/hd.c#L280">280</a> <a href="ident?i=port_write">port_write</a>(<a href="ident?i=HD_DATA">HD_DATA</a>,<a href="ident?i=CURRENT">CURRENT</a>->buffer,256);<a name=L281 href="source/kernel/blk_drv/hd.c#L281">281</a> return;<a name=L282 href="source/kernel/blk_drv/hd.c#L282">282</a> }<a name=L283 href="source/kernel/blk_drv/hd.c#L283">283</a> <a href="ident?i=end_request">end_request</a>(1);<a name=L284 href="source/kernel/blk_drv/hd.c#L284">284</a> <a href="ident?i=do_hd_request">do_hd_request</a>();<a name=L285 href="source/kernel/blk_drv/hd.c#L285">285</a> }<a name=L286 href="source/kernel/blk_drv/hd.c#L286">286</a> <a name=L287 href="source/kernel/blk_drv/hd.c#L287">287</a> static void <a href="ident?i=recal_intr">recal_intr</a>(void)<a name=L288 href="source/kernel/blk_drv/hd.c#L288">288</a> {<a name=L289 href="source/kernel/blk_drv/hd.c#L289">289</a> if (<a href="ident?i=win_result">win_result</a>())<a name=L290 href="source/kernel/blk_drv/hd.c#L290">290</a> <a href="ident?i=bad_rw_intr">bad_rw_intr</a>();<a name=L291 href="source/kernel/blk_drv/hd.c#L291">291</a> <a href="ident?i=do_hd_request">do_hd_request</a>();<a name=L292 href="source/kernel/blk_drv/hd.c#L292">292</a> }<a name=L293 href="source/kernel/blk_drv/hd.c#L293">293</a> <a name=L294 href="source/kernel/blk_drv/hd.c#L294">294</a> void <a href="ident?i=do_hd_request">do_hd_request</a>(void)<a name=L295 href="source/kernel/blk_drv/hd.c#L295">295</a> {<a name=L296 href="source/kernel/blk_drv/hd.c#L296">296</a> int i,r;<a name=L297 href="source/kernel/blk_drv/hd.c#L297">297</a> unsigned int block,dev;<a name=L298 href="source/kernel/blk_drv/hd.c#L298">298</a> unsigned int sec,<a href="ident?i=head">head</a>,cyl;<a name=L299 href="source/kernel/blk_drv/hd.c#L299">299</a> unsigned int nsect;<a name=L300 href="source/kernel/blk_drv/hd.c#L300">300</a> <a name=L301 href="source/kernel/blk_drv/hd.c#L301">301</a> <a href="ident?i=INIT_REQUEST">INIT_REQUEST</a>;<a name=L302 href="source/kernel/blk_drv/hd.c#L302">302</a> dev = <a href="ident?i=MINOR">MINOR</a>(<a href="ident?i=CURRENT">CURRENT</a>->dev);<a name=L303 href="source/kernel/blk_drv/hd.c#L303">303</a> block = <a href="ident?i=CURRENT">CURRENT</a>-><a href="ident?i=sector">sector</a>;<a name=L304 href="source/kernel/blk_drv/hd.c#L304">304</a> if (dev >= 5*<a href="ident?i=NR_HD">NR_HD</a> || block+2 > <a href="ident?i=hd">hd</a>[dev].nr_sects) {<a name=L305 href="source/kernel/blk_drv/hd.c#L305">305</a> <a href="ident?i=end_request">end_request</a>(0);<a name=L306 href="source/kernel/blk_drv/hd.c#L306">306</a> goto repeat;<a name=L307 href="source/kernel/blk_drv/hd.c#L307">307</a> }<a name=L308 href="source/kernel/blk_drv/hd.c#L308">308</a> block += <a href="ident?i=hd">hd</a>[dev].start_sect;<a name=L309 href="source/kernel/blk_drv/hd.c#L309">309</a> dev /= 5;<a name=L310 href="source/kernel/blk_drv/hd.c#L310">310</a> __asm__(<i>"divl %4"</i>:<i>"=a"</i> (block),<i>"=d"</i> (sec):<i>""</i> (block),<i>"1"</i> (0),<a name=L311 href="source/kernel/blk_drv/hd.c#L311">311</a> <i>"r"</i> (<a href="ident?i=hd_info">hd_info</a>[dev].sect));<a name=L312 href="source/kernel/blk_drv/hd.c#L312">312</a> __asm__(<i>"divl %4"</i>:<i>"=a"</i> (cyl),<i>"=d"</i> (<a href="ident?i=head">head</a>):<i>""</i> (block),<i>"1"</i> (0),<a name=L313 href="source/kernel/blk_drv/hd.c#L313">313</a> <i>"r"</i> (<a href="ident?i=hd_info">hd_info</a>[dev].<a href="ident?i=head">head</a>));<a name=L314 href="source/kernel/blk_drv/hd.c#L314">314</a> sec++;<a name=L315 href="source/kernel/blk_drv/hd.c#L315">315</a> nsect = <a href="ident?i=CURRENT">CURRENT</a>->nr_sectors;<a name=L316 href="source/kernel/blk_drv/hd.c#L316">316</a> if (<a href="ident?i=reset">reset</a>) {<a name=L317 href="source/kernel/blk_drv/hd.c#L317">317</a> <a href="ident?i=reset">reset</a> = 0;<a name=L318 href="source/kernel/blk_drv/hd.c#L318">318</a> <a href="ident?i=recalibrate">recalibrate</a> = 1;<a name=L319 href="source/kernel/blk_drv/hd.c#L319">319</a> <a href="ident?i=reset_hd">reset_hd</a>(<a href="ident?i=CURRENT_DEV">CURRENT_DEV</a>);<a name=L320 href="source/kernel/blk_drv/hd.c#L320">320</a> return;<a name=L321 href="source/kernel/blk_drv/hd.c#L321">321</a> }<a name=L322 href="source/kernel/blk_drv/hd.c#L322">322</a> if (<a href="ident?i=recalibrate">recalibrate</a>) {<a name=L323 href="source/kernel/blk_drv/hd.c#L323">323</a> <a href="ident?i=recalibrate">recalibrate</a> = 0;<a name=L324 href="source/kernel/blk_drv/hd.c#L324">324</a> <a href="ident?i=hd_out">hd_out</a>(dev,<a href="ident?i=hd_info">hd_info</a>[<a href="ident?i=CURRENT_DEV">CURRENT_DEV</a>].sect,0,0,0,<a name=L325 href="source/kernel/blk_drv/hd.c#L325">325</a> <a href="ident?i=WIN_RESTORE">WIN_RESTORE</a>,&<a href="ident?i=recal_intr">recal_intr</a>);<a name=L326 href="source/kernel/blk_drv/hd.c#L326">326</a> return;<a name=L327 href="source/kernel/blk_drv/hd.c#L327">327</a> } <a name=L328 href="source/kernel/blk_drv/hd.c#L328">328</a> if (<a href="ident?i=CURRENT">CURRENT</a>->cmd == <a href="ident?i=WRITE">WRITE</a>) {<a name=L329 href="source/kernel/blk_drv/hd.c#L329">329</a> <a href="ident?i=hd_out">hd_out</a>(dev,nsect,sec,<a href="ident?i=head">head</a>,cyl,<a href="ident?i=WIN_WRITE">WIN_WRITE</a>,&<a href="ident?i=write_intr">write_intr</a>);<a name=L330 href="source/kernel/blk_drv/hd.c#L330">330</a> for(i=0 ; i<3000 && !(r=<a href="ident?i=inb_p">inb_p</a>(<a href="ident?i=HD_STATUS">HD_STATUS</a>)&<a href="ident?i=DRQ_STAT">DRQ_STAT</a>) ; i++)<a name=L331 href="source/kernel/blk_drv/hd.c#L331">331</a> <b><i>/* nothing */</i></b> ;<a name=L332 href="source/kernel/blk_drv/hd.c#L332">332</a> if (!r) {<a name=L333 href="source/kernel/blk_drv/hd.c#L333">333</a> <a href="ident?i=bad_rw_intr">bad_rw_intr</a>();<a name=L334 href="source/kernel/blk_drv/hd.c#L334">334</a> goto repeat;<a name=L335 href="source/kernel/blk_drv/hd.c#L335">335</a> }<a name=L336 href="source/kernel/blk_drv/hd.c#L336">336</a> <a href="ident?i=port_write">port_write</a>(<a href="ident?i=HD_DATA">HD_DATA</a>,<a href="ident?i=CURRENT">CURRENT</a>->buffer,256);<a name=L337 href="source/kernel/blk_drv/hd.c#L337">337</a> } else if (<a href="ident?i=CURRENT">CURRENT</a>->cmd == <a href="ident?i=READ">READ</a>) {<a name=L338 href="source/kernel/blk_drv/hd.c#L338">338</a> <a href="ident?i=hd_out">hd_out</a>(dev,nsect,sec,<a href="ident?i=head">head</a>,cyl,<a href="ident?i=WIN_READ">WIN_READ</a>,&<a href="ident?i=read_intr">read_intr</a>);<a name=L339 href="source/kernel/blk_drv/hd.c#L339">339</a> } else<a name=L340 href="source/kernel/blk_drv/hd.c#L340">340</a> <a href="ident?i=panic">panic</a>(<i>"unknown hd-command"</i>);<a name=L341 href="source/kernel/blk_drv/hd.c#L341">341</a> }<a name=L342 href="source/kernel/blk_drv/hd.c#L342">342</a> <a name=L343 href="source/kernel/blk_drv/hd.c#L343">343</a> void <a href="ident?i=hd_init">hd_init</a>(void)<a name=L344 href="source/kernel/blk_drv/hd.c#L344">344</a> {<a name=L345 href="source/kernel/blk_drv/hd.c#L345">345</a> <a href="ident?i=blk_dev">blk_dev</a>[<a href="ident?i=MAJOR_NR">MAJOR_NR</a>].request_fn = <a href="ident?i=DEVICE_REQUEST">DEVICE_REQUEST</a>;<a name=L346 href="source/kernel/blk_drv/hd.c#L346">346</a> <a href="ident?i=set_intr_gate">set_intr_gate</a>(0x2E,&<a href="ident?i=hd_interrupt">hd_interrupt</a>);<a name=L347 href="source/kernel/blk_drv/hd.c#L347">347</a> <a href="ident?i=outb_p">outb_p</a>(<a href="ident?i=inb_p">inb_p</a>(0x21)&0xfb,0x21);<a name=L348 href="source/kernel/blk_drv/hd.c#L348">348</a> <a href="ident?i=outb">outb</a>(<a href="ident?i=inb_p">inb_p</a>(0xA1)&0xbf,0xA1);<a name=L349 href="source/kernel/blk_drv/hd.c#L349">349</a> }<a name=L350 href="source/kernel/blk_drv/hd.c#L350">350</a> </pre><hr><div align=center> [<b><i>源代码浏览</i></b>] [<a href="diff/kernel/blk_drv/hd.c">区别标定</a>] [<a href="ident">标识符搜索</a>] [<a href="search">文本搜索</a>] [<a href="find">文件搜索</a>] </div><hr>本网页由 <a href="http:blurb.html">LXR引擎</a> 自动生成.<br></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -