The code from NetBSD 1.5.3:
NCRDMA_SETUP(sc, &sc->sc_cmdp, &sc->sc_cmdlen, 0, &dmasize);
//...
NCRCMD(sc, NCRCMD_SELATN | NCRCMD_DMA);
NCRDMA_GO(sc);
The code from NetBSD 1.6-3.1:
NCRCMD(sc, NCRCMD_SELATN | NCRCMD_DMA);
NCRDMA_SETUP(sc, &sc->sc_cmdp, &sc->sc_cmdlen, 0, &dmasize);
NCRDMA_GO(sc);
The code from NetBSD 4:
NCRDMA_SETUP(sc, &sc->sc_cmdp, &sc->sc_cmdlen, 0, &dmasize);
//...
NCRCMD(sc, NCRCMD_SELATN | NCRCMD_DMA);
NCRDMA_GO(sc);
See the difference? In the versions 1.6-3.1 the command is executed before the DMA is set up, so the SCSI controller may not get the command using DMA.
And then I googled for the expected bug reports and found none. Why could it work on the real hardware?
2 comments:
может быть, стоит написать в рассылку netbsd tech-kern?
случай действительно интересный...
Уже писал в список рассылки NetBSD (без реакции), но и проблему уже сам расковырял.
Это не баг в NetBSD. В документации на контроллер скази сказано не очень чётко, в каком порядке надо программировать dma и esp. Разработчики qemu решили, что dma сконфиругировано, но пересылка в обе стороны выполняется контроллером esp.
В результате имеем практически полностью неправильную реализацию select with(out) attention. Дело усложняется тем, что контроллер esp используется при эмуляции mips и ppc, и в каждом из случаев дма предположительно по разному работает (во всяком случае, по разному реализовано в qemu).
В результате мы с маитенером так и не пришли к общему мнению, как исправлять.
Пока что отложил до лучших времён - если возникнет проблема в какой-то из нужных мне ос - вернусь к этому багу.
Post a Comment