On Friday 04 February 2005 9:35 pm, Robert Hancock wrote:
> I've got an Asus A8N-SLI Deluxe motherboard (NVIDIA nForce4 chipset)
> running Fedora Core 3 x86_64. Using the 2.6.9 kernel, the USB 2.0
> devices I have (USB flash card reader and USB pen drive) are detected
> and work fine at USB 2.0 speed. However, in 2.6.10, any USB 2.0 devices
> are not detected at all. If I then rmmod ehci-hcd, they are detected but
> of course only work at USB 1.1 speeds.
>
> Is this something new, or a known problem?
New, and it looks to be an NF4 chipset level issue. You might ask ASUS
what's up with it; that's a new board (got an extra one for me? :), and
this could be something that's fixable with a BIOS update. They'll have
more access to the NVidia errata than either of us, regardless!
> ehci_hcd: block sizes: qh 160 qtd 96 itd 192 sitd 96
> ACPI: PCI Interrupt Link [APCL] enabled at IRQ 20
> ACPI: PCI interrupt 0000:00:02.1[B] -> GSI 20 (level, low) -> IRQ 209
> ehci_hcd 0000:00:02.1: EHCI Host Controller
> ehci_hcd 0000:00:02.1: reset hcs_params 0x10148a dbg=1 cc=1 pcc=4 !ppc
> ports=10
> ehci_hcd 0000:00:02.1: reset portroute 0 0 0 0 0 0 0 0 0 0
OK that's the problem.
This should either be cc=3 (with EHCI at 02:3 and two more OHCIs)
or pcc=10 (or maybe cc=2 pcc=5, etc) ... and in your case it looks
like the issue is that pcc=4 is wrong. NF2 and NF3 were cc=2 pcc=3,
so I'm not sure how NVidia created that particular bug.
> ...
> usb usb1: Product: EHCI Host Controller
> usb usb1: Manufacturer: Linux 2.6.10-1.760_FC3custom ehci_hcd
> usb usb1: SerialNumber: 0000:00:02.1
> usb usb1: hotplug
> usb usb1: adding 1-0:1.0 (config #1, interface 0)
> usb 1-0:1.0: hotplug
> hub 1-0:1.0: usb_probe_interface
> hub 1-0:1.0: usb_probe_interface - got id
> hub 1-0:1.0: USB hub found
> hub 1-0:1.0: 4 ports detected
This is the behavior that changed. As a workaround for a
different chip, 2.6.10 does the math: CC * PCC < PORTS
indicates the controller is confused.
For that chip (a GeneSys GL880S), CC and PCC are right,
so the workaround adjusts PORTS. But for your NF4, it's
a different bitfield that's wrong, and that workaround
is counterproductive.
This patch should resolve the issue for you.
- Dave
Turns out that a workaround for a different EHCI chip trips up at
least one NForce4 board. Neither controller can multiply right.
--- 1.115/drivers/usb/host/ehci-hcd.c 2005-01-12 19:31:18 -08:00
+++ edited/drivers/usb/host/ehci-hcd.c 2005-02-05 11:12:57 -08:00
@@ -421,8 +421,29 @@
temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params);
temp &= 0x0f;
if (temp && HCS_N_PORTS(ehci->hcs_params) > temp) {
- temp |= (ehci->hcs_params & ~0xf);
- ehci->hcs_params = temp;
+ ehci_dbg (ehci, "bogus port configuration: "
+ "cc=%d * pcc=%d < ports=%d\n",
+ HCS_N_CC(ehci->hcs_params),
+ HCS_N_PCC(ehci->hcs_params),
+ HCS_N_PORTS(ehci->hcs_params));
+
+#ifdef CONFIG_PCI
+ if (hcd->self.controller->bus == &pci_bus_type) {
+ struct pci_dev *pdev;
+
+ pdev = to_pci_dev(hcd->self.controller);
+ switch (pdev->vendor) {
+ case 0x17a0: /* GENESYS */
+ /* GL880S: should be PORTS=2 */
+ temp |= (ehci->hcs_params & ~0xf);
+ ehci->hcs_params = temp;
+ break;
+ case PCI_VENDOR_ID_NVIDIA:
+ /* NF4: should be PCC=10 */
+ break;
+ }
+ }
+#endif
}
/* force HC to halt state */