dde_ipxe: poll once again on irq without rx packets

This quirk is required for Realtek devices.

Fixes #3939
This commit is contained in:
Alexander Boettcher 2021-02-04 18:08:45 +01:00 committed by Norman Feske
parent 210f5073e3
commit 8958c769ab

View File

@ -185,16 +185,22 @@ static void irq_handler(void *p)
/* check for the link-state to change on each interrupt */
int link_ok = netdev_link_ok(net_dev);
/* poll the device for packets and also link-state changes */
netdev_poll(net_dev);
/* retry the reading of rx data one time (issue #3939) */
int processed_rx_data = 0;
for (unsigned retry = 0; (retry < 2) && !processed_rx_data; retry++) {
/* poll the device for packets and also link-state changes */
netdev_poll(net_dev);
struct io_buffer *iobuf;
while ((iobuf = netdev_rx_dequeue(net_dev))) {
dde_lock_leave();
if (rx_callback)
rx_callback(1, iobuf->data, iob_len(iobuf));
dde_lock_enter();
free_iob(iobuf);
struct io_buffer *iobuf;
while ((iobuf = netdev_rx_dequeue(net_dev))) {
dde_lock_leave();
if (rx_callback) {
rx_callback(1, iobuf->data, iob_len(iobuf));
processed_rx_data = 1;
}
dde_lock_enter();
free_iob(iobuf);
}
}
dde_lock_leave();