--- the forwarded message follows ---
Miles, I discovered that really all you need for this is a few simple facts. Here then is an unofficial workaround for Errata #4 on the AMD-756 Rev D2 peripheral bus controller. This errata pertains *only* to Rev D2 of the AMD-756 peripheral bus controller. The errata was corrected on later revisions. To uniquely identify the AMD 756 Rev D2, refer to the "AMD-756 Peripheral Bus Controller Revision Guide", in the section on "PCI Revision Documentation", pg 6 (www.amd.com/products/cpg/athlon/techdocs/pdf/22591.pdf) In a couple of days, the official workaround and sample code will be posted on AMD's website, www.amd.com. I will mail you a pointer when it gets there. But, I realize that the Linux folks have been asking for this info for a while, so here is an informal, unofficial preview of a workaround for the errata on Rev D2. Whenever a USB device is initialized, it should be detected by the AMD-756-Rev-D2 USB host controller. However, on occasion, the USB controller does not enumerate slow-speed devices. When the AMD-756-Rev-D2 peripheral bus controller is performing USB-initiated PCI master cycles and a USB device is initialized, it may not be detected correctly. During this time, the following registers may contain incorrect status in the USB operation mode -- HcRhDescriptorA1 (offset 48h) , HcRhDescriptorA2 (offset 4Ah), and HcRhPortStatus[1:4] (offset 54h to 63h). This behavior only exists for low-speed devices. This behavior is seen when slow-speed devices are occasionally not detected at boot time or when hot-plugged. A suggested workaround when reading any of these registers is to perform the read in a loop until the returned value for most of the reserved bits of that register are read as zero. Thus, for each iteration, the value read is logically-anded to a mask (to keep just the value of the reserved bits) and compared with zero. A loop count of 10 can be used for timeout. These registers usually return the correct status in 5 or 6 reads. Here are the masks to use for each of these registers: HcRhDescriptorA1: E000h HcRhDescriptorA2: FC0Fh HcRhPortStatus[n]: FFE0FCE0h This method must be implemented for all four USB ports supported by the AMD-756 peripheral bus controller. Lastly, you should consider the following issues for proper USB initialization on the AMD-756 peripheral bus controller Rev D2. + The NoPowerSwitching bit should be set in HcRhDescriptorA to indicate that the USB ports are always powered on for AMD-756 USB controller. + When the SMI is enabled for USB legacy support, the SMI_EN bit (PM2C[0]) is the only bit that needs to be enabled for the USB SMI generation. The interrupt status has to be evaluated from the USB controller, not from the PMIO space. The USBSMI_EN bit (PM2A[4]) should not be enabled for the USB legacy support. - Rich Brunner @ AMD