В очередной раз вожусь с картой CF, на которую ставлю минимальную систему 3.1. В качестве теста запаковываю и проверяю большой архив на RAM:.
Стабильно и регулярно при проверке получаю CRC ошибки на файлах больше ~100K. Снова полез читать про MaxTransfer и нашел исчерпывающее обсуждение этого параметра и волшебного значения 0x1fe00. Сообщение №25 тут: http://eab.abime.net/showpost.php?p=759918&postcount=25 (Tony Wilen, автор эмулятора WinUAE).
Примерный перевод:
"Когда IDE драйвер в AmigaOS обрабатывает пересылку размером больше 256 блоков, та разбивается на две или более части (потому что максимальный размер передачи для ATA равен 256 блокам). После завершения передачи первой части драйвер читает регистры CHS/LBA, добавляет единицу к адресу и затем записывает обратно как начальный адрес следующей части. (Согласно спецификации ATA в этих регистрах содержится адрес последней операции записи/чтения). Все бы хорошо, но:
Стандарт ATA-1 говорит: по завершении команды, Command Block Registers содержат цилиндр, головку и номер последнего прочитанного сектора.
Стандарт ATA-2 говорит: содержимое регистров должно отражать media address of the error в случае, если команда доступа к носителю завершилась неудачно.
Примечание 9: до принятия данного стандарта, регистры обновлялись в конце каждой команды для отражения текущего адреса доступа к носителю.
Другими словами, устройство стандарта ATA-2 или выше обновляет CHS/LBA адрес только в случае ошибки, но не в случае успешного завершения операции. Это ломает логику работы ATA драйвера в AmigaOS, начальный адрес второй части пересылки становится неверным (подозреваю, что драйвер оставляет старые значения без изменений, вторая часть пересылки затирает начало первой части, что, кстати, объясняет, почему никогда не возникало жалоб на порчу файловой системы, только на порчу данных)."
Сухой остаток: поставил себе волшебное значение 0x1fe00, дуло исчезло (ошибок нет).