The two main drivers are: USB_OHCI_HCD & USB_UHCI_HCD. The USB_EHCI_HCD is a high-speed driver.
I am not sure that the problem the OP is having is a bug, but it does sound like one. The kernel 2.6 USB sub-system is undergoing contant change, so it would be no surprise if ther is some inconsistency. It may just be that the read and write code for the EHCI_HCD driver are not at the same level of development.
I can't say with any authority what is going on there. But, I have a couple of suggestions. First, try using a different version of the kernel, using the sa,e setup and config options, to see if the same thing is happening under other kernel versions. I'd suggest trying both a newer and an older kernel and not using 'rc' versions. For instance, try the 18.104.22.168 and 22.214.171.124. There have been *huge* changes in the kernel since 2.6.24 -each micro-version number patch since then has contained over 100,000 lines.
So, if the all the kernel versions exhibit the same behaviour you can probably assume that this is a 'feature' and not a bug -that someone still hasn't figured out how to get both 'sides' of the driver working equally well. If that is the case, a down-n-dirty solution would be to compile all the drivers as modules and then load the module with the best performance for the operation you want to do.
The EHCI driver overrides the UHCI and OHCI drivers when present, so having everything as a module is the only way to get full control of what is going on. The EHCI driver will try to use the faster USB protocol when possible. But when it is not, it 'emulates' either the UHCI or OHCI driver, whichever is appropriate.
I've just done a quick search with 'clusty.com' for 'EHCI write slow' and found several pages which seem to describe the same problem, along with some possible fixes you might try:
1. Add 'pci=routeirq' to your kernel boot options
2. echo 1024 > /sys/block/sd*/device/max_sectors
3. explicitly set your mount option to async in /etc/fstab
4. Use hdparm/sdparm to change the cach-mode for the drive from "write through" to "write back"
A quote from the kernel-devs mailing list:
> When I use flash drive in sync mode, it writes on it only 64kB/s. When I
> umount it and mount it in not sync mode but do sync manually after it writes
> into memory, kernel writes on flash drive 11 MB/s!!! What is wrong in my
That's expected with sync vfat mount. Use other filesystem or async.
OP, you don't mention what filesystem you are using...
From linux-usb users mailing list:
> I tried suggestions from the FAQ, like switching off "assign IRQ for USB",
> booting with acpi=off, noapic, pci=noacpi, pci=biosirq, in lots of
> different combinations - did not change anything.
This thread on the linux-usb mailing lists seems to come closer to diagnosing the problem(maybe). As I mentioned, the 2.6 USB code undergoes lots of changes, so don't be surprised if this problem was fixed once and then turned up again.
Hope this helps you.