[ncm] Use large multi-packet buffers by default
authorMichael Brown <mcb30@ipxe.org>
Fri, 6 Feb 2015 01:29:11 +0000 (01:29 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 6 Feb 2015 09:54:04 +0000 (09:54 +0000)
commit2d3f2b24465cfd270066e60e2daa36aa879ca89b
treedbfdead6233aaf5f42427bc8b476a31d45793f64
parent66048e3214adc8de4fff3beae1aa34facf307611
[ncm] Use large multi-packet buffers by default

Some devices have a very small number of internal buffers, and rely on
being able to pack multiple packets into each buffer.  Using 2048-byte
buffers on such devices produces throughput of around 100Mbps.  Using
a small number of much larger buffers (e.g. 32kB) increases the
throughput to around 780Mbps.  (The full 1Gbps is not reached because
the high RTT induced by the use of multi-packet buffers causes us to
saturate our 256kB TCP window.)

Since allocation of large buffers is very likely to fail, allocate the
buffer set only once when the device is opened and recycle buffers
immediately after use.  Received data is now always copied to
per-packet buffers.

If allocation of large buffers fails, fall back to allocating a larger
number of smaller buffers.  This will give reduced performance, but
the device will at least still be functional.

Share code between the interrupt and bulk IN endpoint handlers, since
the buffer handling is now very similar.

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