ttt

getttyent

(FreeBSD) 1GBのCFをATAに接続したら、timeout waiting to issu

2008-04-19 23:51:09 | デジタル・インターネット

CF (Compact Flash)を、ATA HDDとして接続できる変換アダプタがあるんですけど、それを使って、1GBのCFを接続して、FreeBSD 7.0-RELEASEを起動したら、こんなエラーメッセージが表示され、結局、CFにアクセスできませんでした。

ad2: 967MB <CF 1GB 20061215> at ata1-master WDMA2
ad2: timeout waiting to issue command
ad2: error issuing READ_DMA command
ad2: FAILURE - READ_DMA timed out LBA=1981725
ad2: timeout waiting to issue command
ad2: error issuing READ_DMA command
ad2: timeout waiting to issue command
ad2: error issuing READ_DMA command
ad2: timeout waiting to issue command
ad2: error issuing READ_DMA command
ad2: timeout waiting to issue command
ad2: error issuing READ_DMA command
(しばらく続く)

ちなみに、1GBのCFの代わりに、64MBのCFを接続した場合は、

ad2: FAILURE - SETFEATURES SET TRANSFER MODE status=51<READY,DSC,ERROR> error=4<ABORTED>
ad2: 61MB <SanDisk SDCFB-64 Vdg 1.21> at ata1-master BIOSPIO

となって、いったんエラーは出るものの、一応認識されて、アクセスできました。
BIOSPIOってのが、なんとなく遅そうなイメージがありますが…

昔から、「ノートパソコンなどでHDD関係のエラーが出たときはsafe modeで」、なんていう話があったので、なんとなく、boot loaderのメニューでsafe modeにしたら、1GBのCFを接続したときでも、今度はエラーにならずに、アクセスできました。

こんな感じで認識されてます。

# dmesg | grep ata
atapci0: <Intel ICH UDMA66 controller> port 0x1f0-0x1f7,0x3f6,0x170-0x177,0x376,0x2000-0x200f at device 31.1 on pci0
ata0: <ATA channel 0> on atapci0
ata0: [ITHREAD]
ata1: <ATA channel 1> on atapci0
ata1: [ITHREAD]
ad0: 117246MB <Maxtor 4R120L0 RAMB1TU0> at ata0-master PIO4
ad2: 967MB <CF 1GB 20061215> at ata1-master PIO4

ネットで検索してみると、こんな情報を見つけました。

http://www.bramschoenmakers.nl/node/85
Installing FreeBSD on a Compact Flash card

これによれば、

FreeBSD 6.2を2GBのCFにインストールしようとすると、

ad2: timeout waiting to issue command
error issuing READ_DMA command ad2

というようなエラーがでるので、boot loaderのメニューで、promptへ抜けてから

set hw.ata.ata_dma=0

すればよい。インストール完了後には、/boot/loader.confに

hw.ata.ata_dma=0

と書いておけばよい。

とのことでした。

これと同じ症状みたいですね。

CFの容量によって、ATAのコマンドに対する反応が微妙に異なるのでしょうか。しかし、なんにしても、FreeBSDのataドライバの出来がちょっと悪い、っていう気もします。

今現在、HDDで動かしているFreeBSD 7.0-RELEASEを、必要最小限なファイルだけ、1GBのCFへコピーして、CFだけで動かそうと思って、あれこれやってたんです。

コピーするときは、CFとHDDの両方を接続しているんですが、上記のことをやってしまいますと、HDDのほうまで、PIO4という遅そうなモードになってしまいます。

これは、カーネルがブートした後で、「atacontrol mode」コマンドでモード変更できます。

「atacontrol mode ad0」のようにして、ドライブごとに、現在のモードを確認できます。

# atacontrol mode ad0
current mode = PIO4

# atacontrol mode ad2
current mode = PIO4

今、ad0がHDD、ad2がCFなので、ad0だけ変更するには、こんな感じです。

# atacontrol mode ad0 UDMA66
current mode = UDMA66

これで、なんとなく体感的にもキビキビ動くようになった感じがします。

UDMA66以外にもいろんなモードを指定できるので、詳しくはman atacontrolで確認を。

atacontrolコマンドのマニュアル