Новость, проблема решена, смотреть патч kern/103602: [atapicam] atapi device not working on JMicron 363 Controller
Более правильно, проблема выглядит так, для ряда чипсетов, разрешение DMA для всех команд, приводит к некорректной работе контроллера и подключенных к нему устройств, поэтому более правильно разрешить DMA только для команд READ и WRITE. Что и сделано в верхнем патче.
Патч внесен в FreeBSD 6.2-Stable и 7-Current, теперь CD/DVD устройства нормально работают в DMA режимах и не требуют перевода в PIO4 как предложено во временном решении ниже.
С выходом ряда современных материнских карт на базе Intel 965 чипсетов или материнских карт с основным SATA контроллером и дополнительным урезанным PATA контроллером, обнаруженны следующие факты:
Для большинства подобных материнок, данная проблема решается изменением режима работы ATA драйвера FreeBSD с CD/DVD, переводом из UDMA33 режима в PIO4.
Речь не идет о неправильности подключения, подразумевается что используется проверенный 80pin шлейф для подключения UDMA устройств и само подключение CD/DVD правильное.
К сожалению из-за нехватки железа - CD/DVD разных моделей и производителей, не удалось написать send-pr в FreeBSD, но подмечен интересный факт, данное поведение наиболее характерно для CD/DVD фирмы Nec.
На самом сайте Nec, после долгих поисков, удалось вычитать интересную вещь - для работы CD/DVD приводов в UDMA режиме, Nec строго рекомендует подключать эти устройства на второй контроллер.
И что делать при наличии урезанного PATA только с одним контроллером?
Последние сведения: Проблема с таймаутами замечена когда на подобных материнских картах, в качестве PATA контроллера выступает урезанный контроллер JMicron 363. В целом это SATA300+RAID + урезанный PATA.
Для ряда материнок есть свежие версии BIOS, где якобы решается эта проблема. Итак, что и как сделать, в случае установки:
loader> set hw.ata.atapi_dma=0 loader> boot
# echo "hw.ata.atapi_dma=0" >> /boot/loader.confА для того чтобы использовать ATAPICAM интерфейс для работы с CD/DVD через эмуляцию SCSI интерфейса, необходимо собрать ядро со следующими строками:
device ata device atapicam device scbus device cd device passТеперь мы легко можем использовать утилиты из портов:
Пример некоторых полезных команд для получения информации:
[test-2]~ > uname -rs FreeBSD 6.2-RELEASE [test-2]~ > [test-2]~ > grep "^atapci" /var/run/dmesg.boot atapci0: <JMicron JMB363 SATA300 controller> port 0x7000-0x7007,0x7400-0x7403,0x7800-0x7807,0x7c00-0x7c03,0x8000-0x800f mem 0xf8000000-0xf8001fff irq 19 at device 0.0 on pci3 atapci0: AHCI Version 01.00 controller with 2 ports detected atapci1: <Intel ICH8 SATA300 controller> port 0xb400-0xb407,0xb800-0xb803,0xbc00-0xbc07,0xc000-0xc003,0xc400-0xc40f,0xc800-0xc80f irq 19 at device 31.2 on pci0 atapci2:port 0xd000-0xd007,0xd400-0xd403,0xd800-0xd807,0xdc00-0xdc03,0xe000-0xe00f,0xe400-0xe40f irq 19 at device 31.5 on pci0 [test-2]~ > atacontrol list ATA channel 0: Master: no device present Slave: no device present ATA channel 1: Master: no device present Slave: no device present ATA channel 2: Master: ad4 Serial ATA II Slave: no device present ATA channel 3: Master: ad6 Serial ATA II Slave: no device present ATA channel 4: Master: acd0 ATA/ATAPI revision 0 Slave: no device present ATA channel 5: Master: ad10 Serial ATA II Slave: no device present ATA channel 6: Master: no device present Slave: no device present ATA channel 7: Master: no device present Slave: no device present ATA channel 8: Master: no device present Slave: no device present [test-2]~ > [test-2]~ > atacontrol mode acd0 current mode = PIO4 [test-2]~ > [test-2]~ > camcontrol devlist <_NEC DVD_RW ND-4551A 1-07> at scbus4 target 0 lun 0 (cd0,pass0) [test-2]~ > [test-2]~ > cdrecord -scanbus Cdrecord-Clone 2.01 (i386-unknown-freebsd6.2) Copyright (C) 1995-2004 JЖrg Schilling Using libscg version 'schily-0.8'. scsibus4: 4,0,0 400) '_NEC ' 'DVD_RW ND-4551A ' '1-07' Removable CD-ROM 4,1,0 401) * 4,2,0 402) * 4,3,0 403) * 4,4,0 404) * 4,5,0 405) * 4,6,0 406) * 4,7,0 407) * [test-2]~ >
команды для справки: ata(4), atacontrol(1), loader(8), loader.conf(5)