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: grub-devel-bounces+christian.melki=saabgroup....@gnu.org > [mailto:grub-devel-bounces+christian.melki=saabgroup....@gnu.org] On > Behalf Of Melki Christian (consultant) > Sent: den 19 december 2013 11:01 > To: grub-devel@gnu.org > 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 > _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel