Re: sb600/sb700 ohci experimental patch

From: Hans Petter Selasky <hselasky_at_c2i.net>
Date: Thu, 24 Sep 2009 16:51:46 +0200
On Wednesday 23 September 2009 16:54:41 Andriy Gapon wrote:
> 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;

Hi,

Your patch looks good. Send me the final version when it is ready and testers 
report OK. I will then review and commit it.

I think that if you need to reload the control head, you will also need to 
reload the other head list pointers? Could you check that?

--HPS
Received on Thu Sep 24 2009 - 12:51:12 UTC

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