[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [PATCH]: xHCI/EHCI - Windows - BIOS bug interaction.
From: |
Melki Christian (consultant) |
Subject: |
RE: [PATCH]: xHCI/EHCI - Windows - BIOS bug interaction. |
Date: |
Thu, 19 Dec 2013 11:33:18 +0000 |
Addition:
Seems to be intel pantherpoint chipset specific.
So the issue is likely far smaller than I initially thought.
Code should probably be enclosed with vendor/product id test.
I'm not an USB expert. :)
Regards,
Christian
> -----Original Message-----
> From: address@hidden
> [mailto:address@hidden On
> Behalf Of Melki Christian (consultant)
> Sent: den 19 december 2013 11:01
> To: address@hidden
> Subject: [PATCH]: xHCI/EHCI - Windows - BIOS bug interaction.
>
> Hi.
>
> Request for comments (patch is a local repository patch) so far:
>
> I noticed on some Dell 7010 machines the following behaviour with GRUB.
>
> Machine is cold-booted. - > USB keyboard works in GRUB -> Windows boots -
> > Windows does warm reboot -> USB keyboard does not work in GRUB.
> This only happens in the ports marked superspeed on the machine.
> A quick dig into the subject revealed something of interest that Sarah Sharp
> added to Linux a while ago.
> The problem is that Windows seems to leave the the SS ports in SS mode
> when rebooting and a BIOS bug(?) on warm boot leads to not setting the SS
> ports in 2.0 mode.
> So in the ehci driver I identified the xHCI controller, disabled it and set
> all
> ports in 2.0 mode in the port routing register, much like Linux does.
> This is a little odd, but I think GRUB needs this because it does not properly
> handle xHCI yet. GRUB needs to make sure that all ports are available as 2.0
> mode ports.
> It seems to fix my problems atleast.
>
> Index: grub-core/bus/usb/ehci.c
> ==========================================================
> =========
> --- grub-core/bus/usb/ehci.c (revision 6009)
> +++ grub-core/bus/usb/ehci.c (working copy)
> @@ -41,6 +41,8 @@
> */
>
> #define GRUB_EHCI_PCI_SBRN_REG 0x60
> +#define GRUB_XHCI_PCI_XUSB2PR 0xD0
> +#define GRUB_XHCI_PCI_USB3_PSSEN 0xD8
>
> /* Capability registers offsets */
> enum
> @@ -507,6 +509,21 @@
> subclass = (class_code >> 8) & 0xFF;
> class = class_code >> 16;
>
> + /* This is an xHCI controller.
> + * Since GRUB does not currently handle xHCI we need
> + * to make sure it is disabled and the ports put in 2.0 mode.
> + * To be removed when xHCI is properly introduced.
> + */
> + if (class == 0x0c && subclass == 0x03 && interf == 0x30)
> + {
> + addr = grub_pci_make_address (dev, GRUB_XHCI_PCI_USB3_PSSEN);
> + grub_pci_write_word (addr, 0x0);
> + grub_pci_read_word(addr);
> + addr = grub_pci_make_address (dev, GRUB_XHCI_PCI_XUSB2PR);
> + grub_pci_write_word (addr, 0x0);
> + grub_pci_read_word(addr);
> + }
> +
> /* If this is not an EHCI controller, just return. */
> if (class != 0x0c || subclass != 0x03 || interf != 0x20)
> return 0;
>
> Regards,
> Christian
>