This is a note to let you know that I've just added the patch titled Subject: USB: use IRQF_DISABLED for HCD interrupt handlers
to my gregkh-2.6 tree. Its filename is usb-use-irqf_disabled-for-hcd-interrupt-handlers.patch This tree can be found at http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/ >From [EMAIL PROTECTED] Thu Dec 6 11:48:39 2007 From: Alan Stern <[EMAIL PROTECTED]> Date: Thu, 6 Dec 2007 14:47:08 -0500 (EST) Subject: USB: use IRQF_DISABLED for HCD interrupt handlers To: Greg KH <[EMAIL PROTECTED]> Cc: USB list <linux-usb@vger.kernel.org>, USB development list <[EMAIL PROTECTED]> Message-ID: <[EMAIL PROTECTED]> From: Alan Stern <[EMAIL PROTECTED]> Host controller IRQs are supposed to be serviced with interrupts disabled. This patch (as1026) adds an IRQF_DISABLED flag to all the controller drivers that lack it. It also replaces the spin_lock_irqsave() and spin_unlock_irqrestore() calls in uhci_irq() with simple spin_lock() and spin_unlock(). This fixes Bugzilla #9335. Signed-off-by: Alan Stern <[EMAIL PROTECTED]> Acked-by: David Brownell <[EMAIL PROTECTED]> Signed-off-by: Andrew Morton <[EMAIL PROTECTED]> Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]> --- drivers/usb/core/hcd-pci.c | 2 +- drivers/usb/host/ehci-fsl.c | 2 +- drivers/usb/host/ohci-ppc-of.c | 2 +- drivers/usb/host/ohci-ssb.c | 2 +- drivers/usb/host/r8a66597-hcd.c | 2 +- drivers/usb/host/uhci-hcd.c | 9 ++++----- 6 files changed, 9 insertions(+), 10 deletions(-) --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c @@ -125,7 +125,7 @@ int usb_hcd_pci_probe (struct pci_dev *d pci_set_master (dev); - retval = usb_add_hcd (hcd, dev->irq, IRQF_SHARED); + retval = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED); if (retval != 0) goto err4; return retval; --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -122,7 +122,7 @@ int usb_hcd_fsl_probe(const struct hc_dr temp = in_le32(hcd->regs + 0x1a8); out_le32(hcd->regs + 0x1a8, temp | 0x3); - retval = usb_add_hcd(hcd, irq, IRQF_SHARED); + retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); if (retval != 0) goto err4; return retval; --- a/drivers/usb/host/ohci-ppc-of.c +++ b/drivers/usb/host/ohci-ppc-of.c @@ -142,7 +142,7 @@ ohci_hcd_ppc_of_probe(struct of_device * ohci_hcd_init(ohci); - rv = usb_add_hcd(hcd, irq, 0); + rv = usb_add_hcd(hcd, irq, IRQF_DISABLED); if (rv == 0) return 0; --- a/drivers/usb/host/ohci-ssb.c +++ b/drivers/usb/host/ohci-ssb.c @@ -160,7 +160,7 @@ static int ssb_ohci_attach(struct ssb_de hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); if (!hcd->regs) goto err_put_hcd; - err = usb_add_hcd(hcd, dev->irq, IRQF_SHARED); + err = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED); if (err) goto err_iounmap; --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c @@ -2197,7 +2197,7 @@ static int __init r8a66597_probe(struct INIT_LIST_HEAD(&r8a66597->child_device); hcd->rsrc_start = res->start; - ret = usb_add_hcd(hcd, irq, 0); + ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); if (ret != 0) { err("Failed to add hcd"); goto clean_up; --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -378,7 +378,6 @@ static irqreturn_t uhci_irq(struct usb_h { struct uhci_hcd *uhci = hcd_to_uhci(hcd); unsigned short status; - unsigned long flags; /* * Read the interrupt status, and write it back to clear the @@ -398,7 +397,7 @@ static irqreturn_t uhci_irq(struct usb_h dev_err(uhci_dev(uhci), "host controller process " "error, something bad happened!\n"); if (status & USBSTS_HCH) { - spin_lock_irqsave(&uhci->lock, flags); + spin_lock(&uhci->lock); if (uhci->rh_state >= UHCI_RH_RUNNING) { dev_err(uhci_dev(uhci), "host controller halted, " @@ -415,16 +414,16 @@ static irqreturn_t uhci_irq(struct usb_h * pending unlinks */ mod_timer(&hcd->rh_timer, jiffies); } - spin_unlock_irqrestore(&uhci->lock, flags); + spin_unlock(&uhci->lock); } } if (status & USBSTS_RD) usb_hcd_poll_rh_status(hcd); else { - spin_lock_irqsave(&uhci->lock, flags); + spin_lock(&uhci->lock); uhci_scan_schedule(uhci); - spin_unlock_irqrestore(&uhci->lock, flags); + spin_unlock(&uhci->lock); } return IRQ_HANDLED; Patches currently in gregkh-2.6 which might be from [EMAIL PROTECTED] are driver/pm-acquire-device-locks-prior-to-suspending.patch driver/kobject-drop-child-parent-ref-at-unregistration.patch driver/driver-core-fix-race-in-__device_release_driver.patch driver/driver-core-fix-class-glue-dir-cleanup-logic.patch usb/usb-storage-fix-devices-that-cannot-handle-32k-transfers.patch usb/usb-usb-storage-new-lockable-subclass-0x07.patch usb/usb-fix-locking-loop-by-avoiding-flush_scheduled_work.patch usb/usb-usb-mon-mon_bin.c-cleanups.patch usb/usb-revert-portions-of-unusual_dev-sync-up-some-reported-devices-from-ubuntu.patch usb/usb-use-irqf_disabled-for-hcd-interrupt-handlers.patch usb/usb-autosuspend-for-cdc-acm.patch usb/usb-don-t-change-hc-power-state-for-a-freeze.patch usb/usb-dummy_hcd-don-t-register-drivers-on-the-platform-bus.patch usb/usb-force-handover-port-to-companion-when-hub_port_connect_change-fails.patch usb/usb-make-ksuspend_usbd-thread-non-freezable.patch - 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