[PATCH] Intel xhci: Only switch the switchable ports

Keng-Yu Lin kengyu at canonical.com
Wed Sep 12 12:38:57 UTC 2012


On Fri, Aug 10, 2012 at 2:13 AM, Leann Ogasawara
<leann.ogasawara at canonical.com> wrote:
> On 08/09/2012 04:26 AM, Andy Whitcroft wrote:
>> On Thu, Aug 09, 2012 at 06:06:57PM +0800, Keng-Yu Lin wrote:
>>> With a previous patch to enable the EHCI/XHCI port switching, it switches
>>> all the available ports.
>>>
>>> The assumption is not correct because the BIOS may expect some ports
>>> not switchable by the OS.
>>>
>>> There are two more registers that contains the information of the switchable
>>> and non-switchable ports.
>>>
>>> This patch adds the checking code for the two register so that only the
>>> switchable ports are altered.
>>>
>>> Signed-off-by: Keng-Yu Lin <kengyu at canonical.com>
>>> ---
>>>  drivers/usb/host/pci-quirks.c |   27 +++++++++++++++++++++++----
>>>  1 file changed, 23 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
>>> index 833b3c6..89f62f2 100644
>>> --- a/drivers/usb/host/pci-quirks.c
>>> +++ b/drivers/usb/host/pci-quirks.c
>>> @@ -75,7 +75,9 @@
>>>  #define     NB_PIF0_PWRDOWN_1       0x01100013
>>>
>>>  #define USB_INTEL_XUSB2PR      0xD0
>>> +#define USB_INTEL_USB2PRM      0xD4
>>>  #define USB_INTEL_USB3_PSSEN   0xD8
>>> +#define USB_INTEL_USB3PRM      0xDC
>>>
>>>  static struct amd_chipset_info {
>>>      struct pci_dev  *nb_dev;
>>> @@ -772,10 +774,18 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev)
>>>              return;
>>>      }
>>>
>>> -    ports_available = 0xffffffff;
>>> +    /* Read USB3PRM, the USB 3.0 Port Routing Mask Register
>>> +     * Indicate the ports that can be changed from OS.
>>> +     */
>>> +    pci_read_config_dword(xhci_pdev, USB_INTEL_USB3PRM,
>>> +                    &ports_available);
>>> +
>>> +    dev_dbg(&xhci_pdev->dev, "Configurable ports to enable SuperSpeed: 0x%x\n",
>>> +                    ports_available);
>>> +
>>>      /* Write USB3_PSSEN, the USB 3.0 Port SuperSpeed Enable
>>> -     * Register, to turn on SuperSpeed terminations for all
>>> -     * available ports.
>>> +     * Register, to turn on SuperSpeed terminations for the
>>> +     * switchable ports.
>>>       */
>>>      pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSEN,
>>>                      cpu_to_le32(ports_available));
>>> @@ -785,7 +795,16 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev)
>>>      dev_dbg(&xhci_pdev->dev, "USB 3.0 ports that are now enabled "
>>>                      "under xHCI: 0x%x\n", ports_available);
>>>
>>> -    ports_available = 0xffffffff;
>>> +    /* Read XUSB2PRM, xHCI USB 2.0 Port Routing Mask Register
>>> +     * Indicate the port to be controlled by the EHCI host.
>>> +     */
>>> +
>>> +    pci_read_config_dword(xhci_pdev, USB_INTEL_USB2PRM,
>>> +                    &ports_available);
>>> +
>>> +    dev_dbg(&xhci_pdev->dev, "Configurable ports to hand over the ECHI host:
>>> +                    0x%x\n", ports_available);
>>> +
>>>      /* Write XUSB2PR, the xHC USB 2.0 Port Routing Register, to
>>>       * switch the USB 2.0 power and data lines over to the xHCI
>>>       * host.
>> The patch _looks_ reasonable.  Has this been tested on anything without
>> the affected hardware?  Is it going upstream?
>
> It does look like it's been sent upstream, although sparking some
> additional discussion:
>
> https://lkml.org/lkml/2012/8/9/356
>
> For Quantal, since we have some time before we release, I'd like to wait
> and see how this shakes out upstream first.
>
> Thanks,
> Leann

Hi all:
  The patch has arrived in greg's usb git tree
(https://git.kernel.org/?p=linux/kernel/git/gregkh/usb.git;a=commit;h=a96874a2a92feaef607ddd3137277a788cb927a6)
and I just see another machine affected as bug 1034814 described.

  Just wonder if there is any chance that we speed up the SRU will be
very appreciated.

  cheers,
-kengyu




More information about the kernel-team mailing list