Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 28 Sep 2009 07:48:44 -0400
From:      John Baldwin <john@baldwin.cx>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        freebsd-current@freebsd.org, freebsd-usb@freebsd.org, Hans Petter Selasky <hselasky@c2i.net>
Subject:   Re: sb600/sb700 ohci experimental patch
Message-ID:  <200909280748.45528.john@baldwin.cx>
In-Reply-To: <4ABF643D.1080705@freebsd.org>
References:  <4ABA36B1.9070706@icyb.net.ua> <4ABF57F5.1050106@icyb.net.ua> <4ABF643D.1080705@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sunday 27 September 2009 9:10:21 am Andriy Gapon wrote:
> on 27/09/2009 15:17 Andriy Gapon said the following:
> > Another idea of working around this:
> > 1) in pci fixup code disable USB SMI for these chipsets
> > 2) (optional) in ohci code skip takeover step
> > Sounds messy.
> 
> BTW, just for the sake of experiment I did exactly what I suggested.
> I've got the following messages:
> 
> kernel: ohci_controller_init:195: SMM active, request owner change
> kernel: usbus0: SMM does not respond, resetting
> kernel: ohci_controller_init:195: SMM active, request owner change
> kernel: usbus1: SMM does not respond, resetting
> kernel: ohci_controller_init:195: SMM active, request owner change
> kernel: usbus3: SMM does not respond, resetting
> kernel: ohci_controller_init:195: SMM active, request owner change
> kernel: usbus4: SMM does not respond, resetting
> kernel: ohci_controller_init:195: SMM active, request owner change
> kernel: usbus6: SMM does not respond, resetting
> 
> And the register value stayed intact after initial programming, so no
> re-programming was needed.
> 
> Here is the (dirty) hack:
> diff --git a/sys/dev/pci/fixup_pci.c b/sys/dev/pci/fixup_pci.c
> index 566e503..1463c24 100644
> --- a/sys/dev/pci/fixup_pci.c
> +++ b/sys/dev/pci/fixup_pci.c
> @@ -53,6 +53,7 @@ static int	fixup_pci_probe(device_t dev);
>  static void	fixwsc_natoma(device_t dev);
>  static void	fixc1_nforce2(device_t dev);
>  static void	fixrtc_piix4(device_t dev);
> +static void	fixsmi_usb(device_t dev);
> 
>  static device_method_t fixup_pci_methods[] = {
>      /* Device interface */
> @@ -84,6 +85,9 @@ fixup_pci_probe(device_t dev)
>      case 0x01e010de:		/* nVidia nForce2 */
>  	fixc1_nforce2(dev);
>  	break;
> +    case 0x96001022:		/* AMD SB700 */
> +	fixsmi_usb(dev);
> +	break;
>      }
>      return(ENXIO);
>  }
> @@ -124,6 +128,21 @@
>  }
> 
> 
> +/* Disable USB SMI */
> +static void
> +fixsmi_usb(device_t dev)
> +{
> +    uint32_t		features;
> +
> +    dev = pci_find_device(0x1002, 0x4385);
> +    features = pci_read_config(dev, 0x64, 4);
> +    if (features & (1 << 15)) {
> +	printf("Disabling USB SMI on SB7xx\n");
> +	features &= ~(1 << 15);
> +	pci_write_config(dev, 0x64, features, 4);
> +    }
> +}
> +
>  /*
>   * Set the SYSTEM_IDLE_TIMEOUT to 80 ns on nForce2 systems to work
>   * around a hang that is triggered when the CPU generates a very fast

I don't think you can do this because it is a "feature" to not disable SMM if 
ohci(4) is not loaded so that a USB keyboard works when the USB driver isn't 
loaded via PS/2 emulation, even when the OS is running.  I am curious if we 
really need to do the handover for each controller or if disabling it for 
ohci0 effectively disables it for all controllers?  What do other OS's do?

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909280748.45528.john>