Alter.Org.UA
 << Back Home EN en   Donate Donate

Распространенные отклонения от ATA стандарта и просто баги

Ниже приведен перечень встретившихся во время разработки UniATA отклонений от стандарта и попросту багов. Некоторые из них являются достаточно распространенными среди ряда моделей контроллеров и ATA/ATAPI устройств различых производителей.

ATA/ATAPI device

Некоторые устройства при использовании команд IDENTIFY требуют чтобы счетчик слов был установлен в 0, а другие - 0x200.
Некоторые устройства при использовании команд IDENTIFY после первой поптки возвращают ошибку, а после второй отрабатывают запрос как положено.

HDD

некоторые винты объемом более 32Гб (в частности мой Seagate Barracuda ATA 4, ST340016A, 40Гб) by default занижают свой размер до 32Гб вне зависимости от положения перемычки. Это требует использования специальных команд для правильного определения размера (см. спецификации, keyword="READ/SET NATIVE MAX LBA")


с появлением LBA48 аналогичная проблема возникла на границе 128Гб. Для получения настоящего размера требуется использование "READ/SET NATIVE MAX LBA 48")


некоторые винты объемом менее 128Гб (в частности мой WDC WD800JB-00ETA0, 80Гб) утверждают, что поддерживают LBA48-адресацию. А при использовании READ NATIVE MAX LBA 48 старшие 24 бита возвращаются равными младшим 24 битам. Никаких признаков ошибки исполнения команды при этом не наблюдается.


если SataCapabilities (76й WORD в конфигурационном блоке) равно 0xffff, это говорит о том, что SATA либо не поддерживается, либо это устройство, подключеное через IDE-SATA переходник. В этом случае можно полагать, что UDMA5 (UDMA-100) - предел скорости.


некоторые винты поддерживающие LBA48-адресацию при записи и последующем чтении 1 байта в/из регистра по-разному работают с регистрами-защелками. Причем разница проявляется между разными регистрами одого винта. Например, после записи 0x55 в Feature оттада прочитается не 0x55, а предыдущее значение. А вот с BlockNumber всегда прочитается 0x55. На таких тестовых обращениях построена быстрая проверка наличия устройства. А из-за описаной особенности мой вариант (с Feature) оказался неудачным. Поэтому для проверки используется регистр BlockNumber.

ATAPI device

На некоторых ATAPI устройствах после получения ошибки необходимо дождаться установки бита DRQ в регистре статуса. На других же это делать просто вредно, т.к. все равно не дождемся. Некоторые ATAPI устройства генерируют прерывание, сигнализирующее о завершении операции существено раньше, чем снимают бит BUSY в регистре статуса. Некоторые ATAPI устройства в PIO режиме генерируют прерывание, сигнализирующее о завершении операции раньше, чем снимают бит BUSY в регистре статуса. В то же время, при исполнении этих же команд в DMA режиме при BUSY снимается вместе с генерацией прерывания. Некоторые ATAPI устройства при работе в DMA режиме для некоторых команд, не требующих передачи данных генерируют прерывание, сигнализирующее о завершении операции существено раньше, чем снимают бит BUSY в регистре статуса. В то же время, если для исполнения таких команд перевести устройство и контроллер в PIO режим, время снятия BUSY уменьшается до разумных пределов (хотя мне все равно не понятно, зачем его вообще держать после прерывания). Список паталогических команд зависит от модели устройства.

ATAPI device + ATA controller

На некоторых новых ATAPI устройствах после сброса контроллера ( запись IDE_DC_RESET_CONTROLLER в AlternateStatus, пауза, запись IDE_DC_REENABLE_CONTROLLER в AlternateStatus) происходит непрерывная генерация прерываний. Проявляется как минимум на контроллере CMD-649, Intel ICHxxx и еще одном, название которого я не смог отыскать у себя в записях. Кстати, именно из-за этого MS'овские драйвера контроллеров CMD от WIndows XP вешаются при подключении таких CD/DVD приводов. Как показали дальнейшие исследования, эти прерывания проходят по линии DMA и должны сбрасываться не только вычитыванием основного статусного регистра IDE, но и записью BM_STATUS_INTR в регистр статуса DMA.

ATA controler

nForce конроллеры могут повисать если на канале есть только одно устройство и после инициализации перед разрешением прерываний оно не было установлено активным.
Некоторые контроллеры при выборе несуществующего устройства и последующем чтении статуса возвращают 0xff вместо 0.


Писать сюда: FB or mail alterX@alter.org.ua (remove X)   Share
<< Back Автор: Alter (Александр А. Телятников) Сервер: Apache+PHP под FBSD © 2002-2024