[netdevice] Cancel all pending transmissions on any transmit error
authorMichael Brown <mcb30@ipxe.org>
Tue, 5 Sep 2017 11:21:11 +0000 (12:21 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 5 Sep 2017 11:30:04 +0000 (12:30 +0100)
commit97f0f56a34e32e705d3eee18526222f43fc88e6e
tree4760c8f6b536135bccdfdffb78887d96bc072891
parent3ae70be5bab1f898efcac859b1b8e3418e0f4a4b
[netdevice] Cancel all pending transmissions on any transmit error

Some external code (such as the UEFI UNDI driver for the Realtek USB
NIC on a Microsoft Surface Book) will block during transmission
attempts and can take several seconds to report a transmit error.  If
there is a large queue of pending transmissions, then the accumulated
time from a series of such failures can easily exceed the EFI watchdog
timeout, resulting in what appears to be a system lockup followed by a
reboot.

Work around this problem by immediately cancelling any pending
transmissions as soon as any transmit error occurs.

The only expected transmit error under normal operation is ENOBUFS
arising when the hardware transmit queue is full.  By definition, this
can happen only for drivers that do not utilise deferred
transmissions, and so this new behaviour will not affect these
drivers.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/netdevice.c