ZBOX nano VD01のHDDが遅い (4)
さらにtsutsuiさんからdmesgのwd0が表示する内容でUDMAに関する表示が出ているはずなので確認してみてはどうか、というアドバイスを頂いたので早速確認。
まずは、UDMA 0 (sc->sc_wdcdev.sc_atac.atac_udma_cap = 0) です。
なるほど。たしかに、変わっていますね。
これで/sys/dev/pci/viaide.c#604
うーん、この辺までくると、さっぱり中身がわからなくなってきしたが、何となくUDMAが6での転送に失敗したらUDMA 5に落とされて0x01が使われて... といったfall backに使われるんでしょうかねぇ。
ということで、ドライバとしてもUDMAのモードを意識した実装だということがわかった (ような気がする) ので、すっきりしました。
話は変わりますが、http://nxr.netbsd.orgってほんと便利ですよね。
まずは、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 | メッセージ |
---|---|
0 | wd0(viaide0:0:0): using PIO mode 4, DMA mode 2 (using DMA) |
6 | wd0(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ってほんと便利ですよね。
コメント(0件)
- TB-URL http://www.tokuda.net/diary/adiary.cgi/0780/tb/