ok, high water mark implemented (I think). It's much slower now - a more realistic speed. Not fast, but then I've not written it to be fast (yet) - only to work which, given the lack of any documentation, is a small miracle

Peak speed seems to be with 8 byte packets, which cause no stalling to occur. This yields about 600Kbytes per second. Less than that and the packets get too small to be efficient and the overheads are too great - it slows down. Larger than that and stalling starts to occur as the code can't read the buffer fast enough, and the speed drops.

So at the moment with inefficient code (copying data manually between FIFO and buffer, then between buffer and circular buffer), and reading with readBytes() it's on a par with a Teensy using read(). 6x faster than a Due, though, and a little faster than an MX using read().