Index: grub-core/bus/usb/ehci.c
===================================================================
--- grub-core/bus/usb/ehci.c	(revision 5217)
+++ grub-core/bus/usb/ehci.c	(working copy)
@@ -332,6 +334,8 @@
   grub_ehci_td_t tdfree_virt;	/* Free Transfer Descriptors */
   int flag64;
   grub_uint32_t reset;		/* bits 1-15 are flags if port was reset from connected time or not */
+  grub_pci_device_t dev;
+  grub_uint32_t eecp_offset;
   struct grub_ehci *next;
 };
 
@@ -601,6 +605,7 @@
   /* Is there EECP ? */
   eecp_offset = (grub_ehci_ehcc_read32 (e, GRUB_EHCI_EHCC_CPARAMS)
 		 & GRUB_EHCI_EECP_MASK) >> GRUB_EHCI_EECP_SHIFT;
+  e->eecp_offset = eecp_offset;
 
   /* Check format of data structures requested by EHCI */
   /* XXX: In fact it is not used at any place, it is prepared for future
@@ -767,6 +772,7 @@
     }
 
   grub_dprintf ("ehci", "inithw: EHCI grub_ehci_pci_iter: ownership OK\n");
+  e->dev = dev;
 
   /* Now we can setup EHCI (maybe...) */
 
@@ -1899,6 +1905,9 @@
 grub_ehci_fini_hw (int noreturn __attribute__ ((unused)))
 {
   struct grub_ehci *e;
+  grub_pci_address_t pciaddr_eecp;
+  grub_uint32_t usblegsup = 0;
+  grub_uint32_t usblegctlsts = 0;
 
   /* We should disable all EHCI HW to prevent any DMA access etc. */
   for (e = ehci; e; e = e->next)
@@ -1912,9 +1921,31 @@
       grub_ehci_halt (e);
 
       /* Reset EHCI */
-      grub_ehci_reset (e);
+      grub_ehci_reset (e);      
     }
 
+  /* Try to shift ownership */
+  for (e = ehci; e; e = e->next)
+    {
+      if (e->eecp_offset)
+        {
+          pciaddr_eecp = grub_pci_make_address (e->dev, e->eecp_offset + 4);
+          usblegctlsts = grub_pci_read (pciaddr_eecp);
+          usblegctlsts |= 0x2000;
+          grub_pci_write(pciaddr_eecp, usblegctlsts);
+          usblegctlsts = grub_pci_read (pciaddr_eecp);
+
+          pciaddr_eecp = grub_pci_make_address (e->dev, e->eecp_offset);
+          usblegsup = grub_pci_read (pciaddr_eecp);
+          if (usblegsup & GRUB_EHCI_OS_OWNED)
+            {
+              usblegsup &= ~(GRUB_EHCI_OS_OWNED);
+              grub_pci_write (pciaddr_eecp, usblegsup);
+              usblegsup = grub_pci_read (pciaddr_eecp);
+            }
+        }
+    }
+
   return GRUB_USB_ERR_NONE;
 }
 
 
