This patch (as1634) simplifies some of the code associated with the
per-port change bits added in EHCI-1.1, and in particular it fixes a
bug in the logic of ehci_hub_status_data().  Even if the change bit
doesn't indicate anything happened on a particular port, we still have
to notify the core about changes to the suspend or reset status.

Signed-off-by: Alan Stern <[email protected]>

---

 drivers/usb/host/ehci-hcd.c |    4 ++--
 drivers/usb/host/ehci-hub.c |    9 +++++----
 2 files changed, 7 insertions(+), 6 deletions(-)

Index: usb-3.8/drivers/usb/host/ehci-hcd.c
===================================================================
--- usb-3.8.orig/drivers/usb/host/ehci-hcd.c
+++ usb-3.8/drivers/usb/host/ehci-hcd.c
@@ -757,7 +757,7 @@ static irqreturn_t ehci_irq (struct usb_
        /* remote wakeup [4.3.1] */
        if (status & STS_PCD) {
                unsigned        i = HCS_N_PORTS (ehci->hcs_params);
-               u32             ppcd = 0;
+               u32             ppcd = ~0;
 
                /* kick root hub later */
                pcd_status = status;
@@ -774,7 +774,7 @@ static irqreturn_t ehci_irq (struct usb_
                        int pstatus;
 
                        /* leverage per-port change bits feature */
-                       if (ehci->has_ppcd && !(ppcd & (1 << i)))
+                       if (!(ppcd & (1 << i)))
                                continue;
                        pstatus = ehci_readl(ehci,
                                         &ehci->regs->port_status[i]);
Index: usb-3.8/drivers/usb/host/ehci-hub.c
===================================================================
--- usb-3.8.orig/drivers/usb/host/ehci-hub.c
+++ usb-3.8/drivers/usb/host/ehci-hub.c
@@ -590,7 +590,7 @@ ehci_hub_status_data (struct usb_hcd *hc
        u32             mask;
        int             ports, i, retval = 1;
        unsigned long   flags;
-       u32             ppcd = 0;
+       u32             ppcd = ~0;
 
        /* init status to no-changes */
        buf [0] = 0;
@@ -628,9 +628,10 @@ ehci_hub_status_data (struct usb_hcd *hc
 
        for (i = 0; i < ports; i++) {
                /* leverage per-port change bits feature */
-               if (ehci->has_ppcd && !(ppcd & (1 << i)))
-                       continue;
-               temp = ehci_readl(ehci, &ehci->regs->port_status [i]);
+               if (ppcd & (1 << i))
+                       temp = ehci_readl(ehci, &ehci->regs->port_status[i]);
+               else
+                       temp = 0;
 
                /*
                 * Return status information even for ports with OWNER set.


--
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

Reply via email to