I found a similar problem while working with USB communication from a Linux machine to my Nexus 5. I found out that a bulk transfer from the Linux machine to my Nexus would only work if I used a buffer of 16KB to read on the Java side. Then I found this:
When you ask libusb to submit a bulk transfer larger than 16kb in size, libusb breaks it up into a number of smaller subtransfers. This is because the usbfs kernel interface only accepts transfers of up to 16kb in size. The subtransfers are submitted all at once so that the kernel can queue them at the hardware level, therefore maximizing bus throughput.
On legacy platforms, this caused problems when transfers completed early. Upon this event, the kernel would terminate all further packets in that subtransfer (but not any following ones). libusb would note this event and immediately cancel any following subtransfers that had been queued, but often libusb was not fast enough, and the following subtransfers had started before libusb got around to cancelling them.
Supposedly, this is fixed with recent Linux kernel and libusb releases.
Link (libusb caveats): http://www.cs.unm.edu/~hjelmn/libusb_hotplug_api/caveats.html