I opened up the Southbridge manual in Acrobat Reader, and began looking for speed and/or timing related PCI registers among the USB function registers. I found 8 suspicious values at 3 offsets total. I had a closer look at them in my IO.
For reading/manipulating the PCI registers I have used John Fine's PCI for years now. You can find it at http://www.execpc.com/~geezer/johnfine/.
A short command pci r,7,2,?100 gives the screen printout of all the interesting information in the USB-related PCI registers. So I was looking at the content of my USB register space - Bus:0, Device:7, Function:2 - when I noticed something very strange: offset D is called "Timer Value" in the VIA manual, and the manual gives a default value of "16" for it. Yet in my machine it said "20". Now, it is a nice 50% different in timing value!!! - The values are in hex 8-) -. I mean, it became clear immediately. This value is the value!
Back to square one. I disabled fixusb - sorry, Programmer ;) -, went back to 110MHz FSB, and restarted the machine. And began playing with the timer value.
The test set was 150MB. As I anticipated, the optimal timer value seems to be different in the case of different PCI bus speeds. So, I'll show you what I have tried so far, and we'll talk about the rest later:
110MHz FSB, 36,7MHz PCI speed:
- transmission error-free with timer values: 16,12,f,c
- transmission contained 1 error with timer value "8", many errors with "20"
75 MHz FSB, 25MHz PCI speed:
- transmission error-free with timer value "8"
- transmission contained errors with timer values: 20,16,12,c
A few notes to add: it is interesting that there seems to exist a sweet spot for the timer value, which is somewhat different at different PCI speeds. The higher the PCI speed the higher the optimal value will be. I tried to establish a global value, which would work at any PCI speed - this is why I tested the two extremes of PCI speed -, but it seems that there is no such value. In any case, the further away I went from the sweet spot, the higher the number of errors was.
Now where is this sweet spot??
Well. At 25MHz it seems to be 8, or even lower. I haven't examined it really thoroughly, but who on Earth would be interested in such a horrible underclocking of the machine anyway?
As for 36.7MHz (110MHz FSB) it is around 10 (hex, as always!!!). I set it at 10 on my IO, and have burnt 2 CDs WITHOUT ERRORS since then. That is almost 1.5GB of data transmitted through my USB port without hiccup. It sure sounds good, doesn't it? ;)))
So this is where I am now. My USB seems to be working flawlessly at last, and I am very happy to say this. My temporary solution is a bat file loading pci.exe to rewrite the timer value. I load it at Windows startup, from "RunServices". The reason for loading it from Windows is when the USB driver loads in Windows, it resets - most probably - the USB circuit and the timer value will acquire that stupid "20" hex value, with all its consequences. So I load the pci command after the USB drivers are loaded. Works like a charm!
Just to let you experiment with it: the command to read the timer value out:
pci rd,7,2,? Value will be given at the end of line.
Rewriting the timer value to "10":
This should be enough for today. It is getting very late, so I will have to leave you with my thoughts.
But I would really appreciate some help in testing the fine details of all this, and it would be nice to know how that value "20" gets into that register. It may be a USB driver fault. (Read: correctable....)
Finally, thank you for your patience, and I hope to be able to read a few success stories about your - hopefully now - working USB ports.
Happy hacking, Everyone!