LINUX.ORG.RU

История изменений

Исправление I-Love-Microsoft, (текущая версия) :

Добрый вечер! Прошу прощения что кастую, возникла проблема, есть догадки. Сделал чтобы устройство отдавало 256К (=256 * 1024) байт в виде 64К 32-битных слов, каждое слово равно предыдущему значению плюс единица.

Когда драйвер только загружается, то первый блок 64К 32-битных слов может быть поврежден в 33 66 99 или 115-ти позициях, т.е. тупо 66 32-битных слов не являются инкрементом предыдущего. Перед тем как шлю пакет в ПЛИС чтобы оно начало накладывать данные - обнуляю весь буфер нулями, для надежности. Выгружаю и снова загружаю (insmod) - опять первый запрос будет с пробитостями.

Если драйвер уже был загружен перед запуском тестовой программы - все 64К слов всегда правильные (по ОДНОМУ блоку), и сколько бы я не запрашивал - счетчик корректно инкрементируется между этими запросами.

А вот как только тестовая программа запрашивает два блока по 64 DW - чудо: первый блок весь полностью корректен без ошибок, а в последующем может быть 33 66 99 или 115 ошибок, прям магические характерные числа. Может быть одна или несколько последовательных цепочек битых данных в рамках 64К DW.

У меня только догадка: может оно тупо не успевает записать данные? Может после отсылки из ПЛИС последнего TLP-пакета в блоке надо подождать и только после этого выкидывать прерывание? Если да, то сколько надо ждать тактов, должен же быть какой-то признак, независимый от скорости системы? Должно пройти время, пока данные упадут в память и запишутся, после чего их можно читать. Может даже пакеты не успевают долететь с данными.

tailgunner Andrey_Utkin slapin ebantrop

Исходная версия I-Love-Microsoft, :

Добрый вечер! Прошу прощения что кастую, возникла проблема, есть догадки. Сделал чтобы устройство отдавало 256К (=256 * 1024) байт в виде 64К 32-битных слов, каждое слово равно предыдущему значению плюс единица.

Когда драйвер только загружается, то первый блок 64К 32-битных слов может быть поврежден в 33 66 99 или 115-ти позициях, т.е. тупо 66 32-битных слов не являются инкрементом предыдущего. Перед тем как шлю пакет в ПЛИС чтобы оно начало накладывать данные - обнуляю весь буфер нулями, для надежности. Выгружаю и снова загружаю (insmod) - опять первый запрос будет с пробитостями.

Если драйвер уже был загружен перед запуском тестовой программы - все 64К слов всегда правильные (по ОДНОМУ блоку), и сколько бы я не запрашивал - счетчик корректно инкрементируется между этими запросами.

А вот как только тестовая программа запрашивает два блока по 64 DW - чудо: первый блок весь полностью корректен без ошибок, а в последующем может быть 33 66 99 или 115 ошибок, прям магические характерные числа. Может быть одна или несколько последовательных цепочек битых данных в рамках 64К DW.

У меня только догадка: может оно тупо не успевает записать данные? Может после отсылки последнего пакета в блоке надо подождать и только после этого выкидывать прерывание? Если да, то сколько надо ждать тактов, должен же быть какой-то признак, независимый от скорости системы?

tailgunner Andrey_Utkin slapin ebantrop