ZBOX nano VD01のHDDが遅い (4)
2012/03/10(土) 22:09 NetBSD はてブ情報 はてブに登録 はてブ数

さらにtsutsuiさんからdmesgのwd0が表示する内容でUDMAに関する表示が出ているはずなので確認してみてはどうか、というアドバイスを頂いたので早速確認。

まずは、UDMA 0 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 0) です。
wd0 at atabus0 drive 0
wd0: <WDC WD1600BEVT-24A23T0>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)
次はUDMA 6 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 6) の場合です。
wd0 at atabus0 drive 0
wd0: <WDC WD1600BEVT-24A23T0>
wd0: drive supports 16-sector PIO transfers, LBA48 addressing
wd0: 149 GB, 310101 cyl, 16 head, 63 sec, 512 bytes/sect x 312581808 sectors
wd0: 32-bit data port
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 6 (Ultra/133)
wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA)
ほとんど同じですが、最後の行が違いますね。比べてみましょう。
UDMAメッセージ
0wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA)
6wd0(viaide0:0:0): using PIO mode 4, Ultra-DMA mode 6 (Ultra/133) (using DMA)
なるほど。たしかに、変わっていますね。

これで/sys/dev/pci/viaide.c#604
    602 	sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
    603 	sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
    604 	sc->sc_wdcdev.sc_atac.atac_set_modes = via_setup_channel;
    605 	sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
    606 	sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS;
から/sys/dev/pci/viaide.c#via_setup_channelが呼ばれ、759行目でUDMA 6としての設定をレジスタにセットしているようですね。
    753 			case PCI_VENDOR_VIATECH:
    754 				if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 6) {
    755 					/* 8233a */
    756 					udmatim_reg |= APO_UDMA_TIME(
    757 					    chp->ch_channel,
    758 					    drive,
    759 					    via_udma133_tim[drvp->UDMA_mode]);
    760 				} else if (sc->sc_wdcdev.sc_atac.atac_udma_cap == 5) {
via_udma133_timって何かと見てみると/sys/dev/pci/pciide_apollo_reg.h#149に次のように書かれています。
    149 static const int8_t via_udma133_tim[] __unused =
    150     {0x07, 0x07, 0x06, 0x04, 0x02, 0x01, 0x00};
先のdmesgのとおりdrvp->UDMA_modeは6ですから、えーと、0x00が設定されるってことですね。

うーん、この辺までくると、さっぱり中身がわからなくなってきしたが、何となくUDMAが6での転送に失敗したらUDMA 5に落とされて0x01が使われて... といったfall backに使われるんでしょうかねぇ。

ということで、ドライバとしてもUDMAのモードを意識した実装だということがわかった (ような気がする) ので、すっきりしました。

話は変わりますが、http://nxr.netbsd.orgってほんと便利ですよね。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0780/tb/