On Mon, 29 Feb 2016, Robert Dobrowolski wrote:

> On BXT platform Host Controller and Device Controller figure as
> same PCI device but with different device function. HCD should not
> pass data to Device Controller. Checking if companion device is
> Device Controller and omitting it.
> 
> Signed-off-by: Robert Dobrowolski <[email protected]>
> ---
>  drivers/usb/core/hcd-pci.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
> index 9eb1cff..ae977d7 100644
> --- a/drivers/usb/core/hcd-pci.c
> +++ b/drivers/usb/core/hcd-pci.c
> @@ -74,6 +74,16 @@ static void for_each_companion(struct pci_dev *pdev, 
> struct usb_hcd *hcd,
>               if (companion->bus != pdev->bus ||
>                               PCI_SLOT(companion->devfn) != slot)
>                       continue;
> +
> +             /*
> +              * On certain platforms Host Controller and Device Controller
> +              * figure as same device with different device function. HCD
> +              * should not pass data to Device Controller. Checking if
> +              * companion device is Device Controller and omitting it.
> +              */
> +             if (companion->class == ((PCI_CLASS_SERIAL_USB << 8) | 0xfe))
> +                     continue;
> +
>               companion_hcd = pci_get_drvdata(companion);
>               if (!companion_hcd || !companion_hcd->self.root_hub)
>                       continue;

This cries out for a #define.

Besides, wouldn't it be safer to check that the class _is_ equal to 
CL_UHCI, CL_OHCI, or CL_EHCI instead of checking what the class 
_isn't_ equal to?  What if somebody puts a non-USB function in the same 
slot?

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to