sb600/sb700 ohci experimental patch

From: Andriy Gapon <avg_at_icyb.net.ua>
Date: Wed, 23 Sep 2009 17:54:41 +0300
If you have a system with SB600, SB700, etc chipset and you have problems with low
speed USB devices attached during boot (keyboard, mouse), could you please try the
following experimental patch and report back?
I am primarily interested in the first several lines produced during boot with
printfs that are introduced by the patch. Preferably in the context of surrounding
USB-related dmesg messages. No need to report subsequent same-looking
ever-repeating messages (if any).

WARNING: this is an experimental patch, it is probably not even close to what a
real fix could be, it might not fix the problem (but perhaps it would), it might
introduce instabilities into OHCI driver and it is noisy (unconditional printf).
The primary purpose of this patch is to gather information necessary for a real fix.

Thank you!

diff --git a/sys/dev/usb/controller/ohci.c b/sys/dev/usb/controller/ohci.c
index 30592c1..fb6ba34 100644
--- a/sys/dev/usb/controller/ohci.c
+++ b/sys/dev/usb/controller/ohci.c
_at__at_ -247,8 +249,8 _at__at_ reset:
 	OWRITE4(sc, OHCI_INTERRUPT_ENABLE, sc->sc_eintrs | OHCI_MIE);
 	/* switch on desired functional features */
 	ctl = OREAD4(sc, OHCI_CONTROL);
-	ctl &= ~(OHCI_CBSR_MASK | OHCI_LES | OHCI_HCFS_MASK | OHCI_IR);
-	ctl |= OHCI_PLE | OHCI_IE | OHCI_CLE | OHCI_BLE |
+	ctl &= ~(OHCI_CBSR_MASK | OHCI_LES | OHCI_HCFS_MASK | OHCI_IR | OHCI_CLE |
OHCI_CLF);
+	ctl |= OHCI_PLE | OHCI_IE | /*OHCI_CLE |*/ OHCI_BLE |
 	    OHCI_RATIO_1_4 | OHCI_HCFS_OPERATIONAL;
 	/* And finally start it! */
 	OWRITE4(sc, OHCI_CONTROL, ctl);
_at__at_ -2727,8 +2729,17 _at__at_ ohci_set_hw_power(struct usb_bus *bus)
 	temp = OREAD4(sc, OHCI_CONTROL);
 	temp &= ~(OHCI_PLE | OHCI_IE | OHCI_CLE | OHCI_BLE);

-	if (flags & USB_HW_POWER_CONTROL)
+	if (flags & USB_HW_POWER_CONTROL) {
+		struct usb_page_search buf_res;
+
+		buf_res.physaddr = OREAD4(sc, OHCI_CONTROL_HEAD_ED);
+		printf("(hw power) control head <= %p\n", (void*)buf_res.physaddr);
+		usbd_get_page(&sc->sc_hw.ctrl_start_pc, 0, &buf_res);
+		printf("(hw power) control head => %p\n", (void*)buf_res.physaddr);
+		OWRITE4(sc, OHCI_CONTROL_HEAD_ED, buf_res.physaddr);
+
 		temp |= OHCI_CLE;
+	}

 	if (flags & USB_HW_POWER_BULK)
 		temp |= OHCI_BLE;

-- 
Andriy Gapon
Received on Wed Sep 23 2009 - 12:54:44 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:55 UTC