diff options
Diffstat (limited to 'drivers/usb/host/ehci-hub.c')
| -rw-r--r-- | drivers/usb/host/ehci-hub.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 382587c4457..740835bb857 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -609,7 +609,7 @@ static int ehci_hub_control (  			}  			break;  		case USB_PORT_FEAT_C_SUSPEND: -			/* we auto-clear this feature */ +			clear_bit(wIndex, &ehci->port_c_suspend);  			break;  		case USB_PORT_FEAT_POWER:  			if (HCS_PPC (ehci->hcs_params)) @@ -688,7 +688,7 @@ static int ehci_hub_control (  			/* resume completed? */  			else if (time_after_eq(jiffies,  					ehci->reset_done[wIndex])) { -				status |= 1 << USB_PORT_FEAT_C_SUSPEND; +				set_bit(wIndex, &ehci->port_c_suspend);  				ehci->reset_done[wIndex] = 0;  				/* stop resume signaling */ @@ -765,6 +765,8 @@ static int ehci_hub_control (  			status |= 1 << USB_PORT_FEAT_RESET;  		if (temp & PORT_POWER)  			status |= 1 << USB_PORT_FEAT_POWER; +		if (test_bit(wIndex, &ehci->port_c_suspend)) +			status |= 1 << USB_PORT_FEAT_C_SUSPEND;  #ifndef	VERBOSE_DEBUG  	if (status & ~0xffff)	/* only if wPortChange is interesting */ @@ -875,3 +877,13 @@ static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)  	set_owner(ehci, --portnum, PORT_OWNER);  } +static int ehci_port_handed_over(struct usb_hcd *hcd, int portnum) +{ +	struct ehci_hcd		*ehci = hcd_to_ehci(hcd); +	u32 __iomem		*reg; + +	if (ehci_is_TDI(ehci)) +		return 0; +	reg = &ehci->regs->port_status[portnum - 1]; +	return ehci_readl(ehci, reg) & PORT_OWNER; +}  |