Ненуачо, вполне годно.
Только надо добавить ioctl c переключателем блокирующий/неблокирующий режим (собственно, и все настроечные функции wifi_* туда же в некий case{IOCTL_FUNC}).
Тогда станет так:
int16_t recv(int8_t sockfd, void *buf, int16_t len, int8_t flags); /*Читает данные из сокета.*/
Возвращает: количество считанных байт (>0) или код ошибки (<0, в т.ч. код для "соединение закрыто")
либо возвращает 0, если данных нет (неблокирующий режим) либо управление не возвращается пока не появятся данные (блокирующий режим)
Слушающие сокеты тоже хотелось бы, нам же серверные вещи тоже понадобятся, тот же telnet к консоли z80.
И не вижу ничего плохого в поллинге. На единичном опросе статуса устройства из регистра он даже быстрее работает, чем обработка единичного прерывания от устройства по смене того же статуса (меньше команд на прочитать флаг наличия данных). Один хрен например в Юзиксе по таймеру уже много чего опрашивается, добавим туда еще и вызов esp_poll(). Я вот думаю в своем клоне CP/M отказаться от RS-232 по INT, оставить только по poll (сейчас там оба, для INT нужен кольцевой буфер, обработку переполнения и т.п. при этом скорость получается меньше при прочих равных).
- - - Добавлено - - -
А ограничение в 4 сокета оно реально hardcoded или когда-нить в будущем можно будет его преодолеть?
- - - Добавлено - - -
Кстати, в исходном UZIX для TCPIP применялся RS-232-модем по SLIP или PPP. Просто вспомнилось. Жаль, что потеряны все исходники, относившиеся к TCPIP UZIX.