USB: Remove the SAW_IRQ hcd flag
authorAlan Stern <stern@rowland.harvard.edu>
Thu, 3 Nov 2011 16:03:38 +0000 (12:03 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 15 Nov 2011 00:46:06 +0000 (16:46 -0800)
The HCD_FLAG_SAW_IRQ flag was introduced in order to catch IRQ routing
errors: If an URB was unlinked and the host controller hadn't gotten
any IRQs, it seemed likely that the IRQs were directed to the wrong
vector.

This warning hasn't come up in many years, as far as I know; interrupt
routing now seems to be well under control.  Therefore there's no
reason to keep the flag around any more.  This patch (as1495) finally
removes it.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/c67x00/c67x00-hcd.c
drivers/usb/core/hcd-pci.c
drivers/usb/core/hcd.c
drivers/usb/host/hwa-hc.c
drivers/usb/host/xhci-ring.c
drivers/usb/musb/musb_core.c
include/linux/usb/hcd.h

index d3e1356d091e57224f983d14bd727e7bf64c7d22..75e47b860a53137db00a99581c06782a6c75c7a9 100644 (file)
@@ -271,7 +271,6 @@ static void c67x00_hcd_irq(struct c67x00_sie *sie, u16 int_status, u16 msg)
        if (int_status & SOFEOP_FLG(sie->sie_num)) {
                c67x00_ll_usb_clear_status(sie, SOF_EOP_IRQ_FLG);
                c67x00_sched_kick(c67x00);
-               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
        }
 }
 
index a004db35f6d0e90cced45aa9bd81ca107d2ed472..d136b8f4c8a7635f42b5d580930418d1c938355c 100644 (file)
@@ -453,10 +453,6 @@ static int resume_common(struct device *dev, int event)
 
        pci_set_master(pci_dev);
 
-       clear_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-       if (hcd->shared_hcd)
-               clear_bit(HCD_FLAG_SAW_IRQ, &hcd->shared_hcd->flags);
-
        if (hcd->driver->pci_resume && !HCD_DEAD(hcd)) {
                if (event != PM_EVENT_AUTO_RESUME)
                        wait_for_companions(pci_dev, hcd);
index 13222d352a614876c233bfed629157c78266ef72..43a89e4ba928f1c10eec15e3eed4d0534b8f392f 100644 (file)
@@ -1168,20 +1168,6 @@ int usb_hcd_check_unlink_urb(struct usb_hcd *hcd, struct urb *urb,
        if (urb->unlinked)
                return -EBUSY;
        urb->unlinked = status;
-
-       /* IRQ setup can easily be broken so that USB controllers
-        * never get completion IRQs ... maybe even the ones we need to
-        * finish unlinking the initial failed usb_set_address()
-        * or device descriptor fetch.
-        */
-       if (!HCD_SAW_IRQ(hcd) && !is_root_hub(urb->dev)) {
-               dev_warn(hcd->self.controller, "Unlink after no-IRQ?  "
-                       "Controller is probably using the wrong IRQ.\n");
-               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-               if (hcd->shared_hcd)
-                       set_bit(HCD_FLAG_SAW_IRQ, &hcd->shared_hcd->flags);
-       }
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(usb_hcd_check_unlink_urb);
@@ -2148,16 +2134,12 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)
         */
        local_irq_save(flags);
 
-       if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd))) {
+       if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd)))
                rc = IRQ_NONE;
-       } else if (hcd->driver->irq(hcd) == IRQ_NONE) {
+       else if (hcd->driver->irq(hcd) == IRQ_NONE)
                rc = IRQ_NONE;
-       } else {
-               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-               if (hcd->shared_hcd)
-                       set_bit(HCD_FLAG_SAW_IRQ, &hcd->shared_hcd->flags);
+       else
                rc = IRQ_HANDLED;
-       }
 
        local_irq_restore(flags);
        return rc;
index 9bfac657572e2eb4aadb9aaec3899ac887448986..565d79f06e6f0a64c69071931b69e92c8cc829b0 100644 (file)
@@ -776,7 +776,6 @@ static int hwahc_probe(struct usb_interface *usb_iface,
                goto error_alloc;
        }
        usb_hcd->wireless = 1;
-       set_bit(HCD_FLAG_SAW_IRQ, &usb_hcd->flags);
        wusbhc = usb_hcd_to_wusbhc(usb_hcd);
        hwahc = container_of(wusbhc, struct hwahc, wusbhc);
        hwahc_init(hwahc);
index 940321b3ec68b477549a38d4016ee047fb7a72a7..2f8c17381c6c54d32a6fa5c7c03a30a31818a967 100644 (file)
@@ -2389,17 +2389,7 @@ hw_died:
 
 irqreturn_t xhci_msi_irq(int irq, struct usb_hcd *hcd)
 {
-       irqreturn_t ret;
-       struct xhci_hcd *xhci;
-
-       xhci = hcd_to_xhci(hcd);
-       set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
-       if (xhci->shared_hcd)
-               set_bit(HCD_FLAG_SAW_IRQ, &xhci->shared_hcd->flags);
-
-       ret = xhci_irq(hcd);
-
-       return ret;
+       return xhci_irq(hcd);
 }
 
 /****          Endpoint Ring Operations        ****/
index 20a28731c338e8aa9dbf2bac295ce8ddda426e3a..12044c473c38db7f83b6b5fb3c266c1d3d648179 100644 (file)
@@ -661,7 +661,6 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb,
 
                handled = IRQ_HANDLED;
                musb->is_active = 1;
-               set_bit(HCD_FLAG_SAW_IRQ, &hcd->flags);
 
                musb->ep0_stage = MUSB_EP0_START;
 
index 03354d557b799979426b1ef0e8babab8d8b30284..b2f62f3a32af990fb931d68983958a4669ffa938 100644 (file)
@@ -99,7 +99,6 @@ struct usb_hcd {
         */
        unsigned long           flags;
 #define HCD_FLAG_HW_ACCESSIBLE         0       /* at full power */
-#define HCD_FLAG_SAW_IRQ               1
 #define HCD_FLAG_POLL_RH               2       /* poll for rh status? */
 #define HCD_FLAG_POLL_PENDING          3       /* status has changed? */
 #define HCD_FLAG_WAKEUP_PENDING                4       /* root hub is resuming? */
@@ -110,7 +109,6 @@ struct usb_hcd {
         * be slightly faster than test_bit().
         */
 #define HCD_HW_ACCESSIBLE(hcd) ((hcd)->flags & (1U << HCD_FLAG_HW_ACCESSIBLE))
-#define HCD_SAW_IRQ(hcd)       ((hcd)->flags & (1U << HCD_FLAG_SAW_IRQ))
 #define HCD_POLL_RH(hcd)       ((hcd)->flags & (1U << HCD_FLAG_POLL_RH))
 #define HCD_POLL_PENDING(hcd)  ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING))
 #define HCD_WAKEUP_PENDING(hcd)        ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING))