Low umass performance with USB 2.0 ports
Scott Long
scottl at samsco.org
Wed Aug 31 19:47:29 GMT 2005
Scott Long wrote:
> Ian Dowse wrote:
>
>> In message <20050830125031.GA775 at rea.mbslab.kiae.ru>, "Eygene A.
>> Ryabinkin" wri
>> tes:
>>
>>>> What is filesystem has your USB drive?
>>>
>>>
>>> The one I was extensively testing has FAT, but I've checked the UFS2 --
>>> just a bit better -- 1.8 Mb/second. But you're right -- no wdrains at
>>> all.
>>>
>>>> FreeBSD 4.x had very low performance with FAT filesystem,
>>>> writing process spent lots of time in the wdrain state too.
>>>
>>>
>>> Yes, it has. But here the same flash drive gives different results for
>>> ehci and uhci devices, and the total speed of echi is lower due to
>>> wdrains:
>>> 300 Kb/sec versus 500 Kb/sec. And I sometimes write my data to the
>>> Windows
>>> partition with FAT to my home HDD -- it has no wdrains. At least,
>>> I've not
>>> noticed them. For flash I can.
>>
>>
>>
>> The patch in from the email below may help with the wdrain state -
>> can you see if it makes any difference?
>
>
> Is the problem that the interrupt gets fired but not all of the status
> information has made it's way back to host memory when the driver gets
> there? Would it make a difference to instead read back the EHCI_USBSTS
> register after writing to it in ehci_intr1? That way all transactions
> down to the controller would be guaranteed to be flushed before you
> continue on. I wonder if this is a remnant of the famous problems with
> VIA chipsets doing bad things under medium-to-high PCI contention. I
> don't see any obvious workarounds for this in the Linux EHCI code, so
> I wonder if it's a case of them not encountering it, or doing something
> different that avoids the problem.
>
> Scott
Actually, I just peeked inside the Linux EHCI code and it does a dummy
read immediately after writing to the status register:
/* clear (just) interrupts */
writel (status, &ehci->regs->status);
readl (&ehci->regs->command); /* unblock posted write */
I wonder if that's the whole trick here. Would someone be willing to
try the attached patch instead of the one that Ian posted?
Scott
-------------- next part --------------
Index: ehci.c
===================================================================
RCS file: /usr/ncvs/src/sys/dev/usb/ehci.c,v
retrieving revision 1.36
diff -u -r1.36 ehci.c
--- ehci.c 29 May 2005 04:42:27 -0000 1.36
+++ ehci.c 31 Aug 2005 19:44:14 -0000
@@ -578,6 +578,7 @@
return (0);
EOWRITE4(sc, EHCI_USBSTS, intrs); /* Acknowledge */
+ EOREAD4(sc, EHCI_USBCMD); /* Flush posted writes on PCI */
sc->sc_bus.intr_context++;
sc->sc_bus.no_intrs++;
if (eintrs & EHCI_STS_IAA) {
More information about the freebsd-usb
mailing list