@John_Brochue - I sent you an email last night with a little more information from further testing I did. This time I printed out the contents of the data buffers for the three transmit descriptors before & after sending the response, and during the long delays. The bytes in these buffers can be matched with the bytes of the frames captured in Wireshark.
The LPC1788 can trigger an interrupt when the buffer underrun occurs. I think the IntEnable register is already set to do this. Maybe you can run repeated queries like I have been doing, and debug the device driver when the interrupt is triggered?
There are three reasons the LPC1788 would report an underrun (listed below). I don’t think it is #1, because it looks like the frames are being sent all as a single fragment, and there is no “NoDescriptor” error being shown. You may be able to see whether it is a fatal or non-fatal error, which would tell us if it is #2 or #3. Does the driver have to soft reset the Ethernet hardware by setting the TxReset bit in the command register? It seems most likely to me that it is #2, because the frame is simply re-sent.
Three causes of an underrun are:
(1) The next fragment in a multi-fragment transmission is not available. This is a nonfatal
error. A NoDescriptor status will be returned on the previous fragment and the TxError
bit in IntStatus will be set.
(2) The transmission fragment data is not available when the Ethernet block has already
started sending the frame. This is a nonfatal error. An Underrun status will be returned
on transfer and the TxError bit in IntStatus will be set.
(3) The flow of transmission statuses stalls and a new status has to be written while a
previous status still waits to be transferred across the memory interface. This is a fatal
error which can only be resolved by a soft reset of the hardware.
The first and second situations are nonfatal and the device driver has to re-send the frame
or have upper software layers re-send the frame. In the third case the hardware is in an
undefined state and needs to be soft reset by setting the TxReset bit in the Command
register.