On Sat, 18 Jul 2015, David Hill wrote:
> Whenever I plug a device into my USB ports, my machine locks hard.  I
> have the Intel Series 7 / C216 chip, so xhci attempts to route the port
> from ehci to xhci. 
> 
> The following diff is from FreeBSD and makes my USB devices work again.
> https://github.com/freebsd/freebsd/blob/e79c62ff68fc74d88cb6f479859f6fae9baa5101/sys/dev/usb/controller/xhci_pci.c#L153-L176

I didn't have the lockup but my Intel Series 9 laptop does not recognice a 
USB 3.0 storage device if I insert it after a hot boot. If I insert it 
after a cold boot, it works ok.

This behavior does not change with your patch.

Cheers,
Stefan


> 
> 
> Index: sys/dev/pci/xhci_pci.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/xhci_pci.c,v
> retrieving revision 1.6
> diff -u -p -r1.6 xhci_pci.c
> --- sys/dev/pci/xhci_pci.c    22 Jun 2015 08:43:27 -0000      1.6
> +++ sys/dev/pci/xhci_pci.c    19 Jul 2015 02:20:06 -0000
> @@ -92,33 +92,45 @@ xhci_pci_match(struct device *parent, vo
>  static int
>  xhci_pci_port_route(struct xhci_pci_softc *psc)
>  {
> -     pcireg_t val;
> +     pcireg_t val, usb2_mask, usb3_mask;
>  
> -     /*
> -      * Check USB3 Port Routing Mask register that indicates the ports
> -      * can be changed from OS, and turn on by USB3 Port SS Enable register.
> -      */
> -     val = pci_conf_read(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_USB3PRM);
> -     DPRINTF(("%s: USB3PRM / USB3.0 configurable ports: 0x%08x\n",
> -         psc->sc.sc_bus.bdev.dv_xname, val));
> +        /*
> +         * Check USB3 Port Routing Mask register that indicates the ports
> +         * can be changed from OS, and turn on by USB3 Port SS Enable 
> register.
> +         */
> +        usb3_mask = pci_conf_read(psc->sc_pc, psc->sc_tag,
> +             PCI_XHCI_INTEL_USB3PRM);
> +        DPRINTF(("%s: USB3PRM / USB3.0 configurable ports: 0x%08x\n",
> +            psc->sc.sc_bus.bdev.dv_xname, usb3_mask));
> +
> +        /*
> +         * Check USB2 Port Routing Mask register that indicates the USB2.0
> +         * ports to be controlled by xHCI HC, and switch them to xHCI HC.
> +         */
> +        usb2_mask = pci_conf_read(psc->sc_pc, psc->sc_tag,
> +             PCI_XHCI_INTEL_XUSB2PRM);
> +        DPRINTF(("%s: XUSB2PRM / USB2.0 ports can switch from EHCI to xHCI:"
> +            "0x%08x\n", psc->sc.sc_bus.bdev.dv_xname, val));
> +
> +     val = pci_conf_read(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_USB3_PSSEN) 
> |
> +             pci_conf_read(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_XUSB2PR);
>  
> -     pci_conf_write(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_USB3_PSSEN, val);
> +
> +     pci_conf_write(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_USB3_PSSEN,
> +             val & usb3_mask);
> +#ifdef XHCI_DEBUG
>       val = pci_conf_read(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_USB3_PSSEN);
>       DPRINTF(("%s: USB3_PSSEN / Enabled USB3.0 ports under xHCI: 0x%08x\n",
>           psc->sc.sc_bus.bdev.dv_xname, val));
> +#endif
>  
> -     /*
> -      * Check USB2 Port Routing Mask register that indicates the USB2.0
> -      * ports to be controlled by xHCI HC, and switch them to xHCI HC.
> -      */
> -     val = pci_conf_read(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_XUSB2PRM);
> -     DPRINTF(("%s: XUSB2PRM / USB2.0 ports can switch from EHCI to xHCI:"
> -         "0x%08x\n", psc->sc.sc_bus.bdev.dv_xname, val));
> -
> -     pci_conf_write(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_XUSB2PR, val);
> +     pci_conf_write(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_XUSB2PR,
> +             val & usb2_mask);
> +#ifdef XHCI_DEBUG
>       val = pci_conf_read(psc->sc_pc, psc->sc_tag, PCI_XHCI_INTEL_XUSB2PR);
>       DPRINTF(("%s: XUSB2PR / USB2.0 ports under xHCI: 0x%08x\n",
>           psc->sc.sc_bus.bdev.dv_xname, val));
> +#endif
>  
>       return (0);
>  }
> 
> 

Reply via email to