Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207963
b: refs/heads/master
c: 5a9cdf3
h: refs/heads/master
i:
  207961: 4d5ebfd
  207959: e6ec3e9
v: v3
  • Loading branch information
Alek Du authored and Greg Kroah-Hartman committed Aug 10, 2010
1 parent ebe2fd5 commit 323640b
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 48f24970144479c29b8cee6d2e1dbedf6dcf9cfb
refs/heads/master: 5a9cdf332eae724b11906cb1712e3a662eba32b2
19 changes: 17 additions & 2 deletions trunk/drivers/usb/host/ehci-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,11 @@ static int ehci_init(struct usb_hcd *hcd)
if (log2_irq_thresh < 0 || log2_irq_thresh > 6)
log2_irq_thresh = 0;
temp = 1 << (16 + log2_irq_thresh);
if (HCC_PER_PORT_CHANGE_EVENT(hcc_params)) {
ehci->has_ppcd = 1;
ehci_dbg(ehci, "enable per-port change event\n");
temp |= CMD_PPCEE;
}
if (HCC_CANPARK(hcc_params)) {
/* HW default park == 3, on hardware that supports it (like
* NVidia and ALI silicon), maximizes throughput on the async
Expand Down Expand Up @@ -782,6 +787,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
/* remote wakeup [4.3.1] */
if (status & STS_PCD) {
unsigned i = HCS_N_PORTS (ehci->hcs_params);
u32 ppcd = 0;

/* kick root hub later */
pcd_status = status;
Expand All @@ -790,9 +796,18 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
if (!(cmd & CMD_RUN))
usb_hcd_resume_root_hub(hcd);

/* get per-port change detect bits */
if (ehci->has_ppcd)
ppcd = status >> 16;

while (i--) {
int pstatus = ehci_readl(ehci,
&ehci->regs->port_status [i]);
int pstatus;

/* leverage per-port change bits feature */
if (ehci->has_ppcd && !(ppcd & (1 << i)))
continue;
pstatus = ehci_readl(ehci,
&ehci->regs->port_status[i]);

if (pstatus & PORT_OWNER)
continue;
Expand Down
9 changes: 9 additions & 0 deletions trunk/drivers/usb/host/ehci-hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf)
u32 mask;
int ports, i, retval = 1;
unsigned long flags;
u32 ppcd = 0;

/* if !USB_SUSPEND, root hub timers won't get shut down ... */
if (!HC_IS_RUNNING(hcd->state))
Expand Down Expand Up @@ -632,7 +633,15 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf)

/* port N changes (bit N)? */
spin_lock_irqsave (&ehci->lock, flags);

/* get per-port change detect bits */
if (ehci->has_ppcd)
ppcd = ehci_readl(ehci, &ehci->regs->status) >> 16;

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]);

/*
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/usb/host/ehci.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ struct ehci_hcd { /* one per controller */
__hc32 *ohci_hcctrl_reg;
unsigned has_hostpc:1;
unsigned has_lpm:1; /* support link power management */
unsigned has_ppcd:1; /* support per-port change bits */
u8 sbrn; /* packed release number */

/* irq statistics */
Expand Down

0 comments on commit 323640b

Please sign in to comment.