diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2007-12-06 14:47:08 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-12-17 13:47:15 -0500 |
commit | 442258e2ff69276ff767f3703b30ce6a31fdd181 (patch) | |
tree | df533130d4736a01242a27c7c3278efc5df26b1f | |
parent | d48bd977e0dd8c17081d12242bfc09d743ea0d26 (diff) |
USB: use IRQF_DISABLED for HCD interrupt handlers
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 <stern@rowland.harvard.edu>
Acked-by: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/core/hcd-pci.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ehci-fsl.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ohci-ppc-of.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/ohci-ssb.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/r8a66597-hcd.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/uhci-hcd.c | 9 |
6 files changed, 9 insertions, 10 deletions
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 5cf6d5f9acbd..3fb9af80cbf4 100644 --- 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 *dev, const struct pci_device_id *id) | |||
125 | 125 | ||
126 | pci_set_master (dev); | 126 | pci_set_master (dev); |
127 | 127 | ||
128 | retval = usb_add_hcd (hcd, dev->irq, IRQF_SHARED); | 128 | retval = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED); |
129 | if (retval != 0) | 129 | if (retval != 0) |
130 | goto err4; | 130 | goto err4; |
131 | return retval; | 131 | return retval; |
diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index b7b7bfbce527..430821cb95c8 100644 --- 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_driver *driver, | |||
122 | temp = in_le32(hcd->regs + 0x1a8); | 122 | temp = in_le32(hcd->regs + 0x1a8); |
123 | out_le32(hcd->regs + 0x1a8, temp | 0x3); | 123 | out_le32(hcd->regs + 0x1a8, temp | 0x3); |
124 | 124 | ||
125 | retval = usb_add_hcd(hcd, irq, IRQF_SHARED); | 125 | retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); |
126 | if (retval != 0) | 126 | if (retval != 0) |
127 | goto err4; | 127 | goto err4; |
128 | return retval; | 128 | return retval; |
diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c index 0a7426920150..0c3e6b790b7b 100644 --- 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 *op, const struct of_device_id *match) | |||
142 | 142 | ||
143 | ohci_hcd_init(ohci); | 143 | ohci_hcd_init(ohci); |
144 | 144 | ||
145 | rv = usb_add_hcd(hcd, irq, 0); | 145 | rv = usb_add_hcd(hcd, irq, IRQF_DISABLED); |
146 | if (rv == 0) | 146 | if (rv == 0) |
147 | return 0; | 147 | return 0; |
148 | 148 | ||
diff --git a/drivers/usb/host/ohci-ssb.c b/drivers/usb/host/ohci-ssb.c index fe70e72340de..6e9c2d6db887 100644 --- 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_device *dev) | |||
160 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); | 160 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); |
161 | if (!hcd->regs) | 161 | if (!hcd->regs) |
162 | goto err_put_hcd; | 162 | goto err_put_hcd; |
163 | err = usb_add_hcd(hcd, dev->irq, IRQF_SHARED); | 163 | err = usb_add_hcd(hcd, dev->irq, IRQF_DISABLED | IRQF_SHARED); |
164 | if (err) | 164 | if (err) |
165 | goto err_iounmap; | 165 | goto err_iounmap; |
166 | 166 | ||
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index ae8ec4474eb8..0ce2fc5e396b 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -2197,7 +2197,7 @@ static int __init r8a66597_probe(struct platform_device *pdev) | |||
2197 | INIT_LIST_HEAD(&r8a66597->child_device); | 2197 | INIT_LIST_HEAD(&r8a66597->child_device); |
2198 | 2198 | ||
2199 | hcd->rsrc_start = res->start; | 2199 | hcd->rsrc_start = res->start; |
2200 | ret = usb_add_hcd(hcd, irq, 0); | 2200 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED); |
2201 | if (ret != 0) { | 2201 | if (ret != 0) { |
2202 | err("Failed to add hcd"); | 2202 | err("Failed to add hcd"); |
2203 | goto clean_up; | 2203 | goto clean_up; |
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 4db17f75f4f1..ec987897b8ed 100644 --- 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_hcd *hcd) | |||
378 | { | 378 | { |
379 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); | 379 | struct uhci_hcd *uhci = hcd_to_uhci(hcd); |
380 | unsigned short status; | 380 | unsigned short status; |
381 | unsigned long flags; | ||
382 | 381 | ||
383 | /* | 382 | /* |
384 | * Read the interrupt status, and write it back to clear the | 383 | * Read the interrupt status, and write it back to clear the |
@@ -398,7 +397,7 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) | |||
398 | dev_err(uhci_dev(uhci), "host controller process " | 397 | dev_err(uhci_dev(uhci), "host controller process " |
399 | "error, something bad happened!\n"); | 398 | "error, something bad happened!\n"); |
400 | if (status & USBSTS_HCH) { | 399 | if (status & USBSTS_HCH) { |
401 | spin_lock_irqsave(&uhci->lock, flags); | 400 | spin_lock(&uhci->lock); |
402 | if (uhci->rh_state >= UHCI_RH_RUNNING) { | 401 | if (uhci->rh_state >= UHCI_RH_RUNNING) { |
403 | dev_err(uhci_dev(uhci), | 402 | dev_err(uhci_dev(uhci), |
404 | "host controller halted, " | 403 | "host controller halted, " |
@@ -415,16 +414,16 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd) | |||
415 | * pending unlinks */ | 414 | * pending unlinks */ |
416 | mod_timer(&hcd->rh_timer, jiffies); | 415 | mod_timer(&hcd->rh_timer, jiffies); |
417 | } | 416 | } |
418 | spin_unlock_irqrestore(&uhci->lock, flags); | 417 | spin_unlock(&uhci->lock); |
419 | } | 418 | } |
420 | } | 419 | } |
421 | 420 | ||
422 | if (status & USBSTS_RD) | 421 | if (status & USBSTS_RD) |
423 | usb_hcd_poll_rh_status(hcd); | 422 | usb_hcd_poll_rh_status(hcd); |
424 | else { | 423 | else { |
425 | spin_lock_irqsave(&uhci->lock, flags); | 424 | spin_lock(&uhci->lock); |
426 | uhci_scan_schedule(uhci); | 425 | uhci_scan_schedule(uhci); |
427 | spin_unlock_irqrestore(&uhci->lock, flags); | 426 | spin_unlock(&uhci->lock); |
428 | } | 427 | } |
429 | 428 | ||
430 | return IRQ_HANDLED; | 429 | return IRQ_HANDLED; |