Minor fix - make sure not to call ohci/uhci_init from irq handler.
authorKevin O'Connor <kevin@koconnor.net>
Sun, 10 Jul 2011 19:41:55 +0000 (15:41 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Sun, 10 Jul 2011 19:41:55 +0000 (15:41 -0400)
When CONFIG_THREAD_OPTIONROMS is enabled, accessing the PCI config
space from a thread could potentially race with an option rom.  Make
sure the ohci/uhci_init() functions (which access PCI config space)
are never run while an optionrom could also be running.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
src/usb-ehci.c

index d60465e86dbf7f1cf08b2e0e791243ba108ed6f4..5028c0d6688c3b1c7caa2383d3157313891aac1a 100644 (file)
@@ -50,6 +50,10 @@ ehci_note_port(struct usb_ehci_s *cntl)
         struct pci_device *pci = cntl->companion[i];
         if (!pci)
             break;
+
+        // ohci/uhci_init call pci_config_XXX - don't run from irq handler.
+        wait_preempt();
+
         if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_UHCI)
             uhci_init(pci, cntl->usb.busid + i);
         else if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_OHCI)