Новость, проблема решена, смотреть патч 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, где якобы решается эта проблема. Итак, что и как сделать, в случае установки:

по-умолчанию, ATA драйвер работает с дисками и cd/dvd в UDMA режиме: мы же перевели работу с устройствами CD/DVD в PIO4-mode Теперь необходимо сделать чтобы автоматически при каждой загрузке, CD/DVD работал в PIO-режиме, для этого записываем строку в файл /boot/loader.conf:
# 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)


Copyleft Andrey Lavrentyev