Цитата Сообщение от b2m Посмотреть сообщение
Могу предложить новый метод отладки всего этого хозяйства.
Я скрестил исходники telnet+uIP с моими исходниками эмуляции rtl8019as. И отлаживал уже в IDE.

Как и следовало ожидать, ничего не заработало. Кроме того, грузит процессор чуть ли не на 100%, но это, в принципе, понятно. Стал копать, выяснил, что в определённый момент отправка/приём деактивируется и больше не активируется. И момент этот - в самом конце приёма пакета. Если, однако, после приёма происходит отправка, то отправка/приём снова реанимируется. Получается, если приняли пакет, и ничего не отправили, то вилы.

А получается это, потому-что включение страницы регистров ты сделал так:
Код:
#define ETHERDEV_REG_PAGE(page) ETHERDEV_REG_WRITE(CR,(page << 6)|RD2|STP)
А в оригинале было так:
Код:
#define ETHERDEV_SELECT_REG_PAGE(page)                                      \
          do                                                                \
          {                                                                 \
              etherdev_reg_write(CR, etherdev_reg_read(CR) & ~(PS1 | PS0)); \
              etherdev_reg_write(CR, etherdev_reg_read(CR) | (page << 6));  \
          } while(0)
Поэтому, после того, как я сделал:
Код:
#define ETHERDEV_REG_PAGE(page) ETHERDEV_REG_WRITE(CR,(page << 6) | (ETHERDEV_REG_READ(CR) & 0x3F))
всё заработало и у меня.
Я, помнится, долго думал над глубоким смыслом этих строк в исходнике, и поскольку такое задание регистров не следует из спецификаци, и более того - далеко не во всех драйверах используется, то "выкинул лишнее".

Ладно, добавим.